@myop/sdk 0.3.36 → 0.4.0-beta.0

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.
Files changed (46) hide show
  1. package/dist/bundled-declarations.d.ts +406 -166
  2. package/dist/cjs/{_IframeSDK.3283252f.js → _IframeSDK.096d8320.js} +1325 -915
  3. package/dist/cjs/_IframeSDK.096d8320.js.map +7 -0
  4. package/dist/cjs/_IframeSDK.8e791f92.min.js +1 -0
  5. package/dist/cjs/_MyopHelpers.91004b19.min.js +1 -0
  6. package/dist/cjs/{_MyopHelpers.08d1cf5d.js → _MyopHelpers.efed13e4.js} +362 -2
  7. package/dist/cjs/_MyopHelpers.efed13e4.js.map +7 -0
  8. package/dist/cjs/_WebComponentSDK.4a87f826.min.js +1 -0
  9. package/dist/cjs/{_WebComponentSDK.e84be6ea.js → _WebComponentSDK.e9e877db.js} +893 -486
  10. package/dist/cjs/_WebComponentSDK.e9e877db.js.map +7 -0
  11. package/dist/cjs/{_hostSDK.fa5b3ccf.js → _hostSDK.0c271647.js} +1348 -941
  12. package/dist/cjs/_hostSDK.0c271647.js.map +7 -0
  13. package/dist/cjs/_hostSDK.7d759290.min.js +1 -0
  14. package/dist/cjs/myop_sdk.js +35 -24
  15. package/dist/cjs/myop_sdk.js.map +2 -2
  16. package/dist/cjs/myop_sdk.min.js +1 -1
  17. package/dist/cjs-bundled/myop_sdk.bundled.js +1820 -1379
  18. package/dist/cjs-bundled/myop_sdk.bundled.js.map +4 -4
  19. package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
  20. package/dist/module/Iframe/index.js +1501 -1079
  21. package/dist/module/Iframe/index.js.map +4 -4
  22. package/dist/module/SDK.d.ts +5 -1
  23. package/dist/module/SDK.js +1974 -1523
  24. package/dist/module/SDK.js.map +4 -4
  25. package/dist/module/embeddedSDK.js +1 -1
  26. package/dist/module/helpers/CloudRepository.d.ts +96 -0
  27. package/dist/module/helpers/cloudRepositoryHelpers.d.ts +99 -0
  28. package/dist/module/helpers/deliveryStore.d.ts +51 -0
  29. package/dist/module/helpers/index.js +370 -3
  30. package/dist/module/helpers/index.js.map +4 -4
  31. package/dist/module/host/components/myopIframeComponent.d.ts +6 -0
  32. package/dist/module/host/embeddedSDK.js +1 -1
  33. package/dist/module/host/hostSDK.d.ts +2 -0
  34. package/dist/module/host/index.js +1516 -1097
  35. package/dist/module/host/index.js.map +4 -4
  36. package/dist/module/webcomponent/index.js +1202 -783
  37. package/dist/module/webcomponent/index.js.map +4 -4
  38. package/package.json +1 -1
  39. package/dist/cjs/_IframeSDK.3283252f.js.map +0 -7
  40. package/dist/cjs/_IframeSDK.652f4774.min.js +0 -1
  41. package/dist/cjs/_MyopHelpers.08d1cf5d.js.map +0 -7
  42. package/dist/cjs/_MyopHelpers.59521d8f.min.js +0 -1
  43. package/dist/cjs/_WebComponentSDK.8fe7c9bf.min.js +0 -1
  44. package/dist/cjs/_WebComponentSDK.e84be6ea.js.map +0 -7
  45. package/dist/cjs/_hostSDK.de2d767e.min.js +0 -1
  46. package/dist/cjs/_hostSDK.fa5b3ccf.js.map +0 -7
@@ -1619,9 +1619,7 @@ var MyopIframeComponent = class extends BaseMyopComponent {
1619
1619
  const iframe = this.IframeElement;
1620
1620
  const doc = iframe.contentDocument;
1621
1621
  if (!doc) {
1622
- console.warn("[MyopIframeComponent] Cannot observe auto size: contentDocument not accessible");
1623
- return () => {
1624
- };
1622
+ return this.observeHeightViaBridge();
1625
1623
  }
1626
1624
  const clamp = (value, min, max) => {
1627
1625
  if (min !== void 0 && value < min) return min;
@@ -1765,6 +1763,32 @@ var MyopIframeComponent = class extends BaseMyopComponent {
1765
1763
  this._autoSizeCleanup = cleanup;
1766
1764
  return cleanup;
1767
1765
  });
1766
+ __publicField(this, "_bridgeSizeCleanup");
1767
+ /**
1768
+ * Auto-height for a frame the host can't read (cross-origin). Runs after the IframeSDK
1769
+ * handshake: the frame reports body resizes and the host re-reads the scroll height.
1770
+ */
1771
+ __publicField(this, "observeHeightViaBridge", () => {
1772
+ if (this._bridgeSizeCleanup) return this._bridgeSizeCleanup;
1773
+ let observerCleanup;
1774
+ let stopped = false;
1775
+ const cleanup = () => {
1776
+ stopped = true;
1777
+ observerCleanup == null ? void 0 : observerCleanup();
1778
+ this._bridgeSizeCleanup = void 0;
1779
+ };
1780
+ this._bridgeSizeCleanup = cleanup;
1781
+ this.initiated().then(() => {
1782
+ if (stopped || this.markedForDisposed) return;
1783
+ this.IframeElement.style.position = "relative";
1784
+ this.IframeElement.style.inset = "auto";
1785
+ this.IframeElement.style.width = "100%";
1786
+ this.setHeightBasedOnScrollHeight();
1787
+ observerCleanup = this.send(new SetResizeObserverMessage());
1788
+ }).catch(() => {
1789
+ });
1790
+ return cleanup;
1791
+ });
1768
1792
  __publicField(this, "setSizeBasedOnDocumentElement", () => {
1769
1793
  const cleanupHandler = this.send(new ExecuteScriptMessage(() => {
1770
1794
  const { height, width } = document.documentElement.getBoundingClientRect();
@@ -1810,6 +1834,8 @@ var MyopIframeComponent = class extends BaseMyopComponent {
1810
1834
  return cleanupHandler;
1811
1835
  });
1812
1836
  __publicField(this, "dispose", () => {
1837
+ var _a;
1838
+ (_a = this._bridgeSizeCleanup) == null ? void 0 : _a.call(this);
1813
1839
  if (this._autoSizeCleanup) {
1814
1840
  this._autoSizeCleanup();
1815
1841
  this._autoSizeCleanup = void 0;
@@ -1986,7 +2012,11 @@ var MyopIframeLoader = class extends BaseMyopLoader {
1986
2012
  container.innerHTML = "";
1987
2013
  IframeElement = this.appendChild(container, IframeElement, options);
1988
2014
  }
1989
- return new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
2015
+ const component = new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
2016
+ if (typedLoaderConfig.autoHeight && (options == null ? void 0 : options.autoSize) !== false) {
2017
+ component.observeHeightViaBridge();
2018
+ }
2019
+ return component;
1990
2020
  }));
1991
2021
  }
1992
2022
  };
@@ -2100,1182 +2130,1544 @@ var WebcomponentLoader = class extends BaseMyopLoader {
2100
2130
  };
2101
2131
 
2102
2132
  // version:myop-sdk-version
2103
- var myop_sdk_version_default = "0.3.36";
2133
+ var myop_sdk_version_default = "0.4.0-beta.0";
2104
2134
 
2105
- // src/webcomponent/messageHandlers/BaseWebComponentMessageHandler.ts
2106
- var BaseWebComponentMessageHandler = class extends BaseContextMessageHandler {
2107
- constructor(messageToHost, context) {
2108
- super(messageToHost);
2109
- this.context = context;
2110
- __publicField(this, "executor", (event) => {
2111
- if (event.destination) {
2112
- const destination = event.destination;
2113
- if (this.context[destination].context) {
2114
- const _messageToHost = (message, replayTo) => {
2115
- this.messageToHost(__spreadProps(__spreadValues({}, message), {
2116
- source: event.destination ? event.destination : event.source,
2117
- destination: event.source ? event.source : event.destination
2118
- }), replayTo);
2119
- };
2120
- return this.innerExecutor(event, this.context[destination].context, _messageToHost);
2121
- } else {
2122
- debugger;
2135
+ // src/helpers/deliveryStore.ts
2136
+ var DB_NAME = "myop-delivery";
2137
+ var STORE = "components";
2138
+ var DB_VERSION = 1;
2139
+ var dbPromise = null;
2140
+ function openDb() {
2141
+ if (dbPromise) return dbPromise;
2142
+ dbPromise = new Promise((resolve) => {
2143
+ try {
2144
+ if (typeof indexedDB === "undefined") return resolve(null);
2145
+ const req = indexedDB.open(DB_NAME, DB_VERSION);
2146
+ req.onupgradeneeded = () => {
2147
+ const db = req.result;
2148
+ if (!db.objectStoreNames.contains(STORE)) db.createObjectStore(STORE, { keyPath: "key" });
2149
+ };
2150
+ req.onsuccess = () => resolve(req.result);
2151
+ req.onerror = () => resolve(null);
2152
+ req.onblocked = () => resolve(null);
2153
+ } catch (e) {
2154
+ resolve(null);
2155
+ }
2156
+ });
2157
+ return dbPromise;
2158
+ }
2159
+ function tx(mode, fn) {
2160
+ return openDb().then((db) => new Promise((resolve) => {
2161
+ if (!db) return resolve(null);
2162
+ try {
2163
+ const t = db.transaction(STORE, mode);
2164
+ const req = fn(t.objectStore(STORE));
2165
+ req.onsuccess = () => resolve(req.result);
2166
+ req.onerror = () => resolve(null);
2167
+ t.onabort = () => resolve(null);
2168
+ } catch (e) {
2169
+ resolve(null);
2170
+ }
2171
+ }));
2172
+ }
2173
+ var HINT_PREFIX = "myop.d.";
2174
+ function writeHint(key, tag, expiresAt) {
2175
+ try {
2176
+ localStorage.setItem(HINT_PREFIX + key, JSON.stringify({ t: tag, e: expiresAt }));
2177
+ } catch (e) {
2178
+ }
2179
+ }
2180
+ function clearHint(key) {
2181
+ try {
2182
+ localStorage.removeItem(HINT_PREFIX + key);
2183
+ } catch (e) {
2184
+ }
2185
+ }
2186
+ var memory = /* @__PURE__ */ new Map();
2187
+ var deliveryStore = {
2188
+ key(host, componentId, env, preview, opt) {
2189
+ return `${host}|${componentId}|${env}|${preview ? "preview" : "live"}|${opt || "raw"}`;
2190
+ },
2191
+ get(key) {
2192
+ return __async(this, null, function* () {
2193
+ const m = memory.get(key);
2194
+ if (m) return m;
2195
+ const e = yield tx("readonly", (s) => s.get(key));
2196
+ if (e) {
2197
+ memory.set(key, e);
2198
+ writeHint(key, e.tag, e.storedAt + e.windowMs);
2199
+ }
2200
+ return e;
2201
+ });
2202
+ },
2203
+ put(entry) {
2204
+ return __async(this, null, function* () {
2205
+ memory.set(entry.key, entry);
2206
+ writeHint(entry.key, entry.tag, entry.storedAt + entry.windowMs);
2207
+ yield tx("readwrite", (s) => s.put(entry));
2208
+ });
2209
+ },
2210
+ drop(key) {
2211
+ return __async(this, null, function* () {
2212
+ memory.delete(key);
2213
+ clearHint(key);
2214
+ yield tx("readwrite", (s) => s.delete(key));
2215
+ });
2216
+ },
2217
+ /** Still usable without asking the server? */
2218
+ fresh(e) {
2219
+ return !!e && Date.now() - e.storedAt < e.windowMs;
2220
+ },
2221
+ /**
2222
+ * The window this response licenses: the server's freshness minus what a CDN already
2223
+ * spent. Returns 0 when the server said nothing about caching, which means "do not
2224
+ * hold this" — the safe reading, and what production sends today.
2225
+ */
2226
+ windowFrom(headers) {
2227
+ const cc = headers.get("cache-control") || "";
2228
+ if (/no-store|no-cache/i.test(cc)) return 0;
2229
+ const m = /s-maxage\s*=\s*(\d+)/i.exec(cc) || /max-age\s*=\s*(\d+)/i.exec(cc);
2230
+ if (!m) return 0;
2231
+ const total = Number(m[1]);
2232
+ const age = Number(headers.get("age") || 0);
2233
+ return Math.max(0, total - (isNaN(age) ? 0 : age)) * 1e3;
2234
+ },
2235
+ /** For tests and for `refresh()`: forget everything this browser holds. */
2236
+ clear() {
2237
+ return __async(this, null, function* () {
2238
+ memory.clear();
2239
+ try {
2240
+ for (let i = localStorage.length - 1; i >= 0; i--) {
2241
+ const k = localStorage.key(i);
2242
+ if (k && k.startsWith(HINT_PREFIX)) localStorage.removeItem(k);
2123
2243
  }
2124
- } else {
2125
- debugger;
2244
+ } catch (e) {
2126
2245
  }
2246
+ yield tx("readwrite", (s) => s.clear());
2127
2247
  });
2128
2248
  }
2129
2249
  };
2130
2250
 
2131
- // src/consts.ts
2132
- var myopAttributes = {
2133
- id: "myop-id"
2251
+ // src/helpers/CloudRepository.ts
2252
+ var convertV2VariantToComponentConfig = (config) => {
2253
+ return {
2254
+ instance: {
2255
+ id: "auto",
2256
+ componentId: config.componentId,
2257
+ componentName: config.name,
2258
+ skinSelector: {
2259
+ type: "Dedicated",
2260
+ skin: {
2261
+ id: "skin_auto_v2_converted"
2262
+ }
2263
+ }
2264
+ },
2265
+ type: {
2266
+ id: config.id,
2267
+ name: config.name,
2268
+ description: config.description,
2269
+ props: [
2270
+ {
2271
+ id: "in_auto_v2_converted",
2272
+ name: "myop_init_interface",
2273
+ type: "any",
2274
+ behavior: {
2275
+ type: PropConfigBehaviorTypes.code
2276
+ }
2277
+ },
2278
+ {
2279
+ id: "out_auto_v2_converted",
2280
+ name: "myop_cta_handler",
2281
+ type: "any",
2282
+ behavior: {
2283
+ type: PropConfigBehaviorTypes.code
2284
+ }
2285
+ }
2286
+ ],
2287
+ refs: [],
2288
+ skins: [
2289
+ {
2290
+ id: "skin_auto_v2_converted",
2291
+ name: "auto_v2_converted",
2292
+ description: "",
2293
+ //TODO : handle empty :
2294
+ // @ts-ignore
2295
+ loader: config.consume_variant[0].loader
2296
+ }
2297
+ ],
2298
+ defaultSkin: 0
2299
+ },
2300
+ name: config.name
2301
+ };
2134
2302
  };
2135
-
2136
- // src/common/messageHandlers/helpers.ts
2137
- var getElementsByRef = (ref, el) => {
2138
- return el.querySelectorAll(`[${myopAttributes.id}='${ref.refConfig.selector}']`);
2303
+ var GLOBAL_KEY = "__MYOP_CLOUD_REPOSITORY_MAIN__";
2304
+ var getGlobalMain = () => {
2305
+ if (typeof window !== "undefined") {
2306
+ return window[GLOBAL_KEY];
2307
+ }
2308
+ if (typeof globalThis !== "undefined") {
2309
+ return globalThis[GLOBAL_KEY];
2310
+ }
2311
+ return void 0;
2139
2312
  };
2140
-
2141
- // src/webcomponent/messageHandlers/bindOnClickHandler.ts
2142
- var BindOnClickHandler = class extends BaseWebComponentMessageHandler {
2143
- constructor() {
2144
- super(...arguments);
2145
- __publicField(this, "messageType", MyopMessages.BindClickMessage);
2146
- __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2147
- const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2148
- const cleanupTasks = [];
2149
- items.forEach((item) => {
2150
- const handler = () => {
2151
- messageToHost(new ClickReplayMessage(event.handlerUniqueId));
2152
- };
2153
- item.addEventListener("click", handler);
2154
- cleanupTasks.push(() => {
2155
- item.removeEventListener("click", handler);
2156
- });
2157
- });
2158
- return () => {
2159
- cleanupTasks.forEach((task) => task());
2160
- };
2161
- });
2313
+ var setGlobalMain = (instance) => {
2314
+ if (typeof window !== "undefined") {
2315
+ window[GLOBAL_KEY] = instance;
2316
+ }
2317
+ if (typeof globalThis !== "undefined") {
2318
+ globalThis[GLOBAL_KEY] = instance;
2162
2319
  }
2163
2320
  };
2164
-
2165
- // src/webcomponent/messageHandlers/changeTextHandler.ts
2166
- var ChangeTextHandler = class extends BaseWebComponentMessageHandler {
2167
- constructor() {
2168
- super(...arguments);
2169
- __publicField(this, "messageType", MyopMessages.ChangeTextMessage);
2170
- __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2171
- const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2172
- items.forEach((item) => {
2173
- item.textContent = event.content;
2174
- });
2321
+ var _CloudRepository = class _CloudRepository {
2322
+ constructor(_baseUrl = "https://cloud.myop.dev") {
2323
+ this._baseUrl = _baseUrl;
2324
+ // v2 cache - keyed by componentId:env:preview|live
2325
+ // Each Promise is tagged with a `resolved` property after settling (see fetchComponentV2).
2326
+ __publicField(this, "variants", {});
2327
+ // Track which components were preloaded and with what params
2328
+ // Key: componentId, Value: { env, preview }
2329
+ __publicField(this, "preloadedComponents", {});
2330
+ // v1 cache
2331
+ __publicField(this, "userFlows", {});
2332
+ __publicField(this, "_defaultEnv", "production");
2333
+ __publicField(this, "_envExplicitlySet", false);
2334
+ __publicField(this, "_staticMode", false);
2335
+ __publicField(this, "_queryParams", {});
2336
+ /**
2337
+ * Opt-in delivery settings, set by myop.delivery(). Off means: this file behaves
2338
+ * EXACTLY as it did before — same host, same URL, same everything.
2339
+ */
2340
+ __publicField(this, "_delivery", { minify: false, host: null, cache: false });
2341
+ /**
2342
+ * What actually happened, for myop.delivery.stats(). `fellBack` is the number that
2343
+ * matters: it is how you find out the lane is unhealthy without waiting for a
2344
+ * bug report, because a fallback is INVISIBLE to the page (it still renders).
2345
+ */
2346
+ __publicField(this, "_deliveryStats", {
2347
+ requests: 0,
2348
+ viaDelivery: 0,
2349
+ fellBack: 0,
2350
+ lastError: null,
2351
+ /** where the last loads were answered from — the number the client window exists to move */
2352
+ fromMemory: 0,
2353
+ fromStorage: 0,
2354
+ fromNetwork: 0,
2355
+ /** re-checks after the window ended, and how many were answered "nothing changed" */
2356
+ revalidations: 0,
2357
+ unchanged: 0,
2358
+ bytesSaved: 0
2175
2359
  });
2360
+ /**
2361
+ * Local serves waiting to be reported: componentId -> {env, count}.
2362
+ *
2363
+ * THE MEASUREMENT PROBLEM THIS SOLVES. The better this cache works, the more usage
2364
+ * vanishes: a visitor inside their freshness window renders the page with no request,
2365
+ * so neither the server nor the CDN can see them. Left alone, a successful rollout
2366
+ * looks in the ledger exactly like customers leaving.
2367
+ *
2368
+ * So local serves are counted here and reported afterwards, batched, on a path that
2369
+ * never blocks rendering: flushed when the page is hidden (keepalive, so it survives
2370
+ * the tab closing) and opportunistically whenever the SDK is talking to the server
2371
+ * anyway. Nothing is sent while the page is loading, which is the point of the window.
2372
+ */
2373
+ __publicField(this, "_localServes", /* @__PURE__ */ new Map());
2374
+ __publicField(this, "_flushBound", false);
2176
2375
  }
2177
- };
2178
-
2179
- // src/webcomponent/shadowRootRef.ts
2180
- var ShadowRootRef = class extends RootRef {
2181
- constructor(container, shadowRoot) {
2182
- super(container, shadowRoot);
2183
- this.container = container;
2184
- this.shadowRoot = shadowRoot;
2376
+ static get Main() {
2377
+ const globalMain = getGlobalMain();
2378
+ if (globalMain) {
2379
+ return globalMain;
2380
+ }
2381
+ if (!_CloudRepository._main) {
2382
+ _CloudRepository._main = new _CloudRepository();
2383
+ setGlobalMain(_CloudRepository._main);
2384
+ }
2385
+ return _CloudRepository._main;
2185
2386
  }
2186
- };
2187
-
2188
- // src/webcomponent/messageHandlers/DetectMyopRefsMessageHandler.ts
2189
- var DetectMyopRefsMessageHandler = class extends BaseWebComponentMessageHandler {
2190
- constructor() {
2191
- super(...arguments);
2192
- __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2193
- const allMyopItems = shadowRootRef.shadowRoot.querySelectorAll(`[${myopAttributes.id}]`);
2194
- let myopRefs = [];
2195
- allMyopItems.forEach((item) => {
2196
- const myopId = item.getAttribute(myopAttributes.id);
2197
- if (myopId) {
2198
- myopRefs.push(new MyopElementRef(myopId, item.tagName, item.getBoundingClientRect(), item.offsetTop, item.offsetLeft));
2199
- }
2200
- });
2201
- this.messageToHost(new DetectedMyopRefsMessage(event.handlerUniqueId, myopRefs));
2387
+ /**
2388
+ * How big the component we are NOT re-downloading is. Deliberately measured from what
2389
+ * we hold rather than from Content-Length: once a response is compressed the header is
2390
+ * not readable cross-origin, so reading it there reported 0 every single time.
2391
+ */
2392
+ static sizeOfHeld(e) {
2393
+ var _a, _b, _c, _d, _e;
2394
+ try {
2395
+ return (((_e = (_d = (_c = (_b = (_a = e == null ? void 0 : e.config) == null ? void 0 : _a.type) == null ? void 0 : _b.skins) == null ? void 0 : _c[0]) == null ? void 0 : _d.loader) == null ? void 0 : _e.HTML) || "").length;
2396
+ } catch (e2) {
2397
+ return 0;
2398
+ }
2399
+ }
2400
+ /**
2401
+ * Turn on the opt-in delivery path.
2402
+ *
2403
+ * Opting in IS choosing the delivery stack: this points /consume at `host` (a second,
2404
+ * complete stack reading the same data) and asks for the minified artifact. Leave this
2405
+ * uncalled and nothing about the SDK changes.
2406
+ *
2407
+ * Deliberately mutates THIS instance rather than constructing a new repository:
2408
+ * CloudRepository.Main is a global singleton shared across bundles (see getGlobalMain),
2409
+ * so a second instance would be ignored by every component already using the first.
2410
+ */
2411
+ setDelivery(opts = {}) {
2412
+ if (opts.minify !== void 0) this._delivery.minify = !!opts.minify;
2413
+ if (opts.host !== void 0) this._delivery.host = opts.host;
2414
+ if (opts.cache !== void 0) this._delivery.cache = !!opts.cache;
2415
+ }
2416
+ deliveryStats() {
2417
+ var _a;
2418
+ return __spreadProps(__spreadValues({}, this._deliveryStats), {
2419
+ host: (_a = this._delivery.host) != null ? _a : _CloudRepository.DEFAULT_HOST,
2420
+ minify: this._delivery.minify,
2421
+ cache: this._delivery.cache
2202
2422
  });
2203
- __publicField(this, "messageType", MyopMessages.DetectMyopRefsMessage);
2204
2423
  }
2205
- };
2206
-
2207
- // src/webcomponent/messageHandlers/setAttributeHandler.ts
2208
- var setAttributeHandler = class extends BaseWebComponentMessageHandler {
2209
- constructor() {
2210
- super(...arguments);
2211
- __publicField(this, "messageType", MyopMessages.SetAttributeMessage);
2212
- __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2213
- const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2214
- items.forEach((item) => {
2215
- item.setAttribute(event.name, event.value);
2216
- });
2424
+ /**
2425
+ * Forget what this browser holds, so the next load asks the server.
2426
+ * `refresh()` with no ids drops everything; the counterpart to the window for the case
2427
+ * where a change has to be visible on THIS load — right after someone publishes.
2428
+ */
2429
+ refreshDelivery() {
2430
+ return __async(this, null, function* () {
2431
+ yield deliveryStore.clear();
2217
2432
  });
2218
2433
  }
2219
- };
2220
-
2221
- // src/webcomponent/messageHandlers/addEventListenerHandler.ts
2222
- var AddEventListenerHandler = class extends BaseWebComponentMessageHandler {
2223
- constructor() {
2224
- super(...arguments);
2225
- __publicField(this, "messageType", MyopMessages.AddEventListenerMessage);
2226
- __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2227
- const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2228
- const cleanupTasks = [];
2229
- items.forEach((item) => {
2230
- const handler = (e) => {
2231
- messageToHost(new EventListenerCallbackMessage(event.handlerUniqueId, makeSerializable(e, event.serializableSkeleton)));
2232
- };
2233
- item.addEventListener(event.type, handler);
2234
- cleanupTasks.push(() => {
2235
- item.removeEventListener(event.type, handler);
2236
- });
2237
- });
2238
- return () => {
2239
- cleanupTasks.forEach((task) => task());
2240
- };
2241
- });
2434
+ noteLocalServe(componentId, env) {
2435
+ const cur = this._localServes.get(componentId);
2436
+ if (cur) cur.count++;
2437
+ else this._localServes.set(componentId, { env, count: 1 });
2438
+ this.bindFlush();
2439
+ }
2440
+ /** Report on page-hide, which is the only event that reliably fires on mobile. */
2441
+ bindFlush() {
2442
+ if (this._flushBound || typeof document === "undefined") return;
2443
+ this._flushBound = true;
2444
+ const onHide = () => {
2445
+ if (document.visibilityState === "hidden") this.flushLocalServes();
2446
+ };
2447
+ document.addEventListener("visibilitychange", onHide);
2448
+ window.addEventListener("pagehide", () => this.flushLocalServes());
2242
2449
  }
2243
- };
2244
-
2245
- // src/webcomponent/messageHandlers/CreateRefComponentMessageHandler.ts
2246
- var CreateRefComponentMessageHandler = class extends BaseWebComponentMessageHandler {
2247
- constructor() {
2248
- super(...arguments);
2249
- __publicField(this, "messageType", MyopMessages.CreateRefComponentMessage);
2250
- __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2251
- const createRef = () => __async(this, null, function* () {
2252
- const allItems = shadowRootRef.shadowRoot.querySelectorAll(`[${myopAttributes.id}='${event.refConfig.selector}']`);
2253
- if (allItems.length === 1) {
2254
- const hostSDK2 = HostSDK.Instance();
2255
- const refComponent = hostSDK2.components.find((c) => c.id === event.options.id);
2256
- if (refComponent) {
2257
- refComponent.dispose();
2258
- } else {
2259
- }
2260
- const index = hostSDK2.components.indexOf(refComponent);
2261
- if (index !== -1) {
2262
- hostSDK2.components.splice(index, 1);
2263
- } else {
2264
- }
2265
- const implementationComponent = yield hostSDK2.loadComponent(
2266
- event.nestedComponentConfig,
2267
- allItems.item(0),
2268
- event.options
2269
- );
2270
- const nestedRefConfig = [];
2271
- Object.keys(implementationComponent.refs).forEach((refName) => {
2272
- let ref = implementationComponent.refs[refName];
2273
- ref = ref.__nonProxied || ref;
2274
- if (ref.componentDefinition) {
2275
- nestedRefConfig.push({
2276
- refName,
2277
- componentDefinitionId: ref.componentDefinition.id
2278
- });
2279
- }
2280
- });
2281
- messageToHost(new RefComponentCreatedMessage(event.handlerUniqueId, nestedRefConfig));
2282
- } else {
2283
- console.error("CreateRefComponentMessageHandler - DOM element not found");
2284
- this.messageToHost(new RefComponentCreatedMessage(event.handlerUniqueId, [], true));
2285
- debugger;
2286
- }
2450
+ /**
2451
+ * Send what we have. `keepalive` is what makes this work at page-hide: the request
2452
+ * outlives the document. Failure is ignored — a lost usage report must never be
2453
+ * visible to a visitor, and the next page load will report its own.
2454
+ */
2455
+ flushLocalServes() {
2456
+ if (!this._localServes.size) return;
2457
+ const batch = [...this._localServes.entries()].map(([id, v]) => `${id}:${v.env}:${v.count}`).join(",");
2458
+ this._localServes.clear();
2459
+ try {
2460
+ const url = `${this.deliveryHost()}/clientUsage?b=${encodeURIComponent(batch)}`;
2461
+ fetch(url, { keepalive: true, mode: "cors", credentials: "omit" }).catch(() => {
2287
2462
  });
2288
- createRef().then();
2289
- });
2463
+ } catch (e) {
2464
+ }
2290
2465
  }
2291
- };
2292
-
2293
- // src/common/messageHandlers/executeScriptHandler.ts
2294
- var ExecuteScriptHandlerExecutor = (event, replier, rootRef) => {
2295
- const __scriptInputs = event.scriptInputs ? event.scriptInputs : {};
2296
- __scriptInputs.makeSerializable = makeSerializable;
2297
- __scriptInputs.send = replier;
2298
- __scriptInputs.rootRef = rootRef;
2299
- __scriptInputs.__scriptInputs = __scriptInputs;
2300
- const dynamicFunction = new Function(`return (${event.script})(...arguments)`);
2301
- const ret = dynamicFunction(__scriptInputs);
2302
- replier(ret);
2303
- };
2304
-
2305
- // src/webcomponent/messageHandlers/executeScriptHandler.ts
2306
- var ExecuteScriptHandler = class extends BaseWebComponentMessageHandler {
2307
- constructor() {
2308
- super(...arguments);
2309
- __publicField(this, "messageType", MyopMessages.ExecuteScriptMessage);
2310
- __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2311
- const replier = (data) => {
2312
- messageToHost(new ExecuteScriptReplyMessage(event.handlerUniqueId, data));
2313
- };
2314
- ExecuteScriptHandlerExecutor(event, replier, shadowRootRef);
2315
- });
2466
+ /** Where /consume should be fetched from right now. */
2467
+ deliveryHost() {
2468
+ return this._delivery.host || this._baseUrl;
2316
2469
  }
2317
- };
2318
-
2319
- // src/webcomponent/messageHandlers/GetElementValueHandler.ts
2320
- var getInputValue = (element) => {
2321
- if (!element) return null;
2322
- if (element.tagName === "FORM") {
2323
- const formData = new FormData(element);
2324
- const dataObject = {
2325
- formData: {},
2326
- unmappedData: []
2327
- };
2328
- const elements = element.querySelectorAll("input, select, textarea");
2329
- let autoNameIndexer = -1;
2330
- elements.forEach((element2) => {
2331
- if (typeof element2.value === "string") {
2332
- const myopId = element2.getAttribute(myopAttributes.id);
2333
- let key = element2.getAttribute("name");
2334
- const nodeData = {
2335
- id: element2.id,
2336
- name: key,
2337
- value: getInputValue(element2),
2338
- required: element2.required,
2339
- validity: makeSerializable(element2.validity, true),
2340
- myopId
2341
- };
2342
- if (!key) {
2343
- dataObject.unmappedData.push(nodeData);
2344
- } else {
2345
- if (dataObject.formData[key]) {
2346
- if (dataObject.formData[key].value) {
2347
- dataObject.unmappedData.push(nodeData);
2348
- } else {
2349
- dataObject.unmappedData.push(dataObject.formData[key]);
2350
- dataObject.formData[key] = nodeData;
2351
- }
2352
- } else {
2353
- dataObject.formData[key] = nodeData;
2354
- }
2470
+ /**
2471
+ * Fetch a delivery URL with ONE fallback to the default host.
2472
+ *
2473
+ * The fallback is the kill switch: break or disable the lane and every client drifts
2474
+ * back to cloud.myop.dev on its own, with no customer deploy. It must therefore be
2475
+ * genuinely silent to the page and genuinely LOUD in stats() — a fallback that nobody
2476
+ * counts is an outage nobody notices.
2477
+ *
2478
+ * Only transport failures and 5xx fall back. A 404 is an answer: the component really
2479
+ * is missing, and retrying elsewhere would only hide it.
2480
+ */
2481
+ deliveryFetch(path) {
2482
+ return __async(this, null, function* () {
2483
+ var _a;
2484
+ if (this._localServes.size) this.flushLocalServes();
2485
+ const host = this.deliveryHost();
2486
+ const primary = `${host}${path}`;
2487
+ this._deliveryStats.requests++;
2488
+ const usingLane = host !== this._baseUrl;
2489
+ try {
2490
+ const res = yield fetch(primary);
2491
+ if (res.ok || res.status < 500 || !usingLane) {
2492
+ if (usingLane && res.ok) this._deliveryStats.viaDelivery++;
2493
+ return res;
2355
2494
  }
2495
+ this._deliveryStats.lastError = `HTTP ${res.status} from ${host}`;
2496
+ } catch (e) {
2497
+ if (!usingLane) throw e;
2498
+ this._deliveryStats.lastError = String((_a = e == null ? void 0 : e.message) != null ? _a : e);
2356
2499
  }
2500
+ this._deliveryStats.fellBack++;
2501
+ console.warn(`[myop] delivery host failed (${this._deliveryStats.lastError}) \u2014 falling back to ${this._baseUrl}`);
2502
+ return yield fetch(`${this._baseUrl}${path}`);
2357
2503
  });
2358
- return dataObject;
2359
2504
  }
2360
- if (element.type === "checkbox" || element.type === "radio") {
2361
- return element.checked ? element.value : null;
2505
+ /**
2506
+ * Enable static mode for self-hosted component registries.
2507
+ * In static mode, URLs are constructed as file paths instead of query params:
2508
+ * ${baseUrl}/components/${componentId}/${env}.json
2509
+ */
2510
+ enableStaticMode() {
2511
+ this._staticMode = true;
2362
2512
  }
2363
- if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") {
2364
- return element.value;
2513
+ /**
2514
+ * Set query parameters to append to all fetch URLs (e.g. for CDN cache busting).
2515
+ * Example: `setQueryParams({ lastupdate: '11112026' })`
2516
+ */
2517
+ setQueryParams(params) {
2518
+ this._queryParams = params;
2365
2519
  }
2366
- if (element.tagName === "SELECT") {
2367
- return element.value;
2520
+ /**
2521
+ * Set the default environment for this CloudRepository instance
2522
+ */
2523
+ setEnvironment(env) {
2524
+ this._defaultEnv = env;
2525
+ this._envExplicitlySet = true;
2368
2526
  }
2369
- if (element.isContentEditable) {
2370
- return element.innerText || element.textContent;
2527
+ /**
2528
+ * Get the current default environment
2529
+ */
2530
+ getDefaultEnvironment() {
2531
+ return this._defaultEnv;
2371
2532
  }
2372
- return null;
2373
- };
2374
- var GetElementValueHandler = class extends BaseWebComponentMessageHandler {
2375
- constructor() {
2376
- super(...arguments);
2377
- __publicField(this, "messageType", MyopMessages.GetElementValueMessage);
2378
- __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2379
- const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2380
- items.forEach((item) => {
2381
- messageToHost(new ElementValueReplayMessage(getInputValue(item)), event);
2382
- });
2383
- });
2533
+ // ============ V2 Methods (Default) ============
2534
+ /**
2535
+ * Check if a component is already cached/preloaded (v2)
2536
+ * If env and preview are not provided, checks if ANY version is preloaded
2537
+ */
2538
+ isPreloaded(componentId, env, preview) {
2539
+ if (env !== void 0 || preview !== void 0) {
2540
+ const cacheKey = `${componentId}:${env || this._defaultEnv}:${preview ? "preview" : "live"}`;
2541
+ return cacheKey in this.variants;
2542
+ }
2543
+ return componentId in this.preloadedComponents;
2384
2544
  }
2385
- };
2386
-
2387
- // src/webcomponent/messageHandlers/setInnerHtmlHandler.ts
2388
- var SetInnerHtmlHandler = class extends BaseWebComponentMessageHandler {
2389
- constructor() {
2390
- super(...arguments);
2391
- __publicField(this, "messageType", MyopMessages.SetInnerHtml);
2392
- __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2393
- const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2394
- items.forEach((item) => {
2395
- item.innerHTML = event.content;
2396
- });
2397
- });
2545
+ /**
2546
+ * Get the preloaded params for a component (if preloaded)
2547
+ * Returns undefined if not preloaded
2548
+ */
2549
+ getPreloadedParams(componentId) {
2550
+ return this.preloadedComponents[componentId];
2398
2551
  }
2399
- };
2400
-
2401
- // src/webcomponent/WebComponentSDK.ts
2402
- var WebComponentSDK = class extends BaseMyopSDK {
2403
- constructor() {
2404
- super(...arguments);
2405
- __publicField(this, "alwaysPassEnvelopesToHost", true);
2406
- //when new web component created.
2407
- __publicField(this, "connectedCallback", (container, shadow) => {
2408
- container.addEventListener(myopWebcomponentConsts.webcomponent_message_key, (e) => {
2409
- const eventContent = e.data ? e.data : e.detail;
2410
- if (!eventContent || !eventContent.myop) {
2411
- debugger;
2412
- throw new Error("recvied webcomponent_message with wrong type");
2413
- } else {
2414
- const message = eventContent;
2415
- this.handleIncomeMessages(e);
2416
- if (message.messageType === MyopMessages.InitMessage) {
2417
- const newComponentId = message.content.id;
2418
- this.components[newComponentId].context = new ShadowRootRef(container, shadow);
2419
- }
2420
- }
2421
- });
2422
- setTimeout(() => {
2423
- this.messageToHost(new InitRequest());
2424
- }, 1);
2552
+ /**
2553
+ * Resolve a component config: fetch it once, then serve it from this
2554
+ * repository's cache.
2555
+ *
2556
+ * This is the name to use. `fetchComponentV2` is the same method under its
2557
+ * versioned name and stays for backward compatibility — note that the
2558
+ * unversioned `fetchComponent` is a *deprecated v1* API and is NOT this.
2559
+ *
2560
+ * Completes the trio with {@link getResolvedConfig} (synchronous read of an
2561
+ * already-resolved config) and {@link hydrateComponent} (seed one you
2562
+ * already hold).
2563
+ *
2564
+ * Prefer the module-level `preloadComponents([id])` in app code; reach for
2565
+ * this when you need an isolated repository instance whose cache lifetime
2566
+ * you control — a server with its own TTL, for example.
2567
+ */
2568
+ resolveComponent(componentId, env, preview) {
2569
+ return __async(this, null, function* () {
2570
+ return this.fetchComponentV2(componentId, env, preview);
2425
2571
  });
2426
- __publicField(this, "messageToHost", (message, replayTo) => {
2427
- message.direction = MessageDirection.up;
2428
- if (!message.replayToHandler && (replayTo == null ? void 0 : replayTo.handlerUniqueId))
2429
- message.replayToHandler = replayTo.handlerUniqueId;
2430
- window.myop.hostSDK.send(message);
2572
+ }
2573
+ /**
2574
+ * Fetch a v2 component config
2575
+ * If env/preview not specified and component was preloaded, uses preloaded params
2576
+ *
2577
+ * @see resolveComponent — the unversioned name for this method
2578
+ */
2579
+ fetchComponentV2(componentId, environmentIdentifier, preview) {
2580
+ return __async(this, null, function* () {
2581
+ const { env, usePreview, cacheKey } = this.resolveParams(componentId, environmentIdentifier, preview);
2582
+ console.log("[CloudRepository] fetchComponentV2", {
2583
+ componentId: componentId.slice(0, 8) + "...",
2584
+ env,
2585
+ usePreview,
2586
+ cacheKey,
2587
+ cached: cacheKey in this.variants
2588
+ });
2589
+ if (!this.variants[cacheKey]) {
2590
+ if (!this.preloadedComponents[componentId]) {
2591
+ this.preloadedComponents[componentId] = { env, preview: usePreview };
2592
+ }
2593
+ this.variants[cacheKey] = new Promise(
2594
+ (resolve, reject) => __async(this, null, function* () {
2595
+ try {
2596
+ let url;
2597
+ if (this._staticMode) {
2598
+ const file = usePreview ? "preview" : env;
2599
+ url = `${this._baseUrl}/components/${componentId}/${file}.json`;
2600
+ const qs = new URLSearchParams(this._queryParams).toString();
2601
+ if (qs) url += `?${qs}`;
2602
+ } else {
2603
+ url = `/consume?id=${componentId}&env=${env}`;
2604
+ if (usePreview) {
2605
+ url += "&preview=true";
2606
+ }
2607
+ if (this._delivery.minify && !usePreview) {
2608
+ url += "&opt=min";
2609
+ }
2610
+ }
2611
+ const cacheable = this._delivery.cache && !this._staticMode && !usePreview;
2612
+ const storeKey = cacheable ? deliveryStore.key(
2613
+ this.deliveryHost(),
2614
+ componentId,
2615
+ env,
2616
+ usePreview,
2617
+ this._delivery.minify ? "min" : "raw"
2618
+ ) : "";
2619
+ let held = cacheable ? yield deliveryStore.get(storeKey) : null;
2620
+ if (held && deliveryStore.fresh(held)) {
2621
+ this._deliveryStats.fromStorage++;
2622
+ this.noteLocalServe(componentId, env);
2623
+ this.variants[cacheKey].resolved = held.config;
2624
+ resolve(held.config);
2625
+ return;
2626
+ }
2627
+ if (held && held.tag) {
2628
+ const checkUrl = `/consume?ids=${componentId}&env=${env}` + (this._delivery.minify ? "&opt=min" : "") + `&have=${encodeURIComponent(held.tag)}`;
2629
+ this._deliveryStats.revalidations++;
2630
+ try {
2631
+ const check = yield this.deliveryFetch(checkUrl);
2632
+ if (check.ok) {
2633
+ const body = yield check.json();
2634
+ if ((body.unchanged || []).includes(componentId)) {
2635
+ this._deliveryStats.unchanged++;
2636
+ this._deliveryStats.bytesSaved += _CloudRepository.sizeOfHeld(held);
2637
+ held.storedAt = Date.now();
2638
+ held.windowMs = deliveryStore.windowFrom(check.headers) || held.windowMs;
2639
+ yield deliveryStore.put(held);
2640
+ this.variants[cacheKey].resolved = held.config;
2641
+ resolve(held.config);
2642
+ return;
2643
+ }
2644
+ const item = (body.items || [])[0];
2645
+ if (item) {
2646
+ const cfg = convertV2VariantToComponentConfig(item);
2647
+ this._deliveryStats.fromNetwork++;
2648
+ yield deliveryStore.put({
2649
+ key: storeKey,
2650
+ config: cfg,
2651
+ tag: item.tag || null,
2652
+ storedAt: Date.now(),
2653
+ windowMs: deliveryStore.windowFrom(check.headers),
2654
+ host: this.deliveryHost()
2655
+ });
2656
+ this.variants[cacheKey].resolved = cfg;
2657
+ resolve(cfg);
2658
+ return;
2659
+ }
2660
+ }
2661
+ } catch (e) {
2662
+ }
2663
+ }
2664
+ const res = this._staticMode ? yield fetch(url) : yield this.deliveryFetch(url);
2665
+ if (!res.ok) {
2666
+ reject(new Error(`Failed to load component "${componentId}" (${res.status}${this._staticMode ? ` from ${url}` : ""})`));
2667
+ return;
2668
+ }
2669
+ const json = yield res.json();
2670
+ const variant = json.item;
2671
+ if (!variant) {
2672
+ reject(new Error(`Component "${componentId}" not found`));
2673
+ return;
2674
+ }
2675
+ if (!variant.consume_variant || !variant.consume_variant.length) {
2676
+ reject(new Error(`Component "${componentId}" has no implementation for environment "${env}"`));
2677
+ return;
2678
+ }
2679
+ const componentConfig = convertV2VariantToComponentConfig(variant);
2680
+ this._deliveryStats.fromNetwork++;
2681
+ if (cacheable) {
2682
+ yield deliveryStore.put({
2683
+ key: storeKey,
2684
+ config: componentConfig,
2685
+ tag: variant.tag || null,
2686
+ storedAt: Date.now(),
2687
+ windowMs: deliveryStore.windowFrom(res.headers),
2688
+ host: this.deliveryHost()
2689
+ });
2690
+ }
2691
+ this.variants[cacheKey].resolved = componentConfig;
2692
+ resolve(componentConfig);
2693
+ } catch (e) {
2694
+ delete this.variants[cacheKey];
2695
+ reject(e);
2696
+ }
2697
+ })
2698
+ );
2699
+ }
2700
+ return yield this.variants[cacheKey];
2431
2701
  });
2432
- __publicField(this, "supportedHandlers", [
2433
- new ChangeTextHandler(this.messageToHost, this.components),
2434
- new SetInnerHtmlHandler(this.messageToHost, this.components),
2435
- new BindOnClickHandler(this.messageToHost, this.components),
2436
- new DetectMyopRefsMessageHandler(this.messageToHost, this.components),
2437
- new setAttributeHandler(this.messageToHost, this.components),
2438
- new AddEventListenerHandler(this.messageToHost, this.components),
2439
- new ExecuteScriptHandler(this.messageToHost, this.components),
2440
- new GetElementValueHandler(this.messageToHost, this.components),
2441
- //
2442
- new CreateRefComponentMessageHandler(this.messageToHost, this.components)
2443
- ]);
2444
- __publicField(this, "init", () => {
2702
+ }
2703
+ /**
2704
+ * Synchronous version of fetchComponentV2 — returns the config only if
2705
+ * the fetch already completed, null otherwise.
2706
+ *
2707
+ * Uses the same `this.variants` cache that fetchComponentV2/preloadComponents
2708
+ * populate. Each cached Promise is tagged with a `.resolved` property when
2709
+ * it settles — this method just reads that property. No separate cache.
2710
+ *
2711
+ * Why this exists: React Native needs the config at render time to embed it
2712
+ * in the WebView HTML (can't await in useState). If preloadComponents ran
2713
+ * earlier and the fetch completed, this returns the result synchronously,
2714
+ * skipping the WEBVIEW_READY → fetch → inject round trip entirely.
2715
+ */
2716
+ getResolvedConfig(componentId, env, preview) {
2717
+ var _a;
2718
+ const { cacheKey } = this.resolveParams(componentId, env, preview);
2719
+ return ((_a = this.variants[cacheKey]) == null ? void 0 : _a.resolved) || null;
2720
+ }
2721
+ /**
2722
+ * Resolve which (env, preview) pair — and therefore which cache key — a call
2723
+ * for `componentId` refers to.
2724
+ *
2725
+ * Single source of truth for fetchComponentV2, getResolvedConfig and
2726
+ * hydrateComponent, so a hydrated config always lands on the key a later
2727
+ * fetch will look under.
2728
+ */
2729
+ resolveParams(componentId, environmentIdentifier, preview) {
2730
+ const preloaded = this.preloadedComponents[componentId];
2731
+ const hasExplicitParams = environmentIdentifier !== void 0 || preview !== void 0;
2732
+ let env;
2733
+ let usePreview;
2734
+ if (!hasExplicitParams && preloaded) {
2735
+ env = preloaded.env;
2736
+ usePreview = preloaded.preview;
2737
+ } else {
2738
+ env = environmentIdentifier || this._defaultEnv;
2739
+ const hasEffectiveEnv = environmentIdentifier || this._envExplicitlySet;
2740
+ usePreview = preview === true ? true : preview === false ? false : !hasEffectiveEnv;
2741
+ }
2742
+ return { env, usePreview, cacheKey: `${componentId}:${env}:${usePreview ? "preview" : "live"}` };
2743
+ }
2744
+ /**
2745
+ * Seed an already-resolved component config into the cache, without any
2746
+ * network request.
2747
+ *
2748
+ * The counterpart to {@link fetchComponentV2}: use it when the config was
2749
+ * resolved somewhere else — most often on a server, then embedded in the
2750
+ * page — so the browser can render the component with no round trip.
2751
+ *
2752
+ * After hydrating, `fetchComponentV2`, `getResolvedConfig` and `isPreloaded`
2753
+ * all answer for this component from memory.
2754
+ *
2755
+ * Pass the same `env` / `preview` the config was resolved with; the defaults
2756
+ * match what a plain `fetchComponentV2(componentId)` would have used.
2757
+ */
2758
+ hydrateComponent(componentId, config, env, preview) {
2759
+ const { env: resolvedEnv, usePreview, cacheKey } = this.resolveParams(componentId, env, preview);
2760
+ const promise = Promise.resolve(config);
2761
+ promise.resolved = config;
2762
+ this.variants[cacheKey] = promise;
2763
+ this.preloadedComponents[componentId] = { env: resolvedEnv, preview: usePreview };
2764
+ }
2765
+ // ============ V1 Methods (Legacy) ============
2766
+ /**
2767
+ * Fetch a v1 component from a flow
2768
+ */
2769
+ fetchComponentV1(componentId, flowId) {
2770
+ return __async(this, null, function* () {
2771
+ if (flowId) {
2772
+ const flow = yield this.fetchFlow(flowId);
2773
+ return flow.components.find((c) => c.type.id === componentId);
2774
+ } else {
2775
+ const flow = yield this.fetchAutoFlow(componentId);
2776
+ return flow.components[0];
2777
+ }
2778
+ });
2779
+ }
2780
+ fetchAutoFlow(componentId) {
2781
+ return __async(this, null, function* () {
2782
+ if (!this.userFlows[componentId]) {
2783
+ this.userFlows[componentId] = new Promise(
2784
+ (resolve, reject) => __async(this, null, function* () {
2785
+ try {
2786
+ const res = yield fetch(
2787
+ `${this._baseUrl}/flow?id=${componentId}&auto=true`
2788
+ );
2789
+ const json = yield res.json();
2790
+ resolve(json.item);
2791
+ } catch (e) {
2792
+ delete this.userFlows[componentId];
2793
+ reject(e);
2794
+ }
2795
+ })
2796
+ );
2797
+ }
2798
+ return yield this.userFlows[componentId];
2799
+ });
2800
+ }
2801
+ fetchFlow(flowId) {
2802
+ return __async(this, null, function* () {
2803
+ if (!this.userFlows[flowId]) {
2804
+ this.userFlows[flowId] = new Promise(
2805
+ (resolve, reject) => __async(this, null, function* () {
2806
+ try {
2807
+ const res = yield fetch(
2808
+ `${this._baseUrl}/flow?id=${flowId}&resolve=components`
2809
+ );
2810
+ const json = yield res.json();
2811
+ resolve(json.item);
2812
+ } catch (e) {
2813
+ delete this.userFlows[flowId];
2814
+ reject(e);
2815
+ }
2816
+ })
2817
+ );
2818
+ }
2819
+ return yield this.userFlows[flowId];
2820
+ });
2821
+ }
2822
+ // ============ Backward Compatibility ============
2823
+ /**
2824
+ * @deprecated Use fetchComponentV2 or fetchComponentV1 explicitly
2825
+ * Defaults to v1 behavior for backward compatibility with existing code
2826
+ */
2827
+ fetchComponent(componentId, flowId) {
2828
+ return __async(this, null, function* () {
2829
+ return this.fetchComponentV1(componentId, flowId);
2445
2830
  });
2446
2831
  }
2447
2832
  };
2448
- defineDynamicImport("WebComponentSDK", WebComponentSDK);
2833
+ __publicField(_CloudRepository, "_main", null);
2834
+ /** The host every request goes to unless delivery() moved it. Never changes. */
2835
+ __publicField(_CloudRepository, "DEFAULT_HOST", "https://cloud.myop.dev");
2836
+ var CloudRepository = _CloudRepository;
2449
2837
 
2450
- // src/host/loaders/HTMLComponentLoader.ts
2451
- import { EMBEDDED_SDK_CONTENT, HAS_EMBEDDED_SDK } from "./embeddedSDK.js";
2452
- var MYOP_WEB_COMPONENT_MARKER = "<!-- myop-web-component -->";
2453
- var MYOP_WEB_COMPONENT_SCRIPT_ID = "myop-web-component";
2454
- var extractedWebComponentScripts = /* @__PURE__ */ new Map();
2455
- var seen2 = [];
2456
- var sdk;
2457
- var getInitiatedSdk = () => __async(void 0, null, function* () {
2458
- if (!sdk) {
2459
- sdk = new WebComponentSDK();
2460
- sdk.init();
2461
- }
2462
- return sdk;
2838
+ // src/helpers/cloudRepositoryHelpers.ts
2839
+ var _cloudRepository = CloudRepository.Main;
2840
+ var DELIVERY_HOST = "https://delivery.myop.dev";
2841
+ var delivery = (opts = {}) => {
2842
+ var _a, _b;
2843
+ const wantsLane = opts.minify !== false || opts.cache === true;
2844
+ _cloudRepository.setDelivery({
2845
+ minify: (_a = opts.minify) != null ? _a : false,
2846
+ cache: (_b = opts.cache) != null ? _b : false,
2847
+ host: opts.host !== void 0 ? opts.host : wantsLane ? DELIVERY_HOST : null
2848
+ });
2849
+ return deliveryStats();
2850
+ };
2851
+ var deliveryRefresh = () => __async(void 0, null, function* () {
2852
+ yield _cloudRepository.refreshDelivery();
2853
+ return deliveryStats();
2463
2854
  });
2464
- function createHTMLElementConstructor(htmlString, ShadowRootMode) {
2465
- return class extends HTMLElement {
2466
- connectedCallback() {
2467
- const mode = ShadowRootMode === ShadowRootModeType.open ? "open" : "closed";
2468
- const shadow = this.attachShadow({ mode });
2469
- getInitiatedSdk().then((sdk2) => {
2470
- sdk2.connectedCallback(this, shadow);
2471
- shadow.innerHTML = htmlString;
2472
- });
2473
- }
2474
- };
2475
- }
2476
- var createCustomWebComponent = (componentName, html, ShadowRootMode) => {
2477
- customElements.define(componentName, createHTMLElementConstructor(html, ShadowRootMode));
2478
- console.log(`define('${componentName}') was called, web component ready to use`);
2855
+ var deliveryStats = () => _cloudRepository.deliveryStats();
2856
+ var deliveryOff = () => {
2857
+ _cloudRepository.setDelivery({ minify: false, cache: false, host: null });
2858
+ return deliveryStats();
2479
2859
  };
2480
- var toWebComponentName = (str) => {
2481
- return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/(\d+)/g, "-$1").toLowerCase();
2860
+
2861
+ // src/webcomponent/messageHandlers/BaseWebComponentMessageHandler.ts
2862
+ var BaseWebComponentMessageHandler = class extends BaseContextMessageHandler {
2863
+ constructor(messageToHost, context) {
2864
+ super(messageToHost);
2865
+ this.context = context;
2866
+ __publicField(this, "executor", (event) => {
2867
+ if (event.destination) {
2868
+ const destination = event.destination;
2869
+ if (this.context[destination].context) {
2870
+ const _messageToHost = (message, replayTo) => {
2871
+ this.messageToHost(__spreadProps(__spreadValues({}, message), {
2872
+ source: event.destination ? event.destination : event.source,
2873
+ destination: event.source ? event.source : event.destination
2874
+ }), replayTo);
2875
+ };
2876
+ return this.innerExecutor(event, this.context[destination].context, _messageToHost);
2877
+ } else {
2878
+ debugger;
2879
+ }
2880
+ } else {
2881
+ debugger;
2882
+ }
2883
+ });
2884
+ }
2482
2885
  };
2483
- var toCustomElementName = (name) => {
2484
- name = toWebComponentName(name);
2485
- return name.replace(/_/g, "-");
2886
+
2887
+ // src/consts.ts
2888
+ var myopAttributes = {
2889
+ id: "myop-id"
2486
2890
  };
2487
- var HTMLComponentLoader = class extends BaseMyopLoader {
2891
+
2892
+ // src/common/messageHandlers/helpers.ts
2893
+ var getElementsByRef = (ref, el) => {
2894
+ return el.querySelectorAll(`[${myopAttributes.id}='${ref.refConfig.selector}']`);
2895
+ };
2896
+
2897
+ // src/webcomponent/messageHandlers/bindOnClickHandler.ts
2898
+ var BindOnClickHandler = class extends BaseWebComponentMessageHandler {
2488
2899
  constructor() {
2489
2900
  super(...arguments);
2490
- __publicField(this, "type", SkinLoaders.HTMLLoader);
2491
- __publicField(this, "load", (componentDefinition, skin, container, options) => __async(this, null, function* () {
2492
- const loaderConfig = skin.loader;
2493
- const isWC = this.isMyopWebComponent(loaderConfig.HTML);
2494
- const { mode, isolate } = yield this.resolveRenderMode(componentDefinition, skin, loaderConfig, isWC, options);
2495
- if (mode === false) {
2496
- throw new Error(`[Myop] Rendering blocked by render policy for component "${componentDefinition.id}"`);
2497
- }
2498
- if (isWC) {
2499
- if (mode !== "webComponent") {
2500
- throw new Error(`[Myop] Web-component rendering denied by render policy for component "${componentDefinition.id}"`);
2501
- }
2502
- return this.loadExtractedWebComponent(componentDefinition, skin, container, loaderConfig.HTML, options);
2503
- }
2504
- let domId = `myop-comp-${uuidv4()}`;
2505
- let element;
2506
- if (loaderConfig.shadowRootMode === ShadowRootModeType.localFrame) {
2507
- const uniqId = uuidv4();
2508
- const domId2 = `myop-comp-${uniqId}`;
2509
- let IframeElement = document.createElement("iframe");
2510
- IframeElement.id = domId2;
2511
- if (isolate) {
2512
- IframeElement.setAttribute("sandbox", "allow-scripts allow-forms allow-popups");
2513
- }
2514
- IframeElement.style.cssText = `
2515
- display: block;
2516
- padding: 0;
2517
- margin: 0;
2518
- position: absolute;
2519
- inset: 0;
2520
- overflow: hidden;
2521
- border: none;
2522
- opacity: ${(options == null ? void 0 : options.hidden) ? "0" : "1"};
2523
- width: 100%;
2524
- height: 100%;
2525
- pointer-events: ${(options == null ? void 0 : options.hidden) ? "none" : "all"};
2526
- `;
2527
- if (!container.querySelector('[id^="myop-comp-"]'))
2528
- container.innerHTML = "";
2529
- IframeElement = this.appendChild(container, IframeElement, options);
2530
- const __srcParts = [];
2531
- const doc = isolate ? {
2532
- open() {
2533
- },
2534
- writeln(s) {
2535
- __srcParts.push(s);
2536
- },
2537
- close() {
2538
- IframeElement.srcdoc = __srcParts.join("\n");
2539
- }
2540
- } : (() => {
2541
- const d = IframeElement.contentDocument || IframeElement.contentWindow.document;
2542
- d.open();
2543
- return d;
2544
- })();
2545
- let parsedSizeMeta = null;
2546
- {
2547
- const _preParser = new DOMParser();
2548
- const _preDoc = _preParser.parseFromString(loaderConfig.HTML, "text/html");
2549
- const sizeMeta = _preDoc.querySelector('meta[name="myop:size"]');
2550
- if (sizeMeta) {
2551
- try {
2552
- parsedSizeMeta = JSON.parse(sizeMeta.getAttribute("content") || "{}");
2553
- } catch (e) {
2554
- }
2555
- }
2556
- }
2557
- let HTML2Render = loaderConfig.HTML;
2558
- if (options == null ? void 0 : options._inspection) {
2559
- const parser = new DOMParser();
2560
- const _doc = parser.parseFromString(loaderConfig.HTML, "text/html");
2561
- const myop_preview_script = _doc.getElementById("myop_preview");
2562
- myop_preview_script == null ? void 0 : myop_preview_script.removeAttribute("type");
2563
- const temp = _doc.implementation.createHTMLDocument();
2564
- temp.body.innerHTML = `<script>
2565
- const beforeKeysWindow = new Set(Object.keys(window));
2566
- window.myopState = {
2567
- beforeKeysWindow,
2568
- };
2569
- <\/script>`;
2570
- const node = temp.body.firstChild;
2571
- if (node && _doc.head) {
2572
- _doc.head.insertBefore(_doc.importNode(node, true), _doc.head.firstChild);
2573
- }
2574
- HTML2Render = "<!DOCTYPE html>" + _doc.documentElement.outerHTML;
2575
- } else if ((options == null ? void 0 : options.data) !== void 0) {
2576
- const parser = new DOMParser();
2577
- const _doc = parser.parseFromString(loaderConfig.HTML, "text/html");
2578
- const myop_preview_script = _doc.getElementById("myop_preview");
2579
- if (myop_preview_script) {
2580
- myop_preview_script.remove();
2581
- HTML2Render = "<!DOCTYPE html>" + _doc.documentElement.outerHTML;
2582
- }
2583
- }
2584
- if (options == null ? void 0 : options.injectCss) {
2585
- const parser = new DOMParser();
2586
- const _doc = parser.parseFromString(HTML2Render, "text/html");
2587
- const styleTag = _doc.createElement("style");
2588
- styleTag.setAttribute("data-myop-injected", "true");
2589
- styleTag.textContent = options.injectCss.replace(/<\s*\/\s*style/gi, "<\\/style");
2590
- (_doc.head || _doc.documentElement).appendChild(styleTag);
2591
- HTML2Render = "<!DOCTYPE html>" + _doc.documentElement.outerHTML;
2592
- }
2593
- doc.writeln(HTML2Render);
2594
- const sdkScript = HAS_EMBEDDED_SDK ? `<script>${EMBEDDED_SDK_CONTENT}<\/script>` : `<script src="${window.myop.__ROOT_SDK_PUBLIC_URL__}"><\/script>`;
2595
- const initScript = HAS_EMBEDDED_SDK ? `<script>
2596
- const __myop_init = async () => {
2597
- const iframeModule = await MyopSDK.getIframeModule();
2598
- const IframeSDK = iframeModule.IframeSDK;
2599
- const sdk = new IframeSDK();
2600
- sdk.init();
2601
- }
2602
- __myop_init().then();
2603
- <\/script>` : `<script>
2604
- window.__federation__.__public_path__ = window.__federation__.__public_path__;
2605
- const __myop_init = async () => {
2606
- const {IframeSDK} = (await window.myop.rootSDK.getIframeModule());
2607
- const sdk = new IframeSDK();
2608
- sdk.init();
2609
- }
2610
- __myop_init().then();
2611
- <\/script>`;
2612
- if (!isolate) {
2613
- doc.writeln(`${sdkScript}${initScript}`);
2614
- }
2615
- if (!isolate && (options == null ? void 0 : options.data) !== void 0) {
2616
- const ctaQueueScript = `<script>
2617
- window.__myop_cta_queue = [];
2618
- window.myop_cta_handler = function(action, payload) {
2619
- window.__myop_cta_queue.push({action: action, payload: payload});
2620
- };
2621
- <\/script>`;
2622
- const escapedData = JSON.stringify(options.data).replace(/<\/script/gi, "\\u003c/script");
2623
- const dataScript = `<script id="__myop_init_data_script">
2624
- (function() {
2625
- var data = ${escapedData};
2626
- var scriptEl = document.getElementById('__myop_init_data_script');
2901
+ __publicField(this, "messageType", MyopMessages.BindClickMessage);
2902
+ __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2903
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2904
+ const cleanupTasks = [];
2905
+ items.forEach((item) => {
2906
+ const handler = () => {
2907
+ messageToHost(new ClickReplayMessage(event.handlerUniqueId));
2908
+ };
2909
+ item.addEventListener("click", handler);
2910
+ cleanupTasks.push(() => {
2911
+ item.removeEventListener("click", handler);
2912
+ });
2913
+ });
2914
+ return () => {
2915
+ cleanupTasks.forEach((task) => task());
2916
+ };
2917
+ });
2918
+ }
2919
+ };
2627
2920
 
2628
- var callInitInterface = function(fn) {
2629
- var startTime = performance.now();
2630
- // Mark as pre-injected data call for extension tracking
2631
- window.__myop_init_preinjected = true;
2632
- try {
2633
- fn(data);
2634
- } finally {
2635
- window.__myop_init_preinjected = false;
2636
- }
2637
- var duration = performance.now() - startTime;
2921
+ // src/webcomponent/messageHandlers/changeTextHandler.ts
2922
+ var ChangeTextHandler = class extends BaseWebComponentMessageHandler {
2923
+ constructor() {
2924
+ super(...arguments);
2925
+ __publicField(this, "messageType", MyopMessages.ChangeTextMessage);
2926
+ __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2927
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2928
+ items.forEach((item) => {
2929
+ item.textContent = event.content;
2930
+ });
2931
+ });
2932
+ }
2933
+ };
2934
+
2935
+ // src/webcomponent/shadowRootRef.ts
2936
+ var ShadowRootRef = class extends RootRef {
2937
+ constructor(container, shadowRoot) {
2938
+ super(container, shadowRoot);
2939
+ this.container = container;
2940
+ this.shadowRoot = shadowRoot;
2941
+ }
2942
+ };
2638
2943
 
2639
- // Notify extension via postMessage (init* = pre-injected)
2640
- try {
2641
- window.parent.postMessage({
2642
- type: 'MYOP_PREINJECTED_INIT',
2643
- payload: {
2644
- data: data,
2645
- duration: duration,
2646
- timestamp: Date.now()
2647
- }
2648
- }, '*');
2649
- } catch (e) {}
2944
+ // src/webcomponent/messageHandlers/DetectMyopRefsMessageHandler.ts
2945
+ var DetectMyopRefsMessageHandler = class extends BaseWebComponentMessageHandler {
2946
+ constructor() {
2947
+ super(...arguments);
2948
+ __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2949
+ const allMyopItems = shadowRootRef.shadowRoot.querySelectorAll(`[${myopAttributes.id}]`);
2950
+ let myopRefs = [];
2951
+ allMyopItems.forEach((item) => {
2952
+ const myopId = item.getAttribute(myopAttributes.id);
2953
+ if (myopId) {
2954
+ myopRefs.push(new MyopElementRef(myopId, item.tagName, item.getBoundingClientRect(), item.offsetTop, item.offsetLeft));
2955
+ }
2956
+ });
2957
+ this.messageToHost(new DetectedMyopRefsMessage(event.handlerUniqueId, myopRefs));
2958
+ });
2959
+ __publicField(this, "messageType", MyopMessages.DetectMyopRefsMessage);
2960
+ }
2961
+ };
2650
2962
 
2651
- // Cleanup: remove script tag and stored data
2652
- if (scriptEl && scriptEl.parentNode) {
2653
- scriptEl.parentNode.removeChild(scriptEl);
2654
- }
2655
- delete window.__myop_init_data;
2656
- };
2963
+ // src/webcomponent/messageHandlers/setAttributeHandler.ts
2964
+ var setAttributeHandler = class extends BaseWebComponentMessageHandler {
2965
+ constructor() {
2966
+ super(...arguments);
2967
+ __publicField(this, "messageType", MyopMessages.SetAttributeMessage);
2968
+ __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2969
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2970
+ items.forEach((item) => {
2971
+ item.setAttribute(event.name, event.value);
2972
+ });
2973
+ });
2974
+ }
2975
+ };
2657
2976
 
2658
- if (typeof window.myop_init_interface === 'function') {
2659
- // Function already exists - call immediately
2660
- callInitInterface(window.myop_init_interface);
2661
- } else {
2662
- // Function not yet defined - store data and watch for definition
2663
- window.__myop_init_data = data;
2977
+ // src/webcomponent/messageHandlers/addEventListenerHandler.ts
2978
+ var AddEventListenerHandler = class extends BaseWebComponentMessageHandler {
2979
+ constructor() {
2980
+ super(...arguments);
2981
+ __publicField(this, "messageType", MyopMessages.AddEventListenerMessage);
2982
+ __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2983
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2984
+ const cleanupTasks = [];
2985
+ items.forEach((item) => {
2986
+ const handler = (e) => {
2987
+ messageToHost(new EventListenerCallbackMessage(event.handlerUniqueId, makeSerializable(e, event.serializableSkeleton)));
2988
+ };
2989
+ item.addEventListener(event.type, handler);
2990
+ cleanupTasks.push(() => {
2991
+ item.removeEventListener(event.type, handler);
2992
+ });
2993
+ });
2994
+ return () => {
2995
+ cleanupTasks.forEach((task) => task());
2996
+ };
2997
+ });
2998
+ }
2999
+ };
2664
3000
 
2665
- var _original;
2666
- Object.defineProperty(window, 'myop_init_interface', {
2667
- configurable: true,
2668
- enumerable: true,
2669
- set: function(fn) {
2670
- _original = fn;
2671
- if (window.__myop_init_data !== undefined) {
2672
- var storedData = window.__myop_init_data;
2673
- delete window.__myop_init_data;
2674
- callInitInterface(fn);
2675
- }
2676
- },
2677
- get: function() {
2678
- return _original;
2679
- }
2680
- });
2681
- }
2682
- })();
2683
- <\/script>`;
2684
- doc.writeln(ctaQueueScript + dataScript);
2685
- }
2686
- if (isolate) {
2687
- const escapedData = (options == null ? void 0 : options.data) !== void 0 ? JSON.stringify(options.data).replace(/<\/script/gi, "\\u003c/script") : "undefined";
2688
- doc.writeln(this.buildIsolationBridge(escapedData));
2689
- }
2690
- doc.close();
2691
- const comp = new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
2692
- if (isolate) comp.enableIsolation();
2693
- comp.sizeMeta = parsedSizeMeta;
2694
- comp.initiated().then(() => {
2695
- if ((options == null ? void 0 : options.autoSize) === false) {
2696
- return;
3001
+ // src/webcomponent/messageHandlers/CreateRefComponentMessageHandler.ts
3002
+ var CreateRefComponentMessageHandler = class extends BaseWebComponentMessageHandler {
3003
+ constructor() {
3004
+ super(...arguments);
3005
+ __publicField(this, "messageType", MyopMessages.CreateRefComponentMessage);
3006
+ __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
3007
+ const createRef = () => __async(this, null, function* () {
3008
+ const allItems = shadowRootRef.shadowRoot.querySelectorAll(`[${myopAttributes.id}='${event.refConfig.selector}']`);
3009
+ if (allItems.length === 1) {
3010
+ const hostSDK2 = HostSDK.Instance();
3011
+ const refComponent = hostSDK2.components.find((c) => c.id === event.options.id);
3012
+ if (refComponent) {
3013
+ refComponent.dispose();
3014
+ } else {
2697
3015
  }
2698
- let shown = false;
2699
- comp.observeAutoSize({
2700
- forceAutoSize: true,
2701
- onSizeChange: () => {
2702
- if (!shown && !(options == null ? void 0 : options.hidden)) {
2703
- shown = true;
2704
- comp.show();
2705
- }
3016
+ const index = hostSDK2.components.indexOf(refComponent);
3017
+ if (index !== -1) {
3018
+ hostSDK2.components.splice(index, 1);
3019
+ } else {
3020
+ }
3021
+ const implementationComponent = yield hostSDK2.loadComponent(
3022
+ event.nestedComponentConfig,
3023
+ allItems.item(0),
3024
+ event.options
3025
+ );
3026
+ const nestedRefConfig = [];
3027
+ Object.keys(implementationComponent.refs).forEach((refName) => {
3028
+ let ref = implementationComponent.refs[refName];
3029
+ ref = ref.__nonProxied || ref;
3030
+ if (ref.componentDefinition) {
3031
+ nestedRefConfig.push({
3032
+ refName,
3033
+ componentDefinitionId: ref.componentDefinition.id
3034
+ });
2706
3035
  }
2707
3036
  });
2708
- });
2709
- return comp;
2710
- }
2711
- if (loaderConfig.shadowRootMode === ShadowRootModeType.none) {
2712
- const template = document.createElement("template");
2713
- template.innerHTML = loaderConfig.HTML;
2714
- element = template.content.firstElementChild;
2715
- getInitiatedSdk().then((sdk2) => {
2716
- sdk2.connectedCallback(element, element);
2717
- });
2718
- } else {
2719
- const customElementName = toCustomElementName(componentDefinition.name + skin.id);
2720
- if (!seen2.includes(customElementName)) {
2721
- createCustomWebComponent(customElementName, loaderConfig.HTML, loaderConfig.shadowRootMode);
2722
- seen2.push(customElementName);
3037
+ messageToHost(new RefComponentCreatedMessage(event.handlerUniqueId, nestedRefConfig));
3038
+ } else {
3039
+ console.error("CreateRefComponentMessageHandler - DOM element not found");
3040
+ this.messageToHost(new RefComponentCreatedMessage(event.handlerUniqueId, [], true));
3041
+ debugger;
3042
+ }
3043
+ });
3044
+ createRef().then();
3045
+ });
3046
+ }
3047
+ };
3048
+
3049
+ // src/common/messageHandlers/executeScriptHandler.ts
3050
+ var ExecuteScriptHandlerExecutor = (event, replier, rootRef) => {
3051
+ const __scriptInputs = event.scriptInputs ? event.scriptInputs : {};
3052
+ __scriptInputs.makeSerializable = makeSerializable;
3053
+ __scriptInputs.send = replier;
3054
+ __scriptInputs.rootRef = rootRef;
3055
+ __scriptInputs.__scriptInputs = __scriptInputs;
3056
+ const dynamicFunction = new Function(`return (${event.script})(...arguments)`);
3057
+ const ret = dynamicFunction(__scriptInputs);
3058
+ replier(ret);
3059
+ };
3060
+
3061
+ // src/webcomponent/messageHandlers/executeScriptHandler.ts
3062
+ var ExecuteScriptHandler = class extends BaseWebComponentMessageHandler {
3063
+ constructor() {
3064
+ super(...arguments);
3065
+ __publicField(this, "messageType", MyopMessages.ExecuteScriptMessage);
3066
+ __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
3067
+ const replier = (data) => {
3068
+ messageToHost(new ExecuteScriptReplyMessage(event.handlerUniqueId, data));
3069
+ };
3070
+ ExecuteScriptHandlerExecutor(event, replier, shadowRootRef);
3071
+ });
3072
+ }
3073
+ };
3074
+
3075
+ // src/webcomponent/messageHandlers/GetElementValueHandler.ts
3076
+ var getInputValue = (element) => {
3077
+ if (!element) return null;
3078
+ if (element.tagName === "FORM") {
3079
+ const formData = new FormData(element);
3080
+ const dataObject = {
3081
+ formData: {},
3082
+ unmappedData: []
3083
+ };
3084
+ const elements = element.querySelectorAll("input, select, textarea");
3085
+ let autoNameIndexer = -1;
3086
+ elements.forEach((element2) => {
3087
+ if (typeof element2.value === "string") {
3088
+ const myopId = element2.getAttribute(myopAttributes.id);
3089
+ let key = element2.getAttribute("name");
3090
+ const nodeData = {
3091
+ id: element2.id,
3092
+ name: key,
3093
+ value: getInputValue(element2),
3094
+ required: element2.required,
3095
+ validity: makeSerializable(element2.validity, true),
3096
+ myopId
3097
+ };
3098
+ if (!key) {
3099
+ dataObject.unmappedData.push(nodeData);
3100
+ } else {
3101
+ if (dataObject.formData[key]) {
3102
+ if (dataObject.formData[key].value) {
3103
+ dataObject.unmappedData.push(nodeData);
3104
+ } else {
3105
+ dataObject.unmappedData.push(dataObject.formData[key]);
3106
+ dataObject.formData[key] = nodeData;
3107
+ }
3108
+ } else {
3109
+ dataObject.formData[key] = nodeData;
3110
+ }
2723
3111
  }
2724
- element = document.createElement(customElementName);
2725
- }
2726
- if (!container.querySelector('[id^="myop-comp-"]'))
2727
- container.innerHTML = "";
2728
- element.id = domId;
2729
- if (options == null ? void 0 : options.hidden) {
2730
- element.style.opacity = "0";
2731
- element.style.position = "absolute";
2732
- element.style.height = "0";
2733
- element.style.width = "0";
2734
- element.style.pointerEvents = "none";
2735
- element.style.visibility = "hidden";
2736
3112
  }
2737
- this.appendChild(container, element, options);
2738
- return new MyopWebComponent(componentDefinition, skin, container, element, options);
2739
- }));
3113
+ });
3114
+ return dataObject;
2740
3115
  }
2741
- /**
2742
- * Detect if HTML is a Myop Web Component (starts with marker comment)
2743
- */
2744
- isMyopWebComponent(html) {
2745
- return html.trimStart().startsWith(MYOP_WEB_COMPONENT_MARKER);
3116
+ if (element.type === "checkbox" || element.type === "radio") {
3117
+ return element.checked ? element.value : null;
2746
3118
  }
2747
- /**
2748
- * Resolve how this component should render, applying the host render policy.
2749
- * Precedence: options.renderPolicy (per-call) fully replaces the global
2750
- * hostSDK.setRenderPolicy — so an app can restrict globally and allow specifics.
2751
- * With no policy set, behavior is unchanged from before (marker ⇒ web component).
2752
- */
2753
- resolveRenderMode(componentDefinition, skin, loaderConfig, isWebComponent, options) {
2754
- return __async(this, null, function* () {
2755
- var _a, _b, _c, _d;
2756
- const requestedMode = isWebComponent ? "webComponent" : loaderConfig.isolation || (options == null ? void 0 : options.isolation) ? "isolatedIframe" : "iframe";
2757
- const policy = (_d = options == null ? void 0 : options.renderPolicy) != null ? _d : (_c = (_b = (_a = window == null ? void 0 : window.myop) == null ? void 0 : _a.hostSDK) == null ? void 0 : _b.getRenderPolicy) == null ? void 0 : _c.call(_b);
2758
- const mode = policy ? yield policy({ componentDefinition, skin, requestedMode, isWebComponent }) : requestedMode;
2759
- return { mode, isolate: mode === "isolatedIframe" };
2760
- });
3119
+ if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") {
3120
+ return element.value;
2761
3121
  }
2762
- /**
2763
- * The in-frame bridge for isolated components. Runs inside the sandboxed
2764
- * (opaque-origin) iframe, translating the same author-facing contract to/from
2765
- * postMessage since the host has no same-origin access:
2766
- * • data-in : parent posts {type:'myop:init'} → calls window.myop_init_interface
2767
- * (plus a baked initial value for the first render)
2768
- * • data-out: window.myop_cta_handler → parent.postMessage({type:'myop:cta'})
2769
- * • resize : ResizeObserver → parent.postMessage({type:'myop:size'})
2770
- *
2771
- * TODO(dev-extension): the isolated path deliberately skips the same-origin
2772
- * dataScript, so it never posts the `MYOP_PREINJECTED_INIT` message the Myop dev
2773
- * extension listens for to log the INITIAL render (`init*`). Later init updates and
2774
- * all CTAs are still tracked (the extension wraps `comp.props`, which our isolated
2775
- * connectProps branch routes through), so only the first-render payload is missing
2776
- * from the extension's activity log for isolated components. Closing this would be a
2777
- * ~1-line `parent.postMessage({type:'MYOP_PREINJECTED_INIT', payload:{data}})` inside
2778
- * flushInitial() below — intentionally NOT done for now to avoid adding extension-only
2779
- * traffic to the component runtime. Web components have the same initial-init gap
2780
- * (initWithData is called on the element, not via comp.props) and it predates this.
2781
- */
2782
- buildIsolationBridge(initialDataLiteral) {
2783
- return `<script>
2784
- (function () {
2785
- var __initial = ${initialDataLiteral};
2786
- var __pending;
2787
- // data-out (cta)
2788
- window.myop_cta_handler = function (action, payload) {
2789
- try { parent.postMessage({ __myop: true, type: 'myop:cta', action: action, payload: payload }, '*'); } catch (e) {}
2790
- };
2791
- function callInit(data) {
2792
- if (typeof window.myop_init_interface === 'function') { window.myop_init_interface(data); return true; }
2793
- return false;
2794
- }
2795
- // data-in (init updates)
2796
- window.addEventListener('message', function (e) {
2797
- var d = e.data;
2798
- if (!d || d.__myop !== true) return;
2799
- if (d.type === 'myop:init') { if (!callInit(d.data)) __pending = d.data; }
2800
- });
2801
- // first render: use a pending update if one arrived, else the baked initial data
2802
- (function flushInitial() {
2803
- var data = (__pending !== undefined) ? __pending : __initial;
2804
- if (data === undefined) return;
2805
- if (callInit(data)) { __pending = undefined; __initial = undefined; }
2806
- else requestAnimationFrame(flushInitial);
2807
- })();
2808
- // resize (report content size)
2809
- function contentHeight() {
2810
- // Measure the BODY (content box). documentElement.scrollHeight includes
2811
- // the iframe viewport \u2014 which we're driving \u2014 so it would report the
2812
- // current frame height, not the content, and never shrink.
2813
- var b = document.body;
2814
- if (b) return Math.max(b.scrollHeight, b.offsetHeight);
2815
- return document.documentElement.scrollHeight;
2816
- }
2817
- function postSize() {
2818
- try {
2819
- parent.postMessage({
2820
- __myop: true, type: 'myop:size',
2821
- height: contentHeight(),
2822
- width: document.documentElement.scrollWidth
2823
- }, '*');
2824
- } catch (e) {}
2825
- }
2826
- // Observe the BODY (reflows with content) \u2014 not documentElement, whose box is
2827
- // the iframe viewport and would feed back into a resize loop. A MutationObserver
2828
- // catches content swaps (e.g. innerHTML re-render) that don't change body's box.
2829
- if (window.ResizeObserver) {
2830
- try { var __ro = new ResizeObserver(postSize); if (document.body) __ro.observe(document.body); } catch (e) {}
2831
- }
2832
- if (window.MutationObserver && document.body) {
2833
- try { new MutationObserver(postSize).observe(document.body, { childList: true, subtree: true, attributes: true, characterData: true }); } catch (e) {}
2834
- }
2835
- window.addEventListener('load', postSize);
2836
- postSize();
2837
- })();
2838
- <\/script>`;
3122
+ if (element.tagName === "SELECT") {
3123
+ return element.value;
2839
3124
  }
2840
- /**
2841
- * Extract the web component script content from HTML
2842
- */
2843
- extractWebComponentScript(html) {
2844
- const parser = new DOMParser();
2845
- const doc = parser.parseFromString(html, "text/html");
2846
- const script = doc.getElementById(MYOP_WEB_COMPONENT_SCRIPT_ID);
2847
- return (script == null ? void 0 : script.textContent) || null;
3125
+ if (element.isContentEditable) {
3126
+ return element.innerText || element.textContent;
2848
3127
  }
2849
- /**
2850
- * Execute the web component script on the host document.
2851
- * Returns the custom element tag name this script registered.
2852
- */
2853
- executeWebComponentScript(scriptContent, scriptId) {
2854
- const cachedTagName = extractedWebComponentScripts.get(scriptId);
2855
- if (cachedTagName) {
2856
- console.log(`[MyopWebComponent] Script already executed for ${scriptId}, reusing <${cachedTagName}>`);
2857
- return cachedTagName;
2858
- }
2859
- const script = document.createElement("script");
2860
- script.textContent = scriptContent;
2861
- script.id = `myop-extracted-${scriptId}`;
2862
- document.head.appendChild(script);
2863
- const tagName = window.__MYOP_TAG_NAME__;
2864
- if (tagName) {
2865
- extractedWebComponentScripts.set(scriptId, tagName);
2866
- }
2867
- console.log(`[MyopWebComponent] Executed web component script: ${scriptId} -> <${tagName}>`);
2868
- return tagName;
3128
+ return null;
3129
+ };
3130
+ var GetElementValueHandler = class extends BaseWebComponentMessageHandler {
3131
+ constructor() {
3132
+ super(...arguments);
3133
+ __publicField(this, "messageType", MyopMessages.GetElementValueMessage);
3134
+ __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
3135
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
3136
+ items.forEach((item) => {
3137
+ messageToHost(new ElementValueReplayMessage(getInputValue(item)), event);
3138
+ });
3139
+ });
2869
3140
  }
2870
- /**
2871
- * Load a Myop Web Component (extracted and run on host document)
2872
- */
2873
- loadExtractedWebComponent(componentDefinition, skin, container, html, options) {
2874
- return __async(this, null, function* () {
2875
- const scriptContent = this.extractWebComponentScript(html);
2876
- if (!scriptContent) {
2877
- throw new Error('[MyopWebComponent] No <script id="myop-web-component"> found in HTML');
2878
- }
2879
- const scriptId = `${componentDefinition.id}-${skin.id}`;
2880
- const tagName = this.executeWebComponentScript(scriptContent, scriptId);
2881
- if (!tagName) {
2882
- throw new Error("[MyopWebComponent] Script did not set window.__MYOP_TAG_NAME__");
2883
- }
2884
- const domId = `myop-comp-${uuidv4()}`;
2885
- const element = document.createElement(tagName);
2886
- element.id = domId;
2887
- if (options == null ? void 0 : options.hidden) {
2888
- element.style.opacity = "0";
2889
- element.style.position = "absolute";
2890
- element.style.height = "0";
2891
- element.style.width = "0";
2892
- element.style.pointerEvents = "none";
2893
- element.style.visibility = "hidden";
2894
- }
2895
- if (!container.querySelector('[id^="myop-comp-"]')) {
2896
- container.innerHTML = "";
2897
- }
2898
- this.appendChild(container, element, options);
2899
- const component = new MyopExtractedWebComponent(
2900
- componentDefinition,
2901
- skin,
2902
- container,
2903
- element,
2904
- tagName,
2905
- options
2906
- );
2907
- if ((options == null ? void 0 : options.data) !== void 0) {
2908
- component.initWithData(options.data);
2909
- }
2910
- console.log(`[MyopWebComponent] Loaded <${tagName}> into container`);
2911
- return component;
3141
+ };
3142
+
3143
+ // src/webcomponent/messageHandlers/setInnerHtmlHandler.ts
3144
+ var SetInnerHtmlHandler = class extends BaseWebComponentMessageHandler {
3145
+ constructor() {
3146
+ super(...arguments);
3147
+ __publicField(this, "messageType", MyopMessages.SetInnerHtml);
3148
+ __publicField(this, "innerExecutor", (event, shadowRootRef) => {
3149
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
3150
+ items.forEach((item) => {
3151
+ item.innerHTML = event.content;
3152
+ });
3153
+ });
3154
+ }
3155
+ };
3156
+
3157
+ // src/webcomponent/WebComponentSDK.ts
3158
+ var WebComponentSDK = class extends BaseMyopSDK {
3159
+ constructor() {
3160
+ super(...arguments);
3161
+ __publicField(this, "alwaysPassEnvelopesToHost", true);
3162
+ //when new web component created.
3163
+ __publicField(this, "connectedCallback", (container, shadow) => {
3164
+ container.addEventListener(myopWebcomponentConsts.webcomponent_message_key, (e) => {
3165
+ const eventContent = e.data ? e.data : e.detail;
3166
+ if (!eventContent || !eventContent.myop) {
3167
+ debugger;
3168
+ throw new Error("recvied webcomponent_message with wrong type");
3169
+ } else {
3170
+ const message = eventContent;
3171
+ this.handleIncomeMessages(e);
3172
+ if (message.messageType === MyopMessages.InitMessage) {
3173
+ const newComponentId = message.content.id;
3174
+ this.components[newComponentId].context = new ShadowRootRef(container, shadow);
3175
+ }
3176
+ }
3177
+ });
3178
+ setTimeout(() => {
3179
+ this.messageToHost(new InitRequest());
3180
+ }, 1);
3181
+ });
3182
+ __publicField(this, "messageToHost", (message, replayTo) => {
3183
+ message.direction = MessageDirection.up;
3184
+ if (!message.replayToHandler && (replayTo == null ? void 0 : replayTo.handlerUniqueId))
3185
+ message.replayToHandler = replayTo.handlerUniqueId;
3186
+ window.myop.hostSDK.send(message);
3187
+ });
3188
+ __publicField(this, "supportedHandlers", [
3189
+ new ChangeTextHandler(this.messageToHost, this.components),
3190
+ new SetInnerHtmlHandler(this.messageToHost, this.components),
3191
+ new BindOnClickHandler(this.messageToHost, this.components),
3192
+ new DetectMyopRefsMessageHandler(this.messageToHost, this.components),
3193
+ new setAttributeHandler(this.messageToHost, this.components),
3194
+ new AddEventListenerHandler(this.messageToHost, this.components),
3195
+ new ExecuteScriptHandler(this.messageToHost, this.components),
3196
+ new GetElementValueHandler(this.messageToHost, this.components),
3197
+ //
3198
+ new CreateRefComponentMessageHandler(this.messageToHost, this.components)
3199
+ ]);
3200
+ __publicField(this, "init", () => {
2912
3201
  });
2913
3202
  }
2914
3203
  };
2915
-
2916
- // src/helpers/CloudRepository.ts
2917
- var convertV2VariantToComponentConfig = (config) => {
2918
- return {
2919
- instance: {
2920
- id: "auto",
2921
- componentId: config.componentId,
2922
- componentName: config.name,
2923
- skinSelector: {
2924
- type: "Dedicated",
2925
- skin: {
2926
- id: "skin_auto_v2_converted"
3204
+ defineDynamicImport("WebComponentSDK", WebComponentSDK);
3205
+
3206
+ // src/host/loaders/HTMLComponentLoader.ts
3207
+ import { EMBEDDED_SDK_CONTENT, HAS_EMBEDDED_SDK } from "./embeddedSDK.js";
3208
+ var MYOP_WEB_COMPONENT_MARKER = "<!-- myop-web-component -->";
3209
+ var MYOP_WEB_COMPONENT_SCRIPT_ID = "myop-web-component";
3210
+ var extractedWebComponentScripts = /* @__PURE__ */ new Map();
3211
+ var seen2 = [];
3212
+ var sdk;
3213
+ var getInitiatedSdk = () => __async(void 0, null, function* () {
3214
+ if (!sdk) {
3215
+ sdk = new WebComponentSDK();
3216
+ sdk.init();
3217
+ }
3218
+ return sdk;
3219
+ });
3220
+ function createHTMLElementConstructor(htmlString, ShadowRootMode) {
3221
+ return class extends HTMLElement {
3222
+ connectedCallback() {
3223
+ const mode = ShadowRootMode === ShadowRootModeType.open ? "open" : "closed";
3224
+ const shadow = this.attachShadow({ mode });
3225
+ getInitiatedSdk().then((sdk2) => {
3226
+ sdk2.connectedCallback(this, shadow);
3227
+ shadow.innerHTML = htmlString;
3228
+ });
3229
+ }
3230
+ };
3231
+ }
3232
+ var createCustomWebComponent = (componentName, html, ShadowRootMode) => {
3233
+ customElements.define(componentName, createHTMLElementConstructor(html, ShadowRootMode));
3234
+ console.log(`define('${componentName}') was called, web component ready to use`);
3235
+ };
3236
+ var toWebComponentName = (str) => {
3237
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/(\d+)/g, "-$1").toLowerCase();
3238
+ };
3239
+ var toCustomElementName = (name) => {
3240
+ name = toWebComponentName(name);
3241
+ return name.replace(/_/g, "-");
3242
+ };
3243
+ var HTMLComponentLoader = class extends BaseMyopLoader {
3244
+ constructor() {
3245
+ super(...arguments);
3246
+ __publicField(this, "type", SkinLoaders.HTMLLoader);
3247
+ __publicField(this, "load", (componentDefinition, skin, container, options) => __async(this, null, function* () {
3248
+ const loaderConfig = skin.loader;
3249
+ const isWC = this.isMyopWebComponent(loaderConfig.HTML);
3250
+ const { mode, isolate } = yield this.resolveRenderMode(componentDefinition, skin, loaderConfig, isWC, options);
3251
+ if (mode === false) {
3252
+ throw new Error(`[Myop] Rendering blocked by render policy for component "${componentDefinition.id}"`);
3253
+ }
3254
+ if (isWC) {
3255
+ if (mode !== "webComponent") {
3256
+ throw new Error(`[Myop] Web-component rendering denied by render policy for component "${componentDefinition.id}"`);
2927
3257
  }
3258
+ return this.loadExtractedWebComponent(componentDefinition, skin, container, loaderConfig.HTML, options);
2928
3259
  }
2929
- },
2930
- type: {
2931
- id: config.id,
2932
- name: config.name,
2933
- description: config.description,
2934
- props: [
2935
- {
2936
- id: "in_auto_v2_converted",
2937
- name: "myop_init_interface",
2938
- type: "any",
2939
- behavior: {
2940
- type: PropConfigBehaviorTypes.code
3260
+ let domId = `myop-comp-${uuidv4()}`;
3261
+ let element;
3262
+ if (loaderConfig.shadowRootMode === ShadowRootModeType.localFrame) {
3263
+ const uniqId = uuidv4();
3264
+ const domId2 = `myop-comp-${uniqId}`;
3265
+ let IframeElement = document.createElement("iframe");
3266
+ IframeElement.id = domId2;
3267
+ if (isolate) {
3268
+ IframeElement.setAttribute("sandbox", "allow-scripts allow-forms allow-popups");
3269
+ }
3270
+ IframeElement.style.cssText = `
3271
+ display: block;
3272
+ padding: 0;
3273
+ margin: 0;
3274
+ position: absolute;
3275
+ inset: 0;
3276
+ overflow: hidden;
3277
+ border: none;
3278
+ opacity: ${(options == null ? void 0 : options.hidden) ? "0" : "1"};
3279
+ width: 100%;
3280
+ height: 100%;
3281
+ pointer-events: ${(options == null ? void 0 : options.hidden) ? "none" : "all"};
3282
+ `;
3283
+ if (!container.querySelector('[id^="myop-comp-"]'))
3284
+ container.innerHTML = "";
3285
+ IframeElement = this.appendChild(container, IframeElement, options);
3286
+ const __srcParts = [];
3287
+ const doc = isolate ? {
3288
+ open() {
3289
+ },
3290
+ writeln(s) {
3291
+ __srcParts.push(s);
3292
+ },
3293
+ close() {
3294
+ IframeElement.srcdoc = __srcParts.join("\n");
2941
3295
  }
2942
- },
3296
+ } : (() => {
3297
+ const d = IframeElement.contentDocument || IframeElement.contentWindow.document;
3298
+ d.open();
3299
+ return d;
3300
+ })();
3301
+ let parsedSizeMeta = null;
2943
3302
  {
2944
- id: "out_auto_v2_converted",
2945
- name: "myop_cta_handler",
2946
- type: "any",
2947
- behavior: {
2948
- type: PropConfigBehaviorTypes.code
3303
+ const _preParser = new DOMParser();
3304
+ const _preDoc = _preParser.parseFromString(loaderConfig.HTML, "text/html");
3305
+ const sizeMeta = _preDoc.querySelector('meta[name="myop:size"]');
3306
+ if (sizeMeta) {
3307
+ try {
3308
+ parsedSizeMeta = JSON.parse(sizeMeta.getAttribute("content") || "{}");
3309
+ } catch (e) {
3310
+ }
3311
+ }
3312
+ }
3313
+ let HTML2Render = loaderConfig.HTML;
3314
+ if (options == null ? void 0 : options._inspection) {
3315
+ const parser = new DOMParser();
3316
+ const _doc = parser.parseFromString(loaderConfig.HTML, "text/html");
3317
+ const myop_preview_script = _doc.getElementById("myop_preview");
3318
+ myop_preview_script == null ? void 0 : myop_preview_script.removeAttribute("type");
3319
+ const temp = _doc.implementation.createHTMLDocument();
3320
+ temp.body.innerHTML = `<script>
3321
+ const beforeKeysWindow = new Set(Object.keys(window));
3322
+ window.myopState = {
3323
+ beforeKeysWindow,
3324
+ };
3325
+ <\/script>`;
3326
+ const node = temp.body.firstChild;
3327
+ if (node && _doc.head) {
3328
+ _doc.head.insertBefore(_doc.importNode(node, true), _doc.head.firstChild);
3329
+ }
3330
+ HTML2Render = "<!DOCTYPE html>" + _doc.documentElement.outerHTML;
3331
+ } else if ((options == null ? void 0 : options.data) !== void 0) {
3332
+ const parser = new DOMParser();
3333
+ const _doc = parser.parseFromString(loaderConfig.HTML, "text/html");
3334
+ const myop_preview_script = _doc.getElementById("myop_preview");
3335
+ if (myop_preview_script) {
3336
+ myop_preview_script.remove();
3337
+ HTML2Render = "<!DOCTYPE html>" + _doc.documentElement.outerHTML;
2949
3338
  }
2950
3339
  }
2951
- ],
2952
- refs: [],
2953
- skins: [
2954
- {
2955
- id: "skin_auto_v2_converted",
2956
- name: "auto_v2_converted",
2957
- description: "",
2958
- //TODO : handle empty :
2959
- // @ts-ignore
2960
- loader: config.consume_variant[0].loader
3340
+ if (options == null ? void 0 : options.injectCss) {
3341
+ const parser = new DOMParser();
3342
+ const _doc = parser.parseFromString(HTML2Render, "text/html");
3343
+ const styleTag = _doc.createElement("style");
3344
+ styleTag.setAttribute("data-myop-injected", "true");
3345
+ styleTag.textContent = options.injectCss.replace(/<\s*\/\s*style/gi, "<\\/style");
3346
+ (_doc.head || _doc.documentElement).appendChild(styleTag);
3347
+ HTML2Render = "<!DOCTYPE html>" + _doc.documentElement.outerHTML;
3348
+ }
3349
+ doc.writeln(HTML2Render);
3350
+ const sdkScript = HAS_EMBEDDED_SDK ? `<script>${EMBEDDED_SDK_CONTENT}<\/script>` : `<script src="${window.myop.__ROOT_SDK_PUBLIC_URL__}"><\/script>`;
3351
+ const initScript = HAS_EMBEDDED_SDK ? `<script>
3352
+ const __myop_init = async () => {
3353
+ const iframeModule = await MyopSDK.getIframeModule();
3354
+ const IframeSDK = iframeModule.IframeSDK;
3355
+ const sdk = new IframeSDK();
3356
+ sdk.init();
3357
+ }
3358
+ __myop_init().then();
3359
+ <\/script>` : `<script>
3360
+ window.__federation__.__public_path__ = window.__federation__.__public_path__;
3361
+ const __myop_init = async () => {
3362
+ const {IframeSDK} = (await window.myop.rootSDK.getIframeModule());
3363
+ const sdk = new IframeSDK();
3364
+ sdk.init();
3365
+ }
3366
+ __myop_init().then();
3367
+ <\/script>`;
3368
+ if (!isolate) {
3369
+ doc.writeln(`${sdkScript}${initScript}`);
3370
+ }
3371
+ if (!isolate && (options == null ? void 0 : options.data) !== void 0) {
3372
+ const ctaQueueScript = `<script>
3373
+ window.__myop_cta_queue = [];
3374
+ window.myop_cta_handler = function(action, payload) {
3375
+ window.__myop_cta_queue.push({action: action, payload: payload});
3376
+ };
3377
+ <\/script>`;
3378
+ const escapedData = JSON.stringify(options.data).replace(/<\/script/gi, "\\u003c/script");
3379
+ const dataScript = `<script id="__myop_init_data_script">
3380
+ (function() {
3381
+ var data = ${escapedData};
3382
+ var scriptEl = document.getElementById('__myop_init_data_script');
3383
+
3384
+ var callInitInterface = function(fn) {
3385
+ var startTime = performance.now();
3386
+ // Mark as pre-injected data call for extension tracking
3387
+ window.__myop_init_preinjected = true;
3388
+ try {
3389
+ fn(data);
3390
+ } finally {
3391
+ window.__myop_init_preinjected = false;
3392
+ }
3393
+ var duration = performance.now() - startTime;
3394
+
3395
+ // Notify extension via postMessage (init* = pre-injected)
3396
+ try {
3397
+ window.parent.postMessage({
3398
+ type: 'MYOP_PREINJECTED_INIT',
3399
+ payload: {
3400
+ data: data,
3401
+ duration: duration,
3402
+ timestamp: Date.now()
3403
+ }
3404
+ }, '*');
3405
+ } catch (e) {}
3406
+
3407
+ // Cleanup: remove script tag and stored data
3408
+ if (scriptEl && scriptEl.parentNode) {
3409
+ scriptEl.parentNode.removeChild(scriptEl);
3410
+ }
3411
+ delete window.__myop_init_data;
3412
+ };
3413
+
3414
+ if (typeof window.myop_init_interface === 'function') {
3415
+ // Function already exists - call immediately
3416
+ callInitInterface(window.myop_init_interface);
3417
+ } else {
3418
+ // Function not yet defined - store data and watch for definition
3419
+ window.__myop_init_data = data;
3420
+
3421
+ var _original;
3422
+ Object.defineProperty(window, 'myop_init_interface', {
3423
+ configurable: true,
3424
+ enumerable: true,
3425
+ set: function(fn) {
3426
+ _original = fn;
3427
+ if (window.__myop_init_data !== undefined) {
3428
+ var storedData = window.__myop_init_data;
3429
+ delete window.__myop_init_data;
3430
+ callInitInterface(fn);
3431
+ }
3432
+ },
3433
+ get: function() {
3434
+ return _original;
3435
+ }
3436
+ });
3437
+ }
3438
+ })();
3439
+ <\/script>`;
3440
+ doc.writeln(ctaQueueScript + dataScript);
3441
+ }
3442
+ if (isolate) {
3443
+ const escapedData = (options == null ? void 0 : options.data) !== void 0 ? JSON.stringify(options.data).replace(/<\/script/gi, "\\u003c/script") : "undefined";
3444
+ doc.writeln(this.buildIsolationBridge(escapedData));
2961
3445
  }
2962
- ],
2963
- defaultSkin: 0
2964
- },
2965
- name: config.name
2966
- };
2967
- };
2968
- var GLOBAL_KEY = "__MYOP_CLOUD_REPOSITORY_MAIN__";
2969
- var getGlobalMain = () => {
2970
- if (typeof window !== "undefined") {
2971
- return window[GLOBAL_KEY];
2972
- }
2973
- if (typeof globalThis !== "undefined") {
2974
- return globalThis[GLOBAL_KEY];
2975
- }
2976
- return void 0;
2977
- };
2978
- var setGlobalMain = (instance) => {
2979
- if (typeof window !== "undefined") {
2980
- window[GLOBAL_KEY] = instance;
2981
- }
2982
- if (typeof globalThis !== "undefined") {
2983
- globalThis[GLOBAL_KEY] = instance;
2984
- }
2985
- };
2986
- var _CloudRepository = class _CloudRepository {
2987
- constructor(_baseUrl = "https://cloud.myop.dev") {
2988
- this._baseUrl = _baseUrl;
2989
- // v2 cache - keyed by componentId:env:preview|live
2990
- // Each Promise is tagged with a `resolved` property after settling (see fetchComponentV2).
2991
- __publicField(this, "variants", {});
2992
- // Track which components were preloaded and with what params
2993
- // Key: componentId, Value: { env, preview }
2994
- __publicField(this, "preloadedComponents", {});
2995
- // v1 cache
2996
- __publicField(this, "userFlows", {});
2997
- __publicField(this, "_defaultEnv", "production");
2998
- __publicField(this, "_envExplicitlySet", false);
2999
- __publicField(this, "_staticMode", false);
3000
- __publicField(this, "_queryParams", {});
3001
- }
3002
- static get Main() {
3003
- const globalMain = getGlobalMain();
3004
- if (globalMain) {
3005
- return globalMain;
3006
- }
3007
- if (!_CloudRepository._main) {
3008
- _CloudRepository._main = new _CloudRepository();
3009
- setGlobalMain(_CloudRepository._main);
3010
- }
3011
- return _CloudRepository._main;
3012
- }
3013
- /**
3014
- * Enable static mode for self-hosted component registries.
3015
- * In static mode, URLs are constructed as file paths instead of query params:
3016
- * ${baseUrl}/components/${componentId}/${env}.json
3017
- */
3018
- enableStaticMode() {
3019
- this._staticMode = true;
3020
- }
3021
- /**
3022
- * Set query parameters to append to all fetch URLs (e.g. for CDN cache busting).
3023
- * Example: `setQueryParams({ lastupdate: '11112026' })`
3024
- */
3025
- setQueryParams(params) {
3026
- this._queryParams = params;
3027
- }
3028
- /**
3029
- * Set the default environment for this CloudRepository instance
3030
- */
3031
- setEnvironment(env) {
3032
- this._defaultEnv = env;
3033
- this._envExplicitlySet = true;
3034
- }
3035
- /**
3036
- * Get the current default environment
3037
- */
3038
- getDefaultEnvironment() {
3039
- return this._defaultEnv;
3040
- }
3041
- // ============ V2 Methods (Default) ============
3042
- /**
3043
- * Check if a component is already cached/preloaded (v2)
3044
- * If env and preview are not provided, checks if ANY version is preloaded
3045
- */
3046
- isPreloaded(componentId, env, preview) {
3047
- if (env !== void 0 || preview !== void 0) {
3048
- const cacheKey = `${componentId}:${env || this._defaultEnv}:${preview ? "preview" : "live"}`;
3049
- return cacheKey in this.variants;
3050
- }
3051
- return componentId in this.preloadedComponents;
3052
- }
3053
- /**
3054
- * Get the preloaded params for a component (if preloaded)
3055
- * Returns undefined if not preloaded
3056
- */
3057
- getPreloadedParams(componentId) {
3058
- return this.preloadedComponents[componentId];
3446
+ doc.close();
3447
+ const comp = new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
3448
+ if (isolate) comp.enableIsolation();
3449
+ comp.sizeMeta = parsedSizeMeta;
3450
+ comp.initiated().then(() => {
3451
+ if ((options == null ? void 0 : options.autoSize) === false) {
3452
+ return;
3453
+ }
3454
+ let shown = false;
3455
+ comp.observeAutoSize({
3456
+ forceAutoSize: true,
3457
+ onSizeChange: () => {
3458
+ if (!shown && !(options == null ? void 0 : options.hidden)) {
3459
+ shown = true;
3460
+ comp.show();
3461
+ }
3462
+ }
3463
+ });
3464
+ });
3465
+ return comp;
3466
+ }
3467
+ if (loaderConfig.shadowRootMode === ShadowRootModeType.none) {
3468
+ const template = document.createElement("template");
3469
+ template.innerHTML = loaderConfig.HTML;
3470
+ element = template.content.firstElementChild;
3471
+ getInitiatedSdk().then((sdk2) => {
3472
+ sdk2.connectedCallback(element, element);
3473
+ });
3474
+ } else {
3475
+ const customElementName = toCustomElementName(componentDefinition.name + skin.id);
3476
+ if (!seen2.includes(customElementName)) {
3477
+ createCustomWebComponent(customElementName, loaderConfig.HTML, loaderConfig.shadowRootMode);
3478
+ seen2.push(customElementName);
3479
+ }
3480
+ element = document.createElement(customElementName);
3481
+ }
3482
+ if (!container.querySelector('[id^="myop-comp-"]'))
3483
+ container.innerHTML = "";
3484
+ element.id = domId;
3485
+ if (options == null ? void 0 : options.hidden) {
3486
+ element.style.opacity = "0";
3487
+ element.style.position = "absolute";
3488
+ element.style.height = "0";
3489
+ element.style.width = "0";
3490
+ element.style.pointerEvents = "none";
3491
+ element.style.visibility = "hidden";
3492
+ }
3493
+ this.appendChild(container, element, options);
3494
+ return new MyopWebComponent(componentDefinition, skin, container, element, options);
3495
+ }));
3059
3496
  }
3060
3497
  /**
3061
- * Resolve a component config: fetch it once, then serve it from this
3062
- * repository's cache.
3063
- *
3064
- * This is the name to use. `fetchComponentV2` is the same method under its
3065
- * versioned name and stays for backward compatibility — note that the
3066
- * unversioned `fetchComponent` is a *deprecated v1* API and is NOT this.
3067
- *
3068
- * Completes the trio with {@link getResolvedConfig} (synchronous read of an
3069
- * already-resolved config) and {@link hydrateComponent} (seed one you
3070
- * already hold).
3071
- *
3072
- * Prefer the module-level `preloadComponents([id])` in app code; reach for
3073
- * this when you need an isolated repository instance whose cache lifetime
3074
- * you control — a server with its own TTL, for example.
3498
+ * Detect if HTML is a Myop Web Component (starts with marker comment)
3075
3499
  */
3076
- resolveComponent(componentId, env, preview) {
3077
- return __async(this, null, function* () {
3078
- return this.fetchComponentV2(componentId, env, preview);
3079
- });
3500
+ isMyopWebComponent(html) {
3501
+ return html.trimStart().startsWith(MYOP_WEB_COMPONENT_MARKER);
3080
3502
  }
3081
3503
  /**
3082
- * Fetch a v2 component config
3083
- * If env/preview not specified and component was preloaded, uses preloaded params
3084
- *
3085
- * @see resolveComponent — the unversioned name for this method
3504
+ * Resolve how this component should render, applying the host render policy.
3505
+ * Precedence: options.renderPolicy (per-call) fully replaces the global
3506
+ * hostSDK.setRenderPolicy — so an app can restrict globally and allow specifics.
3507
+ * With no policy set, behavior is unchanged from before (marker ⇒ web component).
3086
3508
  */
3087
- fetchComponentV2(componentId, environmentIdentifier, preview) {
3509
+ resolveRenderMode(componentDefinition, skin, loaderConfig, isWebComponent, options) {
3088
3510
  return __async(this, null, function* () {
3089
- const { env, usePreview, cacheKey } = this.resolveParams(componentId, environmentIdentifier, preview);
3090
- console.log("[CloudRepository] fetchComponentV2", {
3091
- componentId: componentId.slice(0, 8) + "...",
3092
- env,
3093
- usePreview,
3094
- cacheKey,
3095
- cached: cacheKey in this.variants
3096
- });
3097
- if (!this.variants[cacheKey]) {
3098
- if (!this.preloadedComponents[componentId]) {
3099
- this.preloadedComponents[componentId] = { env, preview: usePreview };
3100
- }
3101
- this.variants[cacheKey] = new Promise(
3102
- (resolve, reject) => __async(this, null, function* () {
3103
- try {
3104
- let url;
3105
- if (this._staticMode) {
3106
- const file = usePreview ? "preview" : env;
3107
- url = `${this._baseUrl}/components/${componentId}/${file}.json`;
3108
- const qs = new URLSearchParams(this._queryParams).toString();
3109
- if (qs) url += `?${qs}`;
3110
- } else {
3111
- url = `${this._baseUrl}/consume?id=${componentId}&env=${env}`;
3112
- if (usePreview) {
3113
- url += "&preview=true";
3114
- }
3115
- }
3116
- const res = yield fetch(url);
3117
- if (!res.ok) {
3118
- reject(new Error(`Failed to load component "${componentId}" (${res.status}${this._staticMode ? ` from ${url}` : ""})`));
3119
- return;
3120
- }
3121
- const json = yield res.json();
3122
- const variant = json.item;
3123
- if (!variant) {
3124
- reject(new Error(`Component "${componentId}" not found`));
3125
- return;
3126
- }
3127
- if (!variant.consume_variant || !variant.consume_variant.length) {
3128
- reject(new Error(`Component "${componentId}" has no implementation for environment "${env}"`));
3129
- return;
3130
- }
3131
- const componentConfig = convertV2VariantToComponentConfig(variant);
3132
- this.variants[cacheKey].resolved = componentConfig;
3133
- resolve(componentConfig);
3134
- } catch (e) {
3135
- delete this.variants[cacheKey];
3136
- reject(e);
3137
- }
3138
- })
3139
- );
3140
- }
3141
- return yield this.variants[cacheKey];
3511
+ var _a, _b, _c, _d;
3512
+ const requestedMode = isWebComponent ? "webComponent" : loaderConfig.isolation || (options == null ? void 0 : options.isolation) ? "isolatedIframe" : "iframe";
3513
+ const policy = (_d = options == null ? void 0 : options.renderPolicy) != null ? _d : (_c = (_b = (_a = window == null ? void 0 : window.myop) == null ? void 0 : _a.hostSDK) == null ? void 0 : _b.getRenderPolicy) == null ? void 0 : _c.call(_b);
3514
+ const mode = policy ? yield policy({ componentDefinition, skin, requestedMode, isWebComponent }) : requestedMode;
3515
+ return { mode, isolate: mode === "isolatedIframe" };
3142
3516
  });
3143
3517
  }
3144
3518
  /**
3145
- * Synchronous version of fetchComponentV2 — returns the config only if
3146
- * the fetch already completed, null otherwise.
3147
- *
3148
- * Uses the same `this.variants` cache that fetchComponentV2/preloadComponents
3149
- * populate. Each cached Promise is tagged with a `.resolved` property when
3150
- * it settles — this method just reads that property. No separate cache.
3519
+ * The in-frame bridge for isolated components. Runs inside the sandboxed
3520
+ * (opaque-origin) iframe, translating the same author-facing contract to/from
3521
+ * postMessage since the host has no same-origin access:
3522
+ * • data-in : parent posts {type:'myop:init'} → calls window.myop_init_interface
3523
+ * (plus a baked initial value for the first render)
3524
+ * • data-out: window.myop_cta_handler → parent.postMessage({type:'myop:cta'})
3525
+ * • resize : ResizeObserver → parent.postMessage({type:'myop:size'})
3151
3526
  *
3152
- * Why this exists: React Native needs the config at render time to embed it
3153
- * in the WebView HTML (can't await in useState). If preloadComponents ran
3154
- * earlier and the fetch completed, this returns the result synchronously,
3155
- * skipping the WEBVIEW_READY → fetch → inject round trip entirely.
3527
+ * TODO(dev-extension): the isolated path deliberately skips the same-origin
3528
+ * dataScript, so it never posts the `MYOP_PREINJECTED_INIT` message the Myop dev
3529
+ * extension listens for to log the INITIAL render (`init*`). Later init updates and
3530
+ * all CTAs are still tracked (the extension wraps `comp.props`, which our isolated
3531
+ * connectProps branch routes through), so only the first-render payload is missing
3532
+ * from the extension's activity log for isolated components. Closing this would be a
3533
+ * ~1-line `parent.postMessage({type:'MYOP_PREINJECTED_INIT', payload:{data}})` inside
3534
+ * flushInitial() below — intentionally NOT done for now to avoid adding extension-only
3535
+ * traffic to the component runtime. Web components have the same initial-init gap
3536
+ * (initWithData is called on the element, not via comp.props) and it predates this.
3156
3537
  */
3157
- getResolvedConfig(componentId, env, preview) {
3158
- var _a;
3159
- const { cacheKey } = this.resolveParams(componentId, env, preview);
3160
- return ((_a = this.variants[cacheKey]) == null ? void 0 : _a.resolved) || null;
3538
+ buildIsolationBridge(initialDataLiteral) {
3539
+ return `<script>
3540
+ (function () {
3541
+ var __initial = ${initialDataLiteral};
3542
+ var __pending;
3543
+ // data-out (cta)
3544
+ window.myop_cta_handler = function (action, payload) {
3545
+ try { parent.postMessage({ __myop: true, type: 'myop:cta', action: action, payload: payload }, '*'); } catch (e) {}
3546
+ };
3547
+ function callInit(data) {
3548
+ if (typeof window.myop_init_interface === 'function') { window.myop_init_interface(data); return true; }
3549
+ return false;
3550
+ }
3551
+ // data-in (init updates)
3552
+ window.addEventListener('message', function (e) {
3553
+ var d = e.data;
3554
+ if (!d || d.__myop !== true) return;
3555
+ if (d.type === 'myop:init') { if (!callInit(d.data)) __pending = d.data; }
3556
+ });
3557
+ // first render: use a pending update if one arrived, else the baked initial data
3558
+ (function flushInitial() {
3559
+ var data = (__pending !== undefined) ? __pending : __initial;
3560
+ if (data === undefined) return;
3561
+ if (callInit(data)) { __pending = undefined; __initial = undefined; }
3562
+ else requestAnimationFrame(flushInitial);
3563
+ })();
3564
+ // resize (report content size)
3565
+ function contentHeight() {
3566
+ // Measure the BODY (content box). documentElement.scrollHeight includes
3567
+ // the iframe viewport \u2014 which we're driving \u2014 so it would report the
3568
+ // current frame height, not the content, and never shrink.
3569
+ var b = document.body;
3570
+ if (b) return Math.max(b.scrollHeight, b.offsetHeight);
3571
+ return document.documentElement.scrollHeight;
3572
+ }
3573
+ function postSize() {
3574
+ try {
3575
+ parent.postMessage({
3576
+ __myop: true, type: 'myop:size',
3577
+ height: contentHeight(),
3578
+ width: document.documentElement.scrollWidth
3579
+ }, '*');
3580
+ } catch (e) {}
3581
+ }
3582
+ // Observe the BODY (reflows with content) \u2014 not documentElement, whose box is
3583
+ // the iframe viewport and would feed back into a resize loop. A MutationObserver
3584
+ // catches content swaps (e.g. innerHTML re-render) that don't change body's box.
3585
+ if (window.ResizeObserver) {
3586
+ try { var __ro = new ResizeObserver(postSize); if (document.body) __ro.observe(document.body); } catch (e) {}
3587
+ }
3588
+ if (window.MutationObserver && document.body) {
3589
+ try { new MutationObserver(postSize).observe(document.body, { childList: true, subtree: true, attributes: true, characterData: true }); } catch (e) {}
3590
+ }
3591
+ window.addEventListener('load', postSize);
3592
+ postSize();
3593
+ })();
3594
+ <\/script>`;
3161
3595
  }
3162
3596
  /**
3163
- * Resolve which (env, preview) pair — and therefore which cache key — a call
3164
- * for `componentId` refers to.
3165
- *
3166
- * Single source of truth for fetchComponentV2, getResolvedConfig and
3167
- * hydrateComponent, so a hydrated config always lands on the key a later
3168
- * fetch will look under.
3597
+ * Extract the web component script content from HTML
3169
3598
  */
3170
- resolveParams(componentId, environmentIdentifier, preview) {
3171
- const preloaded = this.preloadedComponents[componentId];
3172
- const hasExplicitParams = environmentIdentifier !== void 0 || preview !== void 0;
3173
- let env;
3174
- let usePreview;
3175
- if (!hasExplicitParams && preloaded) {
3176
- env = preloaded.env;
3177
- usePreview = preloaded.preview;
3178
- } else {
3179
- env = environmentIdentifier || this._defaultEnv;
3180
- const hasEffectiveEnv = environmentIdentifier || this._envExplicitlySet;
3181
- usePreview = preview === true ? true : preview === false ? false : !hasEffectiveEnv;
3182
- }
3183
- return { env, usePreview, cacheKey: `${componentId}:${env}:${usePreview ? "preview" : "live"}` };
3599
+ extractWebComponentScript(html) {
3600
+ const parser = new DOMParser();
3601
+ const doc = parser.parseFromString(html, "text/html");
3602
+ const script = doc.getElementById(MYOP_WEB_COMPONENT_SCRIPT_ID);
3603
+ return (script == null ? void 0 : script.textContent) || null;
3184
3604
  }
3185
3605
  /**
3186
- * Seed an already-resolved component config into the cache, without any
3187
- * network request.
3188
- *
3189
- * The counterpart to {@link fetchComponentV2}: use it when the config was
3190
- * resolved somewhere else — most often on a server, then embedded in the
3191
- * page — so the browser can render the component with no round trip.
3192
- *
3193
- * After hydrating, `fetchComponentV2`, `getResolvedConfig` and `isPreloaded`
3194
- * all answer for this component from memory.
3195
- *
3196
- * Pass the same `env` / `preview` the config was resolved with; the defaults
3197
- * match what a plain `fetchComponentV2(componentId)` would have used.
3606
+ * Execute the web component script on the host document.
3607
+ * Returns the custom element tag name this script registered.
3198
3608
  */
3199
- hydrateComponent(componentId, config, env, preview) {
3200
- const { env: resolvedEnv, usePreview, cacheKey } = this.resolveParams(componentId, env, preview);
3201
- const promise = Promise.resolve(config);
3202
- promise.resolved = config;
3203
- this.variants[cacheKey] = promise;
3204
- this.preloadedComponents[componentId] = { env: resolvedEnv, preview: usePreview };
3609
+ executeWebComponentScript(scriptContent, scriptId) {
3610
+ const cachedTagName = extractedWebComponentScripts.get(scriptId);
3611
+ if (cachedTagName) {
3612
+ console.log(`[MyopWebComponent] Script already executed for ${scriptId}, reusing <${cachedTagName}>`);
3613
+ return cachedTagName;
3614
+ }
3615
+ const script = document.createElement("script");
3616
+ script.textContent = scriptContent;
3617
+ script.id = `myop-extracted-${scriptId}`;
3618
+ document.head.appendChild(script);
3619
+ const tagName = window.__MYOP_TAG_NAME__;
3620
+ if (tagName) {
3621
+ extractedWebComponentScripts.set(scriptId, tagName);
3622
+ }
3623
+ console.log(`[MyopWebComponent] Executed web component script: ${scriptId} -> <${tagName}>`);
3624
+ return tagName;
3205
3625
  }
3206
- // ============ V1 Methods (Legacy) ============
3207
3626
  /**
3208
- * Fetch a v1 component from a flow
3627
+ * Load a Myop Web Component (extracted and run on host document)
3209
3628
  */
3210
- fetchComponentV1(componentId, flowId) {
3629
+ loadExtractedWebComponent(componentDefinition, skin, container, html, options) {
3211
3630
  return __async(this, null, function* () {
3212
- if (flowId) {
3213
- const flow = yield this.fetchFlow(flowId);
3214
- return flow.components.find((c) => c.type.id === componentId);
3215
- } else {
3216
- const flow = yield this.fetchAutoFlow(componentId);
3217
- return flow.components[0];
3631
+ const scriptContent = this.extractWebComponentScript(html);
3632
+ if (!scriptContent) {
3633
+ throw new Error('[MyopWebComponent] No <script id="myop-web-component"> found in HTML');
3218
3634
  }
3219
- });
3220
- }
3221
- fetchAutoFlow(componentId) {
3222
- return __async(this, null, function* () {
3223
- if (!this.userFlows[componentId]) {
3224
- this.userFlows[componentId] = new Promise(
3225
- (resolve, reject) => __async(this, null, function* () {
3226
- try {
3227
- const res = yield fetch(
3228
- `${this._baseUrl}/flow?id=${componentId}&auto=true`
3229
- );
3230
- const json = yield res.json();
3231
- resolve(json.item);
3232
- } catch (e) {
3233
- delete this.userFlows[componentId];
3234
- reject(e);
3235
- }
3236
- })
3237
- );
3635
+ const scriptId = `${componentDefinition.id}-${skin.id}`;
3636
+ const tagName = this.executeWebComponentScript(scriptContent, scriptId);
3637
+ if (!tagName) {
3638
+ throw new Error("[MyopWebComponent] Script did not set window.__MYOP_TAG_NAME__");
3238
3639
  }
3239
- return yield this.userFlows[componentId];
3240
- });
3241
- }
3242
- fetchFlow(flowId) {
3243
- return __async(this, null, function* () {
3244
- if (!this.userFlows[flowId]) {
3245
- this.userFlows[flowId] = new Promise(
3246
- (resolve, reject) => __async(this, null, function* () {
3247
- try {
3248
- const res = yield fetch(
3249
- `${this._baseUrl}/flow?id=${flowId}&resolve=components`
3250
- );
3251
- const json = yield res.json();
3252
- resolve(json.item);
3253
- } catch (e) {
3254
- delete this.userFlows[flowId];
3255
- reject(e);
3256
- }
3257
- })
3258
- );
3640
+ const domId = `myop-comp-${uuidv4()}`;
3641
+ const element = document.createElement(tagName);
3642
+ element.id = domId;
3643
+ if (options == null ? void 0 : options.hidden) {
3644
+ element.style.opacity = "0";
3645
+ element.style.position = "absolute";
3646
+ element.style.height = "0";
3647
+ element.style.width = "0";
3648
+ element.style.pointerEvents = "none";
3649
+ element.style.visibility = "hidden";
3259
3650
  }
3260
- return yield this.userFlows[flowId];
3261
- });
3262
- }
3263
- // ============ Backward Compatibility ============
3264
- /**
3265
- * @deprecated Use fetchComponentV2 or fetchComponentV1 explicitly
3266
- * Defaults to v1 behavior for backward compatibility with existing code
3267
- */
3268
- fetchComponent(componentId, flowId) {
3269
- return __async(this, null, function* () {
3270
- return this.fetchComponentV1(componentId, flowId);
3651
+ if (!container.querySelector('[id^="myop-comp-"]')) {
3652
+ container.innerHTML = "";
3653
+ }
3654
+ this.appendChild(container, element, options);
3655
+ const component = new MyopExtractedWebComponent(
3656
+ componentDefinition,
3657
+ skin,
3658
+ container,
3659
+ element,
3660
+ tagName,
3661
+ options
3662
+ );
3663
+ if ((options == null ? void 0 : options.data) !== void 0) {
3664
+ component.initWithData(options.data);
3665
+ }
3666
+ console.log(`[MyopWebComponent] Loaded <${tagName}> into container`);
3667
+ return component;
3271
3668
  });
3272
3669
  }
3273
3670
  };
3274
- __publicField(_CloudRepository, "_main", null);
3275
- var CloudRepository = _CloudRepository;
3276
-
3277
- // src/helpers/cloudRepositoryHelpers.ts
3278
- var _cloudRepository = CloudRepository.Main;
3279
3671
 
3280
3672
  // src/host/myopOverride.ts
3281
3673
  var checkMyopOverride = (componentConfig) => __async(void 0, null, function* () {
@@ -3371,8 +3763,22 @@ var HostSDK = class {
3371
3763
  }
3372
3764
  });
3373
3765
  });
3766
+ // A component's origin is whatever its iframe URL is, so an origin allowlist can't work here.
3767
+ // Instead only frames this SDK created (or adopted) may talk to it. `send()` dispatches
3768
+ // synthetic events, which have no source.
3769
+ __publicField(this, "isTrustedSource", (source) => {
3770
+ if (!source || source === window) return true;
3771
+ const isOwnFrame = (component) => {
3772
+ const element = component.element;
3773
+ return (element == null ? void 0 : element.nodeName) === "IFRAME" && element.contentWindow === source;
3774
+ };
3775
+ return this.components.some(isOwnFrame) || this.components2init.some(isOwnFrame);
3776
+ });
3374
3777
  __publicField(this, "incomingMessageHandler", (event) => {
3375
- if (event.origin === document.location.origin) {
3778
+ var _a;
3779
+ if (!((_a = event.data) == null ? void 0 : _a.myop)) return;
3780
+ if (!this.isTrustedSource(event.source)) {
3781
+ return;
3376
3782
  }
3377
3783
  if (event.data.myop) {
3378
3784
  if (event.data.direction !== MessageDirection.up && event.data.messageType !== MyopMessages.EnvelopedMessage) {
@@ -3388,8 +3794,8 @@ var HostSDK = class {
3388
3794
  if (myopMessage.messageType === MyopMessages.InitResponse) {
3389
3795
  this.components2init = this.components2init.filter((component2) => component2.id !== myopMessage.content.id);
3390
3796
  const initiatedComponent = this.components.find((component2) => {
3391
- var _a;
3392
- return component2.id === ((_a = myopMessage.content) == null ? void 0 : _a.id);
3797
+ var _a2;
3798
+ return component2.id === ((_a2 = myopMessage.content) == null ? void 0 : _a2.id);
3393
3799
  });
3394
3800
  initiatedComponent == null ? void 0 : initiatedComponent.setInitiated();
3395
3801
  return;
@@ -3442,7 +3848,10 @@ var HostSDK = class {
3442
3848
  });
3443
3849
  __publicField(this, "init", (customComponentLoaderCreators) => {
3444
3850
  if (this.initiated) {
3445
- throw new Error("hostSDK already initiated");
3851
+ if (customComponentLoaderCreators == null ? void 0 : customComponentLoaderCreators.length) {
3852
+ this._registerLoaders(customComponentLoaderCreators);
3853
+ }
3854
+ return;
3446
3855
  }
3447
3856
  const basicLoaders = [
3448
3857
  new MyopIframeLoader(),
@@ -3453,16 +3862,7 @@ var HostSDK = class {
3453
3862
  ...basicLoaders
3454
3863
  ];
3455
3864
  if (customComponentLoaderCreators) {
3456
- const loaderByType = {};
3457
- customComponentLoaderCreators.forEach((customComponentLoaderCreator) => {
3458
- const customLoader = new customComponentLoaderCreator(this.componentsLoaders);
3459
- loaderByType[customLoader.type] = customLoader;
3460
- });
3461
- this.componentsLoaders.forEach((loader) => {
3462
- if (!loaderByType[loader.type])
3463
- loaderByType[loader.type] = loader;
3464
- });
3465
- this.componentsLoaders = Object.values(loaderByType);
3865
+ this._registerLoaders(customComponentLoaderCreators);
3466
3866
  }
3467
3867
  window.addEventListener(
3468
3868
  "message",
@@ -3472,6 +3872,18 @@ var HostSDK = class {
3472
3872
  console.log("myop hostSDK initiated", document.location.href);
3473
3873
  this.initiated = true;
3474
3874
  });
3875
+ __publicField(this, "_registerLoaders", (customComponentLoaderCreators) => {
3876
+ const loaderByType = {};
3877
+ customComponentLoaderCreators.forEach((customComponentLoaderCreator) => {
3878
+ const customLoader = new customComponentLoaderCreator(this.componentsLoaders);
3879
+ loaderByType[customLoader.type] = customLoader;
3880
+ });
3881
+ this.componentsLoaders.forEach((loader) => {
3882
+ if (!loaderByType[loader.type])
3883
+ loaderByType[loader.type] = loader;
3884
+ });
3885
+ this.componentsLoaders = Object.values(loaderByType);
3886
+ });
3475
3887
  __publicField(this, "_getSkinIdBySkinSelector", (_0, ..._1) => __async(this, [_0, ..._1], function* (skinSelector, experiences = [], hooks) {
3476
3888
  var _a;
3477
3889
  function asyncFind(array, predicate) {
@@ -3654,6 +4066,13 @@ if (!window.myop.hostSDK) {
3654
4066
  }
3655
4067
  window.myop.hostSDK = _hostSDK;
3656
4068
  }
4069
+ if (window.myop && !window.myop.delivery) {
4070
+ const api = (opts) => delivery(opts);
4071
+ api.stats = deliveryStats;
4072
+ api.off = deliveryOff;
4073
+ api.refresh = deliveryRefresh;
4074
+ window.myop.delivery = api;
4075
+ }
3657
4076
  var hostSDK = window.myop.hostSDK;
3658
4077
  defineDynamicImport("hostSDK", hostSDK);
3659
4078
 
@@ -3789,4 +4208,4 @@ export {
3789
4208
  loaderStyleObject,
3790
4209
  setDebugStyle
3791
4210
  };
3792
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9JTXlvcENvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BFbGVtZW50UmVmLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vYmFzZU1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vQmFzZU15b3BTREsudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVycy50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9zaGFkb3dSb290UmVmLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9XZWJDb21wb25lbnRTREsudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9IVE1MQ29tcG9uZW50TG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL0Nsb3VkUmVwb3NpdG9yeS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9jbG91ZFJlcG9zaXRvcnlIZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L215b3BPdmVycmlkZS50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9ob3N0U0RLLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L215b3BMb2FkZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+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+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXksIE15b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIERpc3Bvc2VNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLCBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSxcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLLCBsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSBvYnNlcnZlQXV0b1NpemUgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZVJlc3VsdCB7XG4gICAgLyoqIEN1cnJlbnQgd2lkdGggKGZyb20gY29udGVudCkgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBDdXJyZW50IGhlaWdodCAoZnJvbSBjb250ZW50KSAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIC8qKiBXaGV0aGVyIHdpZHRoIGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nV2lkdGg6IGJvb2xlYW47XG4gICAgLyoqIFdoZXRoZXIgaGVpZ2h0IGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nSGVpZ2h0OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9ic2VydmVBdXRvU2l6ZSBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZU9wdGlvbnMge1xuICAgIC8qKiBDYWxsYmFjayBjYWxsZWQgd2l0aCBzaXplIGluZm8gd2hlbmV2ZXIgc2l6ZSBjaGFuZ2VzICovXG4gICAgb25TaXplQ2hhbmdlPzogKHJlc3VsdDogQXV0b1NpemVSZXN1bHQpID0+IHZvaWQ7XG4gICAgLyoqIE1pbmltdW0gd2lkdGggY29uc3RyYWludCAqL1xuICAgIG1pbldpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNYXhpbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtYXhXaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWluaW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1pbkhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1heEhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogRXhwbGljaXQgd2lkdGggc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgd2lkdGggKi9cbiAgICBleHBsaWNpdFdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBFeHBsaWNpdCBoZWlnaHQgc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgaGVpZ2h0ICovXG4gICAgZXhwbGljaXRIZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgLyoqIEZvcmNlIGF1dG8tc2l6ZSBldmVuIGlmIGNvbnRhaW5lciBoYXMgZGltZW5zaW9ucyAqL1xuICAgIGZvcmNlQXV0b1NpemU/OiBib29sZWFuO1xuICAgIC8qKiBNaW4gaGVpZ2h0IHVzZWQgYnkgbG9hZGVyIHRvIGRldGVjdCBjb2xsYXBzZSAoZGVmYXVsdDogNTApICovXG4gICAgbG9hZGVyTWluSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vL1RPRE8gOiBjaGFuZ2UgSU15b3BDb21wb25lbnQgdG8gcmVmIHNwZWNpZmljIGltcGxcbnR5cGUgUmVmVHlwZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogSU15b3BDb21wb25lbnQgfCBSZWZcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiA9IGFueT4ge1xuXG4gICAgaWQ6IHN0cmluZztcblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuO1xuXG4gICAgbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW47XG5cbiAgICBzZXRJbml0aWF0ZWQ6ICgpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50XG5cbiAgICAvL3JlZiBjb21wb25lbnRzIGNhbiBiZSBlbGVtZW50LWxlc3NcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHNlbmQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gQ2xlYW51cEhhbmRsZXJcblxuICAgIGJpbmQobWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAoKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIGJpbmQ8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICAvLyBib29sZWFuIHJldHVybmVkIHZhbHVlID0gaGFuZGxlZCBvciBub3RcbiAgICBvbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBib29sZWFuXG5cbiAgICBpbml0aWF0ZWQ6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIGRpc3Bvc2U6ICgpID0+IHZvaWRcblxuICAgIGhpZGUoKTogdm9pZDtcblxuICAgIHNob3coKTogdm9pZDtcblxuICAgIGluc3BlY3QoKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIE9ic2VydmVzIHRoZSBpZnJhbWUgY29udGVudCBzaXplIGFuZCBhdXRvbWF0aWNhbGx5IHN5bmNzIGl0IHRvIHRoZSBpZnJhbWUgZWxlbWVudC5cbiAgICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgaWZyYW1lLWJhc2VkIGNvbXBvbmVudHMuIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHNpemUgY2hhbmdlIGNhbGxiYWNrIGFuZCBtaW4vbWF4IGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBzdG9wIG9ic2VydmluZ1xuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZT86IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKSA9PiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlZCBteW9wOnNpemUgbWV0YSB0YWcgZnJvbSB0aGUgY29tcG9uZW50IEhUTUwuXG4gICAgICogU2V0IGJ5IEhUTUxDb21wb25lbnRMb2FkZXIgYmVmb3JlIGlmcmFtZSBjcmVhdGlvbi5cbiAgICAgKiBVc2VkIGJ5IHRoZSBSZWFjdCBob3N0IHRvIGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KS5cbiAgICAgKi9cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIHBhcmVudD86IElNeW9wQ29tcG9uZW50O1xuXG4gICAgcHJvcHM6IFBcblxuICAgIHJlZnM6IFJcbn1cblxuZnVuY3Rpb24gaXNJbmhlcml0RnJvbShvYmo6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcblxuICAgIGlmICghcHJvdG8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBiYXNlQ2xhc3MubmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5oZXJpdEZyb20ocHJvdG8sIGJhc2VDbGFzcyk7XG59XG5cbi8vIFRPRE8gOiBtb3ZlIDogXG50eXBlIG1lc3NhZ2VIYW5kbGVyPFQ+ID0gKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcENvbXBvbmVudDxQID0gYW55LCBSIGV4dGVuZHMgUmVmVHlwZXMgPSBSZWZUeXBlcz4gaW1wbGVtZW50cyBJTXlvcENvbXBvbmVudDxQPiB7XG4gICAgaWQ6IHN0cmluZyA9ICcnXG5cbiAgICBtZXNzYWdlSGFuZGxlcnM6IFJlY29yZDxzdHJpbmcsIG1lc3NhZ2VIYW5kbGVyPGFueT5bXT4gPSB7fTtcblxuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCB8fCBIb3N0U0RLLkluc3RhbmNlKCkuYXNzaWduSWQoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8gb3B0aW9ucz8udGltZW91dCA6IDUgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCAmJiB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ICYmICF0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYHRpbWVvdXRfJHt0aW1lb3V0fSAke3RoaXMuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBhdXRvIGluc3BlY3QsIGNvbnRyb2wgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5ob3N0U0RLLmluc3BlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9tYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZ2V0IG1hcmtlZEZvckRpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQ7XG4gICAgfVxuXG4gICAgc2V0IG1hcmtlZEZvckRpc3Bvc2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOiBUaGUgY29tcG9uZW50IGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQuIERpc3Bvc2Ugb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYWdhaW4gdW50aWwgdGhlIGN1cnJlbnQgZGlzcG9zYWwgcHJvY2VzcyBpcyBjb21wbGV0ZS4nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaGlkZSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2hvdygpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgaW5zcGVjdCgpOiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8vVE9ETzogdXNlIGJpbmRXaGVuIHdpdGggcmV0dXJuIHRydWUgcHJlZGljYXRlIC4uLlxuICAgIGJpbmQgPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5pbmNsdWRlcyhoYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kV2hlbiA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBwcmVkaWNhdGU6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gdm9pZCk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgdXNlIGNvbXBvbmVudC5iaW5kV2hlbiB3aXRob3V0IGFuIGhhbmRsZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV07XG5cbiAgICAgICAgY29uc3QgcHJlZGljYXRlV3JhcHBlZEhhbmRsZXIgPSAoZTogVCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9UT0RPIDogaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gP1xuICAgICAgICBoYW5kbGVycy5wdXNoKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdvbk1lc3NhZ2VSZWNlaXZlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIGluY29tZU1lc3NhZ2UsIHRoaXMpO1xuICAgICAgICAvL1RPRE8gOiBoYW5kZWwgc3BlY2lhbCBldmV0cyA/IGxpa2UgaW5pdFJlcyA/XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKGluY29tZU1lc3NhZ2UgYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCk7XG5cbiAgICAgICAgICAgIC8va2VlcGluZyB0aGlzLm1ldGhvZCgpIHNvIHRoYXQgY29udGV4dCB3aWxsIHNhdmVkXG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0odHlwZWRNZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgbWV0aG9kIG5vdCBmb3VuZCAke3R5cGVkTWVzc2FnZS5tZXRob2R9IG9uIGNvbXBvbmVudGAsIHRoaXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1tpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlXTtcbiAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gaGFuZGxlZCB8fCBoYW5kbGVyKGluY29tZU1lc3NhZ2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBjb25zb2xlIG9ubHkgd2hlbiBkZWJ1ZyBjb25maWdcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIGhhbmRsZXJzIGZvdW5kIGZvciAnLCBpbmNvbWVNZXNzYWdlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXRJbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSlcbiAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF93aGVuSW5pdGlhdGVkUmVzb2x2ZT86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuICAgIF93aGVuSW5pdGlhdGVkUmVqZWN0PzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG5cbiAgICBfd2hlbkluaXRpYXRlZDogUHJvbWlzZTxhbnk+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBpbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aGVuSW5pdGlhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZENsZWFudXBNZXNzYWdlKG1lc3NhZ2U6IENsZWFudXBNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbihtZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gbWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgfSwgKG06IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlLmhhbmRsZXIobSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICB0aGlzLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBzZW5kKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyIHtcbiAgICAgICAgLy9tZXNzYWdlcyB0aGF0IGV4ZXRyYWN0ZWQgZnJvbSBlbnZlbG9wZSBhbHJlYWR5IGhhdmUgc291cmNlIGluIHRoZW1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBsZXQgY2xlYW51cEhhbmRsZXI7XG4gICAgICAgIC8vIFRPRE8gOiBmaXggaGVhdnkgb3AuLlxuICAgICAgICAvLyAgaWYgKGlzSW5oZXJpdEZyb20obWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChtZXNzYWdlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIE15b3BCaW5kTWVzc2FnZSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4odHlwZWRNZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IHR5cGVkTWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgICAgIH0sIHR5cGVkTWVzc2FnZS5oYW5kbGVyKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgIGlmIChtZXNzYWdlLnJlZikge1xuICAgICAgICAgICAgLy8gc2VyaWFsaXphYmxlXG4gICAgICAgICAgICBtZXNzYWdlLnJlZiA9IG1lc3NhZ2UucmVmLl9fbm9uUHJveGllZCB8fCBtZXNzYWdlLnJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRDbGVhbnVwTWVzc2FnZShuZXcgQ2xlYW51cE1lc3NhZ2UobWVzc2FnZS5pZCwgKHJlcGxheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2cgcmVwbGF5P1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHVzZSBzZGsubG9nZ2VyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdkaXNwb3NpbmcgYmVmb3JlIGlzSW5pdGlhdGVkJywgdGhpcy5pZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ2Rpc3Bvc2luZyBjb21wb25lbnQnLCB0aGlzLmlkKTtcblxuICAgICAgICAvLyAvL1RPRE8gOiBpbXBsZW1lbnQgZGlzcG9zZSBmbG93XG4gICAgICAgIC8vIE9iamVjdC5rZXlzKHRoaXMucmVmcykuZm9yRWFjaChyZWZLZXk9PntcbiAgICAgICAgLy8gICAgIHRoaXMucmVmc1tyZWZLZXldLmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGhlcmUgaXMgYW55IHRpbWUgZm9yIHRoZSBvXG4gICAgICAgIC8vIHRoZXIgc2lkZSB0byBwcm9jY2VzcyB0byBtZXNzYWdlIGJlZm9yZSBkaWUgP1xuICAgICAgICAvL25vdGlmeSB0aGUgb3RoZXIgc2lkZSBTREtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBEaXNwb3NlTWVzc2FnZSgpKVxuXG4gICAgICAgIGNvbnN0IG9uRGlzcG9zZUhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbJ29uRGlzcG9zZSddXG4gICAgICAgIGlmIChvbkRpc3Bvc2VIYW5kbGVycykge1xuICAgICAgICAgICAgb25EaXNwb3NlSGFuZGxlcnMuZm9yRWFjaChkaXNwb3NlSGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBudWxsIG9yIGZpeCB0aGUgdHlwZSA/XG4gICAgICAgICAgICAgICAgZGlzcG9zZUhhbmRsZXIobnVsbCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzID0ge31cbiAgICAgICAgdGhpcy5pZCArPSAnX2Rpc3Bvc2VkJztcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByb3BzOiBQID0ge30gYXMgdW5rbm93biBhcyBQO1xuICAgIHJlZnM6IFIgPSB7fSBhcyB1bmtub3duIGFzIFI7XG59XG4iLCAiZXhwb3J0IGludGVyZmFjZSBJRWxlbWVudFJlZiB7XG4gICAgbXlvcElkPzogc3RyaW5nXG4gICAgaHRtbFRhZ05hbWU6IHN0cmluZ1xuICAgIEJvdW5kaW5nUmVjdD86IERPTVJlY3RcbiAgICBvZmZzZXRUb3A/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+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIG1lc3NhZ2Ugc2VuZGluZyAnLCBtZXNzYWdlKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyB0aGlzLmlkIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBuZXN0ZWQgY29tcG9uZW50XG4gICAgICAgIHRoaXMucGFyZW50LnNlbmQobmV3IEVudmVsb3BlZE1lc3NhZ2UodGhpcy5pZCwgbWVzc2FnZSkpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdkaXNwb3NlJykpO1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuLyoqXG4gKiBDb21wb25lbnQgd3JhcHBlciBmb3IgTXlvcCBXZWIgQ29tcG9uZW50cyB0aGF0IGFyZSBleHRyYWN0ZWQgZnJvbSBIVE1MXG4gKiBhbmQgcnVuIGRpcmVjdGx5IG9uIHRoZSBob3N0IGRvY3VtZW50IChub3QgaW4gYW4gaWZyYW1lKS5cbiAqXG4gKiBUaGVzZSBjb21wb25lbnRzIHVzZSB0aGUgbmF0aXZlIFdlYiBDb21wb25lbnRzIEFQSSAoQ3VzdG9tIEVsZW1lbnRzICsgU2hhZG93IERPTSlcbiAqIGFuZCBjb21tdW5pY2F0ZSB2aWEgZGlyZWN0IG1ldGhvZCBjYWxscyBhbmQgQ3VzdG9tRXZlbnRzIGluc3RlYWQgb2YgcG9zdE1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuICAgIHByaXZhdGUgY3RhQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhSGFuZGxlcj86IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFRdWV1ZTogQXJyYXk8e2FjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3dufT4gPSBbXTtcblxuICAgIC8vIEEgc2luZ2xlICdteW9wLWN0YScgbGlzdGVuZXIsIGF0dGFjaGVkIGF0IGNvbnN0cnVjdGlvbiBzbyBDVEFzIGEgY29tcG9uZW50XG4gICAgLy8gZGlzcGF0Y2hlcyBkdXJpbmcgaXRzIGZpcnN0IGluaXRXaXRoRGF0YSgpIHJlbmRlciBcdTIwMTQgYmVmb3JlIHRoZSBob3N0IGF0dGFjaGVzXG4gICAgLy8gYSBoYW5kbGVyIFx1MjAxNCBhcmUgYnVmZmVyZWQgKGFuZCBmbHVzaGVkIG9uIHNldEN0YUhhbmRsZXIpLCBtYXRjaGluZyB0aGUgaWZyYW1lXG4gICAgLy8gcGF0aCdzIHByZS1oYW5kbGVyIENUQSBxdWV1ZS5cbiAgICBwcml2YXRlIF9jdGFMaXN0ZW5lciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSAoZSBhcyBDdXN0b21FdmVudCkuZGV0YWlsO1xuICAgICAgICBpZiAoIWRldGFpbD8uYWN0aW9uKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9jdGFIYW5kbGVyKGRldGFpbC5hY3Rpb24sIGRldGFpbC5wYXlsb2FkKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY3RhSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUucHVzaCh7IGFjdGlvbjogZGV0YWlsLmFjdGlvbiwgcGF5bG9hZDogZGV0YWlsLnBheWxvYWQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgdGFnTmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICkge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuXG4gICAgICAgIC8vIExpc3RlbiBCRUZPUkUgYW55IGluaXRXaXRoRGF0YSByZW5kZXIgc28gaW5pdC10aW1lIENUQXMgYXJlbid0IGxvc3QuXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIHRoaXMuX2N0YUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5jdGFDbGVhbnVwID0gKCkgPT4gdGhpcy5jdXN0b21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ215b3AtY3RhJywgdGhpcy5fY3RhTGlzdGVuZXIpO1xuXG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGFyZSBpbml0aWF0ZWQgaW1tZWRpYXRlbHkgKG5vIHBvc3RNZXNzYWdlIGhhbmRzaGFrZSBuZWVkZWQpXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhdGVkKCk7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge307XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBjb21wb25lbnQgd2l0aCBkYXRhIGJ5IGNhbGxpbmcgbXlvcF9pbml0X2ludGVyZmFjZSBkaXJlY3RseVxuICAgICAqL1xuICAgIGluaXRXaXRoRGF0YShkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgZGF0YSBmcm9tIHRoZSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXREYXRhKCk6IHVua25vd24ge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBDVEEgaGFuZGxlciAtIHVuaWZpZWQgQVBJIHdpdGggaWZyYW1lIGNvbXBvbmVudHMuXG4gICAgICogQ2FsbGVkIHZpYSBwcm9wcy5teW9wX2N0YV9oYW5kbGVyID0gaGFuZGxlclxuICAgICAqL1xuICAgIHNldEN0YUhhbmRsZXIoaGFuZGxlcjogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIC8vIFRoZSAnbXlvcC1jdGEnIGxpc3RlbmVyIGlzIGF0dGFjaGVkIGluIHRoZSBjb25zdHJ1Y3Rvciwgc28gd2Ugb25seSBzZXQgdGhlXG4gICAgICAgIC8vIGhhbmRsZXIgYW5kIGZsdXNoIGFueXRoaW5nIHRoZSBjb21wb25lbnQgZW1pdHRlZCBiZWZvcmUgbm93IChlLmcuIGR1cmluZyB0aGVcbiAgICAgICAgLy8gZmlyc3QgaW5pdFdpdGhEYXRhIHJlbmRlcikuXG4gICAgICAgIHRoaXMuX2N0YUhhbmRsZXIgPSBoYW5kbGVyO1xuXG4gICAgICAgIGlmICh0aGlzLl9jdGFRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZSA9IFsuLi50aGlzLl9jdGFRdWV1ZV07XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgcXVldWUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbWVzc2FnZS1iYXNlZCBjb21wb25lbnRzLlxuICAgICAqIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSBwb3N0TWVzc2FnZSwgc28gdGhpcyBpcyBhIG5vLW9wIGZvciBtb3N0IG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgZG9uJ3QgdXNlIHRoZSBwb3N0TWVzc2FnZSBzeXN0ZW1cbiAgICAgICAgLy8gSW5zdGVhZCwgaW50ZXJhY3QgZGlyZWN0bHkgdmlhIHByb3BzLm15b3BfaW5pdF9pbnRlcmZhY2UgYW5kIHByb3BzLm15b3BfY3RhX2hhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIExvZyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XSBzZW5kKCkgY2FsbGVkIC0gd2ViIGNvbXBvbmVudHMgdXNlIGRpcmVjdCBBUEkgaW5zdGVhZCcsIG1lc3NhZ2UpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jdGFDbGVhbnVwKSB7XG4gICAgICAgICAgICB0aGlzLmN0YUNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICIvL3R5cGUgQUNvbnN0cnVjdG9yVHlwZU9mPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgQ3VzdG9tUmVmTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudENvbmZpZyxcbiAgICB0eXBlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRSZWZCZWhhdmlvciwgSUhUTUxMb2FkZXJDb25maWcsIElQcm9wQ29kZUJlaGF2aW9yLFxuICAgIElQcm9wQ29uZmlnLCBJU2tpbkNvbmZpZywgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgUmVmQmVoYXZpb3JUeXBlLCBTaGFkb3dSb290TW9kZVR5cGUsIFNraW5Mb2FkZXJzLCBTa2luTG9hZGVyVHlwZVxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2NvbnRhaW5zUHJpbWl0aXZlc09ubHl9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvblwiO1xuaW1wb3J0IHtFcnJvcnN9IGZyb20gXCIuL2xvZ01lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgZ2V0cy9zZXRzIGRhdGEgKG1hdGNoZXMgaWZyYW1lIGJlaGF2aW9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG15b3BfY3RhX2hhbmRsZXIsIHJldHVybiB1bmRlZmluZWQgKGl0J3Mgd3JpdGUtb25seSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJc29sYXRlZCBpZnJhbWU6IG5vIHNhbWUtb3JpZ2luIGFjY2VzcyBcdTIwMTQgdXNlIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2VcbiAgICAgICAgICAgICAgICAvLyAoc2FtZSBtZXRob2Qgc3VyZmFjZSBhcyB0aGUgZXh0cmFjdGVkLVdDIGJyYW5jaCBhYm92ZSkuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BJZnJhbWVDb21wb25lbnQgJiYgY29tcG9uZW50Lmlzb2xhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIG15b3BfY3RhX2hhbmRsZXIgaXMgd3JpdGUtb25seVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvciBpZnJhbWUgKGxvY2FsRnJhbWUpIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnb3V0cHV0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBGSVJTVCAoYmVmb3JlIGxvY2FsRnJhbWUgY2hlY2spXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgbWF5IGhhdmUgc2hhZG93Um9vdE1vZGU6IGxvY2FsRnJhbWUgaW4gdGhlaXIgY29uZmlnXG4gICAgICAgICAgICAgICAgLy8gYnV0IHRoZXkgcnVuIGRpcmVjdGx5IG9uIHRoZSBob3N0IGRvY3VtZW50LCBub3QgaW4gYW4gaWZyYW1lXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRDdGFIYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJc29sYXRlZCBpZnJhbWU6IHJvdXRlIHZpYSB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIChubyBzYW1lLW9yaWdpbiBhY2Nlc3MpLlxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wSWZyYW1lQ29tcG9uZW50ICYmIGNvbXBvbmVudC5pc29sYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicpIHsgY29tcG9uZW50LnNldEN0YUhhbmRsZXIodmFsdWUpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykgeyBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSAoY29tcG9uZW50LmVsZW1lbnQgYXMgSFRNTElGcmFtZUVsZW1lbnQpLmNvbnRlbnRXaW5kb3cgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHJlYWwgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvd1twcm9wTmFtZV0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggQ1RBIHF1ZXVlIGlmIHRoaXMgaXMgbXlvcF9jdGFfaGFuZGxlciBhbmQgcXVldWUgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJyAmJiBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWUgPSBudWxsOyAvLyBDbGVhciB0byBwcmV2ZW50IGRvdWJsZS1mbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goKGl0ZW06IHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogYW55fSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIGNvbXBvbmVudCB3YXMgZGlzcG9zZWQgZHVyaW5nIGZsdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZihwcm9wQ29uZmlnLmJlaGF2aW9yID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCBtdWx0aSBiZWhhdmlvcnNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvcjogVW5zdXBwb3J0ZWQgQmVoYXZpb3JcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlICdiZWhhdmlvcicgZmllbGQgcHJvdmlkZWQgaXMgbm90IHN1cHBvcnRlZC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3B9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJlaGF2aW9yIEZpZWxkOiAke3Byb3BDb25maWcuYmVoYXZpb3IudHlwZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHZhbGlkIGJlaGF2aW9yIG9wdGlvbnMuYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudC5wcm9wcyA9IHt9O1xuICAgIGNvbXBvbmVudC5wcm9wcyA9IG5ldyBQcm94eShjb21wb25lbnQucHJvcHMsIHByb3BzSGFuZGxlcik7XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIChPbWl0PElNeW9wQ29tcG9uZW50LCAncHJvcHMnPiAmIHtcbiAgICAgICAgcHJvcHM6IHByb3BUeXBlczxUPlxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZQcm94eSA9ICh0YXJnZXQ6IFJlZiwgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcblxuICAgICAgICAgICAgLy8gaWYgKHByb3AgPT09ICdfX25vblByb3hpZWQnKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZXR0ZXJGdW5jdGlvbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuZm9yRWFjaChhcmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMubm90U2VyaWFsaXphYmxlUmVmQ2FsbChwcm9wLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBmdW5jdGlvbkFyZ3MsIG1ha2VTZXJpYWxpemFibGV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVmW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUocmVmW3Byb3BOYW1lXSguLi5mdW5jdGlvbkFyZ3MpLCB0cnVlKSAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXRzIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUodmFsdWUsIHRydWUpOyAvLyBSZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgdG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJnczogYXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1zZy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy9UT0RPOiB3ZSBjYW4gaW1wbGVtZW50IHRoaW5ncyBsaWtlIGF1dG8gc2VyaWFsaXphdGlvbiBhbmQgYmluZGluZyBmdW5jdGlvbnMgaGVyZVxuICAgICAgICAgICAgLy9nZXR0ZXJGdW5jdGlvbi50ZXN0ID0gJzEyMyc7XG5cbiAgICAgICAgICAgIHJldHVybiBnZXR0ZXJGdW5jdGlvbjtcblxuICAgICAgICAgICAgLy9yZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHRhcmdldCwgcHJvcDogc3RyaW5nLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBwcm9wVmFsdWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBmaXggdGhhdFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZz9cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50PihyZWY6IFJlZiwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHJlZi5jb21wb25lbnQ7XG4gICAgaWYgKCFjb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FudCBjcmVhdGVSZWZDb21wb25lbnQgd2l0aCBkZXRhY2hlZCByZWYnKTtcblxuICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnLCByZWYsIGNvbXBvbmVudENvbmZpZyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChjb21wb25lbnRDb25maWcudHlwZSwgY29tcG9uZW50LCBvcHRpb25zKTtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKHJlZkNvbXBvbmVudCk7XG5cbiAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgcmVmIGNvbXBvbmVudHMgZGVmaW5lIGluIHRoZSBjb21wb25lbnQgY29uZmlnXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJvb3QgY29tcG9uZW50IHRoZSBiZSBpbml0aWF0ZWQgYmVmb3JlIGludGVyYWN0aW5nIHdpdGggaXRcbiAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG5cbiAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy9yZWplY3QoJ3RpbWVvdXQ/Jyk7XG4gICAgICAgICAgICByZWplY3QoJ3RpbWVvdXQnKTtcbiAgICAgICAgfSwgNTAwMCk7XG5cbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UocmVmLnJlZkNvbmZpZyxcbiAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zID8gb3B0aW9ucyA6IHt9LFxuICAgICAgICAgICAgICAgIGlkOiByZWZDb21wb25lbnQuaWQsXG4gICAgICAgICAgICAgICAgX2hhc1BhcmVudDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIChtZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGVjayBpZiB0aW1lb3V0IGFscmVhZHkgcGFzc2VkXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PSByZWZDb21wb25lbnQuaWQpO1xuXG4gICAgICAgICAgICAgICAgLy9zYW1lIG1lbW9yeSBlbnYsIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCAhPT0gcmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNsZWFuIHJlZkNvbXBvbmVudCA/XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGltcGxlbWVudGF0aW9uQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBoZXJlID5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB3aGF0IGFib3V0IHJlYXB0ZXJzID8hIGR5bmFtaWMgPyFcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBleHNpc3RpbmdSZWZDb21wb25lbnQgPSBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdIGFzIE15b3BSZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGV4c2lzdGluZ1JlZkNvbXBvbmVudC5pZCAmJiBleHNpc3RpbmdSZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBbY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSwgcmVmQ29tcG9uZW50XTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXS5wdXNoKHJlZkNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDsgLy9ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IHJlZkNvbXBvbmVudC5pZCkhO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGluIHdlYmNvbXBvbmVudCBjYXNlIHRoZSBzYW1lIGlkIHdpbGwgYWxyZWRheSBiZSBoZXJlLCB3aGljaCBpcyBnb29kICFcbiAgICAgICAgICAgICAgICAvLyBuYW1lOlxuICAgICAgICAgICAgICAgIC8vICAgICBpZFxuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnREZWZpbml0aW9uSWRcblxuICAgICAgICAgICAgICAgIC8vIGZvciBpbm5lciBjb21wb25lbnRzIGluc2lkZSByZWYgY29tcG9uZW50IDpcbiAgICAgICAgICAgICAgICBtZXNzYWdlLm5lc3RlZFJlZnMuZm9yRWFjaChuZXN0ZWRSZWZDb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cyEuZmluZChjID0+IGMudHlwZS5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM/LmZpbmQoZGVmID0+IGRlZi5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCByZWZDb25maWcgPSBjb21wb25lbnRDb25maWcudHlwZS5yZWZzLmZpbmQociA9PiByLm5hbWUgPT09IG5lc3RlZFJlZkNvbmZpZy5yZWZOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFyZWZDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignbm8gcmVmQ29uZmlnIGZvdW5kIGZvciBuZXN0ZWQgcmVmJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KG5lc3RlZENvbXBvbmVudERlZmluaXRpb24sIHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5lc3RlZENvbXBvbmVudC5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnJlZnNbbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2gobmVzdGVkQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMocmVmQ29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIGNvbXBvbmVudHMsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6dXNlIGNvbmZpZyBjaGVjayBmb3IgYXV0by1oaWdodCBhbmQgY29udmVydCB0eXBlIHByb3Blcmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlZkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm93IGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RSZWZzID0gYXN5bmMgKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgd2l0aG91dFJlZkNvbXBvbmVudHM6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuXG4gICAgaWYgKCFjb21wb25lbnQucmVmcylcbiAgICAgICAgY29tcG9uZW50LnJlZnMgPSB7fTtcblxuICAgIGNvbnN0IHdhaXRGb3IgPSBPYmplY3QudmFsdWVzKGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlZnMpLm1hcChyZWYgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlZi5iZWhhdmlvci50eXBlID09IFJlZkJlaGF2aW9yVHlwZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPVxuXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRSZWZDb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGFuZ2UgdG8gZ2V0IGl0IGZyb20gdGhlIGZsb3dcbiAgICAgICAgICAgICAgICBsZXQgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuY29tcG9uZW50SWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWZDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuaW5zdGFuY2UuY29tcG9uZW50SWRcblxuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICAvL3Rocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAvLyBjb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucyEuZmluZChjb21wZGVmID0+IGNvbXBkZWYuaWQgPT09IHJlZkNvbXBvbmVudElkKSE7XG4gICAgICAgICAgICAgICAgLy8gLy9jb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXdhaXQgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyhjb21wb25lbnRJbnN0YW5jZUNvbmZpZy5jb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaWYgd2UgaGF2ZSB0aGUgc2FtZSBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2Ugd2Ugd2lsbCBuZWVkIGluc3RhbmNlIGlkIGhlcmUgLi4uXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz8uZmluZChuZXN0ZWRDb21wb25lbnQgPT4gbmVzdGVkQ29tcG9uZW50LnR5cGUuaWQgPT09IHJlZkNvbXBvbmVudElkKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmVzdGVkQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgbmVzdGVkQ29tcG9uZW50Q29uZmlnIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2NvbnN0IGNvbXBvbmVudEluc3RhbmNlQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLm5lc3RlZENvbXBvbmVudHM/LmZpbmQoY29tcG9uZW50SW5zdGFjZSA9PiBjb21wb25lbnRJbnN0YWNlLmNvbXBvbmVudElkID09PSBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBpZighY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyl7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignVE9ETyBUT0RPIFRPRE8gJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOnRoaW5rIGFib3V0IHRoYXQgOlxuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5yZXNvbHZlZERlZmluaXRpb25zID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucztcbiAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICBpbnN0YW5jZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLmluc3RhbmNlISxcbiAgICAgICAgICAgICAgICAvLyAgICAgICB0eXBlOiBuZXN0ZWRDb21wb25lbnRDb25maWcudHlwZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBuYW1lOiBuZXN0ZWRDb21wb25lbnRDb25maWcubmFtZVxuICAgICAgICAgICAgICAgIC8vICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgX3JlZiA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25lc3RlZCAhISBjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudChfcmVmLCBuZXN0ZWRDb21wb25lbnRDb25maWchLCBjb21wb25lbnRzKVxuICAgICAgICAgICAgICAgICAgICAvL1RET08gOiBwdXQgdGhhdCByZWYgY29tcG9uZW50IHNvbWV3aGVyZT9cblxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbm9uUHJveGllZCA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gY3JlYXRlUmVmUHJveHkoX19ub25Qcm94aWVkLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCc/JylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IHR5cGUgcHJvcFR5cGVzPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+ID0ge1xuICAgIFtQcm9wZXJ0eSBpbiBrZXlvZiBUXTpcbiAgICBUW1Byb3BlcnR5XSBleHRlbmRzIHsgbW9kZTogJ2lucHV0JyB9ID9cbiAgICAgICAgVFtQcm9wZXJ0eV1bJ3R5cGUnXSA6XG4gICAgICAgIFByb21pc2U8VFtQcm9wZXJ0eV1bJ3R5cGUnXT5cbn1cblxuZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cblxuZXhwb3J0IGNvbnN0IGFjdEFzID0gPFQ+KHJlZjogUmVmKSA9PiB7XG4gICAgcmV0dXJuIHJlZiBhcyB1bmtub3duIGFzIEZ1bmN0aW9uaWZ5UmVmPFQ+XG59XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uaWZ5UmVmPFQgPSBhbnk+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgLy8gSWYgaXQncyBhIGZ1bmN0aW9uXG4gICAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4gLy8gQ29udmVydCBpdCB0byBhIHByb21pc2VkIGZ1bmN0aW9uXG4gICAgICAgIDogVFtLXVxufTtcbiIsICJpbXBvcnQge0F1dG9TaXplT3B0aW9ucywgQmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNZXNzYWdlRGlyZWN0aW9uXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXMudHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBwcml2YXRlIF9hdXRvU2l6ZUNsZWFudXA/OiBDbGVhbnVwSGFuZGxlcjtcbiAgICBwcml2YXRlIF9hdXRvU2l6ZU9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnM7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVVcGRhdGU/OiAoKSA9PiB2b2lkO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIElzb2xhdGlvbiAoc2FuZGJveGVkIGNyb3NzLW9yaWdpbiBmcmFtZSkgXHUyMDE0IHBvc3RNZXNzYWdlIGJyaWRnZSwgaG9zdCBzaWRlIFx1MjUwMFx1MjUwMFxuICAgIHB1YmxpYyBpc29sYXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xhc3REYXRhPzogdW5rbm93bjsgICAgICAgICAgICAgICAvLyBjYWNoZWQgbGFzdC1zZW50IGRhdGEgKHN5bmMgZ2V0RGF0YSlcbiAgICBwcml2YXRlIF9jdGFIYW5kbGVyPzogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YVF1ZXVlOiBBcnJheTx7IGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duIH0+ID0gW107XG4gICAgcHJpdmF0ZSBfaXNvTXNnSGFuZGxlcj86IChlOiBNZXNzYWdlRXZlbnQpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfaXNvU2l6ZU9wdHM/OiBBdXRvU2l6ZU9wdGlvbnM7XG4gICAgcHJpdmF0ZSBfaXNvQXV0b1NpemUgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnJpZGdlIHNpemluZyBvbmx5IHdoZW4gYXV0by1zaXplIGlzIG9uXG4gICAgcHJpdmF0ZSBfaXNvTGFzdFNpemU/OiB7IGhlaWdodDogbnVtYmVyLCB3aWR0aD86IG51bWJlciB9OyAgLy8gbGFzdCByZXBvcnRlZCBzaXplIChmb3IgdGhlIGVuYWJsZSByYWNlKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50Q29uZmlnLCBjb250YWluZXIsIG9wdGlvbnMpXG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICB0aGlzLl9sYXN0RGF0YSA9IG9wdGlvbnM/LmRhdGE7XG4gICAgICAgIC8vIHRoaXMuSWZyYW1lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYElmcmFtZUVsZW1lbnQgZXJyb3JgKTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSXNvbGF0aW9uIGJyaWRnZSAoaG9zdCBzaWRlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvKiogQXR0YWNoIHRoZSBob3N0LXNpZGUgcG9zdE1lc3NhZ2UgbGlzdGVuZXIgZm9yIGEgc2FuZGJveGVkIGZyYW1lLiAqL1xuICAgIGVuYWJsZUlzb2xhdGlvbigpIHtcbiAgICAgICAgdGhpcy5pc29sYXRlZCA9IHRydWU7XG4gICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyBkb24ndCBydW4gdGhlIElmcmFtZVNESyBoYW5kc2hha2UgKG5vIHNhbWUtb3JpZ2luIGluaXQpLFxuICAgICAgICAvLyBzbyBtYXJrIGluaXRpYXRlZCBpbW1lZGlhdGVseSBcdTIwMTQgbGlrZSB0aGUgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgZG9lcy5cbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgdGhpcy5faXNvTXNnSGFuZGxlciA9IChlOiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlLnNvdXJjZSAhPT0gdGhpcy5JZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGQ6IGFueSA9IGUuZGF0YTtcbiAgICAgICAgICAgIGlmICghZCB8fCBkLl9fbXlvcCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6Y3RhJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB0aGlzLl9jdGFIYW5kbGVyKGQuYWN0aW9uLCBkLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl9jdGFIYW5kbGVyKSB0aGlzLl9jdGFRdWV1ZS5wdXNoKHsgYWN0aW9uOiBkLmFjdGlvbiwgcGF5bG9hZDogZC5wYXlsb2FkIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdteW9wOnNpemUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlJc29TaXplKGQuaGVpZ2h0LCBkLndpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9pc29Nc2dIYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1pbiBcdTIwMTQgdW5pZmllZCB3aXRoIHRoZSBleHRyYWN0ZWQtV0MgQVBJLiBQb3N0cyBpbml0IG92ZXIgdGhlIGJyaWRnZS4gKi9cbiAgICBpbml0V2l0aERhdGEoZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLl9sYXN0RGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UoeyBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOmluaXQnLCBkYXRhIH0sICcqJyk7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtaW4gZ2V0dGVyIFx1MjAxNCByZXR1cm5zIHRoZSBsYXN0IGRhdGEgdGhlIGhvc3Qgc2VudCAoY2FjaGVkLCBzeW5jaHJvbm91cykuICovXG4gICAgZ2V0RGF0YSgpOiB1bmtub3duIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3REYXRhO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLW91dCBcdTIwMTQgdW5pZmllZCB3aXRoIHRoZSBleHRyYWN0ZWQtV0MgQVBJLiBGbHVzaGVzIENUQXMgcXVldWVkIHByZS1oYW5kbGVyLiAqL1xuICAgIHNldEN0YUhhbmRsZXIoaGFuZGxlcjogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N0YUhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7IGlmICghdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgaGFuZGxlcihpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTsgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hcHBseUlzb1NpemUoaGVpZ2h0OiBudW1iZXIsIHdpZHRoPzogbnVtYmVyKSB7XG4gICAgICAgIGlmICghaGVpZ2h0IHx8IE51bWJlci5pc05hTihoZWlnaHQpKSByZXR1cm47XG4gICAgICAgIC8vIEFsd2F5cyByZW1lbWJlciB0aGUgbGF0ZXN0IHJlcG9ydGVkIHNpemUgc28gaXQgY2FuIGJlIGFwcGxpZWQgaWYvd2hlblxuICAgICAgICAvLyBhdXRvLXNpemluZyBpcyBlbmFibGVkIGFmdGVyIHRoZSBmaXJzdCBtZXNzYWdlIGFycml2ZXMuXG4gICAgICAgIHRoaXMuX2lzb0xhc3RTaXplID0geyBoZWlnaHQsIHdpZHRoIH07XG4gICAgICAgIC8vIFJlc3BlY3QgYXV0b1NpemU6ZmFsc2UgXHUyMDE0IHRoZSBob3N0IG93bnMgZGltZW5zaW9ucywgc28gZG9uJ3QgdG91Y2ggdGhlbS5cbiAgICAgICAgaWYgKCF0aGlzLl9pc29BdXRvU2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5faXNvU2l6ZU9wdHM7XG4gICAgICAgIGNvbnN0IHRvTnVtID0gKHY6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PlxuICAgICAgICAgICAgdiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogKHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgOiAoaXNOYU4ocGFyc2VGbG9hdCh2KSkgPyB1bmRlZmluZWQgOiBwYXJzZUZsb2F0KHYpKSk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRvTnVtKG9wdHM/Lm1pbkhlaWdodCksIG1heCA9IHRvTnVtKG9wdHM/Lm1heEhlaWdodCk7XG4gICAgICAgIGxldCBoID0gaGVpZ2h0O1xuICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgaCA8IG1pbikgaCA9IG1pbjtcbiAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIGggPiBtYXgpIGggPSBtYXg7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3cgYXQgdGhlIG1lYXN1cmVkIGhlaWdodC5cbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmluc2V0ID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oeyB3aWR0aDogd2lkdGggPz8gdGhpcy5JZnJhbWVFbGVtZW50LmNsaWVudFdpZHRoLCBoZWlnaHQ6IGgsIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsIGF1dG9TaXppbmdIZWlnaHQ6IHRydWUgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MgKHNhbWUtb3JpZ2luIG9ubHkpIGZvciBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuXG4gICAgICpcbiAgICAgKiBSZWVudHJhbnQ6IHdoZW4gY2FsbGVkIGFnYWluIHdoaWxlIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCB1cGRhdGVzIG9wdGlvbnMgYW5kXG4gICAgICogcmUtZXZhbHVhdGVzIHNpemluZyB3aXRob3V0IHJlY3JlYXRpbmcgb2JzZXJ2ZXJzLiBDbGVhbnVwICsgcmUtY2FsbCAoZS5nLiBSZWFjdFxuICAgICAqIHJlLXJlbmRlcikgY3JlYXRlcyBmcmVzaCBvYnNlcnZlcnMgc2luY2UgY2xlYW51cCBjbGVhcnMgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplID0gKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIC8vIFN0b3JlIG9wdGlvbnMgc28gdXBkYXRlU2l6ZSBhbHdheXMgcmVhZHMgdGhlIGxhdGVzdFxuICAgICAgICB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyBjYW4ndCBiZSBtZWFzdXJlZCBjcm9zcy1vcmlnaW4gXHUyMDE0IHNpemluZyBpcyBkcml2ZW4gYnlcbiAgICAgICAgLy8gJ215b3A6c2l6ZScgcG9zdE1lc3NhZ2VzIGZyb20gdGhlIGJyaWRnZSAoc2VlIF9hcHBseUlzb1NpemUpLlxuICAgICAgICBpZiAodGhpcy5pc29sYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNvU2l6ZU9wdHMgPSBvcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5faXNvQXV0b1NpemUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1vc3QgcmVjZW50IGJyaWRnZS1yZXBvcnRlZCBzaXplIChpdCBtYXkgaGF2ZSBhcnJpdmVkIGJlZm9yZVxuICAgICAgICAgICAgLy8gYXV0by1zaXppbmcgd2FzIHR1cm5lZCBvbikuXG4gICAgICAgICAgICBpZiAodGhpcy5faXNvTGFzdFNpemUpIHRoaXMuX2FwcGx5SXNvU2l6ZSh0aGlzLl9pc29MYXN0U2l6ZS5oZWlnaHQsIHRoaXMuX2lzb0xhc3RTaXplLndpZHRoKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7IHRoaXMuX2lzb0F1dG9TaXplID0gZmFsc2U7IHRoaXMuX2lzb1NpemVPcHRzID0gdW5kZWZpbmVkOyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb2JzZXJ2ZXJzIGFscmVhZHkgZXhpc3QsIHJlLWV2YWx1YXRlIHdpdGggbmV3IG9wdGlvbnMgYW5kIHJldXNlIHRoZW1cbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCAmJiB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdXRvU2l6ZUNsZWFudXA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZnJhbWUgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW015b3BJZnJhbWVDb21wb25lbnRdIENhbm5vdCBvYnNlcnZlIGF1dG8gc2l6ZTogY29udGVudERvY3VtZW50IG5vdCBhY2Nlc3NpYmxlJyk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFtcCA9ICh2YWx1ZTogbnVtYmVyLCBtaW4/OiBudW1iZXIsIG1heD86IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPCBtaW4pIHJldHVybiBtaW47XG4gICAgICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiBtYXgpIHJldHVybiBtYXg7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUGFyc2UgQ1NTIHNpemUgdmFsdWVzIHRvIG51bWJlcnNcbiAgICAgICAgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBpc05hTihwYXJzZWQpID8gdW5kZWZpbmVkIDogcGFyc2VkO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZVNpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghY29udGVudERvYykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5fYXV0b1NpemVPcHRpb25zO1xuXG4gICAgICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHBhcnNlU2l6ZShvcHRzPy5taW5XaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHBhcnNlU2l6ZShvcHRzPy5tYXhXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWluSGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IG1heEhlaWdodCA9IHBhcnNlU2l6ZShvcHRzPy5tYXhIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyTWluSGVpZ2h0ID0gb3B0cz8ubG9hZGVyTWluSGVpZ2h0ID8/IDUwO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIGV4cGxpY2l0IGRpbWVuc2lvbnM6IGhvc3Qgb3B0aW9ucyBcdTIxOTIgc2l6ZU1ldGEgZmlsbCBtb2RlIFx1MjE5MiB3aWR0aCBkZWZhdWx0cyB0byBcIjEwMCVcIlxuICAgICAgICAgICAgLy8gV2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCIgKGJsb2NrIGVsZW1lbnQgYmVoYXZpb3IpIHRvIHByZXZlbnQgdGhlIHNocmluay10by0wIG1lYXN1cmVtZW50IGJ1Zy5cbiAgICAgICAgICAgIC8vIEhlaWdodCBoYXMgbm8gZGVmYXVsdCBzbyBpdCBhdXRvLXNpemVzIHRvIGNvbnRlbnQuXG4gICAgICAgICAgICAvLyBPbmx5IHNpemVNZXRhIFwiMTAwJVwiIChmaWxsIG1vZGUpIGlzIHRyZWF0ZWQgYXMgZXhwbGljaXQgYW5kIGRpc2FibGVzIGF1dG8tc2l6aW5nLlxuICAgICAgICAgICAgLy8gUGl4ZWwgc2l6ZU1ldGEgdmFsdWVzIChlLmcuLCBoZWlnaHQ6IDIwMCkgYXJlIGluaXRpYWwgaGludHMsIE5PVCBleHBsaWNpdCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhRmlsbFdpZHRoID0gdGhpcy5zaXplTWV0YT8ud2lkdGggPT09IFwiMTAwJVwiID8gXCIxMDAlXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxIZWlnaHQgPSB0aGlzLnNpemVNZXRhPy5oZWlnaHQgPT09IFwiMTAwJVwiID8gXCIxMDAlXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGxpY2l0V2lkdGggPSBvcHRzPy5leHBsaWNpdFdpZHRoID8/IHNpemVNZXRhRmlsbFdpZHRoID8/IFwiMTAwJVwiO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9IG9wdHM/LmV4cGxpY2l0SGVpZ2h0ID8/IHNpemVNZXRhRmlsbEhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0V2lkdGggPSByZXNvbHZlZEV4cGxpY2l0V2lkdGggIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SGVpZ2h0ID0gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAvLyBEZXRlY3QgY29sbGFwc2VkIGRpbWVuc2lvbnMgZnJvbSBjb250YWluZXIgKHRoaXMuY29udGFpbmVyKVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY29sbGFwc2VkV2lkdGggPSBjb250YWluZXJSZWN0LndpZHRoID09PSAwO1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgY29sbGFwc2VkIGlmIGhlaWdodCBpcyAwIE9SIGVxdWFscyB0aGUgbG9hZGVyIG1pbkhlaWdodFxuICAgICAgICAgICAgY29uc3QgY29sbGFwc2VkSGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IDAgfHwgY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IGxvYWRlck1pbkhlaWdodDtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGRpbWVuc2lvbnMgdG8gYXV0by1zaXplOlxuICAgICAgICAgICAgLy8gLSBJZiBmb3JjZUF1dG9TaXplIGlzIHRydWUsIGF1dG8tc2l6ZSB1bmxlc3MgZXhwbGljaXQgZGltZW5zaW9uIGlzIHNldFxuICAgICAgICAgICAgLy8gLSBPdGhlcndpc2UsIGF1dG8tc2l6ZSBvbmx5IGlmIGNvbGxhcHNlZFxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b1dpZHRoID0gb3B0cz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0V2lkdGhcbiAgICAgICAgICAgICAgICA6IChjb2xsYXBzZWRXaWR0aCAmJiAhaGFzRXhwbGljaXRXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRBdXRvSGVpZ2h0ID0gb3B0cz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0SGVpZ2h0XG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkSGVpZ2h0ICYmICFoYXNFeHBsaWNpdEhlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIElmIG5vdGhpbmcgbmVlZHMgYXV0by1zaXppbmcsIGFwcGx5IGV4cGxpY2l0L3BlcmNlbnRhZ2UgZGltZW5zaW9uc1xuICAgICAgICAgICAgaWYgKCFzaG91bGRBdXRvV2lkdGggJiYgIXNob3VsZEF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRXaWR0aH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRIZWlnaHR9cHhgIDogJzEwMCUnO1xuXG4gICAgICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyByZXNvbHZlZEV4cGxpY2l0V2lkdGggOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIENTUyB0cmFuc2l0aW9ucyBvbiBpZnJhbWUgYW5kIGNvbnRhaW5lciBmb3IgdGhlIGVudGlyZVxuICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnQgKyBoZWlnaHQtc2V0dGluZyBjeWNsZS4gSG9zdCBhcHBzIG1heSBzZXQgYHRyYW5zaXRpb246IGFsbGBcbiAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIGFuaW1hdGUgdGhlIDBweCBjb2xsYXBzZSBhbmQgZmluYWwgaGVpZ2h0IGNoYW5nZSwgY2F1c2luZ1xuICAgICAgICAgICAgLy8gdmlzaWJsZSBqdW1wcyBkdXJpbmcgc2Nyb2xsLlxuICAgICAgICAgICAgY29uc3QgcHJldlRyYW5zaXRpb24gPSBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICAgICAgICAgICAgY29uc3QgcHJldkNvbnRhaW5lclRyYW5zaXRpb24gPSBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIC8vIFF1aWNrIHByZS1jaGVjazogcmVhZCBzY3JvbGxIZWlnaHQvV2lkdGggQkVGT1JFIGNvbGxhcHNpbmcgdGhlIGlmcmFtZS5cbiAgICAgICAgICAgIC8vIElmIGNvbnRlbnQgb25seSBncmV3IChzY3JvbGxIZWlnaHQgPiBpZnJhbWUgaGVpZ2h0KSwgd2UgY2FuIHNraXAgdGhlXG4gICAgICAgICAgICAvLyAwcHggY29sbGFwc2UgXHUyMDE0IHNjcm9sbEhlaWdodCBuYXR1cmFsbHkgZXhwYW5kcyBiZXlvbmQgdGhlIGlmcmFtZS5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVIZWlnaHQgPSBpZnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudElmcmFtZVdpZHRoID0gaWZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgY29uc3QgcHJlU2Nyb2xsSGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuICAgICAgICAgICAgY29uc3QgcHJlU2Nyb2xsV2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG5cbiAgICAgICAgICAgIGxldCBjb250ZW50V2lkdGggPSBwcmVTY3JvbGxXaWR0aDtcbiAgICAgICAgICAgIGxldCBjb250ZW50SGVpZ2h0ID0gcHJlU2Nyb2xsSGVpZ2h0O1xuXG4gICAgICAgICAgICBjb25zdCBoZWlnaHRHcmV3ID0gc2hvdWxkQXV0b0hlaWdodCAmJiBwcmVTY3JvbGxIZWlnaHQgPiBjdXJyZW50SWZyYW1lSGVpZ2h0ICsgMTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoR3JldyA9IHNob3VsZEF1dG9XaWR0aCAmJiBwcmVTY3JvbGxXaWR0aCA+IGN1cnJlbnRJZnJhbWVXaWR0aCArIDE7XG5cbiAgICAgICAgICAgIC8vIEZvciBub24tZ3JvdyBjYXNlcyAoc2hyaW5rIG9yIG5vLWNoYW5nZSksIHdlIG11c3QgY29sbGFwc2UgdG8gMHB4IHRvXG4gICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSB0cnVlIGNvbnRlbnQgaGVpZ2h0LiBzY3JvbGxIZWlnaHQgY2FuIG5ldmVyIGRlY3JlYXNlIGJlbG93XG4gICAgICAgICAgICAvLyB0aGUgaWZyYW1lJ3MgY2xpZW50SGVpZ2h0LCBzbyBzaHJpbmsgaXMgdW5kZXRlY3RhYmxlIHdpdGhvdXQgY29sbGFwc2luZy5cbiAgICAgICAgICAgIC8vIFdpdGggdHJhbnNpdGlvbnMgZGlzYWJsZWQgKyBjb250YWluZXIgbWluLWhlaWdodCBoZWxkLCB0aGUgY29sbGFwc2VcbiAgICAgICAgICAgIC8vIGlzIGludmlzaWJsZSAobm8gbGF5b3V0IHNoaWZ0LCBubyBhbmltYXRpb24pLlxuICAgICAgICAgICAgY29uc3QgbmVlZHNIZWlnaHRDb2xsYXBzZSA9IHNob3VsZEF1dG9IZWlnaHQgJiYgIWhlaWdodEdyZXc7XG4gICAgICAgICAgICBjb25zdCBuZWVkc1dpZHRoQ29sbGFwc2UgPSBzaG91bGRBdXRvV2lkdGggJiYgIXdpZHRoR3JldztcblxuICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UgfHwgbmVlZHNXaWR0aENvbGxhcHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gSG9sZCB0aGUgY29udGFpbmVyJ3MgbWluLWhlaWdodC93aWR0aCBkdXJpbmcgbWVhc3VyZW1lbnQgdG8gcHJldmVudFxuICAgICAgICAgICAgICAgIC8vIGxheW91dCBzaGlmdCAoZWxlbWVudHMgYmVsb3cgdGhlIGlmcmFtZSB3b24ndCBqdW1wKS5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TWluSGVpZ2h0ID0gY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodDtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TWluV2lkdGggPSBjb250YWluZXIuc3R5bGUubWluV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UpIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBgJHtjdXJyZW50SWZyYW1lSGVpZ2h0fXB4YDtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNXaWR0aENvbGxhcHNlKSBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSBgJHtjdXJyZW50SWZyYW1lV2lkdGh9cHhgO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UpIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNXaWR0aENvbGxhcHNlKSBpZnJhbWUuc3R5bGUud2lkdGggPSAnMHB4JztcblxuICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcbiAgICAgICAgICAgICAgICBjb250ZW50SGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIGNvbGxhcHNpbmcgdG8gMHB4IGdhdmUgYSBuZWFyLXplcm8gbWVhc3VyZW1lbnQsIHRoZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAvLyBsaWtlbHkgaGFzIGBoZWlnaHQ6IDEwMCVgIGNoYWlucyAoaHRtbCA+IGJvZHkgPiAuYXBwLWNvbnRhaW5lcikgdGhhdCBjYXNjYWRlZFxuICAgICAgICAgICAgICAgIC8vIHRoZSBjb2xsYXBzZSBpbnRvIGFsbCBjaGlsZHJlbi4gUmV0cnkgd2l0aCBhIG51Y2xlYXIgb3ZlcnJpZGUgdGhhdCBmb3JjZXMgYWxsXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgdG8gaW50cmluc2ljIHNpemluZy4gVGhpcyBpcyBvbmx5IGEgZmFsbGJhY2sgYmVjYXVzZSB0aGUgb3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAvLyBicmVha3MgZXhwbGljaXQgcGl4ZWwgaGVpZ2h0cyAoZS5nLiA4cHggaW5kaWNhdG9yIGRvdHMgXHUyMTkyIDBweCkuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZHNOdWNsZWFySGVpZ2h0ID0gbmVlZHNIZWlnaHRDb2xsYXBzZSAmJiBjb250ZW50SGVpZ2h0IDwgMjtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkc051Y2xlYXJXaWR0aCA9IG5lZWRzV2lkdGhDb2xsYXBzZSAmJiBjb250ZW50V2lkdGggPCAyO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJIZWlnaHQgfHwgbmVlZHNOdWNsZWFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVhc3VyZVN0eWxlID0gY29udGVudERvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUuaWQgPSAnX19teW9wX21lYXN1cmUnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBydWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhckhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMucHVzaCgnaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQnLCAnbWluLWhlaWdodDogMCAhaW1wb3J0YW50JywgJ21heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMucHVzaCgnd2lkdGg6IGF1dG8gIWltcG9ydGFudCcsICdtaW4td2lkdGg6IDAgIWltcG9ydGFudCcsICdtYXgtd2lkdGg6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS50ZXh0Q29udGVudCA9IGAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsgJHtydWxlcy5qb2luKCc7ICcpfTsgZmxleC1iYXNpczogYXV0byAhaW1wb3J0YW50OyBmbGV4LWdyb3c6IDAgIWltcG9ydGFudDsgfWA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnREb2MuaGVhZC5hcHBlbmRDaGlsZChtZWFzdXJlU3R5bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcblxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBjb250YWluZXIgY29uc3RyYWludHMgaW1tZWRpYXRlbHkgKHNhbWUgZnJhbWUsIGJlZm9yZSBwYWludClcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gcHJldk1pbkhlaWdodDtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSBwcmV2TWluV2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2xhbXAoY29udGVudFdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY2xhbXAoY29udGVudEhlaWdodCwgbWluSGVpZ2h0LCBtYXhIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBTZXQgYXV0by1zaXplZCBkaW1lbnNpb25zIHRvIG1lYXN1cmVkIHZhbHVlcywgbm9uLWF1dG8gdG8gZXhwbGljaXQvMTAwJVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9XaWR0aCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRIZWlnaHR9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSByZWZsb3cgc28gdGhlIGZpbmFsIGRpbWVuc2lvbnMgYXJlIGFwcGxpZWQgd2l0aG91dCB0cmFuc2l0aW9uLFxuICAgICAgICAgICAgLy8gdGhlbiByZXN0b3JlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGlmcmFtZS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2Q29udGFpbmVyVHJhbnNpdGlvbjtcblxuICAgICAgICAgICAgLy8gRG9uJ3QgZm9yY2Ugb3ZlcmZsb3cgXHUyMDE0IGxldCB0aGUgY29tcG9uZW50L3BhcmVudCBjb250cm9sIHNjcm9sbGluZy5cbiAgICAgICAgICAgIC8vIE9ubHkgc2V0IG92ZXJmbG93OiBhdXRvIHdoZW4gY29udGVudCBleGNlZWRzIG1heCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgIGNvbnN0IGlzV2lkdGhDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9XaWR0aCAmJiBtYXhXaWR0aCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRXaWR0aCA+IG1heFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgaXNIZWlnaHRDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9IZWlnaHQgJiYgbWF4SGVpZ2h0ICE9PSB1bmRlZmluZWQgJiYgY29udGVudEhlaWdodCA+IG1heEhlaWdodDtcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WCA9IGlzV2lkdGhDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuICAgICAgICAgICAgY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaXNIZWlnaHRDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuXG4gICAgICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogc2hvdWxkQXV0b1dpZHRoLFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IHNob3VsZEF1dG9IZWlnaHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEluaXRpYWwgc2l6ZSAocnVuIHN5bmNocm9ub3VzbHksIG5vdCBkZWJvdW5jZWQpXG4gICAgICAgIHVwZGF0ZVNpemUoKTtcblxuICAgICAgICAvLyBTdG9yZSB1cGRhdGVTaXplIGZvciByZWVudHJhbnQgY2FsbHNcbiAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUgPSB1cGRhdGVTaXplO1xuXG4gICAgICAgIC8vIERlYm91bmNlIG9ic2VydmVyIGNhbGxiYWNrcyB2aWEgckFGIFx1MjAxNCBhdCBtb3N0IG9uZSB1cGRhdGVTaXplIHBlciBmcmFtZS5cbiAgICAgICAgLy8gUHJldmVudHMgbGF5b3V0IHRocmFzaGluZyBmcm9tIGhpZ2gtZnJlcXVlbmN5IG11dGF0aW9ucyAoZS5nLiBDU1MgYW5pbWF0aW9ucykuXG4gICAgICAgIGxldCByYWZJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzY2hlZHVsZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyYWZJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gT2JzZXJ2ZSBmb3IgY2hhbmdlc1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiBzY2hlZHVsZVVwZGF0ZSgpKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuYm9keSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmRvY3VtZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gTXV0YXRpb25PYnNlcnZlciBjYXRjaGVzIERPTSBjb250ZW50IGNoYW5nZXMgKGUuZy4gcmVtb3ZpbmcgbGlzdCBpdGVtcywgdG9nZ2xpbmcgdmlld3MpXG4gICAgICAgIC8vIHRoYXQgZG9uJ3QgdHJpZ2dlciBSZXNpemVPYnNlcnZlciBiZWNhdXNlIHRoZSBib2R5IGJveC1zaXplIHN0YXlzIHRoZSBzYW1lXG4gICAgICAgIC8vIChib2R5IGZpbGxzIGlmcmFtZSwgaWZyYW1lIGhhc24ndCBzaHJ1bmsgeWV0KS5cbiAgICAgICAgLy8gYGF0dHJpYnV0ZXM6IHRydWVgIGNhdGNoZXMgQ1NTIGNsYXNzL3N0eWxlIGNoYW5nZXMgKGUuZy4gZGlzcGxheTpub25lIHRvZ2dsaW5nIHZpZXdzKS5cbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHNjaGVkdWxlVXBkYXRlKCkpO1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGlmIChyYWZJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuICAgICAgICAgICAgICAgIHJhZklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IGNsZWFudXA7XG4gICAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgIH1cblxuICAgIHNldFNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCArICdweCc7XG5cblxuICAgICAgICAgICAgLy9UT0RPOiBmaXggdGhhdCBoYWNrLCBrZWVwIHRoZSBmdW5jdGlvbiBpbiByaWdodCBmb3JtYXQgd2hpbGUgbWluaWZpZWQgOihcbiAgICAgICAgICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZFxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVG8gZW5zdXJlIGl0J3Mgbm90IG9wdGltaXplZCBhd2F5LCB5b3UgY2FuIGNhbGwgaXQgYXQgbGVhc3Qgb25jZVxuICAgICAgICAgICAgbGV0IHggPSBub09wKCk7XG4gICAgICAgICAgICB4Kys7XG4gICAgICAgICAgICB4LS07XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIGAke3dpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodH1weGA7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQgKzEgP1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAsIHdpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgKyB4ICsgJ3B4J1xuXG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSByZXQuY29udGVudDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcbiAgICAgICAgLy9UT0RPIDogPyE/ISBzaG91bGQgaXQgYmUgaGVyZSA/XG4gICAgICAgIGlmIChtZXNzYWdlXy5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlXyBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKVxuICAgICAgICAgICAgdGhpc1t0eXBlZE1lc3NhZ2UubWV0aG9kXSgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2sgOihcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICBtZXNzYWdlXy5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UobWVzc2FnZV8sICcqJyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLk11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG4gICAgICAgICAgICB8fCBpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgIC8vdGhpcy5zZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fYXV0b1NpemVDbGVhbnVwKSB7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAoKTtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNvTXNnSGFuZGxlcikge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9pc29Nc2dIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuX2lzb01zZ0hhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQodGhpcy5JZnJhbWVFbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyVHlwZX0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wTG9hZGVyIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcExvYWRlciBpbXBsZW1lbnRzIElNeW9wTG9hZGVyIHtcbiAgICBhYnN0cmFjdCB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBhYnN0cmFjdCBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG5cbiAgICBhcHBlbmRDaGlsZCA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMucmVsYXRpdmUuY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG9wdGlvbnMucmVsYXRpdmUuY2hpbGQ/Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSAodXJsOiBzdHJpbmcsIHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDcmVhdGUgYSBVUkwgb2JqZWN0XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgLy8gQWRkIHRoZSBxdWVyeSBwYXJhbWV0ZXJcbiAgICB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChwYXJhbSwgdmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIFVSTFxuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLklmcmFtZUxvYWRlclxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICBsZXQgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgdHlwZWRMb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZU5hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCduZWVkcyB0byBsb2FkIGludG8gYW4gZXhzaXN0aW5nIElmcmFtZS4uLicsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHR5cGVkTG9hZGVyQ29uZmlnLnVybFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgICAgIC8vIFNldCBhbGwgc3R5bGVzIEJFRk9SRSBhcHBlbmRpbmcgdG8gcHJldmVudCBmbGFzaCBhdCB3cm9uZyBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgaWZyYW1lU3R5bGVzID0gYFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICBpbnNldDogMDtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJzEwMCUnIDogdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0fTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGlmcmFtZVN0eWxlcztcblxuICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgYXR0cmlidXRlcyBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5lbGVtZW50QXR0cmlidXRlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBpc3N1ZSB0byBsb2FkIGlmcmFtZSBpbnNpZGUgYW4gaWZyYW1lIHdpdGggdGhlIHNhbWUgdXJsXG4gICAgICAgICAgICBsZXQgdXJsMmxvYWQgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykudXJsO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9oYXNQYXJlbnQpXG4gICAgICAgICAgICAgICAgdXJsMmxvYWQgPSBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9teW9wLWNvbXBcIiwgdW5pcUlkKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB1cmwybG9hZDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy8gICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tSWQpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy9OTyA6IElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMy4zNic7IiwgImltcG9ydCB7QmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlciwgSG9zdGVkQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCwgUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pj4ge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZVRvSG9zdDogYW55LCBwdWJsaWMgY29udGV4dDogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pikge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbm5lckV4ZWN1dG9yOiAoZXZlbnQ6IFQsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHZvaWQ7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogVCkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBpZiAoZXZlbnQuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQuZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgc291cmNlIGlkLCB0aGluayBhYm91dCB0aGF0ID9cbiAgICAgICAgICAgICAgICBjb25zdCBfbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBldmVudC5kZXN0aW5hdGlvbiA/IGV2ZW50LmRlc3RpbmF0aW9uIDogZXZlbnQuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IGV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZSA6IGV2ZW50LmRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbm5lckV4ZWN1dG9yKGV2ZW50LCB0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQsIF9tZXNzYWdlVG9Ib3N0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcEF0dHJpYnV0ZXMgPSB7XG4gICAgaWQ6ICdteW9wLWlkJ1xufVxuIiwgImltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7UmVmfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRzQnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtyZWYucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaXJzdEVsZW1lbnRCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldEVsZW1lbnRzQnlSZWYocmVmLCBlbCk7XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudHMuaXRlbSgwKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpXG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxNeW9wRWxlbWVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTaGFkb3dSb290UmVmIGV4dGVuZHMgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lciwgc2hhZG93Um9vdCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG5cbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IE15b3BFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IHRha2UgdGhhdCBiYWNrIHRvIHRoZSBkYXNoYm9hcmQ/XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0sIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG5cbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd3YyByZWN0JywgIGl0ZW0ucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0ub2Zmc2V0VG9wLCBpdGVtLm9mZnNldExlZnQpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfTtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLFxuICAgIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UsXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGluIGZhY3Qgd2hlbiBydW5uaW5nIGluIFdlYkNvbXBvbmVudCB3ZSBjYW4gdHJhbnNmZXIgdGhlIG9yaWdpbmFsIGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgdXNpbmcgbWFrZVNlcmlhbGl6YWJsZSBmb3IgbmVzdGVkIGNhc2VzLCB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsICBtYWtlU2VyaWFsaXphYmxlKGUsIGV2ZW50LnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZVwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZj8ucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuXG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZXZlbnQub3B0aW9ucy5pZCkhO1xuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8vLz4+Pj5cbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKGBmYWlsZWQgdG8gZmluZCAke2V2ZW50Lm9wdGlvbnMuaWR9IGluIG1lbSBzY29wZWAsIGhvc3RTREspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3dlIGhhdmUgdGhlIHJlZiBjb21wb25lbnQgaW4gb3VyIEhvc3RTREsgKHNhbWUgbWVtb3J5IHdoZW4gdXNpbmcgd2ViY29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vICByZWZDb21wb25lbnQucGFyZW50ID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy9kZWxldGUgdGhlIHJlZiBjb21wb25lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGhvc3RTREsuY29tcG9uZW50cy5pbmRleE9mKHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBob3N0U0RLLmNvbXBvbmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCByZW1vdmVkIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgdXNpbmcgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm8gbmVlZCB0aGlzLCBwYXNzIG9wdGlvbnMgZnJvbSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvL2ltcGxlbWVudGF0aW9uQ29tcG9uZW50LmlkID0gZXZlbnQucHJlZGVmaW5lZElkO1xuICAgICAgICAgICAgICAgIC8vcmVmQ29tcG9uZW50LmlkICs9ICcuJztcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vdCByZWFsbHkgbmVlZGVkID9cbiAgICAgICAgICAgICAgICAvLyBhd2FpdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKClcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCByZXBsaWVyOiAoZGF0YTogYW55KSA9PiB2b2lkLCByb290UmVmOiBSb290UmVmKSA9PiB7XG4gICAgY29uc3QgX19zY3JpcHRJbnB1dHMgPSBldmVudC5zY3JpcHRJbnB1dHMgPyBldmVudC5zY3JpcHRJbnB1dHMgOiB7fVxuICAgIF9fc2NyaXB0SW5wdXRzLm1ha2VTZXJpYWxpemFibGUgPSBtYWtlU2VyaWFsaXphYmxlO1xuXG4gICAgX19zY3JpcHRJbnB1dHMuc2VuZCA9IHJlcGxpZXI7XG4gICAgX19zY3JpcHRJbnB1dHMucm9vdFJlZiA9IHJvb3RSZWY7XG4gICAgX19zY3JpcHRJbnB1dHMuX19zY3JpcHRJbnB1dHMgPSBfX3NjcmlwdElucHV0cztcblxuICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke2V2ZW50LnNjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICBjb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgLy8gY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gRnVuY3Rpb24oJ3NlbmQnLCAncm9vdFJlZicsJ19fc2NyaXB0SW5wdXRzJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBldmVudC5jb250ZW50ID8gZXZlbnQuY29udGVudCA6ICcnKVxuICAgIC8vY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKHJlcGxpZXIsIHJvb3RSZWYsIF9fc2NyaXB0SW5wdXRzLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSk7XG4gICAgcmVwbGllcihyZXQpO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBzaGFkb3dSb290UmVmKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShnZXRJbnB1dFZhbHVlKGl0ZW0pKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tICdAbXlvcC9zZGsvd2ViY29tcG9uZW50JztcbiAqIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290IFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkNvbXBvbmVudFNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgPSB0cnVlO1xuXG4gICAgLy93aGVuIG5ldyB3ZWIgY29tcG9uZW50IGNyZWF0ZWQuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2sgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2hhZG93OiBTaGFkb3dSb290KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZS5kYXRhID8gZS5kYXRhIDogZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY3ZpZWQgd2ViY29tcG9uZW50X21lc3NhZ2Ugd2l0aCB3cm9uZyB0eXBlJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIGNvbnRhaW5lciAvIGNvbXBvZW5udCBpZGVudGlmaWVyIGZvciBtdWx0aWwgY29tcG9uZW50cyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhlKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0uY29udGV4dCA9IG5ldyBTaGFkb3dSb290UmVmKGNvbnRhaW5lciwgc2hhZG93KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIuY29udGV4dCA9IHRoaXMuc2hhZG93Um9vdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLiByYWNlIGNvbmRpdGlvbiB3aXRoIGhvc3QubG9hZCB3aGVuIG1vZHVsZSBsb2FkZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgICAgIH0sIDEpXG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuICAgICAgICAvL21lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgLy9cbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgLy90aGlzLm15Q29tcG9uZW50SWRcbiAgICAgICAgLy90aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzXG4gICAgfVxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdXZWJDb21wb25lbnRTREsnLCBXZWJDb21wb25lbnRTREspO1xuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzLFxuICAgIFJlbmRlck1vZGUsIFJlbmRlclBvbGljeVxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzXCI7XG5pbXBvcnQge0VNQkVEREVEX1NES19DT05URU5ULCBIQVNfRU1CRURERURfU0RLfSBmcm9tIFwiLi4vZW1iZWRkZWRTREsudHNcIjtcbi8vaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gXCIuLi8uLi9TREsudHNcIjtcblxuY29uc3QgTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUiA9ICc8IS0tIG15b3Atd2ViLWNvbXBvbmVudCAtLT4nO1xuY29uc3QgTVlPUF9XRUJfQ09NUE9ORU5UX1NDUklQVF9JRCA9ICdteW9wLXdlYi1jb21wb25lbnQnO1xuXG4vLyBUcmFjayBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudCBzY3JpcHRzIHRvIHByZXZlbnQgZG91YmxlIHJlZ2lzdHJhdGlvbi5cbi8vIE1hcHMgc2NyaXB0SWQgLT4gdGhlIHRhZyBuYW1lIHRoYXQgc2NyaXB0IHJlZ2lzdGVyZWQuIFRoZSB0YWcgTVVTVCBiZSByZW1lbWJlcmVkIHBlclxuLy8gc2NyaXB0OiB3aW5kb3cuX19NWU9QX1RBR19OQU1FX18gaXMgYSBzaW5nbGUgZ2xvYmFsIHNsb3QgdGhhdCBldmVyeSBleHRyYWN0ZWQgY29tcG9uZW50XG4vLyBvdmVyd3JpdGVzLCBzbyBvbiBhIHJlLW1vdW50IChzY3JpcHQgc2tpcHBlZCkgaXQgaG9sZHMgd2hpY2hldmVyIGNvbXBvbmVudCByYW4gbGFzdC5cbmNvbnN0IGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbmNvbnN0IHNlZW46IHN0cmluZ1tdID0gW107XG5sZXQgc2RrO1xuY29uc3QgZ2V0SW5pdGlhdGVkU2RrID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2RrKSB7XG4gICAgICAgIC8vY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSBhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKVxuICAgICAgICBzZGsgPSBuZXcgV2ViQ29tcG9uZW50U0RLKCk7XG4gICAgICAgIHNkay5pbml0KCk7XG4gICAgfVxuICAgIHJldHVybiBzZGs7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbFN0cmluZzogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpOiBuZXcgKCkgPT4gSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBTaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm9wZW4gPyAnb3BlbicgOiAnY2xvc2VkJztcbiAgICAgICAgICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuYXR0YWNoU2hhZG93KHttb2RlfSk7XG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2sodGhpcywgc2hhZG93KTtcbiAgICAgICAgICAgICAgICBzaGFkb3cuaW5uZXJIVE1MID0gaHRtbFN0cmluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmNvbnN0IGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudCA9IChjb21wb25lbnROYW1lOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKSA9PiB7XG4gICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGNvbXBvbmVudE5hbWUsIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbCwgU2hhZG93Um9vdE1vZGUpKTtcbiAgICBjb25zb2xlLmxvZyhgZGVmaW5lKCcke2NvbXBvbmVudE5hbWV9Jykgd2FzIGNhbGxlZCwgd2ViIGNvbXBvbmVudCByZWFkeSB0byB1c2VgKTtcbn1cblxuY29uc3QgdG9XZWJDb21wb25lbnROYW1lID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBzdHJcbiAgICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIHVwcGVyY2FzZSBsZXR0ZXJzXG4gICAgICAgIC5yZXBsYWNlKC8oXFxkKykvZywgJy0kMScpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIGRpZ2l0c1xuICAgICAgICAudG9Mb3dlckNhc2UoKTsgLy8gQ29udmVydCB0byBsb3dlcmNhc2Vcbn1cblxuY29uc3QgdG9DdXN0b21FbGVtZW50TmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBuYW1lID0gdG9XZWJDb21wb25lbnROYW1lKG5hbWUpO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL18vZywgJy0nKTtcbn1cblxubGV0IHBhcnNlcjogRE9NUGFyc2VyOyAvLyA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IGNsYXNzIEhUTUxDb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSFRNTExvYWRlclxuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0IGlmIEhUTUwgaXMgYSBNeW9wIFdlYiBDb21wb25lbnQgKHN0YXJ0cyB3aXRoIG1hcmtlciBjb21tZW50KVxuICAgICAqL1xuICAgIHByaXZhdGUgaXNNeW9wV2ViQ29tcG9uZW50KGh0bWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaHRtbC50cmltU3RhcnQoKS5zdGFydHNXaXRoKE1ZT1BfV0VCX0NPTVBPTkVOVF9NQVJLRVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgaG93IHRoaXMgY29tcG9uZW50IHNob3VsZCByZW5kZXIsIGFwcGx5aW5nIHRoZSBob3N0IHJlbmRlciBwb2xpY3kuXG4gICAgICogUHJlY2VkZW5jZTogb3B0aW9ucy5yZW5kZXJQb2xpY3kgKHBlci1jYWxsKSBmdWxseSByZXBsYWNlcyB0aGUgZ2xvYmFsXG4gICAgICogaG9zdFNESy5zZXRSZW5kZXJQb2xpY3kgXHUyMDE0IHNvIGFuIGFwcCBjYW4gcmVzdHJpY3QgZ2xvYmFsbHkgYW5kIGFsbG93IHNwZWNpZmljcy5cbiAgICAgKiBXaXRoIG5vIHBvbGljeSBzZXQsIGJlaGF2aW9yIGlzIHVuY2hhbmdlZCBmcm9tIGJlZm9yZSAobWFya2VyIFx1MjFEMiB3ZWIgY29tcG9uZW50KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHJlc29sdmVSZW5kZXJNb2RlKFxuICAgICAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgc2tpbjogSVNraW5Db25maWcsXG4gICAgICAgIGxvYWRlckNvbmZpZzogSUhUTUxMb2FkZXJDb25maWcsXG4gICAgICAgIGlzV2ViQ29tcG9uZW50OiBib29sZWFuLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyxcbiAgICApOiBQcm9taXNlPHsgbW9kZTogUmVuZGVyTW9kZSB8IGZhbHNlOyBpc29sYXRlOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkTW9kZTogUmVuZGVyTW9kZSA9IGlzV2ViQ29tcG9uZW50XG4gICAgICAgICAgICA/ICd3ZWJDb21wb25lbnQnXG4gICAgICAgICAgICA6ICgobG9hZGVyQ29uZmlnLmlzb2xhdGlvbiB8fCBvcHRpb25zPy5pc29sYXRpb24pID8gJ2lzb2xhdGVkSWZyYW1lJyA6ICdpZnJhbWUnKTtcblxuICAgICAgICAvLyBwZXItY2FsbCBwb2xpY3kgd2luczsgZWxzZSBnbG9iYWwgcG9saWN5IG9uIHRoZSBob3N0IFNESyBzaW5nbGV0b24uXG4gICAgICAgIGNvbnN0IHBvbGljeTogUmVuZGVyUG9saWN5IHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAgIG9wdGlvbnM/LnJlbmRlclBvbGljeSA/PyAod2luZG93IGFzIGFueSk/Lm15b3A/Lmhvc3RTREs/LmdldFJlbmRlclBvbGljeT8uKCk7XG5cbiAgICAgICAgY29uc3QgbW9kZTogUmVuZGVyTW9kZSB8IGZhbHNlID0gcG9saWN5XG4gICAgICAgICAgICA/IGF3YWl0IHBvbGljeSh7IGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIHJlcXVlc3RlZE1vZGUsIGlzV2ViQ29tcG9uZW50IH0pXG4gICAgICAgICAgICA6IHJlcXVlc3RlZE1vZGU7XG5cbiAgICAgICAgcmV0dXJuIHsgbW9kZSwgaXNvbGF0ZTogbW9kZSA9PT0gJ2lzb2xhdGVkSWZyYW1lJyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbi1mcmFtZSBicmlkZ2UgZm9yIGlzb2xhdGVkIGNvbXBvbmVudHMuIFJ1bnMgaW5zaWRlIHRoZSBzYW5kYm94ZWRcbiAgICAgKiAob3BhcXVlLW9yaWdpbikgaWZyYW1lLCB0cmFuc2xhdGluZyB0aGUgc2FtZSBhdXRob3ItZmFjaW5nIGNvbnRyYWN0IHRvL2Zyb21cbiAgICAgKiBwb3N0TWVzc2FnZSBzaW5jZSB0aGUgaG9zdCBoYXMgbm8gc2FtZS1vcmlnaW4gYWNjZXNzOlxuICAgICAqICAgXHUyMDIyIGRhdGEtaW4gOiBwYXJlbnQgcG9zdHMge3R5cGU6J215b3A6aW5pdCd9IFx1MjE5MiBjYWxscyB3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZVxuICAgICAqICAgICAgICAgICAgICAgKHBsdXMgYSBiYWtlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgZmlyc3QgcmVuZGVyKVxuICAgICAqICAgXHUyMDIyIGRhdGEtb3V0OiB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciBcdTIxOTIgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidteW9wOmN0YSd9KVxuICAgICAqICAgXHUyMDIyIHJlc2l6ZSAgOiBSZXNpemVPYnNlcnZlciBcdTIxOTIgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidteW9wOnNpemUnfSlcbiAgICAgKlxuICAgICAqIFRPRE8oZGV2LWV4dGVuc2lvbik6IHRoZSBpc29sYXRlZCBwYXRoIGRlbGliZXJhdGVseSBza2lwcyB0aGUgc2FtZS1vcmlnaW5cbiAgICAgKiBkYXRhU2NyaXB0LCBzbyBpdCBuZXZlciBwb3N0cyB0aGUgYE1ZT1BfUFJFSU5KRUNURURfSU5JVGAgbWVzc2FnZSB0aGUgTXlvcCBkZXZcbiAgICAgKiBleHRlbnNpb24gbGlzdGVucyBmb3IgdG8gbG9nIHRoZSBJTklUSUFMIHJlbmRlciAoYGluaXQqYCkuIExhdGVyIGluaXQgdXBkYXRlcyBhbmRcbiAgICAgKiBhbGwgQ1RBcyBhcmUgc3RpbGwgdHJhY2tlZCAodGhlIGV4dGVuc2lvbiB3cmFwcyBgY29tcC5wcm9wc2AsIHdoaWNoIG91ciBpc29sYXRlZFxuICAgICAqIGNvbm5lY3RQcm9wcyBicmFuY2ggcm91dGVzIHRocm91Z2gpLCBzbyBvbmx5IHRoZSBmaXJzdC1yZW5kZXIgcGF5bG9hZCBpcyBtaXNzaW5nXG4gICAgICogZnJvbSB0aGUgZXh0ZW5zaW9uJ3MgYWN0aXZpdHkgbG9nIGZvciBpc29sYXRlZCBjb21wb25lbnRzLiBDbG9zaW5nIHRoaXMgd291bGQgYmUgYVxuICAgICAqIH4xLWxpbmUgYHBhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonTVlPUF9QUkVJTkpFQ1RFRF9JTklUJywgcGF5bG9hZDp7ZGF0YX19KWAgaW5zaWRlXG4gICAgICogZmx1c2hJbml0aWFsKCkgYmVsb3cgXHUyMDE0IGludGVudGlvbmFsbHkgTk9UIGRvbmUgZm9yIG5vdyB0byBhdm9pZCBhZGRpbmcgZXh0ZW5zaW9uLW9ubHlcbiAgICAgKiB0cmFmZmljIHRvIHRoZSBjb21wb25lbnQgcnVudGltZS4gV2ViIGNvbXBvbmVudHMgaGF2ZSB0aGUgc2FtZSBpbml0aWFsLWluaXQgZ2FwXG4gICAgICogKGluaXRXaXRoRGF0YSBpcyBjYWxsZWQgb24gdGhlIGVsZW1lbnQsIG5vdCB2aWEgY29tcC5wcm9wcykgYW5kIGl0IHByZWRhdGVzIHRoaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZElzb2xhdGlvbkJyaWRnZShpbml0aWFsRGF0YUxpdGVyYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgPHNjcmlwdD5cbiAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9faW5pdGlhbCA9ICR7aW5pdGlhbERhdGFMaXRlcmFsfTtcbiAgICAgICAgICAgICAgICB2YXIgX19wZW5kaW5nO1xuICAgICAgICAgICAgICAgIC8vIGRhdGEtb3V0IChjdGEpXG4gICAgICAgICAgICAgICAgd2luZG93Lm15b3BfY3RhX2hhbmRsZXIgPSBmdW5jdGlvbiAoYWN0aW9uLCBwYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IHBhcmVudC5wb3N0TWVzc2FnZSh7IF9fbXlvcDogdHJ1ZSwgdHlwZTogJ215b3A6Y3RhJywgYWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWQgfSwgJyonKTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxJbml0KGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykgeyB3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZShkYXRhKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBkYXRhLWluIChpbml0IHVwZGF0ZXMpXG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkIHx8IGQuX19teW9wICE9PSB0cnVlKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChkLnR5cGUgPT09ICdteW9wOmluaXQnKSB7IGlmICghY2FsbEluaXQoZC5kYXRhKSkgX19wZW5kaW5nID0gZC5kYXRhOyB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gZmlyc3QgcmVuZGVyOiB1c2UgYSBwZW5kaW5nIHVwZGF0ZSBpZiBvbmUgYXJyaXZlZCwgZWxzZSB0aGUgYmFrZWQgaW5pdGlhbCBkYXRhXG4gICAgICAgICAgICAgICAgKGZ1bmN0aW9uIGZsdXNoSW5pdGlhbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAoX19wZW5kaW5nICE9PSB1bmRlZmluZWQpID8gX19wZW5kaW5nIDogX19pbml0aWFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsSW5pdChkYXRhKSkgeyBfX3BlbmRpbmcgPSB1bmRlZmluZWQ7IF9faW5pdGlhbCA9IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHJlcXVlc3RBbmltYXRpb25GcmFtZShmbHVzaEluaXRpYWwpO1xuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgICAgLy8gcmVzaXplIChyZXBvcnQgY29udGVudCBzaXplKVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRlbnRIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1lYXN1cmUgdGhlIEJPRFkgKGNvbnRlbnQgYm94KS4gZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCBpbmNsdWRlc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaWZyYW1lIHZpZXdwb3J0IFx1MjAxNCB3aGljaCB3ZSdyZSBkcml2aW5nIFx1MjAxNCBzbyBpdCB3b3VsZCByZXBvcnQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZnJhbWUgaGVpZ2h0LCBub3QgdGhlIGNvbnRlbnQsIGFuZCBuZXZlciBzaHJpbmsuXG4gICAgICAgICAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHJldHVybiBNYXRoLm1heChiLnNjcm9sbEhlaWdodCwgYi5vZmZzZXRIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFNpemUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbXlvcDogdHJ1ZSwgdHlwZTogJ215b3A6c2l6ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjb250ZW50SGVpZ2h0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gT2JzZXJ2ZSB0aGUgQk9EWSAocmVmbG93cyB3aXRoIGNvbnRlbnQpIFx1MjAxNCBub3QgZG9jdW1lbnRFbGVtZW50LCB3aG9zZSBib3ggaXNcbiAgICAgICAgICAgICAgICAvLyB0aGUgaWZyYW1lIHZpZXdwb3J0IGFuZCB3b3VsZCBmZWVkIGJhY2sgaW50byBhIHJlc2l6ZSBsb29wLiBBIE11dGF0aW9uT2JzZXJ2ZXJcbiAgICAgICAgICAgICAgICAvLyBjYXRjaGVzIGNvbnRlbnQgc3dhcHMgKGUuZy4gaW5uZXJIVE1MIHJlLXJlbmRlcikgdGhhdCBkb24ndCBjaGFuZ2UgYm9keSdzIGJveC5cbiAgICAgICAgICAgICAgICBpZiAod2luZG93LlJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IHZhciBfX3JvID0gbmV3IFJlc2l6ZU9ic2VydmVyKHBvc3RTaXplKTsgaWYgKGRvY3VtZW50LmJvZHkpIF9fcm8ub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgbmV3IE11dGF0aW9uT2JzZXJ2ZXIocG9zdFNpemUpLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGF0dHJpYnV0ZXM6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcG9zdFNpemUpO1xuICAgICAgICAgICAgICAgIHBvc3RTaXplKCk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICA8L3NjcmlwdD5gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgdGhlIHdlYiBjb21wb25lbnQgc2NyaXB0IGNvbnRlbnQgZnJvbSBIVE1MXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0V2ViQ29tcG9uZW50U2NyaXB0KGh0bWw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoTVlPUF9XRUJfQ09NUE9ORU5UX1NDUklQVF9JRCk7XG4gICAgICAgIHJldHVybiBzY3JpcHQ/LnRleHRDb250ZW50IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgb24gdGhlIGhvc3QgZG9jdW1lbnQuXG4gICAgICogUmV0dXJucyB0aGUgY3VzdG9tIGVsZW1lbnQgdGFnIG5hbWUgdGhpcyBzY3JpcHQgcmVnaXN0ZXJlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGV4ZWN1dGVXZWJDb21wb25lbnRTY3JpcHQoc2NyaXB0Q29udGVudDogc3RyaW5nLCBzY3JpcHRJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBleGVjdXRlZCAoYnkgc2NyaXB0IGNvbnRlbnQgaGFzaClcbiAgICAgICAgY29uc3QgY2FjaGVkVGFnTmFtZSA9IGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuZ2V0KHNjcmlwdElkKTtcbiAgICAgICAgaWYgKGNhY2hlZFRhZ05hbWUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGFscmVhZHkgZXhlY3V0ZWQgZm9yICR7c2NyaXB0SWR9LCByZXVzaW5nIDwke2NhY2hlZFRhZ05hbWV9PmApO1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFRhZ05hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgc2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0Q29udGVudDtcbiAgICAgICAgc2NyaXB0LmlkID0gYG15b3AtZXh0cmFjdGVkLSR7c2NyaXB0SWR9YDtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIGdsb2JhbCBpbW1lZGlhdGVseTogdGhlIG5leHQgZXh0cmFjdGVkIHNjcmlwdCB0byBydW4gd2lsbCBvdmVyd3JpdGUgaXQuXG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSAod2luZG93IGFzIGFueSkuX19NWU9QX1RBR19OQU1FX187XG4gICAgICAgIGlmICh0YWdOYW1lKSB7XG4gICAgICAgICAgICBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzLnNldChzY3JpcHRJZCwgdGFnTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBFeGVjdXRlZCB3ZWIgY29tcG9uZW50IHNjcmlwdDogJHtzY3JpcHRJZH0gLT4gPCR7dGFnTmFtZX0+YCk7XG4gICAgICAgIHJldHVybiB0YWdOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSBNeW9wIFdlYiBDb21wb25lbnQgKGV4dHJhY3RlZCBhbmQgcnVuIG9uIGhvc3QgZG9jdW1lbnQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkRXh0cmFjdGVkV2ViQ29tcG9uZW50KFxuICAgICAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgc2tpbjogSVNraW5Db25maWcsXG4gICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIGh0bWw6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IGxvYWRlck9wdGlvbnNcbiAgICApOiBQcm9taXNlPE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQ+IHtcbiAgICAgICAgY29uc3Qgc2NyaXB0Q29udGVudCA9IHRoaXMuZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdChodG1sKTtcblxuICAgICAgICBpZiAoIXNjcmlwdENvbnRlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW015b3BXZWJDb21wb25lbnRdIE5vIDxzY3JpcHQgaWQ9XCJteW9wLXdlYi1jb21wb25lbnRcIj4gZm91bmQgaW4gSFRNTCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGNvbXBvbmVudCBkZWZpbml0aW9uIGlkIGFzIHNjcmlwdCBpZGVudGlmaWVyIGZvciBkZWR1cGxpY2F0aW9uXG4gICAgICAgIGNvbnN0IHNjcmlwdElkID0gYCR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH0tJHtza2luLmlkfWA7XG5cbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgc2NyaXB0IG9uIHRoZSBob3N0IGRvY3VtZW50LCBvciByZXVzZSB0aGUgdGFnIGl0IHJlZ2lzdGVyZWQgZWFybGllci5cbiAgICAgICAgLy8gTmV2ZXIgcmUtcmVhZCB3aW5kb3cuX19NWU9QX1RBR19OQU1FX18gaGVyZTogb24gYSByZS1tb3VudCB0aGUgc2NyaXB0IGlzIHNraXBwZWQgYW5kXG4gICAgICAgIC8vIHRoZSBnbG9iYWwgc3RpbGwgcG9pbnRzIGF0IHdoaWNoZXZlciBjb21wb25lbnQncyBzY3JpcHQgcmFuIGxhc3QsIHdoaWNoIHdvdWxkIGJ1aWxkXG4gICAgICAgIC8vIHRoaXMgY29udGFpbmVyJ3MgZWxlbWVudCBmcm9tIGFub3RoZXIgY29tcG9uZW50J3MgdGFnLlxuICAgICAgICBjb25zdCB0YWdOYW1lID0gdGhpcy5leGVjdXRlV2ViQ29tcG9uZW50U2NyaXB0KHNjcmlwdENvbnRlbnQsIHNjcmlwdElkKTtcblxuICAgICAgICBpZiAoIXRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW015b3BXZWJDb21wb25lbnRdIFNjcmlwdCBkaWQgbm90IHNldCB3aW5kb3cuX19NWU9QX1RBR19OQU1FX18nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgY3VzdG9tIGVsZW1lbnRcbiAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgY29udGFpbmVyIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKSB7XG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgd3JhcHBlclxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb24sXG4gICAgICAgICAgICBza2luLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGRhdGEgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShvcHRpb25zLmRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBMb2FkZWQgPCR7dGFnTmFtZX0+IGludG8gY29udGFpbmVyYCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGNvbnN0IGlzV0MgPSB0aGlzLmlzTXlvcFdlYkNvbXBvbmVudChsb2FkZXJDb25maWcuSFRNTCk7XG4gICAgICAgIGNvbnN0IHsgbW9kZSwgaXNvbGF0ZSB9ID0gYXdhaXQgdGhpcy5yZXNvbHZlUmVuZGVyTW9kZShjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBsb2FkZXJDb25maWcsIGlzV0MsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChtb2RlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbTXlvcF0gUmVuZGVyaW5nIGJsb2NrZWQgYnkgcmVuZGVyIHBvbGljeSBmb3IgY29tcG9uZW50IFwiJHtjb21wb25lbnREZWZpbml0aW9uLmlkfVwiYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNXQykge1xuICAgICAgICAgICAgLy8gV2ViLWNvbXBvbmVudCBIVE1MIG9ubHkgc3VwcG9ydHMgdGhlIHdlYi1jb21wb25lbnQgY29udHJhY3Q7IGEgcG9saWN5IHRoYXRcbiAgICAgICAgICAgIC8vIGRlbmllcyBpdCBoYXMgbm8gaWZyYW1lIGZhbGxiYWNrIChzZWUgcGxhbiBcdTAwQTczLjMpIFx1MjAxNCBibG9jayByYXRoZXIgdGhhblxuICAgICAgICAgICAgLy8gc2lsZW50bHkgcmVuZGVyIGJyb2tlbi4gVW50cnVzdGVkIGNvbnRyaWJ1dG9ycyBtdXN0IHNoaXAgaWZyYW1lIGNvbXBvbmVudHMuXG4gICAgICAgICAgICBpZiAobW9kZSAhPT0gJ3dlYkNvbXBvbmVudCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtNeW9wXSBXZWItY29tcG9uZW50IHJlbmRlcmluZyBkZW5pZWQgYnkgcmVuZGVyIHBvbGljeSBmb3IgY29tcG9uZW50IFwiJHtjb21wb25lbnREZWZpbml0aW9uLmlkfVwiYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkRXh0cmFjdGVkV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgbG9hZGVyQ29uZmlnLkhUTUwsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgbGV0IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICAgICAgLy8gRnVsbCBpc29sYXRpb246IGEgc2FuZGJveCBXSVRIT1VUIGFsbG93LXNhbWUtb3JpZ2luIGdpdmVzIHRoZSBmcmFtZSBhblxuICAgICAgICAgICAgLy8gb3BhcXVlIG9yaWdpbiBcdTIwMTQgbm8gaG9zdCBET00vY29va2llcy9wYXJlbnQgYWNjZXNzLiBNdXN0IGJlIHNldCBiZWZvcmVcbiAgICAgICAgICAgIC8vIHRoZSBmcmFtZSBuYXZpZ2F0ZXMgKGkuZS4gYmVmb3JlIHNyY2RvYyAvIGFwcGVuZCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzYW5kYm94JywgJ2FsbG93LXNjcmlwdHMgYWxsb3ctZm9ybXMgYWxsb3ctcG9wdXBzJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCBhbGwgc3R5bGVzIEJFRk9SRSBhcHBlbmRpbmcgdG8gcHJldmVudCBmbGFzaCBhdCB3cm9uZyBwb3NpdGlvblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICBpbnNldDogMDtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gV3JpdGUgY29udGVudCBpbnRvIHRoZSBpZnJhbWUuIEFuIGlzb2xhdGVkIChzYW5kYm94ZWQsIG9wYXF1ZS1vcmlnaW4pIGZyYW1lXG4gICAgICAgICAgICAvLyBjYW4ndCBiZSBkb2Mud3JpdGUoKSduIGZyb20gdGhlIGhvc3QsIHNvIGFjY3VtdWxhdGUgdGhlIG1hcmt1cCBhbmQgc2V0IGl0IHZpYVxuICAgICAgICAgICAgLy8gc3JjZG9jIG9uIGNsb3NlKCkuIE5vbi1pc29sYXRlZCBmcmFtZXMga2VlcCB0aGUgc2FtZS1vcmlnaW4gZG9jLndyaXRlIHBhdGguXG4gICAgICAgICAgICBjb25zdCBfX3NyY1BhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZG9jOiB7IG9wZW4oKTogdm9pZDsgd3JpdGVsbihzOiBzdHJpbmcpOiB2b2lkOyBjbG9zZSgpOiB2b2lkIH0gPSBpc29sYXRlXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIG9wZW4oKSB7fSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVsbihzOiBzdHJpbmcpIHsgX19zcmNQYXJ0cy5wdXNoKHMpOyB9LFxuICAgICAgICAgICAgICAgICAgICBjbG9zZSgpIHsgSWZyYW1lRWxlbWVudC5zcmNkb2MgPSBfX3NyY1BhcnRzLmpvaW4oJ1xcbicpOyB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkID0gSWZyYW1lRWxlbWVudC5jb250ZW50RG9jdW1lbnQgfHwgSWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgICAgICAgICAgICBkLm9wZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgICAgICAgICAgfSkoKTtcblxuXG4gICAgICAgICAgICAvLyBQYXJzZSBteW9wOnNpemUgbWV0YSB0YWcgYmVmb3JlIGlmcmFtZSBjcmVhdGlvbiAoc2FtZSBET01QYXJzZXIgcGFzcyBwYXR0ZXJuIGFzIG15b3BfcHJldmlldyByZW1vdmFsKS5cbiAgICAgICAgICAgIC8vIFRoaXMgbGV0cyB0aGUgUmVhY3QgaG9zdCBkZXRlcm1pbmUgc2l6aW5nIG1vZGUgKGZpbGwgdnMgY29udGVudCkgZnJvbSB0aGUgc3RhcnQuXG4gICAgICAgICAgICBsZXQgcGFyc2VkU2l6ZU1ldGE6IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgX3ByZVBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfcHJlRG9jID0gX3ByZVBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaXplTWV0YSA9IF9wcmVEb2MucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwibXlvcDpzaXplXCJdJyk7XG4gICAgICAgICAgICAgICAgaWYgKHNpemVNZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IHBhcnNlZFNpemVNZXRhID0gSlNPTi5wYXJzZShzaXplTWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSB8fCAne30nKTsgfSBjYXRjaCB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IEhUTUwyUmVuZGVyID0gbG9hZGVyQ29uZmlnLkhUTUw7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faW5zcGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vaW5qZWN0IGluc3BlY3Rpb24gc2NyaXB0IGZvciBwcm9wcyBkZXRlY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBwYXJ0IG9mIEFJIGNvbXBvbmVudHMsIHRoaW5rIGFib3V0IHRoYXQsIGRvY3VtZW50IGl0LlxuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BfcHJldmlld19zY3JpcHQgPSBfZG9jLmdldEVsZW1lbnRCeUlkKCdteW9wX3ByZXZpZXcnKTtcbiAgICAgICAgICAgICAgICBteW9wX3ByZXZpZXdfc2NyaXB0Py5yZW1vdmVBdHRyaWJ1dGUoJ3R5cGUnKTtcblxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBpbmplY3RlZCBIVE1MIHN0cmluZyBpbnRvIGEgbm9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBfZG9jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgpO1xuICAgICAgICAgICAgICAgIHRlbXAuYm9keS5pbm5lckhUTUwgPSBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZUtleXNXaW5kb3cgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHdpbmRvdykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3BTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVLZXlzV2luZG93LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRlbXAuYm9keS5maXJzdENoaWxkO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgJiYgX2RvYy5oZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9kb2MuaGVhZC5pbnNlcnRCZWZvcmUoX2RvYy5pbXBvcnROb2RlKG5vZGUsIHRydWUpLCBfZG9jLmhlYWQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHJlcGVuZCBET0NUWVBFOiBkb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIHJldHVybnMgb25seSA8aHRtbD4uLi48L2h0bWw+XG4gICAgICAgICAgICAgICAgLy8gYW5kIGRyb3BzIHRoZSBkb2N0eXBlLCB3aGljaCB3b3VsZCBwdXQgdGhlIGlmcmFtZSBpbiBxdWlya3MgbW9kZS5cbiAgICAgICAgICAgICAgICAvLyBRdWlya3MgbW9kZSBicmVha3MgYXV0by1zaXppbmcgYmVjYXVzZSA8Ym9keT4gc3RyZXRjaGVzIHRvIHRoZSBpZnJhbWVcbiAgICAgICAgICAgICAgICAvLyB2aWV3cG9ydCBpbnN0ZWFkIG9mIHNocmlua2luZyB0byBjb250ZW50LCBzbyBSZXNpemVPYnNlcnZlciBvbiBib2R5XG4gICAgICAgICAgICAgICAgLy8gbmV2ZXIgZmlyZXMgd2hlbiBjb250ZW50IHJlZmxvd3MgKGUuZy4gYWZ0ZXIgZm9udCBzd2FwKS5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaW1wcm92ZSBieSBkbyBpdCBvbiB0aGUgc2VydmUgb25jZVxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG15b3BfcHJldmlldyBzY3JpcHQgd2hlbiBub3QgaW4gaW5zcGVjdGlvbiBtb2RlXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG15b3BfcHJldmlld19zY3JpcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIG5vdGUgYWJvdmU6IHByZXBlbmQgRE9DVFlQRSB0byBrZWVwIHRoZSBpZnJhbWUgaW4gc3RhbmRhcmRzIG1vZGUuXG4gICAgICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmplY3QgaG9zdC1wcm92aWRlZCBDU1MgYmVmb3JlIHRoZSBpZnJhbWUgaXMgd3JpdHRlbiBzbyBzdHlsZXMgYXJlXG4gICAgICAgICAgICAvLyBwcmVzZW50IG9uIGZpcnN0IHBhaW50IChubyBGT1VDKS4gQXBwZW5kZWQgbGFzdCBpbiA8aGVhZD4gc28gaXQgd2luc1xuICAgICAgICAgICAgLy8gb3ZlciB0aGUgY29tcG9uZW50J3Mgb3duIHN0eWxlcyB2aWEgbm9ybWFsIGNhc2NhZGUgb3JkZXIuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaW5qZWN0Q3NzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKEhUTUwyUmVuZGVyLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVUYWcgPSBfZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgc3R5bGVUYWcuc2V0QXR0cmlidXRlKCdkYXRhLW15b3AtaW5qZWN0ZWQnLCAndHJ1ZScpO1xuICAgICAgICAgICAgICAgIC8vIDxzdHlsZT4gaXMgYW4gSFRNTCByYXctdGV4dCBlbGVtZW50OiB0aGUgc2VyaWFsaXplciBiZWxvdyB3cml0ZXMgaXRzXG4gICAgICAgICAgICAgICAgLy8gY29udGVudHMgTElURVJBTExZLCB3aXRob3V0IGVzY2FwaW5nLiBDU1MgY29udGFpbmluZyBcIjwvc3R5bGU+XCIgd291bGRcbiAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgY2xvc2UgdGhlIHRhZyBhbmQgaW5qZWN0IGxpdmUgbWFya3VwIGludG8gdGhlIGlmcmFtZSwgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBleGVjdXRlcyBzYW1lLW9yaWdpbiB3aXRoIHRoaXMgcGFnZS4gTmV1dHJhbGl6ZSB0aGUgc2VxdWVuY2UgXHUyMDE0IG5vIHJlYWxcbiAgICAgICAgICAgICAgICAvLyBzdHlsZXNoZWV0IGNvbnRhaW5zIGl0LiAoU2FtZSBjbGFzcyBvZiBidWcgYXMgdGhlIDwvc2NyaXB0PiBlc2NhcGUgaW5cbiAgICAgICAgICAgICAgICAvLyB0aGUgZGF0YSBwYXlsb2FkIGJlbG93LilcbiAgICAgICAgICAgICAgICBzdHlsZVRhZy50ZXh0Q29udGVudCA9IG9wdGlvbnMuaW5qZWN0Q3NzLnJlcGxhY2UoLzxcXHMqXFwvXFxzKnN0eWxlL2dpLCAnPFxcXFwvc3R5bGUnKTtcbiAgICAgICAgICAgICAgICAoX2RvYy5oZWFkIHx8IF9kb2MuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZVRhZyk7XG4gICAgICAgICAgICAgICAgLy8gU2VlIG5vdGUgYWJvdmU6IHByZXBlbmQgRE9DVFlQRSB0byBrZWVwIHRoZSBpZnJhbWUgaW4gc3RhbmRhcmRzIG1vZGUuXG4gICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBkb2Mud3JpdGVsbihIVE1MMlJlbmRlcik7XG5cbiAgICAgICAgICAgIC8vIHdpbmRvdy5fX2ZlZGVyYXRpb25fXyA9XG4gICAgICAgICAgICAvLyAgICAgeyAuLi53aW5kb3cuX19mZWRlcmF0aW9uX18sXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vVE9ETyA6IGdldCBmcm9tIEVOViBhdCBidWlsZCB0aW1lLFxuICAgICAgICAgICAgLy8gICAgICAgICAvLyBpbmplY3QgdmFsdWUgdG8gbW9kdWxlIGF0IGJ1aWxkIHRpbWVcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gdG9kYXkgd2UgZG9pbmcgc28ganVzdCBmb3IgdGhlIENKUyB2ZXJzaW9uXG4gICAgICAgICAgICAvLyAgICAgICAgIF9fcHVibGljX3BhdGhfXyA6J2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0J1xuICAgICAgICAgICAgLy8gICAgICAgICAsLi4uJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fKVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9O1xuXG4gICAgICAgICAgICAvLyBGb3IgbnBtIHBhY2thZ2UgdXNlcnMgd2l0aCBidW5kbGVycyAoVml0ZS9XZWJwYWNrKSwgaW5qZWN0IFNESyBpbmxpbmVcbiAgICAgICAgICAgIC8vIEZvciBDRE4gdXNlcnMgKHNjcmlwdCB0YWcpLCB1c2UgQ0ROIFVSTFxuICAgICAgICAgICAgY29uc3Qgc2RrU2NyaXB0ID0gSEFTX0VNQkVEREVEX1NES1xuICAgICAgICAgICAgICAgID8gYDxzY3JpcHQ+JHtFTUJFRERFRF9TREtfQ09OVEVOVH08L3NjcmlwdD5gXG4gICAgICAgICAgICAgICAgOiBgPHNjcmlwdCBzcmM9XCIke3dpbmRvdy5teW9wLl9fUk9PVF9TREtfUFVCTElDX1VSTF9ffVwiPjwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIC8vIERpZmZlcmVudCBpbml0IHNjcmlwdCBmb3IgZW1iZWRkZWQgdnMgQ0ROIFNES1xuICAgICAgICAgICAgLy8gLSBFbWJlZGRlZCAoYnVuZGxlZCBJSUZFKTogdXNlcyBNeW9wU0RLLmdldElmcmFtZU1vZHVsZSgpIHdoaWNoIHJldHVybnMgbW9kdWxlIGRpcmVjdGx5XG4gICAgICAgICAgICAvLyAtIENETiAoZHluYW1pYyBsb2FkaW5nKTogdXNlcyB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpIHdoaWNoIHdyYXBzIHdpdGggLmdldCgpXG4gICAgICAgICAgICBjb25zdCBpbml0U2NyaXB0ID0gSEFTX0VNQkVEREVEX1NES1xuICAgICAgICAgICAgICAgID8gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWVNb2R1bGUgPSBhd2FpdCBNeW9wU0RLLmdldElmcmFtZU1vZHVsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWZyYW1lU0RLID0gaWZyYW1lTW9kdWxlLklmcmFtZVNESztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX18gPSB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fO1xuICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbXlvcF9pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBfX215b3BfaW5pdCgpLnRoZW4oKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXMgdXNlIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgaW5zdGVhZCBvZiB0aGUgc2FtZS1vcmlnaW5cbiAgICAgICAgICAgIC8vIElmcmFtZVNESyArIGRhdGEtaW5qZWN0aW9uIHNjcmlwdHMgKHdoaWNoIHJlbHkgb24gaG9zdFx1MjE5NGZyYW1lIGFjY2VzcykuXG4gICAgICAgICAgICBpZiAoIWlzb2xhdGUpIHtcbiAgICAgICAgICAgICAgICBkb2Mud3JpdGVsbihgJHtzZGtTY3JpcHR9JHtpbml0U2NyaXB0fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmplY3QgZGF0YSBzY3JpcHQgaWYgZGF0YSBvcHRpb24gaXMgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSAmJiBvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXR1cCBDVEEgcXVldWUgLSBjYXB0dXJlcyBhbnkgQ1RBcyBlbWl0dGVkIGR1cmluZyBpbml0IGJlZm9yZSBob3N0IHJlZ2lzdGVycyBoYW5kbGVyXG4gICAgICAgICAgICAgICAgY29uc3QgY3RhUXVldWVTY3JpcHQgPSBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3BfY3RhX2hhbmRsZXIgPSBmdW5jdGlvbihhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfY3RhX3F1ZXVlLnB1c2goe2FjdGlvbjogYWN0aW9uLCBwYXlsb2FkOiBwYXlsb2FkfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIC8vIEVzY2FwZSBkYXRhIGZvciBzYWZlIGVtYmVkZGluZyBpbiBzY3JpcHQgdGFnXG4gICAgICAgICAgICAgICAgLy8gSlNPTi5zdHJpbmdpZnkgZG9lc24ndCBlc2NhcGUgPC9zY3JpcHQ+IHdoaWNoIGNvdWxkIGJyZWFrIEhUTUwgcGFyc2luZ1xuICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWREYXRhID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvPFxcL3NjcmlwdC9naSwgJ1xcXFx1MDAzYy9zY3JpcHQnKTtcblxuICAgICAgICAgICAgICAgIC8vIFNlbGYtY29udGFpbmVkIGRhdGEgaW5qZWN0aW9uIHNjcmlwdCB0aGF0OlxuICAgICAgICAgICAgICAgIC8vIDEuIENhbGxzIG15b3BfaW5pdF9pbnRlcmZhY2UgaW1tZWRpYXRlbHkgaWYgYWxyZWFkeSBkZWZpbmVkXG4gICAgICAgICAgICAgICAgLy8gMi4gV2F0Y2hlcyBmb3IgbGF0ZS1kZWZpbmVkIG15b3BfaW5pdF9pbnRlcmZhY2UgdmlhIGRlZmluZVByb3BlcnR5XG4gICAgICAgICAgICAgICAgLy8gMy4gQ2xlYW5zIHVwIGFmdGVyIGl0c2VsZiAocmVtb3ZlcyBzY3JpcHQgdGFnIGFuZCB3aW5kb3cgZGF0YSlcbiAgICAgICAgICAgICAgICAvLyA0LiBQb3N0cyBtZXNzYWdlIHRvIHBhcmVudCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nIChwcmUtaW5qZWN0ZWQgaW5pdCopXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YVNjcmlwdCA9IGA8c2NyaXB0IGlkPVwiX19teW9wX2luaXRfZGF0YV9zY3JpcHRcIj5cbiAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAke2VzY2FwZWREYXRhfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JpcHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdfX215b3BfaW5pdF9kYXRhX3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbEluaXRJbnRlcmZhY2UgPSBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFzIHByZS1pbmplY3RlZCBkYXRhIGNhbGwgZm9yIGV4dGVuc2lvbiB0cmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9wcmVpbmplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4oZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aWZ5IGV4dGVuc2lvbiB2aWEgcG9zdE1lc3NhZ2UgKGluaXQqID0gcHJlLWluamVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01ZT1BfUFJFSU5KRUNURURfSU5JVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICcqJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXA6IHJlbW92ZSBzY3JpcHQgdGFnIGFuZCBzdG9yZWQgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHRFbCAmJiBzY3JpcHRFbC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0RWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gYWxyZWFkeSBleGlzdHMgLSBjYWxsIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2Uod2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBub3QgeWV0IGRlZmluZWQgLSBzdG9yZSBkYXRhIGFuZCB3YXRjaCBmb3IgZGVmaW5pdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhID0gZGF0YTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ215b3BfaW5pdF9pbnRlcmZhY2UnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29yaWdpbmFsID0gZm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Ll9fbXlvcF9pbml0X2RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZWREYXRhID0gd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxJbml0SW50ZXJmYWNlKGZuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfb3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKGN0YVF1ZXVlU2NyaXB0ICsgZGF0YVNjcmlwdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkIGZyYW1lczogaW5qZWN0IHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKGluaXQgaW4gLyBjdGEgb3V0IC8gc2l6ZSBvdXQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkRGF0YSA9IG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSkucmVwbGFjZSgvPFxcL3NjcmlwdC9naSwgJ1xcXFx1MDAzYy9zY3JpcHQnKVxuICAgICAgICAgICAgICAgICAgICA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKHRoaXMuYnVpbGRJc29sYXRpb25CcmlkZ2UoZXNjYXBlZERhdGEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBjb250cm9sIGZyb20gZGFzaGJvYXJkXG4gICAgICAgICAgICAvLyAgKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQ6IHdpcmUgdGhlIGhvc3Qgc2lkZSBvZiB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIChjdGEgaW4sIHNpemUgaW4sIGluaXQgb3V0KS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSBjb21wLmVuYWJsZUlzb2xhdGlvbigpO1xuXG4gICAgICAgICAgICAvLyBTdG9yZSBwYXJzZWQgc2l6ZU1ldGEgb24gdGhlIGNvbXBvbmVudCBzbyB0aGUgUmVhY3QgaG9zdCBjYW4gcmVhZCBpdFxuICAgICAgICAgICAgY29tcC5zaXplTWV0YSA9IHBhcnNlZFNpemVNZXRhO1xuXG4gICAgICAgICAgICAvLyBBdXRvLXNpemU6IG9ic2VydmUgY29udGVudCBzaXplIGFuZCBzeW5jIHRvIGlmcmFtZSBkaW1lbnNpb25zLlxuICAgICAgICAgICAgLy8gVGhpcyB3b3JrcyBmb3IgYWxsIGhvc3RzICh2YW5pbGxhIFNESywgUmVhY3QsIFZ1ZSwgQW5ndWxhcikuXG4gICAgICAgICAgICAvLyBJZiBhIGZyYW1ld29yayBob3N0IChlLmcuIEBteW9wL3JlYWN0KSBhbHNvIGNhbGxzIG9ic2VydmVBdXRvU2l6ZSgpLFxuICAgICAgICAgICAgLy8gaXQgY2xlYW5seSByZXBsYWNlcyB0aGVzZSBvYnNlcnZlcnMgdmlhIF9hdXRvU2l6ZUNsZWFudXAgdHJhY2tpbmcuXG4gICAgICAgICAgICBjb21wLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5hdXRvU2l6ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gYXV0by1zaXppbmcuIElmcmFtZSBzdGF5cyBwb3NpdGlvbjphYnNvbHV0ZSBmaWxsaW5nIGNvbnRhaW5lci5cbiAgICAgICAgICAgICAgICAgICAgLy8gSG9zdCBpcyBmdWxseSByZXNwb25zaWJsZSBmb3IgY29udGFpbmVyIGRpbWVuc2lvbnMgKGUuZy4gUmVhY3QgTmF0aXZlIFdlYlZpZXcpLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzaG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbXAub2JzZXJ2ZUF1dG9TaXplKHtcbiAgICAgICAgICAgICAgICAgICAgZm9yY2VBdXRvU2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgb25TaXplQ2hhbmdlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG93IGFmdGVyIGZpcnN0IG1lYXN1cmVtZW50IGNvbXBsZXRlcyAobm90IGJlZm9yZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaWZyYW1lIHRyYW5zaXRpb25zIGZyb20gYWJzb2x1dGUgb3ZlcmxheSB0byBkb2N1bWVudCBmbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgbWVhc3VyZWQgaGVpZ2h0LCBwcmV2ZW50aW5nIGZsYXNoIGF0IHdyb25nIHNpemUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3duICYmICFvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gY29tcC5wcm9wcy5fZ2xvYmFsID0gY29tcC5lbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgICAgICAgICByZXR1cm4gY29tcDtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm5vbmUpIHtcbiAgICAgICAgICAgIC8vIHBhcnNlciA9IHBhcnNlciA/IHBhcnNlciA6IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIC8vIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBkb2MuYm9keS5maXJzdENoaWxkO1xuICAgICAgICAgICAgLy9lbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCBkb21JZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICAgICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGxvYWRlckNvbmZpZy5IVE1MOy8vLnRyaW0oKTtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IHogPSBmaXJzdEVsZW1lbnQgPyBmaXJzdEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgICAgICAgICAgIC8vICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKHRlbXBsYXRlLCBmaXJzdEVsZW1lbnQsIHopXG4gICAgICAgICAgICAvLyAgIGVsZW1lbnQgPSBmaXJzdEVsZW1lbnRcblxuICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTtcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gY29udGFpbmVyLmlubmVySFRNTCA9IGxvYWRlckNvbmZpZy5IVE1MO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKGVsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnROYW1lID0gdG9DdXN0b21FbGVtZW50TmFtZShjb21wb25lbnREZWZpbml0aW9uLm5hbWUgKyBza2luLmlkKTtcblxuICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWRlZmluZSAhXG4gICAgICAgICAgICBpZiAoIXNlZW4uaW5jbHVkZXMoY3VzdG9tRWxlbWVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50KGN1c3RvbUVsZW1lbnROYW1lLCBsb2FkZXJDb25maWcuSFRNTCwgbG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlKTtcbiAgICAgICAgICAgICAgICBzZWVuLnB1c2goY3VzdG9tRWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY3VzdG9tRWxlbWVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7Y3VzdG9tRWxlbWVudE5hbWV9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVByb3BDb25maWcsXG4gICAgSVNraW5Db25maWcsXG4gICAgSVVzZXJGbG93LFxuICAgIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIHYyX0lWYXJpYW50Q29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcblxuY29uc3QgY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnID0gKGNvbmZpZzogdjJfSVZhcmlhbnRDb25maWcpOiBJQ29tcG9uZW50Q29uZmlnID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZToge1xuICAgICAgICAgICAgaWQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb25maWcuY29tcG9uZW50SWQsXG4gICAgICAgICAgICBjb21wb25lbnROYW1lOiBjb25maWcubmFtZSxcblxuICAgICAgICAgICAgc2tpblNlbGVjdG9yOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHJvcHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnaW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9pbml0X2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZyxcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvdXRfYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9jdGFfaGFuZGxlcicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlZnM6IFtdLFxuICAgICAgICAgICAgc2tpbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlIGVtcHR5IDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXI6IGNvbmZpZy5jb25zdW1lX3ZhcmlhbnRbMF0ubG9hZGVyXG4gICAgICAgICAgICAgICAgfSBhcyBJU2tpbkNvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRlZmF1bHRTa2luOiAwXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lXG4gICAgfSBhcyBJQ29tcG9uZW50Q29uZmlnO1xufTtcblxuLyoqXG4gKiBDbG91ZFJlcG9zaXRvcnkgLSBVbmlmaWVkIGNsb3VkIGRhdGEgYWNjZXNzIGxheWVyIGZvciBNeW9wIGNvbXBvbmVudHNcbiAqXG4gKiBTdXBwb3J0cyBib3RoIHYyIChkZWZhdWx0KSBhbmQgdjEgbW9kZXM6XG4gKiAtIHYyOiBVc2VzIC9jb25zdW1lIGVuZHBvaW50IGZvciBmZXRjaGluZyB2YXJpYW50c1xuICogLSB2MTogVXNlcyAvZmxvdyBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdXNlciBmbG93c1xuICovXG4vLyBVc2UgYSBnbG9iYWwgc2luZ2xldG9uIHRvIGVuc3VyZSBvbmx5IG9uZSBDbG91ZFJlcG9zaXRvcnkuTWFpbiBleGlzdHNcbi8vIGV2ZW4gd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lcyBieSBkaWZmZXJlbnQgYnVuZGxlcnNcbmNvbnN0IEdMT0JBTF9LRVkgPSAnX19NWU9QX0NMT1VEX1JFUE9TSVRPUllfTUFJTl9fJztcblxuY29uc3QgZ2V0R2xvYmFsTWFpbiA9ICgpOiBDbG91ZFJlcG9zaXRvcnkgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3Qgc2V0R2xvYmFsTWFpbiA9IChpbnN0YW5jZTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICBwcml2YXRlIHN0YXRpYyBfbWFpbjogQ2xvdWRSZXBvc2l0b3J5IHwgbnVsbCA9IG51bGw7XG5cbiAgICBzdGF0aWMgZ2V0IE1haW4oKTogQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBnbG9iYWwgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMgKGZyb20gYW5vdGhlciBidW5kbGUpXG4gICAgICAgIGNvbnN0IGdsb2JhbE1haW4gPSBnZXRHbG9iYWxNYWluKCk7XG4gICAgICAgIGlmIChnbG9iYWxNYWluKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTWFpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBuZXcgaW5zdGFuY2UgaWYgbmVlZGVkXG4gICAgICAgIGlmICghQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKSB7XG4gICAgICAgICAgICBDbG91ZFJlcG9zaXRvcnkuX21haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG4gICAgICAgICAgICBzZXRHbG9iYWxNYWluKENsb3VkUmVwb3NpdG9yeS5fbWFpbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENsb3VkUmVwb3NpdG9yeS5fbWFpbjtcbiAgICB9XG5cbiAgICAvLyB2MiBjYWNoZSAtIGtleWVkIGJ5IGNvbXBvbmVudElkOmVudjpwcmV2aWV3fGxpdmVcbiAgICAvLyBFYWNoIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgcmVzb2x2ZWRgIHByb3BlcnR5IGFmdGVyIHNldHRsaW5nIChzZWUgZmV0Y2hDb21wb25lbnRWMikuXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH0+ID0ge307XG5cbiAgICAvLyBUcmFjayB3aGljaCBjb21wb25lbnRzIHdlcmUgcHJlbG9hZGVkIGFuZCB3aXRoIHdoYXQgcGFyYW1zXG4gICAgLy8gS2V5OiBjb21wb25lbnRJZCwgVmFsdWU6IHsgZW52LCBwcmV2aWV3IH1cbiAgICBwcml2YXRlIHByZWxvYWRlZENvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfT4gPSB7fTtcblxuICAgIC8vIHYxIGNhY2hlXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIHByaXZhdGUgX2RlZmF1bHRFbnYgPSAncHJvZHVjdGlvbic7XG4gICAgcHJpdmF0ZSBfZW52RXhwbGljaXRseVNldCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3N0YXRpY01vZGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9xdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBzdGF0aWMgbW9kZSBmb3Igc2VsZi1ob3N0ZWQgY29tcG9uZW50IHJlZ2lzdHJpZXMuXG4gICAgICogSW4gc3RhdGljIG1vZGUsIFVSTHMgYXJlIGNvbnN0cnVjdGVkIGFzIGZpbGUgcGF0aHMgaW5zdGVhZCBvZiBxdWVyeSBwYXJhbXM6XG4gICAgICogICAke2Jhc2VVcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtlbnZ9Lmpzb25cbiAgICAgKi9cbiAgICBlbmFibGVTdGF0aWNNb2RlKCkge1xuICAgICAgICB0aGlzLl9zdGF0aWNNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcXVlcnkgcGFyYW1ldGVycyB0byBhcHBlbmQgdG8gYWxsIGZldGNoIFVSTHMgKGUuZy4gZm9yIENETiBjYWNoZSBidXN0aW5nKS5cbiAgICAgKiBFeGFtcGxlOiBgc2V0UXVlcnlQYXJhbXMoeyBsYXN0dXBkYXRlOiAnMTExMTIwMjYnIH0pYFxuICAgICAqL1xuICAgIHNldFF1ZXJ5UGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICB0aGlzLl9xdWVyeVBhcmFtcyA9IHBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgQ2xvdWRSZXBvc2l0b3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgc2V0RW52aXJvbm1lbnQoZW52OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEVudiA9IGVudjtcbiAgICAgICAgdGhpcy5fZW52RXhwbGljaXRseVNldCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBnZXREZWZhdWx0RW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYyIE1ldGhvZHMgKERlZmF1bHQpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQgaXMgYWxyZWFkeSBjYWNoZWQvcHJlbG9hZGVkICh2MilcbiAgICAgKiBJZiBlbnYgYW5kIHByZXZpZXcgYXJlIG5vdCBwcm92aWRlZCwgY2hlY2tzIGlmIEFOWSB2ZXJzaW9uIGlzIHByZWxvYWRlZFxuICAgICAqL1xuICAgIGlzUHJlbG9hZGVkKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgLy8gSWYgc3BlY2lmaWMgZW52L3ByZXZpZXcgcmVxdWVzdGVkLCBjaGVjayBleGFjdCBtYXRjaFxuICAgICAgICBpZiAoZW52ICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2NvbXBvbmVudElkfToke2VudiB8fCB0aGlzLl9kZWZhdWx0RW52fToke3ByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBpZiBhbnkgdmVyc2lvbiB3YXMgcHJlbG9hZGVkXG4gICAgICAgIHJldHVybiBjb21wb25lbnRJZCBpbiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcmVsb2FkZWQgcGFyYW1zIGZvciBhIGNvbXBvbmVudCAoaWYgcHJlbG9hZGVkKVxuICAgICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBnZXRQcmVsb2FkZWRQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZyk6IHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgYSBjb21wb25lbnQgY29uZmlnOiBmZXRjaCBpdCBvbmNlLCB0aGVuIHNlcnZlIGl0IGZyb20gdGhpc1xuICAgICAqIHJlcG9zaXRvcnkncyBjYWNoZS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdGhlIG5hbWUgdG8gdXNlLiBgZmV0Y2hDb21wb25lbnRWMmAgaXMgdGhlIHNhbWUgbWV0aG9kIHVuZGVyIGl0c1xuICAgICAqIHZlcnNpb25lZCBuYW1lIGFuZCBzdGF5cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBcdTIwMTQgbm90ZSB0aGF0IHRoZVxuICAgICAqIHVudmVyc2lvbmVkIGBmZXRjaENvbXBvbmVudGAgaXMgYSAqZGVwcmVjYXRlZCB2MSogQVBJIGFuZCBpcyBOT1QgdGhpcy5cbiAgICAgKlxuICAgICAqIENvbXBsZXRlcyB0aGUgdHJpbyB3aXRoIHtAbGluayBnZXRSZXNvbHZlZENvbmZpZ30gKHN5bmNocm9ub3VzIHJlYWQgb2YgYW5cbiAgICAgKiBhbHJlYWR5LXJlc29sdmVkIGNvbmZpZykgYW5kIHtAbGluayBoeWRyYXRlQ29tcG9uZW50fSAoc2VlZCBvbmUgeW91XG4gICAgICogYWxyZWFkeSBob2xkKS5cbiAgICAgKlxuICAgICAqIFByZWZlciB0aGUgbW9kdWxlLWxldmVsIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgaW4gYXBwIGNvZGU7IHJlYWNoIGZvclxuICAgICAqIHRoaXMgd2hlbiB5b3UgbmVlZCBhbiBpc29sYXRlZCByZXBvc2l0b3J5IGluc3RhbmNlIHdob3NlIGNhY2hlIGxpZmV0aW1lXG4gICAgICogeW91IGNvbnRyb2wgXHUyMDE0IGEgc2VydmVyIHdpdGggaXRzIG93biBUVEwsIGZvciBleGFtcGxlLlxuICAgICAqL1xuICAgIGFzeW5jIHJlc29sdmVDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjIgY29tcG9uZW50IGNvbmZpZ1xuICAgICAqIElmIGVudi9wcmV2aWV3IG5vdCBzcGVjaWZpZWQgYW5kIGNvbXBvbmVudCB3YXMgcHJlbG9hZGVkLCB1c2VzIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgKlxuICAgICAqIEBzZWUgcmVzb2x2ZUNvbXBvbmVudCBcdTIwMTQgdGhlIHVudmVyc2lvbmVkIG5hbWUgZm9yIHRoaXMgbWV0aG9kXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIGNvbnN0IHsgZW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnZpcm9ubWVudElkZW50aWZpZXIsIHByZXZpZXcpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2xvdWRSZXBvc2l0b3J5XSBmZXRjaENvbXBvbmVudFYyJywge1xuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudElkLnNsaWNlKDAsIDgpICsgJy4uLicsXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICB1c2VQcmV2aWV3LFxuICAgICAgICAgICAgY2FjaGVLZXksXG4gICAgICAgICAgICBjYWNoZWQ6IGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSkge1xuICAgICAgICAgICAgLy8gVHJhY2sgdGhpcyBhcyBwcmVsb2FkZWQgKGZpcnN0IGZldGNoIGNvdW50cyBhcyBwcmVsb2FkKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0aWNNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHVzZVByZXZpZXcgPyAncHJldmlldycgOiBlbnY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2ZpbGV9Lmpzb25gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLl9xdWVyeVBhcmFtcykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXMpIHVybCArPSBgPyR7cXN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZ9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlUHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwcmV2aWV3PXRydWUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIGNvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgKCR7cmVzLnN0YXR1c30ke3RoaXMuX3N0YXRpY01vZGUgPyBgIGZyb20gJHt1cmx9YCA6ICcnfSlgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYW50ID0ganNvbi5pdGVtO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiIG5vdCBmb3VuZGApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQgfHwgIXZhcmlhbnQuY29uc3VtZV92YXJpYW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgaGFzIG5vIGltcGxlbWVudGF0aW9uIGZvciBlbnZpcm9ubWVudCBcIiR7ZW52fVwiYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q29uZmlnID0gY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnKHZhcmlhbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFnIHRoZSBQcm9taXNlIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gY29tcG9uZW50Q29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY2FjaGVkIHJlamVjdGVkIHByb21pc2Ugc28gdGhlIG5leHQgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgYSBmcmVzaCByZXF1ZXN0IChlLmcuIGFmdGVyIG5ldHdvcmsgcmVjb3ZlcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFyaWFudHNbY2FjaGVLZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN5bmNocm9ub3VzIHZlcnNpb24gb2YgZmV0Y2hDb21wb25lbnRWMiBcdTIwMTQgcmV0dXJucyB0aGUgY29uZmlnIG9ubHkgaWZcbiAgICAgKiB0aGUgZmV0Y2ggYWxyZWFkeSBjb21wbGV0ZWQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogVXNlcyB0aGUgc2FtZSBgdGhpcy52YXJpYW50c2AgY2FjaGUgdGhhdCBmZXRjaENvbXBvbmVudFYyL3ByZWxvYWRDb21wb25lbnRzXG4gICAgICogcG9wdWxhdGUuIEVhY2ggY2FjaGVkIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgLnJlc29sdmVkYCBwcm9wZXJ0eSB3aGVuXG4gICAgICogaXQgc2V0dGxlcyBcdTIwMTQgdGhpcyBtZXRob2QganVzdCByZWFkcyB0aGF0IHByb3BlcnR5LiBObyBzZXBhcmF0ZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFdoeSB0aGlzIGV4aXN0czogUmVhY3QgTmF0aXZlIG5lZWRzIHRoZSBjb25maWcgYXQgcmVuZGVyIHRpbWUgdG8gZW1iZWQgaXRcbiAgICAgKiBpbiB0aGUgV2ViVmlldyBIVE1MIChjYW4ndCBhd2FpdCBpbiB1c2VTdGF0ZSkuIElmIHByZWxvYWRDb21wb25lbnRzIHJhblxuICAgICAqIGVhcmxpZXIgYW5kIHRoZSBmZXRjaCBjb21wbGV0ZWQsIHRoaXMgcmV0dXJucyB0aGUgcmVzdWx0IHN5bmNocm9ub3VzbHksXG4gICAgICogc2tpcHBpbmcgdGhlIFdFQlZJRVdfUkVBRFkgXHUyMTkyIGZldGNoIFx1MjE5MiBpbmplY3Qgcm91bmQgdHJpcCBlbnRpcmVseS5cbiAgICAgKi9cbiAgICBnZXRSZXNvbHZlZENvbmZpZyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogSUNvbXBvbmVudENvbmZpZyB8IG51bGwge1xuICAgICAgICBjb25zdCB7IGNhY2hlS2V5IH0gPSB0aGlzLnJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XT8ucmVzb2x2ZWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHdoaWNoIChlbnYsIHByZXZpZXcpIHBhaXIgXHUyMDE0IGFuZCB0aGVyZWZvcmUgd2hpY2ggY2FjaGUga2V5IFx1MjAxNCBhIGNhbGxcbiAgICAgKiBmb3IgYGNvbXBvbmVudElkYCByZWZlcnMgdG8uXG4gICAgICpcbiAgICAgKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBmZXRjaENvbXBvbmVudFYyLCBnZXRSZXNvbHZlZENvbmZpZyBhbmRcbiAgICAgKiBoeWRyYXRlQ29tcG9uZW50LCBzbyBhIGh5ZHJhdGVkIGNvbmZpZyBhbHdheXMgbGFuZHMgb24gdGhlIGtleSBhIGxhdGVyXG4gICAgICogZmV0Y2ggd2lsbCBsb29rIHVuZGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSB7XG4gICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGVudi9wcmV2aWV3IGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkID0gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQYXJhbXMgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGVudjogc3RyaW5nO1xuICAgICAgICBsZXQgdXNlUHJldmlldzogYm9vbGVhbjtcblxuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UGFyYW1zICYmIHByZWxvYWRlZCkge1xuICAgICAgICAgICAgLy8gVXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgICAgIGVudiA9IHByZWxvYWRlZC5lbnY7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJlbG9hZGVkLnByZXZpZXc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJvdmlkZWQgcGFyYW1zIG9yIGRlZmF1bHRzXG4gICAgICAgICAgICBlbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZGVmYXVsdEVudjtcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSB0cnVlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgZmFsc2UgXHUyMTkyIGZhbHNlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IHVuZGVmaW5lZDogZW52IHdhcyBzcGVjaWZpZWQgKHZpYSBwYXJhbSBvciBzZXRFbnZpcm9ubWVudCkgXHUyMTkyIGZhbHNlLCBvdGhlcndpc2UgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIGNvbnN0IGhhc0VmZmVjdGl2ZUVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZXZpZXcgPT09IHRydWUgPyB0cnVlIDogKHByZXZpZXcgPT09IGZhbHNlID8gZmFsc2UgOiAhaGFzRWZmZWN0aXZlRW52KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGVudiwgdXNlUHJldmlldywgY2FjaGVLZXk6IGAke2NvbXBvbmVudElkfToke2Vudn06JHt1c2VQcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWVkIGFuIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZyBpbnRvIHRoZSBjYWNoZSwgd2l0aG91dCBhbnlcbiAgICAgKiBuZXR3b3JrIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGUgY291bnRlcnBhcnQgdG8ge0BsaW5rIGZldGNoQ29tcG9uZW50VjJ9OiB1c2UgaXQgd2hlbiB0aGUgY29uZmlnIHdhc1xuICAgICAqIHJlc29sdmVkIHNvbWV3aGVyZSBlbHNlIFx1MjAxNCBtb3N0IG9mdGVuIG9uIGEgc2VydmVyLCB0aGVuIGVtYmVkZGVkIGluIHRoZVxuICAgICAqIHBhZ2UgXHUyMDE0IHNvIHRoZSBicm93c2VyIGNhbiByZW5kZXIgdGhlIGNvbXBvbmVudCB3aXRoIG5vIHJvdW5kIHRyaXAuXG4gICAgICpcbiAgICAgKiBBZnRlciBoeWRyYXRpbmcsIGBmZXRjaENvbXBvbmVudFYyYCwgYGdldFJlc29sdmVkQ29uZmlnYCBhbmQgYGlzUHJlbG9hZGVkYFxuICAgICAqIGFsbCBhbnN3ZXIgZm9yIHRoaXMgY29tcG9uZW50IGZyb20gbWVtb3J5LlxuICAgICAqXG4gICAgICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlnIHdhcyByZXNvbHZlZCB3aXRoOyB0aGUgZGVmYXVsdHNcbiAgICAgKiBtYXRjaCB3aGF0IGEgcGxhaW4gYGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQpYCB3b3VsZCBoYXZlIHVzZWQuXG4gICAgICovXG4gICAgaHlkcmF0ZUNvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBjb25maWc6IElDb21wb25lbnRDb25maWcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBlbnY6IHJlc29sdmVkRW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKSBhcyBQcm9taXNlPElDb21wb25lbnRDb25maWc+ICYgeyByZXNvbHZlZD86IElDb21wb25lbnRDb25maWcgfTtcbiAgICAgICAgLy8gVGFnIGl0IHRoZSBzYW1lIHdheSBmZXRjaENvbXBvbmVudFYyIGRvZXMsIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhblxuICAgICAgICAvLyByZWFkIGl0IHN5bmNocm9ub3VzbHkuXG4gICAgICAgIHByb21pc2UucmVzb2x2ZWQgPSBjb25maWc7XG5cbiAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBwcm9taXNlO1xuICAgICAgICB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdID0geyBlbnY6IHJlc29sdmVkRW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJpbXBvcnQgeyBDbG91ZFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9DbG91ZFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IElDb21wb25lbnRDb25maWcgfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmxldCBfY2xvdWRSZXBvc2l0b3J5ID0gQ2xvdWRSZXBvc2l0b3J5Lk1haW47XG5cbmV4cG9ydCBjb25zdCBnZXRDbG91ZFJlcG9zaXRvcnkgPSAoKSA9PiBfY2xvdWRSZXBvc2l0b3J5O1xuXG5leHBvcnQgY29uc3QgaXNQcmVsb2FkZWQgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmlzUHJlbG9hZGVkKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFByZWxvYWRlZFBhcmFtcyA9IChjb21wb25lbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbmFibGVMb2NhbERldiA9ICgpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeShcImh0dHA6Ly9sb2NhbGhvc3Q6OTI5MlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnlVcmwgPSAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeSh1cmwpO1xufTtcblxuLyoqXG4gKiBDb25maWd1cmUgdGhlIFNESyB0byBmZXRjaCBjb21wb25lbnRzIGZyb20gYSBzZWxmLWhvc3RlZCBzdGF0aWMgcmVnaXN0cnkgKFMzLCBDRE4sIGV0Yy4pXG4gKiBpbnN0ZWFkIG9mIHRoZSBNeW9wIGNsb3VkLiBDb21wb25lbnRzIGFyZSBzZXJ2ZWQgYXMgc3RhdGljIEpTT04gZmlsZXM6XG4gKiAgIGAke2NkblVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2Vudmlyb25tZW50fS5qc29uYFxuICovXG5leHBvcnQgY29uc3QgZW5hYmxlU2VsZkhvc3RlZCA9IChjZG5Vcmw6IHN0cmluZywgcXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoY2RuVXJsKTtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LmVuYWJsZVN0YXRpY01vZGUoKTtcbiAgICBpZiAocXVlcnlQYXJhbXMpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5zZXRRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldENsb3VkUmVwb3NpdG9yeSA9IChyZXBvc2l0b3J5OiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRFbnZpcm9ubWVudCA9IChlbnY6IHN0cmluZykgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RW52aXJvbm1lbnQoZW52KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNvbHZlZENvbmZpZyA9IChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG59O1xuXG5leHBvcnQgY29uc3QgcHJlbG9hZENvbXBvbmVudHMgPSBhc3luYyAoaWRzOiBzdHJpbmdbXSwgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgIGlkcy5tYXAoKGlkKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmZldGNoQ29tcG9uZW50VjIoaWQsIGVudiwgcHJldmlldykpLFxuICAgICk7XG59O1xuXG4vKipcbiAqIFNlZWQgYWxyZWFkeS1yZXNvbHZlZCBjb21wb25lbnQgY29uZmlncyBpbnRvIHRoZSBTREsgY2FjaGUsIHdpdGggbm8gbmV0d29ya1xuICogcmVxdWVzdC4gVGhlIGNvdW50ZXJwYXJ0IHRvIHtAbGluayBwcmVsb2FkQ29tcG9uZW50c30uXG4gKlxuICogVXNlIGl0IHdoZW4gdGhlIGNvbmZpZ3Mgd2VyZSByZXNvbHZlZCBzb21ld2hlcmUgZWxzZSBcdTIwMTQgdHlwaWNhbGx5IG9uIGEgc2VydmVyXG4gKiBhbmQgZW1iZWRkZWQgaW4gdGhlIHBhZ2UgXHUyMDE0IHNvIHRoZSBjb21wb25lbnQgcmVuZGVycyB3aXRoIHplcm8gcm91bmQgdHJpcHM6XG4gKlxuICogYGBgdHNcbiAqIC8vIHNlcnZlcjogY29uc3QgY29uZmlncyA9IHsgW2lkXTogYXdhaXQgbmV3IENsb3VkUmVwb3NpdG9yeSgpLmZldGNoQ29tcG9uZW50VjIoaWQpIH1cbiAqIC8vIGNsaWVudDpcbiAqIGh5ZHJhdGVDb21wb25lbnRzKGNvbmZpZ3MpO1xuICogLy8gPE15b3BDb21wb25lbnQgY29tcG9uZW50SWQ9e2lkfSAvPiBub3cgcmVuZGVycyB3aXRob3V0IGZldGNoaW5nXG4gKiBgYGBcbiAqXG4gKiBQYXNzIHRoZSBzYW1lIGBlbnZgIC8gYHByZXZpZXdgIHRoZSBjb25maWdzIHdlcmUgcmVzb2x2ZWQgd2l0aDsgdGhlIGRlZmF1bHRzXG4gKiBtYXRjaCB3aGF0IGEgcGxhaW4gYHByZWxvYWRDb21wb25lbnRzKFtpZF0pYCB3b3VsZCBoYXZlIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBoeWRyYXRlQ29tcG9uZW50cyA9IChcbiAgICBjb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBJQ29tcG9uZW50Q29uZmlnPixcbiAgICBlbnY/OiBzdHJpbmcsXG4gICAgcHJldmlldz86IGJvb2xlYW4sXG4pID0+IHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdzKSkge1xuICAgICAgICBfY2xvdWRSZXBvc2l0b3J5Lmh5ZHJhdGVDb21wb25lbnQoaWQsIGNvbmZpZywgZW52LCBwcmV2aWV3KTtcbiAgICB9XG59O1xuIiwgImltcG9ydCB7ZGVjb21wcmVzc1VVSURzfSBmcm9tIFwiLi4vdXRpbHMvdXVpZC50c1wiO1xuaW1wb3J0IHtDbG91ZFJlcG9zaXRvcnl9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudEV4cGVyaWVuY2UsIElTa2luSW5zdGFuY2VDb25maWcsXG4gICAgU2tpblNlbGVjdG9yVHlwZXNcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY29uc3QgY2hlY2tNeW9wT3ZlcnJpZGUgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnIHwgbnVsbD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vVE9ETzogc3VwcG9ydCBkaXNhYmxpbmcgdGhlIG1lY2hhbmlzbVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICAgICAgY29uc3QgbXlvcE92ZXJyaWRlID0gcGFyYW1zLmdldCgnbXlvcE92ZXJyaWRlJyk7XG4gICAgICAgIGlmIChteW9wT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2UsIC4uLnV1aWRzXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBza2luSWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudChjb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmZXRjaEF1dG9GbG93LiBMb29rcyBsaWtlIG9ubHkgb25lIHNraW4gaXMgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraW4gPSBjb21wb25lbnRUb092ZXJyaWRlLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGZvciBub3cganVzdCBzZXQgc2tpbiBpZC4gQ2hlY2sgdGhlIGNsb3VkIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc2tpbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVNraW5JbnN0YW5jZUNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gICAgY2FzZSAnZmxvdyc6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDoge1xuICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50Q29uZmlnLnR5cGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGUgPT09IFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGVyaWVuY2UgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMuZmluZChlID0+IGUuaWQgPT09IGV4cGVyaW1lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRXhwZXJpZW5jZT8udHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2UgPSByZXNvbHZlZEV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cy5maW5kKHMgPT4gcy5zZWdtZW50SWQgPT09IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlLnNlZ21lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHNlZ21lbnQ/LnNraW5TZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7SU15b3BMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRW52ZWxvcGVkTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFJlZlxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcElmcmFtZUxvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9pZnJhbWVMb2FkZXJcIjtcbmltcG9ydCB7V2ViY29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtSZW5kZXJQb2xpY3l9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB0eXBlIHtJZnJhbWVTREt9IGZyb20gXCIuLi9JZnJhbWVcIjtcbmltcG9ydCB7Y29ubmVjdFByb3BzLCBjb25uZWN0UmVmcywgY3JlYXRlUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJRXhwZXJpZW5jZSwgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQsIElTZWdtZW50ZWRTa2luQ29uZmlnLCBJU2VnbWVudEV4cGVyaWVuY2UsXG4gICAgSVNraW5Db25maWcsIElTa2luU2VsZWN0b3JDb25maWcsIFNraW5TZWxlY3RvclR5cGVzLFxuXG5cbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7SFRNTENvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9IVE1MQ29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQge2NoZWNrTXlvcE92ZXJyaWRlfSBmcm9tIFwiLi9teW9wT3ZlcnJpZGUudHNcIjtcblxuaW50ZXJmYWNlIGNvbXBvbmVudExvYWRlckNyZWF0b3Ige1xuICAgIG5ldyhsb2FkZXJzOiBJTXlvcExvYWRlcltdKTogYW55O1xufVxuXG4vLyBjb25zdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXN5bmMgKGlkOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDozMDAwL2NvbXBvbmVudD9pZD0ke2lkfWApO1xuLy8gICAgIGNvbnN0IGNvbXBvbmVudERlZjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSAoYXdhaXQgcmVzLmpzb24oKSkuaXRlbTtcbi8vICAgICByZXR1cm4gY29tcG9uZW50RGVmXG4vLyB9XG5cbi8vY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9kZmRsazJwMW0xODd2LmNsb3VkZnJvbnQubmV0L215b3Bfc2RrLm1pbi5qcydcbmNvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0L215b3Bfc2RrLm1pbi5qcydcblxuLyoqXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG9zdFNESyB7XG4gICAgc3RhdGljIEluc3RhbmNlID0gKCkgPT4gd2luZG93Lm15b3AuaG9zdFNESztcblxuICAgIGNvbXBvbmVudHMyaW5pdDogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzTG9hZGVyczogSU15b3BMb2FkZXJbXSA9IFtdO1xuXG4gICAgLy8gR2xvYmFsIHJlbmRlciBwb2xpY3kgKGFsbG93L2RlbnkvbW9kZSBnYXRlKS4gQSBwZXItY2FsbCBvcHRpb25zLnJlbmRlclBvbGljeVxuICAgIC8vIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGlzIFx1MjAxNCBzZWUgSFRNTENvbXBvbmVudExvYWRlci5yZXNvbHZlUmVuZGVyTW9kZS5cbiAgICBwcml2YXRlIF9yZW5kZXJQb2xpY3k/OiBSZW5kZXJQb2xpY3k7XG4gICAgcHVibGljIHNldFJlbmRlclBvbGljeSA9IChwb2xpY3k/OiBSZW5kZXJQb2xpY3kpID0+IHsgdGhpcy5fcmVuZGVyUG9saWN5ID0gcG9saWN5OyB9O1xuICAgIHB1YmxpYyBnZXRSZW5kZXJQb2xpY3kgPSAoKTogUmVuZGVyUG9saWN5IHwgdW5kZWZpbmVkID0+IHRoaXMuX3JlbmRlclBvbGljeTtcblxuICAgIHB1YmxpYyBpbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIHR5cGUySW5zdGFuY2VDb3VudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHB1YmxpYyBhc3NpZ25JZCA9IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9XyR7Kyt0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXX1gO1xuICAgIH1cblxuICAgIC8vVE9ETyA6IGZpeCB0aGUgaW5zcGVjdCBpbXBsZW1lbnRhdGlvbiBpbnNpZGUgcmVmQ29tcG9uZW50XG4gICAgLy90aGVuIGluc3BlY3RlZCBtYXliZSBjYW4gYmUgZHJvcHBlZFxuICAgIHByaXZhdGUgaW5zcGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGluc3BlY3QgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3BlY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmluc3BlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaW5zcGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGluY29taW5nTWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ2luY29taW5nTWVzc2FnZUhhbmRsZXIgR09UICcsIGV2ZW50KVxuICAgICAgICAvL1RPRE8gOiAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gXCJodHRwOi8vZXhhbXBsZS5vcmc6ODA4MFwiKSByZXR1cm47XG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnSSBLbm93IHRoYXQgISEhJyk7XG4gICAgICAgICAgICAvLyAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5teW9wKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24udXAgJiYgZXZlbnQuZGF0YS5tZXNzYWdlVHlwZSAhPT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gaG9zdHNkaywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlID0gZXZlbnQuZGF0YTtcblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY29tcG9uZW50cyAyIGluaXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCAhPT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudC5pZClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYXRlZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQ/LmlkKTtcbiAgICAgICAgICAgICAgICBpbml0aWF0ZWRDb21wb25lbnQ/LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgLy9pbml0aWF0ZWRDb21wb25lbnQ/LnBhcmVudD8uc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbXlvcE1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UuZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UubWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkTWVzc2FnZS5tZXNzYWdlLnJvdXRlID0gdHlwZWRNZXNzYWdlLnJvdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLm1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogbG9nID9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnQucmVmcy5ib2R5Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSBteW9wTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy9ubyBpbiBtZW0gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL25vdCBwcm9jZXNzZWQgaW4gb25NZXNzYWdlUmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKFxuICAgICAgICAvLyAgICAgXCJoaSB0aGVyZSB5b3Vyc2VsZiEgIHRoZSBzZWNyZXQgcmVzcG9uc2UgXCIgKyBcImlzOiByaGVlZWVldCFcIixcbiAgICAgICAgLy8gICAgIGV2ZW50Lm9yaWdpbixcbiAgICAgICAgLy8gICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPignJyxcbiAgICAgICAgICAgIHtkYXRhOiBtZXNzYWdlfVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycz86IGNvbXBvbmVudExvYWRlckNyZWF0b3JbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaG9zdFNESyBhbHJlYWR5IGluaXRpYXRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzaWNMb2FkZXJzID0gW1xuICAgICAgICAgICAgbmV3IE15b3BJZnJhbWVMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBXZWJjb21wb25lbnRMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBIVE1MQ29tcG9uZW50TG9hZGVyKClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gW1xuICAgICAgICAgICAgLi4uYmFzaWNMb2FkZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzKSB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBJTXlvcExvYWRlcj4gPSB7fTtcblxuICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMuZm9yRWFjaChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21Mb2FkZXIgPSBuZXcgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcih0aGlzLmNvbXBvbmVudHNMb2FkZXJzKTtcbiAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbY3VzdG9tTG9hZGVyLnR5cGVdID0gY3VzdG9tTG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycy5mb3JFYWNoKGxvYWRlciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdKVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdID0gbG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IE9iamVjdC52YWx1ZXMobG9hZGVyQnlUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY29tbWluZyBtZXNzYWdlcyBmcm9tIElGcmFtZXNcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcixcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdteW9wIGhvc3RTREsgaW5pdGlhdGVkJywgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgICAgIHRoaXMuaW5pdGlhdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTa2luSWRCeVNraW5TZWxlY3RvciA9IGFzeW5jIChza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWcsIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdID0gW10sIGhvb2tzPzogbG9hZGVySG9va3MpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbmQ8VD4oXG4gICAgICAgICAgICBhcnJheTogVFtdLFxuICAgICAgICAgICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxib29sZWFuPlxuICAgICAgICApOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChza2luU2VsZWN0b3IudHlwZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FzZSBcIkRlZGljYXRlZFNraW5cIiA6IC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luSWQgPSAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2luPy5pZFxuICAgICAgICAgICAgICAgICAgICB8fCAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2lucyFbMF0uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTa2luSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gKHNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZylcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgYXN5bmNGaW5kKHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLCBhc3luYyBzZWdtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuc2VnbWVudElkID09PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpZW5jZSA9IGV4cGVyaWVuY2VzLmZpbmQoZXhwZXJpZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZXJpZW5jZS50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2UpLnNlZ21lbnQuaWQgPT09IHNlZ21lbnQuc2VnbWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZXJpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZXJpZW5jZSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZEV4cGVyaWVuY2UgPSBleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTZWdtZW50ID0gKHR5cGVkRXhwZXJpZW5jZS5zZWdtZW50IGFzIElGdW5jdGlvblJlc3VsdHNTZWdtZW50KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRGdW5jdGlvbiA9IChob29rcyA/IGhvb2tzIDoge30pW3R5cGVkU2VnbWVudC5mdW5jdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzZWdtZW50RnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZWdtZW50SWQ6JHtzZWdtZW50LnNlZ21lbnRJZH0sICR7dHlwZWRTZWdtZW50LmZ1bmN0aW9ufSBmdW5jdGlvbiBub3QgcHJvdmlkZWQgIWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKHNlZ21lbnQuc2tpblNlbGVjdG9yLCBleHBlcmllbmNlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJycgLy9UT0RPXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Ta2luU2VsZWN0b3IgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBob29rcz86IGxvYWRlckhvb2tzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraW5JZCA9IGF3YWl0IHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IsIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLCBob29rcyk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRDb25maWcudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGVySG9va3M/OiBsb2FkZXJIb29rcztcblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgUmVmLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6XG4gICAgICAgIFByb21pc2U8VD4gPT4ge1xuXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY29udGFpbmVyIHdhcyBmb3VuZCBmb3IgdGhpcyBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db25maWcgPSBhd2FpdCBjaGVja015b3BPdmVycmlkZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICBpZiAob3ZlcnJpZGRlbkNvbmZpZykge1xuICAgICAgICAgICAgLy9UT0RPIDogbG9nXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSBvdmVycmlkZGVuQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAoIWNvbnRhaW5lci5fX25vblByb3hpZWQpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyBNeW9wUmVmQ29tcG9uZW50KTtcbiAgICAgICAgLy8gICAgIC8vaWYgd2UgZ290IGxvYWRDb21wb25lbnQgb3ZlciBNeW9wUmVmQ29tcG9uZW50XG4gICAgICAgIC8vICAgICBpZiAocmVmQ29tcG9uZW50LmlkICYmIHJlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgcmVmQ29tcG9uZW50LnJlZiwgb3B0aW9ucyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gbGV0IHJvb3RDb21wb25lbnQ6IElNeW9wQ29tcG9uZW50ID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAvLyAgICAgICAgIC8vIHdoaWxlKCFyb290Q29tcG9uZW50LmVsZW1lbnQgJiYgcm9vdENvbXBvbmVudC5wYXJlbnQpe1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICByb290Q29tcG9uZW50ID0gcm9vdENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgLy8gICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyByb290Q29tcG9uZW50LmVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgICAvLyAvL3doYXQgbm93ID9cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGNvbnN0IGhvb2tzID0gey4uLih0aGlzLmxvYWRlckhvb2tzID8/IHt9KSwgLi4uKG9wdGlvbnM/Lmhvb2tzID8/IHt9KX07XG5cbiAgICAgICAgY29uc3QgcmVmID0gY29udGFpbmVyIGFzIFJlZjtcbiAgICAgICAgaWYgKHJlZi5teW9wKSB7XG4gICAgICAgICAgICBpZiAocmVmLmNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gey4uLmNvbXBvbmVudENvbmZpZ307XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRDb25maWcuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgc2tpbjogc2VsZWN0ZWRTa2luXG4gICAgICAgICAgICAgICAgICAgIC8vICBza2luczogW3NlbGVjdGVkU2tpbl1cbiAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhvb2tzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50PFQ+KHJlZiwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY29ubmVjdCByZWZzIGFuZCBwcm9wcyBpbnNvZGUgY3JlYXRlUmVmQ29tcG9uZW50LCBlbHNld2hlcmUgaXRzIG5vdCByZWFsbHkgPFQ+XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkIGNvbXBvbmVudCBnb3QgYSBkZXRhY2hlZCByZWYuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogY2hvb3NlIHNraW4gb24gcnVudGltZSAuLi5cbiAgICAgICAgICogICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZVxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRMb2FkZXIgPSB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZpbmQobG9hZGVyID0+IGxvYWRlci50eXBlID09PSBzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUpO1xuXG4gICAgICAgIGlmICghY29tcG9uZW50TG9hZGVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9hZGVyIFwiJHtzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGV9XCIgd2FzIGZvdW5kIGZvciBjb21wb25lbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIGxvYWRlZCB3ZWJjb21wb25lbnQgbW9kdWxlcyB0byBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgaW5pdCBtZXNzYWdlIGZsb3dcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IGNvbXBvbmVudExvYWRlci5sb2FkKGNvbXBvbmVudENvbmZpZy50eXBlLCBzZWxlY3RlZFNraW4sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IHdoZW4gdGhpcyBpcyBub3QgdHJ1ZSA/XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQucHVzaChjb21wb25lbnQpXG5cbiAgICAgICAgY29tcG9uZW50LmJpbmQoJ29uRGlzcG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NvbXBvbmVudCBkaXNwb3NlJywgY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdCA9IHRoaXMuY29tcG9uZW50czJpbml0LmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gdHJ1ZSBieSBkZWZhdWx0XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLmNvbm5lY3RQcm9wcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2UgdHlwZSBmaWVsZCBjb25kaXRpb25hbCB0eXBlIGluZmVyIFwic3RyaW5nXCIgPiBzdHJpbmcsIFwibnVtYmVyXCIgPiBudW1iZXIsIGV0Yy4uLlxuICAgICAgICAgICAgY29tcG9uZW50ID0gY29ubmVjdFByb3BzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLnR5cGUucHJvcHMsIHNlbGVjdGVkU2tpbik7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSBvcHRpb25hbD9cbiAgICAgICAgICAgIC8vVE9ETyA6IGZpeCBpc3N1ZXMgd2l0aCB0aW1lb3V0IGFuZCB3cm9uZyByZWYgbmFtZXMgZnJvbSBjb25maWcgdnMgY3VycmVudCBza2luXG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBUT09EIDogdGhyb3cgP1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucz8uc2tpcEluaXQpXG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBUO1xuICAgIH1cblxuICAgIHB1YmxpYyBuYXZpZ2F0ZSA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbmV3Q29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBvcHRpb25zPzogbmF2aWdhdGlvbk9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF2aWdhdGluZyBvbiByZW1vdGUgcmVmIGNvbXBvbmVudHMgaXMgbm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGlmIChvcHRpb25zPy5pbnBsYWNlKSB7XG4gICAgICAgIC8vICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIGF3YWl0IG5ld0NvbXBvbmVudC5pbml0aWF0ZWQoKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAvLyAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc3RhZ2VkKSB7XG4gICAgICAgICAgICAvL2NvbnN0IHNlbGVjdGVkU2tpbiA9IHRoaXMucnVuU2tpblNlbGVjdG9yKG5ld0NvbXBvbmVudENvbmZpZylcbiAgICAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7ZGlyZWN0aW9uOiAnYWZ0ZXInLCBjaGlsZDogY29tcG9uZW50LmVsZW1lbnQhfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcblxuICAgICAgICAgICAgbmV3Q29tcG9uZW50LnNob3coKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjb21wb25lbnQuZWxlbWVudCEubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiZWZvcmVcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIG5hdmlnYXRpb25PcHRpb25zID0ge1xuICAgIHN0YWdlZD86IGJvb2xlYW4sXG4gICAgLy9pbnBsYWNlPzogYm9vbGVhbixcbiAgICBpbml0PzogKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IFByb21pc2U8dm9pZD5cbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbn0gJiBsb2FkZXJPcHRpb25zXG5cbnR5cGUgcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uID0gJ2JlZm9yZScgfCAnYWZ0ZXInO1xuXG5cbmV4cG9ydCB0eXBlIGxvYWRlckhvb2tzID0ge1xuICAgIGFmdGVyU2tpblNlbGVjdGVkPzogKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IFByb21pc2U8SVNraW5Db25maWc+XG59ICZcbiAgICAvLyBzZWdtZW50YXRpb24gaG9va3NcbiAgICAoeyBba2V5OiBzdHJpbmddOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB9IHwge30pXG5cbi8vVE9ETzogc3VwcG9ydCBzZXJpYWxpemFibGUgdmVyc2lvbiBvZiB0aGF0IG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSByZWxhdGl2ZUxvYWRDb25maWcge1xuICAgIC8vSWYgdGhpcyBpcyBudWxsLCB0aGVuIG5ld05vZGUgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9pbnNlcnRCZWZvcmVcbiAgICBjaGlsZDogQ2hpbGROb2RlIHwgbnVsbFxuICAgIGRpcmVjdGlvbjogcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVudmlyb25tZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxudHlwZSBFbGVtZW50QXR0cmlidXRlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgbG9hZGVyT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBoaWRkZW4/OiBib29sZWFuXG4gICAgY29ubmVjdFByb3BzPzogYm9vbGVhblxuICAgIHRpbWVvdXQ/OiBudW1iZXJcbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbiAgICByZWxhdGl2ZT86IHJlbGF0aXZlTG9hZENvbmZpZ1xuICAgIGhvb2tzPzogbG9hZGVySG9va3NcbiAgICBlbGVtZW50QXR0cmlidXRlcz86IEVsZW1lbnRBdHRyaWJ1dGVzXG4gICAgX2Vudmlyb25tZW50PzogSUVudmlyb25tZW50XG4gICAgX2hhc1BhcmVudD86IGJvb2xlYW5cbiAgICBfaW5zcGVjdGlvbj86IGJvb2xlYW5cbiAgICBkYXRhPzogYW55XG4gICAgLyoqXG4gICAgICogUmF3IENTUyBpbmplY3RlZCBpbnRvIHRoZSBjb21wb25lbnQncyBpZnJhbWUgPGhlYWQ+IGJlZm9yZSBmaXJzdCBwYWludC5cbiAgICAgKiBBcHBlbmRlZCBsYXN0IHNvIGl0IG92ZXJyaWRlcyB0aGUgY29tcG9uZW50J3Mgb3duIHN0eWxlcyB2aWEgY2FzY2FkZSBvcmRlci5cbiAgICAgKiBVc2VmdWwgZm9yIHRoZW1pbmcgdjIgKEhUTUwpIGNvbXBvbmVudHMgXHUyMDE0IGNvbG9ycywgZm9udHMsIHNwYWNpbmcsIGV0Yy5cbiAgICAgKi9cbiAgICBpbmplY3RDc3M/OiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDb250cm9sIGlmcmFtZSBhdXRvLXNpemluZyBiZWhhdmlvci5cbiAgICAgKiAtIHRydWUgKGRlZmF1bHQpOiBpZnJhbWUgYXV0by1zaXplcyB0byBjb250ZW50IGhlaWdodCwgd2lkdGggZmlsbHMgcGFyZW50LlxuICAgICAqIC0gZmFsc2U6IG5vIHNpemluZyBsb2dpYyBydW5zLiBObyBvYnNlcnZlcnMsIG5vIG1lYXN1cmVtZW50cywgbm8gc3R5bGUgY2hhbmdlcy5cbiAgICAgKiAgIFRoZSBpZnJhbWUgc3RheXMgYXQgcG9zaXRpb246YWJzb2x1dGUgZmlsbGluZyB0aGUgY29udGFpbmVyLlxuICAgICAqICAgVGhlIGhvc3QgaXMgZnVsbHkgcmVzcG9uc2libGUgZm9yIGNvbnRhaW5lciBkaW1lbnNpb25zLlxuICAgICAqL1xuICAgIGF1dG9TaXplPzogYm9vbGVhblxuXG4gICAgLyoqXG4gICAgICogUGVyLWNhbGwgcmVuZGVyIHBvbGljeS4gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIGhvc3RTREsuc2V0UmVuZGVyUG9saWN5IFx1MjAxNCBsZXRzIGFuXG4gICAgICogYXBwIHJlc3RyaWN0IGdsb2JhbGx5IGFuZCBhbGxvdyAob3IgZnVydGhlciByZXN0cmljdCkgc3BlY2lmaWMgbG9hZENvbXBvbmVudCBjYWxscy5cbiAgICAgKi9cbiAgICByZW5kZXJQb2xpY3k/OiBSZW5kZXJQb2xpY3lcblxuICAgIC8qKlxuICAgICAqIEZvcmNlIGZ1bGwgaXNvbGF0aW9uIGZvciBhbiBpbmxpbmUtSFRNTCAobG9jYWxGcmFtZSkgY29tcG9uZW50OiBzYW5kYm94ZWQsXG4gICAgICogY3Jvc3Mtb3JpZ2luIGlmcmFtZSB3aXRoIG5vIGhvc3QtZG9jdW1lbnQgYWNjZXNzLiBBIHJlbmRlciBwb2xpY3kgcmV0dXJuaW5nXG4gICAgICogJ2lzb2xhdGVkSWZyYW1lJyBoYXMgdGhlIHNhbWUgZWZmZWN0LlxuICAgICAqL1xuICAgIGlzb2xhdGlvbj86IGJvb2xlYW5cbn1cblxuaWYgKCF3aW5kb3cubXlvcCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICB9O1xufVxuXG5pZiAoIXdpbmRvdy5teW9wLmhvc3RTREspIHtcbiAgICBjb25zdCBfaG9zdFNESyA9IG5ldyBIb3N0U0RLKCk7XG4gICAgLy9UT0RPOiBlbmFibGUgbGF6eSBpbml0P1xuICAgIF9ob3N0U0RLLmluaXQoKTtcblxuICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdpbmRvdy5teW9wLmhvc3RTREsgPSBfaG9zdFNESztcbn1cblxuLy8gQHRzLWlnbm9yZVxuZXhwb3J0IGNvbnN0IGhvc3RTREs6IEhvc3RTREsgPSB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdob3N0U0RLJywgaG9zdFNESyk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAgICAgbXlvcDoge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX186IHN0cmluZyxcbiAgICAgICAgICAgIGhvc3RTREs6IEhvc3RTREssXG4gICAgICAgICAgICBJZnJhbWVTREs6IEluc3RhbmNlVHlwZTx0eXBlb2YgSWZyYW1lU0RLPlxuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8qKlxuICogTXlvcCBMb2FkZXIgLSBTaGFyZWQgbG9hZGVyL2ZhbGxiYWNrIFVJIGZvciBob3N0IGZyYW1ld29ya3NcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBpbXBsZW1lbnRhdGlvbiB1c2luZyBwdXJlIERPTVxuICovXG5cbi8vIE15b3AgTG9nbyBTVkcgcGF0aFxuY29uc3QgTVlPUF9MT0dPX1BBVEggPVxuICBcIk0xNTEuNDM4IDIuNzE2OEMxNzcuNjI1IDIuNzYwNDIgMjQ4LjE3OSA0LjI4MzIgMzAwLjQgNTYuNzQ0MUMzNTAuNjcxIDEwNy4yNDUgMzY0LjQ0IDExNC40NTIgMzg5Ljk2NyAxMTkuMjExQzM5Mi41NzYgMTE5LjQzNiAzOTcuNDcyIDExOS4zOTQgNDAwLjgwMiAxMTYuNTIxQzQwMy4wMTEgMTE0LjYxNCA0MDMuOTIxIDEwOS41MTggNDA0LjI2NSAxMDQuNjI3VjUuOTU5OTZDNDA0LjI2NSA0Ljg1NTU2IDQwNS4xNiAzLjk2MDIzIDQwNi4yNjUgMy45NTk5Nkg1MjIuNzExQzUyMy44MTUgMy45NTk5NiA1MjQuNzExIDQuODU1MzkgNTI0LjcxMSA1Ljk1OTk2VjEyMi40MDVDNTI0LjcxMSAxMjMuNTEgNTIzLjgxNSAxMjQuNDA1IDUyMi43MTEgMTI0LjQwNUg0MjEuOTk4QzQxOC41NzkgMTI0LjcyOCA0MTMuODUyIDEyNS42MjcgNDEwLjk3NCAxMjguMDk1QzQwNy44NzkgMTMwLjc0OCA0MDcuMDQyIDEzNy44MDUgNDA2Ljg0NSAxNDIuNjYxVjI0MC40MTRDNDA2Ljg0NSAyNDEuNDM2IDQwNi4xMTEgMjQyLjI5MiA0MDUuMDkzIDI0Mi4zOEMzNjYuNTQ4IDI0NS43MTcgMjc3LjA3OSAyMjguNDYyIDIzNS44MzcgMTczLjY2OEMyMDIuOTA5IDEyOS45MTkgMTczLjg4MiAxMjIuNDc0IDE1MS40NTggMTIyLjA3N0MxNTAuMzU0IDEyMi4wNTggMTQ5LjQ1OSAxMjEuMTY0IDE0OS40NTkgMTIwLjA2VjQuNzE1ODJDMTQ5LjQ1OSAzLjYxMTQgMTUwLjMzNCAyLjcxNTE5IDE1MS40MzggMi43MTY4Wk02Mi4yMDMxIDBDOTYuNTU2NiAwLjAwMDIxMzE0OCAxMjQuNDA1IDI3Ljg0OTYgMTI0LjQwNSA2Mi4yMDMxQzEyNC40MDUgOTYuNTU2NCA5Ni41NTY0IDEyNC40MDUgNjIuMjAzMSAxMjQuNDA1QzI3Ljg0OTYgMTI0LjQwNSAwLjAwMDIxMzE3NSA5Ni41NTY2IDAgNjIuMjAzMUMwIDI3Ljg0OTUgMjcuODQ5NSAwIDYyLjIwMzEgMFpcIjtcblxuLy8gU3R5bGUgY29uc3RhbnRzXG5leHBvcnQgY29uc3QgTE9BREVSX0dSQURJRU5UID1cbiAgXCJsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjRkY4NjUxIDAlLCAjRkZCRUE4IDUwJSwgI0EzOTdGNSAxMDAlKVwiO1xuZXhwb3J0IGNvbnN0IEZBTExCQUNLX0dSQURJRU5UID1cbiAgXCJsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjOUNBM0FGIDAlLCAjRDFENURCIDUwJSwgI0U1RTdFQiAxMDAlKVwiO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIE15b3AgbG9nbyBTVkcgZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXlvcExvZ29TdmcoKTogU1ZHU1ZHRWxlbWVudCB7XG4gIGNvbnN0IHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xuICBzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCI4MFwiKTtcbiAgc3ZnLnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgXCIwIDAgNTI1IDI0M1wiKTtcbiAgc3ZnLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJub25lXCIpO1xuXG4gIGNvbnN0IHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBhdGhcIik7XG4gIHBhdGguc2V0QXR0cmlidXRlKFwiZFwiLCBNWU9QX0xPR09fUEFUSCk7XG4gIHBhdGguc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIndoaXRlXCIpO1xuXG4gIHN2Zy5hcHBlbmRDaGlsZChwYXRoKTtcbiAgcmV0dXJuIHN2Zztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmxpbmUgSFRNTCBzdHJpbmcgZm9yIHRoZSBNeW9wIGxvZ28gU1ZHXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNeW9wTG9nb0h0bWwoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGA8c3ZnIHdpZHRoPVwiODBcIiB2aWV3Qm94PVwiMCAwIDUyNSAyNDNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICA8cGF0aCBkPVwiJHtNWU9QX0xPR09fUEFUSH1cIiBmaWxsPVwid2hpdGVcIi8+XG4gIDwvc3ZnPmA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5saW5lIHN0eWxlcyBmb3IgdGhlIGxvYWRlciBjb250YWluZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRlclN0eWxlcyhmYWRlRHVyYXRpb246IG51bWJlciA9IDIwMCk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB6LWluZGV4OiAxO1xuICAgIGJhY2tncm91bmQ6ICR7TE9BREVSX0dSQURJRU5UfTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAke2ZhZGVEdXJhdGlvbn1tcyBlYXNlLW91dDtcbiAgYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmxpbmUgc3R5bGVzIGZvciB0aGUgZmFsbGJhY2sgY29udGFpbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGYWxsYmFja1N0eWxlcygpOiBzdHJpbmcge1xuICByZXR1cm4gYFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgYmFja2dyb3VuZDogJHtGQUxMQkFDS19HUkFESUVOVH07XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBgO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsb2FkZXIgRE9NIGVsZW1lbnQgd2l0aCB0aGUgTXlvcCBicmFuZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9hZGVyRWxlbWVudChmYWRlRHVyYXRpb246IG51bWJlciA9IDIwMCk6IEhUTUxEaXZFbGVtZW50IHtcbiAgY29uc3QgbG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgbG9hZGVyLmNsYXNzTmFtZSA9IFwibXlvcC1sb2FkZXJcIjtcbiAgbG9hZGVyLnN0eWxlLmNzc1RleHQgPSBnZXRMb2FkZXJTdHlsZXMoZmFkZUR1cmF0aW9uKTtcbiAgbG9hZGVyLmFwcGVuZENoaWxkKGNyZWF0ZU15b3BMb2dvU3ZnKCkpO1xuICByZXR1cm4gbG9hZGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmYWxsYmFjayBET00gZWxlbWVudCB3aXRoIHRoZSBNeW9wIGJyYW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGYWxsYmFja0VsZW1lbnQoKTogSFRNTERpdkVsZW1lbnQge1xuICBjb25zdCBmYWxsYmFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGZhbGxiYWNrLmNsYXNzTmFtZSA9IFwibXlvcC1mYWxsYmFja1wiO1xuICBmYWxsYmFjay5zdHlsZS5jc3NUZXh0ID0gZ2V0RmFsbGJhY2tTdHlsZXMoKTtcbiAgZmFsbGJhY2suYXBwZW5kQ2hpbGQoY3JlYXRlTXlvcExvZ29TdmcoKSk7XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBsb2FkZXIgSFRNTCBhcyBhIHN0cmluZyAoZm9yIHVzZSBpbiB0ZW1wbGF0ZXMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2FkZXJIdG1sKGZhZGVEdXJhdGlvbjogbnVtYmVyID0gMjAwKTogc3RyaW5nIHtcbiAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwibXlvcC1sb2FkZXJcIiBzdHlsZT1cIiR7Z2V0TG9hZGVyU3R5bGVzKGZhZGVEdXJhdGlvbikucmVwbGFjZSgvXFxuL2csIFwiIFwiKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKS50cmltKCl9XCI+XG4gICAgJHtnZXRNeW9wTG9nb0h0bWwoKX1cbiAgPC9kaXY+YDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBmYWxsYmFjayBIVE1MIGFzIGEgc3RyaW5nIChmb3IgdXNlIGluIHRlbXBsYXRlcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZhbGxiYWNrSHRtbCgpOiBzdHJpbmcge1xuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJteW9wLWZhbGxiYWNrXCIgc3R5bGU9XCIke2dldEZhbGxiYWNrU3R5bGVzKCkucmVwbGFjZSgvXFxuL2csIFwiIFwiKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKS50cmltKCl9XCI+XG4gICAgJHtnZXRNeW9wTG9nb0h0bWwoKX1cbiAgPC9kaXY+YDtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGxvYWRlciBvcHRpb25zIHVzZWQgYnkgaG9zdCBmcmFtZXdvcmtzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXlvcExvYWRlck9wdGlvbnMge1xuICAvKiogRmFkZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDIwMCkgKi9cbiAgZmFkZUR1cmF0aW9uPzogbnVtYmVyO1xuICAvKiogSW5pdGlhbCBvcGFjaXR5IChkZWZhdWx0OiAxKSAqL1xuICBvcGFjaXR5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENTUy1pbi1KUyBzdHlsZSBvYmplY3RzIGZvciBmcmFtZXdvcmtzIHRoYXQgc3VwcG9ydCB0aGVtXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkZXJTdHlsZU9iamVjdCA9IHtcbiAgcG9zaXRpb246IFwiYWJzb2x1dGVcIiBhcyBjb25zdCxcbiAgdG9wOiAwLFxuICBsZWZ0OiAwLFxuICByaWdodDogMCxcbiAgYm90dG9tOiAwLFxuICB6SW5kZXg6IDEsXG4gIGJhY2tncm91bmQ6IExPQURFUl9HUkFESUVOVCxcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxufTtcblxuZXhwb3J0IGNvbnN0IGZhbGxiYWNrU3R5bGVPYmplY3QgPSB7XG4gIHBvc2l0aW9uOiBcImFic29sdXRlXCIgYXMgY29uc3QsXG4gIHRvcDogMCxcbiAgbGVmdDogMCxcbiAgcmlnaHQ6IDAsXG4gIGJvdHRvbTogMCxcbiAgYmFja2dyb3VuZDogRkFMTEJBQ0tfR1JBRElFTlQsXG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbn07XG5cbmV4cG9ydCBjb25zdCBjb250YWluZXJTdHlsZU9iamVjdCA9IHtcbiAgcG9zaXRpb246IFwiYWJzb2x1dGVcIiBhcyBjb25zdCxcbiAgdG9wOiAwLFxuICBsZWZ0OiAwLFxuICByaWdodDogMCxcbiAgYm90dG9tOiAwLFxuICB6SW5kZXg6IDEsXG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQU8sSUFBTSxpQkFBaUI7QUFDdkIsSUFBTSxZQUFZO0FBR2xCLElBQU0sc0JBQXNCLENBQUMsWUFBb0IsV0FBZ0I7QUFFcEUsTUFBSSxPQUFPLGNBQWMsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEtBQUssT0FBTyxjQUFjLEVB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QUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QsZ0JBQWdCO0FBQUEsRUFDaEIsWUFBWTtBQUNkO0FBRU8sSUFBTSx1QkFBdUI7QUFBQSxFQUNsQyxVQUFVO0FBQUEsRUFDVixLQUFLO0FBQUEsRUFDTCxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxRQUFRO0FBQUEsRUFDUixRQUFRO0FBQUEsRUFDUixTQUFTO0FBQUEsRUFDVCxnQkFBZ0I7QUFBQSxFQUNoQixZQUFZO0FBQ2Q7IiwKICAibmFtZXMiOiBbIlJlcGxheU1lc3NhZ2VLZXkiLCAibWF0Y2giLCAic2NyaXB0SW5wdXRzIiwgInNjcmlwdElucHV0cyIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJzZWVuIiwgInRhcmdldCIsICJtYWtlU2VyaWFsaXphYmxlIiwgImhlaWdodCIsICJ3aWR0aCIsICJob3N0U0RLIiwgImVsZW1lbnQiLCAic2VlbiIsICJzZGsiLCAiZG9tSWQiLCAic2RrIiwgInNlZW4iLCAic2tpbiIsICJjb21wb25lbnQiLCAic2VnbWVudCIsICJleHBlcmllbmNlIiwgInNlbGVjdGVkU2tpbiJdCn0K
4211
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9JTXlvcENvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BFbGVtZW50UmVmLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vYmFzZU1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vQmFzZU15b3BTREsudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvZGVsaXZlcnlTdG9yZS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvY2xvdWRSZXBvc2l0b3J5SGVscGVycy50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcExvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGNvbnN0IF9fZmVkZXJhdGlvbl9fID0gXCJfX2ZlZGVyYXRpb25fX1wiXG5leHBvcnQgY29uc3Qgb25Mb2FkS2V5ID0gXCJvbkxvYWRcIlxuZXhwb3J0IGNvbnN0IG1vZHVsZUluc3RhbmNlS2V5ID0gXCJtb2R1bGVJbnN0YW5jZVwiXG5cbmV4cG9ydCBjb25zdCBkZWZpbmVEeW5hbWljSW1wb3J0ID0gKGdsb2JhbE5hbWU6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHdpbmRvd1tfX2ZlZGVyYXRpb25fX10gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0oe1tnbG9iYWxOYW1lXTogbW9kdWxlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZXIgbm90IGRlZmluZWQgZm9yIG1vZHVsZScsIG1vZHVsZSk7XG4gICAgfVxufSIsICJ0eXBlIFN0cmluZ1dpdGhBdXRvY29tcGxldGU8VD4gPSBUIHwgKHN0cmluZyAmIFJlY29yZDxuZXZlciwgbmV2ZXI+KTtcblxuZXhwb3J0IHR5cGUgTXlvcE1lc3NhZ2VLZXkgPSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMgfCBrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzLkluPjtcblxuZXhwb3J0IGNvbnN0IE15b3BNZXNzYWdlcyA9IHtcbiAgICAvL2hvc3QgdG8gY29tcG9uZW50XG4gICAgJ0luaXRSZXF1ZXN0JzogJ0luaXRSZXF1ZXN0JyxcbiAgICAnSW5pdFJlc3BvbnNlJzogJ0luaXRSZXNwb25zZScsXG4gICAgJ0luaXRNZXNzYWdlJzogJ0luaXRNZXNzYWdlJyxcbiAgICAnRGlzcG9zZU1lc3NhZ2UnOiAnRGlzcG9zZU1lc3NhZ2UnLFxuXG4gICAgJ0NoYW5nZVRleHRNZXNzYWdlJzogJ0NoYW5nZVRleHRNZXNzYWdlJyxcbiAgICAnQmluZENsaWNrTWVzc2FnZSc6ICdCaW5kQ2xpY2tNZXNzYWdlJyxcbiAgICAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdE15b3BSZWZzTWVzc2FnZScsXG5cbiAgICAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnOiAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnLFxuXG4gICAgJ0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJzogJ0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJyxcbiAgICAnU2V0QXR0cmlidXRlTWVzc2FnZSc6ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJzogJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnLFxuICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnOiAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZScsXG4gICAgJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnR2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnU2V0SW5uZXJIdG1sJzogJ1NldElubmVySHRtbCcsXG5cbiAgICAvL2NvbXBvbmVudCBtZXNzYWdlc1xuICAgICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJzogJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnLFxuICAgICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc6ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnLFxuXG4gICAgJ0NsZWFudXBNZXNzYWdlJzogJ0NsZWFudXBNZXNzYWdlJyxcblxuICAgIC8vIGV4dGVybmFsIHRvIGhvc3QgOlxuICAgIEluOiB7XG4gICAgICAgICdEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RlZE15b3BSZWZzTWVzc2FnZScsXG4gICAgICAgICdDbGlja1JlcGxheU1lc3NhZ2UnOiAnQ2xpY2tSZXBsYXlNZXNzYWdlJyxcbiAgICAgICAgJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnOiAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZScsXG5cbiAgICAgICAgJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnOiAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZScsXG4gICAgICAgICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJzogJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnLFxuXG4gICAgICAgIFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiOiBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIixcbiAgICAgICAgJ1JlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlJzogJ1JlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlJyxcbiAgICAgICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAgICAgJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAgICAgJ0NsZWFudXBSZXBsYXlNZXNzYWdlJzogJ0NsZWFudXBSZXBsYXlNZXNzYWdlJyxcbiAgICAgICAgJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc6ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnXG4gICAgfVxufVxuIiwgImV4cG9ydCAqIGZyb20gJy4vQmFzZU1lc3NhZ2UnO1xuXG4vL3VzZXIncyBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9CaW5kQ2xpY2tNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVJlZk1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0SW5uZXJIdG1sJztcblxuLy9zeXN0ZW0gbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vSW5pdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRW52ZWxvcGVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0RldGVjdE15b3BSZWZzTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAgJy4vR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xlYW51cE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EaXNwb3NlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7IiwgIi8vVE9ETyA6IHJldXNlIGZyb20gb25lIHBsYWNlLlxuLy8gbmVlZHMgdG8gYmUgdXNlZCBpbiBteW9wLXNkaywgbXlvcC1kYXNoYmFvcmQsIG15b3Atc2VydmVyLCBteW9wLWNsaSAuLlxuXG5leHBvcnQgY29uc3QgdXVpZHY0ID0gKCkgPT4ge1xuICAgIHJldHVybiBcIjEwMDAwMDAwLTEwMDAtNDAwMC04MDAwLTEwMDAwMDAwMDAwMFwiLnJlcGxhY2UoL1swMThdL2csIGMgPT5cbiAgICAgICAgKCtjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiArYyAvIDQpLnRvU3RyaW5nKDE2KVxuICAgICk7XG59XG5cbi8vIENvbnZlcnQgVVVJRCBzdHJpbmcgdG8gYnl0ZXNcbmV4cG9ydCBjb25zdCB1dWlkVG9CeXRlcyA9ICh1dWlkOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKFxuICAgICAgICB1dWlkLnJlcGxhY2UoLy0vZywgJycpLm1hdGNoKC8uezEsMn0vZykhLm1hcChieXRlID0+IHBhcnNlSW50KGJ5dGUsIDE2KSlcbiAgICApO1xufTtcblxuLy8gQ29udmVydCBieXRlcyB0byBVVUlEIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGJ5dGVzVG9VdWlkID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBoZXggPSBbLi4uYnl0ZXNdLm1hcChiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGhleC5zbGljZSgwLCA4KSxcbiAgICAgICAgaGV4LnNsaWNlKDgsIDEyKSxcbiAgICAgICAgaGV4LnNsaWNlKDEyLCAxNiksXG4gICAgICAgIGhleC5zbGljZSgxNiwgMjApLFxuICAgICAgICBoZXguc2xpY2UoMjApXG4gICAgXS5qb2luKCctJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZW5jb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRW5jb2RlID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMpKTtcbiAgICByZXR1cm4gYmFzZTY0LnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoLz0rJC8sICcnKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBkZWNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxEZWNvZGUgPSAoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICBsZXQgYmFzZTY0ID0gc3RyLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgd2hpbGUgKGJhc2U2NC5sZW5ndGggJSA0KSBiYXNlNjQgKz0gJz0nO1xuICAgIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGJpbmFyeSwgY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpO1xufTtcblxuLy8gQ29tcHJlc3MgYW4gYXJyYXkgb2YgVVVJRHMgaW50byBhIHNob3J0IFVSTC1zYWZlIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGNvbXByZXNzVVVJRHMgPSAodXVpZHM6IHN0cmluZ1tdKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBhbGxCeXRlcyA9IHV1aWRzLmZsYXRNYXAodXVpZCA9PiBBcnJheS5mcm9tKHV1aWRUb0J5dGVzKHV1aWQpKSk7XG4gICAgcmV0dXJuIGJhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShhbGxCeXRlcykpO1xufTtcblxuLy8gRGVjb21wcmVzcyBmcm9tIFVSTC1zYWZlIHN0cmluZyBiYWNrIHRvIGFuIGFycmF5IG9mIFVVSURzXG5leHBvcnQgY29uc3QgZGVjb21wcmVzc1VVSURzID0gKGVuY29kZWQ6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGJhc2U2NFVybERlY29kZShlbmNvZGVkKTtcbiAgICBpZiAoYnl0ZXMubGVuZ3RoICUgMTYgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCBsZW5ndGgnKTtcblxuICAgIGNvbnN0IHV1aWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgICAgIHV1aWRzLnB1c2goYnl0ZXNUb1V1aWQoYnl0ZXMuc2xpY2UoaSwgaSArIDE2KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZHM7XG59O1xuIiwgImV4cG9ydCAqIGZyb20gJy4vdXVpZC50cydcblxuZXhwb3J0IGNvbnN0IHdhaXQgPSAobXM6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge0lSZWZDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VEaXJlY3Rpb24ge1xuICAgIHN0YXRpYyBkb3duID0gJ2Rvd24nIGFzIGNvbnN0XG4gICAgc3RhdGljIHVwID0gJ3VwJyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uID0gJ3VwJyB8ICdkb3duJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTWVzc2FnZTxUID0gYW55PiB7XG4gICAgaWQgPSB1dWlkdjQoKVxuXG4gICAgc3RhdGljIGNyZWF0ZTxULCBVIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT4pID0+IFQgPSB0eXBlb2YgdGhpcz4oXG4gICAgICAgIHRoaXM6IFUsXG4gICAgICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPlxuICAgICk6IEluc3RhbmNlVHlwZTx0eXBlb2YgdGhpcz4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBuZXcgdGhpcyguLi5hcmdzKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnbWVlc2FnZSBpZCBjcmVhdGVkJywgdGhpcy5pZCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgfVxuXG4gICAgbXlvcCA9IHRydWVcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSB8IHN0cmluZztcblxuICAgIGNvbnRlbnQ/OiBUXG5cbiAgICAvLyBUT0RPIDogY2FudCBiZSBvcHRpb25hbCBcbiAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICBkZXN0aW5hdGlvbj86IHN0cmluZ1xuXG4gICAgcm91dGU/OiBzdHJpbmdbXVxuXG4gICAgcmVmPzogUmVmXG5cbiAgICBkaXJlY3Rpb24/OiBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uXG5cbiAgICBjbGVhbmFibGU6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BFbGVtZW50TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZE1lc3NhZ2U8VCA9IGFueSwgUiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuXG4gICAgcHVibGljIGFic3RyYWN0IHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXk7XG5cbiAgICBwdWJsaWMgaGFuZGxlclVuaXF1ZUlkID0gdXVpZHY0KClcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogUikgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVmIHtcbiAgICBwdWJsaWMgbXlvcCA9IHRydWU7XG5cbiAgICBwdWJsaWMgX19ub25Qcm94aWVkPzogUmVmO1xuXG4gICAgc3RhdGljIGNyZWF0ZShzZWxlY3Rvcjogc3RyaW5nLCByZWZDb25maWc/OiBJUmVmQ29uZmlnLCBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICBsZXQgX3JlZkNvbmZpZyA9IHJlZkNvbmZpZztcbiAgICAgICAgaWYgKCFfcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICBfcmVmQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JUeXBlOiAnaWQtYXR0cmlidXRlJyxcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvZGUnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWYoX3JlZkNvbmZpZywgY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmQ29uZmlnOiBJUmVmQ29uZmlnLCBwdWJsaWMgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fX25vblByb3hpZWQgPSB7XG4gICAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgICAgY29tcG9uZW50OiBudWxsIC8vIGluIG9yZGVyIHRvIGJlIHNlcmlhbGl6YWJsZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnQ2xpY2tSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQmluZENsaWNrTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBDbGlja1JlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0JpbmRDbGlja01lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGlja1JlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xpY2tSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxzdHJpbmc+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ0NoYW5nZVRleHRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHRleHRcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnXG5cbmNvbnN0IGZ1bmN0aW9uQm9keVJlZ2V4ID0gLyg/OmZ1bmN0aW9uXFxzKlxcdypcXHMqXFwoW14pXSpcXClcXHMqXFx7KFtcXHNcXFNdKj8pXFx9fChcXChbXildKlxcKVxccyo9PlxccypcXHsoW1xcc1xcU10qPylcXH0pKVxccyokLztcbmNvbnN0IGV4cHJlc3Npb25Cb2R5UmVnZXggPSAvXFwoXFxzKlteKV0rXFxzKlxcKVxccyo9PlxccyooLispLztcblxuZXhwb3J0IGNvbnN0IHN0cmlwRnVuY3Rpb24gPSAoY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChmdW5jdGlvbkJvZHlSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFsxXSB8fCBtYXRjaFszXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGV4cHJlc3Npb25Cb2R5UmVnZXgpO1xuICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgc2NyaXB0SW5wdXRzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cbn0gfCB7fTtcblxuZXhwb3J0IHR5cGUgc2NyaXB0VmFyczxUPiA9IHtcbiAgICBzZW5kOiAoZGF0YTogVCkgPT4gdm9pZDtcbiAgICAvLyBjb21wbGV0ZVN0cmVhbTogKCkgPT4gdm9pZDtcbiAgICByb290UmVmOiBSb290UmVmO1xuICAgIG1ha2VTZXJpYWxpemFibGU6IHR5cGVvZiBtYWtlU2VyaWFsaXphYmxlXG59XG5cbmV4cG9ydCB0eXBlIGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBJXTogSVtLXTtcbn0gJiBzY3JpcHRWYXJzPFQ+XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gYW55PiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTxzdHJpbmcsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4+IHtcblxuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xuICAgIG1lc3NhZ2VUeXBlID0gJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbiAgICBzY3JpcHQ6IHN0cmluZyA9ICcnXG5cbiAgICBzdGF0aWMgcmVwbGllcktleSA9ICdzZW5kJztcbiAgICBzdGF0aWMgY29tcGxldGVTdHJlYW1LZXkgPSAnY29tcGxldGVTdHJlYW0nO1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+KSA9PiBULCBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICB9LCBwdWJsaWMgc2NyaXB0SW5wdXRzPzogSSkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQudG9TdHJpbmcoKTtcblxuICAgICAgICAvL1RPRE86IGNhbiBiZSByZW1vdmVcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc3RyaXBGdW5jdGlvbih0aGlzLmNvbnRlbnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgY29udGVudDogVCkge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLFxuICAgIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UsXG4gICAgZXh0ZW5kZWRTY3JpcHRWYXJzLFxuICAgIHNjcmlwdElucHV0cywgc3RyaXBGdW5jdGlvblxufSBmcm9tIFwiLi9FeGVjdXRlU2NyaXB0TWVzc2FnZS50c1wiO1xuXG5leHBvcnQgdHlwZSBjdXN0b21SZWZTY3JpcHRJbnB1dHMgPSB7XG4gICAgZWxlbWVudElkOiBzdHJpbmcsXG4gICAgcmVmPzogSFRNTEVsZW1lbnQsXG4gICAgX3NjcmlwdD86IHN0cmluZyxcbiAgICBfX3NjcmlwdElucHV0cz86IE9iamVjdFxufTtcblxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlZk1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGN1c3RvbVJlZlNjcmlwdElucHV0cz4gZXh0ZW5kcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiB7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4pID0+IFQsXG4gICAgICAgICAgICAgICAgcHVibGljIHNjcmlwdElucHV0czogSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB9KSB7XG5cbiAgICAgICAgLy9tb2NrIHZhcnNcbiAgICAgICAgLy8gbGV0IHJvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHM7XG4gICAgICAgIHN1cGVyKCh7cm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0c30pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZnMgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yQWxsKGBbJHsnbXlvcC1pZCd9PScke2VsZW1lbnRJZH0nXWApO1xuICAgICAgICAgICAgaWYgKHJlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gIGNvbnN0IHJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB0aGluayBhYm91dCBleHBvc2luZyBcInJlZnNcIiBhbmQgbm90IG9ubHkgXCJyZWZcIlxuICAgICAgICAgICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHRoZSBSZWYgaGFzIG11bHRpcGxhdGUgaW1wbGVtZW50YXRpb25zXG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgX19zY3JpcHRJbnB1dHMucmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke19zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gRnVuY3Rpb24oJ3JlZicsICdyb290UmVmJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBfc2NyaXB0ISkocmVmLCByb290UmVmLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsIGFzIFQ7XG4gICAgICAgIH0sIGhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuc2NyaXB0SW5wdXRzID0ge1xuICAgICAgICAgICAgLi4uc2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgLy9fc2NyaXB0OiBzdHJpcEZ1bmN0aW9uKHNjcmlwdC50b1N0cmluZygpKSxcbiAgICAgICAgICAgIF9zY3JpcHQ6IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlU2tlbGV0b259IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVyTWVzc2FnZTxUIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCA9IGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXA+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlIHtcblxuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xuICAgIG1lc3NhZ2VUeXBlID0gJ0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPiA9IGZhbHNlIC8vIHt9IC8vIGVtcHR5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyB0eXBlOiBULCBwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcilcbiAgICB9XG5cbiAgICB3aXRoU2VyaWFsaXphYmxlU2tlbGV0b24oc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+KSB7XG4gICAgICAgIHRoaXMuc2VyaWFsaXphYmxlU2tlbGV0b24gPSBzZXJpYWxpemFibGVTa2VsZXRvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgZTogU2VyaWFsaXphYmxlPEV2ZW50Pikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7XG4gICAgICAgICAgICBlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZix9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cblxuZXhwb3J0IGNsYXNzIFNldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBGb3JtRGF0YUVudHJ5ID0ge1xuICAgIGlkPzogc3RyaW5nLFxuICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgdmFsdWU/OiBJbnB1dEVsZW1lbnRWYWx1ZSxcbiAgICByZXF1aXJlZD86IGJvb2xlYW4sXG4gICAgdmFsaWRpdHk/OiBTZXJpYWxpemFibGU8VmFsaWRpdHlTdGF0ZT4sXG4gICAgbXlvcElkPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudEZvcm1WYWx1ZSA9IHtcbiAgICBmb3JtRGF0YT86IHsgW2tleTogc3RyaW5nXTogRm9ybURhdGFFbnRyeSB9XG4gICAgdW5tYXBwZWREYXRhPzogRm9ybURhdGFFbnRyeVtdXG59O1xuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRWYWx1ZSA9IHN0cmluZyB8IElucHV0RWxlbWVudEZvcm1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IElucHV0RWxlbWVudFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxzdHJpbmc+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldElubmVySHRtbCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGlubmVySHRtbDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGlubmVySHRtbFxuICAgIH1cbn0iLCAiaW1wb3J0IHsgQmFzZU15b3BNZXNzYWdlIH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuLy8gc2VudCBieSBob3N0IHRvIGNvbXBvbmVudHMsIGNvbnRhaW5zIHRoaWVyIGlkIFxuZXhwb3J0IGNsYXNzIEluaXRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHsgaWQ6IHN0cmluZyB9PiB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHsgaWQgfVxuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbi8vIGNvbXBvbmVudCBub3RpZnkgaG9zdCB0aGUgaXQgd2FzIGluaXRhdGVkIFxuZXhwb3J0IGNsYXNzIEluaXRSZXNwb25zZSBleHRlbmRzIEluaXRNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0UmVzcG9uc2UnO1xufVxuXG4vLyBjb21wb25lbnQgYXNrIHRvIGhvc3QgdG8gZ2V0IGluaXRhdGVkIFxuZXhwb3J0IGNsYXNzIEluaXRSZXF1ZXN0IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0UmVxdWVzdCc7XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnRDb25maWcsIElSZWZDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3QvaG9zdFNESy50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ1JlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmQ29uZmlnOiBJUmVmQ29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG9wdGlvbnM6IGxvYWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKSA9PiB2b2lkLFxuICAgICkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcblxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTmVzdGVkUmVmID0ge1xuICAgIHJlZk5hbWU6IHN0cmluZyxcbiAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgbmVzdGVkUmVmczogTmVzdGVkUmVmW10sIHB1YmxpYyBmYWlsZWQ/OiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgRW52ZWxvcGVkTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRW52ZWxvcGVkTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZGVzdGluYXRpb246IHN0cmluZywgcHVibGljIG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGNvbnN0IGlubmVyRW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnJvdXRlID0gW2Rlc3RpbmF0aW9uLCAuLi5pbm5lckVudmVsb3BlZE1lc3NhZ2Uucm91dGUgPyBpbm5lckVudmVsb3BlZE1lc3NhZ2Uucm91dGUgOiBbXV07XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7SUVsZW1lbnRSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTxhbnksIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJ1xuICAgIHJlcGx5TWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG59XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxJRWxlbWVudFJlZltdPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIG15b3BFbGVtZW50UmVmczogSUVsZW1lbnRSZWZbXSkge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpXG4gICAgICAgIHRoaXMuY29udGVudCA9IG15b3BFbGVtZW50UmVmcztcbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbnR5cGUgTWV0aG9kTmFtZXM8VD4gPSB7XG4gICAgLy8gW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IEsgOiBuZXZlcjtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICgpID0+IHZvaWQgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG4vLyBEZWZpbmUgYSB0eXBlIHRoYXQgYWxsb3dzIG9ubHkgc3RyaW5ncyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZXRob2QgbmFtZXMgb2YgVFxudHlwZSBNZXRob2RTdHJpbmc8VD4gPSBNZXRob2ROYW1lczxUPiBleHRlbmRzIGluZmVyIE0gPyBNIGV4dGVuZHMgc3RyaW5nID8gTSA6IG5ldmVyIDogbmV2ZXI7XG5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIG1ldGhvZDogTWV0aG9kU3RyaW5nPElNeW9wQ29tcG9uZW50Pikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBDbGVhbnVwUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQ2xlYW51cE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNsZWFudXBGb3JNZXNzYWdlSWQ6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsZWFudXBSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjdXN0b21DbGVhbnVwOiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgRGlzcG9zZU1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0Rpc3Bvc2VNZXNzYWdlJztcbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJztcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleSwgTXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRGlzcG9zZU1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZlxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0hvc3RTREssIGxvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IG9ic2VydmVBdXRvU2l6ZSBjYWxsYmFja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TaXplUmVzdWx0IHtcbiAgICAvKiogQ3VycmVudCB3aWR0aCAoZnJvbSBjb250ZW50KSAqL1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgLyoqIEN1cnJlbnQgaGVpZ2h0IChmcm9tIGNvbnRlbnQpICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgLyoqIFdoZXRoZXIgd2lkdGggaXMgYmVpbmcgYXV0by1zaXplZCAqL1xuICAgIGF1dG9TaXppbmdXaWR0aDogYm9vbGVhbjtcbiAgICAvKiogV2hldGhlciBoZWlnaHQgaXMgYmVpbmcgYXV0by1zaXplZCAqL1xuICAgIGF1dG9TaXppbmdIZWlnaHQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igb2JzZXJ2ZUF1dG9TaXplIG1ldGhvZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TaXplT3B0aW9ucyB7XG4gICAgLyoqIENhbGxiYWNrIGNhbGxlZCB3aXRoIHNpemUgaW5mbyB3aGVuZXZlciBzaXplIGNoYW5nZXMgKi9cbiAgICBvblNpemVDaGFuZ2U/OiAocmVzdWx0OiBBdXRvU2l6ZVJlc3VsdCkgPT4gdm9pZDtcbiAgICAvKiogTWluaW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWluV2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gd2lkdGggY29uc3RyYWludCAqL1xuICAgIG1heFdpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNaW5pbXVtIGhlaWdodCBjb25zdHJhaW50ICovXG4gICAgbWluSGVpZ2h0PzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNYXhpbXVtIGhlaWdodCBjb25zdHJhaW50ICovXG4gICAgbWF4SGVpZ2h0PzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBFeHBsaWNpdCB3aWR0aCBzZXQgYnkgaG9zdCAtIGlmIGRlZmluZWQsIGRvbid0IGF1dG8tc2l6ZSB3aWR0aCAqL1xuICAgIGV4cGxpY2l0V2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgLyoqIEV4cGxpY2l0IGhlaWdodCBzZXQgYnkgaG9zdCAtIGlmIGRlZmluZWQsIGRvbid0IGF1dG8tc2l6ZSBoZWlnaHQgKi9cbiAgICBleHBsaWNpdEhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRm9yY2UgYXV0by1zaXplIGV2ZW4gaWYgY29udGFpbmVyIGhhcyBkaW1lbnNpb25zICovXG4gICAgZm9yY2VBdXRvU2l6ZT86IGJvb2xlYW47XG4gICAgLyoqIE1pbiBoZWlnaHQgdXNlZCBieSBsb2FkZXIgdG8gZGV0ZWN0IGNvbGxhcHNlIChkZWZhdWx0OiA1MCkgKi9cbiAgICBsb2FkZXJNaW5IZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8vVE9ETyA6IGNoYW5nZSBJTXlvcENvbXBvbmVudCB0byByZWYgc3BlY2lmaWMgaW1wbFxudHlwZSBSZWZUeXBlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBJTXlvcENvbXBvbmVudCB8IFJlZlxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcENvbXBvbmVudDxQID0gYW55LCBSID0gYW55PiB7XG5cbiAgICBpZDogc3RyaW5nO1xuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW47XG5cbiAgICBtYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbjtcblxuICAgIHNldEluaXRpYXRlZDogKCkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcblxuICAgIC8vcmVmIGNvbXBvbmVudHMgY2FuIGJlIGVsZW1lbnQtbGVzc1xuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgc2VuZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBDbGVhbnVwSGFuZGxlclxuXG4gICAgYmluZChtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6ICgpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgYmluZDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIC8vIGJvb2xlYW4gcmV0dXJuZWQgdmFsdWUgPSBoYW5kbGVkIG9yIG5vdFxuICAgIG9uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IGJvb2xlYW5cblxuICAgIGluaXRpYXRlZDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgZGlzcG9zZTogKCkgPT4gdm9pZFxuXG4gICAgaGlkZSgpOiB2b2lkO1xuXG4gICAgc2hvdygpOiB2b2lkO1xuXG4gICAgaW5zcGVjdCgpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIE9ubHkgYXZhaWxhYmxlIGZvciBpZnJhbWUtYmFzZWQgY29tcG9uZW50cy4gVXNlcyBkaXJlY3QgY29udGVudERvY3VtZW50IGFjY2Vzcy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplPzogKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpID0+IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VkIG15b3A6c2l6ZSBtZXRhIHRhZyBmcm9tIHRoZSBjb21wb25lbnQgSFRNTC5cbiAgICAgKiBTZXQgYnkgSFRNTENvbXBvbmVudExvYWRlciBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uLlxuICAgICAqIFVzZWQgYnkgdGhlIFJlYWN0IGhvc3QgdG8gZGV0ZXJtaW5lIHNpemluZyBtb2RlIChmaWxsIHZzIGNvbnRlbnQpLlxuICAgICAqL1xuICAgIHNpemVNZXRhPzogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsO1xuXG4gICAgcGFyZW50PzogSU15b3BDb21wb25lbnQ7XG5cbiAgICBwcm9wczogUFxuXG4gICAgcmVmczogUlxufVxuXG5mdW5jdGlvbiBpc0luaGVyaXRGcm9tKG9iajogYW55LCBiYXNlQ2xhc3M6IGFueSkge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuXG4gICAgaWYgKCFwcm90bykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IGJhc2VDbGFzcy5uYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNJbmhlcml0RnJvbShwcm90bywgYmFzZUNsYXNzKTtcbn1cblxuLy8gVE9ETyA6IG1vdmUgOiBcbnR5cGUgbWVzc2FnZUhhbmRsZXI8VD4gPSAobWVzc2FnZTogVCkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgZXh0ZW5kcyBSZWZUeXBlcyA9IFJlZlR5cGVzPiBpbXBsZW1lbnRzIElNeW9wQ29tcG9uZW50PFA+IHtcbiAgICBpZDogc3RyaW5nID0gJydcblxuICAgIG1lc3NhZ2VIYW5kbGVyczogUmVjb3JkPHN0cmluZywgbWVzc2FnZUhhbmRsZXI8YW55PltdPiA9IHt9O1xuXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkIHx8IEhvc3RTREsuSW5zdGFuY2UoKS5hc3NpZ25JZChjb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQgPyBvcHRpb25zPy50aW1lb3V0IDogNSAqIDEwMDA7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkICYmIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgJiYgIXRoaXMuX21hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgdGltZW91dF8ke3RpbWVvdXR9ICR7dGhpcy5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGF1dG8gaW5zcGVjdCwgY29udHJvbCBmcm9tIGNvbmZpZ1xuICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLmhvc3RTREsuaW5zcGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX21hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBnZXQgbWFya2VkRm9yRGlzcG9zZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZDtcbiAgICB9XG5cbiAgICBzZXQgbWFya2VkRm9yRGlzcG9zZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWRPcGVyYXRpb25FeGNlcHRpb246IFRoZSBjb21wb25lbnQgaXMgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkaXNwb3NlZC4gRGlzcG9zZSBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBhZ2FpbiB1bnRpbCB0aGUgY3VycmVudCBkaXNwb3NhbCBwcm9jZXNzIGlzIGNvbXBsZXRlLicpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBoaWRlKCk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzaG93KCk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBpbnNwZWN0KCk6IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLy9UT0RPOiB1c2UgYmluZFdoZW4gd2l0aCByZXR1cm4gdHJ1ZSBwcmVkaWNhdGUgLi4uXG4gICAgYmluZCA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLmluY2x1ZGVzKGhhbmRsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmRXaGVuID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIHByZWRpY2F0ZTogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4sIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiB2b2lkKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuXFwndCB1c2UgY29tcG9uZW50LmJpbmRXaGVuIHdpdGhvdXQgYW4gaGFuZGxlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXTtcblxuICAgICAgICBjb25zdCBwcmVkaWNhdGVXcmFwcGVkSGFuZGxlciA9IChlOiBUKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcihlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvL1RPRE8gOiBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvbiA/XG4gICAgICAgIGhhbmRsZXJzLnB1c2gocHJlZGljYXRlV3JhcHBlZEhhbmRsZXIpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGhhbmRsZXJzLmluZGV4T2YocHJlZGljYXRlV3JhcHBlZEhhbmRsZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ29uTWVzc2FnZVJlY2VpdmVkJywgZG9jdW1lbnQubG9jYXRpb24uaHJlZiwgaW5jb21lTWVzc2FnZSwgdGhpcyk7XG4gICAgICAgIC8vVE9ETyA6IGhhbmRlbCBzcGVjaWFsIGV2ZXRzID8gbGlrZSBpbml0UmVzID9cbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAoaW5jb21lTWVzc2FnZSBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKTtcblxuICAgICAgICAgICAgLy9rZWVwaW5nIHRoaXMubWV0aG9kKCkgc28gdGhhdCBjb250ZXh0IHdpbGwgc2F2ZWRcbiAgICAgICAgICAgIGlmICgodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSh0eXBlZE1lc3NhZ2UuY29udGVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBtZXRob2Qgbm90IGZvdW5kICR7dHlwZWRNZXNzYWdlLm1ldGhvZH0gb24gY29tcG9uZW50YCwgdGhpcylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzW2luY29tZU1lc3NhZ2UubWVzc2FnZVR5cGVdO1xuICAgICAgICBpZiAoaGFuZGxlcnMgJiYgaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBoYW5kbGVkIHx8IGhhbmRsZXIoaW5jb21lTWVzc2FnZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGNvbnNvbGUgb25seSB3aGVuIGRlYnVnIGNvbmZpZ1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gaGFuZGxlcnMgZm91bmQgZm9yICcsIGluY29tZU1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNldEluaXRpYXRlZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKVxuICAgICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgX3doZW5Jbml0aWF0ZWRSZXNvbHZlPzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG4gICAgX3doZW5Jbml0aWF0ZWRSZWplY3Q/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcblxuICAgIF93aGVuSW5pdGlhdGVkOiBQcm9taXNlPGFueT4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIGluaXRpYXRlZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3doZW5Jbml0aWF0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZW5kQ2xlYW51cE1lc3NhZ2UobWVzc2FnZTogQ2xlYW51cE1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKG1lc3NhZ2UucmVwbHlNZXNzYWdlS2V5LCAobXNnOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSBtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZFxuICAgICAgICB9LCAobTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2UuaGFuZGxlcihtKTtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXI7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIHRoaXMuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIHNlbmQobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIge1xuICAgICAgICAvL21lc3NhZ2VzIHRoYXQgZXhldHJhY3RlZCBmcm9tIGVudmVsb3BlIGFscmVhZHkgaGF2ZSBzb3VyY2UgaW4gdGhlbVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSB0aGlzLmlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuXG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGxldCBjbGVhbnVwSGFuZGxlcjtcbiAgICAgICAgLy8gVE9ETyA6IGZpeCBoZWF2eSBvcC4uXG4gICAgICAgIC8vICBpZiAoaXNJbmhlcml0RnJvbShtZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKG1lc3NhZ2UuaGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgTXlvcEJpbmRNZXNzYWdlKTtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbih0eXBlZE1lc3NhZ2UucmVwbHlNZXNzYWdlS2V5LCAobXNnOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gdHlwZWRNZXNzYWdlLmhhbmRsZXJVbmlxdWVJZFxuICAgICAgICAgICAgfSwgdHlwZWRNZXNzYWdlLmhhbmRsZXIpO1xuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE86IHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgaWYgKG1lc3NhZ2UucmVmKSB7XG4gICAgICAgICAgICAvLyBzZXJpYWxpemFibGVcbiAgICAgICAgICAgIG1lc3NhZ2UucmVmID0gbWVzc2FnZS5yZWYuX19ub25Qcm94aWVkIHx8IG1lc3NhZ2UucmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZENsZWFudXBNZXNzYWdlKG5ldyBDbGVhbnVwTWVzc2FnZShtZXNzYWdlLmlkLCAocmVwbGF5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZyByZXBsYXk/XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNsZWFudXBIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHNkay5sb2dnZXJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2Rpc3Bvc2luZyBiZWZvcmUgaXNJbml0aWF0ZWQnLCB0aGlzLmlkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnZGlzcG9zaW5nIGNvbXBvbmVudCcsIHRoaXMuaWQpO1xuXG4gICAgICAgIC8vIC8vVE9ETyA6IGltcGxlbWVudCBkaXNwb3NlIGZsb3dcbiAgICAgICAgLy8gT2JqZWN0LmtleXModGhpcy5yZWZzKS5mb3JFYWNoKHJlZktleT0+e1xuICAgICAgICAvLyAgICAgdGhpcy5yZWZzW3JlZktleV0uZGlzcG9zZSgpO1xuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvL1RPRE8gOiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgdGltZSBmb3IgdGhlIG9cbiAgICAgICAgLy8gdGhlciBzaWRlIHRvIHByb2NjZXNzIHRvIG1lc3NhZ2UgYmVmb3JlIGRpZSA/XG4gICAgICAgIC8vbm90aWZ5IHRoZSBvdGhlciBzaWRlIFNES1xuICAgICAgICB0aGlzLnNlbmQobmV3IERpc3Bvc2VNZXNzYWdlKCkpXG5cbiAgICAgICAgY29uc3Qgb25EaXNwb3NlSGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1snb25EaXNwb3NlJ11cbiAgICAgICAgaWYgKG9uRGlzcG9zZUhhbmRsZXJzKSB7XG4gICAgICAgICAgICBvbkRpc3Bvc2VIYW5kbGVycy5mb3JFYWNoKGRpc3Bvc2VIYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIG51bGwgb3IgZml4IHRoZSB0eXBlID9cbiAgICAgICAgICAgICAgICBkaXNwb3NlSGFuZGxlcihudWxsKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMgPSB7fVxuICAgICAgICB0aGlzLmlkICs9ICdfZGlzcG9zZWQnO1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvcHM6IFAgPSB7fSBhcyB1bmtub3duIGFzIFA7XG4gICAgcmVmczogUiA9IHt9IGFzIHVua25vd24gYXMgUjtcbn1cbiIsICJleHBvcnQgaW50ZXJmYWNlIElFbGVtZW50UmVmIHtcbiAgICBteW9wSWQ/OiBzdHJpbmdcbiAgICBodG1sVGFnTmFtZTogc3RyaW5nXG4gICAgQm91bmRpbmdSZWN0PzogRE9NUmVjdFxuICAgIG9mZnNldFRvcD86IG51bWJlclxuICAgIG9mZnNldExlZnQ/OiBudW1iZXJcblxuICAgIHR5cGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgWFBhdGhFbGVtZW50UmVmIGltcGxlbWVudHMgSUVsZW1lbnRSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB4UGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nID0gJ1hQYXRoRWxlbWVudFJlZidcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BFbGVtZW50UmVmIGltcGxlbWVudHMgSUVsZW1lbnRSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBteW9wSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgaHRtbFRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgQm91bmRpbmdSZWN0PzogRE9NUmVjdCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0VG9wPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRMZWZ0PzogbnVtYmVyKSB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nID0gJ015b3BFbGVtZW50UmVmJ1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXJ9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5cbmV4cG9ydCB0eXBlIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwID0gQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPiB8IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgY29uc3QgcnVuRXhlY3V0b3JDbGVhbnVwID0gYXN5bmMgKHRhc2s6IElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0YXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEl0J3MgYSBmdW5jdGlvbiwgY2FsbCBpdFxuICAgICAgICB0YXNrKCk7XG4gICAgfSBlbHNlIGlmICh0YXNrIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAvLyBJdCdzIGEgUHJvbWlzZSwgYXdhaXQgaXRcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFzaztcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgICAgICByZXN1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0YXNrIGlzIHZvaWQsIGRvIG5vdGhpbmdcbn1cblxudHlwZSBJTWVzc2FnZUV4ZWN1dG9yPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+ID0gKG1lc3NhZ2U6IFQpID0+IElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwO1xuXG5pbnRlcmZhY2UgSU1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcblxuICAgIGV4ZWN1dG9yOiBJTWVzc2FnZUV4ZWN1dG9yPFQ+O1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gaW1wbGVtZW50cyBJTWVzc2FnZUhhbmRsZXI8VD4ge1xuXG4gICAgLy9UT0RPIDogYWRkIGRpc3Bvc2UgbWV0aG9kXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQpIHtcblxuICAgIH1cblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuICAgIGFic3RyYWN0IGV4ZWN1dG9yOiBJTWVzc2FnZUV4ZWN1dG9yPFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55LCBFID0gYW55PiBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkLCBwdWJsaWMgY29udGV4dD86IEUpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIHJ1bkV4ZWN1dG9yQ2xlYW51cH0gZnJvbSBcIi4vaW5kZXgudHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9iYXNlTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLCBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEVudmVsb3BlZE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIEhvc3RlZENvbXBvbmVudDxUID0gYW55PiB7XG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICB9XG5cbiAgICAvL29uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBJTXlvcE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaWQ6IHN0cmluZywgcHVibGljIGNvbnRleHQ/OiBUKSB7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BTREsge1xuICAgIGluaXQ6ICgpID0+IHZvaWQ7XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXM6IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD47XG59XG5cbi8vIGNvbnN0IGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcyA9IFtcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QsXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSxcbi8vICAgICAvL015b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlLFxuLy8gXVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BTREsgaW1wbGVtZW50cyBJTXlvcFNESyB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGFic3RyYWN0IHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIG1lc3NhZ2VUb0hhbmRsZUFmdGVySW5pdDogQmFzZU15b3BNZXNzYWdlW10gPSBbXTtcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD4gPSB7fTtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3Q6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgbWVzc2FnZUNsZWFudXBDYWNoZTogUmVjb3JkPHN0cmluZywgQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPj4gfCBQcm9taXNlPHZvaWQ+ID0ge307XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlcyhldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGV2ZW50LmRhdGEgPyBldmVudC5kYXRhIDogZXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgLy8gbm90IG15b3AgbWFya2VkIGV2ZW50IFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBiYXNlU0RLLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgKGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKSkge1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICAgIC8vVE9ETyA6IGZpeCBkaXJlY3Rpb24gPyBtZXNzYWdlIHdpbGwgbm90IHByb2NjZXNzIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5EaXNwb3NlTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzaG91bGQgbm90IGJlIG9wdGlvbmFsLCBmaXggYW5kIHJlbW92ZSAnaWYnXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbl1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGdvdCBvdXIgaWQgZnJvbSBvdXIgaG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IFNESyBtYXkgc2VydmUgbW9yZSB0aGFuIDEgY29tcG9uZW50IC4uIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwicmVjaGl2ZWQgaW5pdCBtZXNzYWdlIGZvciBhbiBleHNpc2luZyBjb21wb25lbnQuXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdID0gbmV3IEhvc3RlZENvbXBvbmVudChuZXdDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXNwb25zZShuZXdDb21wb25lbnRJZCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZm9yIHNhbWUgSG9zdFNESyBjYXNlc1xuICAgICAgICAgICAgLy8gd2hlbiBib3RoIFJlZkNvbXBvbmVudCBhbmQgcmVhbENvbXBvbmVudCBob3N0ZWQgaW4gdGhlIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyTWVzc2FnZSA9IGVudmVsb3BlZE1lc3NhZ2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gaW5uZXJNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCB8fCB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbiFdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gaW5uZXJNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGVudmVsb3BlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKXtcbiAgICAgICAgICAgIC8vICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgOiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlID0gbWVzc2FnZSBhcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuICAgICAgICAgICAgLy8gLy8gICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DbGVhbnVwTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENsZWFudXBNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwTWVzc2FnZSA9IG5ldyBDbGVhbnVwUmVwbGF5TWVzc2FnZSghIWNsZWFudXApO1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwTWVzc2FnZS5kZXN0aW5hdGlvbiA9IG1lc3NhZ2UuZGVzdGluYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5FeGVjdXRvckNsZWFudXAoY2xlYW51cCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRlbCBlcnJvcj9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25IYW5kbGVyRm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIubWVzc2FnZVR5cGUgPT09IG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkhhbmRsZXJGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gaGFuZGxlci5leGVjdXRvcihtZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlICYmIGNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbbWVzc2FnZS5pZF0gPSBjbGVhbnVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYW51cCAmJiAhbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIG5vbi1jbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xlYW51cCAmJiBtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3IgYSBjbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25IYW5kbGVyRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogcHJpbnQgd2l0aCBkZWJ1ZyBjb25maWcgb25seVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBtZXNzYWdlIGhhbmRsZXIgd2FzIGZvdW5kIGZvciAnLCBtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Vuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZScpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbml0OiAoKSA9PiB2b2lkO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgKiBmcm9tICcuL015b3BFbGVtZW50UmVmJztcbmV4cG9ydCAqIGZyb20gJy4vYmFzZU1lc3NhZ2VIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQmFzZU15b3BTREsnO1xuXG5leHBvcnQgdHlwZSBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgRGljdGlvbmFyeTxUPiA9IHsgW2tleTogc3RyaW5nXTogVDsgfTtcblxuLy9leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9ICdJZnJhbWVMb2FkZXInIHwgJ1dlYkNvbXBvbmVudExvYWRlcicgfCAnSFRNTExvYWRlcicgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBTa2luTG9hZGVycyA9IHtcbiAgICBcIklmcmFtZUxvYWRlclwiOiBcIklmcmFtZUxvYWRlclwiLFxuICAgIFwiV2ViQ29tcG9uZW50TG9hZGVyXCI6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCIsXG4gICAgXCJIVE1MTG9hZGVyXCI6IFwiSFRNTExvYWRlclwiLFxuICAgIFwiTWluaW1pemVkTG9hZGVyXCI6IFwiTWluaW1pemVkTG9hZGVyXCJcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9IGtleW9mIHR5cGVvZiBTa2luTG9hZGVycztcblxuZXhwb3J0IHR5cGUgUHJvcFR5cGUgPSAnYW55JyB8ICdzdHJpbmcnIHwgJ251bWJlcicgfCBzdHJpbmc7IC8vIFRPRE8gOiA8XG5leHBvcnQgdHlwZSBSZWZTZWxlY3RvclR5cGUgPSAnaWQtYXR0cmlidXRlJyB8ICdjc3Mtc2VsZWN0b3InIHwgJ3hwYXRoJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IExvYWRlckZyYW1ld29ya3MgPSB7XG4gICAgXCJyZWFjdFwiOiBcInJlYWN0XCIsXG4gICAgXCJ2dWVcIjogXCJ2dWVcIixcbiAgICBcImFuZ3VsYXJcIjogXCJhbmd1bGFyXCIsXG59IGFzIGNvbnN0XG5leHBvcnQgdHlwZSBMb2FkZXJGcmFtZXdvcmtUeXBlID0ga2V5b2YgdHlwZW9mIExvYWRlckZyYW1ld29ya3M7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIldlYkNvbXBvbmVudExvYWRlclwiO1xuICAgIHVybDogc3RyaW5nLFxuICAgIHRhZzogc3RyaW5nLFxuICAgIGZyYW1ld29yaz86IExvYWRlckZyYW1ld29ya1R5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSWZyYW1lTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSWZyYW1lTG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmdcbiAgICBhdXRvSGVpZ2h0OiBib29sZWFuXG4gICAgaGVpZ2h0Pzogc3RyaW5nXG4gICAgd2lkdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNoYWRvd1Jvb3RNb2RlVHlwZSA9IHtcbiAgICBcIm9wZW5cIjogXCJvcGVuXCIsXG4gICAgXCJjbG9zZWRcIjogXCJjbG9zZWRcIixcbiAgICBcIm5vbmVcIjogXCJub25lXCIsXG4gICAgXCJsb2NhbEZyYW1lXCI6IFwibG9jYWxGcmFtZVwiXG59IGFzIGNvbnN0O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUhUTUxMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJIVE1MTG9hZGVyXCI7XG4gICAgSFRNTDogc3RyaW5nO1xuICAgIC8vVE9ETzogcmVuYW1lKHJvb3RNb2RlL2N1c3RvbUVsZW1lbnRNb2RlKSArIGRiIG1pZ3JhdGlvblxuICAgIHNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZTtcbiAgICBhdXRvSGVpZ2h0PzogYm9vbGVhbjtcbiAgICBoZWlnaHQ/OiBzdHJpbmc7XG4gICAgd2lkdGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBhbiBpbmxpbmUtSFRNTCAobG9jYWxGcmFtZSkgY29tcG9uZW50IGlzIHJlbmRlcmVkIGluIGEgc2FuZGJveGVkLFxuICAgICAqIGNyb3NzLW9yaWdpbiBpZnJhbWUgd2l0aCBOTyBhY2Nlc3MgdG8gdGhlIGhvc3QgZG9jdW1lbnQgKHVudHJ1c3RlZCBjb2RlKS5cbiAgICAgKiBUaGUgaG9zdCByZW5kZXIgcG9saWN5IGNhbiBhbHNvIGZvcmNlIHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgY29uZmlnIHZhbHVlLlxuICAgICAqL1xuICAgIGlzb2xhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSG93IGEgY29tcG9uZW50IGlzIHJlbmRlcmVkIG9uIHRoZSBob3N0IHBhZ2UsIGluIGFzY2VuZGluZyBpc29sYXRpb246XG4gKiAgLSAnd2ViQ29tcG9uZW50JyAgIFx1MjAxNCBjdXN0b20gZWxlbWVudCBvbiB0aGUgaG9zdCBkb2N1bWVudCAobW9zdCBwcml2aWxlZ2VkKVxuICogIC0gJ2lmcmFtZScgICAgICAgICBcdTIwMTQgc2FtZS1vcmlnaW4gaW5saW5lLUhUTUwgaWZyYW1lICh0b2RheSdzIGRlZmF1bHQpXG4gKiAgLSAnaXNvbGF0ZWRJZnJhbWUnIFx1MjAxNCBzYW5kYm94ZWQsIGNyb3NzLW9yaWdpbiBpZnJhbWUgKHVudHJ1c3RlZCBjb2RlKVxuICovXG5leHBvcnQgdHlwZSBSZW5kZXJNb2RlID0gJ3dlYkNvbXBvbmVudCcgfCAnaWZyYW1lJyB8ICdpc29sYXRlZElmcmFtZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyUG9saWN5Q29udGV4dCB7XG4gICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWc7XG4gICAgc2tpbjogSVNraW5Db25maWc7XG4gICAgLyoqIFdoYXQgdGhlIGNvbXBvbmVudCBhc2tlZCBmb3IgKG1hcmtlciBcdTIxRDIgJ3dlYkNvbXBvbmVudCcsIGNvbmZpZy5pc29sYXRpb24gXHUyMUQyICdpc29sYXRlZElmcmFtZScpLiAqL1xuICAgIHJlcXVlc3RlZE1vZGU6IFJlbmRlck1vZGU7XG4gICAgLyoqIFdoZXRoZXIgdGhlIEhUTUwgY2FycmllcyB0aGUgYDwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPmAgbWFya2VyLiAqL1xuICAgIGlzV2ViQ29tcG9uZW50OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhvc3Qtc3VwcGxpZWQgZ2F0ZSBkZWNpZGluZyBob3cgKG9yIHdoZXRoZXIpIGEgY29tcG9uZW50IHJlbmRlcnMuIFJldHVybiBhXG4gKiBSZW5kZXJNb2RlIHRvIHVzZSwgb3IgYGZhbHNlYCB0byBibG9jayByZW5kZXJpbmcgZW50aXJlbHkuXG4gKi9cbmV4cG9ydCB0eXBlIFJlbmRlclBvbGljeSA9XG4gICAgKGN0eDogUmVuZGVyUG9saWN5Q29udGV4dCkgPT4gUmVuZGVyTW9kZSB8IGZhbHNlIHwgUHJvbWlzZTxSZW5kZXJNb2RlIHwgZmFsc2U+O1xuXG4vL2ZvciBpbnRlcm5hbCBkYXNoYm9hcmQgdXNhZ2VcbmV4cG9ydCBpbnRlcmZhY2UgSU1pbmltaXplZExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIk1pbmltaXplZExvYWRlclwiO1xufVxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkT2JqZWN0IHtcbiAgICBfdGVtcF9jbGllbnRfaWQ/OiBzdHJpbmcsXG59XG5cbnR5cGUgRXh0ZW5kPFQsIFU+ID0gVCAmIFU7XG5cbnR5cGUgRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgRV06IEVbS107XG59ICYge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgID8gRXh0ZW5kUmVjdXJzaXZlbHk8VFtLXSwgRT5cbiAgICAgICAgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgSURhc2hib2FyZDxUPiA9IEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIERhc2hib2FyZE9iamVjdD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlXG5cbiAgICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVJlbGVhc2VNZXRhZGF0YSB7XG4gICAgZW52aXJvbm1lbnRJZDogc3RyaW5nO1xuICAgIGVudmlyb25tZW50SWRlbnRpZmllcjogc3RyaW5nO1xuICAgIHJlbGVhc2VkT24/OiBzdHJpbmc7XG4gICAgcmVsZWFzZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JVmFyaWFudENvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIHJlbGVhc2VzPzogdjJfSVJlbGVhc2VNZXRhZGF0YVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Db25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5Db25maWcge1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQmluZE1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBjb25zdCBQcm9wTWVzc2FnZU1vZGVzID0ge1xuICAgIFwiaW5wdXRcIjogXCJpbnB1dFwiLFxuICAgIFwib3V0cHV0XCI6IFwib3V0cHV0XCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyA9IHtcbiAgICBcIm1lc3NhZ2VcIjogXCJtZXNzYWdlXCIsXG4gICAgXCJjb2RlXCI6IFwiY29kZVwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yUGFyYW0ge1xuICAgIHZhbHVlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvZGVCZWhhdmlvciBleHRlbmRzIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IFwiY29kZVwiXG4gICAgcmVtYXA/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvciBleHRlbmRzIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IFwibWVzc2FnZVwiXG4gICAgbWVzc2FnZTogTXlvcE1lc3NhZ2VLZXlcbiAgICByZWY6IHN0cmluZywgLy9UT0RPIG1ha2UgaXQgaWRcbiAgICBwYXJhbXM6IElQcm9wTWVzc2FnZUJlaGF2aW9yUGFyYW1bXVxuICAgIG1vZGU6IGtleW9mIHR5cGVvZiBQcm9wTWVzc2FnZU1vZGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBiZWhhdmlvcjogSVByb3BCZWhhdmlvclxufVxuXG5cbmV4cG9ydCBjbGFzcyBSZWZCZWhhdmlvclR5cGUge1xuICAgIHN0YXRpYyBjb2RlID0gJ2NvZGUnIGFzIGNvbnN0XG4gICAgc3RhdGljIGNvbXBvbmVudCA9ICdjb21wb25lbnQnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIElSZWZCZWhhdmlvclR5cGUgPSAnY29kZScgfCAnY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6IElSZWZCZWhhdmlvclR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50UmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb21wb25lbnQnXG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBQcm9wZXJ0eSBpbnN0YW5jZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqL1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29kZVJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29kZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVmQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHNlbGVjdG9yVHlwZTogUmVmU2VsZWN0b3JUeXBlXG4gICAgc2VsZWN0b3I6IHN0cmluZ1xuICAgIGJlaGF2aW9yOiBJUmVmQmVoYXZpb3Jcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgcnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudFJ1bGUge1xuICAgIHByb3BlcnR5OiBzdHJpbmc7XG4gICAgb3BlcmF0b3I6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IHZlcnNpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHBlcmNlbnRhZ2U6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0IHtcbiAgICB2ZXJzaW9uczogSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbltdO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJ1bGVzOiBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlW107XG4gICAgdXNlQWI6IGJvb2xlYW47XG4gICAgY29tcG9uZW50VmFyaWFudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAgIGFiU3BsaXQ/OiBJRXhwZXJpZW5jZUFCU3BsaXQ7XG4gICAgc3RpY2t5UHJvcGVydGllcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgZGVmaW5pdGlvbiBjb25maWcgKHYyKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlRGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICAvKiogU2VsZWN0ZWQgY29tcG9uZW50IElEcyAqL1xuICAgIGNvbXBvbmVudHM6IHN0cmluZ1tdO1xuICAgIC8qKiBTZWdtZW50IGNvbmZpZ3VyYXRpb25zICovXG4gICAgc2VnbWVudHM6IElFeHBlcmllbmNlU2VnbWVudFtdO1xuICAgIC8qKiBGYWxsYmFjayB2YXJpYW50IHBlciBjb21wb25lbnQgKi9cbiAgICBmYWxsYmFjazogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAvKiogVGFncyAqL1xuICAgIHRhZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIC8vIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBJUHJvcENvbmZpZz4gLy9pZCAtIHR5cGVcbiAgICAvLyByZWZzOiBSZWNvcmQ8c3RyaW5nLCBJUmVmQ29uZmlnPixcbiAgICAvLyBza2luczogUmVjb3JkPHN0cmluZywgSVNraW5Db25maWc+XG4gICAgcHJvcHM6IElQcm9wQ29uZmlnW10sXG4gICAgcmVmczogSVJlZkNvbmZpZ1tdLFxuICAgIHNraW5zOiBJU2tpbkNvbmZpZ1tdLFxuICAgIGRlZmF1bHRTa2luOiBudW1iZXI7XG5cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgLy9yZXNvbHZlZERlZmluaXRpb25zPzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbXVxuICAgIC8vVE9ETyA6IG1vdmUgdG8gYmFzZSBjbGFzcyAoIElTdG9yYWJsZUl0ZW0gb3Igc28uLi4pXG5cbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lCYXNlTXlvcE9iamVjdCB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JTXlvcFN0b3JlZE9iamVjdCBleHRlbmRzIHYyX0lCYXNlTXlvcE9iamVjdCB7XG4gICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50QWNjZXNzIHtcbiAgICB2aXNpYmlsaXR5OiAncHJpdmF0ZScgfCAndW5saXN0ZWQnIHwgJ3B1YmxpYyc7XG4gICAgdW5saXN0ZWQ/OiB7XG4gICAgICAgIHNsdWc6IHN0cmluZztcbiAgICB9O1xuICAgIG1hcmtldHBsYWNlPzoge1xuICAgICAgICBzdGF0dXM6ICdkcmFmdCcgfCAnc3VibWl0dGVkJyB8ICdjbGFpbWVkJyB8ICdjbG9zZWQnO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBjb250YWN0RW1haWw6IHN0cmluZztcbiAgICAgICAgZGVhZGxpbmU6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIHZhcmlhbnRzX2lkczogc3RyaW5nW10sXG4gICAgRFRPczogdjJfSURUT1tdLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICAgIGFjY2Vzcz86IENvbXBvbmVudEFjY2VzcyxcblxuICAgIC8vXG4gICAgdmFyaWFudHNfbmFtZXM6IHN0cmluZ1tdLFxuICAgIHZhcmlhbnRzX2RhdGE6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBpZDogc3RyaW5nXG4gICAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbiAgICAgICAgaGFzX3JlbGVhc2VzPzogYm9vbGVhblxuICAgIH1bXSxcblxuICAgIHByZXZpZXdfdmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7XG4gICAgZXh0cmE/OiB7XG4gICAgICAgIGZpcnN0VmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7IC8vd2hlbiBuZXcgY29tcG9uZW50IGNyZWF0ZXMgYXQgdGhlIGNsaWVudFxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JRFRPIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGRhdGE6IG9iamVjdFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luSW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMsXG4gICAgLy9za2luczogSVNraW5JbnN0YW5jZUNvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBTZWdtZW50VHlwZSA9IHtcbiAgICBcIkZ1bmN0aW9uUmVzdWx0XCI6IFwiRnVuY3Rpb25SZXN1bHRcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRJbnN0YW5jZSB7XG4gICAgc2VnbWVudElkOiBzdHJpbmc7XG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTZWdtZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvblJlc3VsdHNTZWdtZW50IGV4dGVuZHMgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IHR5cGVvZiBTZWdtZW50VHlwZS5GdW5jdGlvblJlc3VsdFxuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBmdW5jdGlvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTa2luU2VsZWN0b3JUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRlZFwiOiBcIlNlZ21lbnRlZFwiLFxuICAgIFwiRGVkaWNhdGVkXCI6IFwiRGVkaWNhdGVkXCIsXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIFNlbGVjdG9yIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICAgKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIFwiRGVmYXVsdFwiOiBcIkRlZmF1bHRcIlxufSBhcyBjb25zdDtcblxuXG4vKipcbiAqIFRoaXMgU2tpbiBDb25maWcgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICpcbiAqIEB0eXBlIHtJRGVmYXVsdFNraW5Db25maWd9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlZmF1bHRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZmF1bHQsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkLFxuICAgIHNlZ21lbnRzOiBJU2VnbWVudEluc3RhbmNlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVkaWNhdGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNraW59IGluc3RlYWQuXG4gICAgICogUHJvcGVydHkgc2tpbnMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSB0byB1c2Uge0BsaW5rIHNraW59IGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgc2tpbnM/OiBJU2tpbkluc3RhbmNlQ29uZmlnW10gLy8gZGVwcmVjYXRlZFxuICAgIHNraW46IElTa2luSW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIC8vVE9ETyA6XG4gICAgLy8gUmVmSUQgPyB0byBzdXBwb3J0IG1vcmUgdGhhbiAxIGNvbXBvbmVudCBmcm9tIHRoZSBzYW1lIHR5cGUgaW4gY29tcG9zaXRlcyA/XG5cbiAgICAvL1RPRE8gOiByZW1vdmVcbiAgICBjb21wb25lbnROYW1lOiBzdHJpbmc7IC8vIDw8IGNoZWNrXG5cbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcblxuICAgIC8vIHN0b3JpbmcgdGhlIG5lc3RlZCBjb25maWcgZm9yIHJlZiBjb21wb25lbnRzXG4gICAgbmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdXG5cbiAgICAvL29ubHkgb24gR0VUP1xuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICByZXNvbHZlZEV4cGVyaWVuY2VzPzogSUV4cGVyaWVuY2VbXVxuICAgIC8vIHdpbGwgaW5jbHVkZSBpbnN0YW5jZSBhbmQgZGVmIGNvbmZpZyBpbiBvcmRlciB0byByZW5kZXIgaW4gcHJvZHVjdGlvblxuICAgIHJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgRXhwZXJpZW5jZVR5cGVzID0ge1xuICAgIFwiU2VnbWVudFwiOiBcIlNlZ21lbnRcIixcbiAgICBcIlByb21vXCI6IFwiUHJvbW9cIixcbiAgICBcIkFCXCI6IFwiQUJcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICAvL3N0aWNraW5lc3NGYWN0b3JcbiAgICAvL0VuZERhdGVcbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlR3JvdXAge1xuLy8gICAgIGlkOiBzdHJpbmdcbi8vICAgICBuYW1lOiBzdHJpbmdcbi8vICAgICBwZXJjZW50YWdlOiBudW1iZXJcbi8vIH1cblxuZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IHR5cGVvZiBFeHBlcmllbmNlVHlwZXMuQUJcbiAgICAvLyBncm91cHM6IElBQkV4cGVyaWVuY2VHcm91cFtdXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBwZXJjZW50YWdlOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0ZVJhbmdlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgc3RhcnQ6IERhdGVcbiAgICBlbmQ6IERhdGVcbiAgICB0aW1lem9uZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBzZWdtZW50OiBJU2VnbWVudERlZmluaXRpb25cbiAgICBkYXRlUmFuZ2U/OiBJRGF0ZVJhbmdlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXTtcbiAgICBvcmlnaW5zOiBzdHJpbmdbXSxcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRDb25maWcge1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbiAgICB0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgLy8gVE9ETyA6IHZlcmlmeSB1bmlxdWVuZXNzIChkYXNoYm9hcmQgJiBzZXJ2ZXIpXG4gICAgbmFtZTogc3RyaW5nXG59XG5cbmludGVyZmFjZSBJQnJhbmNoYWJsZSB7XG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93IGV4dGVuZHMgT21pdDxJVXNlckZsb3dEZWZpbml0aW9uLCAnY29tcG9uZW50cyc+LCBJQnJhbmNoYWJsZSB7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjbGFzcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q/OiBTaGFkb3dSb290KSB7XG5cbiAgICB9XG5cbiAgICBnZXRSb290RGl2ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvcignZGl2JylcbiAgICB9XG5cbiAgICBnZXRSb290ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxufVxuIiwgImV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZTxUPiA9XG4gICAgVCBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiAvLyBFeGNsdWRlIGZ1bmN0aW9uc1xuICAgICAgICBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBTZXJpYWxpemFibGU8VT5bXSA6IC8vIEhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgIFQgZXh0ZW5kcyBvYmplY3QgPyB7XG4gICAgICAgICAgICAgICAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEtdOiBTZXJpYWxpemFibGU8VFtLXT5cbiAgICAgICAgICAgIH0gOiBUOyAvLyBIYW5kbGUgb2JqZWN0c1xuXG5jb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gT2JqZWN0KHZhbHVlKTtcbn1cblxuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBjb25zdCBjb250YWluc1ByaW1pdGl2ZXNPbmx5ID0gKG9iaikgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2hlY2sgaWYgaXQncyBhIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gSXQncyBhIHByaW1pdGl2ZSwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm91bmQgYSBub24tcHJpbWl0aXZlIHZhbHVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gQWxsIHZhbHVlcyBhcmUgcHJpbWl0aXZlcyBvciBuZXN0ZWQgb2JqZWN0cyB3aXRoIHByaW1pdGl2ZXNcbn1cblxuLy8gY3VycmVudGx5IHN1cHBvcnQgcm9vdCBsZXZlbCBvbmx5XG4vLyB7eDogMSwgeSA6ICdhJywgeiA6ICgpPT57Li4ufSwgaW5uZXIgOiB7IHg6IDEgLCB5IDogJ2EnfSB9XG4vLyB7eDogMSwgeSA6ICdhJ31cbi8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9GYWxzeVxuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBib29sZWFuIHwgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4+PiB8IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBtYWtlU2VyaWFsaXphYmxlID0gPFQ+KFxuICAgIG9iajogVCxcbiAgICBza2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSB7fSxcbiAgICBpbmNsdWRlRmFsc3lLZXlzOiBib29sZWFuID0gdHJ1ZSwgLy8gVE9ETyA6IHVzZSB0aGF0IGFyZ1xuICAgIHNlZW46IFdlYWtNYXA8b2JqZWN0LCBTZXJpYWxpemFibGU8YW55Pj4gPSBuZXcgV2Vha01hcCgpXG4pOiBTZXJpYWxpemFibGU8VD4gPT4ge1xuXG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9iaiBhcyBTZXJpYWxpemFibGU8VD47IC8vIERpcmVjdGx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGFycmF5IHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlQXJyYXk6IFNlcmlhbGl6YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVBcnJheSk7IC8vIFN0b3JlIHRoZSBhcnJheSBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9iai5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgc2VyaWFsaXphYmxlQXJyYXlbaW5kZXhdID0gbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LCBza2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZUFycmF5IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICBpZiAob2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsaWMgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZU9iamVjdDogUGFydGlhbDxTZXJpYWxpemFibGU8VD4+ID0ge307XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlT2JqZWN0KTsgLy8gU3RvcmUgdGhlIG9iamVjdCBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGluIHRoZSBza2VsZXRvbiBhbmQgaWYgaXQncyBhIHZhbGlkIGtleSB0byBzZXJpYWxpemVcblxuICAgICAgICAgICAgY29uc3Qga2V5SW5Ta2VsZXRvbiA9IHR5cGVvZiBza2VsZXRvbiA9PSBcImJvb2xlYW5cIiA/IHNrZWxldG9uIDogc2tlbGV0b25ba2V5XTtcblxuICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24pIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIHRvIHNlcmlhbGl6ZSB0aGlzIGtleVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZhbHN5S2V5cyA/IG9ialtrZXldICE9PSB1bmRlZmluZWQgOiBvYmpba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCB0cnVlLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleUluU2tlbGV0b24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgbmVzdGVkIGtleXMgdG8gc2VyaWFsaXplXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCBrZXlJblNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZU9iamVjdCBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9IGFzIGFueTsgLy8gUmV0dXJuIGFuIGVtcHR5IG9iamVjdCBmb3Igb3RoZXIgY2FzZXNcbn1cbiIsICJleHBvcnQgY29uc3QgRXJyb3JzID0ge1xuICAgIG5vdFNlcmlhbGl6YWJsZVJlZkNhbGw6IChwcm9wLCBhcmcpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcblRoZSBpbnB1dCBwcm92aWRlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBpcyBub3Qgc2VyaWFsaXphYmxlLiBTZXJpYWxpemF0aW9uIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIGNhbiBiZSBzYWZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIHNraW4gaW1wbGVtZW50YXRpb24uIFxuVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkYXRhIGFyZSBjb25zaWRlcmVkIG5vbi1zZXJpYWxpemFibGUgYW5kIGNhbm5vdCBiZSBwcm9jZXNzZWQ6XG5cbi0gRnVuY3Rpb25zXG4tIERPTSBlbGVtZW50c1xuLSBDbGFzcyBpbnN0YW5jZXNcbi0gQ2lyY3VsYXIgcmVmZXJlbmNlc1xuLSBTeW1ib2xzXG4tIEJpZ0ludCB2YWx1ZXNcblxuSW4gdGhlIGZvbGxvd2luZyBleGVjdXRpb24gd2UgZGV0ZWN0ZWQgOlxufn5+fn5+fn5cbiR7YXJnfSBcbn5+fn5+fn5+XG5hcyBub3Qgc2VyaWFsaXphYmxlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHBsZWFzZSBlbnN1cmUgdGhhdCBhbGwgaW5wdXRzIHBhc3NlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBhcmUgaW4gYSBzZXJpYWxpemFibGUgZm9ybWF0LlxuVGhpcyB0eXBpY2FsbHkgaW5jbHVkZXMgcHJpbWl0aXZlIHR5cGVzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucyksIGFycmF5cywgYW5kIHBsYWluIG9iamVjdHMuIFxuSWYgeW91IG5lZWQgdG8gaW5jbHVkZSBjb21wbGV4IGRhdGEgdHlwZXMsIGNvbnNpZGVyIGNvbnZlcnRpbmcgdGhlbSB0byBhIHNlcmlhbGl6YWJsZSBzdHJ1Y3R1cmUgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgZnVuY3Rpb24uXG5PciB1c2UgTXlvcCBtZXNzYWdlIHRoYXQgc3VwcG9ydCBpdDogQ3VzdG9tUmVmTWVzc2FnZSwgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2Ugb3IgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UuXG5cblN1Z2dlc3RlZCBGaXg6XG4xLiBSZW1vdmUgb3IgcmVwbGFjZSBub24tc2VyaWFsaXphYmxlIHZhbHVlcyBmcm9tIHlvdXIgaW5wdXQuXG4yLiBJZiB1c2luZyBvYmplY3RzLCBlbnN1cmUgdGhleSBkbyBub3QgY29udGFpbiBhbnkgZnVuY3Rpb25zIG9yIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4zLiBDb252ZXJ0IGFueSBjbGFzcyBpbnN0YW5jZXMgdG8gcGxhaW4gb2JqZWN0cyBvciBKU09OLWNvbXBhdGlibGUgZm9ybWF0cy5cbjQuIFVzZSBkZWRpY2F0ZWQgTXlvcCBtZXNzYWdlLlxuXG5Gb3IgbW9yZSBkZXRhaWxzIG9uIHNlcmlhbGl6YXRpb24gYW5kIE15b3AgbWVzc2FnZSBleGFtcGxlcywgcmVmZXIgdG8gaHR0cHM6Ly9kb2NzLm15b3AuZGV2XFwuXG5cbmApO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnQsIElNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2R9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbnZlbG9wZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFJlZkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIHBhcmVudDogSU15b3BDb21wb25lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIHBhcmVudENvbXBvbmVudC5jb250YWluZXIuLi5cbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgcGFyZW50LmNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgLy90aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoYXJndW1lbnRzLmNhbGxlZS5uYW1lKSk7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaGlkZScpKTtcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3Nob3cnKSk7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWFsIGNsZWFudXBcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIGluc3BlY3QgY2FsbGVkLCBjcmVhdGluZyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGluc3BlY3QnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCB0aGlzLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaW5zcGVjdCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCcpKTtcbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScpIHtcbiAgICAgICAgLy8gIGRlYnVnZ2VyO1xuICAgICAgICAvLyAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgbWVzc2FnZSBzZW5kaW5nICcsIG1lc3NhZ2UpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIHRoaXMuaWQgd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIG5lc3RlZCBjb21wb25lbnRcbiAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChuZXcgRW52ZWxvcGVkTWVzc2FnZSh0aGlzLmlkLCBtZXNzYWdlKSk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2Rpc3Bvc2UnKSk7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG4vKipcbiAqIENvbXBvbmVudCB3cmFwcGVyIGZvciBNeW9wIFdlYiBDb21wb25lbnRzIHRoYXQgYXJlIGV4dHJhY3RlZCBmcm9tIEhUTUxcbiAqIGFuZCBydW4gZGlyZWN0bHkgb24gdGhlIGhvc3QgZG9jdW1lbnQgKG5vdCBpbiBhbiBpZnJhbWUpLlxuICpcbiAqIFRoZXNlIGNvbXBvbmVudHMgdXNlIHRoZSBuYXRpdmUgV2ViIENvbXBvbmVudHMgQVBJIChDdXN0b20gRWxlbWVudHMgKyBTaGFkb3cgRE9NKVxuICogYW5kIGNvbW11bmljYXRlIHZpYSBkaXJlY3QgbWV0aG9kIGNhbGxzIGFuZCBDdXN0b21FdmVudHMgaW5zdGVhZCBvZiBwb3N0TWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG4gICAgcHJpdmF0ZSBjdGFDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFIYW5kbGVyPzogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YVF1ZXVlOiBBcnJheTx7YWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd259PiA9IFtdO1xuXG4gICAgLy8gQSBzaW5nbGUgJ215b3AtY3RhJyBsaXN0ZW5lciwgYXR0YWNoZWQgYXQgY29uc3RydWN0aW9uIHNvIENUQXMgYSBjb21wb25lbnRcbiAgICAvLyBkaXNwYXRjaGVzIGR1cmluZyBpdHMgZmlyc3QgaW5pdFdpdGhEYXRhKCkgcmVuZGVyIFx1MjAxNCBiZWZvcmUgdGhlIGhvc3QgYXR0YWNoZXNcbiAgICAvLyBhIGhhbmRsZXIgXHUyMDE0IGFyZSBidWZmZXJlZCAoYW5kIGZsdXNoZWQgb24gc2V0Q3RhSGFuZGxlciksIG1hdGNoaW5nIHRoZSBpZnJhbWVcbiAgICAvLyBwYXRoJ3MgcHJlLWhhbmRsZXIgQ1RBIHF1ZXVlLlxuICAgIHByaXZhdGUgX2N0YUxpc3RlbmVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGFpbCA9IChlIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XG4gICAgICAgIGlmICghZGV0YWlsPy5hY3Rpb24pIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX2N0YUhhbmRsZXIgJiYgIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2N0YUhhbmRsZXIoZGV0YWlsLmFjdGlvbiwgZGV0YWlsLnBheWxvYWQpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jdGFIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZS5wdXNoKHsgYWN0aW9uOiBkZXRhaWwuYWN0aW9uLCBwYXlsb2FkOiBkZXRhaWwucGF5bG9hZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSB0YWdOYW1lOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gTGlzdGVuIEJFRk9SRSBhbnkgaW5pdFdpdGhEYXRhIHJlbmRlciBzbyBpbml0LXRpbWUgQ1RBcyBhcmVuJ3QgbG9zdC5cbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ215b3AtY3RhJywgdGhpcy5fY3RhTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLmN0YUNsZWFudXAgPSAoKSA9PiB0aGlzLmN1c3RvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbXlvcC1jdGEnLCB0aGlzLl9jdGFMaXN0ZW5lcik7XG5cbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgYXJlIGluaXRpYXRlZCBpbW1lZGlhdGVseSAobm8gcG9zdE1lc3NhZ2UgaGFuZHNoYWtlIG5lZWRlZClcbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudCB3aXRoIGRhdGEgYnkgY2FsbGluZyBteW9wX2luaXRfaW50ZXJmYWNlIGRpcmVjdGx5XG4gICAgICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBkYXRhIGZyb20gdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IENUQSBoYW5kbGVyIC0gdW5pZmllZCBBUEkgd2l0aCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgKiBDYWxsZWQgdmlhIHByb3BzLm15b3BfY3RhX2hhbmRsZXIgPSBoYW5kbGVyXG4gICAgICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgLy8gVGhlICdteW9wLWN0YScgbGlzdGVuZXIgaXMgYXR0YWNoZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCBzbyB3ZSBvbmx5IHNldCB0aGVcbiAgICAgICAgLy8gaGFuZGxlciBhbmQgZmx1c2ggYW55dGhpbmcgdGhlIGNvbXBvbmVudCBlbWl0dGVkIGJlZm9yZSBub3cgKGUuZy4gZHVyaW5nIHRoZVxuICAgICAgICAvLyBmaXJzdCBpbml0V2l0aERhdGEgcmVuZGVyKS5cbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgICAgICAgaWYgKHRoaXMuX2N0YVF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLnRoaXMuX2N0YVF1ZXVlXTtcbiAgICAgICAgICAgIHRoaXMuX2N0YVF1ZXVlID0gW107XG4gICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBtZXNzYWdlLWJhc2VkIGNvbXBvbmVudHMuXG4gICAgICogV2ViIGNvbXBvbmVudHMgZG9uJ3QgdXNlIHBvc3RNZXNzYWdlLCBzbyB0aGlzIGlzIGEgbm8tb3AgZm9yIG1vc3QgbWVzc2FnZXMuXG4gICAgICovXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICAvLyBXZWIgY29tcG9uZW50cyBkb24ndCB1c2UgdGhlIHBvc3RNZXNzYWdlIHN5c3RlbVxuICAgICAgICAvLyBJbnN0ZWFkLCBpbnRlcmFjdCBkaXJlY3RseSB2aWEgcHJvcHMubXlvcF9pbml0X2ludGVyZmFjZSBhbmQgcHJvcHMubXlvcF9jdGFfaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gTG9nIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRdIHNlbmQoKSBjYWxsZWQgLSB3ZWIgY29tcG9uZW50cyB1c2UgZGlyZWN0IEFQSSBpbnN0ZWFkJywgbWVzc2FnZSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmN0YUNsZWFudXApIHtcbiAgICAgICAgICAgIHRoaXMuY3RhQ2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuY3VzdG9tRWxlbWVudCk7XG4gICAgfVxufVxuIiwgIi8vdHlwZSBBQ29uc3RydWN0b3JUeXBlT2Y8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBDdXN0b21SZWZNZXNzYWdlLCBSZWZ9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0ICogYXMgbWVzc2FnZXMgZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIENsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50Q29uZmlnLFxuICAgIHR5cGUgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudFJlZkJlaGF2aW9yLCBJSFRNTExvYWRlckNvbmZpZywgSVByb3BDb2RlQmVoYXZpb3IsXG4gICAgSVByb3BDb25maWcsIElTa2luQ29uZmlnLCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICBSZWZCZWhhdmlvclR5cGUsIFNoYWRvd1Jvb3RNb2RlVHlwZSwgU2tpbkxvYWRlcnMsIFNraW5Mb2FkZXJUeXBlXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7Y29udGFpbnNQcmltaXRpdmVzT25seX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uXCI7XG5pbXBvcnQge0Vycm9yc30gZnJvbSBcIi4vbG9nTWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcFJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4vaG9zdFNES1wiO1xuXG50eXBlIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcyA9IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnWydwcm9wcyddXG5cbmNvbnN0IGNyZWF0ZURlYnVnVGl0bGUgPSAodGV4dDogc3RyaW5nLCB0b3A6IG51bWJlciwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICBjb25zdCB0aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHRpdGxlRWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRpdGxlRWwuc3R5bGUucGFkZGluZyA9ICcwIDVweCc7XG4gICAgdGl0bGVFbC5zdHlsZS5mb250U2l6ZSA9ICcxNHB4JztcbiAgICB0aXRsZUVsLnN0eWxlWyd0b3AnXSA9ICcwJztcbiAgICB0aXRsZUVsLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgLy90aXRsZUVsLnN0eWxlLmxlZnQgPSAnNTAlJztcbiAgICB0aXRsZUVsLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJztcbiAgICB0aXRsZUVsLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIHRpdGxlRWwuaHJlZiA9IGBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZH1gXG5cbiAgICByZXR1cm4gdGl0bGVFbDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXREZWJ1Z1N0eWxlID0gKGlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG4pOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgLy8jMDA3QkZGIChibHVlKSBvciAjRkY1NzIyIChvcmFuZ2UpXG4gICAgLy8jNENBRjUwIChncmVlbikgb3IgI0ZGQzEwNyAoYW1iZXIpXG4gICAgLy8gY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7aWR9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5uYW1lfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUodG9wVGV4dCwgY29tcG9uZW50RWxlbWVudCk7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICMwMDdCRkYnO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICd1bnNldCc7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0b3BUZXh0KTtcbiAgICB9XG59XG5cbmNvbnN0IHJlcG9ydEVycm9yID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGlmICghcHJvcENvbmZpZykge1xuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3I6IFVuZGVmaW5lZCBQcm9wXFxuXFxuYCArXG4gICAgICAgICAgICBgSXQgbG9va3MgbGlrZSB5b3UndmUgdHJpZWQgdG8gdXNlIGEgcHJvcCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIGNoZWNrIHRoZSBwcm9wIG5hbWUgZm9yIGFueSB0eXBvcyBvciBlbnN1cmUgdGhhdCBpdCBpcyBwcm9wZXJseSBkZWZpbmVkIGluIHRoZSBjb21wb25lbnQncyBwcm9wIGxpc3QuXFxuXFxuYCArXG4gICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCByZXBvcnRVbnN1cHBvcnRlZCA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3I6IENvZGUgUHJvcCBOb3QgU3VwcG9ydGVkXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50bHksIGNvZGUgcHJvcHMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGxvY2FsIGZyYW1lIGNvbXBvbmVudHMuXFxuYCArXG4gICAgICAgIGBcdTI2QTBcdUZFMEYgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MgZmVhdHVyZSBcdTIwMTQgY29kZSBwcm9wcyB3aWxsIGJlIHN1cHBvcnRlZCBpbiB1cGNvbWluZyB2ZXJzaW9ucy5cXG5cXG5gICtcbiAgICAgICAgYEluIHRoZSBtZWFudGltZSwgeW91IGNhbiB1c2UgbWVzc2FnZSBwcm9wcy5cXG5cXG5gICtcbiAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFByb3BzID0gPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHByb3BzQ29uZmlnOiBJUHJvcENvbmZpZ1tdLCBzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG5cbiAgICBjb25zdCBwcm9wc01hcCA9IHByb3BzQ29uZmlnLnJlZHVjZSgocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcmV2aW91c1ZhbHVlLFxuICAgICAgICAgICAgW2N1cnJlbnRWYWx1ZS5uYW1lXTogey4uLmN1cnJlbnRWYWx1ZX1cbiAgICAgICAgfVxuICAgIH0sIHt9KTtcblxuICAgIGNvbnN0IHByb3BzSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgRklSU1RcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBnZXRzL3NldHMgZGF0YSAobWF0Y2hlcyBpZnJhbWUgYmVoYXZpb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRhdGE/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgbXlvcF9jdGFfaGFuZGxlciwgcmV0dXJuIHVuZGVmaW5lZCAoaXQncyB3cml0ZS1vbmx5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElzb2xhdGVkIGlmcmFtZTogbm8gc2FtZS1vcmlnaW4gYWNjZXNzIFx1MjAxNCB1c2UgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZVxuICAgICAgICAgICAgICAgIC8vIChzYW1lIG1ldGhvZCBzdXJmYWNlIGFzIHRoZSBleHRyYWN0ZWQtV0MgYnJhbmNoIGFib3ZlKS5cbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcElmcmFtZUNvbXBvbmVudCAmJiBjb21wb25lbnQuaXNvbGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRhdGE/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gbXlvcF9jdGFfaGFuZGxlciBpcyB3cml0ZS1vbmx5XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGlmcmFtZSAobG9jYWxGcmFtZSkgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmVsZW1lbnQuY29udGVudFdpbmRvd1t0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdvdXRwdXQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUIChiZWZvcmUgbG9jYWxGcmFtZSBjaGVjaylcbiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBtYXkgaGF2ZSBzaGFkb3dSb290TW9kZTogbG9jYWxGcmFtZSBpbiB0aGVpciBjb25maWdcbiAgICAgICAgICAgICAgICAvLyBidXQgdGhleSBydW4gZGlyZWN0bHkgb24gdGhlIGhvc3QgZG9jdW1lbnQsIG5vdCBpbiBhbiBpZnJhbWVcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEN0YUhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElzb2xhdGVkIGlmcmFtZTogcm91dGUgdmlhIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKG5vIHNhbWUtb3JpZ2luIGFjY2VzcykuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BJZnJhbWVDb21wb25lbnQgJiYgY29tcG9uZW50Lmlzb2xhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJykgeyBjb21wb25lbnQuc2V0Q3RhSGFuZGxlcih2YWx1ZSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7IGNvbXBvbmVudC5pbml0V2l0aERhdGEodmFsdWUpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvciBpZnJhbWUgKGxvY2FsRnJhbWUpIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFdpbmRvdyA9IChjb21wb25lbnQuZWxlbWVudCBhcyBIVE1MSUZyYW1lRWxlbWVudCkuY29udGVudFdpbmRvdyBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcmVhbCBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2luZG93W3Byb3BOYW1lXSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGbHVzaCBDVEEgcXVldWUgaWYgdGhpcyBpcyBteW9wX2N0YV9oYW5kbGVyIGFuZCBxdWV1ZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInICYmIGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IG51bGw7IC8vIENsZWFyIHRvIHByZXZlbnQgZG91YmxlLWZsdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUuZm9yRWFjaCgoaXRlbToge2FjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiBhbnl9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgY29tcG9uZW50IHdhcyBkaXNwb3NlZCBkdXJpbmcgZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZShpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2lmKHByb3BDb25maWcuYmVoYXZpb3IgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IG11bHRpIGJlaGF2aW9yc1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yOiBVbnN1cHBvcnRlZCBCZWhhdmlvclxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgJ2JlaGF2aW9yJyBmaWVsZCBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmVoYXZpb3IgRmllbGQ6ICR7cHJvcENvbmZpZy5iZWhhdmlvci50eXBlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgYmVoYXZpb3Igb3B0aW9ucy5gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50LnByb3BzID0ge307XG4gICAgY29tcG9uZW50LnByb3BzID0gbmV3IFByb3h5KGNvbXBvbmVudC5wcm9wcywgcHJvcHNIYW5kbGVyKTtcblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgKE9taXQ8SU15b3BDb21wb25lbnQsICdwcm9wcyc+ICYge1xuICAgICAgICBwcm9wczogcHJvcFR5cGVzPFQ+XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZlByb3h5ID0gKHRhcmdldDogUmVmLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuXG4gICAgICAgICAgICAvLyBpZiAocHJvcCA9PT0gJ19fbm9uUHJveGllZCcpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodGFyZ2V0W3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGdldHRlckZ1bmN0aW9uID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkoYXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5ub3RTZXJpYWxpemFibGVSZWZDYWxsKHByb3AsIGFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIGZ1bmN0aW9uQXJncywgbWFrZVNlcmlhbGl6YWJsZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWZbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZShyZWZbcHJvcE5hbWVdKC4uLmZ1bmN0aW9uQXJncyksIHRydWUpIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdHMgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZSh2YWx1ZSwgdHJ1ZSk7IC8vIFJldHVybiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCB0byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobXNnLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvL1RPRE86IHdlIGNhbiBpbXBsZW1lbnQgdGhpbmdzIGxpa2UgYXV0byBzZXJpYWxpemF0aW9uIGFuZCBiaW5kaW5nIGZ1bmN0aW9ucyBoZXJlXG4gICAgICAgICAgICAvL2dldHRlckZ1bmN0aW9uLnRlc3QgPSAnMTIzJztcblxuICAgICAgICAgICAgcmV0dXJuIGdldHRlckZ1bmN0aW9uO1xuXG4gICAgICAgICAgICAvL3JldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wOiBzdHJpbmcsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIHByb3BWYWx1ZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3BcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nP1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KHJlZjogUmVmLCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gcmVmLmNvbXBvbmVudDtcbiAgICBpZiAoIWNvbXBvbmVudClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW50IGNyZWF0ZVJlZkNvbXBvbmVudCB3aXRoIGRldGFjaGVkIHJlZicpO1xuXG4gICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcsIHJlZiwgY29tcG9uZW50Q29uZmlnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZy50eXBlLCBjb21wb25lbnQsIG9wdGlvbnMpO1xuICAgICAgICBjb21wb25lbnRzLnB1c2gocmVmQ29tcG9uZW50KTtcblxuICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSByZWYgY29tcG9uZW50cyBkZWZpbmUgaW4gdGhlIGNvbXBvbmVudCBjb25maWdcbiAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcm9vdCBjb21wb25lbnQgdGhlIGJlIGluaXRpYXRlZCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cblxuICAgICAgICAvL1RPRE8gOlxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvL3JlamVjdCgndGltZW91dD8nKTtcbiAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICB9LCA1MDAwKTtcblxuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZShyZWYucmVmQ29uZmlnLFxuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMgPyBvcHRpb25zIDoge30sXG4gICAgICAgICAgICAgICAgaWQ6IHJlZkNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICBfaGFzUGFyZW50OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRpbWVvdXQgYWxyZWFkeSBwYXNzZWRcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBjb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09IHJlZkNvbXBvbmVudC5pZCk7XG5cbiAgICAgICAgICAgICAgICAvL3NhbWUgbWVtb3J5IGVudiwgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uQ29tcG9uZW50ICE9PSByZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogY2xlYW4gcmVmQ29tcG9uZW50ID9cblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW1wbGVtZW50YXRpb25Db21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhlcmUgPlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHdoYXQgYWJvdXQgcmVhcHRlcnMgPyEgZHluYW1pYyA/IVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGV4c2lzdGluZ1JlZkNvbXBvbmVudCA9IGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gYXMgTXlvcFJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvLyBpZiAoZXhzaXN0aW5nUmVmQ29tcG9uZW50LmlkICYmIGV4c2lzdGluZ1JlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IFtjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLCByZWZDb21wb25lbnRdO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLnB1c2gocmVmQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50OyAvL2hvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gcmVmQ29tcG9uZW50LmlkKSE7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaW4gd2ViY29tcG9uZW50IGNhc2UgdGhlIHNhbWUgaWQgd2lsbCBhbHJlZGF5IGJlIGhlcmUsIHdoaWNoIGlzIGdvb2QgIVxuICAgICAgICAgICAgICAgIC8vIG5hbWU6XG4gICAgICAgICAgICAgICAgLy8gICAgIGlkXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudERlZmluaXRpb25JZFxuXG4gICAgICAgICAgICAgICAgLy8gZm9yIGlubmVyIGNvbXBvbmVudHMgaW5zaWRlIHJlZiBjb21wb25lbnQgOlxuICAgICAgICAgICAgICAgIG1lc3NhZ2UubmVzdGVkUmVmcy5mb3JFYWNoKG5lc3RlZFJlZkNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzIS5maW5kKGMgPT4gYy50eXBlLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSEudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucz8uZmluZChkZWYgPT4gZGVmLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJlZkNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy50eXBlLnJlZnMuZmluZChyID0+IHIubmFtZSA9PT0gbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXJlZkNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdubyByZWZDb25maWcgZm91bmQgZm9yIG5lc3RlZCByZWYnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQobmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiwgcmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ29tcG9uZW50LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQucmVmc1tuZXN0ZWRSZWZDb25maWcucmVmTmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChuZXN0ZWRDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhyZWZDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgY29tcG9uZW50cywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDp1c2UgY29uZmlnIGNoZWNrIGZvciBhdXRvLWhpZ2h0IGFuZCBjb252ZXJ0IHR5cGUgcHJvcGVybHlcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVmQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFJlZnMgPSBhc3luYyAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCB3aXRob3V0UmVmQ29tcG9uZW50czogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG5cbiAgICBpZiAoIWNvbXBvbmVudC5yZWZzKVxuICAgICAgICBjb21wb25lbnQucmVmcyA9IHt9O1xuXG4gICAgY29uc3Qgd2FpdEZvciA9IE9iamVjdC52YWx1ZXMoY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVmcykubWFwKHJlZiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVmLmJlaGF2aW9yLnR5cGUgPT0gUmVmQmVoYXZpb3JUeXBlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9XG5cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFJlZkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoYW5nZSB0byBnZXQgaXQgZnJvbSB0aGUgZmxvd1xuICAgICAgICAgICAgICAgIGxldCByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5jb21wb25lbnRJZDtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZkNvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5pbnN0YW5jZS5jb21wb25lbnRJZFxuXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zIS5maW5kKGNvbXBkZWYgPT4gY29tcGRlZi5pZCA9PT0gcmVmQ29tcG9uZW50SWQpITtcbiAgICAgICAgICAgICAgICAvLyAvL2NvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhd2FpdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKGNvbXBvbmVudEluc3RhbmNlQ29uZmlnLmNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpZiB3ZSBoYXZlIHRoZSBzYW1lIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZSB3ZSB3aWxsIG5lZWQgaW5zdGFuY2UgaWQgaGVyZSAuLi5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPy5maW5kKG5lc3RlZENvbXBvbmVudCA9PiBuZXN0ZWRDb21wb25lbnQudHlwZS5pZCA9PT0gcmVmQ29tcG9uZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXN0ZWRDb21wb25lbnRDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCBuZXN0ZWRDb21wb25lbnRDb25maWcgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY29uc3QgY29tcG9uZW50SW5zdGFuY2VDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UubmVzdGVkQ29tcG9uZW50cz8uZmluZChjb21wb25lbnRJbnN0YWNlID0+IGNvbXBvbmVudEluc3RhY2UuY29tcG9uZW50SWQgPT09IGNvbXBvbmVudERlZmluaXRpb25Db25maWcuaWQpO1xuICAgICAgICAgICAgICAgIC8vIGlmKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKXtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPIFRPRE8gVE9ETyAnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6dGhpbmsgYWJvdXQgdGhhdCA6XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLnJlc29sdmVkRGVmaW5pdGlvbnMgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zO1xuICAgICAgICAgICAgICAgIC8vICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGluc3RhbmNlOiBuZXN0ZWRDb21wb25lbnRDb25maWcuaW5zdGFuY2UhLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHR5cGU6IG5lc3RlZENvbXBvbmVudENvbmZpZy50eXBlLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIG5hbWU6IG5lc3RlZENvbXBvbmVudENvbmZpZy5uYW1lXG4gICAgICAgICAgICAgICAgLy8gICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBfcmVmID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbmVzdGVkICEhIGNyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50KF9yZWYsIG5lc3RlZENvbXBvbmVudENvbmZpZyEsIGNvbXBvbmVudHMpXG4gICAgICAgICAgICAgICAgICAgIC8vVERPTyA6IHB1dCB0aGF0IHJlZiBjb21wb25lbnQgc29tZXdoZXJlP1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ub25Qcm94aWVkID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBjcmVhdGVSZWZQcm94eShfX25vblByb3hpZWQsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJz8nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgdHlwZSBwcm9wVHlwZXM8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4gPSB7XG4gICAgW1Byb3BlcnR5IGluIGtleW9mIFRdOlxuICAgIFRbUHJvcGVydHldIGV4dGVuZHMgeyBtb2RlOiAnaW5wdXQnIH0gP1xuICAgICAgICBUW1Byb3BlcnR5XVsndHlwZSddIDpcbiAgICAgICAgUHJvbWlzZTxUW1Byb3BlcnR5XVsndHlwZSddPlxufVxuXG5leHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuXG5leHBvcnQgY29uc3QgYWN0QXMgPSA8VD4ocmVmOiBSZWYpID0+IHtcbiAgICByZXR1cm4gcmVmIGFzIHVua25vd24gYXMgRnVuY3Rpb25pZnlSZWY8VD5cbn1cblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25pZnlSZWY8VCA9IGFueT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiAvLyBJZiBpdCdzIGEgZnVuY3Rpb25cbiAgICAgICAgPyAoLi4uYXJnczogQSkgPT4gUHJvbWlzZTxSPiAvLyBDb252ZXJ0IGl0IHRvIGEgcHJvbWlzZWQgZnVuY3Rpb25cbiAgICAgICAgOiBUW0tdXG59O1xuIiwgImltcG9ydCB7QXV0b1NpemVPcHRpb25zLCBCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZVxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgcHJpdmF0ZSBfYXV0b1NpemVDbGVhbnVwPzogQ2xlYW51cEhhbmRsZXI7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVPcHRpb25zPzogQXV0b1NpemVPcHRpb25zO1xuICAgIHByaXZhdGUgX2F1dG9TaXplVXBkYXRlPzogKCkgPT4gdm9pZDtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBJc29sYXRpb24gKHNhbmRib3hlZCBjcm9zcy1vcmlnaW4gZnJhbWUpIFx1MjAxNCBwb3N0TWVzc2FnZSBicmlkZ2UsIGhvc3Qgc2lkZSBcdTI1MDBcdTI1MDBcbiAgICBwdWJsaWMgaXNvbGF0ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sYXN0RGF0YT86IHVua25vd247ICAgICAgICAgICAgICAgLy8gY2FjaGVkIGxhc3Qtc2VudCBkYXRhIChzeW5jIGdldERhdGEpXG4gICAgcHJpdmF0ZSBfY3RhSGFuZGxlcj86IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFRdWV1ZTogQXJyYXk8eyBhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93biB9PiA9IFtdO1xuICAgIHByaXZhdGUgX2lzb01zZ0hhbmRsZXI/OiAoZTogTWVzc2FnZUV2ZW50KSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2lzb1NpemVPcHRzPzogQXV0b1NpemVPcHRpb25zO1xuICAgIHByaXZhdGUgX2lzb0F1dG9TaXplID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJyaWRnZSBzaXppbmcgb25seSB3aGVuIGF1dG8tc2l6ZSBpcyBvblxuICAgIHByaXZhdGUgX2lzb0xhc3RTaXplPzogeyBoZWlnaHQ6IG51bWJlciwgd2lkdGg/OiBudW1iZXIgfTsgIC8vIGxhc3QgcmVwb3J0ZWQgc2l6ZSAoZm9yIHRoZSBlbmFibGUgcmFjZSlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnRDb25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudENvbmZpZywgY29udGFpbmVyLCBvcHRpb25zKVxuXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgdGhpcy5fbGFzdERhdGEgPSBvcHRpb25zPy5kYXRhO1xuICAgICAgICAvLyB0aGlzLklmcmFtZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdClcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGBJZnJhbWVFbGVtZW50IGVycm9yYCk7XG4gICAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIHNpemVNZXRhPzogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIElzb2xhdGlvbiBicmlkZ2UgKGhvc3Qgc2lkZSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLyoqIEF0dGFjaCB0aGUgaG9zdC1zaWRlIHBvc3RNZXNzYWdlIGxpc3RlbmVyIGZvciBhIHNhbmRib3hlZCBmcmFtZS4gKi9cbiAgICBlbmFibGVJc29sYXRpb24oKSB7XG4gICAgICAgIHRoaXMuaXNvbGF0ZWQgPSB0cnVlO1xuICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXMgZG9uJ3QgcnVuIHRoZSBJZnJhbWVTREsgaGFuZHNoYWtlIChubyBzYW1lLW9yaWdpbiBpbml0KSxcbiAgICAgICAgLy8gc28gbWFyayBpbml0aWF0ZWQgaW1tZWRpYXRlbHkgXHUyMDE0IGxpa2UgdGhlIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50IGRvZXMuXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgIHRoaXMuX2lzb01zZ0hhbmRsZXIgPSAoZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5zb3VyY2UgIT09IHRoaXMuSWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93KSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBkOiBhbnkgPSBlLmRhdGE7XG4gICAgICAgICAgICBpZiAoIWQgfHwgZC5fX215b3AgIT09IHRydWUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChkLnR5cGUgPT09ICdteW9wOmN0YScpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3RhSGFuZGxlciAmJiAhdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgdGhpcy5fY3RhSGFuZGxlcihkLmFjdGlvbiwgZC5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5fY3RhSGFuZGxlcikgdGhpcy5fY3RhUXVldWUucHVzaCh7IGFjdGlvbjogZC5hY3Rpb24sIHBheWxvYWQ6IGQucGF5bG9hZCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZC50eXBlID09PSAnbXlvcDpzaXplJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5SXNvU2l6ZShkLmhlaWdodCwgZC53aWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5faXNvTXNnSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtaW4gXHUyMDE0IHVuaWZpZWQgd2l0aCB0aGUgZXh0cmFjdGVkLVdDIEFQSS4gUG9zdHMgaW5pdCBvdmVyIHRoZSBicmlkZ2UuICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbGFzdERhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKHsgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDppbml0JywgZGF0YSB9LCAnKicpO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLWluIGdldHRlciBcdTIwMTQgcmV0dXJucyB0aGUgbGFzdCBkYXRhIHRoZSBob3N0IHNlbnQgKGNhY2hlZCwgc3luY2hyb25vdXMpLiAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0RGF0YTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1vdXQgXHUyMDE0IHVuaWZpZWQgd2l0aCB0aGUgZXh0cmFjdGVkLVdDIEFQSS4gRmx1c2hlcyBDVEFzIHF1ZXVlZCBwcmUtaGFuZGxlci4gKi9cbiAgICBzZXRDdGFIYW5kbGVyKGhhbmRsZXI6IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdGFIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgaWYgKHRoaXMuX2N0YVF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLnRoaXMuX2N0YVF1ZXVlXTtcbiAgICAgICAgICAgIHRoaXMuX2N0YVF1ZXVlID0gW107XG4gICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKGl0ZW0gPT4geyBpZiAoIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIGhhbmRsZXIoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXBwbHlJc29TaXplKGhlaWdodDogbnVtYmVyLCB3aWR0aD86IG51bWJlcikge1xuICAgICAgICBpZiAoIWhlaWdodCB8fCBOdW1iZXIuaXNOYU4oaGVpZ2h0KSkgcmV0dXJuO1xuICAgICAgICAvLyBBbHdheXMgcmVtZW1iZXIgdGhlIGxhdGVzdCByZXBvcnRlZCBzaXplIHNvIGl0IGNhbiBiZSBhcHBsaWVkIGlmL3doZW5cbiAgICAgICAgLy8gYXV0by1zaXppbmcgaXMgZW5hYmxlZCBhZnRlciB0aGUgZmlyc3QgbWVzc2FnZSBhcnJpdmVzLlxuICAgICAgICB0aGlzLl9pc29MYXN0U2l6ZSA9IHsgaGVpZ2h0LCB3aWR0aCB9O1xuICAgICAgICAvLyBSZXNwZWN0IGF1dG9TaXplOmZhbHNlIFx1MjAxNCB0aGUgaG9zdCBvd25zIGRpbWVuc2lvbnMsIHNvIGRvbid0IHRvdWNoIHRoZW0uXG4gICAgICAgIGlmICghdGhpcy5faXNvQXV0b1NpemUpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2lzb1NpemVPcHRzO1xuICAgICAgICBjb25zdCB0b051bSA9ICh2OiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT5cbiAgICAgICAgICAgIHYgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICh0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogKGlzTmFOKHBhcnNlRmxvYXQodikpID8gdW5kZWZpbmVkIDogcGFyc2VGbG9hdCh2KSkpO1xuICAgICAgICBjb25zdCBtaW4gPSB0b051bShvcHRzPy5taW5IZWlnaHQpLCBtYXggPSB0b051bShvcHRzPy5tYXhIZWlnaHQpO1xuICAgICAgICBsZXQgaCA9IGhlaWdodDtcbiAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIGggPCBtaW4pIGggPSBtaW47XG4gICAgICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiBoID4gbWF4KSBoID0gbWF4O1xuICAgICAgICAvLyBUcmFuc2l0aW9uIGZyb20gYWJzb2x1dGUgb3ZlcmxheSB0byBkb2N1bWVudCBmbG93IGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQuXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5pbnNldCA9ICdhdXRvJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGggKyAncHgnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHsgd2lkdGg6IHdpZHRoID8/IHRoaXMuSWZyYW1lRWxlbWVudC5jbGllbnRXaWR0aCwgaGVpZ2h0OiBoLCBhdXRvU2l6aW5nV2lkdGg6IGZhbHNlLCBhdXRvU2l6aW5nSGVpZ2h0OiB0cnVlIH0gYXMgYW55KTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdD86IENsZWFudXBIYW5kbGVyO1xuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy8gVE9ETyA6IHVzZSBiZXR0ZXIgY2hlY2sgZm9yIGluc3BlY3QgbW9kZVxuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdCkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnaW5zcGVjdCBjYWxsIG1vcmUgdGhhbiBvbmNlJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wSWZyYW1lQ29tcG9uZW50JywgMTAsIHRoaXMuY29udGFpbmVyLCB0aGlzLklmcmFtZUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ISgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvYnNlcnZlU2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3NlbmR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgc2VuZCh7aGVpZ2h0LCB3aWR0aH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9ic2VydmVzIHRoZSBpZnJhbWUgY29udGVudCBzaXplIGFuZCBhdXRvbWF0aWNhbGx5IHN5bmNzIGl0IHRvIHRoZSBpZnJhbWUgZWxlbWVudC5cbiAgICAgKiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzIChzYW1lLW9yaWdpbiBvbmx5KSBmb3IgYWNjdXJhdGUgbWVhc3VyZW1lbnRzLlxuICAgICAqXG4gICAgICogUmVlbnRyYW50OiB3aGVuIGNhbGxlZCBhZ2FpbiB3aGlsZSBvYnNlcnZlcnMgYWxyZWFkeSBleGlzdCwgdXBkYXRlcyBvcHRpb25zIGFuZFxuICAgICAqIHJlLWV2YWx1YXRlcyBzaXppbmcgd2l0aG91dCByZWNyZWF0aW5nIG9ic2VydmVycy4gQ2xlYW51cCArIHJlLWNhbGwgKGUuZy4gUmVhY3RcbiAgICAgKiByZS1yZW5kZXIpIGNyZWF0ZXMgZnJlc2ggb2JzZXJ2ZXJzIHNpbmNlIGNsZWFudXAgY2xlYXJzIHRoZSBleGlzdGluZyBvbmVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHNpemUgY2hhbmdlIGNhbGxiYWNrIGFuZCBtaW4vbWF4IGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBzdG9wIG9ic2VydmluZ1xuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZSA9IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICAvLyBTdG9yZSBvcHRpb25zIHNvIHVwZGF0ZVNpemUgYWx3YXlzIHJlYWRzIHRoZSBsYXRlc3RcbiAgICAgICAgdGhpcy5fYXV0b1NpemVPcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXMgY2FuJ3QgYmUgbWVhc3VyZWQgY3Jvc3Mtb3JpZ2luIFx1MjAxNCBzaXppbmcgaXMgZHJpdmVuIGJ5XG4gICAgICAgIC8vICdteW9wOnNpemUnIHBvc3RNZXNzYWdlcyBmcm9tIHRoZSBicmlkZ2UgKHNlZSBfYXBwbHlJc29TaXplKS5cbiAgICAgICAgaWYgKHRoaXMuaXNvbGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzb1NpemVPcHRzID0gb3B0aW9ucztcbiAgICAgICAgICAgIHRoaXMuX2lzb0F1dG9TaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtb3N0IHJlY2VudCBicmlkZ2UtcmVwb3J0ZWQgc2l6ZSAoaXQgbWF5IGhhdmUgYXJyaXZlZCBiZWZvcmVcbiAgICAgICAgICAgIC8vIGF1dG8tc2l6aW5nIHdhcyB0dXJuZWQgb24pLlxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzb0xhc3RTaXplKSB0aGlzLl9hcHBseUlzb1NpemUodGhpcy5faXNvTGFzdFNpemUuaGVpZ2h0LCB0aGlzLl9pc29MYXN0U2l6ZS53aWR0aCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4geyB0aGlzLl9pc29BdXRvU2l6ZSA9IGZhbHNlOyB0aGlzLl9pc29TaXplT3B0cyA9IHVuZGVmaW5lZDsgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCByZS1ldmFsdWF0ZSB3aXRoIG5ldyBvcHRpb25zIGFuZCByZXVzZSB0aGVtXG4gICAgICAgIGlmICh0aGlzLl9hdXRvU2l6ZUNsZWFudXAgJiYgdGhpcy5fYXV0b1NpemVVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0b1NpemVDbGVhbnVwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAvLyBDcm9zcy1vcmlnaW4gKHYxIGNvbXBvbmVudHMgb24gdGhlIGN1c3RvbWVyJ3MgZG9tYWluKTogbWVhc3VyZSBpbnNpZGUgdGhlIGZyYW1lLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZUhlaWdodFZpYUJyaWRnZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhbXAgPSAodmFsdWU6IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgbWluKSByZXR1cm4gbWluO1xuICAgICAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID4gbWF4KSByZXR1cm4gbWF4O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFBhcnNlIENTUyBzaXplIHZhbHVlcyB0byBudW1iZXJzXG4gICAgICAgIGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4ocGFyc2VkKSA/IHVuZGVmaW5lZCA6IHBhcnNlZDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnREb2MpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2F1dG9TaXplT3B0aW9ucztcblxuICAgICAgICAgICAgY29uc3QgbWluV2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWluV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gcGFyc2VTaXplKG9wdHM/Lm1pbkhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWF4SGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlck1pbkhlaWdodCA9IG9wdHM/LmxvYWRlck1pbkhlaWdodCA/PyA1MDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBleHBsaWNpdCBkaW1lbnNpb25zOiBob3N0IG9wdGlvbnMgXHUyMTkyIHNpemVNZXRhIGZpbGwgbW9kZSBcdTIxOTIgd2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCJcbiAgICAgICAgICAgIC8vIFdpZHRoIGRlZmF1bHRzIHRvIFwiMTAwJVwiIChibG9jayBlbGVtZW50IGJlaGF2aW9yKSB0byBwcmV2ZW50IHRoZSBzaHJpbmstdG8tMCBtZWFzdXJlbWVudCBidWcuXG4gICAgICAgICAgICAvLyBIZWlnaHQgaGFzIG5vIGRlZmF1bHQgc28gaXQgYXV0by1zaXplcyB0byBjb250ZW50LlxuICAgICAgICAgICAgLy8gT25seSBzaXplTWV0YSBcIjEwMCVcIiAoZmlsbCBtb2RlKSBpcyB0cmVhdGVkIGFzIGV4cGxpY2l0IGFuZCBkaXNhYmxlcyBhdXRvLXNpemluZy5cbiAgICAgICAgICAgIC8vIFBpeGVsIHNpemVNZXRhIHZhbHVlcyAoZS5nLiwgaGVpZ2h0OiAyMDApIGFyZSBpbml0aWFsIGhpbnRzLCBOT1QgZXhwbGljaXQgY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxXaWR0aCA9IHRoaXMuc2l6ZU1ldGE/LndpZHRoID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsSGVpZ2h0ID0gdGhpcy5zaXplTWV0YT8uaGVpZ2h0ID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID0gb3B0cz8uZXhwbGljaXRXaWR0aCA/PyBzaXplTWV0YUZpbGxXaWR0aCA/PyBcIjEwMCVcIjtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPSBvcHRzPy5leHBsaWNpdEhlaWdodCA/PyBzaXplTWV0YUZpbGxIZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFdpZHRoID0gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdEhlaWdodCA9IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbGxhcHNlZCBkaW1lbnNpb25zIGZyb20gY29udGFpbmVyICh0aGlzLmNvbnRhaW5lcilcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZFdpZHRoID0gY29udGFpbmVyUmVjdC53aWR0aCA9PT0gMDtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIGNvbGxhcHNlZCBpZiBoZWlnaHQgaXMgMCBPUiBlcXVhbHMgdGhlIGxvYWRlciBtaW5IZWlnaHRcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZEhlaWdodCA9IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSAwIHx8IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSBsb2FkZXJNaW5IZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBkaW1lbnNpb25zIHRvIGF1dG8tc2l6ZTpcbiAgICAgICAgICAgIC8vIC0gSWYgZm9yY2VBdXRvU2l6ZSBpcyB0cnVlLCBhdXRvLXNpemUgdW5sZXNzIGV4cGxpY2l0IGRpbWVuc2lvbiBpcyBzZXRcbiAgICAgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBhdXRvLXNpemUgb25seSBpZiBjb2xsYXBzZWRcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEF1dG9XaWR0aCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdFdpZHRoXG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkV2lkdGggJiYgIWhhc0V4cGxpY2l0V2lkdGgpO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b0hlaWdodCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdEhlaWdodFxuICAgICAgICAgICAgICAgIDogKGNvbGxhcHNlZEhlaWdodCAmJiAhaGFzRXhwbGljaXRIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBJZiBub3RoaW5nIG5lZWRzIGF1dG8tc2l6aW5nLCBhcHBseSBleHBsaWNpdC9wZXJjZW50YWdlIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghc2hvdWxkQXV0b1dpZHRoICYmICFzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcblxuICAgICAgICAgICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBDU1MgdHJhbnNpdGlvbnMgb24gaWZyYW1lIGFuZCBjb250YWluZXIgZm9yIHRoZSBlbnRpcmVcbiAgICAgICAgICAgIC8vIG1lYXN1cmVtZW50ICsgaGVpZ2h0LXNldHRpbmcgY3ljbGUuIEhvc3QgYXBwcyBtYXkgc2V0IGB0cmFuc2l0aW9uOiBhbGxgXG4gICAgICAgICAgICAvLyB3aGljaCB3b3VsZCBhbmltYXRlIHRoZSAwcHggY29sbGFwc2UgYW5kIGZpbmFsIGhlaWdodCBjaGFuZ2UsIGNhdXNpbmdcbiAgICAgICAgICAgIC8vIHZpc2libGUganVtcHMgZHVyaW5nIHNjcm9sbC5cbiAgICAgICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gaWZyYW1lLnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgICAgIGNvbnN0IHByZXZDb250YWluZXJUcmFuc2l0aW9uID0gY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAvLyBRdWljayBwcmUtY2hlY2s6IHJlYWQgc2Nyb2xsSGVpZ2h0L1dpZHRoIEJFRk9SRSBjb2xsYXBzaW5nIHRoZSBpZnJhbWUuXG4gICAgICAgICAgICAvLyBJZiBjb250ZW50IG9ubHkgZ3JldyAoc2Nyb2xsSGVpZ2h0ID4gaWZyYW1lIGhlaWdodCksIHdlIGNhbiBza2lwIHRoZVxuICAgICAgICAgICAgLy8gMHB4IGNvbGxhcHNlIFx1MjAxNCBzY3JvbGxIZWlnaHQgbmF0dXJhbGx5IGV4cGFuZHMgYmV5b25kIHRoZSBpZnJhbWUuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SWZyYW1lSGVpZ2h0ID0gaWZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVXaWR0aCA9IGlmcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHByZVNjcm9sbEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHByZVNjcm9sbFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuXG4gICAgICAgICAgICBsZXQgY29udGVudFdpZHRoID0gcHJlU2Nyb2xsV2lkdGg7XG4gICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHByZVNjcm9sbEhlaWdodDtcblxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0R3JldyA9IHNob3VsZEF1dG9IZWlnaHQgJiYgcHJlU2Nyb2xsSGVpZ2h0ID4gY3VycmVudElmcmFtZUhlaWdodCArIDE7XG4gICAgICAgICAgICBjb25zdCB3aWR0aEdyZXcgPSBzaG91bGRBdXRvV2lkdGggJiYgcHJlU2Nyb2xsV2lkdGggPiBjdXJyZW50SWZyYW1lV2lkdGggKyAxO1xuXG4gICAgICAgICAgICAvLyBGb3Igbm9uLWdyb3cgY2FzZXMgKHNocmluayBvciBuby1jaGFuZ2UpLCB3ZSBtdXN0IGNvbGxhcHNlIHRvIDBweCB0b1xuICAgICAgICAgICAgLy8gbWVhc3VyZSB0aGUgdHJ1ZSBjb250ZW50IGhlaWdodC4gc2Nyb2xsSGVpZ2h0IGNhbiBuZXZlciBkZWNyZWFzZSBiZWxvd1xuICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSdzIGNsaWVudEhlaWdodCwgc28gc2hyaW5rIGlzIHVuZGV0ZWN0YWJsZSB3aXRob3V0IGNvbGxhcHNpbmcuXG4gICAgICAgICAgICAvLyBXaXRoIHRyYW5zaXRpb25zIGRpc2FibGVkICsgY29udGFpbmVyIG1pbi1oZWlnaHQgaGVsZCwgdGhlIGNvbGxhcHNlXG4gICAgICAgICAgICAvLyBpcyBpbnZpc2libGUgKG5vIGxheW91dCBzaGlmdCwgbm8gYW5pbWF0aW9uKS5cbiAgICAgICAgICAgIGNvbnN0IG5lZWRzSGVpZ2h0Q29sbGFwc2UgPSBzaG91bGRBdXRvSGVpZ2h0ICYmICFoZWlnaHRHcmV3O1xuICAgICAgICAgICAgY29uc3QgbmVlZHNXaWR0aENvbGxhcHNlID0gc2hvdWxkQXV0b1dpZHRoICYmICF3aWR0aEdyZXc7XG5cbiAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlIHx8IG5lZWRzV2lkdGhDb2xsYXBzZSkge1xuICAgICAgICAgICAgICAgIC8vIEhvbGQgdGhlIGNvbnRhaW5lcidzIG1pbi1oZWlnaHQvd2lkdGggZHVyaW5nIG1lYXN1cmVtZW50IHRvIHByZXZlbnRcbiAgICAgICAgICAgICAgICAvLyBsYXlvdXQgc2hpZnQgKGVsZW1lbnRzIGJlbG93IHRoZSBpZnJhbWUgd29uJ3QganVtcCkuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk1pbkhlaWdodCA9IGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk1pbldpZHRoID0gY29udGFpbmVyLnN0eWxlLm1pbldpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlKSBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gYCR7Y3VycmVudElmcmFtZUhlaWdodH1weGA7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzV2lkdGhDb2xsYXBzZSkgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gYCR7Y3VycmVudElmcmFtZVdpZHRofXB4YDtcblxuICAgICAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlKSBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzV2lkdGhDb2xsYXBzZSkgaWZyYW1lLnN0eWxlLndpZHRoID0gJzBweCc7XG5cbiAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcblxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBpZiBjb2xsYXBzaW5nIHRvIDBweCBnYXZlIGEgbmVhci16ZXJvIG1lYXN1cmVtZW50LCB0aGUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy8gbGlrZWx5IGhhcyBgaGVpZ2h0OiAxMDAlYCBjaGFpbnMgKGh0bWwgPiBib2R5ID4gLmFwcC1jb250YWluZXIpIHRoYXQgY2FzY2FkZWRcbiAgICAgICAgICAgICAgICAvLyB0aGUgY29sbGFwc2UgaW50byBhbGwgY2hpbGRyZW4uIFJldHJ5IHdpdGggYSBudWNsZWFyIG92ZXJyaWRlIHRoYXQgZm9yY2VzIGFsbFxuICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRvIGludHJpbnNpYyBzaXppbmcuIFRoaXMgaXMgb25seSBhIGZhbGxiYWNrIGJlY2F1c2UgdGhlIG92ZXJyaWRlXG4gICAgICAgICAgICAgICAgLy8gYnJlYWtzIGV4cGxpY2l0IHBpeGVsIGhlaWdodHMgKGUuZy4gOHB4IGluZGljYXRvciBkb3RzIFx1MjE5MiAwcHgpLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRzTnVjbGVhckhlaWdodCA9IG5lZWRzSGVpZ2h0Q29sbGFwc2UgJiYgY29udGVudEhlaWdodCA8IDI7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZHNOdWNsZWFyV2lkdGggPSBuZWVkc1dpZHRoQ29sbGFwc2UgJiYgY29udGVudFdpZHRoIDwgMjtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFySGVpZ2h0IHx8IG5lZWRzTnVjbGVhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVTdHlsZSA9IGNvbnRlbnREb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLmlkID0gJ19fbXlvcF9tZWFzdXJlJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goJ2hlaWdodDogYXV0byAhaW1wb3J0YW50JywgJ21pbi1oZWlnaHQ6IDAgIWltcG9ydGFudCcsICdtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goJ3dpZHRoOiBhdXRvICFpbXBvcnRhbnQnLCAnbWluLXdpZHRoOiAwICFpbXBvcnRhbnQnLCAnbWF4LXdpZHRoOiBub25lICFpbXBvcnRhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUudGV4dENvbnRlbnQgPSBgKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7ICR7cnVsZXMuam9pbignOyAnKX07IGZsZXgtYmFzaXM6IGF1dG8gIWltcG9ydGFudDsgZmxleC1ncm93OiAwICFpbXBvcnRhbnQ7IH1gO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RG9jLmhlYWQuYXBwZW5kQ2hpbGQobWVhc3VyZVN0eWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgY29udGFpbmVyIGNvbnN0cmFpbnRzIGltbWVkaWF0ZWx5IChzYW1lIGZyYW1lLCBiZWZvcmUgcGFpbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IHByZXZNaW5IZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gcHJldk1pbldpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNsYW1wKGNvbnRlbnRXaWR0aCwgbWluV2lkdGgsIG1heFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGNsYW1wKGNvbnRlbnRIZWlnaHQsIG1pbkhlaWdodCwgbWF4SGVpZ2h0KTtcblxuICAgICAgICAgICAgLy8gU2V0IGF1dG8tc2l6ZWQgZGltZW5zaW9ucyB0byBtZWFzdXJlZCB2YWx1ZXMsIG5vbi1hdXRvIHRvIGV4cGxpY2l0LzEwMCVcbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdFdpZHRofXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yY2UgcmVmbG93IHNvIHRoZSBmaW5hbCBkaW1lbnNpb25zIGFyZSBhcHBsaWVkIHdpdGhvdXQgdHJhbnNpdGlvbixcbiAgICAgICAgICAgIC8vIHRoZW4gcmVzdG9yZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbnMuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAgICAgICBpZnJhbWUub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gcHJldkNvbnRhaW5lclRyYW5zaXRpb247XG5cbiAgICAgICAgICAgIC8vIERvbid0IGZvcmNlIG92ZXJmbG93IFx1MjAxNCBsZXQgdGhlIGNvbXBvbmVudC9wYXJlbnQgY29udHJvbCBzY3JvbGxpbmcuXG4gICAgICAgICAgICAvLyBPbmx5IHNldCBvdmVyZmxvdzogYXV0byB3aGVuIGNvbnRlbnQgZXhjZWVkcyBtYXggY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBpc1dpZHRoQ29uc3RyYWluZWQgPSBzaG91bGRBdXRvV2lkdGggJiYgbWF4V2lkdGggIT09IHVuZGVmaW5lZCAmJiBjb250ZW50V2lkdGggPiBtYXhXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGlzSGVpZ2h0Q29uc3RyYWluZWQgPSBzaG91bGRBdXRvSGVpZ2h0ICYmIG1heEhlaWdodCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRIZWlnaHQgPiBtYXhIZWlnaHQ7XG4gICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBpc1dpZHRoQ29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGlzSGVpZ2h0Q29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcblxuICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IHNob3VsZEF1dG9XaWR0aCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBzaG91bGRBdXRvSGVpZ2h0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJbml0aWFsIHNpemUgKHJ1biBzeW5jaHJvbm91c2x5LCBub3QgZGVib3VuY2VkKVxuICAgICAgICB1cGRhdGVTaXplKCk7XG5cbiAgICAgICAgLy8gU3RvcmUgdXBkYXRlU2l6ZSBmb3IgcmVlbnRyYW50IGNhbGxzXG4gICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdXBkYXRlU2l6ZTtcblxuICAgICAgICAvLyBEZWJvdW5jZSBvYnNlcnZlciBjYWxsYmFja3MgdmlhIHJBRiBcdTIwMTQgYXQgbW9zdCBvbmUgdXBkYXRlU2l6ZSBwZXIgZnJhbWUuXG4gICAgICAgIC8vIFByZXZlbnRzIGxheW91dCB0aHJhc2hpbmcgZnJvbSBoaWdoLWZyZXF1ZW5jeSBtdXRhdGlvbnMgKGUuZy4gQ1NTIGFuaW1hdGlvbnMpLlxuICAgICAgICBsZXQgcmFmSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVVcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmFmSWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJhZklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE9ic2VydmUgZm9yIGNoYW5nZXNcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gc2NoZWR1bGVVcGRhdGUoKSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHkpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvYy5kb2N1bWVudEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIE11dGF0aW9uT2JzZXJ2ZXIgY2F0Y2hlcyBET00gY29udGVudCBjaGFuZ2VzIChlLmcuIHJlbW92aW5nIGxpc3QgaXRlbXMsIHRvZ2dsaW5nIHZpZXdzKVxuICAgICAgICAvLyB0aGF0IGRvbid0IHRyaWdnZXIgUmVzaXplT2JzZXJ2ZXIgYmVjYXVzZSB0aGUgYm9keSBib3gtc2l6ZSBzdGF5cyB0aGUgc2FtZVxuICAgICAgICAvLyAoYm9keSBmaWxscyBpZnJhbWUsIGlmcmFtZSBoYXNuJ3Qgc2hydW5rIHlldCkuXG4gICAgICAgIC8vIGBhdHRyaWJ1dGVzOiB0cnVlYCBjYXRjaGVzIENTUyBjbGFzcy9zdHlsZSBjaGFuZ2VzIChlLmcuIGRpc3BsYXk6bm9uZSB0b2dnbGluZyB2aWV3cykuXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiBzY2hlZHVsZVVwZGF0ZSgpKTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKGRvYy5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBpZiAocmFmSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgICAgICAgICAgICAgICByYWZJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSBjbGVhbnVwO1xuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9icmlkZ2VTaXplQ2xlYW51cD86IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogQXV0by1oZWlnaHQgZm9yIGEgZnJhbWUgdGhlIGhvc3QgY2FuJ3QgcmVhZCAoY3Jvc3Mtb3JpZ2luKS4gUnVucyBhZnRlciB0aGUgSWZyYW1lU0RLXG4gICAgICogaGFuZHNoYWtlOiB0aGUgZnJhbWUgcmVwb3J0cyBib2R5IHJlc2l6ZXMgYW5kIHRoZSBob3N0IHJlLXJlYWRzIHRoZSBzY3JvbGwgaGVpZ2h0LlxuICAgICAqL1xuICAgIG9ic2VydmVIZWlnaHRWaWFCcmlkZ2UgPSAoKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBpZiAodGhpcy5fYnJpZGdlU2l6ZUNsZWFudXApIHJldHVybiB0aGlzLl9icmlkZ2VTaXplQ2xlYW51cDtcblxuICAgICAgICBsZXQgb2JzZXJ2ZXJDbGVhbnVwOiBDbGVhbnVwSGFuZGxlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgb2JzZXJ2ZXJDbGVhbnVwPy4oKTtcbiAgICAgICAgICAgIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9icmlkZ2VTaXplQ2xlYW51cCA9IGNsZWFudXA7XG5cbiAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdG9wcGVkIHx8IHRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgIC8vIExlYXZlIHRoZSBhYnNvbHV0ZSAxMDAlIG92ZXJsYXkgYW5kIHRha2UgcGFydCBpbiB0aGUgY29udGFpbmVyJ3MgbGF5b3V0LlxuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5pbnNldCA9ICdhdXRvJztcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgb2JzZXJ2ZXJDbGVhbnVwID0gdGhpcy5zZW5kKG5ldyBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UoKSk7XG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXA7XG4gICAgfVxuXG4gICAgc2V0U2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyByZXR1cm4gd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcblxuXG4gICAgICAgICAgICAvL1RPRE86IGZpeCB0aGF0IGhhY2ssIGtlZXAgdGhlIGZ1bmN0aW9uIGluIHJpZ2h0IGZvcm1hdCB3aGlsZSBtaW5pZmllZCA6KFxuICAgICAgICAgICAgY29uc3Qgbm9PcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUbyBlbnN1cmUgaXQncyBub3Qgb3B0aW1pemVkIGF3YXksIHlvdSBjYW4gY2FsbCBpdCBhdCBsZWFzdCBvbmNlXG4gICAgICAgICAgICBsZXQgeCA9IG5vT3AoKTtcbiAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgIHgtLTtcblxuICAgICAgICAgICAgLy9yZXR1cm4gYCR7d2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCArMSA/XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICwgd2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSArIHggKyAncHgnXG5cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHJldC5jb250ZW50O1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuICAgICAgICAvL1RPRE8gOiA/IT8hIHNob3VsZCBpdCBiZSBoZXJlID9cbiAgICAgICAgaWYgKG1lc3NhZ2VfLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2VfIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpXG4gICAgICAgICAgICB0aGlzW3R5cGVkTWVzc2FnZS5tZXRob2RdKCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjayA6KFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIG1lc3NhZ2VfLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZShtZXNzYWdlXywgJyonKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uTXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcbiAgICAgICAgICAgIHx8IGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5SZXNpemVPYnNlcnZlck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgLy90aGlzLnNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwPy4oKTtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwKCk7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzb01zZ0hhbmRsZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5faXNvTXNnSGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLl9pc29Nc2dIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KVxuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCgpO1xuXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKHRoaXMuSWZyYW1lRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlclR5cGV9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcExvYWRlciB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BMb2FkZXIgaW1wbGVtZW50cyBJTXlvcExvYWRlciB7XG4gICAgYWJzdHJhY3QgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgYWJzdHJhY3QgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xuXG4gICAgYXBwZW5kQ2hpbGQgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ucmVsYXRpdmUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBvcHRpb25zLnJlbGF0aXZlLmNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBvcHRpb25zLnJlbGF0aXZlLmNoaWxkPy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBuZXh0U2libGluZyA/IG5leHRTaWJsaW5nIDogbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBhZGRRdWVyeVBhcmFtID0gKHVybDogc3RyaW5nLCBwYXJhbTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgVVJMIG9iamVjdFxuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblxuICAgIC8vIEFkZCB0aGUgcXVlcnkgcGFyYW1ldGVyXG4gICAgdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQocGFyYW0sIHZhbHVlKTtcblxuICAgIC8vIFJldHVybiB0aGUgdXBkYXRlZCBVUkxcbiAgICByZXR1cm4gdXJsT2JqLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lTG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuICAgIHR5cGUgPSBTa2luTG9hZGVycy5JZnJhbWVMb2FkZXJcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcbiAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmIChjb250YWluZXI/Lm5vZGVOYW1lID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbmVlZHMgdG8gbG9hZCBpbnRvIGFuIGV4c2lzdGluZyBJZnJhbWUuLi4nLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSAoY29udGFpbmVyIGFzIEhUTUxJRnJhbWVFbGVtZW50KVxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB0eXBlZExvYWRlckNvbmZpZy51cmxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZVN0eWxlcyA9IGBcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcxMDAlJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBpZnJhbWVTdHlsZXM7XG5cbiAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IGF0dHJpYnV0ZXMgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZWxlbWVudEF0dHJpYnV0ZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgJycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgaXNzdWUgdG8gbG9hZCBpZnJhbWUgaW5zaWRlIGFuIGlmcmFtZSB3aXRoIHRoZSBzYW1lIHVybFxuICAgICAgICAgICAgbGV0IHVybDJsb2FkID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLnVybDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faGFzUGFyZW50KVxuICAgICAgICAgICAgICAgIHVybDJsb2FkID0gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbXlvcC1jb21wXCIsIHVuaXFJZCk7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdXJsMmxvYWQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbUlkKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vTk8gOiBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGBhdXRvSGVpZ2h0YCBpbiB0aGUgdjEgY29uZmlnIHVzZWQgdG8gb25seSBzZXQgaGVpZ2h0OjEwMCUgb24gYW4gYWJzb2x1dGUgZnJhbWUsIHNvIGluIGFuXG4gICAgICAgIC8vIHVuc2l6ZWQgY29udGFpbmVyIHRoZSBmcmFtZSBzdGF5ZWQgYXQgdGhlIDE1MHB4IENTUyBkZWZhdWx0LlxuICAgICAgICBpZiAodHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCAmJiBvcHRpb25zPy5hdXRvU2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vYnNlcnZlSGVpZ2h0VmlhQnJpZGdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgJzAuNC4wLWJldGEuMCc7IiwgIi8qKlxuICogVGhlIGNsaWVudCB3aW5kb3c6IHdoYXQgYSByZXR1cm5pbmcgdmlzaXRvciBkb2VzIE5PVCBhc2sgZm9yLlxuICpcbiAqIEEgY29tcG9uZW50IHRoZSBicm93c2VyIGFscmVhZHkgaG9sZHMsIHN0aWxsIGluc2lkZSBpdHMgZnJlc2huZXNzIHdpbmRvdywgaXMgcmVuZGVyZWRcbiAqIHdpdGggbm8gbmV0d29yayBhdCBhbGwuIE9uY2UgdGhlIHdpbmRvdyBlbmRzIHRoZSBicm93c2VyIGRvZXMgbm90IHJlLWRvd25sb2FkIGl0IGVpdGhlclxuICogXHUyMDE0IGl0IHNlbmRzIGJhY2sgdGhlIHZlcnNpb24gaXQgaG9sZHMgYW5kIGlzIHVzdWFsbHkgdG9sZCBcInVuY2hhbmdlZFwiIGluIGEgZmV3IGh1bmRyZWRcbiAqIGJ5dGVzLlxuICpcbiAqIFRIRSBXSU5ET1cgSVMgVEhFIFNFUlZFUidTLCBOT1QgT1VSUy4gSXQgY29tZXMgZnJvbSB0aGUgcmVzcG9uc2U6IGBzLW1heGFnZWAgaXMgdGhlXG4gKiBmcmVzaG5lc3MgdGhlIHNlcnZlciBwcm9taXNlZCwgYW5kIGBBZ2VgIGlzIGhvdyBtdWNoIG9mIGl0IGEgQ0ROIGFscmVhZHkgc3BlbnQgYmVmb3JlXG4gKiB0aGUgYnl0ZXMgcmVhY2hlZCB1cy4gVGhlIHdpbmRvdyB3ZSBtYXkga2VlcCBpcyB0aGVyZWZvcmUgYHMtbWF4YWdlIC0gQWdlYCwgbmV2ZXJcbiAqIGBzLW1heGFnZWAgXHUyMDE0IG90aGVyd2lzZSBhIGNvcHkgdGhhdCBzYXQgYXQgdGhlIGVkZ2UgZm9yIDU1IG9mIGl0cyA2MCBzZWNvbmRzIHdvdWxkIGJlXG4gKiBoZWxkIGZvciBhbm90aGVyIDYwIGhlcmUsIGFuZCBhIHB1Ymxpc2ggd291bGQgdGFrZSB0d2ljZSBhcyBsb25nIHRvIGJlIHNlZW4gYXMgcHJvbWlzZWQuXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgZWFzaWVzdCB0aGluZyB0byBnZXQgd3JvbmcgaW4gYSBjbGllbnQgY2FjaGUsIGFuZCBpdCBpcyBpbnZpc2libGUgaW5cbiAqIHRlc3RpbmcgYmVjYXVzZSBpdCBvbmx5IHNob3dzIHVwIGFzIFwic29tZXRpbWVzIHN0YWxlXCIuXG4gKlxuICogSW5kZXhlZERCLCBub3QgbG9jYWxTdG9yYWdlOiBjb21wb25lbnRzIHJ1biB0byBodW5kcmVkcyBvZiBLQiwgbG9jYWxTdG9yYWdlIGNhcHMgYXJvdW5kXG4gKiA1IE1CIGFuZCBibG9ja3MgdGhlIG1haW4gdGhyZWFkLiBFdmVyeSBwYXRoIGRlZ3JhZGVzIHRvIHRoZSBuZXR3b3JrIFx1MjAxNCBhIGJyb3dzZXIgaW5cbiAqIHByaXZhdGUgbW9kZSwgd2l0aCBzdG9yYWdlIGRpc2FibGVkIG9yIG92ZXIgcXVvdGEsIG11c3QgcmVuZGVyIHRoZSBwYWdlLCBub3QgZmFpbCBpdC5cbiAqL1xuXG5jb25zdCBEQl9OQU1FID0gJ215b3AtZGVsaXZlcnknO1xuY29uc3QgU1RPUkUgPSAnY29tcG9uZW50cyc7XG5jb25zdCBEQl9WRVJTSU9OID0gMTtcblxuZXhwb3J0IGludGVyZmFjZSBTdG9yZWRFbnRyeSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgLyoqIHRoZSByZXNvbHZlZCBjb21wb25lbnQgY29uZmlnLCBleGFjdGx5IGFzIHRoZSBuZXR3b3JrIHBhdGggcHJvZHVjZXMgaXQgKi9cbiAgICBjb25maWc6IGFueTtcbiAgICAvKiogdGhlIHNlcnZlcidzIHZlcnNpb24gdG9rZW4gZm9yIHRoZXNlIGJ5dGVzOiBgPHJldj5+PG9wdD5gICovXG4gICAgdGFnOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiB3aGVuIHRoaXMgYnJvd3NlciBzdG9yZWQgaXQgKi9cbiAgICBzdG9yZWRBdDogbnVtYmVyO1xuICAgIC8qKiBob3cgbG9uZyBpdCBtYXkgYmUgdXNlZCB3aXRob3V0IGFza2luZywgaW4gbXMgKGFscmVhZHkgQWdlLWFkanVzdGVkKSAqL1xuICAgIHdpbmRvd01zOiBudW1iZXI7XG4gICAgLyoqIHdoaWNoIGhvc3QgcHJvZHVjZWQgaXQgXHUyMDE0IGEga2V5IGZyb20gYW5vdGhlciBob3N0IGlzIG5ldmVyIHJldXNlZCAqL1xuICAgIGhvc3Q6IHN0cmluZztcbiAgICAvKiogd2lyZSBzaXplIG9mIHRoZSByZXNwb25zZSBpdCBjYW1lIGZyb20sIHNvIHN0YXRzIGNhbiBzYXkgd2hhdCB0aGUgd2luZG93IHNhdmVkICovXG4gICAgYnl0ZXM/OiBudW1iZXI7XG59XG5cbmxldCBkYlByb21pc2U6IFByb21pc2U8SURCRGF0YWJhc2UgfCBudWxsPiB8IG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiBvcGVuRGIoKTogUHJvbWlzZTxJREJEYXRhYmFzZSB8IG51bGw+IHtcbiAgICBpZiAoZGJQcm9taXNlKSByZXR1cm4gZGJQcm9taXNlO1xuICAgIGRiUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGluZGV4ZWREQiA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgY29uc3QgcmVxID0gaW5kZXhlZERCLm9wZW4oREJfTkFNRSwgREJfVkVSU0lPTik7XG4gICAgICAgICAgICByZXEub251cGdyYWRlbmVlZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRiID0gcmVxLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoU1RPUkUpKSBkYi5jcmVhdGVPYmplY3RTdG9yZShTVE9SRSwgeyBrZXlQYXRoOiAna2V5JyB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXEub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXEucmVzdWx0KTtcbiAgICAgICAgICAgIHJlcS5vbmVycm9yID0gKCkgPT4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIC8vIEEgYmxvY2tlZCB1cGdyYWRlIG11c3Qgbm90IGhhbmcgdGhlIHBhZ2UgbG9hZC5cbiAgICAgICAgICAgIHJlcS5vbmJsb2NrZWQgPSAoKSA9PiByZXNvbHZlKG51bGwpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGJQcm9taXNlO1xufVxuXG5mdW5jdGlvbiB0eDxUPihtb2RlOiBJREJUcmFuc2FjdGlvbk1vZGUsIGZuOiAoc3RvcmU6IElEQk9iamVjdFN0b3JlKSA9PiBJREJSZXF1ZXN0KTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIHJldHVybiBvcGVuRGIoKS50aGVuKGRiID0+IG5ldyBQcm9taXNlPFQgfCBudWxsPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBpZiAoIWRiKSByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBkYi50cmFuc2FjdGlvbihTVE9SRSwgbW9kZSk7XG4gICAgICAgICAgICBjb25zdCByZXEgPSBmbih0Lm9iamVjdFN0b3JlKFNUT1JFKSk7XG4gICAgICAgICAgICByZXEub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXEucmVzdWx0IGFzIFQpO1xuICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSAoKSA9PiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgdC5vbmFib3J0ID0gKCkgPT4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9XG4gICAgfSkpO1xufVxuXG4vKipcbiAqIEEgU1lOQ0hST05PVVMgc2hhZG93IG9mIHdoYXQgd2UgaG9sZCwgZm9yIGNvZGUgdGhhdCBydW5zIGJlZm9yZSBJbmRleGVkREIgY2FuIGFuc3dlci5cbiAqXG4gKiBUaGUgcGFnZSdzIEhUTUwgY2FuIHN0YXJ0IHRoZSBjb21wb25lbnQgcmVxdWVzdCB3aGlsZSB0aGUgSlMgYnVuZGxlIGlzIHN0aWxsIGRvd25sb2FkaW5nXG4gKiBcdTIwMTQgYnV0IG9ubHkgaWYgaXQga25vd3MsIGF0IHBhcnNlIHRpbWUsIHdoZXRoZXIgYSByZXF1ZXN0IGlzIG5lZWRlZCBhdCBhbGwgYW5kIHdoaWNoIG9uZS5cbiAqIEluZGV4ZWREQiBpcyBhc3luYywgc28gYW4gaW5saW5lIHNjcmlwdCBjYW5ub3QgYXNrIGl0LiBsb2NhbFN0b3JhZ2UgY2FuIGJlIHJlYWRcbiAqIHN5bmNocm9ub3VzbHksIHNvIGVhY2ggZW50cnkgbWlycm9ycyB0d28gdGlueSBmYWN0cyBoZXJlOiB0aGUgdmVyc2lvbiB0YWcgYW5kIHdoZW4gdGhlXG4gKiB3aW5kb3cgZW5kcy4gTm90aGluZyBlbHNlIFx1MjAxNCB0aGUgY29tcG9uZW50IGl0c2VsZiBzdGF5cyBpbiBJbmRleGVkREIgd2hlcmUgaXQgYmVsb25ncy5cbiAqXG4gKiBXaXRob3V0IHRoaXMgdGhlIHByZWxvYWQgaGludCBpcyBhY3RpdmVseSBoYXJtZnVsOiBpdCBkb3dubG9hZHMgdGhlIHdob2xlIGNvbXBvbmVudFxuICogZXZlcnkgdGltZSwgaW5jbHVkaW5nIG9uIHRoZSB2aXNpdHMgd2hlcmUgdGhlIHN0b3JlZCBjb3B5IHdhcyBnb2luZyB0byBhbnN3ZXIgZm9yIGZyZWUuXG4gKiBNZWFzdXJlZCBvbiBteW9wLmRldiBiZWZvcmUgaXQgZXhpc3RlZCBcdTIwMTQgOTggS0IgZmV0Y2hlZCwgdGhlbiBkaXNjYXJkZWQsIG9uIGV2ZXJ5IHJlbG9hZC5cbiAqL1xuY29uc3QgSElOVF9QUkVGSVggPSAnbXlvcC5kLic7XG5cbmZ1bmN0aW9uIHdyaXRlSGludChrZXk6IHN0cmluZywgdGFnOiBzdHJpbmcgfCBudWxsLCBleHBpcmVzQXQ6IG51bWJlcikge1xuICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKEhJTlRfUFJFRklYICsga2V5LCBKU09OLnN0cmluZ2lmeSh7IHQ6IHRhZywgZTogZXhwaXJlc0F0IH0pKTsgfVxuICAgIGNhdGNoIHsgLyogcHJpdmF0ZSBtb2RlLCBxdW90YSwgZGlzYWJsZWQgXHUyMDE0IHRoZSBoaW50IGlzIGFuIG9wdGltaXNhdGlvbiwgbmV2ZXIgYSByZXF1aXJlbWVudCAqLyB9XG59XG5cbmZ1bmN0aW9uIGNsZWFySGludChrZXk6IHN0cmluZykge1xuICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKEhJTlRfUFJFRklYICsga2V5KTsgfSBjYXRjaCB7IC8qIGFzIGFib3ZlICovIH1cbn1cblxuLyoqIEEgbWVtb3J5IGxheWVyIGluIGZyb250IG9mIHN0b3JhZ2U6IGEgc2Vjb25kIGNvbXBvbmVudCBvbiB0aGUgc2FtZSBwYWdlIG11c3Qgbm90IHdhaXQgb24gSU8uICovXG5jb25zdCBtZW1vcnkgPSBuZXcgTWFwPHN0cmluZywgU3RvcmVkRW50cnk+KCk7XG5cbmV4cG9ydCBjb25zdCBkZWxpdmVyeVN0b3JlID0ge1xuICAgIGtleShob3N0OiBzdHJpbmcsIGNvbXBvbmVudElkOiBzdHJpbmcsIGVudjogc3RyaW5nLCBwcmV2aWV3OiBib29sZWFuLCBvcHQ6IHN0cmluZykge1xuICAgICAgICAvLyBUaGUgSE9TVCBpcyBwYXJ0IG9mIHRoZSBrZXkuIFR3byBzdGFja3MgY2FuIHNlcnZlIHRoZSBzYW1lIGNvbXBvbmVudCB3aXRoXG4gICAgICAgIC8vIGRpZmZlcmVudCBmcmVzaG5lc3MsIGFuZCBlbnRyaWVzIGZyb20gb25lIG11c3QgbmV2ZXIgYmUgcmVhZCBhcyB0aGUgb3RoZXIncy5cbiAgICAgICAgcmV0dXJuIGAke2hvc3R9fCR7Y29tcG9uZW50SWR9fCR7ZW52fXwke3ByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9fCR7b3B0IHx8ICdyYXcnfWA7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8U3RvcmVkRW50cnkgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IG0gPSBtZW1vcnkuZ2V0KGtleSk7XG4gICAgICAgIGlmIChtKSByZXR1cm4gbTtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IHR4PFN0b3JlZEVudHJ5PigncmVhZG9ubHknLCBzID0+IHMuZ2V0KGtleSkpO1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgbWVtb3J5LnNldChrZXksIGUpO1xuICAgICAgICAgICAgLy8gU0VMRi1IRUFMLiBUaGUgdHdvIHN0b3JlcyBjYW4gZGlzYWdyZWU6IGFuIGVudHJ5IHdyaXR0ZW4gYmVmb3JlIHRoZSBoaW50XG4gICAgICAgICAgICAvLyBleGlzdGVkLCBhIGJyb3dzZXIgdGhhdCBldmljdGVkIGxvY2FsU3RvcmFnZSBidXQgbm90IEluZGV4ZWREQiwgYSB1c2VyIHdob1xuICAgICAgICAgICAgLy8gY2xlYXJlZCBvbmUuIEEgbWlzc2luZyBoaW50IG1ha2VzIHRoZSBwcmVsb2FkIGZhbGwgYmFjayB0byB0aGUgRlVMTCBjb21wb25lbnRcbiAgICAgICAgICAgIC8vIHdoaWxlIHRoZSBTREssIHdoaWNoIGNhbiBzZWUgSW5kZXhlZERCLCBvbmx5IHdhbnRzIHRoZSB2ZXJzaW9uIGNoZWNrIC0tIHR3b1xuICAgICAgICAgICAgLy8gcmVxdWVzdHMgd2hlcmUgdGhlcmUgc2hvdWxkIGJlIG9uZS4gU2VlbiBpbiB0aGUgd2lsZCBvbiB0aGUgZmlyc3QgbG9hZCBhZnRlclxuICAgICAgICAgICAgLy8gdGhlIGhpbnQgc2hpcHBlZC4gUmV3cml0aW5nIGl0IGhlcmUgY29zdHMgbm90aGluZyBhbmQgY2xvc2VzIHRoZSBnYXAgZm9yIGdvb2QuXG4gICAgICAgICAgICB3cml0ZUhpbnQoa2V5LCBlLnRhZywgZS5zdG9yZWRBdCArIGUud2luZG93TXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlO1xuICAgIH0sXG5cbiAgICBhc3luYyBwdXQoZW50cnk6IFN0b3JlZEVudHJ5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIG1lbW9yeS5zZXQoZW50cnkua2V5LCBlbnRyeSk7XG4gICAgICAgIHdyaXRlSGludChlbnRyeS5rZXksIGVudHJ5LnRhZywgZW50cnkuc3RvcmVkQXQgKyBlbnRyeS53aW5kb3dNcyk7XG4gICAgICAgIGF3YWl0IHR4KCdyZWFkd3JpdGUnLCBzID0+IHMucHV0KGVudHJ5KSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRyb3Aoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbWVtb3J5LmRlbGV0ZShrZXkpO1xuICAgICAgICBjbGVhckhpbnQoa2V5KTtcbiAgICAgICAgYXdhaXQgdHgoJ3JlYWR3cml0ZScsIHMgPT4gcy5kZWxldGUoa2V5KSk7XG4gICAgfSxcblxuICAgIC8qKiBTdGlsbCB1c2FibGUgd2l0aG91dCBhc2tpbmcgdGhlIHNlcnZlcj8gKi9cbiAgICBmcmVzaChlOiBTdG9yZWRFbnRyeSB8IG51bGwpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhZSAmJiAoRGF0ZS5ub3coKSAtIGUuc3RvcmVkQXQpIDwgZS53aW5kb3dNcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIHdpbmRvdyB0aGlzIHJlc3BvbnNlIGxpY2Vuc2VzOiB0aGUgc2VydmVyJ3MgZnJlc2huZXNzIG1pbnVzIHdoYXQgYSBDRE4gYWxyZWFkeVxuICAgICAqIHNwZW50LiBSZXR1cm5zIDAgd2hlbiB0aGUgc2VydmVyIHNhaWQgbm90aGluZyBhYm91dCBjYWNoaW5nLCB3aGljaCBtZWFucyBcImRvIG5vdFxuICAgICAqIGhvbGQgdGhpc1wiIFx1MjAxNCB0aGUgc2FmZSByZWFkaW5nLCBhbmQgd2hhdCBwcm9kdWN0aW9uIHNlbmRzIHRvZGF5LlxuICAgICAqL1xuICAgIHdpbmRvd0Zyb20oaGVhZGVyczogSGVhZGVycyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNjID0gaGVhZGVycy5nZXQoJ2NhY2hlLWNvbnRyb2wnKSB8fCAnJztcbiAgICAgICAgaWYgKC9uby1zdG9yZXxuby1jYWNoZS9pLnRlc3QoY2MpKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgbSA9IC9zLW1heGFnZVxccyo9XFxzKihcXGQrKS9pLmV4ZWMoY2MpIHx8IC9tYXgtYWdlXFxzKj1cXHMqKFxcZCspL2kuZXhlYyhjYyk7XG4gICAgICAgIGlmICghbSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKG1bMV0pO1xuICAgICAgICBjb25zdCBhZ2UgPSBOdW1iZXIoaGVhZGVycy5nZXQoJ2FnZScpIHx8IDApO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKHRvdGFsIC0gKGlzTmFOKGFnZSkgPyAwIDogYWdlKSkpICogMTAwMDtcbiAgICB9LFxuXG4gICAgLyoqIEZvciB0ZXN0cyBhbmQgZm9yIGByZWZyZXNoKClgOiBmb3JnZXQgZXZlcnl0aGluZyB0aGlzIGJyb3dzZXIgaG9sZHMuICovXG4gICAgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIG1lbW9yeS5jbGVhcigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGxvY2FsU3RvcmFnZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBsb2NhbFN0b3JhZ2Uua2V5KGkpO1xuICAgICAgICAgICAgICAgIGlmIChrICYmIGsuc3RhcnRzV2l0aChISU5UX1BSRUZJWCkpIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHsgLyogbm90aGluZyB0byBjbGVhbiB1cCBpZiBpdCB3YXMgbmV2ZXIgd3JpdGFibGUgKi8gfVxuICAgICAgICBhd2FpdCB0eCgncmVhZHdyaXRlJywgcyA9PiBzLmNsZWFyKCkpO1xuICAgIH0sXG59O1xuIiwgImltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVByb3BDb25maWcsXG4gICAgSVNraW5Db25maWcsXG4gICAgSVVzZXJGbG93LFxuICAgIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIHYyX0lWYXJpYW50Q29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7IGRlbGl2ZXJ5U3RvcmUgfSBmcm9tIFwiLi9kZWxpdmVyeVN0b3JlXCI7XG5cbmNvbnN0IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyA9IChjb25maWc6IHYyX0lWYXJpYW50Q29uZmlnKTogSUNvbXBvbmVudENvbmZpZyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2U6IHtcbiAgICAgICAgICAgIGlkOiAnYXV0bycsXG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29uZmlnLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZTogY29uZmlnLm5hbWUsXG5cbiAgICAgICAgICAgIHNraW5TZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcbiAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfaW5pdF9pbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWcsXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnb3V0X2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfY3RhX2hhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgICAgIHNraW5zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRsZSBlbXB0eSA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBjb25maWcuY29uc3VtZV92YXJpYW50WzBdLmxvYWRlclxuICAgICAgICAgICAgICAgIH0gYXMgSVNraW5Db25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgICAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBuYW1lOiBjb25maWcubmFtZVxuICAgIH0gYXMgSUNvbXBvbmVudENvbmZpZztcbn07XG5cbi8qKlxuICogQ2xvdWRSZXBvc2l0b3J5IC0gVW5pZmllZCBjbG91ZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgTXlvcCBjb21wb25lbnRzXG4gKlxuICogU3VwcG9ydHMgYm90aCB2MiAoZGVmYXVsdCkgYW5kIHYxIG1vZGVzOlxuICogLSB2MjogVXNlcyAvY29uc3VtZSBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdmFyaWFudHNcbiAqIC0gdjE6IFVzZXMgL2Zsb3cgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHVzZXIgZmxvd3NcbiAqL1xuLy8gVXNlIGEgZ2xvYmFsIHNpbmdsZXRvbiB0byBlbnN1cmUgb25seSBvbmUgQ2xvdWRSZXBvc2l0b3J5Lk1haW4gZXhpc3RzXG4vLyBldmVuIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXMgYnkgZGlmZmVyZW50IGJ1bmRsZXJzXG5jb25zdCBHTE9CQUxfS0VZID0gJ19fTVlPUF9DTE9VRF9SRVBPU0lUT1JZX01BSU5fXyc7XG5cbmNvbnN0IGdldEdsb2JhbE1haW4gPSAoKTogQ2xvdWRSZXBvc2l0b3J5IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IHNldEdsb2JhbE1haW4gPSAoaW5zdGFuY2U6IENsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX21haW46IENsb3VkUmVwb3NpdG9yeSB8IG51bGwgPSBudWxsO1xuXG4gICAgc3RhdGljIGdldCBNYWluKCk6IENsb3VkUmVwb3NpdG9yeSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGEgZ2xvYmFsIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzIChmcm9tIGFub3RoZXIgYnVuZGxlKVxuICAgICAgICBjb25zdCBnbG9iYWxNYWluID0gZ2V0R2xvYmFsTWFpbigpO1xuICAgICAgICBpZiAoZ2xvYmFsTWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbE1haW47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIUNsb3VkUmVwb3NpdG9yeS5fbWFpbikge1xuICAgICAgICAgICAgQ2xvdWRSZXBvc2l0b3J5Ll9tYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgc2V0R2xvYmFsTWFpbihDbG91ZFJlcG9zaXRvcnkuX21haW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDbG91ZFJlcG9zaXRvcnkuX21haW47XG4gICAgfVxuXG4gICAgLy8gdjIgY2FjaGUgLSBrZXllZCBieSBjb21wb25lbnRJZDplbnY6cHJldmlld3xsaXZlXG4gICAgLy8gRWFjaCBQcm9taXNlIGlzIHRhZ2dlZCB3aXRoIGEgYHJlc29sdmVkYCBwcm9wZXJ0eSBhZnRlciBzZXR0bGluZyAoc2VlIGZldGNoQ29tcG9uZW50VjIpLlxuICAgIHByaXZhdGUgdmFyaWFudHM6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4gJiB7IHJlc29sdmVkPzogSUNvbXBvbmVudENvbmZpZyB9PiA9IHt9O1xuXG4gICAgLy8gVHJhY2sgd2hpY2ggY29tcG9uZW50cyB3ZXJlIHByZWxvYWRlZCBhbmQgd2l0aCB3aGF0IHBhcmFtc1xuICAgIC8vIEtleTogY29tcG9uZW50SWQsIFZhbHVlOiB7IGVudiwgcHJldmlldyB9XG4gICAgcHJpdmF0ZSBwcmVsb2FkZWRDb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCB7IGVudjogc3RyaW5nOyBwcmV2aWV3OiBib29sZWFuIH0+ID0ge307XG5cbiAgICAvLyB2MSBjYWNoZVxuICAgIHByaXZhdGUgdXNlckZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0RW52ID0gJ3Byb2R1Y3Rpb24nO1xuICAgIHByaXZhdGUgX2VudkV4cGxpY2l0bHlTZXQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9zdGF0aWNNb2RlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfcXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIb3cgYmlnIHRoZSBjb21wb25lbnQgd2UgYXJlIE5PVCByZS1kb3dubG9hZGluZyBpcy4gRGVsaWJlcmF0ZWx5IG1lYXN1cmVkIGZyb20gd2hhdFxuICAgICAqIHdlIGhvbGQgcmF0aGVyIHRoYW4gZnJvbSBDb250ZW50LUxlbmd0aDogb25jZSBhIHJlc3BvbnNlIGlzIGNvbXByZXNzZWQgdGhlIGhlYWRlciBpc1xuICAgICAqIG5vdCByZWFkYWJsZSBjcm9zcy1vcmlnaW4sIHNvIHJlYWRpbmcgaXQgdGhlcmUgcmVwb3J0ZWQgMCBldmVyeSBzaW5nbGUgdGltZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBzaXplT2ZIZWxkKGU6IGFueSk6IG51bWJlciB7XG4gICAgICAgIHRyeSB7IHJldHVybiAoZT8uY29uZmlnPy50eXBlPy5za2lucz8uWzBdPy5sb2FkZXI/LkhUTUwgfHwgJycpLmxlbmd0aDsgfSBjYXRjaCB7IHJldHVybiAwOyB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBob3N0IGV2ZXJ5IHJlcXVlc3QgZ29lcyB0byB1bmxlc3MgZGVsaXZlcnkoKSBtb3ZlZCBpdC4gTmV2ZXIgY2hhbmdlcy4gKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0hPU1QgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldic7XG5cbiAgICAvKipcbiAgICAgKiBPcHQtaW4gZGVsaXZlcnkgc2V0dGluZ3MsIHNldCBieSBteW9wLmRlbGl2ZXJ5KCkuIE9mZiBtZWFuczogdGhpcyBmaWxlIGJlaGF2ZXNcbiAgICAgKiBFWEFDVExZIGFzIGl0IGRpZCBiZWZvcmUgXHUyMDE0IHNhbWUgaG9zdCwgc2FtZSBVUkwsIHNhbWUgZXZlcnl0aGluZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9kZWxpdmVyeTogeyBtaW5pZnk6IGJvb2xlYW47IGhvc3Q6IHN0cmluZyB8IG51bGw7IGNhY2hlOiBib29sZWFuIH0gPVxuICAgICAgICB7IG1pbmlmeTogZmFsc2UsIGhvc3Q6IG51bGwsIGNhY2hlOiBmYWxzZSB9O1xuXG4gICAgLyoqXG4gICAgICogV2hhdCBhY3R1YWxseSBoYXBwZW5lZCwgZm9yIG15b3AuZGVsaXZlcnkuc3RhdHMoKS4gYGZlbGxCYWNrYCBpcyB0aGUgbnVtYmVyIHRoYXRcbiAgICAgKiBtYXR0ZXJzOiBpdCBpcyBob3cgeW91IGZpbmQgb3V0IHRoZSBsYW5lIGlzIHVuaGVhbHRoeSB3aXRob3V0IHdhaXRpbmcgZm9yIGFcbiAgICAgKiBidWcgcmVwb3J0LCBiZWNhdXNlIGEgZmFsbGJhY2sgaXMgSU5WSVNJQkxFIHRvIHRoZSBwYWdlIChpdCBzdGlsbCByZW5kZXJzKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9kZWxpdmVyeVN0YXRzID0ge1xuICAgICAgICByZXF1ZXN0czogMCwgdmlhRGVsaXZlcnk6IDAsIGZlbGxCYWNrOiAwLCBsYXN0RXJyb3I6IG51bGwgYXMgc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgLyoqIHdoZXJlIHRoZSBsYXN0IGxvYWRzIHdlcmUgYW5zd2VyZWQgZnJvbSBcdTIwMTQgdGhlIG51bWJlciB0aGUgY2xpZW50IHdpbmRvdyBleGlzdHMgdG8gbW92ZSAqL1xuICAgICAgICBmcm9tTWVtb3J5OiAwLCBmcm9tU3RvcmFnZTogMCwgZnJvbU5ldHdvcms6IDAsXG4gICAgICAgIC8qKiByZS1jaGVja3MgYWZ0ZXIgdGhlIHdpbmRvdyBlbmRlZCwgYW5kIGhvdyBtYW55IHdlcmUgYW5zd2VyZWQgXCJub3RoaW5nIGNoYW5nZWRcIiAqL1xuICAgICAgICByZXZhbGlkYXRpb25zOiAwLCB1bmNoYW5nZWQ6IDAsIGJ5dGVzU2F2ZWQ6IDAsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFR1cm4gb24gdGhlIG9wdC1pbiBkZWxpdmVyeSBwYXRoLlxuICAgICAqXG4gICAgICogT3B0aW5nIGluIElTIGNob29zaW5nIHRoZSBkZWxpdmVyeSBzdGFjazogdGhpcyBwb2ludHMgL2NvbnN1bWUgYXQgYGhvc3RgIChhIHNlY29uZCxcbiAgICAgKiBjb21wbGV0ZSBzdGFjayByZWFkaW5nIHRoZSBzYW1lIGRhdGEpIGFuZCBhc2tzIGZvciB0aGUgbWluaWZpZWQgYXJ0aWZhY3QuIExlYXZlIHRoaXNcbiAgICAgKiB1bmNhbGxlZCBhbmQgbm90aGluZyBhYm91dCB0aGUgU0RLIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBEZWxpYmVyYXRlbHkgbXV0YXRlcyBUSElTIGluc3RhbmNlIHJhdGhlciB0aGFuIGNvbnN0cnVjdGluZyBhIG5ldyByZXBvc2l0b3J5OlxuICAgICAqIENsb3VkUmVwb3NpdG9yeS5NYWluIGlzIGEgZ2xvYmFsIHNpbmdsZXRvbiBzaGFyZWQgYWNyb3NzIGJ1bmRsZXMgKHNlZSBnZXRHbG9iYWxNYWluKSxcbiAgICAgKiBzbyBhIHNlY29uZCBpbnN0YW5jZSB3b3VsZCBiZSBpZ25vcmVkIGJ5IGV2ZXJ5IGNvbXBvbmVudCBhbHJlYWR5IHVzaW5nIHRoZSBmaXJzdC5cbiAgICAgKi9cbiAgICBzZXREZWxpdmVyeShvcHRzOiB7IG1pbmlmeT86IGJvb2xlYW47IGhvc3Q/OiBzdHJpbmcgfCBudWxsOyBjYWNoZT86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRzLm1pbmlmeSAhPT0gdW5kZWZpbmVkKSB0aGlzLl9kZWxpdmVyeS5taW5pZnkgPSAhIW9wdHMubWluaWZ5O1xuICAgICAgICBpZiAob3B0cy5ob3N0ICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5Lmhvc3QgPSBvcHRzLmhvc3Q7XG4gICAgICAgIGlmIChvcHRzLmNhY2hlICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5LmNhY2hlID0gISFvcHRzLmNhY2hlO1xuICAgIH1cblxuICAgIGRlbGl2ZXJ5U3RhdHMoKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnRoaXMuX2RlbGl2ZXJ5U3RhdHMsIGhvc3Q6IHRoaXMuX2RlbGl2ZXJ5Lmhvc3QgPz8gQ2xvdWRSZXBvc2l0b3J5LkRFRkFVTFRfSE9TVCxcbiAgICAgICAgICAgICAgICAgbWluaWZ5OiB0aGlzLl9kZWxpdmVyeS5taW5pZnksIGNhY2hlOiB0aGlzLl9kZWxpdmVyeS5jYWNoZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcmdldCB3aGF0IHRoaXMgYnJvd3NlciBob2xkcywgc28gdGhlIG5leHQgbG9hZCBhc2tzIHRoZSBzZXJ2ZXIuXG4gICAgICogYHJlZnJlc2goKWAgd2l0aCBubyBpZHMgZHJvcHMgZXZlcnl0aGluZzsgdGhlIGNvdW50ZXJwYXJ0IHRvIHRoZSB3aW5kb3cgZm9yIHRoZSBjYXNlXG4gICAgICogd2hlcmUgYSBjaGFuZ2UgaGFzIHRvIGJlIHZpc2libGUgb24gVEhJUyBsb2FkIFx1MjAxNCByaWdodCBhZnRlciBzb21lb25lIHB1Ymxpc2hlcy5cbiAgICAgKi9cbiAgICBhc3luYyByZWZyZXNoRGVsaXZlcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGRlbGl2ZXJ5U3RvcmUuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2NhbCBzZXJ2ZXMgd2FpdGluZyB0byBiZSByZXBvcnRlZDogY29tcG9uZW50SWQgLT4ge2VudiwgY291bnR9LlxuICAgICAqXG4gICAgICogVEhFIE1FQVNVUkVNRU5UIFBST0JMRU0gVEhJUyBTT0xWRVMuIFRoZSBiZXR0ZXIgdGhpcyBjYWNoZSB3b3JrcywgdGhlIG1vcmUgdXNhZ2VcbiAgICAgKiB2YW5pc2hlczogYSB2aXNpdG9yIGluc2lkZSB0aGVpciBmcmVzaG5lc3Mgd2luZG93IHJlbmRlcnMgdGhlIHBhZ2Ugd2l0aCBubyByZXF1ZXN0LFxuICAgICAqIHNvIG5laXRoZXIgdGhlIHNlcnZlciBub3IgdGhlIENETiBjYW4gc2VlIHRoZW0uIExlZnQgYWxvbmUsIGEgc3VjY2Vzc2Z1bCByb2xsb3V0XG4gICAgICogbG9va3MgaW4gdGhlIGxlZGdlciBleGFjdGx5IGxpa2UgY3VzdG9tZXJzIGxlYXZpbmcuXG4gICAgICpcbiAgICAgKiBTbyBsb2NhbCBzZXJ2ZXMgYXJlIGNvdW50ZWQgaGVyZSBhbmQgcmVwb3J0ZWQgYWZ0ZXJ3YXJkcywgYmF0Y2hlZCwgb24gYSBwYXRoIHRoYXRcbiAgICAgKiBuZXZlciBibG9ja3MgcmVuZGVyaW5nOiBmbHVzaGVkIHdoZW4gdGhlIHBhZ2UgaXMgaGlkZGVuIChrZWVwYWxpdmUsIHNvIGl0IHN1cnZpdmVzXG4gICAgICogdGhlIHRhYiBjbG9zaW5nKSBhbmQgb3Bwb3J0dW5pc3RpY2FsbHkgd2hlbmV2ZXIgdGhlIFNESyBpcyB0YWxraW5nIHRvIHRoZSBzZXJ2ZXJcbiAgICAgKiBhbnl3YXkuIE5vdGhpbmcgaXMgc2VudCB3aGlsZSB0aGUgcGFnZSBpcyBsb2FkaW5nLCB3aGljaCBpcyB0aGUgcG9pbnQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9sb2NhbFNlcnZlcyA9IG5ldyBNYXA8c3RyaW5nLCB7ZW52OiBzdHJpbmc7IGNvdW50OiBudW1iZXJ9PigpO1xuICAgIHByaXZhdGUgX2ZsdXNoQm91bmQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgbm90ZUxvY2FsU2VydmUoY29tcG9uZW50SWQ6IHN0cmluZywgZW52OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY3VyID0gdGhpcy5fbG9jYWxTZXJ2ZXMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgICAgaWYgKGN1cikgY3VyLmNvdW50Kys7XG4gICAgICAgIGVsc2UgdGhpcy5fbG9jYWxTZXJ2ZXMuc2V0KGNvbXBvbmVudElkLCB7ZW52LCBjb3VudDogMX0pO1xuICAgICAgICB0aGlzLmJpbmRGbHVzaCgpO1xuICAgIH1cblxuICAgIC8qKiBSZXBvcnQgb24gcGFnZS1oaWRlLCB3aGljaCBpcyB0aGUgb25seSBldmVudCB0aGF0IHJlbGlhYmx5IGZpcmVzIG9uIG1vYmlsZS4gKi9cbiAgICBwcml2YXRlIGJpbmRGbHVzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZsdXNoQm91bmQgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgICAgICB0aGlzLl9mbHVzaEJvdW5kID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgb25IaWRlID0gKCkgPT4geyBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAnaGlkZGVuJykgdGhpcy5mbHVzaExvY2FsU2VydmVzKCk7IH07XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvbkhpZGUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCAoKSA9PiB0aGlzLmZsdXNoTG9jYWxTZXJ2ZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZCB3aGF0IHdlIGhhdmUuIGBrZWVwYWxpdmVgIGlzIHdoYXQgbWFrZXMgdGhpcyB3b3JrIGF0IHBhZ2UtaGlkZTogdGhlIHJlcXVlc3RcbiAgICAgKiBvdXRsaXZlcyB0aGUgZG9jdW1lbnQuIEZhaWx1cmUgaXMgaWdub3JlZCBcdTIwMTQgYSBsb3N0IHVzYWdlIHJlcG9ydCBtdXN0IG5ldmVyIGJlXG4gICAgICogdmlzaWJsZSB0byBhIHZpc2l0b3IsIGFuZCB0aGUgbmV4dCBwYWdlIGxvYWQgd2lsbCByZXBvcnQgaXRzIG93bi5cbiAgICAgKi9cbiAgICBmbHVzaExvY2FsU2VydmVzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2xvY2FsU2VydmVzLnNpemUpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBbLi4udGhpcy5fbG9jYWxTZXJ2ZXMuZW50cmllcygpXVxuICAgICAgICAgICAgLm1hcCgoW2lkLCB2XSkgPT4gYCR7aWR9OiR7di5lbnZ9OiR7di5jb3VudH1gKS5qb2luKCcsJyk7XG4gICAgICAgIHRoaXMuX2xvY2FsU2VydmVzLmNsZWFyKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmRlbGl2ZXJ5SG9zdCgpfS9jbGllbnRVc2FnZT9iPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhdGNoKX1gO1xuICAgICAgICAgICAgZmV0Y2godXJsLCB7a2VlcGFsaXZlOiB0cnVlLCBtb2RlOiAnY29ycycsIGNyZWRlbnRpYWxzOiAnb21pdCd9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBuZXZlciB0aGUgdmlzaXRvcidzIHByb2JsZW0gKi8gfVxuICAgIH1cblxuICAgIC8qKiBXaGVyZSAvY29uc3VtZSBzaG91bGQgYmUgZmV0Y2hlZCBmcm9tIHJpZ2h0IG5vdy4gKi9cbiAgICBwcml2YXRlIGRlbGl2ZXJ5SG9zdCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVsaXZlcnkuaG9zdCB8fCB0aGlzLl9iYXNlVXJsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgZGVsaXZlcnkgVVJMIHdpdGggT05FIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGhvc3QuXG4gICAgICpcbiAgICAgKiBUaGUgZmFsbGJhY2sgaXMgdGhlIGtpbGwgc3dpdGNoOiBicmVhayBvciBkaXNhYmxlIHRoZSBsYW5lIGFuZCBldmVyeSBjbGllbnQgZHJpZnRzXG4gICAgICogYmFjayB0byBjbG91ZC5teW9wLmRldiBvbiBpdHMgb3duLCB3aXRoIG5vIGN1c3RvbWVyIGRlcGxveS4gSXQgbXVzdCB0aGVyZWZvcmUgYmVcbiAgICAgKiBnZW51aW5lbHkgc2lsZW50IHRvIHRoZSBwYWdlIGFuZCBnZW51aW5lbHkgTE9VRCBpbiBzdGF0cygpIFx1MjAxNCBhIGZhbGxiYWNrIHRoYXQgbm9ib2R5XG4gICAgICogY291bnRzIGlzIGFuIG91dGFnZSBub2JvZHkgbm90aWNlcy5cbiAgICAgKlxuICAgICAqIE9ubHkgdHJhbnNwb3J0IGZhaWx1cmVzIGFuZCA1eHggZmFsbCBiYWNrLiBBIDQwNCBpcyBhbiBhbnN3ZXI6IHRoZSBjb21wb25lbnQgcmVhbGx5XG4gICAgICogaXMgbWlzc2luZywgYW5kIHJldHJ5aW5nIGVsc2V3aGVyZSB3b3VsZCBvbmx5IGhpZGUgaXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBkZWxpdmVyeUZldGNoKHBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICAgICAgLy8gV2UgYXJlIGFib3V0IHRvIHVzZSB0aGUgbmV0d29yayBhbnl3YXk6IGEgZ29vZCBtb21lbnQgdG8gaGFuZCBvdmVyIHdoYXRldmVyIHRoZVxuICAgICAgICAvLyB3aW5kb3cgc2VydmVkIG9mZmxpbmUsIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSBwYWdlIHRvIGJlIGNsb3NlZC5cbiAgICAgICAgaWYgKHRoaXMuX2xvY2FsU2VydmVzLnNpemUpIHRoaXMuZmx1c2hMb2NhbFNlcnZlcygpO1xuICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5kZWxpdmVyeUhvc3QoKTtcbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGAke2hvc3R9JHtwYXRofWA7XG4gICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMucmVxdWVzdHMrKztcbiAgICAgICAgY29uc3QgdXNpbmdMYW5lID0gaG9zdCAhPT0gdGhpcy5fYmFzZVVybDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHByaW1hcnkpO1xuICAgICAgICAgICAgaWYgKHJlcy5vayB8fCByZXMuc3RhdHVzIDwgNTAwIHx8ICF1c2luZ0xhbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAodXNpbmdMYW5lICYmIHJlcy5vaykgdGhpcy5fZGVsaXZlcnlTdGF0cy52aWFEZWxpdmVyeSsrO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmxhc3RFcnJvciA9IGBIVFRQICR7cmVzLnN0YXR1c30gZnJvbSAke2hvc3R9YDtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoIXVzaW5nTGFuZSkgdGhyb3cgZTtcbiAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMubGFzdEVycm9yID0gU3RyaW5nKGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5mZWxsQmFjaysrO1xuICAgICAgICBjb25zb2xlLndhcm4oYFtteW9wXSBkZWxpdmVyeSBob3N0IGZhaWxlZCAoJHt0aGlzLl9kZWxpdmVyeVN0YXRzLmxhc3RFcnJvcn0pIFx1MjAxNCBmYWxsaW5nIGJhY2sgdG8gJHt0aGlzLl9iYXNlVXJsfWApO1xuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2goYCR7dGhpcy5fYmFzZVVybH0ke3BhdGh9YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIHN0YXRpYyBtb2RlIGZvciBzZWxmLWhvc3RlZCBjb21wb25lbnQgcmVnaXN0cmllcy5cbiAgICAgKiBJbiBzdGF0aWMgbW9kZSwgVVJMcyBhcmUgY29uc3RydWN0ZWQgYXMgZmlsZSBwYXRocyBpbnN0ZWFkIG9mIHF1ZXJ5IHBhcmFtczpcbiAgICAgKiAgICR7YmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2Vudn0uanNvblxuICAgICAqL1xuICAgIGVuYWJsZVN0YXRpY01vZGUoKSB7XG4gICAgICAgIHRoaXMuX3N0YXRpY01vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byBhbGwgZmV0Y2ggVVJMcyAoZS5nLiBmb3IgQ0ROIGNhY2hlIGJ1c3RpbmcpLlxuICAgICAqIEV4YW1wbGU6IGBzZXRRdWVyeVBhcmFtcyh7IGxhc3R1cGRhdGU6ICcxMTExMjAyNicgfSlgXG4gICAgICovXG4gICAgc2V0UXVlcnlQYXJhbXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1zID0gcGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBmb3IgdGhpcyBDbG91ZFJlcG9zaXRvcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXRFbnZpcm9ubWVudChlbnY6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kZWZhdWx0RW52ID0gZW52O1xuICAgICAgICB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBlbnZpcm9ubWVudFxuICAgICAqL1xuICAgIGdldERlZmF1bHRFbnZpcm9ubWVudCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEVudjtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gVjIgTWV0aG9kcyAoRGVmYXVsdCkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGNvbXBvbmVudCBpcyBhbHJlYWR5IGNhY2hlZC9wcmVsb2FkZWQgKHYyKVxuICAgICAqIElmIGVudiBhbmQgcHJldmlldyBhcmUgbm90IHByb3ZpZGVkLCBjaGVja3MgaWYgQU5ZIHZlcnNpb24gaXMgcHJlbG9hZGVkXG4gICAgICovXG4gICAgaXNQcmVsb2FkZWQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICAvLyBJZiBzcGVjaWZpYyBlbnYvcHJldmlldyByZXF1ZXN0ZWQsIGNoZWNrIGV4YWN0IG1hdGNoXG4gICAgICAgIGlmIChlbnYgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7ZW52IHx8IHRoaXMuX2RlZmF1bHRFbnZ9OiR7cHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGNoZWNrIGlmIGFueSB2ZXJzaW9uIHdhcyBwcmVsb2FkZWRcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudElkIGluIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHByZWxvYWRlZCBwYXJhbXMgZm9yIGEgY29tcG9uZW50IChpZiBwcmVsb2FkZWQpXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IHByZWxvYWRlZFxuICAgICAqL1xuICAgIGdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZDogc3RyaW5nKTogeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBhIGNvbXBvbmVudCBjb25maWc6IGZldGNoIGl0IG9uY2UsIHRoZW4gc2VydmUgaXQgZnJvbSB0aGlzXG4gICAgICogcmVwb3NpdG9yeSdzIGNhY2hlLlxuICAgICAqXG4gICAgICogVGhpcyBpcyB0aGUgbmFtZSB0byB1c2UuIGBmZXRjaENvbXBvbmVudFYyYCBpcyB0aGUgc2FtZSBtZXRob2QgdW5kZXIgaXRzXG4gICAgICogdmVyc2lvbmVkIG5hbWUgYW5kIHN0YXlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IFx1MjAxNCBub3RlIHRoYXQgdGhlXG4gICAgICogdW52ZXJzaW9uZWQgYGZldGNoQ29tcG9uZW50YCBpcyBhICpkZXByZWNhdGVkIHYxKiBBUEkgYW5kIGlzIE5PVCB0aGlzLlxuICAgICAqXG4gICAgICogQ29tcGxldGVzIHRoZSB0cmlvIHdpdGgge0BsaW5rIGdldFJlc29sdmVkQ29uZmlnfSAoc3luY2hyb25vdXMgcmVhZCBvZiBhblxuICAgICAqIGFscmVhZHktcmVzb2x2ZWQgY29uZmlnKSBhbmQge0BsaW5rIGh5ZHJhdGVDb21wb25lbnR9IChzZWVkIG9uZSB5b3VcbiAgICAgKiBhbHJlYWR5IGhvbGQpLlxuICAgICAqXG4gICAgICogUHJlZmVyIHRoZSBtb2R1bGUtbGV2ZWwgYHByZWxvYWRDb21wb25lbnRzKFtpZF0pYCBpbiBhcHAgY29kZTsgcmVhY2ggZm9yXG4gICAgICogdGhpcyB3aGVuIHlvdSBuZWVkIGFuIGlzb2xhdGVkIHJlcG9zaXRvcnkgaW5zdGFuY2Ugd2hvc2UgY2FjaGUgbGlmZXRpbWVcbiAgICAgKiB5b3UgY29udHJvbCBcdTIwMTQgYSBzZXJ2ZXIgd2l0aCBpdHMgb3duIFRUTCwgZm9yIGV4YW1wbGUuXG4gICAgICovXG4gICAgYXN5bmMgcmVzb2x2ZUNvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MiBjb21wb25lbnQgY29uZmlnXG4gICAgICogSWYgZW52L3ByZXZpZXcgbm90IHNwZWNpZmllZCBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZXMgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAqXG4gICAgICogQHNlZSByZXNvbHZlQ29tcG9uZW50IFx1MjAxNCB0aGUgdW52ZXJzaW9uZWQgbmFtZSBmb3IgdGhpcyBtZXRob2RcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudmlyb25tZW50SWRlbnRpZmllcj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBQcm9taXNlPElDb21wb25lbnRDb25maWc+IHtcbiAgICAgICAgY29uc3QgeyBlbnYsIHVzZVByZXZpZXcsIGNhY2hlS2V5IH0gPSB0aGlzLnJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQsIGVudmlyb25tZW50SWRlbnRpZmllciwgcHJldmlldyk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ1tDbG91ZFJlcG9zaXRvcnldIGZldGNoQ29tcG9uZW50VjInLCB7XG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29tcG9uZW50SWQuc2xpY2UoMCwgOCkgKyAnLi4uJyxcbiAgICAgICAgICAgIGVudixcbiAgICAgICAgICAgIHVzZVByZXZpZXcsXG4gICAgICAgICAgICBjYWNoZUtleSxcbiAgICAgICAgICAgIGNhY2hlZDogY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50c1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHNbY2FjaGVLZXldKSB7XG4gICAgICAgICAgICAvLyBUcmFjayB0aGlzIGFzIHByZWxvYWRlZCAoZmlyc3QgZmV0Y2ggY291bnRzIGFzIHByZWxvYWQpXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdID0geyBlbnYsIHByZXZpZXc6IHVzZVByZXZpZXcgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHNbY2FjaGVLZXldID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRpY01vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gdXNlUHJldmlldyA/ICdwcmV2aWV3JyA6IGVudjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZmlsZX0uanNvbmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMuX3F1ZXJ5UGFyYW1zKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxcykgdXJsICs9IGA/JHtxc31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBgL2NvbnN1bWU/aWQ9JHtjb21wb25lbnRJZH0mZW52PSR7ZW52fWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmcHJldmlldz10cnVlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBwcmV2aWV3IGlzIG5ldmVyIG1pbmlmaWVkOiB0aGUgYXJ0aWZhY3QgaXMgYnVpbHQgZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlZCB2YXJpYW50LCBhbmQgYW4gYXV0aG9yIG11c3Qgc2VlIHRoZWlyIG93biBlZGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kZWxpdmVyeS5taW5pZnkgJiYgIXVzZVByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmb3B0PW1pbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtLS0tIHRoZSBjbGllbnQgd2luZG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcHJldmlldyBpcyBuZXZlciBoZWxkOiBhbiBhdXRob3IgaGFzIHRvIHNlZSB0aGVpciBvd24gZWRpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlYWJsZSA9IHRoaXMuX2RlbGl2ZXJ5LmNhY2hlICYmICF0aGlzLl9zdGF0aWNNb2RlICYmICF1c2VQcmV2aWV3O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvcmVLZXkgPSBjYWNoZWFibGUgPyBkZWxpdmVyeVN0b3JlLmtleShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGl2ZXJ5SG9zdCgpLCBjb21wb25lbnRJZCwgZW52LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVByZXZpZXcsIHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSA/ICdtaW4nIDogJ3JhdycpIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVsZCA9IGNhY2hlYWJsZSA/IGF3YWl0IGRlbGl2ZXJ5U3RvcmUuZ2V0KHN0b3JlS2V5KSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWxkICYmIGRlbGl2ZXJ5U3RvcmUuZnJlc2goaGVsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNpZGUgdGhlIHdpbmRvdzogbm8gcmVxdWVzdCBhdCBhbGwuIENvdW50ZWQgbG9jYWxseSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBsYXRlciwgb3IgdGhpcyB2aXNpdCBpcyBpbnZpc2libGUgdG8gdGhlIGxlZGdlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmZyb21TdG9yYWdlKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RlTG9jYWxTZXJ2ZShjb21wb25lbnRJZCwgZW52KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGhlbGQuY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaGVsZC5jb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlbGQgJiYgaGVsZC50YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd2luZG93IGVuZGVkLiBTZW5kIGJhY2sgdGhlIHZlcnNpb24gd2UgaG9sZCByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWRvd25sb2FkaW5nOiB0aGUgYW5zd2VyIGlzIHVzdWFsbHkgYSBmZXcgaHVuZHJlZCBieXRlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSB0aGUgYGlkcz1gL2BoYXZlPWAgcm91dGUgYW5kIE5PVCBJZi1Ob25lLU1hdGNoOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVxdWVzdCBoZWFkZXIgdHJpZ2dlcnMgYSBDT1JTIHByZWZsaWdodCwgdGhlcmUgaXMgbm8gT1BUSU9OU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdXRlLCBhbmQgaXQgZmFpbHMgaW4gYSBicm93c2VyIHdoaWxlIHdvcmtpbmcgcGVyZmVjdGx5IGluIGN1cmwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZhbGlkYXRvciB0cmF2ZWxzIGluIHRoZSBxdWVyeSBzdHJpbmcsIHNvIGl0IGlzIGEgcGxhaW4gR0VULlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrVXJsID0gYC9jb25zdW1lP2lkcz0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZ9YCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLl9kZWxpdmVyeS5taW5pZnkgPyAnJm9wdD1taW4nIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCZoYXZlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGhlbGQudGFnKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMucmV2YWxpZGF0aW9ucysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrID0gYXdhaXQgdGhpcy5kZWxpdmVyeUZldGNoKGNoZWNrVXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgY2hlY2suanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChib2R5LnVuY2hhbmdlZCB8fCBbXSkuaW5jbHVkZXMoY29tcG9uZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy51bmNoYW5nZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmJ5dGVzU2F2ZWQgKz0gQ2xvdWRSZXBvc2l0b3J5LnNpemVPZkhlbGQoaGVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVsZC5zdG9yZWRBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVsZC53aW5kb3dNcyA9IGRlbGl2ZXJ5U3RvcmUud2luZG93RnJvbShjaGVjay5oZWFkZXJzKSB8fCBoZWxkLndpbmRvd01zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGl2ZXJ5U3RvcmUucHV0KGhlbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gaGVsZC5jb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShoZWxkLmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgY2hhbmdlZC4gVGhlIGFuc3dlciBhbHJlYWR5IGNhcnJpZXMgdGhlIG5ldyBieXRlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSAoYm9keS5pdGVtcyB8fCBbXSlbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNmZyA9IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyhpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmZyb21OZXR3b3JrKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5wdXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0b3JlS2V5LCBjb25maWc6IGNmZywgdGFnOiBpdGVtLnRhZyB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93TXM6IGRlbGl2ZXJ5U3RvcmUud2luZG93RnJvbShjaGVjay5oZWFkZXJzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdDogdGhpcy5kZWxpdmVyeUhvc3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBjZmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjZmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGZhaWxlZCByZS1jaGVjayBtdXN0IG5vdCBmYWlsIHRoZSBwYWdlOiBmYWxsIHRocm91Z2ggdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yZGluYXJ5IGZldGNoIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5fc3RhdGljTW9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXdhaXQgZmV0Y2godXJsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXdhaXQgdGhpcy5kZWxpdmVyeUZldGNoKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIGNvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgKCR7cmVzLnN0YXR1c30ke3RoaXMuX3N0YXRpY01vZGUgPyBgIGZyb20gJHt1cmx9YCA6ICcnfSlgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYW50ID0ganNvbi5pdGVtO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiIG5vdCBmb3VuZGApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQgfHwgIXZhcmlhbnQuY29uc3VtZV92YXJpYW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgaGFzIG5vIGltcGxlbWVudGF0aW9uIGZvciBlbnZpcm9ubWVudCBcIiR7ZW52fVwiYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q29uZmlnID0gY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnKHZhcmlhbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5mcm9tTmV0d29yaysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvbGQgaXQgZm9yIGV4YWN0bHkgYXMgbG9uZyBhcyB0aGUgc2VydmVyIHNhaWQsIG1pbnVzIHdoYXQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENETiBhbHJlYWR5IHNwZW50IChkZWxpdmVyeVN0b3JlLndpbmRvd0Zyb20pLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGl2ZXJ5U3RvcmUucHV0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBzdG9yZUtleSwgY29uZmlnOiBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogKHZhcmlhbnQgYXMgYW55KS50YWcgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd01zOiBkZWxpdmVyeVN0b3JlLndpbmRvd0Zyb20ocmVzLmhlYWRlcnMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0OiB0aGlzLmRlbGl2ZXJ5SG9zdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhZyB0aGUgUHJvbWlzZSBzbyBnZXRSZXNvbHZlZENvbmZpZyBjYW4gcmVhZCBpdCBzeW5jaHJvbm91c2x5XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGNvbXBvbmVudENvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGNhY2hlZCByZWplY3RlZCBwcm9taXNlIHNvIHRoZSBuZXh0IGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2VzIGEgZnJlc2ggcmVxdWVzdCAoZS5nLiBhZnRlciBuZXR3b3JrIHJlY292ZXJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudmFyaWFudHNbY2FjaGVLZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91cyB2ZXJzaW9uIG9mIGZldGNoQ29tcG9uZW50VjIgXHUyMDE0IHJldHVybnMgdGhlIGNvbmZpZyBvbmx5IGlmXG4gICAgICogdGhlIGZldGNoIGFscmVhZHkgY29tcGxldGVkLCBudWxsIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIFVzZXMgdGhlIHNhbWUgYHRoaXMudmFyaWFudHNgIGNhY2hlIHRoYXQgZmV0Y2hDb21wb25lbnRWMi9wcmVsb2FkQ29tcG9uZW50c1xuICAgICAqIHBvcHVsYXRlLiBFYWNoIGNhY2hlZCBQcm9taXNlIGlzIHRhZ2dlZCB3aXRoIGEgYC5yZXNvbHZlZGAgcHJvcGVydHkgd2hlblxuICAgICAqIGl0IHNldHRsZXMgXHUyMDE0IHRoaXMgbWV0aG9kIGp1c3QgcmVhZHMgdGhhdCBwcm9wZXJ0eS4gTm8gc2VwYXJhdGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBXaHkgdGhpcyBleGlzdHM6IFJlYWN0IE5hdGl2ZSBuZWVkcyB0aGUgY29uZmlnIGF0IHJlbmRlciB0aW1lIHRvIGVtYmVkIGl0XG4gICAgICogaW4gdGhlIFdlYlZpZXcgSFRNTCAoY2FuJ3QgYXdhaXQgaW4gdXNlU3RhdGUpLiBJZiBwcmVsb2FkQ29tcG9uZW50cyByYW5cbiAgICAgKiBlYXJsaWVyIGFuZCB0aGUgZmV0Y2ggY29tcGxldGVkLCB0aGlzIHJldHVybnMgdGhlIHJlc3VsdCBzeW5jaHJvbm91c2x5LFxuICAgICAqIHNraXBwaW5nIHRoZSBXRUJWSUVXX1JFQURZIFx1MjE5MiBmZXRjaCBcdTIxOTIgaW5qZWN0IHJvdW5kIHRyaXAgZW50aXJlbHkuXG4gICAgICovXG4gICAgZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IElDb21wb25lbnRDb25maWcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgeyBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuICAgICAgICByZXR1cm4gdGhpcy52YXJpYW50c1tjYWNoZUtleV0/LnJlc29sdmVkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSB3aGljaCAoZW52LCBwcmV2aWV3KSBwYWlyIFx1MjAxNCBhbmQgdGhlcmVmb3JlIHdoaWNoIGNhY2hlIGtleSBcdTIwMTQgYSBjYWxsXG4gICAgICogZm9yIGBjb21wb25lbnRJZGAgcmVmZXJzIHRvLlxuICAgICAqXG4gICAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZmV0Y2hDb21wb25lbnRWMiwgZ2V0UmVzb2x2ZWRDb25maWcgYW5kXG4gICAgICogaHlkcmF0ZUNvbXBvbmVudCwgc28gYSBoeWRyYXRlZCBjb25maWcgYWx3YXlzIGxhbmRzIG9uIHRoZSBrZXkgYSBsYXRlclxuICAgICAqIGZldGNoIHdpbGwgbG9vayB1bmRlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikge1xuICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBlbnYvcHJldmlldyBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgIGNvbnN0IHByZWxvYWRlZCA9IHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UGFyYW1zID0gZW52aXJvbm1lbnRJZGVudGlmaWVyICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBlbnY6IHN0cmluZztcbiAgICAgICAgbGV0IHVzZVByZXZpZXc6IGJvb2xlYW47XG5cbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdFBhcmFtcyAmJiBwcmVsb2FkZWQpIHtcbiAgICAgICAgICAgIC8vIFVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgICAgICBlbnYgPSBwcmVsb2FkZWQuZW52O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZWxvYWRlZC5wcmV2aWV3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXNlIHByb3ZpZGVkIHBhcmFtcyBvciBkZWZhdWx0c1xuICAgICAgICAgICAgZW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgdHJ1ZSBcdTIxOTIgdHJ1ZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyBleHBsaWNpdGx5IGZhbHNlIFx1MjE5MiBmYWxzZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyB1bmRlZmluZWQ6IGVudiB3YXMgc3BlY2lmaWVkICh2aWEgcGFyYW0gb3Igc2V0RW52aXJvbm1lbnQpIFx1MjE5MiBmYWxzZSwgb3RoZXJ3aXNlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICBjb25zdCBoYXNFZmZlY3RpdmVFbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZW52RXhwbGljaXRseVNldDtcbiAgICAgICAgICAgIHVzZVByZXZpZXcgPSBwcmV2aWV3ID09PSB0cnVlID8gdHJ1ZSA6IChwcmV2aWV3ID09PSBmYWxzZSA/IGZhbHNlIDogIWhhc0VmZmVjdGl2ZUVudik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBlbnYsIHVzZVByZXZpZXcsIGNhY2hlS2V5OiBgJHtjb21wb25lbnRJZH06JHtlbnZ9OiR7dXNlUHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlZCBhbiBhbHJlYWR5LXJlc29sdmVkIGNvbXBvbmVudCBjb25maWcgaW50byB0aGUgY2FjaGUsIHdpdGhvdXQgYW55XG4gICAgICogbmV0d29yayByZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0IHRvIHtAbGluayBmZXRjaENvbXBvbmVudFYyfTogdXNlIGl0IHdoZW4gdGhlIGNvbmZpZyB3YXNcbiAgICAgKiByZXNvbHZlZCBzb21ld2hlcmUgZWxzZSBcdTIwMTQgbW9zdCBvZnRlbiBvbiBhIHNlcnZlciwgdGhlbiBlbWJlZGRlZCBpbiB0aGVcbiAgICAgKiBwYWdlIFx1MjAxNCBzbyB0aGUgYnJvd3NlciBjYW4gcmVuZGVyIHRoZSBjb21wb25lbnQgd2l0aCBubyByb3VuZCB0cmlwLlxuICAgICAqXG4gICAgICogQWZ0ZXIgaHlkcmF0aW5nLCBgZmV0Y2hDb21wb25lbnRWMmAsIGBnZXRSZXNvbHZlZENvbmZpZ2AgYW5kIGBpc1ByZWxvYWRlZGBcbiAgICAgKiBhbGwgYW5zd2VyIGZvciB0aGlzIGNvbXBvbmVudCBmcm9tIG1lbW9yeS5cbiAgICAgKlxuICAgICAqIFBhc3MgdGhlIHNhbWUgYGVudmAgLyBgcHJldmlld2AgdGhlIGNvbmZpZyB3YXMgcmVzb2x2ZWQgd2l0aDsgdGhlIGRlZmF1bHRzXG4gICAgICogbWF0Y2ggd2hhdCBhIHBsYWluIGBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkKWAgd291bGQgaGF2ZSB1c2VkLlxuICAgICAqL1xuICAgIGh5ZHJhdGVDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgY29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZW52OiByZXNvbHZlZEVudiwgdXNlUHJldmlldywgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcblxuICAgICAgICBjb25zdCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZykgYXMgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH07XG4gICAgICAgIC8vIFRhZyBpdCB0aGUgc2FtZSB3YXkgZmV0Y2hDb21wb25lbnRWMiBkb2VzLCBzbyBnZXRSZXNvbHZlZENvbmZpZyBjYW5cbiAgICAgICAgLy8gcmVhZCBpdCBzeW5jaHJvbm91c2x5LlxuICAgICAgICBwcm9taXNlLnJlc29sdmVkID0gY29uZmlnO1xuXG4gICAgICAgIHRoaXMudmFyaWFudHNbY2FjaGVLZXldID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52OiByZXNvbHZlZEVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMSBNZXRob2RzIChMZWdhY3kpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MSBjb21wb25lbnQgZnJvbSBhIGZsb3dcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoZmxvd0lkKSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tmbG93SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbZmxvd0lkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hDb21wb25lbnRWMiBvciBmZXRjaENvbXBvbmVudFYxIGV4cGxpY2l0bHlcbiAgICAgKiBEZWZhdWx0cyB0byB2MSBiZWhhdmlvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZCwgZmxvd0lkKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENsb3VkUmVwb3NpdG9yeSBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBjb25zdCB2Ml9DbG91ZFJlcG9zaXRvcnkgPSBDbG91ZFJlcG9zaXRvcnk7XG4iLCAiaW1wb3J0IHsgQ2xvdWRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJQ29tcG9uZW50Q29uZmlnIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5sZXQgX2Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeS5NYWluO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xvdWRSZXBvc2l0b3J5ID0gKCkgPT4gX2Nsb3VkUmVwb3NpdG9yeTtcblxuZXhwb3J0IGNvbnN0IGlzUHJlbG9hZGVkID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5pc1ByZWxvYWRlZChjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQcmVsb2FkZWRQYXJhbXMgPSAoY29tcG9uZW50SWQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZW5hYmxlTG9jYWxEZXYgPSAoKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoXCJodHRwOi8vbG9jYWxob3N0OjkyOTJcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5VXJsID0gKHVybDogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkodXJsKTtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIHRoZSBTREsgdG8gZmV0Y2ggY29tcG9uZW50cyBmcm9tIGEgc2VsZi1ob3N0ZWQgc3RhdGljIHJlZ2lzdHJ5IChTMywgQ0ROLCBldGMuKVxuICogaW5zdGVhZCBvZiB0aGUgTXlvcCBjbG91ZC4gQ29tcG9uZW50cyBhcmUgc2VydmVkIGFzIHN0YXRpYyBKU09OIGZpbGVzOlxuICogICBgJHtjZG5Vcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtlbnZpcm9ubWVudH0uanNvbmBcbiAqL1xuZXhwb3J0IGNvbnN0IGVuYWJsZVNlbGZIb3N0ZWQgPSAoY2RuVXJsOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KGNkblVybCk7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeS5lbmFibGVTdGF0aWNNb2RlKCk7XG4gICAgaWYgKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0UXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpO1xuICAgIH1cbn07XG5cbi8qKlxuICogVEhFIE9QVC1JTi4gT25lIGNhbGwsIGFuZCBub3RoaW5nIGNoYW5nZXMgZm9yIGFueW9uZSB3aG8gZG9lcyBub3QgbWFrZSBpdC5cbiAqXG4gKiAgIG15b3AuZGVsaXZlcnkoeyBtaW5pZnk6IHRydWUgfSk7XG4gKlxuICogT3B0aW5nIGluIElTIGNob29zaW5nIHRoZSBkZWxpdmVyeSBsYW5lOiBhIHNlY29uZCwgY29tcGxldGUgTXlvcCBzdGFjayAoaXRzIG93biBzZXJ2ZXJcbiAqIGFuZCBDRE4pIHJlYWRpbmcgdGhlIHNhbWUgY29tcG9uZW50IGRhdGEuIFNvIHRoaXMgY2FsbCBkb2VzIHR3byB0aGluZ3MgYXQgb25jZSBcdTIwMTQgaXRcbiAqIHBvaW50cyBgL2NvbnN1bWVgIGF0IHRoYXQgc3RhY2sgYW5kIGFza3MgaXQgZm9yIHRoZSBtaW5pZmllZCBhcnRpZmFjdCBcdTIwMTQgd2hpY2ggaXMgd2h5XG4gKiB0dXJuaW5nIHRoZSBmZWF0dXJlIG9mZiBpcyBhIGNvbmZpZyB2YWx1ZSBvbiBvdXIgc2lkZSBvciBvbmUgbGluZSBvbiB5b3VycywgYW5kIG5ldmVyXG4gKiBhIEROUyBjaGFuZ2UuXG4gKlxuICogU2FmZXR5IHByb3BlcnRpZXMsIGFsbCBkZWxpYmVyYXRlOlxuICogICAtIElmIHRoZSBsYW5lIGZhaWxzICh0cmFuc3BvcnQgZXJyb3Igb3IgNXh4KSwgdGhlIFNESyByZXRyaWVzIE9OQ0UgYWdhaW5zdFxuICogICAgIGNsb3VkLm15b3AuZGV2IGFuZCB0aGUgcGFnZSByZW5kZXJzIGFueXdheS4gYGRlbGl2ZXJ5LnN0YXRzKCkuZmVsbEJhY2tgIGNvdW50cyBpdC5cbiAqICAgLSBgY2FjaGU6IHRydWVgIGFkZHMgdGhlIGNsaWVudCB3aW5kb3c6IGEgY29tcG9uZW50IHRoaXMgYnJvd3NlciBhbHJlYWR5IGhvbGRzLCBzdGlsbFxuICogICAgIGluc2lkZSB0aGUgZnJlc2huZXNzIHRoZSBzZXJ2ZXIgcHJvbWlzZWQsIGlzIHJlbmRlcmVkIHdpdGggTk8gcmVxdWVzdC4gT25jZSB0aGVcbiAqICAgICB3aW5kb3cgZW5kcyB0aGUgYnJvd3NlciBzZW5kcyBiYWNrIHRoZSB2ZXJzaW9uIGl0IGhvbGRzIGluc3RlYWQgb2YgcmUtZG93bmxvYWRpbmcuXG4gKiAgIC0gQSBwcmV2aWV3IGlzIG5ldmVyIG1pbmlmaWVkIGFuZCBuZXZlciBjYWNoZWQuXG4gKiAgIC0gT25seSAvY29uc3VtZSBtb3Zlcy4gRXZlcnl0aGluZyBlbHNlIGtlZXBzIHRoZSBob3N0IGl0IGhhcyB0b2RheS5cbiAqICAgLSBBc2tpbmcgZm9yIGBtaW5pZnlgIGRvZXMgbm90IGZvcmNlIGl0OiB0aGUgc2VydmVyIGRlY2lkZXMgcGVyIGNvbXBvbmVudCwgYW5kIGFcbiAqICAgICBjb21wb25lbnQgdGhhdCBpcyBub3QgZW5hYmxlZCBpcyBzZXJ2ZWQgcmF3LCB3aGljaCBpcyBub3QgYW4gZXJyb3IuXG4gKlxuICogYGhvc3RgIGlzIGZvciB1cyAoYSBzdGFnaW5nIGxhbmUsIGEgbG9jYWwgc2VydmVyKTsgbGVhdmUgaXQgb3V0LlxuICovXG5leHBvcnQgY29uc3QgREVMSVZFUllfSE9TVCA9ICdodHRwczovL2RlbGl2ZXJ5Lm15b3AuZGV2JztcblxuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5ID0gKG9wdHM6IHsgbWluaWZ5PzogYm9vbGVhbjsgY2FjaGU/OiBib29sZWFuOyBob3N0Pzogc3RyaW5nIHwgbnVsbCB9ID0ge30pID0+IHtcbiAgICBjb25zdCB3YW50c0xhbmUgPSBvcHRzLm1pbmlmeSAhPT0gZmFsc2UgfHwgb3B0cy5jYWNoZSA9PT0gdHJ1ZTtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldERlbGl2ZXJ5KHtcbiAgICAgICAgbWluaWZ5OiBvcHRzLm1pbmlmeSA/PyBmYWxzZSxcbiAgICAgICAgY2FjaGU6IG9wdHMuY2FjaGUgPz8gZmFsc2UsXG4gICAgICAgIGhvc3Q6IG9wdHMuaG9zdCAhPT0gdW5kZWZpbmVkID8gb3B0cy5ob3N0IDogKHdhbnRzTGFuZSA/IERFTElWRVJZX0hPU1QgOiBudWxsKSxcbiAgICB9KTtcbiAgICByZXR1cm4gZGVsaXZlcnlTdGF0cygpO1xufTtcblxuLyoqXG4gKiBGb3JnZXQgd2hhdCB0aGlzIGJyb3dzZXIgaG9sZHMsIHNvIHRoZSBuZXh0IGxvYWQgYXNrcyB0aGUgc2VydmVyLiBVc2UgaXQgd2hlbiBhIGNoYW5nZVxuICogaGFzIHRvIGJlIHZpc2libGUgb24gVEhJUyBsb2FkIFx1MjAxNCByaWdodCBhZnRlciBzb21lb25lIHB1Ymxpc2hlcyBcdTIwMTQgcmF0aGVyIHRoYW4gd2l0aGluIHRoZVxuICogZnJlc2huZXNzIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5UmVmcmVzaCA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBfY2xvdWRSZXBvc2l0b3J5LnJlZnJlc2hEZWxpdmVyeSgpO1xuICAgIHJldHVybiBkZWxpdmVyeVN0YXRzKCk7XG59O1xuXG4vKipcbiAqIFdoYXQgYW5zd2VyZWQgdGhlIGxhc3QgcmVxdWVzdHMsIGFuZCBcdTIwMTQgdGhlIG51bWJlciB3b3J0aCB3YXRjaGluZyBcdTIwMTQgaG93IG1hbnkgdGltZXMgdGhlXG4gKiBTREsgaGFkIHRvIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBob3N0IGJlY2F1c2UgdGhlIGxhbmUgZGlkIG5vdCBhbnN3ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWxpdmVyeVN0YXRzID0gKCkgPT4gX2Nsb3VkUmVwb3NpdG9yeS5kZWxpdmVyeVN0YXRzKCk7XG5cbi8qKiBVbmRvIGRlbGl2ZXJ5KCk6IGJhY2sgdG8gdGhlIGRlZmF1bHQgaG9zdCBhbmQgcmF3IGJ5dGVzLCB3aXRoIG5vIHJlbG9hZC4gKi9cbmV4cG9ydCBjb25zdCBkZWxpdmVyeU9mZiA9ICgpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldERlbGl2ZXJ5KHsgbWluaWZ5OiBmYWxzZSwgY2FjaGU6IGZhbHNlLCBob3N0OiBudWxsIH0pO1xuICAgIHJldHVybiBkZWxpdmVyeVN0YXRzKCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5ID0gKHJlcG9zaXRvcnk6IENsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSByZXBvc2l0b3J5O1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEVudmlyb25tZW50ID0gKGVudjogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeS5zZXRFbnZpcm9ubWVudChlbnYpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlc29sdmVkQ29uZmlnID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5nZXRSZXNvbHZlZENvbmZpZyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcmVsb2FkQ29tcG9uZW50cyA9IGFzeW5jIChpZHM6IHN0cmluZ1tdLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSA9PiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgaWRzLm1hcCgoaWQpID0+IF9jbG91ZFJlcG9zaXRvcnkuZmV0Y2hDb21wb25lbnRWMihpZCwgZW52LCBwcmV2aWV3KSksXG4gICAgKTtcbn07XG5cbi8qKlxuICogU2VlZCBhbHJlYWR5LXJlc29sdmVkIGNvbXBvbmVudCBjb25maWdzIGludG8gdGhlIFNESyBjYWNoZSwgd2l0aCBubyBuZXR3b3JrXG4gKiByZXF1ZXN0LiBUaGUgY291bnRlcnBhcnQgdG8ge0BsaW5rIHByZWxvYWRDb21wb25lbnRzfS5cbiAqXG4gKiBVc2UgaXQgd2hlbiB0aGUgY29uZmlncyB3ZXJlIHJlc29sdmVkIHNvbWV3aGVyZSBlbHNlIFx1MjAxNCB0eXBpY2FsbHkgb24gYSBzZXJ2ZXJcbiAqIGFuZCBlbWJlZGRlZCBpbiB0aGUgcGFnZSBcdTIwMTQgc28gdGhlIGNvbXBvbmVudCByZW5kZXJzIHdpdGggemVybyByb3VuZCB0cmlwczpcbiAqXG4gKiBgYGB0c1xuICogLy8gc2VydmVyOiBjb25zdCBjb25maWdzID0geyBbaWRdOiBhd2FpdCBuZXcgQ2xvdWRSZXBvc2l0b3J5KCkuZmV0Y2hDb21wb25lbnRWMihpZCkgfVxuICogLy8gY2xpZW50OlxuICogaHlkcmF0ZUNvbXBvbmVudHMoY29uZmlncyk7XG4gKiAvLyA8TXlvcENvbXBvbmVudCBjb21wb25lbnRJZD17aWR9IC8+IG5vdyByZW5kZXJzIHdpdGhvdXQgZmV0Y2hpbmdcbiAqIGBgYFxuICpcbiAqIFBhc3MgdGhlIHNhbWUgYGVudmAgLyBgcHJldmlld2AgdGhlIGNvbmZpZ3Mgd2VyZSByZXNvbHZlZCB3aXRoOyB0aGUgZGVmYXVsdHNcbiAqIG1hdGNoIHdoYXQgYSBwbGFpbiBgcHJlbG9hZENvbXBvbmVudHMoW2lkXSlgIHdvdWxkIGhhdmUgdXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGh5ZHJhdGVDb21wb25lbnRzID0gKFxuICAgIGNvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIElDb21wb25lbnRDb25maWc+LFxuICAgIGVudj86IHN0cmluZyxcbiAgICBwcmV2aWV3PzogYm9vbGVhbixcbikgPT4ge1xuICAgIGZvciAoY29uc3QgW2lkLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ3MpKSB7XG4gICAgICAgIF9jbG91ZFJlcG9zaXRvcnkuaHlkcmF0ZUNvbXBvbmVudChpZCwgY29uZmlnLCBlbnYsIHByZXZpZXcpO1xuICAgIH1cbn07XG4iLCAiaW1wb3J0IHtCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyLCBIb3N0ZWRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxULCBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+PiB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlVG9Ib3N0OiBhbnksIHB1YmxpYyBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGlubmVyRXhlY3V0b3I6IChldmVudDogVCwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4gdm9pZDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGlmIChldmVudC5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBldmVudC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBzb3VyY2UgaWQsIHRoaW5rIGFib3V0IHRoYXQgP1xuICAgICAgICAgICAgICAgIGNvbnN0IF9tZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LmRlc3RpbmF0aW9uID8gZXZlbnQuZGVzdGluYXRpb24gOiBldmVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogZXZlbnQuc291cmNlID8gZXZlbnQuc291cmNlIDogZXZlbnQuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlubmVyRXhlY3V0b3IoZXZlbnQsIHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCwgX21lc3NhZ2VUb0hvc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wQXR0cmlidXRlcyA9IHtcbiAgICBpZDogJ215b3AtaWQnXG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQmluZE9uQ2xpY2tIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEJpbmRDbGlja01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkJpbmRDbGlja01lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdClcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IENsaWNrUmVwbGF5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPE15b3BFbGVtZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNoYWRvd1Jvb3RSZWYgZXh0ZW5kcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyLCBzaGFkb3dSb290KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxEZXRlY3RNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcblxuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBjb25zdCBhbGxNeW9wSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuXG4gICAgICAgIGxldCBteW9wUmVmczogTXlvcEVsZW1lbnRSZWZbXSA9IFtdO1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogdGFrZSB0aGF0IGJhY2sgdG8gdGhlIGRhc2hib2FyZD9cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coaXRlbSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcblxuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3djIHJlY3QnLCAgaXRlbS5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBteW9wUmVmcy5wdXNoKG5ldyBNeW9wRWxlbWVudFJlZihteW9wSWQsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5vZmZzZXRUb3AsIGl0ZW0ub2Zmc2V0TGVmdCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9O1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG5cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsXG4gICAgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSxcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaW4gZmFjdCB3aGVuIHJ1bm5pbmcgaW4gV2ViQ29tcG9uZW50IHdlIGNhbiB0cmFuc2ZlciB0aGUgb3JpZ2luYWwgZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1c2luZyBtYWtlU2VyaWFsaXphYmxlIGZvciBuZXN0ZWQgY2FzZXMsIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgIG1ha2VTZXJpYWxpemFibGUoZSwgZXZlbnQuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmPy5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG5cbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBldmVudC5vcHRpb25zLmlkKSE7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLy8vPj4+PlxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyAgY29uc29sZS5sb2coYGZhaWxlZCB0byBmaW5kICR7ZXZlbnQub3B0aW9ucy5pZH0gaW4gbWVtIHNjb3BlYCwgaG9zdFNESyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0aGUgcmVmIGNvbXBvbmVudCBpbiBvdXIgSG9zdFNESyAoc2FtZSBtZW1vcnkgd2hlbiB1c2luZyB3ZWJjb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gIHJlZkNvbXBvbmVudC5wYXJlbnQgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvL2RlbGV0ZSB0aGUgcmVmIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaG9zdFNESy5jb21wb25lbnRzLmluZGV4T2YocmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RTREsuY29tcG9uZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHJlbW92ZWQgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCB1c2luZyB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBubyBuZWVkIHRoaXMsIHBhc3Mgb3B0aW9ucyBmcm9tIHBhcmVudFxuICAgICAgICAgICAgICAgIC8vaW1wbGVtZW50YXRpb25Db21wb25lbnQuaWQgPSBldmVudC5wcmVkZWZpbmVkSWQ7XG4gICAgICAgICAgICAgICAgLy9yZWZDb21wb25lbnQuaWQgKz0gJy4nO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm90IHJlYWxseSBuZWVkZWQgP1xuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG5cbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKVxuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICJpbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHJlcGxpZXI6IChkYXRhOiBhbnkpID0+IHZvaWQsIHJvb3RSZWY6IFJvb3RSZWYpID0+IHtcbiAgICBjb25zdCBfX3NjcmlwdElucHV0cyA9IGV2ZW50LnNjcmlwdElucHV0cyA/IGV2ZW50LnNjcmlwdElucHV0cyA6IHt9XG4gICAgX19zY3JpcHRJbnB1dHMubWFrZVNlcmlhbGl6YWJsZSA9IG1ha2VTZXJpYWxpemFibGU7XG5cbiAgICBfX3NjcmlwdElucHV0cy5zZW5kID0gcmVwbGllcjtcbiAgICBfX3NjcmlwdElucHV0cy5yb290UmVmID0gcm9vdFJlZjtcbiAgICBfX3NjcmlwdElucHV0cy5fX3NjcmlwdElucHV0cyA9IF9fc2NyaXB0SW5wdXRzO1xuXG4gICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7ZXZlbnQuc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgIGNvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAvLyBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBGdW5jdGlvbignc2VuZCcsICdyb290UmVmJywnX19zY3JpcHRJbnB1dHMnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIGV2ZW50LmNvbnRlbnQgPyBldmVudC5jb250ZW50IDogJycpXG4gICAgLy9jb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24ocmVwbGllciwgcm9vdFJlZiwgX19zY3JpcHRJbnB1dHMsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKTtcbiAgICByZXBsaWVyKHJldCk7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIHNoYWRvd1Jvb3RSZWYpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKGdldElucHV0VmFsdWUoaXRlbSkpLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gJ0BteW9wL3Nkay93ZWJjb21wb25lbnQnO1xuICogYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3QgU0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgV2ViQ29tcG9uZW50U0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCA9IHRydWU7XG5cbiAgICAvL3doZW4gbmV3IHdlYiBjb21wb25lbnQgY3JlYXRlZC5cbiAgICBjb25uZWN0ZWRDYWxsYmFjayA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBzaGFkb3c6IFNoYWRvd1Jvb3QpID0+IHtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIobXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBlLmRhdGEgPyBlLmRhdGEgOiBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjdmllZCB3ZWJjb21wb25lbnRfbWVzc2FnZSB3aXRoIHdyb25nIHR5cGUnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgY29udGFpbmVyIC8gY29tcG9lbm50IGlkZW50aWZpZXIgZm9yIG11bHRpbCBjb21wb25lbnRzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGUpXG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXS5jb250ZXh0ID0gbmV3IFNoYWRvd1Jvb3RSZWYoY29udGFpbmVyLCBzaGFkb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlci5jb250ZXh0ID0gdGhpcy5zaGFkb3dSb290cztcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2suIHJhY2UgY29uZGl0aW9uIHdpdGggaG9zdC5sb2FkIHdoZW4gbW9kdWxlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICAgICAgfSwgMSlcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG4gICAgICAgIC8vbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAvL1xuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICAvL3RoaXMubXlDb21wb25lbnRJZFxuICAgICAgICAvL3RoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXNcbiAgICB9XG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ1dlYkNvbXBvbmVudFNESycsIFdlYkNvbXBvbmVudFNESyk7XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge1xuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElIVE1MTG9hZGVyQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLCBTaGFkb3dSb290TW9kZVR5cGUsXG4gICAgU2tpbkxvYWRlcnMsXG4gICAgUmVuZGVyTW9kZSwgUmVuZGVyUG9saWN5XG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHNcIjtcbmltcG9ydCB7RU1CRURERURfU0RLX0NPTlRFTlQsIEhBU19FTUJFRERFRF9TREt9IGZyb20gXCIuLi9lbWJlZGRlZFNESy50c1wiO1xuLy9pbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSBcIi4uLy4uL1NESy50c1wiO1xuXG5jb25zdCBNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSID0gJzwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPic7XG5jb25zdCBNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEID0gJ215b3Atd2ViLWNvbXBvbmVudCc7XG5cbi8vIFRyYWNrIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50IHNjcmlwdHMgdG8gcHJldmVudCBkb3VibGUgcmVnaXN0cmF0aW9uLlxuLy8gTWFwcyBzY3JpcHRJZCAtPiB0aGUgdGFnIG5hbWUgdGhhdCBzY3JpcHQgcmVnaXN0ZXJlZC4gVGhlIHRhZyBNVVNUIGJlIHJlbWVtYmVyZWQgcGVyXG4vLyBzY3JpcHQ6IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXyBpcyBhIHNpbmdsZSBnbG9iYWwgc2xvdCB0aGF0IGV2ZXJ5IGV4dHJhY3RlZCBjb21wb25lbnRcbi8vIG92ZXJ3cml0ZXMsIHNvIG9uIGEgcmUtbW91bnQgKHNjcmlwdCBza2lwcGVkKSBpdCBob2xkcyB3aGljaGV2ZXIgY29tcG9uZW50IHJhbiBsYXN0LlxuY29uc3QgZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0czogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3QgaWYgSFRNTCBpcyBhIE15b3AgV2ViIENvbXBvbmVudCAoc3RhcnRzIHdpdGggbWFya2VyIGNvbW1lbnQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc015b3BXZWJDb21wb25lbnQoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBodG1sLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBob3cgdGhpcyBjb21wb25lbnQgc2hvdWxkIHJlbmRlciwgYXBwbHlpbmcgdGhlIGhvc3QgcmVuZGVyIHBvbGljeS5cbiAgICAgKiBQcmVjZWRlbmNlOiBvcHRpb25zLnJlbmRlclBvbGljeSAocGVyLWNhbGwpIGZ1bGx5IHJlcGxhY2VzIHRoZSBnbG9iYWxcbiAgICAgKiBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgc28gYW4gYXBwIGNhbiByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgc3BlY2lmaWNzLlxuICAgICAqIFdpdGggbm8gcG9saWN5IHNldCwgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkIGZyb20gYmVmb3JlIChtYXJrZXIgXHUyMUQyIHdlYiBjb21wb25lbnQpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlbmRlck1vZGUoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgbG9hZGVyQ29uZmlnOiBJSFRNTExvYWRlckNvbmZpZyxcbiAgICAgICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW4sXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLFxuICAgICk6IFByb21pc2U8eyBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2U7IGlzb2xhdGU6IGJvb2xlYW4gfT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlID0gaXNXZWJDb21wb25lbnRcbiAgICAgICAgICAgID8gJ3dlYkNvbXBvbmVudCdcbiAgICAgICAgICAgIDogKChsb2FkZXJDb25maWcuaXNvbGF0aW9uIHx8IG9wdGlvbnM/Lmlzb2xhdGlvbikgPyAnaXNvbGF0ZWRJZnJhbWUnIDogJ2lmcmFtZScpO1xuXG4gICAgICAgIC8vIHBlci1jYWxsIHBvbGljeSB3aW5zOyBlbHNlIGdsb2JhbCBwb2xpY3kgb24gdGhlIGhvc3QgU0RLIHNpbmdsZXRvbi5cbiAgICAgICAgY29uc3QgcG9saWN5OiBSZW5kZXJQb2xpY3kgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyUG9saWN5ID8/ICh3aW5kb3cgYXMgYW55KT8ubXlvcD8uaG9zdFNESz8uZ2V0UmVuZGVyUG9saWN5Py4oKTtcblxuICAgICAgICBjb25zdCBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2UgPSBwb2xpY3lcbiAgICAgICAgICAgID8gYXdhaXQgcG9saWN5KHsgY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgcmVxdWVzdGVkTW9kZSwgaXNXZWJDb21wb25lbnQgfSlcbiAgICAgICAgICAgIDogcmVxdWVzdGVkTW9kZTtcblxuICAgICAgICByZXR1cm4geyBtb2RlLCBpc29sYXRlOiBtb2RlID09PSAnaXNvbGF0ZWRJZnJhbWUnIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGluLWZyYW1lIGJyaWRnZSBmb3IgaXNvbGF0ZWQgY29tcG9uZW50cy4gUnVucyBpbnNpZGUgdGhlIHNhbmRib3hlZFxuICAgICAqIChvcGFxdWUtb3JpZ2luKSBpZnJhbWUsIHRyYW5zbGF0aW5nIHRoZSBzYW1lIGF1dGhvci1mYWNpbmcgY29udHJhY3QgdG8vZnJvbVxuICAgICAqIHBvc3RNZXNzYWdlIHNpbmNlIHRoZSBob3N0IGhhcyBubyBzYW1lLW9yaWdpbiBhY2Nlc3M6XG4gICAgICogICBcdTIwMjIgZGF0YS1pbiA6IHBhcmVudCBwb3N0cyB7dHlwZTonbXlvcDppbml0J30gXHUyMTkyIGNhbGxzIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlXG4gICAgICogICAgICAgICAgICAgICAocGx1cyBhIGJha2VkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBmaXJzdCByZW5kZXIpXG4gICAgICogICBcdTIwMjIgZGF0YS1vdXQ6IHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6Y3RhJ30pXG4gICAgICogICBcdTIwMjIgcmVzaXplICA6IFJlc2l6ZU9ic2VydmVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6c2l6ZSd9KVxuICAgICAqXG4gICAgICogVE9ETyhkZXYtZXh0ZW5zaW9uKTogdGhlIGlzb2xhdGVkIHBhdGggZGVsaWJlcmF0ZWx5IHNraXBzIHRoZSBzYW1lLW9yaWdpblxuICAgICAqIGRhdGFTY3JpcHQsIHNvIGl0IG5ldmVyIHBvc3RzIHRoZSBgTVlPUF9QUkVJTkpFQ1RFRF9JTklUYCBtZXNzYWdlIHRoZSBNeW9wIGRldlxuICAgICAqIGV4dGVuc2lvbiBsaXN0ZW5zIGZvciB0byBsb2cgdGhlIElOSVRJQUwgcmVuZGVyIChgaW5pdCpgKS4gTGF0ZXIgaW5pdCB1cGRhdGVzIGFuZFxuICAgICAqIGFsbCBDVEFzIGFyZSBzdGlsbCB0cmFja2VkICh0aGUgZXh0ZW5zaW9uIHdyYXBzIGBjb21wLnByb3BzYCwgd2hpY2ggb3VyIGlzb2xhdGVkXG4gICAgICogY29ubmVjdFByb3BzIGJyYW5jaCByb3V0ZXMgdGhyb3VnaCksIHNvIG9ubHkgdGhlIGZpcnN0LXJlbmRlciBwYXlsb2FkIGlzIG1pc3NpbmdcbiAgICAgKiBmcm9tIHRoZSBleHRlbnNpb24ncyBhY3Rpdml0eSBsb2cgZm9yIGlzb2xhdGVkIGNvbXBvbmVudHMuIENsb3NpbmcgdGhpcyB3b3VsZCBiZSBhXG4gICAgICogfjEtbGluZSBgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidNWU9QX1BSRUlOSkVDVEVEX0lOSVQnLCBwYXlsb2FkOntkYXRhfX0pYCBpbnNpZGVcbiAgICAgKiBmbHVzaEluaXRpYWwoKSBiZWxvdyBcdTIwMTQgaW50ZW50aW9uYWxseSBOT1QgZG9uZSBmb3Igbm93IHRvIGF2b2lkIGFkZGluZyBleHRlbnNpb24tb25seVxuICAgICAqIHRyYWZmaWMgdG8gdGhlIGNvbXBvbmVudCBydW50aW1lLiBXZWIgY29tcG9uZW50cyBoYXZlIHRoZSBzYW1lIGluaXRpYWwtaW5pdCBnYXBcbiAgICAgKiAoaW5pdFdpdGhEYXRhIGlzIGNhbGxlZCBvbiB0aGUgZWxlbWVudCwgbm90IHZpYSBjb21wLnByb3BzKSBhbmQgaXQgcHJlZGF0ZXMgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkSXNvbGF0aW9uQnJpZGdlKGluaXRpYWxEYXRhTGl0ZXJhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGA8c2NyaXB0PlxuICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX19pbml0aWFsID0gJHtpbml0aWFsRGF0YUxpdGVyYWx9O1xuICAgICAgICAgICAgICAgIHZhciBfX3BlbmRpbmc7XG4gICAgICAgICAgICAgICAgLy8gZGF0YS1vdXQgKGN0YSlcbiAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uIChhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyZW50LnBvc3RNZXNzYWdlKHsgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpjdGEnLCBhY3Rpb246IGFjdGlvbiwgcGF5bG9hZDogcGF5bG9hZCB9LCAnKicpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbEluaXQoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7IHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRhdGEtaW4gKGluaXQgdXBkYXRlcylcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWQgfHwgZC5fX215b3AgIT09IHRydWUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6aW5pdCcpIHsgaWYgKCFjYWxsSW5pdChkLmRhdGEpKSBfX3BlbmRpbmcgPSBkLmRhdGE7IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCByZW5kZXI6IHVzZSBhIHBlbmRpbmcgdXBkYXRlIGlmIG9uZSBhcnJpdmVkLCBlbHNlIHRoZSBiYWtlZCBpbml0aWFsIGRhdGFcbiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gZmx1c2hJbml0aWFsKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IChfX3BlbmRpbmcgIT09IHVuZGVmaW5lZCkgPyBfX3BlbmRpbmcgOiBfX2luaXRpYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxJbml0KGRhdGEpKSB7IF9fcGVuZGluZyA9IHVuZGVmaW5lZDsgX19pbml0aWFsID0gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZsdXNoSW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICAvLyByZXNpemUgKHJlcG9ydCBjb250ZW50IHNpemUpXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWVhc3VyZSB0aGUgQk9EWSAoY29udGVudCBib3gpLiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IGluY2x1ZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgXHUyMDE0IHdoaWNoIHdlJ3JlIGRyaXZpbmcgXHUyMDE0IHNvIGl0IHdvdWxkIHJlcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBmcmFtZSBoZWlnaHQsIG5vdCB0aGUgY29udGVudCwgYW5kIG5ldmVyIHNocmluay5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoYikgcmV0dXJuIE1hdGgubWF4KGIuc2Nyb2xsSGVpZ2h0LCBiLm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwb3N0U2l6ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbnRlbnRIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBPYnNlcnZlIHRoZSBCT0RZIChyZWZsb3dzIHdpdGggY29udGVudCkgXHUyMDE0IG5vdCBkb2N1bWVudEVsZW1lbnQsIHdob3NlIGJveCBpc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgYW5kIHdvdWxkIGZlZWQgYmFjayBpbnRvIGEgcmVzaXplIGxvb3AuIEEgTXV0YXRpb25PYnNlcnZlclxuICAgICAgICAgICAgICAgIC8vIGNhdGNoZXMgY29udGVudCBzd2FwcyAoZS5nLiBpbm5lckhUTUwgcmUtcmVuZGVyKSB0aGF0IGRvbid0IGNoYW5nZSBib2R5J3MgYm94LlxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgdmFyIF9fcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIocG9zdFNpemUpOyBpZiAoZG9jdW1lbnQuYm9keSkgX19yby5vYnNlcnZlKGRvY3VtZW50LmJvZHkpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBuZXcgTXV0YXRpb25PYnNlcnZlcihwb3N0U2l6ZSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBwb3N0U2l6ZSk7XG4gICAgICAgICAgICAgICAgcG9zdFNpemUoKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIDwvc2NyaXB0PmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgY29udGVudCBmcm9tIEhUTUxcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdD8udGV4dENvbnRlbnQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudC5cbiAgICAgKiBSZXR1cm5zIHRoZSBjdXN0b20gZWxlbWVudCB0YWcgbmFtZSB0aGlzIHNjcmlwdCByZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50OiBzdHJpbmcsIHNjcmlwdElkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGV4ZWN1dGVkIChieSBzY3JpcHQgY29udGVudCBoYXNoKVxuICAgICAgICBjb25zdCBjYWNoZWRUYWdOYW1lID0gZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5nZXQoc2NyaXB0SWQpO1xuICAgICAgICBpZiAoY2FjaGVkVGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgYWxyZWFkeSBleGVjdXRlZCBmb3IgJHtzY3JpcHRJZH0sIHJldXNpbmcgPCR7Y2FjaGVkVGFnTmFtZX0+YCk7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVGFnTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHRDb250ZW50O1xuICAgICAgICBzY3JpcHQuaWQgPSBgbXlvcC1leHRyYWN0ZWQtJHtzY3JpcHRJZH1gO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgZ2xvYmFsIGltbWVkaWF0ZWx5OiB0aGUgbmV4dCBleHRyYWN0ZWQgc2NyaXB0IHRvIHJ1biB3aWxsIG92ZXJ3cml0ZSBpdC5cbiAgICAgICAgY29uc3QgdGFnTmFtZSA9ICh3aW5kb3cgYXMgYW55KS5fX01ZT1BfVEFHX05BTUVfXztcbiAgICAgICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgICAgICAgIGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuc2V0KHNjcmlwdElkLCB0YWdOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIEV4ZWN1dGVkIHdlYiBjb21wb25lbnQgc2NyaXB0OiAke3NjcmlwdElkfSAtPiA8JHt0YWdOYW1lfT5gKTtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIE15b3AgV2ViIENvbXBvbmVudCAoZXh0cmFjdGVkIGFuZCBydW4gb24gaG9zdCBkb2N1bWVudClcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgaHRtbDogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICk6IFByb21pc2U8TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudD4ge1xuICAgICAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gdGhpcy5leHRyYWN0V2ViQ29tcG9uZW50U2NyaXB0KGh0bWwpO1xuXG4gICAgICAgIGlmICghc2NyaXB0Q29udGVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gTm8gPHNjcmlwdCBpZD1cIm15b3Atd2ViLWNvbXBvbmVudFwiPiBmb3VuZCBpbiBIVE1MJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgY29tcG9uZW50IGRlZmluaXRpb24gaWQgYXMgc2NyaXB0IGlkZW50aWZpZXIgZm9yIGRlZHVwbGljYXRpb25cbiAgICAgICAgY29uc3Qgc2NyaXB0SWQgPSBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfS0ke3NraW4uaWR9YDtcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBzY3JpcHQgb24gdGhlIGhvc3QgZG9jdW1lbnQsIG9yIHJldXNlIHRoZSB0YWcgaXQgcmVnaXN0ZXJlZCBlYXJsaWVyLlxuICAgICAgICAvLyBOZXZlciByZS1yZWFkIHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXyBoZXJlOiBvbiBhIHJlLW1vdW50IHRoZSBzY3JpcHQgaXMgc2tpcHBlZCBhbmRcbiAgICAgICAgLy8gdGhlIGdsb2JhbCBzdGlsbCBwb2ludHMgYXQgd2hpY2hldmVyIGNvbXBvbmVudCdzIHNjcmlwdCByYW4gbGFzdCwgd2hpY2ggd291bGQgYnVpbGRcbiAgICAgICAgLy8gdGhpcyBjb250YWluZXIncyBlbGVtZW50IGZyb20gYW5vdGhlciBjb21wb25lbnQncyB0YWcuXG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSB0aGlzLmV4ZWN1dGVXZWJDb21wb25lbnRTY3JpcHQoc2NyaXB0Q29udGVudCwgc2NyaXB0SWQpO1xuXG4gICAgICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGRpZCBub3Qgc2V0IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjdXN0b20gZWxlbWVudFxuICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBjb250YWluZXIgaWYgbmVlZGVkXG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCB3cmFwcGVyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KFxuICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbixcbiAgICAgICAgICAgIHNraW4sXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHdpdGggZGF0YSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAob3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIExvYWRlZCA8JHt0YWdOYW1lfT4gaW50byBjb250YWluZXJgKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgY29uc3QgaXNXQyA9IHRoaXMuaXNNeW9wV2ViQ29tcG9uZW50KGxvYWRlckNvbmZpZy5IVE1MKTtcbiAgICAgICAgY29uc3QgeyBtb2RlLCBpc29sYXRlIH0gPSBhd2FpdCB0aGlzLnJlc29sdmVSZW5kZXJNb2RlKGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGxvYWRlckNvbmZpZywgaXNXQywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtNeW9wXSBSZW5kZXJpbmcgYmxvY2tlZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1dDKSB7XG4gICAgICAgICAgICAvLyBXZWItY29tcG9uZW50IEhUTUwgb25seSBzdXBwb3J0cyB0aGUgd2ViLWNvbXBvbmVudCBjb250cmFjdDsgYSBwb2xpY3kgdGhhdFxuICAgICAgICAgICAgLy8gZGVuaWVzIGl0IGhhcyBubyBpZnJhbWUgZmFsbGJhY2sgKHNlZSBwbGFuIFx1MDBBNzMuMykgXHUyMDE0IGJsb2NrIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAvLyBzaWxlbnRseSByZW5kZXIgYnJva2VuLiBVbnRydXN0ZWQgY29udHJpYnV0b3JzIG11c3Qgc2hpcCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgICAgICAgIGlmIChtb2RlICE9PSAnd2ViQ29tcG9uZW50Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW015b3BdIFdlYi1jb21wb25lbnQgcmVuZGVyaW5nIGRlbmllZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBsb2FkZXJDb25maWcuSFRNTCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBsZXQgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBGdWxsIGlzb2xhdGlvbjogYSBzYW5kYm94IFdJVEhPVVQgYWxsb3ctc2FtZS1vcmlnaW4gZ2l2ZXMgdGhlIGZyYW1lIGFuXG4gICAgICAgICAgICAvLyBvcGFxdWUgb3JpZ2luIFx1MjAxNCBubyBob3N0IERPTS9jb29raWVzL3BhcmVudCBhY2Nlc3MuIE11c3QgYmUgc2V0IGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhlIGZyYW1lIG5hdmlnYXRlcyAoaS5lLiBiZWZvcmUgc3JjZG9jIC8gYXBwZW5kKS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NhbmRib3gnLCAnYWxsb3ctc2NyaXB0cyBhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZS4gQW4gaXNvbGF0ZWQgKHNhbmRib3hlZCwgb3BhcXVlLW9yaWdpbikgZnJhbWVcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIGRvYy53cml0ZSgpJ24gZnJvbSB0aGUgaG9zdCwgc28gYWNjdW11bGF0ZSB0aGUgbWFya3VwIGFuZCBzZXQgaXQgdmlhXG4gICAgICAgICAgICAvLyBzcmNkb2Mgb24gY2xvc2UoKS4gTm9uLWlzb2xhdGVkIGZyYW1lcyBrZWVwIHRoZSBzYW1lLW9yaWdpbiBkb2Mud3JpdGUgcGF0aC5cbiAgICAgICAgICAgIGNvbnN0IF9fc3JjUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBjb25zdCBkb2M6IHsgb3BlbigpOiB2b2lkOyB3cml0ZWxuKHM6IHN0cmluZyk6IHZvaWQ7IGNsb3NlKCk6IHZvaWQgfSA9IGlzb2xhdGVcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgb3BlbigpIHt9LFxuICAgICAgICAgICAgICAgICAgICB3cml0ZWxuKHM6IHN0cmluZykgeyBfX3NyY1BhcnRzLnB1c2gocyk7IH0sXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlKCkgeyBJZnJhbWVFbGVtZW50LnNyY2RvYyA9IF9fc3JjUGFydHMuam9pbignXFxuJyk7IH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGQub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgICAgICB9KSgpO1xuXG5cbiAgICAgICAgICAgIC8vIFBhcnNlIG15b3A6c2l6ZSBtZXRhIHRhZyBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uIChzYW1lIERPTVBhcnNlciBwYXNzIHBhdHRlcm4gYXMgbXlvcF9wcmV2aWV3IHJlbW92YWwpLlxuICAgICAgICAgICAgLy8gVGhpcyBsZXRzIHRoZSBSZWFjdCBob3N0IGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KSBmcm9tIHRoZSBzdGFydC5cbiAgICAgICAgICAgIGxldCBwYXJzZWRTaXplTWV0YTogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfcHJlUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVEb2MgPSBfcHJlUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhID0gX3ByZURvYy5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJteW9wOnNpemVcIl0nKTtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZU1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyc2VkU2l6ZU1ldGEgPSBKU09OLnBhcnNlKHNpemVNZXRhLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8ICd7fScpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IHBhcnQgb2YgQUkgY29tcG9uZW50cywgdGhpbmsgYWJvdXQgdGhhdCwgZG9jdW1lbnQgaXQuXG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQ/LnJlbW92ZUF0dHJpYnV0ZSgndHlwZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQcmVwZW5kIERPQ1RZUEU6IGRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwgcmV0dXJucyBvbmx5IDxodG1sPi4uLjwvaHRtbD5cbiAgICAgICAgICAgICAgICAvLyBhbmQgZHJvcHMgdGhlIGRvY3R5cGUsIHdoaWNoIHdvdWxkIHB1dCB0aGUgaWZyYW1lIGluIHF1aXJrcyBtb2RlLlxuICAgICAgICAgICAgICAgIC8vIFF1aXJrcyBtb2RlIGJyZWFrcyBhdXRvLXNpemluZyBiZWNhdXNlIDxib2R5PiBzdHJldGNoZXMgdG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgICAgIC8vIHZpZXdwb3J0IGluc3RlYWQgb2Ygc2hyaW5raW5nIHRvIGNvbnRlbnQsIHNvIFJlc2l6ZU9ic2VydmVyIG9uIGJvZHlcbiAgICAgICAgICAgICAgICAvLyBuZXZlciBmaXJlcyB3aGVuIGNvbnRlbnQgcmVmbG93cyAoZS5nLiBhZnRlciBmb250IHN3YXApLlxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpbXByb3ZlIGJ5IGRvIGl0IG9uIHRoZSBzZXJ2ZSBvbmNlXG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbXlvcF9wcmV2aWV3IHNjcmlwdCB3aGVuIG5vdCBpbiBpbnNwZWN0aW9uIG1vZGVcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAobXlvcF9wcmV2aWV3X3NjcmlwdCkge1xuICAgICAgICAgICAgICAgICAgICBteW9wX3ByZXZpZXdfc2NyaXB0LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBob3N0LXByb3ZpZGVkIENTUyBiZWZvcmUgdGhlIGlmcmFtZSBpcyB3cml0dGVuIHNvIHN0eWxlcyBhcmVcbiAgICAgICAgICAgIC8vIHByZXNlbnQgb24gZmlyc3QgcGFpbnQgKG5vIEZPVUMpLiBBcHBlbmRlZCBsYXN0IGluIDxoZWFkPiBzbyBpdCB3aW5zXG4gICAgICAgICAgICAvLyBvdmVyIHRoZSBjb21wb25lbnQncyBvd24gc3R5bGVzIHZpYSBub3JtYWwgY2FzY2FkZSBvcmRlci5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5pbmplY3RDc3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoSFRNTDJSZW5kZXIsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZVRhZyA9IF9kb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICBzdHlsZVRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbXlvcC1pbmplY3RlZCcsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgLy8gPHN0eWxlPiBpcyBhbiBIVE1MIHJhdy10ZXh0IGVsZW1lbnQ6IHRoZSBzZXJpYWxpemVyIGJlbG93IHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50cyBMSVRFUkFMTFksIHdpdGhvdXQgZXNjYXBpbmcuIENTUyBjb250YWluaW5nIFwiPC9zdHlsZT5cIiB3b3VsZFxuICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBjbG9zZSB0aGUgdGFnIGFuZCBpbmplY3QgbGl2ZSBtYXJrdXAgaW50byB0aGUgaWZyYW1lLCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVzIHNhbWUtb3JpZ2luIHdpdGggdGhpcyBwYWdlLiBOZXV0cmFsaXplIHRoZSBzZXF1ZW5jZSBcdTIwMTQgbm8gcmVhbFxuICAgICAgICAgICAgICAgIC8vIHN0eWxlc2hlZXQgY29udGFpbnMgaXQuIChTYW1lIGNsYXNzIG9mIGJ1ZyBhcyB0aGUgPC9zY3JpcHQ+IGVzY2FwZSBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhIHBheWxvYWQgYmVsb3cuKVxuICAgICAgICAgICAgICAgIHN0eWxlVGFnLnRleHRDb250ZW50ID0gb3B0aW9ucy5pbmplY3RDc3MucmVwbGFjZSgvPFxccypcXC9cXHMqc3R5bGUvZ2ksICc8XFxcXC9zdHlsZScpO1xuICAgICAgICAgICAgICAgIChfZG9jLmhlYWQgfHwgX2RvYy5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcbiAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZvciBucG0gcGFja2FnZSB1c2VycyB3aXRoIGJ1bmRsZXJzIChWaXRlL1dlYnBhY2spLCBpbmplY3QgU0RLIGlubGluZVxuICAgICAgICAgICAgLy8gRm9yIENETiB1c2VycyAoc2NyaXB0IHRhZyksIHVzZSBDRE4gVVJMXG4gICAgICAgICAgICBjb25zdCBzZGtTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gRGlmZmVyZW50IGluaXQgc2NyaXB0IGZvciBlbWJlZGRlZCB2cyBDRE4gU0RLXG4gICAgICAgICAgICAvLyAtIEVtYmVkZGVkIChidW5kbGVkIElJRkUpOiB1c2VzIE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggcmV0dXJucyBtb2R1bGUgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIC0gQ0ROIChkeW5hbWljIGxvYWRpbmcpOiB1c2VzIHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggd3JhcHMgd2l0aCAuZ2V0KClcbiAgICAgICAgICAgIGNvbnN0IGluaXRTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZU1vZHVsZSA9IGF3YWl0IE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZnJhbWVTREsgPSBpZnJhbWVNb2R1bGUuSWZyYW1lU0RLO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXyA9IHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyB1c2UgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSBpbnN0ZWFkIG9mIHRoZSBzYW1lLW9yaWdpblxuICAgICAgICAgICAgLy8gSWZyYW1lU0RLICsgZGF0YS1pbmplY3Rpb24gc2NyaXB0cyAod2hpY2ggcmVseSBvbiBob3N0XHUyMTk0ZnJhbWUgYWNjZXNzKS5cbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKGAke3Nka1NjcmlwdH0ke2luaXRTY3JpcHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBkYXRhIHNjcmlwdCBpZiBkYXRhIG9wdGlvbiBpcyBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKCFpc29sYXRlICYmIG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIENUQSBxdWV1ZSAtIGNhcHR1cmVzIGFueSBDVEFzIGVtaXR0ZWQgZHVyaW5nIGluaXQgYmVmb3JlIGhvc3QgcmVnaXN0ZXJzIGhhbmRsZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjdGFRdWV1ZVNjcmlwdCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUucHVzaCh7YWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWR9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgLy8gRXNjYXBlIGRhdGEgZm9yIHNhZmUgZW1iZWRkaW5nIGluIHNjcmlwdCB0YWdcbiAgICAgICAgICAgICAgICAvLyBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IGVzY2FwZSA8L3NjcmlwdD4gd2hpY2ggY291bGQgYnJlYWsgSFRNTCBwYXJzaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZERhdGEgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2VsZi1jb250YWluZWQgZGF0YSBpbmplY3Rpb24gc2NyaXB0IHRoYXQ6XG4gICAgICAgICAgICAgICAgLy8gMS4gQ2FsbHMgbXlvcF9pbml0X2ludGVyZmFjZSBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyAyLiBXYXRjaGVzIGZvciBsYXRlLWRlZmluZWQgbXlvcF9pbml0X2ludGVyZmFjZSB2aWEgZGVmaW5lUHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyAzLiBDbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIChyZW1vdmVzIHNjcmlwdCB0YWcgYW5kIHdpbmRvdyBkYXRhKVxuICAgICAgICAgICAgICAgIC8vIDQuIFBvc3RzIG1lc3NhZ2UgdG8gcGFyZW50IGZvciBleHRlbnNpb24gdHJhY2tpbmcgKHByZS1pbmplY3RlZCBpbml0KilcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2NyaXB0ID0gYDxzY3JpcHQgaWQ9XCJfX215b3BfaW5pdF9kYXRhX3NjcmlwdFwiPlxuICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICR7ZXNjYXBlZERhdGF9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fbXlvcF9pbml0X2RhdGFfc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsSW5pdEludGVyZmFjZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgcHJlLWluamVjdGVkIGRhdGEgY2FsbCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgZXh0ZW5zaW9uIHZpYSBwb3N0TWVzc2FnZSAoaW5pdCogPSBwcmUtaW5qZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTVlPUF9QUkVJTkpFQ1RFRF9JTklUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHNjcmlwdCB0YWcgYW5kIHN0b3JlZCBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdEVsICYmIHNjcmlwdEVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBhbHJlYWR5IGV4aXN0cyAtIGNhbGwgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZSh3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG5vdCB5ZXQgZGVmaW5lZCAtIHN0b3JlIGRhdGEgYW5kIHdhdGNoIGZvciBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X2RhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbXlvcF9pbml0X2ludGVyZmFjZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3JpZ2luYWwgPSBmbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuX19teW9wX2luaXRfZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZERhdGEgPSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2UoZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oY3RhUXVldWVTY3JpcHQgKyBkYXRhU2NyaXB0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzOiBpbmplY3QgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAoaW5pdCBpbiAvIGN0YSBvdXQgLyBzaXplIG91dCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWREYXRhID0gb3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKS5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpXG4gICAgICAgICAgICAgICAgICAgIDogJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4odGhpcy5idWlsZElzb2xhdGlvbkJyaWRnZShlc2NhcGVkRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb2MuY2xvc2UoKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGNvbnRyb2wgZnJvbSBkYXNoYm9hcmRcbiAgICAgICAgICAgIC8vICAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBJc29sYXRlZDogd2lyZSB0aGUgaG9zdCBzaWRlIG9mIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKGN0YSBpbiwgc2l6ZSBpbiwgaW5pdCBvdXQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIGNvbXAuZW5hYmxlSXNvbGF0aW9uKCk7XG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHBhcnNlZCBzaXplTWV0YSBvbiB0aGUgY29tcG9uZW50IHNvIHRoZSBSZWFjdCBob3N0IGNhbiByZWFkIGl0XG4gICAgICAgICAgICBjb21wLnNpemVNZXRhID0gcGFyc2VkU2l6ZU1ldGE7XG5cbiAgICAgICAgICAgIC8vIEF1dG8tc2l6ZTogb2JzZXJ2ZSBjb250ZW50IHNpemUgYW5kIHN5bmMgdG8gaWZyYW1lIGRpbWVuc2lvbnMuXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGZvciBhbGwgaG9zdHMgKHZhbmlsbGEgU0RLLCBSZWFjdCwgVnVlLCBBbmd1bGFyKS5cbiAgICAgICAgICAgIC8vIElmIGEgZnJhbWV3b3JrIGhvc3QgKGUuZy4gQG15b3AvcmVhY3QpIGFsc28gY2FsbHMgb2JzZXJ2ZUF1dG9TaXplKCksXG4gICAgICAgICAgICAvLyBpdCBjbGVhbmx5IHJlcGxhY2VzIHRoZXNlIG9ic2VydmVycyB2aWEgX2F1dG9TaXplQ2xlYW51cCB0cmFja2luZy5cbiAgICAgICAgICAgIGNvbXAuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmF1dG9TaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBhdXRvLXNpemluZy4gSWZyYW1lIHN0YXlzIHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBIb3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucyAoZS5nLiBSZWFjdCBOYXRpdmUgV2ViVmlldykuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNob3duID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlQXV0b1NpemUoe1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUF1dG9TaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvblNpemVDaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgYWZ0ZXIgZmlyc3QgbWVhc3VyZW1lbnQgY29tcGxldGVzIChub3QgYmVmb3JlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNpdGlvbnMgZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQsIHByZXZlbnRpbmcgZmxhc2ggYXQgd3Jvbmcgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd24gJiYgIW9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wLnByb3BzLl9nbG9iYWwgPSBjb21wLmVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubm9uZSkge1xuICAgICAgICAgICAgLy8gcGFyc2VyID0gcGFyc2VyID8gcGFyc2VyIDogbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgLy8gY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGRvbUlkKTtcblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7Ly8udHJpbSgpO1xuICAgICAgICAgICAgZWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIC8vICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIC8vICAgY29uc3QgeiA9IGZpcnN0RWxlbWVudCA/IGZpcnN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICAgICAgLy8gICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2codGVtcGxhdGUsIGZpcnN0RWxlbWVudCwgeilcbiAgICAgICAgICAgIC8vICAgZWxlbWVudCA9IGZpcnN0RWxlbWVudFxuXG4gICAgICAgICAgICAvLyBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb250YWluZXIuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2soZWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudE5hbWUgPSB0b0N1c3RvbUVsZW1lbnROYW1lKGNvbXBvbmVudERlZmluaXRpb24ubmFtZSArIHNraW4uaWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlZGVmaW5lICFcbiAgICAgICAgICAgIGlmICghc2Vlbi5pbmNsdWRlcyhjdXN0b21FbGVtZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQoY3VzdG9tRWxlbWVudE5hbWUsIGxvYWRlckNvbmZpZy5IVE1MLCBsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUpO1xuICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtjdXN0b21FbGVtZW50TmFtZX0gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtkZWNvbXByZXNzVVVJRHN9IGZyb20gXCIuLi91dGlscy91dWlkLnRzXCI7XG5pbXBvcnQge0Nsb3VkUmVwb3NpdG9yeX0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50RXhwZXJpZW5jZSwgSVNraW5JbnN0YW5jZUNvbmZpZyxcbiAgICBTa2luU2VsZWN0b3JUeXBlc1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjb25zdCBjaGVja015b3BPdmVycmlkZSA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcpOiBQcm9taXNlPElDb21wb25lbnRDb25maWcgfCBudWxsPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy9UT0RPOiBzdXBwb3J0IGRpc2FibGluZyB0aGUgbWVjaGFuaXNtXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgICAgICBjb25zdCBteW9wT3ZlcnJpZGUgPSBwYXJhbXMuZ2V0KCdteW9wT3ZlcnJpZGUnKTtcbiAgICAgICAgaWYgKG15b3BPdmVycmlkZSkge1xuICAgICAgICAgICAgY29uc3QgW3NvdXJjZSwgLi4udXVpZHNdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbY29tcG9uZW50SWQsIHNraW5JZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGZldGNoQXV0b0Zsb3cuIExvb2tzIGxpa2Ugb25seSBvbmUgc2tpbiBpcyByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbiA9IGNvbXBvbmVudFRvT3ZlcnJpZGUudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogZm9yIG5vdyBqdXN0IHNldCBza2luIGlkLiBDaGVjayB0aGUgY2xvdWQgaW1wbGVtZW50YXRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBza2luSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkluc3RhbmNlQ29uZmlnXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyAgICBjYXNlICdmbG93Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7XG4gICAgICAgICAgICAgICAgICAgLy8gY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRDb25maWcudHlwZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZSA9PT0gU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwZXJpZW5jZSA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcy5maW5kKGUgPT4gZS5pZCA9PT0gZXhwZXJpbWVudElkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRFeHBlcmllbmNlPy50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZSA9IHJlc29sdmVkRXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLmZpbmQocyA9PiBzLnNlZ21lbnRJZCA9PT0gdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2Uuc2VnbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0gc2VnbWVudD8uc2tpblNlbGVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtJTXlvcExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFbnZlbG9wZWRNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSwgTWVzc2FnZURpcmVjdGlvbiwgUmVmXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wSWZyYW1lTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL2lmcmFtZUxvYWRlclwiO1xuaW1wb3J0IHtXZWJjb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQge1JlbmRlclBvbGljeX0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHR5cGUge0lmcmFtZVNES30gZnJvbSBcIi4uL0lmcmFtZVwiO1xuaW1wb3J0IHtjb25uZWN0UHJvcHMsIGNvbm5lY3RSZWZzLCBjcmVhdGVSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElFeHBlcmllbmNlLCBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCwgSVNlZ21lbnRlZFNraW5Db25maWcsIElTZWdtZW50RXhwZXJpZW5jZSxcbiAgICBJU2tpbkNvbmZpZywgSVNraW5TZWxlY3RvckNvbmZpZywgU2tpblNlbGVjdG9yVHlwZXMsXG5cblxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtkZWxpdmVyeSwgZGVsaXZlcnlPZmYsIGRlbGl2ZXJ5UmVmcmVzaCwgZGVsaXZlcnlTdGF0c30gZnJvbSBcIi4uL2hlbHBlcnMvY2xvdWRSZXBvc2l0b3J5SGVscGVyc1wiO1xuaW1wb3J0IHtIVE1MQ29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7Y2hlY2tNeW9wT3ZlcnJpZGV9IGZyb20gXCIuL215b3BPdmVycmlkZS50c1wiO1xuXG5pbnRlcmZhY2UgY29tcG9uZW50TG9hZGVyQ3JlYXRvciB7XG4gICAgbmV3KGxvYWRlcnM6IElNeW9wTG9hZGVyW10pOiBhbnk7XG59XG5cbi8vIGNvbnN0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhc3luYyAoaWQ6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OjMwMDAvY29tcG9uZW50P2lkPSR7aWR9YCk7XG4vLyAgICAgY29uc3QgY29tcG9uZW50RGVmOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IChhd2FpdCByZXMuanNvbigpKS5pdGVtO1xuLy8gICAgIHJldHVybiBjb21wb25lbnREZWZcbi8vIH1cblxuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG4vKipcbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3N0U0RLIHtcbiAgICBzdGF0aWMgSW5zdGFuY2UgPSAoKSA9PiB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG4gICAgY29tcG9uZW50czJpbml0OiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHNMb2FkZXJzOiBJTXlvcExvYWRlcltdID0gW107XG5cbiAgICAvLyBHbG9iYWwgcmVuZGVyIHBvbGljeSAoYWxsb3cvZGVueS9tb2RlIGdhdGUpLiBBIHBlci1jYWxsIG9wdGlvbnMucmVuZGVyUG9saWN5XG4gICAgLy8gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoaXMgXHUyMDE0IHNlZSBIVE1MQ29tcG9uZW50TG9hZGVyLnJlc29sdmVSZW5kZXJNb2RlLlxuICAgIHByaXZhdGUgX3JlbmRlclBvbGljeT86IFJlbmRlclBvbGljeTtcbiAgICBwdWJsaWMgc2V0UmVuZGVyUG9saWN5ID0gKHBvbGljeT86IFJlbmRlclBvbGljeSkgPT4geyB0aGlzLl9yZW5kZXJQb2xpY3kgPSBwb2xpY3k7IH07XG4gICAgcHVibGljIGdldFJlbmRlclBvbGljeSA9ICgpOiBSZW5kZXJQb2xpY3kgfCB1bmRlZmluZWQgPT4gdGhpcy5fcmVuZGVyUG9saWN5O1xuXG4gICAgcHVibGljIGluaXRpYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgdHlwZTJJbnN0YW5jZUNvdW50OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcHVibGljIGFzc2lnbklkID0gKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0pIHtcbiAgICAgICAgICAgIHRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1fJHsrK3RoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdfWA7XG4gICAgfVxuXG4gICAgLy9UT0RPIDogZml4IHRoZSBpbnNwZWN0IGltcGxlbWVudGF0aW9uIGluc2lkZSByZWZDb21wb25lbnRcbiAgICAvL3RoZW4gaW5zcGVjdGVkIG1heWJlIGNhbiBiZSBkcm9wcGVkXG4gICAgcHJpdmF0ZSBpbnNwZWN0ZWQgPSBmYWxzZTtcbiAgICBwdWJsaWMgaW5zcGVjdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5zcGVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaW5zcGVjdGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5pbnNwZWN0KSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Lmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIEEgY29tcG9uZW50J3Mgb3JpZ2luIGlzIHdoYXRldmVyIGl0cyBpZnJhbWUgVVJMIGlzLCBzbyBhbiBvcmlnaW4gYWxsb3dsaXN0IGNhbid0IHdvcmsgaGVyZS5cbiAgICAvLyBJbnN0ZWFkIG9ubHkgZnJhbWVzIHRoaXMgU0RLIGNyZWF0ZWQgKG9yIGFkb3B0ZWQpIG1heSB0YWxrIHRvIGl0LiBgc2VuZCgpYCBkaXNwYXRjaGVzXG4gICAgLy8gc3ludGhldGljIGV2ZW50cywgd2hpY2ggaGF2ZSBubyBzb3VyY2UuXG4gICAgcHJpdmF0ZSBpc1RydXN0ZWRTb3VyY2UgPSAoc291cmNlOiBNZXNzYWdlRXZlbnRTb3VyY2UgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICghc291cmNlIHx8IHNvdXJjZSA9PT0gd2luZG93KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgaXNPd25GcmFtZSA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQgYXMgSFRNTElGcmFtZUVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudD8ubm9kZU5hbWUgPT09ICdJRlJBTUUnICYmIGVsZW1lbnQuY29udGVudFdpbmRvdyA9PT0gc291cmNlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRzLnNvbWUoaXNPd25GcmFtZSkgfHwgdGhpcy5jb21wb25lbnRzMmluaXQuc29tZShpc093bkZyYW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluY29taW5nTWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KSA9PiB7XG4gICAgICAgIGlmICghZXZlbnQuZGF0YT8ubXlvcCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1RydXN0ZWRTb3VyY2UoZXZlbnQuc291cmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEubXlvcCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLnVwICYmIGV2ZW50LmRhdGEubWVzc2FnZVR5cGUgIT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGhvc3RzZGssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcE1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgSW5pdE1lc3NhZ2UoY29tcG9uZW50LmlkKSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudHMgMiBpbml0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgIT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQuaWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWF0ZWRDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50Py5pZCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhdGVkQ29tcG9uZW50Py5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgIC8vaW5pdGlhdGVkQ29tcG9uZW50Py5wYXJlbnQ/LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG15b3BNZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLmRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLm1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IEV4ZWN1dGVDb21wb25lbnRNZXRob2QubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZE1lc3NhZ2UubWVzc2FnZS5yb3V0ZSA9IHR5cGVkTWVzc2FnZS5yb3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5tZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IGxvZyA/XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vY29tcG9uZW50LnJlZnMuYm9keS5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gbXlvcE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vbm8gaW4gbWVtIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ub3QgcHJvY2Vzc2VkIGluIG9uTWVzc2FnZVJlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShcbiAgICAgICAgLy8gICAgIFwiaGkgdGhlcmUgeW91cnNlbGYhICB0aGUgc2VjcmV0IHJlc3BvbnNlIFwiICsgXCJpczogcmhlZWVlZXQhXCIsXG4gICAgICAgIC8vICAgICBldmVudC5vcmlnaW4sXG4gICAgICAgIC8vICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4oJycsXG4gICAgICAgICAgICB7ZGF0YTogbWVzc2FnZX1cbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcihzeW50aGV0aWNFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/OiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvLyBnZXRIb3N0TW9kdWxlKCkgYWxyZWFkeSBpbml0aWF0ZXMgdGhlIFNESywgYW5kIHRoZSBSRUFETUUgdGVsbHMgaG9zdHMgdG8gY2FsbCBpbml0KClcbiAgICAgICAgICAgIC8vIGFmdGVyIGl0LiBPbmx5IG1lcmdlIGN1c3RvbSBsb2FkZXJzOyB0aGUgbWVzc2FnZSBsaXN0ZW5lciBpcyBhbHJlYWR5IGF0dGFjaGVkLlxuICAgICAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlckxvYWRlcnMoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzaWNMb2FkZXJzID0gW1xuICAgICAgICAgICAgbmV3IE15b3BJZnJhbWVMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBXZWJjb21wb25lbnRMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBIVE1MQ29tcG9uZW50TG9hZGVyKClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gW1xuICAgICAgICAgICAgLi4uYmFzaWNMb2FkZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlckxvYWRlcnMoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jb21taW5nIG1lc3NhZ2VzIGZyb20gSUZyYW1lc1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ215b3AgaG9zdFNESyBpbml0aWF0ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZ2lzdGVyTG9hZGVycyA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yczogY29tcG9uZW50TG9hZGVyQ3JlYXRvcltdKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvYWRlckJ5VHlwZTogUmVjb3JkPHN0cmluZywgSU15b3BMb2FkZXI+ID0ge307XG5cbiAgICAgICAgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMuZm9yRWFjaChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUxvYWRlciA9IG5ldyBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yKHRoaXMuY29tcG9uZW50c0xvYWRlcnMpO1xuICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2N1c3RvbUxvYWRlci50eXBlXSA9IGN1c3RvbUxvYWRlcjtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZvckVhY2gobG9hZGVyID0+IHtcbiAgICAgICAgICAgIGlmICghbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSlcbiAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdID0gbG9hZGVyO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBPYmplY3QudmFsdWVzKGxvYWRlckJ5VHlwZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IgPSBhc3luYyAoc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnLCBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXSA9IFtdLCBob29rcz86IGxvYWRlckhvb2tzKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaW5kPFQ+KFxuICAgICAgICAgICAgYXJyYXk6IFRbXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IFByb21pc2U8Ym9vbGVhbj5cbiAgICAgICAgKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2tpblNlbGVjdG9yLnR5cGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNhc2UgXCJEZWRpY2F0ZWRTa2luXCIgOiAvL2JhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkOiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbklkID0gKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbj8uaWRcbiAgICAgICAgICAgICAgICAgICAgfHwgKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbnMhWzBdLmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkU2tpbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IChza2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWcpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IGFzeW5jRmluZCh0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cywgYXN5bmMgc2VnbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnNlZ21lbnRJZCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVyaWVuY2UgPSBleHBlcmllbmNlcy5maW5kKGV4cGVyaWVuY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVyaWVuY2UudHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlKS5zZWdtZW50LmlkID09PSBzZWdtZW50LnNlZ21lbnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVyaWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVyaWVuY2Ugbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRFeHBlcmllbmNlID0gZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2VnbWVudCA9ICh0eXBlZEV4cGVyaWVuY2Uuc2VnbWVudCBhcyBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50RnVuY3Rpb24gPSAoaG9va3MgPyBob29rcyA6IHt9KVt0eXBlZFNlZ21lbnQuZnVuY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VnbWVudEZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2VnbWVudElkOiR7c2VnbWVudC5zZWdtZW50SWR9LCAke3R5cGVkU2VnbWVudC5mdW5jdGlvbn0gZnVuY3Rpb24gbm90IHByb3ZpZGVkICFgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3RvcihzZWdtZW50LnNraW5TZWxlY3RvciwgZXhwZXJpZW5jZXMpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnIC8vVE9ET1xuICAgIH1cblxuICAgIHByaXZhdGUgcnVuU2tpblNlbGVjdG9yID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgaG9va3M/OiBsb2FkZXJIb29rcykgPT4ge1xuICAgICAgICBjb25zdCBza2luSWQgPSBhd2FpdCB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLCBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcywgaG9va3MpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Q29uZmlnLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRlckhvb2tzPzogbG9hZGVySG9va3M7XG5cbiAgICBwdWJsaWMgbG9hZENvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IFJlZiwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOlxuICAgICAgICBQcm9taXNlPFQ+ID0+IHtcblxuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNvbnRhaW5lciB3YXMgZm91bmQgZm9yIHRoaXMgY29tcG9uZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdmVycmlkZGVuQ29uZmlnID0gYXdhaXQgY2hlY2tNeW9wT3ZlcnJpZGUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgaWYgKG92ZXJyaWRkZW5Db25maWcpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGxvZ1xuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gb3ZlcnJpZGRlbkNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKCFjb250YWluZXIuX19ub25Qcm94aWVkKSB7XG4gICAgICAgIC8vICAgICBjb25zdCByZWZDb21wb25lbnQgPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgTXlvcFJlZkNvbXBvbmVudCk7XG4gICAgICAgIC8vICAgICAvL2lmIHdlIGdvdCBsb2FkQ29tcG9uZW50IG92ZXIgTXlvcFJlZkNvbXBvbmVudFxuICAgICAgICAvLyAgICAgaWYgKHJlZkNvbXBvbmVudC5pZCAmJiByZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIHJlZkNvbXBvbmVudC5yZWYsIG9wdGlvbnMpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIGxldCByb290Q29tcG9uZW50OiBJTXlvcENvbXBvbmVudCA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgLy8gICAgICAgICAvLyB3aGlsZSghcm9vdENvbXBvbmVudC5lbGVtZW50ICYmIHJvb3RDb21wb25lbnQucGFyZW50KXtcbiAgICAgICAgLy8gICAgICAgICAvLyAgICAgcm9vdENvbXBvbmVudCA9IHJvb3RDb21wb25lbnQucGFyZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gfVxuICAgICAgICAvLyAgICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gLy93aGF0IG5vdyA/XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBjb25zdCBob29rcyA9IHsuLi4odGhpcy5sb2FkZXJIb29rcyA/PyB7fSksIC4uLihvcHRpb25zPy5ob29rcyA/PyB7fSl9O1xuXG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnRhaW5lciBhcyBSZWY7XG4gICAgICAgIGlmIChyZWYubXlvcCkge1xuICAgICAgICAgICAgaWYgKHJlZi5jb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IHsuLi5jb21wb25lbnRDb25maWd9O1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Q29uZmlnLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNraW46IHNlbGVjdGVkU2tpblxuICAgICAgICAgICAgICAgICAgICAvLyAgc2tpbnM6IFtzZWxlY3RlZFNraW5dXG4gICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob29rc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudDxUPihyZWYsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNvbm5lY3QgcmVmcyBhbmQgcHJvcHMgaW5zb2RlIGNyZWF0ZVJlZkNvbXBvbmVudCwgZWxzZXdoZXJlIGl0cyBub3QgcmVhbGx5IDxUPlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9hZCBjb21wb25lbnQgZ290IGEgZGV0YWNoZWQgcmVmLicpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIGNob29zZSBza2luIG9uIHJ1bnRpbWUgLi4uXG4gICAgICAgICAqICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGVcbiAgICAgICAgICovXG5cbiAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50TG9hZGVyID0gdGhpcy5jb21wb25lbnRzTG9hZGVycy5maW5kKGxvYWRlciA9PiBsb2FkZXIudHlwZSA9PT0gc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlKTtcblxuICAgICAgICBpZiAoIWNvbXBvbmVudExvYWRlcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxvYWRlciBcIiR7c2VsZWN0ZWRTa2luLmxvYWRlci50eXBlfVwiIHdhcyBmb3VuZCBmb3IgY29tcG9uZW50YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBsb2FkZWQgd2ViY29tcG9uZW50IG1vZHVsZXMgdG8gZm9sbG93aW5nIGxpbmUgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGluaXQgbWVzc2FnZSBmbG93XG4gICAgICAgIGxldCBjb21wb25lbnQgPSBhd2FpdCBjb21wb25lbnRMb2FkZXIubG9hZChjb21wb25lbnRDb25maWcudHlwZSwgc2VsZWN0ZWRTa2luLCBjb250YWluZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRPRE8gOiB3aGVuIHRoaXMgaXMgbm90IHRydWUgP1xuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LnB1c2goY29tcG9uZW50KVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIHRydWUgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5jb25uZWN0UHJvcHMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIHR5cGUgZmllbGQgY29uZGl0aW9uYWwgdHlwZSBpbmZlciBcInN0cmluZ1wiID4gc3RyaW5nLCBcIm51bWJlclwiID4gbnVtYmVyLCBldGMuLi5cbiAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbm5lY3RQcm9wcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZy50eXBlLnByb3BzLCBzZWxlY3RlZFNraW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2Ugb3B0aW9uYWw/XG4gICAgICAgICAgICAvL1RPRE8gOiBmaXggaXNzdWVzIHdpdGggdGltZW91dCBhbmQgd3JvbmcgcmVmIG5hbWVzIGZyb20gY29uZmlnIHZzIGN1cnJlbnQgc2tpblxuICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gVE9PRCA6IHRocm93ID9cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnM/LnNraXBJbml0KVxuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQgYXMgVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmF2aWdhdGUgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIG5ld0NvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgb3B0aW9ucz86IG5hdmlnYXRpb25PcHRpb25zKSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdmlnYXRpbmcgb24gcmVtb3RlIHJlZiBjb21wb25lbnRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBpZiAob3B0aW9ucz8uaW5wbGFjZSkge1xuICAgICAgICAvLyAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCBuZXdDb21wb25lbnQuaW5pdGlhdGVkKCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgLy8gICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcuLi4nKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnN0YWdlZCkge1xuICAgICAgICAgICAgLy9jb25zdCBzZWxlY3RlZFNraW4gPSB0aGlzLnJ1blNraW5TZWxlY3RvcihuZXdDb21wb25lbnRDb25maWcpXG4gICAgICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge2RpcmVjdGlvbjogJ2FmdGVyJywgY2hpbGQ6IGNvbXBvbmVudC5lbGVtZW50IX0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG5cbiAgICAgICAgICAgIG5ld0NvbXBvbmVudC5zaG93KCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gY29tcG9uZW50LmVsZW1lbnQhLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFwiYmVmb3JlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBuYXZpZ2F0aW9uT3B0aW9ucyA9IHtcbiAgICBzdGFnZWQ/OiBib29sZWFuLFxuICAgIC8vaW5wbGFjZT86IGJvb2xlYW4sXG4gICAgaW5pdD86IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG59ICYgbG9hZGVyT3B0aW9uc1xuXG50eXBlIHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvbiA9ICdiZWZvcmUnIHwgJ2FmdGVyJztcblxuXG5leHBvcnQgdHlwZSBsb2FkZXJIb29rcyA9IHtcbiAgICBhZnRlclNraW5TZWxlY3RlZD86IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiBQcm9taXNlPElTa2luQ29uZmlnPlxufSAmXG4gICAgLy8gc2VnbWVudGF0aW9uIGhvb2tzXG4gICAgKHsgW2tleTogc3RyaW5nXTogKCkgPT4gUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW4gfSB8IHt9KVxuXG4vL1RPRE86IHN1cHBvcnQgc2VyaWFsaXphYmxlIHZlcnNpb24gb2YgdGhhdCBvYmplY3RcbmV4cG9ydCBpbnRlcmZhY2UgcmVsYXRpdmVMb2FkQ29uZmlnIHtcbiAgICAvL0lmIHRoaXMgaXMgbnVsbCwgdGhlbiBuZXdOb2RlIGlzIGluc2VydGVkIGF0IHRoZSBlbmQgb2Ygbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgIC8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvaW5zZXJ0QmVmb3JlXG4gICAgY2hpbGQ6IENoaWxkTm9kZSB8IG51bGxcbiAgICBkaXJlY3Rpb246IHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnZpcm9ubWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbnR5cGUgRWxlbWVudEF0dHJpYnV0ZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIGxvYWRlck9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgaGlkZGVuPzogYm9vbGVhblxuICAgIGNvbm5lY3RQcm9wcz86IGJvb2xlYW5cbiAgICB0aW1lb3V0PzogbnVtYmVyXG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG4gICAgcmVsYXRpdmU/OiByZWxhdGl2ZUxvYWRDb25maWdcbiAgICBob29rcz86IGxvYWRlckhvb2tzXG4gICAgZWxlbWVudEF0dHJpYnV0ZXM/OiBFbGVtZW50QXR0cmlidXRlc1xuICAgIF9lbnZpcm9ubWVudD86IElFbnZpcm9ubWVudFxuICAgIF9oYXNQYXJlbnQ/OiBib29sZWFuXG4gICAgX2luc3BlY3Rpb24/OiBib29sZWFuXG4gICAgZGF0YT86IGFueVxuICAgIC8qKlxuICAgICAqIFJhdyBDU1MgaW5qZWN0ZWQgaW50byB0aGUgY29tcG9uZW50J3MgaWZyYW1lIDxoZWFkPiBiZWZvcmUgZmlyc3QgcGFpbnQuXG4gICAgICogQXBwZW5kZWQgbGFzdCBzbyBpdCBvdmVycmlkZXMgdGhlIGNvbXBvbmVudCdzIG93biBzdHlsZXMgdmlhIGNhc2NhZGUgb3JkZXIuXG4gICAgICogVXNlZnVsIGZvciB0aGVtaW5nIHYyIChIVE1MKSBjb21wb25lbnRzIFx1MjAxNCBjb2xvcnMsIGZvbnRzLCBzcGFjaW5nLCBldGMuXG4gICAgICovXG4gICAgaW5qZWN0Q3NzPzogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQ29udHJvbCBpZnJhbWUgYXV0by1zaXppbmcgYmVoYXZpb3IuXG4gICAgICogLSB0cnVlIChkZWZhdWx0KTogaWZyYW1lIGF1dG8tc2l6ZXMgdG8gY29udGVudCBoZWlnaHQsIHdpZHRoIGZpbGxzIHBhcmVudC5cbiAgICAgKiAtIGZhbHNlOiBubyBzaXppbmcgbG9naWMgcnVucy4gTm8gb2JzZXJ2ZXJzLCBubyBtZWFzdXJlbWVudHMsIG5vIHN0eWxlIGNoYW5nZXMuXG4gICAgICogICBUaGUgaWZyYW1lIHN0YXlzIGF0IHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgdGhlIGNvbnRhaW5lci5cbiAgICAgKiAgIFRoZSBob3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucy5cbiAgICAgKi9cbiAgICBhdXRvU2l6ZT86IGJvb2xlYW5cblxuICAgIC8qKlxuICAgICAqIFBlci1jYWxsIHJlbmRlciBwb2xpY3kuIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgbGV0cyBhblxuICAgICAqIGFwcCByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgKG9yIGZ1cnRoZXIgcmVzdHJpY3QpIHNwZWNpZmljIGxvYWRDb21wb25lbnQgY2FsbHMuXG4gICAgICovXG4gICAgcmVuZGVyUG9saWN5PzogUmVuZGVyUG9saWN5XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBmdWxsIGlzb2xhdGlvbiBmb3IgYW4gaW5saW5lLUhUTUwgKGxvY2FsRnJhbWUpIGNvbXBvbmVudDogc2FuZGJveGVkLFxuICAgICAqIGNyb3NzLW9yaWdpbiBpZnJhbWUgd2l0aCBubyBob3N0LWRvY3VtZW50IGFjY2Vzcy4gQSByZW5kZXIgcG9saWN5IHJldHVybmluZ1xuICAgICAqICdpc29sYXRlZElmcmFtZScgaGFzIHRoZSBzYW1lIGVmZmVjdC5cbiAgICAgKi9cbiAgICBpc29sYXRpb24/OiBib29sZWFuXG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIFRoZSBvcHQtaW4sIHJlYWNoYWJsZSB3aXRoIG5vIGltcG9ydCBhbmQgbm8gYnVpbGQgY2hhbmdlIG9uIHRoZSBob3N0IHBhZ2U6XG4vL1xuLy8gICBteW9wLmRlbGl2ZXJ5KHsgbWluaWZ5OiB0cnVlLCBjYWNoZTogdHJ1ZSB9KTsgICAvLyBsYW5lICsgdGhlIGNsaWVudCB3aW5kb3dcbi8vICAgbXlvcC5kZWxpdmVyeS5zdGF0cygpOyAgICAgICAgICAgICAgICAvLyB3aGF0IGFuc3dlcmVkLCBhbmQgaG93IG9mdGVuIGl0IGZlbGwgYmFja1xuLy8gICBteW9wLmRlbGl2ZXJ5Lm9mZigpOyAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gdG9kYXkncyBob3N0LCBubyByZWxvYWRcbi8vXG4vLyBBdHRhY2hlZCBoZXJlIHJhdGhlciB0aGFuIGV4cG9ydGVkIG9ubHkgYXMgYSBtb2R1bGUgZnVuY3Rpb24gYmVjYXVzZSB0aGUgaG9zdCBhcHAgdGhhdFxuLy8gb3B0cyBpbiBpcyBvZnRlbiBsb2FkaW5nIHRoZSBTREsgZnJvbSBhIHNjcmlwdCB0YWcsIHdoZXJlIGBpbXBvcnRgIGlzIG5vdCBhdmFpbGFibGUuXG5pZiAod2luZG93Lm15b3AgJiYgISh3aW5kb3cubXlvcCBhcyBhbnkpLmRlbGl2ZXJ5KSB7XG4gICAgY29uc3QgYXBpOiBhbnkgPSAob3B0cz86IHttaW5pZnk/OiBib29sZWFuOyBob3N0Pzogc3RyaW5nIHwgbnVsbH0pID0+IGRlbGl2ZXJ5KG9wdHMpO1xuICAgIGFwaS5zdGF0cyA9IGRlbGl2ZXJ5U3RhdHM7XG4gICAgYXBpLm9mZiA9IGRlbGl2ZXJ5T2ZmO1xuICAgIGFwaS5yZWZyZXNoID0gZGVsaXZlcnlSZWZyZXNoO1xuICAgICh3aW5kb3cubXlvcCBhcyBhbnkpLmRlbGl2ZXJ5ID0gYXBpO1xufVxuXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3QgaG9zdFNESzogSG9zdFNESyA9IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ2hvc3RTREsnLCBob3N0U0RLKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBteW9wOiB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXzogc3RyaW5nLFxuICAgICAgICAgICAgaG9zdFNESzogSG9zdFNESyxcbiAgICAgICAgICAgIElmcmFtZVNESzogSW5zdGFuY2VUeXBlPHR5cGVvZiBJZnJhbWVTREs+XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLyoqXG4gKiBNeW9wIExvYWRlciAtIFNoYXJlZCBsb2FkZXIvZmFsbGJhY2sgVUkgZm9yIGhvc3QgZnJhbWV3b3Jrc1xuICogRnJhbWV3b3JrLWFnbm9zdGljIGltcGxlbWVudGF0aW9uIHVzaW5nIHB1cmUgRE9NXG4gKi9cblxuLy8gTXlvcCBMb2dvIFNWRyBwYXRoXG5jb25zdCBNWU9QX0xPR09fUEFUSCA9XG4gIFwiTTE1MS40MzggMi43MTY4QzE3Ny42MjUgMi43NjA0MiAyNDguMTc5IDQuMjgzMiAzMDAuNCA1Ni43NDQxQzM1MC42NzEgMTA3LjI0NSAzNjQuNDQgMTE0LjQ1MiAzODkuOTY3IDExOS4yMTFDMzkyLjU3NiAxMTkuNDM2IDM5Ny40NzIgMTE5LjM5NCA0MDAuODAyIDExNi41MjFDNDAzLjAxMSAxMTQuNjE0IDQwMy45MjEgMTA5LjUxOCA0MDQuMjY1IDEwNC42MjdWNS45NTk5NkM0MDQuMjY1IDQuODU1NTYgNDA1LjE2IDMuOTYwMjMgNDA2LjI2NSAzLjk1OTk2SDUyMi43MTFDNTIzLjgxNSAzLjk1OTk2IDUyNC43MTEgNC44NTUzOSA1MjQuNzExIDUuOTU5OTZWMTIyLjQwNUM1MjQuNzExIDEyMy41MSA1MjMuODE1IDEyNC40MDUgNTIyLjcxMSAxMjQuNDA1SDQyMS45OThDNDE4LjU3OSAxMjQuNzI4IDQxMy44NTIgMTI1LjYyNyA0MTAuOTc0IDEyOC4wOTVDNDA3Ljg3OSAxMzAuNzQ4IDQwNy4wNDIgMTM3LjgwNSA0MDYuODQ1IDE0Mi42NjFWMjQwLjQxNEM0MDYuODQ1IDI0MS40MzYgNDA2LjExMSAyNDIuMjkyIDQwNS4wOTMgMjQyLjM4QzM2Ni41NDggMjQ1LjcxNyAyNzcuMDc5IDIyOC40NjIgMjM1LjgzNyAxNzMuNjY4QzIwMi45MDkgMTI5LjkxOSAxNzMuODgyIDEyMi40NzQgMTUxLjQ1OCAxMjIuMDc3QzE1MC4zNTQgMTIyLjA1OCAxNDkuNDU5IDEyMS4xNjQgMTQ5LjQ1OSAxMjAuMDZWNC43MTU4MkMxNDkuNDU5IDMuNjExNCAxNTAuMzM0IDIuNzE1MTkgMTUxLjQzOCAyLjcxNjhaTTYyLjIwMzEgMEM5Ni41NTY2IDAuMDAwMjEzMTQ4IDEyNC40MDUgMjcuODQ5NiAxMjQuNDA1IDYyLjIwMzFDMTI0LjQwNSA5Ni41NTY0IDk2LjU1NjQgMTI0LjQwNSA2Mi4yMDMxIDEyNC40MDVDMjcuODQ5NiAxMjQuNDA1IDAuMDAwMjEzMTc1IDk2LjU1NjYgMCA2Mi4yMDMxQzAgMjcuODQ5NSAyNy44NDk1IDAgNjIuMjAzMSAwWlwiO1xuXG4vLyBTdHlsZSBjb25zdGFudHNcbmV4cG9ydCBjb25zdCBMT0FERVJfR1JBRElFTlQgPVxuICBcImxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNGRjg2NTEgMCUsICNGRkJFQTggNTAlLCAjQTM5N0Y1IDEwMCUpXCI7XG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfR1JBRElFTlQgPVxuICBcImxpbmVhci1ncmFkaWVudCgxMzVkZWcsICM5Q0EzQUYgMCUsICNEMUQ1REIgNTAlLCAjRTVFN0VCIDEwMCUpXCI7XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgTXlvcCBsb2dvIFNWRyBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNeW9wTG9nb1N2ZygpOiBTVkdTVkdFbGVtZW50IHtcbiAgY29uc3Qgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIjgwXCIpO1xuICBzdmcuc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBcIjAgMCA1MjUgMjQzXCIpO1xuICBzdmcuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIm5vbmVcIik7XG5cbiAgY29uc3QgcGF0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIE1ZT1BfTE9HT19QQVRIKTtcbiAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwid2hpdGVcIik7XG5cbiAgc3ZnLmFwcGVuZENoaWxkKHBhdGgpO1xuICByZXR1cm4gc3ZnO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGlubGluZSBIVE1MIHN0cmluZyBmb3IgdGhlIE15b3AgbG9nbyBTVkdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE15b3BMb2dvSHRtbCgpOiBzdHJpbmcge1xuICByZXR1cm4gYDxzdmcgd2lkdGg9XCI4MFwiIHZpZXdCb3g9XCIwIDAgNTI1IDI0M1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgIDxwYXRoIGQ9XCIke01ZT1BfTE9HT19QQVRIfVwiIGZpbGw9XCJ3aGl0ZVwiLz5cbiAgPC9zdmc+YDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmxpbmUgc3R5bGVzIGZvciB0aGUgbG9hZGVyIGNvbnRhaW5lclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9hZGVyU3R5bGVzKGZhZGVEdXJhdGlvbjogbnVtYmVyID0gMjAwKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHotaW5kZXg6IDE7XG4gICAgYmFja2dyb3VuZDogJHtMT0FERVJfR1JBRElFTlR9O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5ICR7ZmFkZUR1cmF0aW9ufW1zIGVhc2Utb3V0O1xuICBgO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGlubGluZSBzdHlsZXMgZm9yIHRoZSBmYWxsYmFjayBjb250YWluZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZhbGxiYWNrU3R5bGVzKCk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBiYWNrZ3JvdW5kOiAke0ZBTExCQUNLX0dSQURJRU5UfTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxvYWRlciBET00gZWxlbWVudCB3aXRoIHRoZSBNeW9wIGJyYW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2FkZXJFbGVtZW50KGZhZGVEdXJhdGlvbjogbnVtYmVyID0gMjAwKTogSFRNTERpdkVsZW1lbnQge1xuICBjb25zdCBsb2FkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBsb2FkZXIuY2xhc3NOYW1lID0gXCJteW9wLWxvYWRlclwiO1xuICBsb2FkZXIuc3R5bGUuY3NzVGV4dCA9IGdldExvYWRlclN0eWxlcyhmYWRlRHVyYXRpb24pO1xuICBsb2FkZXIuYXBwZW5kQ2hpbGQoY3JlYXRlTXlvcExvZ29TdmcoKSk7XG4gIHJldHVybiBsb2FkZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZhbGxiYWNrIERPTSBlbGVtZW50IHdpdGggdGhlIE15b3AgYnJhbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZhbGxiYWNrRWxlbWVudCgpOiBIVE1MRGl2RWxlbWVudCB7XG4gIGNvbnN0IGZhbGxiYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgZmFsbGJhY2suY2xhc3NOYW1lID0gXCJteW9wLWZhbGxiYWNrXCI7XG4gIGZhbGxiYWNrLnN0eWxlLmNzc1RleHQgPSBnZXRGYWxsYmFja1N0eWxlcygpO1xuICBmYWxsYmFjay5hcHBlbmRDaGlsZChjcmVhdGVNeW9wTG9nb1N2ZygpKTtcbiAgcmV0dXJuIGZhbGxiYWNrO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbXBsZXRlIGxvYWRlciBIVE1MIGFzIGEgc3RyaW5nIChmb3IgdXNlIGluIHRlbXBsYXRlcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRlckh0bWwoZmFkZUR1cmF0aW9uOiBudW1iZXIgPSAyMDApOiBzdHJpbmcge1xuICByZXR1cm4gYDxkaXYgY2xhc3M9XCJteW9wLWxvYWRlclwiIHN0eWxlPVwiJHtnZXRMb2FkZXJTdHlsZXMoZmFkZUR1cmF0aW9uKS5yZXBsYWNlKC9cXG4vZywgXCIgXCIpLnJlcGxhY2UoL1xccysvZywgXCIgXCIpLnRyaW0oKX1cIj5cbiAgICAke2dldE15b3BMb2dvSHRtbCgpfVxuICA8L2Rpdj5gO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbXBsZXRlIGZhbGxiYWNrIEhUTUwgYXMgYSBzdHJpbmcgKGZvciB1c2UgaW4gdGVtcGxhdGVzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmFsbGJhY2tIdG1sKCk6IHN0cmluZyB7XG4gIHJldHVybiBgPGRpdiBjbGFzcz1cIm15b3AtZmFsbGJhY2tcIiBzdHlsZT1cIiR7Z2V0RmFsbGJhY2tTdHlsZXMoKS5yZXBsYWNlKC9cXG4vZywgXCIgXCIpLnJlcGxhY2UoL1xccysvZywgXCIgXCIpLnRyaW0oKX1cIj5cbiAgICAke2dldE15b3BMb2dvSHRtbCgpfVxuICA8L2Rpdj5gO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgbG9hZGVyIG9wdGlvbnMgdXNlZCBieSBob3N0IGZyYW1ld29ya3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNeW9wTG9hZGVyT3B0aW9ucyB7XG4gIC8qKiBGYWRlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMjAwKSAqL1xuICBmYWRlRHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKiBJbml0aWFsIG9wYWNpdHkgKGRlZmF1bHQ6IDEpICovXG4gIG9wYWNpdHk/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ1NTLWluLUpTIHN0eWxlIG9iamVjdHMgZm9yIGZyYW1ld29ya3MgdGhhdCBzdXBwb3J0IHRoZW1cbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRlclN0eWxlT2JqZWN0ID0ge1xuICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiIGFzIGNvbnN0LFxuICB0b3A6IDAsXG4gIGxlZnQ6IDAsXG4gIHJpZ2h0OiAwLFxuICBib3R0b206IDAsXG4gIHpJbmRleDogMSxcbiAgYmFja2dyb3VuZDogTE9BREVSX0dSQURJRU5ULFxuICBkaXNwbGF5OiBcImZsZXhcIixcbiAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG59O1xuXG5leHBvcnQgY29uc3QgZmFsbGJhY2tTdHlsZU9iamVjdCA9IHtcbiAgcG9zaXRpb246IFwiYWJzb2x1dGVcIiBhcyBjb25zdCxcbiAgdG9wOiAwLFxuICBsZWZ0OiAwLFxuICByaWdodDogMCxcbiAgYm90dG9tOiAwLFxuICBiYWNrZ3JvdW5kOiBGQUxMQkFDS19HUkFESUVOVCxcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxufTtcblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5lclN0eWxlT2JqZWN0ID0ge1xuICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiIGFzIGNvbnN0LFxuICB0b3A6IDAsXG4gIGxlZnQ6IDAsXG4gIHJpZ2h0OiAwLFxuICBib3R0b206IDAsXG4gIHpJbmRleDogMSxcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBTyxJQUFNLGlCQUFpQjtBQUN2QixJQUFNLFlBQVk7QUFHbEIsSUFBTSxzQkFBc0IsQ0FBQyxZQUFvQixXQUFnQjtBQUVwRSxNQUFJLE9BQU8sY0FBYyxLQUFLLE9BQU8sY0FBYyxFQUFFLFVBQVUsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEVBQUUsU0FBUyxHQUFHO0FBRS9HLFdBQU8sY0FBYyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsRUFBQyxDQUFDLFVBQVUsR0FBRyxPQUFNLENBQUM7QUFBQSxFQUN4RSxPQUFPO0FBQUEsRUFFUDtBQUNKOzs7QUNSTyxJQUFNLGVBQWU7QUFBQTtBQUFBLEVBRXhCLGVBQWU7QUFBQSxFQUNmLGdCQUFnQjtBQUFBLEVBQ2hCLGVBQWU7QUFBQSxFQUNmLGtCQUFrQjtBQUFBLEVBRWxCLHFCQUFxQjtBQUFBLEVBQ3JCLG9CQUFvQjtBQUFBLEVBQ3BCLHlCQUF5QjtBQUFBLEVBRXpCLHdCQUF3QjtBQUFBLEVBRXhCLDJCQUEyQjtBQUFBLEVBQzNCLHVCQUF1QjtBQUFBLEVBRXZCLDZCQUE2QjtBQUFBLEVBQzdCLG9CQUFvQjtBQUFBLEVBRXBCLDBCQUEwQjtBQUFBLEVBQzFCLHVCQUF1QjtBQUFBLEVBRXZCLGdCQUFnQjtBQUFBO0FBQUEsRUFHaEIsMEJBQTBCO0FBQUEsRUFDMUIsOEJBQThCO0FBQUEsRUFDOUIsNEJBQTRCO0FBQUEsRUFFNUIsa0JBQWtCO0FBQUE7QUFBQSxFQUdsQixJQUFJO0FBQUEsSUFDQSwyQkFBMkI7QUFBQSxJQUMzQixzQkFB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RUFDbEMsVUFBVTtBQUFBLEVBQ1YsS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsZ0JBQWdCO0FBQUEsRUFDaEIsWUFBWTtBQUNkOyIsCiAgIm5hbWVzIjogWyJSZXBsYXlNZXNzYWdlS2V5IiwgIm1hdGNoIiwgInNjcmlwdElucHV0cyIsICJzY3JpcHRJbnB1dHMiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAic2VlbiIsICJ0YXJnZXQiLCAibWFrZVNlcmlhbGl6YWJsZSIsICJoZWlnaHQiLCAid2lkdGgiLCAiZSIsICJob3N0U0RLIiwgImVsZW1lbnQiLCAic2VlbiIsICJzZGsiLCAiZG9tSWQiLCAic2RrIiwgInNlZW4iLCAic2tpbiIsICJjb21wb25lbnQiLCAiX2EiLCAic2VnbWVudCIsICJleHBlcmllbmNlIiwgInNlbGVjdGVkU2tpbiJdCn0K