genassist-chat-react 1.0.31 → 1.0.32-rc.1

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.
@@ -1,6 +1,7 @@
1
1
  import { ChatMessage, Attachment } from "../types";
2
2
  export interface UseChatProps {
3
3
  baseUrl: string;
4
+ websocketUrl?: string;
4
5
  apiKey: string;
5
6
  tenant?: string | undefined;
6
7
  metadata?: Record<string, any>;
@@ -17,7 +18,7 @@ export interface UseChatProps {
17
18
  chatInputMetadata?: Record<string, any>;
18
19
  }) => void;
19
20
  }
20
- export declare const useChat: ({ baseUrl, apiKey, tenant, metadata, useWs, usePoll, language, onError, onTakeover, onFinalize, serverUnavailableMessage, serverUnavailableContactUrl, serverUnavailableContactLabel, onConfigLoaded, }: UseChatProps) => {
21
+ export declare const useChat: ({ baseUrl, websocketUrl, apiKey, tenant, metadata, useWs, usePoll, language, onError, onTakeover, onFinalize, serverUnavailableMessage, serverUnavailableContactUrl, serverUnavailableContactLabel, onConfigLoaded, }: UseChatProps) => {
21
22
  messages: ChatMessage[];
22
23
  isLoading: boolean;
23
24
  sendMessage: (text: string, files?: File[], extraMetadata?: Record<string, any>, reCaptchaToken?: string) => Promise<void>;
@@ -74,7 +74,7 @@ function isNetworkOrServerError(error) {
74
74
  return typeof status === "number" && status >= 500;
75
75
  }
76
76
  export var useChat = function (_a) {
77
- var baseUrl = _a.baseUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, _b = _a.useWs, useWs = _b === void 0 ? true : _b, _c = _a.usePoll, usePoll = _c === void 0 ? false : _c, language = _a.language, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize, serverUnavailableMessage = _a.serverUnavailableMessage, serverUnavailableContactUrl = _a.serverUnavailableContactUrl, serverUnavailableContactLabel = _a.serverUnavailableContactLabel, onConfigLoaded = _a.onConfigLoaded;
77
+ var baseUrl = _a.baseUrl, websocketUrl = _a.websocketUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, _b = _a.useWs, useWs = _b === void 0 ? true : _b, _c = _a.usePoll, usePoll = _c === void 0 ? false : _c, language = _a.language, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize, serverUnavailableMessage = _a.serverUnavailableMessage, serverUnavailableContactUrl = _a.serverUnavailableContactUrl, serverUnavailableContactLabel = _a.serverUnavailableContactLabel, onConfigLoaded = _a.onConfigLoaded;
78
78
  var _d = useState([]), messages = _d[0], setMessages = _d[1];
79
79
  var _e = useState(false), isLoading = _e[0], setIsLoading = _e[1];
80
80
  var _f = useState([]), preloadedAttachments = _f[0], setPreloadedAttachments = _f[1];
@@ -143,6 +143,7 @@ export var useChat = function (_a) {
143
143
  var metadataString = useMemo(function () { return JSON.stringify(metadata || {}); }, [metadata]);
144
144
  var metadataRef = useRef(metadataString);
145
145
  var prevBaseUrlRef = useRef(baseUrl);
146
+ var prevWebsocketUrlRef = useRef(websocketUrl);
146
147
  var prevApiKeyRef = useRef(apiKey);
147
148
  var prevTenantRef = useRef(tenant);
148
149
  var prevUseWsRef = useRef(useWs);
@@ -177,6 +178,7 @@ export var useChat = function (_a) {
177
178
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
178
179
  var metadataChanged = metadataRef.current !== metadataString;
179
180
  var baseUrlChanged = prevBaseUrlRef.current !== baseUrl;
181
+ var websocketUrlChanged = prevWebsocketUrlRef.current !== websocketUrl;
180
182
  var apiKeyChanged = prevApiKeyRef.current !== apiKey;
181
183
  var tenantChanged = prevTenantRef.current !== tenant;
182
184
  var useWsChanged = prevUseWsRef.current !== useWs;
@@ -184,6 +186,7 @@ export var useChat = function (_a) {
184
186
  // Only re-initialize for connection-related changes, NOT for metadata changes
185
187
  var needsReinit = !chatServiceRef.current ||
186
188
  baseUrlChanged ||
189
+ websocketUrlChanged ||
187
190
  apiKeyChanged ||
188
191
  tenantChanged ||
189
192
  useWsChanged;
@@ -191,6 +194,8 @@ export var useChat = function (_a) {
191
194
  // Update refs
192
195
  if (baseUrlChanged)
193
196
  prevBaseUrlRef.current = baseUrl;
197
+ if (websocketUrlChanged)
198
+ prevWebsocketUrlRef.current = websocketUrl;
194
199
  if (apiKeyChanged)
195
200
  prevApiKeyRef.current = apiKey;
196
201
  if (tenantChanged)
@@ -207,7 +212,7 @@ export var useChat = function (_a) {
207
212
  chatServiceRef.current.disconnect();
208
213
  chatServiceRef.current.setWelcomeDataHandler(null);
209
214
  }
210
- chatServiceRef.current = new ChatService(baseUrl, apiKey, metadata, tenant, language, useWs, usePoll);
215
+ chatServiceRef.current = new ChatService(baseUrl, websocketUrl, apiKey, metadata, tenant, language, useWs, usePoll);
211
216
  // Set up handlers
212
217
  chatServiceRef.current.setMessageHandler(function (message) {
213
218
  var normalizedMessage = __assign(__assign({}, message), { create_time: !message.create_time || isNaN(message.create_time)
@@ -332,6 +337,7 @@ export var useChat = function (_a) {
332
337
  };
333
338
  }, [
334
339
  baseUrl,
340
+ websocketUrl,
335
341
  apiKey,
336
342
  tenant,
337
343
  metadataString,
@@ -882,4 +888,4 @@ export var useChat = function (_a) {
882
888
  chatInputMetadata: chatInputMetadata,
883
889
  };
884
890
  };
885
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBMEJ0RCxJQUFNLGtDQUFrQyxHQUN0QyxpRUFBaUUsQ0FBQztBQUNwRSxJQUFNLHdDQUF3QyxHQUFHLGlCQUFpQixDQUFDO0FBRW5FLFNBQVMsc0JBQXNCLENBQUMsS0FBVTs7SUFDeEMsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsSUFBTSxJQUFJLEdBQUcsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksQ0FBQztRQUN6QixJQUNFLElBQUksS0FBSyxhQUFhO1lBQ3RCLElBQUksS0FBSyxjQUFjO1lBQ3ZCLElBQUksS0FBSyxXQUFXO1lBQ3BCLElBQUksS0FBSyx3QkFBd0I7WUFFakMsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxDQUFDLHdFQUF3RTtJQUN2RixDQUFDO0lBQ0QsSUFBTSxNQUFNLEdBQUcsTUFBQSxLQUFLLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUM7SUFDdEMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQU0sT0FBTyxHQUFHLFVBQUMsRUFlVDtRQWRiLE9BQU8sYUFBQSxFQUNQLE1BQU0sWUFBQSxFQUNOLE1BQU0sWUFBQSxFQUNOLFFBQVEsY0FBQSxFQUNSLGFBQVksRUFB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WCxZQUFZLGNBQUE7UUFDWixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLGVBQWUsaUJBQUE7UUFDZixlQUFlLGlCQUFBO1FBQ2YsaUJBQWlCLG1CQUFBO0tBQ2xCLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9jaGF0U2VydmljZVwiO1xuaW1wb3J0IHtcbiAgQ2hhdE1lc3NhZ2UsXG4gIEF0dGFjaG1lbnQsXG4gIE1lc3NhZ2VGZWVkYmFjayxcbiAgSW5Qcm9ncmVzc1BvbGxNZXNzYWdlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VDaGF0UHJvcHMge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIGFwaUtleTogc3RyaW5nO1xuICB0ZW5hbnQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLy8gIElmIGZhbHNlLCB0aGUgY2hhdCB3aWxsIHJ1biBpbiBIVFRQLW9ubHkgbW9kZSAobm8gV2ViU29ja2V0IGNvbm5lY3Rpb24pLlxuICB1c2VXcz86IGJvb2xlYW47XG4gIHVzZVBvbGw/OiBib29sZWFuO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgb25FcnJvcj86IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIG9uVGFrZW92ZXI/OiAoKSA9PiB2b2lkO1xuICBvbkZpbmFsaXplPzogKCkgPT4gdm9pZDtcbiAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlPzogc3RyaW5nOyAvLyBDdXN0b20gbWVzc2FnZSB3aGVuIHNlcnZlciBpcyBkb3duXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybD86IHN0cmluZzsgLy8gT3B0aW9uYWwgVVJMIGZvciBjb250YWN0L3N1cHBvcnRcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWw/OiBzdHJpbmc7IC8vIExhYmVsIGZvciB0aGUgY29udGFjdCBsaW5rXG4gIG9uQ29uZmlnTG9hZGVkPzogKHByb3BzOiB7IGNoYXRJbnB1dE1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PiB9KSA9PiB2b2lkOyAvLyBDYWxsYmFjayBmb3Igd2hlbiB0aGUgY2hhdCBpbnB1dCBtZXRhZGF0YSBpcyBsb2FkZWRcbn1cblxuY29uc3QgREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfTUVTU0FHRSA9XG4gIFwiVGhlIHNlcnZpY2UgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCI7XG5jb25zdCBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9DT05UQUNUX0xBQkVMID0gXCJDb250YWN0IHN1cHBvcnRcIjtcblxuZnVuY3Rpb24gaXNOZXR3b3JrT3JTZXJ2ZXJFcnJvcihlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gIC8vIE5vIHJlc3BvbnNlID0gbmV0d29yayBlcnJvclxuICBpZiAoIWVycm9yLnJlc3BvbnNlKSB7XG4gICAgY29uc3QgY29kZSA9IGVycm9yPy5jb2RlO1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IFwiRVJSX05FVFdPUktcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFQ09OTlJFRlVTRURcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFVElNRURPVVRcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFUlJfQ09OTkVDVElPTl9SRUZVU0VEXCJcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gYW55IHJlcXVlc3QgZXJyb3Igd2l0aG91dCByZXNwb25zZSBpcyB0cmVhdGVkIGFzIHNlcnZlci9uZXR3b3JrIGlzc3VlXG4gIH1cbiAgY29uc3Qgc3RhdHVzID0gZXJyb3IucmVzcG9uc2U/LnN0YXR1cztcbiAgcmV0dXJuIHR5cGVvZiBzdGF0dXMgPT09IFwibnVtYmVyXCIgJiYgc3RhdHVzID49IDUwMDtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXQgPSAoe1xuICBiYXNlVXJsLFxuICBhcGlLZXksXG4gIHRlbmFudCxcbiAgbWV0YWRhdGEsXG4gIHVzZVdzID0gdHJ1ZSxcbiAgdXNlUG9sbCA9IGZhbHNlLFxuICBsYW5ndWFnZSxcbiAgb25FcnJvcixcbiAgb25UYWtlb3ZlcixcbiAgb25GaW5hbGl6ZSxcbiAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICBvbkNvbmZpZ0xvYWRlZCxcbn06IFVzZUNoYXRQcm9wcykgPT4ge1xuICBjb25zdCBbbWVzc2FnZXMsIHNldE1lc3NhZ2VzXSA9IHVzZVN0YXRlPENoYXRNZXNzYWdlW10+KFtdKTtcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW3ByZWxvYWRlZEF0dGFjaG1lbnRzLCBzZXRQcmVsb2FkZWRBdHRhY2htZW50c10gPSB1c2VTdGF0ZTxcbiAgICBBdHRhY2htZW50W11cbiAgPihbXSk7XG4gIGNvbnN0IFtjb25uZWN0aW9uU3RhdGUsIHNldENvbm5lY3Rpb25TdGF0ZV0gPSB1c2VTdGF0ZTxcbiAgICBcImNvbm5lY3RpbmdcIiB8IFwiY29ubmVjdGVkXCIgfCBcImRpc2Nvbm5lY3RlZFwiXG4gID4oXCJkaXNjb25uZWN0ZWRcIik7XG4gIGNvbnN0IFtpc0FnZW50VHlwaW5nLCBzZXRJc0FnZW50VHlwaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgY2hhdFNlcnZpY2VSZWYgPSB1c2VSZWY8Q2hhdFNlcnZpY2UgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2NvbnZlcnNhdGlvbklkLCBzZXRDb252ZXJzYXRpb25JZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3Bvc3NpYmxlUXVlcmllcywgc2V0UG9zc2libGVRdWVyaWVzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt3ZWxjb21lVGl0bGUsIHNldFdlbGNvbWVUaXRsZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dlbGNvbWVJbWFnZVVybCwgc2V0V2VsY29tZUltYWdlVXJsXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbd2VsY29tZU1lc3NhZ2UsIHNldFdlbGNvbWVNZXNzYWdlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbdGhpbmtpbmdQaHJhc2VzLCBzZXRUaGlua2luZ1BocmFzZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTtcbiAgY29uc3QgW3RoaW5raW5nRGVsYXlNcywgc2V0VGhpbmtpbmdEZWxheU1zXSA9IHVzZVN0YXRlPG51bWJlcj4oMTAwMCk7XG4gIGNvbnN0IFtjaGF0SW5wdXRNZXRhZGF0YSwgc2V0Q2hhdElucHV0TWV0YWRhdGFdID0gdXNlU3RhdGU8XG4gICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgPih7fSk7XG4gIGNvbnN0IFtpc1Rha2VuT3Zlciwgc2V0SXNUYWtlbk92ZXJdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbaXNGaW5hbGl6ZWQsIHNldElzRmluYWxpemVkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyBTY29wZWQgbWVzc2FnZXMga2V5IGZvciBhcGlLZXksIGNvbnZlcnNhdGlvSWRcbiAgY29uc3QgYnVpbGRNZXNzYWdlc0tleSA9IHVzZUNhbGxiYWNrKFxuICAgIChhcGlLZXlWYWw6IHN0cmluZywgY29udklkOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoIWNvbnZJZCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gYGdlbmFzc2lzdF9jb252ZXJzYXRpb25fbWVzc2FnZXM6JHthcGlLZXlWYWx9OiR7Y29udklkfWA7XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcblxuICBjb25zdCB2YWxpZGF0ZU1lc3NhZ2VzID0gdXNlQ2FsbGJhY2soXG4gICAgKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKSA9PiB7XG4gICAgICBjb25zdCBoYXNUYWtlT3Zlck1zZyA9IG1lc3NhZ2VzLnNvbWUoKG0pID0+IG0/LnR5cGUgPT09IFwidGFrZW92ZXJcIik7XG4gICAgICBjb25zdCBoYXNGaW5hbGl6ZWRNc2cgPSBtZXNzYWdlcy5zb21lKChtKSA9PiBtPy50eXBlID09PSBcImZpbmFsaXplZFwiKTtcbiAgICAgIHNldElzVGFrZW5PdmVyKGhhc1Rha2VPdmVyTXNnKTtcbiAgICAgIHNldElzRmluYWxpemVkKGhhc0ZpbmFsaXplZE1zZyk7XG4gICAgfSxcbiAgICBbc2V0SXNUYWtlbk92ZXIsIHNldElzRmluYWxpemVkXSxcbiAgKTtcblxuICAvLyBDaGVjayBpZiBhbiBlcnJvciBpcyBhIHRva2VuIGV4cGlyYXRpb24gZXJyb3IgKDQwMSArIFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIpXG4gIGNvbnN0IGlzVG9rZW5FeHBpcmVkRXJyb3IgPSB1c2VDYWxsYmFjaygoZXJyb3I6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIGVycm9yPy5yZXNwb25zZT8uc3RhdHVzID09PSA0MDEgJiZcbiAgICAgIGVycm9yPy5yZXNwb25zZT8uZGF0YSAmJlxuICAgICAgKGVycm9yLnJlc3BvbnNlLmRhdGEuZXJyb3IgPT09IFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIgfHxcbiAgICAgICAgZXJyb3IucmVzcG9uc2UuZGF0YS5tZXNzYWdlID09PSBcIlRva2VuIGhhcyBleHBpcmVkLlwiIHx8XG4gICAgICAgICh0eXBlb2YgZXJyb3IucmVzcG9uc2UuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEuaW5jbHVkZXMoXCJUb2tlbiBoYXMgZXhwaXJlZFwiKSkpXG4gICAgKTtcbiAgfSwgW10pO1xuXG4gIC8vIFJlc2V0IGNvbnZlcnNhdGlvbiBzdGF0ZSB0byBpbml0aWFsIChlLmcuIGFmdGVyIHRva2VuIGV4cGlyYXRpb24pXG4gIGNvbnN0IHJlc2V0VG9Jbml0aWFsU3RhdGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0Q29udmVyc2F0aW9uSWQobnVsbCk7XG4gICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJkaXNjb25uZWN0ZWRcIik7XG4gICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgIHNldFdlbGNvbWVJbWFnZVVybChudWxsKTtcbiAgICBzZXRXZWxjb21lTWVzc2FnZShudWxsKTtcbiAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgIHNldFRoaW5raW5nUGhyYXNlcyhbXSk7XG4gICAgc2V0VGhpbmtpbmdEZWxheU1zKDEwMDApO1xuICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKHt9KTtcbiAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IDA7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICB9XG4gIH0sIFthcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gRGVlcCBjb21wYXJlIG1ldGFkYXRhIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtaW5pdGlhbGl6YXRpb25zXG4gIC8vIE9ubHkgcmUtaW5pdGlhbGl6ZSBpZiBtZXRhZGF0YSBhY3R1YWxseSBjaGFuZ2VzIChieSB2YWx1ZSwgbm90IHJlZmVyZW5jZSlcbiAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSB1c2VNZW1vKFxuICAgICgpID0+IEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhIHx8IHt9KSxcbiAgICBbbWV0YWRhdGFdLFxuICApO1xuICBjb25zdCBtZXRhZGF0YVJlZiA9IHVzZVJlZjxzdHJpbmc+KG1ldGFkYXRhU3RyaW5nKTtcbiAgY29uc3QgcHJldkJhc2VVcmxSZWYgPSB1c2VSZWY8c3RyaW5nPihiYXNlVXJsKTtcbiAgY29uc3QgcHJldkFwaUtleVJlZiA9IHVzZVJlZjxzdHJpbmc+KGFwaUtleSk7XG4gIGNvbnN0IHByZXZUZW5hbnRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih0ZW5hbnQpO1xuICBjb25zdCBwcmV2VXNlV3NSZWYgPSB1c2VSZWY8Ym9vbGVhbj4odXNlV3MpO1xuICBjb25zdCBwcmV2VXNlUG9sbFJlZiA9IHVzZVJlZjxib29sZWFuPih1c2VQb2xsKTtcblxuICAvLyBIZWFydGJlYXQgcG9sbGluZyBzdGF0ZSAod2hlbiBXZWJTb2NrZXQgaXMgZGlzYWJsZWQpXG4gIGNvbnN0IGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICBjb25zdCBoZWFydGJlYXRJbnRlcnZhbFJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICBjb25zdCBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICAvLyBSZWZzIHNvIHdlIG9ubHkgcnVuIHRha2VvdmVyL2ZpbmFsaXplZCBvbmNlIHBlciBjb252ZXJzYXRpb24gKGF2b2lkIHN0YWxlIGlzVGFrZW5PdmVyL2lzRmluYWxpemVkIGluIHBvbGwgY2xvc3VyZSlcbiAgY29uc3QgdGFrZW92ZXJQcm9jZXNzZWRSZWYgPSB1c2VSZWY8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBmaW5hbGl6ZWRQcm9jZXNzZWRSZWYgPSB1c2VSZWY8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIFN0b3JlIGNhbGxiYWNrcyBpbiByZWZzIHNvIHRoZXkgZG9uJ3QgdHJpZ2dlciByZS1pbml0aWFsaXphdGlvblxuICBjb25zdCBvbkVycm9yUmVmID0gdXNlUmVmKG9uRXJyb3IpO1xuICBjb25zdCBvblRha2VvdmVyUmVmID0gdXNlUmVmKG9uVGFrZW92ZXIpO1xuICBjb25zdCBvbkZpbmFsaXplUmVmID0gdXNlUmVmKG9uRmluYWxpemUpO1xuICBjb25zdCBvbkNvbmZpZ0xvYWRlZFJlZiA9IHVzZVJlZihvbkNvbmZpZ0xvYWRlZCk7XG5cbiAgLy8gVXBkYXRlIGNhbGxiYWNrIHJlZnMgd2hlbiB0aGV5IGNoYW5nZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uRXJyb3JSZWYuY3VycmVudCA9IG9uRXJyb3I7XG4gIH0sIFtvbkVycm9yXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQgPSBvblRha2VvdmVyO1xuICB9LCBbb25UYWtlb3Zlcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25GaW5hbGl6ZVJlZi5jdXJyZW50ID0gb25GaW5hbGl6ZTtcbiAgfSwgW29uRmluYWxpemVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uQ29uZmlnTG9hZGVkUmVmLmN1cnJlbnQgPSBvbkNvbmZpZ0xvYWRlZDtcbiAgfSwgW29uQ29uZmlnTG9hZGVkXSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBjaGF0IHNlcnZpY2UgLSBvbmx5IHdoZW4gYmFzZVVybCwgYXBpS2V5LCB0ZW5hbnQsIHVzZVdzLCBvciBtZXRhZGF0YSBhY3R1YWxseSBjaGFuZ2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YUNoYW5nZWQgPSBtZXRhZGF0YVJlZi5jdXJyZW50ICE9PSBtZXRhZGF0YVN0cmluZztcbiAgICBjb25zdCBiYXNlVXJsQ2hhbmdlZCA9IHByZXZCYXNlVXJsUmVmLmN1cnJlbnQgIT09IGJhc2VVcmw7XG4gICAgY29uc3QgYXBpS2V5Q2hhbmdlZCA9IHByZXZBcGlLZXlSZWYuY3VycmVudCAhPT0gYXBpS2V5O1xuICAgIGNvbnN0IHRlbmFudENoYW5nZWQgPSBwcmV2VGVuYW50UmVmLmN1cnJlbnQgIT09IHRlbmFudDtcbiAgICBjb25zdCB1c2VXc0NoYW5nZWQgPSBwcmV2VXNlV3NSZWYuY3VycmVudCAhPT0gdXNlV3M7XG4gICAgY29uc3QgdXNlUG9sbENoYW5nZWQgPSBwcmV2VXNlUG9sbFJlZi5jdXJyZW50ICE9PSB1c2VQb2xsO1xuICAgIC8vIE9ubHkgcmUtaW5pdGlhbGl6ZSBmb3IgY29ubmVjdGlvbi1yZWxhdGVkIGNoYW5nZXMsIE5PVCBmb3IgbWV0YWRhdGEgY2hhbmdlc1xuICAgIGNvbnN0IG5lZWRzUmVpbml0ID1cbiAgICAgICFjaGF0U2VydmljZVJlZi5jdXJyZW50IHx8XG4gICAgICBiYXNlVXJsQ2hhbmdlZCB8fFxuICAgICAgYXBpS2V5Q2hhbmdlZCB8fFxuICAgICAgdGVuYW50Q2hhbmdlZCB8fFxuICAgICAgdXNlV3NDaGFuZ2VkO1xuXG4gICAgaWYgKG5lZWRzUmVpbml0KSB7XG4gICAgICAvLyBVcGRhdGUgcmVmc1xuICAgICAgaWYgKGJhc2VVcmxDaGFuZ2VkKSBwcmV2QmFzZVVybFJlZi5jdXJyZW50ID0gYmFzZVVybDtcbiAgICAgIGlmIChhcGlLZXlDaGFuZ2VkKSBwcmV2QXBpS2V5UmVmLmN1cnJlbnQgPSBhcGlLZXk7XG4gICAgICBpZiAodGVuYW50Q2hhbmdlZCkgcHJldlRlbmFudFJlZi5jdXJyZW50ID0gdGVuYW50O1xuICAgICAgaWYgKHVzZVdzQ2hhbmdlZCkgcHJldlVzZVdzUmVmLmN1cnJlbnQgPSB1c2VXcztcbiAgICAgIGlmICh1c2VQb2xsQ2hhbmdlZCkgcHJldlVzZVBvbGxSZWYuY3VycmVudCA9IHVzZVBvbGw7XG4gICAgICBpZiAobWV0YWRhdGFDaGFuZ2VkKSBtZXRhZGF0YVJlZi5jdXJyZW50ID0gbWV0YWRhdGFTdHJpbmc7XG5cbiAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHNlcnZpY2UgaWYgaXQgZXhpc3RzXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldENvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoKCkgPT4ge30pO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRXZWxjb21lRGF0YUhhbmRsZXIobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQgPSBuZXcgQ2hhdFNlcnZpY2UoXG4gICAgICAgIGJhc2VVcmwsXG4gICAgICAgIGFwaUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIHRlbmFudCxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIHVzZVdzLFxuICAgICAgICB1c2VQb2xsLFxuICAgICAgKTtcblxuICAgICAgLy8gU2V0IHVwIGhhbmRsZXJzXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldE1lc3NhZ2VIYW5kbGVyKChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICBjcmVhdGVfdGltZTpcbiAgICAgICAgICAgICFtZXNzYWdlLmNyZWF0ZV90aW1lIHx8IGlzTmFOKG1lc3NhZ2UuY3JlYXRlX3RpbWUpXG4gICAgICAgICAgICAgID8gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMClcbiAgICAgICAgICAgICAgOiBtZXNzYWdlLmNyZWF0ZV90aW1lLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYWNrIGxhdGVzdCBjcmVhdGVfdGltZSB3ZSd2ZSBzZWVuIGZyb20gc2VydmVyL3dlYnNvY2tldCAoaW4gc2Vjb25kcylcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lICYmIG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lID4gMCkge1xuICAgICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBNYXRoLnJvdW5kKG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lKSAqIDEwMDAgLyAxMDAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIG1lc3NhZ2UgdG8gbWVzc2FnZXMgYXJyYXlcbiAgICAgICAgc2V0TWVzc2FnZXMoKHByZXZNZXNzYWdlcykgPT4ge1xuICAgICAgICAgIC8vIEF2b2lkIGFkZGluZyBkdXBsaWNhdGUgbWVzc2FnZXMgd2l0aCBzYW1lIG1lc3NhZ2VfaWQgYW5kIHR5cGVcbiAgICAgICAgICBpZiAobm9ybWFsaXplZE1lc3NhZ2UubWVzc2FnZV9pZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gcHJldk1lc3NhZ2VzLnNvbWUoKG0pID0+IG0ubWVzc2FnZV9pZCA9PT0gbm9ybWFsaXplZE1lc3NhZ2UubWVzc2FnZV9pZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwcmV2TWVzc2FnZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldk1lc3NhZ2VzLCBub3JtYWxpemVkTWVzc2FnZV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgdHlwaW5nIGFuaW1hdGlvbiB3aGVuIGFnZW50IG9yIHN5c3RlbSBtZXNzYWdlIGFycml2ZXNcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09IFwiYWdlbnRcIiB8fFxuICAgICAgICAgIG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09IFwic3BlY2lhbFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRUYWtlb3ZlckhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvblRha2VvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0RmluYWxpemVkSGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRmluYWxpemVSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRmluYWxpemVSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRDb25uZWN0aW9uU3RhdGVIYW5kbGVyKChzdGF0ZSkgPT4ge1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoc3RhdGUpO1xuICAgICAgICBpZiAoc3RhdGUgIT09IFwiY29ubmVjdGVkXCIpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0V2VsY29tZURhdGFIYW5kbGVyKChkYXRhKSA9PiB7XG4gICAgICAgIHNldFdlbGNvbWVUaXRsZShkYXRhLnRpdGxlID8/IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwoZGF0YS5pbWFnZVVybCA/PyBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2UoZGF0YS5tZXNzYWdlID8/IG51bGwpO1xuICAgICAgICBpZiAoZGF0YS5wb3NzaWJsZVF1ZXJpZXMgJiYgZGF0YS5wb3NzaWJsZVF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhkYXRhLnBvc3NpYmxlUXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFNlcnZlclVuYXZhaWxhYmxlQ29uZmlnKFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBmb3IgYSBzYXZlZCBjb252ZXJzYXRpb24gYW5kIGNvbm5lY3QgdG8gaXRcbiAgICAgIGNvbnN0IGNvbnZJZCA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q29udmVyc2F0aW9uSWQoKTtcbiAgICAgIGlmIChjb252SWQpIHtcbiAgICAgICAgc2V0Q29udmVyc2F0aW9uSWQoY29udklkKTtcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuaXNDb252ZXJzYXRpb25GaW5hbGl6ZWQoKSkge1xuICAgICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuY29ubmVjdFdlYlNvY2tldCgpO1xuICAgICAgICAgIGlmICghdXNlV3MpIHtcbiAgICAgICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFB1bGwgaW5pdGlhbCBzdGF0aWMgZGF0YVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzPy4oKSB8fCBbXTtcbiAgICAgICAgaWYgKHF1ZXJpZXMubGVuZ3RoKSBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgIGNvbnN0IHdlbGNvbWUgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhPy4oKTtcbiAgICAgICAgaWYgKHdlbGNvbWUpIHtcbiAgICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhpbmtpbmcgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnPy4oKTtcbiAgICAgICAgaWYgKHRoaW5raW5nKSB7XG4gICAgICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKHRoaW5raW5nLnBocmFzZXMgfHwgW10pO1xuICAgICAgICAgIHNldFRoaW5raW5nRGVsYXlNcyh0aGlua2luZy5kZWxheU1zIHx8IDEwMDApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGEgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENoYXRJbnB1dE1ldGFkYXRhPy4oKTtcbiAgICAgICAgaWYgKG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMobWV0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKG1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIG9uQ29uZmlnTG9hZGVkUmVmLmN1cnJlbnQ/Lih7IGNoYXRJbnB1dE1ldGFkYXRhOiBtZXRhID8/IHt9IH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgLy8gSnVzdCB1cGRhdGUgbWV0YWRhdGEgd2l0aG91dCByZS1pbml0aWFsaXppbmdcbiAgICAgIGlmIChtZXRhZGF0YUNoYW5nZWQpIHtcbiAgICAgICAgbWV0YWRhdGFSZWYuY3VycmVudCA9IG1ldGFkYXRhU3RyaW5nO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHdheXMgdXBkYXRlIGhhbmRsZXJzIHdoZW4gY2FsbGJhY2tzIGNoYW5nZSAod2l0aG91dCByZS1pbml0aWFsaXppbmcpXG4gICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0VGFrZW92ZXJIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25UYWtlb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25UYWtlb3ZlclJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkZpbmFsaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0U2VydmVyVW5hdmFpbGFibGVDb25maWcoXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBvbmx5IG9uIHVubW91bnRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gT25seSBjbGVhbnVwIG9uIHVubW91bnQsIG5vdCBvbiBldmVyeSBkZXBlbmRlbmN5IGNoYW5nZVxuICAgIH07XG4gIH0sIFtcbiAgICBiYXNlVXJsLFxuICAgIGFwaUtleSxcbiAgICB0ZW5hbnQsXG4gICAgbWV0YWRhdGFTdHJpbmcsXG4gICAgbGFuZ3VhZ2UsXG4gICAgdXNlV3MsXG4gICAgdXNlUG9sbCxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICBdKTtcblxuICAvLyBVcGRhdGUgbGFuZ3VhZ2Ugd2hlbiBpdCBjaGFuZ2VzICh3aXRob3V0IHJlLWluaXRpYWxpemluZyB0aGUgc2VydmljZSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRMYW5ndWFnZShsYW5ndWFnZSk7XG4gICAgfVxuICB9LCBbbGFuZ3VhZ2VdKTtcblxuICAvLyBMb2FkIG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXIgd2hlbiBhdmFpbGFibGVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSB7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBjb25zdCBwYXJzZWQ6IENoYXRNZXNzYWdlW10gPSBzdG9yZWQgPyBKU09OLnBhcnNlKHN0b3JlZCkgOiBbXTtcblxuICAgICAgc2V0TWVzc2FnZXMocGFyc2VkKTtcbiAgICAgIC8vIEluaXRpYWxpemUgbGFzdCBzZWVuIGNyZWF0ZV90aW1lIGZyb20gY2FjaGVkIG1lc3NhZ2VzXG4gICAgICBpZiAocGFyc2VkLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBtYXhDcmVhdGVUaW1lID0gTWF0aC5tYXgoXG4gICAgICAgICAgLi4ucGFyc2VkLm1hcCgobSkgPT4gKG0uY3JlYXRlX3RpbWUgPyBtLmNyZWF0ZV90aW1lIDogMCkpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgbGFzdCBzZWVuIGNyZWF0ZV90aW1lIGZyb20gY2FjaGVkIG1lc3NhZ2VzXG4gICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBNYXRoLnJvdW5kKG1heENyZWF0ZVRpbWUpICogMTAwMCAvIDEwMDA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSAwO1xuICAgIH1cbiAgfSwgW2FwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBWYWxpZGF0ZSBtZXNzYWdlcyBmb3IgdGFrZW92ZXIgYW5kIGZpbmFsaXplZFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZhbGlkYXRlTWVzc2FnZXMobWVzc2FnZXMpO1xuICB9LCBbbWVzc2FnZXNdKTtcblxuICAvLyBQZXJzaXN0IG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXJcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbbWVzc2FnZXMsIGFwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBIZWFydGJlYXQgbG9uZyBwb2xsaW5nIHdoZW4gV2ViU29ja2V0IGlzIGRpc2FibGVkIGFuZCB3ZSBoYXZlIGFuIGluLXByb2dyZXNzIGNvbnZlcnNhdGlvbi5cbiAgLy8gLSBTdGFydHMgd2l0aCBhIHNob3J0IGludGVydmFsXG4gIC8vIC0gSW5jcmVhc2VzIHRoZSBpbnRlcnZhbCBvdmVyIHRpbWUgKGV2ZXJ5IHN1Y2Nlc3NmdWwgcG9sbClcbiAgLy8gLSBSZXRyaWVzIHVwIHRvIDUgdGltZXMgb24gZXJyb3JzLCB0aGVuIHN0b3BzXG4gIGNvbnN0IEhFQVJUQkVBVF9JTklUSUFMX0lOVEVSVkFMX01TID0gMjAwMDtcbiAgY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVMgPSA1MDAwO1xuICBjb25zdCBIRUFSVEJFQVRfTUFYX0lOVEVSVkFMX01TID0gMzAwMDA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodXNlV3MgfHwgIWNvbnZlcnNhdGlvbklkIHx8IGlzRmluYWxpemVkKSByZXR1cm47XG4gICAgY29uc3Qgc3ZjID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudDtcbiAgICBpZiAoIXN2YykgcmV0dXJuO1xuXG4gICAgLy8gUmVzZXQgcGVyLWNvbnZlcnNhdGlvbiBmbGFncyBzbyB3ZSBvbmx5IG5vdGlmeSB0YWtlb3Zlci9maW5hbGl6ZWQgb25jZVxuICAgIHRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuXG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGxldCB0aW1lb3V0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc2NoZWR1bGVOZXh0ID0gKGRlbGF5TXM6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQocG9sbCwgZGVsYXlNcyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBvbGwgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgcG9sbE1lc3NhZ2VzIH0gPSBhd2FpdCBzdmMucG9sbEluUHJvZ3Jlc3NDb252ZXJzYXRpb24oKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFJlc2V0IGZhaWx1cmUgY291bnRlciBvbiBzdWNjZXNzXG4gICAgICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ID0gMDtcblxuICAgICAgICAvLyBPbmx5IHRha2UgbWVzc2FnZXMgbmV3ZXIgdGhhbiBvciBlcXVhbCB0byBsYXN0IHNlZW4gY3JlYXRlX3RpbWUgKHNlY29uZHMpLlxuICAgICAgICAvLyBVc2Ugc2Vjb25kcyBjb25zaXN0ZW50bHk6IHBvbGwgbWVzc2FnZXMgYXJlIG5vcm1hbGl6ZWQgdG8gc2Vjb25kcyBpbiBjaGF0U2VydmljZS5cbiAgICAgICAgY29uc3QgbGFzdFNlcnZlckNyZWF0ZVRpbWUgPSBNYXRoLmZsb29yKE51bWJlcihsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50KSB8fCAwKTtcblxuICAgICAgICBjb25zdCBuZXdNZXNzYWdlc1JhdyA9IChwb2xsTWVzc2FnZXMgfHwgW10pLmZpbHRlcigobSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN0ID0gTnVtYmVyKChtIGFzIGFueSkuY3JlYXRlX3RpbWUpO1xuICAgICAgICAgIGlmIChjdCA9PT0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKGN0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHJldHVybiBjdCA+IGxhc3RTZXJ2ZXJDcmVhdGVUaW1lO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobmV3TWVzc2FnZXNSYXcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHNwZWFrZXJUeXBlID0gKHNwZWFrZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHNwZWFrZXIgPT09IFwiY3VzdG9tZXJcIikgcmV0dXJuIFwiY3VzdG9tZXJcIjtcbiAgICAgICAgICAgIGlmIChzcGVha2VyID09PSBcImFnZW50XCIpIHJldHVybiBcImFnZW50XCI7XG4gICAgICAgICAgICByZXR1cm4gXCJzcGVjaWFsXCI7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IHRleHQgPSAobTogSW5Qcm9ncmVzc1BvbGxNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBpZiAobS50eXBlID09PSBcInRha2VvdmVyXCIpIHJldHVybiBcIlN1cGVydmlzb3IgdG9vayBvdmVyXCI7XG4gICAgICAgICAgICBpZiAobS50eXBlID09PSBcImZpbmFsaXplZFwiKSByZXR1cm4gXCJDb252ZXJzYXRpb24gRmluYWxpemVkXCI7XG4gICAgICAgICAgICByZXR1cm4gKG0gYXMgYW55KS50ZXh0O1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBuZXdNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IG5ld01lc3NhZ2VzUmF3Lm1hcCgobSkgPT4gKHtcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IChtIGFzIGFueSkuaWQsXG4gICAgICAgICAgICBjcmVhdGVfdGltZTogTnVtYmVyKChtIGFzIGFueSkuY3JlYXRlX3RpbWUpLFxuICAgICAgICAgICAgc3RhcnRfdGltZTogTnVtYmVyKChtIGFzIGFueSkuc3RhcnRfdGltZSA/PyAwKSxcbiAgICAgICAgICAgIGVuZF90aW1lOiBOdW1iZXIoKG0gYXMgYW55KS5lbmRfdGltZSA/PyAwKSxcbiAgICAgICAgICAgIHNwZWFrZXI6IHNwZWFrZXJUeXBlKChtIGFzIGFueSkuc3BlYWtlciksXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0KG0pLFxuICAgICAgICAgICAgdHlwZTogKG0gYXMgYW55KS50eXBlLFxuICAgICAgICAgICAgZmVlZGJhY2s6IChtIGFzIGFueSkuZmVlZGJhY2ssXG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgLy8gQXBwZW5kIG9ubHkgbWVzc2FnZXMgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIChkZWR1cGUgYnkgbWVzc2FnZV9pZDsgc2FtZSBjcmVhdGVfdGltZSBjYW4gcmVwZWF0IGV2ZXJ5IHBvbGwpXG4gICAgICAgICAgaWYgKG5ld01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNldE1lc3NhZ2VzKChwcmV2TWVzc2FnZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgIHByZXZNZXNzYWdlcy5tYXAoKG0pID0+IG0ubWVzc2FnZV9pZCkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCB0b0FkZCA9IG5ld01lc3NhZ2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAobSkgPT4gbS5tZXNzYWdlX2lkID09IG51bGwgfHwgIWV4aXN0aW5nSWRzLmhhcyhtLm1lc3NhZ2VfaWQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAodG9BZGQubGVuZ3RoID09PSAwKSByZXR1cm4gcHJldk1lc3NhZ2VzO1xuICAgICAgICAgICAgICBjb25zdCBtYXhDcmVhdGVUaW1lRnJvbVBvbGwgPSB0b0FkZC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKG1heCwgbXNnKSA9PlxuICAgICAgICAgICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG1zZy5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgPyBNYXRoLm1heChtYXgsIG1zZy5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgOiBtYXgsXG4gICAgICAgICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWUsXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IG1heENyZWF0ZVRpbWVGcm9tUG9sbDtcbiAgICAgICAgICAgICAgcmV0dXJuIFsuLi5wcmV2TWVzc2FnZXMsIC4uLnRvQWRkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIG5ldyBtZXNzYWdlcyBmb3IgdGFrZW92ZXIvZmluYWxpemUgbWFya2Vyc1xuICAgICAgICAgIGNvbnN0IGhhc1Rha2VvdmVyTWVzc2FnZSA9IG5ld01lc3NhZ2VzLnNvbWUoXG4gICAgICAgICAgICAobSkgPT4gbS50eXBlID09PSBcInRha2VvdmVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBoYXNGaW5hbGl6ZWRNZXNzYWdlID0gbmV3TWVzc2FnZXMuc29tZShcbiAgICAgICAgICAgIChtKSA9PiBtLnR5cGUgPT09IFwiZmluYWxpemVkXCIsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICgoc3RhdHVzID09PSBcImZpbmFsaXplZFwiIHx8IGhhc0ZpbmFsaXplZE1lc3NhZ2UpICYmICFmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoc3RhdHVzID09PSBcInRha2VvdmVyXCIgfHwgaGFzVGFrZW92ZXJNZXNzYWdlKSAmJiAhdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gbmV3IG1lc3NhZ2VzOyBzdGlsbCBob25vciBzdGF0dXMgaWYgaXQgaW5kaWNhdGVzIGEgdGVybWluYWwgc3RhdGUgKG9uY2UgcGVyIGNvbnZlcnNhdGlvbilcbiAgICAgICAgICBpZiAoc3RhdHVzID09PSBcImZpbmFsaXplZFwiICYmICFmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc3ZjLmhhbmRsZUNvbnZlcnNhdGlvbkZpbmFsaXplZCgpO1xuICAgICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFwidGFrZW92ZXJcIiAmJiAhdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICBzdmMubm90aWZ5VGFrZW92ZXJGcm9tUG9sbCgpO1xuICAgICAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJmaW5hbGl6ZWRcIikge1xuICAgICAgICAgIC8vIE1hcmsgZmluYWxpemVkIGFuZCBsZXQgdGhlIGVmZmVjdCBjbGVhbnVwIHByZXZlbnQgZnVydGhlciBzY2hlZHVsaW5nXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jcmVhc2UgcG9sbGluZyBpbnRlcnZhbCBvdmVyIHRpbWUgb24gc3VjY2Vzc1xuICAgICAgICAvLyBjb25zdCBuZXh0SW50ZXJ2YWwgPSBNYXRoLm1pbihcbiAgICAgICAgLy8gICAoaGVhcnRiZWF0SW50ZXJ2YWxSZWYuY3VycmVudCB8fCBIRUFSVEJFQVRfSU5JVElBTF9JTlRFUlZBTF9NUykgK1xuICAgICAgICAvLyAgICAgSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVMsXG4gICAgICAgIC8vICAgSEVBUlRCRUFUX01BWF9JTlRFUlZBTF9NUyxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgY29uc3QgbmV4dEludGVydmFsID0gSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVM7XG4gICAgICAgIGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgPSBuZXh0SW50ZXJ2YWw7XG4gICAgICAgIHNjaGVkdWxlTmV4dChuZXh0SW50ZXJ2YWwpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgLy8gSW5jcmVtZW50IGZhaWx1cmUgY291bnRlciBhbmQgc3RvcCBhZnRlciA1IGNvbnNlY3V0aXZlIGZhaWx1cmVzXG4gICAgICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ICs9IDE7XG4gICAgICAgIGlmIChoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCA+PSA1KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldHJ5RGVsYXkgPVxuICAgICAgICAgIGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgfHwgSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVM7XG4gICAgICAgIHNjaGVkdWxlTmV4dChyZXRyeURlbGF5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gUmVzZXQgY291bnRlcnMgZm9yIHRoaXMgY29udmVyc2F0aW9uIGFuZCBzdGFydCBpbW1lZGlhdGVseVxuICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ID0gMDtcbiAgICBoZWFydGJlYXRJbnRlcnZhbFJlZi5jdXJyZW50ID0gSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVM7XG5cbiAgICBpZiAodXNlUG9sbCAmJiAhdXNlV3MpIHtcbiAgICAgIHBvbGwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3VzZVdzLCBjb252ZXJzYXRpb25JZCwgaXNGaW5hbGl6ZWQsIHVzZVBvbGxdKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb25cbiAgY29uc3QgcmVzZXRDb252ZXJzYXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAocmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RpbmdcIik7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgICAgc2V0V2VsY29tZUltYWdlVXJsKG51bGwpO1xuICAgICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgICBzZXRUaGlua2luZ1BocmFzZXMoW10pO1xuICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKDEwMDApO1xuICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IDA7XG4gICAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfVxuICAgICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgICAgc2V0SXNUYWtlbk92ZXIoZmFsc2UpO1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBjb252ZXJzYXRpb24gaW4gdGhlIGNoYXQgc2VydmljZVxuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuXG4gICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNvbnZlcnNhdGlvblxuICAgICAgICBjb25zdCBjb252SWQgPVxuICAgICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW4pO1xuICAgICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0ZWRcIik7XG5cbiAgICAgICAgLy8gR2V0IHBvc3NpYmxlIHF1ZXJpZXMgZnJvbSBBUEkgcmVzcG9uc2VcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHdlbGNvbWUgYW5kIHRoaW5raW5nIGRhdGFcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgIGNoYXRJbnB1dE1ldGFkYXRhOlxuICAgICAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCkgPz8ge30sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHVwbG9hZEZpbGUgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoZmlsZTogRmlsZSk6IFByb21pc2U8QXR0YWNobWVudCB8IG51bGw+ID0+IHtcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudD8uZ2V0Q29udmVyc2F0aW9uSWQoKTtcbiAgICAgIGlmICghY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVwbG9hZFJlc3VsdCA9IGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LnVwbG9hZEZpbGUoXG4gICAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGZpbGUgdXJsIHdpdGggdGhlIGJhc2UgdXJsXG4gICAgICAgIGNvbnN0IGZpbGVfdXJsID0gbmV3IFVSTCh1cGxvYWRSZXN1bHQhLmZpbGVfdXJsISwgYmFzZVVybCkuaHJlZjtcblxuICAgICAgICBjb25zdCBhdHRhY2htZW50OiBBdHRhY2htZW50ID0ge1xuICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgIHVybDogZmlsZV91cmwsXG4gICAgICAgICAgZmlsZV9pZDogdXBsb2FkUmVzdWx0Py5maWxlX2lkLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzKChwcmV2KSA9PiBbLi4ucHJldiwgYXR0YWNobWVudF0pO1xuICAgICAgICByZXR1cm4gYXR0YWNobWVudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgYXBpS2V5LFxuICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICBidWlsZE1lc3NhZ2VzS2V5LFxuICAgICAgaXNUb2tlbkV4cGlyZWRFcnJvcixcbiAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUsXG4gICAgXSxcbiAgKTtcblxuICAvLyBTZW5kIG1lc3NhZ2VcbiAgY29uc3Qgc2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoXG4gICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICBmaWxlczogRmlsZVtdID0gW10sXG4gICAgICBleHRyYU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNoYXQgc2VydmljZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcblxuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XG5cbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzID0gZmlsZXNcbiAgICAgICAgICAgIC5tYXAoKGYpID0+XG4gICAgICAgICAgICAgIHByZWxvYWRlZEF0dGFjaG1lbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgKHBhKSA9PiBwYS5uYW1lID09PSBmLm5hbWUgJiYgcGEuc2l6ZSA9PT0gZi5zaXplLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBBdHRhY2htZW50W107XG4gICAgICAgICAgbmV3QXR0YWNobWVudHMucHVzaCguLi51cGxvYWRlZEZpbGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IHR5cGluZyBpbW1lZGlhdGVseSB3aGVuIHVzZXIgc2VuZHMsIHVubGVzcyBjb252ZXJzYXRpb24gaXMgdGFrZW4gb3ZlciBieSBhIGh1bWFuXG4gICAgICAgIGlmICghaXNUYWtlbk92ZXIpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZW5kTWVzc2FnZShcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIG5ld0F0dGFjaG1lbnRzLFxuICAgICAgICAgIGV4dHJhTWV0YWRhdGEsXG4gICAgICAgICAgcmVDYXB0Y2hhVG9rZW4sXG4gICAgICAgICk7XG5cbiAgICAgICAgc2V0UHJlbG9hZGVkQXR0YWNobWVudHMoW10pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTmV0d29ya09yU2VydmVyRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgLy8gU2hvdyBjdXN0b20gc2VydmVyLXVuYXZhaWxhYmxlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICAgICAgICBjb25zdCBjcmVhdGVUaW1lID1cbiAgICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LmdldENvbnZlcnNhdGlvbkNyZWF0ZVRpbWUoKTtcbiAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBjcmVhdGVUaW1lICE9IG51bGwgPyBub3cgLSBjcmVhdGVUaW1lIDogMDtcbiAgICAgICAgICBjb25zdCBlbmRUaW1lID0gc3RhcnRUaW1lICsgMC4wMTtcbiAgICAgICAgICBjb25zdCBzcGVjaWFsTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICAgICAgc3RhcnRfdGltZTogc3RhcnRUaW1lLFxuICAgICAgICAgICAgZW5kX3RpbWU6IGVuZFRpbWUsXG4gICAgICAgICAgICBzcGVha2VyOiBcInNwZWNpYWxcIixcbiAgICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSA/PyBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9NRVNTQUdFLFxuICAgICAgICAgICAgLi4uKHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCAmJiB7XG4gICAgICAgICAgICAgIGxpbmtVcmw6IHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgICAgICAgbGlua0xhYmVsOlxuICAgICAgICAgICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsID8/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfQ09OVEFDVF9MQUJFTCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZXRNZXNzYWdlcygocHJldikgPT4gWy4uLnByZXYsIHNwZWNpYWxNZXNzYWdlXSk7XG4gICAgICAgICAgLy8gRG9uJ3QgY2FsbCBvbkVycm9yIHNvIHRoZSB1c2VyIG9ubHkgc2VlcyBvdXIgY3VzdG9tIG1lc3NhZ2VcbiAgICAgICAgfSBlbHNlIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBwcmVsb2FkZWRBdHRhY2htZW50cyxcbiAgICAgIGlzVGFrZW5PdmVyLFxuICAgICAgaXNUb2tlbkV4cGlyZWRFcnJvcixcbiAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICBdLFxuICApO1xuXG4gIGNvbnN0IHN0YXJ0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiY29ubmVjdGluZ1wiKTtcbiAgICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIGZvciBuZXcgY29udmVyc2F0aW9uXG4gICAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICAgICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgICAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IGNvbnZJZCA9XG4gICAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlbik7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RlZFwiKTtcblxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMpIHtcbiAgICAgICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgICBpZiAocXVlcmllcyAmJiBxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhxdWVyaWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgIGNoYXRJbnB1dE1ldGFkYXRhOlxuICAgICAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCkgPz8ge30sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIC8vIEFkZCBmZWVkYmFjayB0byBhbiBhZ2VudCBtZXNzYWdlXG4gIGNvbnN0IGFkZEZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgICB2YWx1ZTogXCJnb29kXCIgfCBcImJhZFwiLFxuICAgICAgZmVlZGJhY2tNZXNzYWdlPzogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3Qgc2VuZCBmZWVkYmFjazogQ2hhdFNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IHNlbmQgZmVlZGJhY2s6IG1lc3NhZ2VJZCBpcyByZXF1aXJlZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LmFkZEZlZWRiYWNrKFxuICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBmZWVkYmFja01lc3NhZ2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbmV3RmVlZGJhY2s6IE1lc3NhZ2VGZWVkYmFjayA9IHtcbiAgICAgICAgICBmZWVkYmFjazogdmFsdWUsXG4gICAgICAgICAgZmVlZGJhY2tfbWVzc2FnZTogZmVlZGJhY2tNZXNzYWdlLFxuICAgICAgICAgIGZlZWRiYWNrX3RpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldE1lc3NhZ2VzKChwcmV2KSA9PlxuICAgICAgICAgIHByZXYubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAvLyBNYXRjaCBieSBtZXNzYWdlX2lkIG9yIGlkIGZpZWxkXG4gICAgICAgICAgICBjb25zdCBtc2dJZCA9IG0ubWVzc2FnZV9pZCB8fCAobSBhcyBhbnkpLmlkO1xuICAgICAgICAgICAgcmV0dXJuIG1zZ0lkID09PSBtZXNzYWdlSWRcbiAgICAgICAgICAgICAgPyB7IC4uLm0sIGZlZWRiYWNrOiBbLi4uKG0uZmVlZGJhY2sgfHwgW10pLCBuZXdGZWVkYmFja10gfVxuICAgICAgICAgICAgICA6IG07XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW10sXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlcyxcbiAgICBpc0xvYWRpbmcsXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgdXBsb2FkRmlsZSxcbiAgICByZXNldENvbnZlcnNhdGlvbixcbiAgICBzdGFydENvbnZlcnNhdGlvbixcbiAgICBjb25uZWN0aW9uU3RhdGUsXG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgcG9zc2libGVRdWVyaWVzLFxuICAgIGlzVGFrZW5PdmVyLFxuICAgIGlzRmluYWxpemVkLFxuICAgIGlzQWdlbnRUeXBpbmcsXG4gICAgYWRkRmVlZGJhY2ssXG4gICAgd2VsY29tZVRpdGxlLFxuICAgIHdlbGNvbWVJbWFnZVVybCxcbiAgICB3ZWxjb21lTWVzc2FnZSxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIGNoYXRJbnB1dE1ldGFkYXRhLFxuICB9O1xufTtcbiJdfQ==
891
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBMkJ0RCxJQUFNLGtDQUFrQyxHQUN0QyxpRUFBaUUsQ0FBQztBQUNwRSxJQUFNLHdDQUF3QyxHQUFHLGlCQUFpQixDQUFDO0FBRW5FLFNBQVMsc0JBQXNCLENBQUMsS0FBVTs7SUFDeEMsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsSUFBTSxJQUFJLEdBQUcsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksQ0FBQztRQUN6QixJQUNFLElBQUksS0FBSyxhQUFhO1lBQ3RCLElBQUksS0FBSyxjQUFjO1lBQ3ZCLElBQUksS0FBSyxXQUFXO1lBQ3BCLElBQUksS0FBSyx3QkFBd0I7WUFFakMsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxDQUFDLHdFQUF3RTtJQUN2RixDQUFDO0lBQ0QsSUFBTSxNQUFNLEdBQUcsTUFBQSxLQUFLLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUM7SUFDdEMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQU0sT0FBTyxHQUFHLFVBQUMsRUFnQlQ7UUFmYixPQUFPLGFBQUEsRUFDUCxZQUFZLGtCQUFBLEVBQ1osTUFBTSxZQUFBLEVBQ04sTUFBTSxZQUFBLEVBQ04sUUFBUSxj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O1FBQ0wsUUFBUSxVQUFBO1FBQ1IsU0FBUyxXQUFBO1FBQ1QsV0FBVyxhQUFBO1FBQ1gsVUFBVSxZQUFBO1FBQ1YsaUJBQWlCLG1CQUFBO1FBQ2pCLGlCQUFpQixtQkFBQTtRQUNqQixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLGVBQWUsaUJBQUE7UUFDZixXQUFXLGFBQUE7UUFDWCxXQUFXLGFBQUE7UUFDWCxhQUFhLGVBQUE7UUFDYixXQUFXLGFBQUE7UUFDWCxZQUFZLGNBQUE7UUFDWixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLGVBQWUsaUJBQUE7UUFDZixlQUFlLGlCQUFBO1FBQ2YsaUJBQWlCLG1CQUFBO0tBQ2xCLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9jaGF0U2VydmljZVwiO1xuaW1wb3J0IHtcbiAgQ2hhdE1lc3NhZ2UsXG4gIEF0dGFjaG1lbnQsXG4gIE1lc3NhZ2VGZWVkYmFjayxcbiAgSW5Qcm9ncmVzc1BvbGxNZXNzYWdlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VDaGF0UHJvcHMge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIHdlYnNvY2tldFVybD86IHN0cmluZztcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIHRlbmFudD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvLyAgSWYgZmFsc2UsIHRoZSBjaGF0IHdpbGwgcnVuIGluIEhUVFAtb25seSBtb2RlIChubyBXZWJTb2NrZXQgY29ubmVjdGlvbikuXG4gIHVzZVdzPzogYm9vbGVhbjtcbiAgdXNlUG9sbD86IGJvb2xlYW47XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgb25UYWtlb3Zlcj86ICgpID0+IHZvaWQ7XG4gIG9uRmluYWxpemU/OiAoKSA9PiB2b2lkO1xuICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2U/OiBzdHJpbmc7IC8vIEN1c3RvbSBtZXNzYWdlIHdoZW4gc2VydmVyIGlzIGRvd25cbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsPzogc3RyaW5nOyAvLyBPcHRpb25hbCBVUkwgZm9yIGNvbnRhY3Qvc3VwcG9ydFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbD86IHN0cmluZzsgLy8gTGFiZWwgZm9yIHRoZSBjb250YWN0IGxpbmtcbiAgb25Db25maWdMb2FkZWQ/OiAocHJvcHM6IHsgY2hhdElucHV0TWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0pID0+IHZvaWQ7IC8vIENhbGxiYWNrIGZvciB3aGVuIHRoZSBjaGF0IGlucHV0IG1ldGFkYXRhIGlzIGxvYWRlZFxufVxuXG5jb25zdCBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9NRVNTQUdFID1cbiAgXCJUaGUgc2VydmljZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIjtcbmNvbnN0IERFRkFVTFRfU0VSVkVSX1VOQVZBSUxBQkxFX0NPTlRBQ1RfTEFCRUwgPSBcIkNvbnRhY3Qgc3VwcG9ydFwiO1xuXG5mdW5jdGlvbiBpc05ldHdvcmtPclNlcnZlckVycm9yKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgLy8gTm8gcmVzcG9uc2UgPSBuZXR3b3JrIGVycm9yXG4gIGlmICghZXJyb3IucmVzcG9uc2UpIHtcbiAgICBjb25zdCBjb2RlID0gZXJyb3I/LmNvZGU7XG4gICAgaWYgKFxuICAgICAgY29kZSA9PT0gXCJFUlJfTkVUV09SS1wiIHx8XG4gICAgICBjb2RlID09PSBcIkVDT05OUkVGVVNFRFwiIHx8XG4gICAgICBjb2RlID09PSBcIkVUSU1FRE9VVFwiIHx8XG4gICAgICBjb2RlID09PSBcIkVSUl9DT05ORUNUSU9OX1JFRlVTRURcIlxuICAgIClcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0cnVlOyAvLyBhbnkgcmVxdWVzdCBlcnJvciB3aXRob3V0IHJlc3BvbnNlIGlzIHRyZWF0ZWQgYXMgc2VydmVyL25ldHdvcmsgaXNzdWVcbiAgfVxuICBjb25zdCBzdGF0dXMgPSBlcnJvci5yZXNwb25zZT8uc3RhdHVzO1xuICByZXR1cm4gdHlwZW9mIHN0YXR1cyA9PT0gXCJudW1iZXJcIiAmJiBzdGF0dXMgPj0gNTAwO1xufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdCA9ICh7XG4gIGJhc2VVcmwsXG4gIHdlYnNvY2tldFVybCxcbiAgYXBpS2V5LFxuICB0ZW5hbnQsXG4gIG1ldGFkYXRhLFxuICB1c2VXcyA9IHRydWUsXG4gIHVzZVBvbGwgPSBmYWxzZSxcbiAgbGFuZ3VhZ2UsXG4gIG9uRXJyb3IsXG4gIG9uVGFrZW92ZXIsXG4gIG9uRmluYWxpemUsXG4gIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgb25Db25maWdMb2FkZWQsXG59OiBVc2VDaGF0UHJvcHMpID0+IHtcbiAgY29uc3QgW21lc3NhZ2VzLCBzZXRNZXNzYWdlc10gPSB1c2VTdGF0ZTxDaGF0TWVzc2FnZVtdPihbXSk7XG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtwcmVsb2FkZWRBdHRhY2htZW50cywgc2V0UHJlbG9hZGVkQXR0YWNobWVudHNdID0gdXNlU3RhdGU8XG4gICAgQXR0YWNobWVudFtdXG4gID4oW10pO1xuICBjb25zdCBbY29ubmVjdGlvblN0YXRlLCBzZXRDb25uZWN0aW9uU3RhdGVdID0gdXNlU3RhdGU8XG4gICAgXCJjb25uZWN0aW5nXCIgfCBcImNvbm5lY3RlZFwiIHwgXCJkaXNjb25uZWN0ZWRcIlxuICA+KFwiZGlzY29ubmVjdGVkXCIpO1xuICBjb25zdCBbaXNBZ2VudFR5cGluZywgc2V0SXNBZ2VudFR5cGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGNoYXRTZXJ2aWNlUmVmID0gdXNlUmVmPENoYXRTZXJ2aWNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtjb252ZXJzYXRpb25JZCwgc2V0Q29udmVyc2F0aW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtwb3NzaWJsZVF1ZXJpZXMsIHNldFBvc3NpYmxlUXVlcmllc10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oW10pO1xuICBjb25zdCBbd2VsY29tZVRpdGxlLCBzZXRXZWxjb21lVGl0bGVdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFt3ZWxjb21lSW1hZ2VVcmwsIHNldFdlbGNvbWVJbWFnZVVybF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dlbGNvbWVNZXNzYWdlLCBzZXRXZWxjb21lTWVzc2FnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3RoaW5raW5nUGhyYXNlcywgc2V0VGhpbmtpbmdQaHJhc2VzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt0aGlua2luZ0RlbGF5TXMsIHNldFRoaW5raW5nRGVsYXlNc10gPSB1c2VTdGF0ZTxudW1iZXI+KDEwMDApO1xuICBjb25zdCBbY2hhdElucHV0TWV0YWRhdGEsIHNldENoYXRJbnB1dE1ldGFkYXRhXSA9IHVzZVN0YXRlPFxuICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gID4oe30pO1xuICBjb25zdCBbaXNUYWtlbk92ZXIsIHNldElzVGFrZW5PdmVyXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2lzRmluYWxpemVkLCBzZXRJc0ZpbmFsaXplZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gU2NvcGVkIG1lc3NhZ2VzIGtleSBmb3IgYXBpS2V5LCBjb252ZXJzYXRpb0lkXG4gIGNvbnN0IGJ1aWxkTWVzc2FnZXNLZXkgPSB1c2VDYWxsYmFjayhcbiAgICAoYXBpS2V5VmFsOiBzdHJpbmcsIGNvbnZJZDogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKCFjb252SWQpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGBnZW5hc3Npc3RfY29udmVyc2F0aW9uX21lc3NhZ2VzOiR7YXBpS2V5VmFsfToke2NvbnZJZH1gO1xuICAgIH0sXG4gICAgW10sXG4gICk7XG5cbiAgY29uc3QgdmFsaWRhdGVNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSkgPT4ge1xuICAgICAgY29uc3QgaGFzVGFrZU92ZXJNc2cgPSBtZXNzYWdlcy5zb21lKChtKSA9PiBtPy50eXBlID09PSBcInRha2VvdmVyXCIpO1xuICAgICAgY29uc3QgaGFzRmluYWxpemVkTXNnID0gbWVzc2FnZXMuc29tZSgobSkgPT4gbT8udHlwZSA9PT0gXCJmaW5hbGl6ZWRcIik7XG4gICAgICBzZXRJc1Rha2VuT3ZlcihoYXNUYWtlT3Zlck1zZyk7XG4gICAgICBzZXRJc0ZpbmFsaXplZChoYXNGaW5hbGl6ZWRNc2cpO1xuICAgIH0sXG4gICAgW3NldElzVGFrZW5PdmVyLCBzZXRJc0ZpbmFsaXplZF0sXG4gICk7XG5cbiAgLy8gQ2hlY2sgaWYgYW4gZXJyb3IgaXMgYSB0b2tlbiBleHBpcmF0aW9uIGVycm9yICg0MDEgKyBcIlRva2VuIGhhcyBleHBpcmVkLlwiKVxuICBjb25zdCBpc1Rva2VuRXhwaXJlZEVycm9yID0gdXNlQ2FsbGJhY2soKGVycm9yOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gISEoXG4gICAgICBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAxICYmXG4gICAgICBlcnJvcj8ucmVzcG9uc2U/LmRhdGEgJiZcbiAgICAgIChlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yID09PSBcIlRva2VuIGhhcyBleHBpcmVkLlwiIHx8XG4gICAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEubWVzc2FnZSA9PT0gXCJUb2tlbiBoYXMgZXhwaXJlZC5cIiB8fFxuICAgICAgICAodHlwZW9mIGVycm9yLnJlc3BvbnNlLmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhLmluY2x1ZGVzKFwiVG9rZW4gaGFzIGV4cGlyZWRcIikpKVxuICAgICk7XG4gIH0sIFtdKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb24gc3RhdGUgdG8gaW5pdGlhbCAoZS5nLiBhZnRlciB0b2tlbiBleHBpcmF0aW9uKVxuICBjb25zdCByZXNldFRvSW5pdGlhbFN0YXRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldENvbnZlcnNhdGlvbklkKG51bGwpO1xuICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgIHNldFdlbGNvbWVUaXRsZShudWxsKTtcbiAgICBzZXRXZWxjb21lSW1hZ2VVcmwobnVsbCk7XG4gICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICBzZXRUaGlua2luZ1BocmFzZXMoW10pO1xuICAgIHNldFRoaW5raW5nRGVsYXlNcygxMDAwKTtcbiAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YSh7fSk7XG4gICAgc2V0TWVzc2FnZXMoW10pO1xuICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSAwO1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgaWYgKGtleSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgfVxuICB9LCBbYXBpS2V5LCBjb252ZXJzYXRpb25JZCwgYnVpbGRNZXNzYWdlc0tleV0pO1xuXG4gIC8vIERlZXAgY29tcGFyZSBtZXRhZGF0YSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLWluaXRpYWxpemF0aW9uc1xuICAvLyBPbmx5IHJlLWluaXRpYWxpemUgaWYgbWV0YWRhdGEgYWN0dWFsbHkgY2hhbmdlcyAoYnkgdmFsdWUsIG5vdCByZWZlcmVuY2UpXG4gIGNvbnN0IG1ldGFkYXRhU3RyaW5nID0gdXNlTWVtbyhcbiAgICAoKSA9PiBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSB8fCB7fSksXG4gICAgW21ldGFkYXRhXSxcbiAgKTtcbiAgY29uc3QgbWV0YWRhdGFSZWYgPSB1c2VSZWY8c3RyaW5nPihtZXRhZGF0YVN0cmluZyk7XG4gIGNvbnN0IHByZXZCYXNlVXJsUmVmID0gdXNlUmVmPHN0cmluZz4oYmFzZVVybCk7XG4gIGNvbnN0IHByZXZXZWJzb2NrZXRVcmxSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih3ZWJzb2NrZXRVcmwpO1xuICBjb25zdCBwcmV2QXBpS2V5UmVmID0gdXNlUmVmPHN0cmluZz4oYXBpS2V5KTtcbiAgY29uc3QgcHJldlRlbmFudFJlZiA9IHVzZVJlZjxzdHJpbmcgfCB1bmRlZmluZWQ+KHRlbmFudCk7XG4gIGNvbnN0IHByZXZVc2VXc1JlZiA9IHVzZVJlZjxib29sZWFuPih1c2VXcyk7XG4gIGNvbnN0IHByZXZVc2VQb2xsUmVmID0gdXNlUmVmPGJvb2xlYW4+KHVzZVBvbGwpO1xuXG4gIC8vIEhlYXJ0YmVhdCBwb2xsaW5nIHN0YXRlICh3aGVuIFdlYlNvY2tldCBpcyBkaXNhYmxlZClcbiAgY29uc3QgaGVhcnRiZWF0RmFpbHVyZUNvdW50UmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIGNvbnN0IGhlYXJ0YmVhdEludGVydmFsUmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIGNvbnN0IGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIC8vIFJlZnMgc28gd2Ugb25seSBydW4gdGFrZW92ZXIvZmluYWxpemVkIG9uY2UgcGVyIGNvbnZlcnNhdGlvbiAoYXZvaWQgc3RhbGUgaXNUYWtlbk92ZXIvaXNGaW5hbGl6ZWQgaW4gcG9sbCBjbG9zdXJlKVxuICBjb25zdCB0YWtlb3ZlclByb2Nlc3NlZFJlZiA9IHVzZVJlZjxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGZpbmFsaXplZFByb2Nlc3NlZFJlZiA9IHVzZVJlZjxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gU3RvcmUgY2FsbGJhY2tzIGluIHJlZnMgc28gdGhleSBkb24ndCB0cmlnZ2VyIHJlLWluaXRpYWxpemF0aW9uXG4gIGNvbnN0IG9uRXJyb3JSZWYgPSB1c2VSZWYob25FcnJvcik7XG4gIGNvbnN0IG9uVGFrZW92ZXJSZWYgPSB1c2VSZWYob25UYWtlb3Zlcik7XG4gIGNvbnN0IG9uRmluYWxpemVSZWYgPSB1c2VSZWYob25GaW5hbGl6ZSk7XG4gIGNvbnN0IG9uQ29uZmlnTG9hZGVkUmVmID0gdXNlUmVmKG9uQ29uZmlnTG9hZGVkKTtcblxuICAvLyBVcGRhdGUgY2FsbGJhY2sgcmVmcyB3aGVuIHRoZXkgY2hhbmdlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25FcnJvclJlZi5jdXJyZW50ID0gb25FcnJvcjtcbiAgfSwgW29uRXJyb3JdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uVGFrZW92ZXJSZWYuY3VycmVudCA9IG9uVGFrZW92ZXI7XG4gIH0sIFtvblRha2VvdmVyXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQgPSBvbkZpbmFsaXplO1xuICB9LCBbb25GaW5hbGl6ZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25Db25maWdMb2FkZWRSZWYuY3VycmVudCA9IG9uQ29uZmlnTG9hZGVkO1xuICB9LCBbb25Db25maWdMb2FkZWRdKTtcblxuICAvLyBJbml0aWFsaXplIGNoYXQgc2VydmljZSAtIG9ubHkgd2hlbiBiYXNlVXJsLCBhcGlLZXksIHRlbmFudCwgdXNlV3MsIG9yIG1ldGFkYXRhIGFjdHVhbGx5IGNoYW5nZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhQ2hhbmdlZCA9IG1ldGFkYXRhUmVmLmN1cnJlbnQgIT09IG1ldGFkYXRhU3RyaW5nO1xuICAgIGNvbnN0IGJhc2VVcmxDaGFuZ2VkID0gcHJldkJhc2VVcmxSZWYuY3VycmVudCAhPT0gYmFzZVVybDtcbiAgICBjb25zdCB3ZWJzb2NrZXRVcmxDaGFuZ2VkID0gcHJldldlYnNvY2tldFVybFJlZi5jdXJyZW50ICE9PSB3ZWJzb2NrZXRVcmw7XG4gICAgY29uc3QgYXBpS2V5Q2hhbmdlZCA9IHByZXZBcGlLZXlSZWYuY3VycmVudCAhPT0gYXBpS2V5O1xuICAgIGNvbnN0IHRlbmFudENoYW5nZWQgPSBwcmV2VGVuYW50UmVmLmN1cnJlbnQgIT09IHRlbmFudDtcbiAgICBjb25zdCB1c2VXc0NoYW5nZWQgPSBwcmV2VXNlV3NSZWYuY3VycmVudCAhPT0gdXNlV3M7XG4gICAgY29uc3QgdXNlUG9sbENoYW5nZWQgPSBwcmV2VXNlUG9sbFJlZi5jdXJyZW50ICE9PSB1c2VQb2xsO1xuICAgIC8vIE9ubHkgcmUtaW5pdGlhbGl6ZSBmb3IgY29ubmVjdGlvbi1yZWxhdGVkIGNoYW5nZXMsIE5PVCBmb3IgbWV0YWRhdGEgY2hhbmdlc1xuICAgIGNvbnN0IG5lZWRzUmVpbml0ID1cbiAgICAgICFjaGF0U2VydmljZVJlZi5jdXJyZW50IHx8XG4gICAgICBiYXNlVXJsQ2hhbmdlZCB8fFxuICAgICAgd2Vic29ja2V0VXJsQ2hhbmdlZCB8fFxuICAgICAgYXBpS2V5Q2hhbmdlZCB8fFxuICAgICAgdGVuYW50Q2hhbmdlZCB8fFxuICAgICAgdXNlV3NDaGFuZ2VkO1xuXG4gICAgaWYgKG5lZWRzUmVpbml0KSB7XG4gICAgICAvLyBVcGRhdGUgcmVmc1xuICAgICAgaWYgKGJhc2VVcmxDaGFuZ2VkKSBwcmV2QmFzZVVybFJlZi5jdXJyZW50ID0gYmFzZVVybDtcbiAgICAgIGlmICh3ZWJzb2NrZXRVcmxDaGFuZ2VkKSBwcmV2V2Vic29ja2V0VXJsUmVmLmN1cnJlbnQgPSB3ZWJzb2NrZXRVcmw7XG4gICAgICBpZiAoYXBpS2V5Q2hhbmdlZCkgcHJldkFwaUtleVJlZi5jdXJyZW50ID0gYXBpS2V5O1xuICAgICAgaWYgKHRlbmFudENoYW5nZWQpIHByZXZUZW5hbnRSZWYuY3VycmVudCA9IHRlbmFudDtcbiAgICAgIGlmICh1c2VXc0NoYW5nZWQpIHByZXZVc2VXc1JlZi5jdXJyZW50ID0gdXNlV3M7XG4gICAgICBpZiAodXNlUG9sbENoYW5nZWQpIHByZXZVc2VQb2xsUmVmLmN1cnJlbnQgPSB1c2VQb2xsO1xuICAgICAgaWYgKG1ldGFkYXRhQ2hhbmdlZCkgbWV0YWRhdGFSZWYuY3VycmVudCA9IG1ldGFkYXRhU3RyaW5nO1xuXG4gICAgICAvLyBDbGVhbiB1cCBleGlzdGluZyBzZXJ2aWNlIGlmIGl0IGV4aXN0c1xuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRDb25uZWN0aW9uU3RhdGVIYW5kbGVyKCgpID0+IHt9KTtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5kaXNjb25uZWN0KCk7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0V2VsY29tZURhdGFIYW5kbGVyKG51bGwpO1xuICAgICAgfVxuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50ID0gbmV3IENoYXRTZXJ2aWNlKFxuICAgICAgICBiYXNlVXJsLFxuICAgICAgICB3ZWJzb2NrZXRVcmwsXG4gICAgICAgIGFwaUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIHRlbmFudCxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIHVzZVdzLFxuICAgICAgICB1c2VQb2xsLFxuICAgICAgKTtcblxuICAgICAgLy8gU2V0IHVwIGhhbmRsZXJzXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldE1lc3NhZ2VIYW5kbGVyKChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICBjcmVhdGVfdGltZTpcbiAgICAgICAgICAgICFtZXNzYWdlLmNyZWF0ZV90aW1lIHx8IGlzTmFOKG1lc3NhZ2UuY3JlYXRlX3RpbWUpXG4gICAgICAgICAgICAgID8gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMClcbiAgICAgICAgICAgICAgOiBtZXNzYWdlLmNyZWF0ZV90aW1lLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYWNrIGxhdGVzdCBjcmVhdGVfdGltZSB3ZSd2ZSBzZWVuIGZyb20gc2VydmVyL3dlYnNvY2tldCAoaW4gc2Vjb25kcylcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lICYmIG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lID4gMCkge1xuICAgICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBNYXRoLnJvdW5kKG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lKSAqIDEwMDAgLyAxMDAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIG1lc3NhZ2UgdG8gbWVzc2FnZXMgYXJyYXlcbiAgICAgICAgc2V0TWVzc2FnZXMoKHByZXZNZXNzYWdlcykgPT4ge1xuICAgICAgICAgIC8vIEF2b2lkIGFkZGluZyBkdXBsaWNhdGUgbWVzc2FnZXMgd2l0aCBzYW1lIG1lc3NhZ2VfaWQgYW5kIHR5cGVcbiAgICAgICAgICBpZiAobm9ybWFsaXplZE1lc3NhZ2UubWVzc2FnZV9pZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gcHJldk1lc3NhZ2VzLnNvbWUoKG0pID0+IG0ubWVzc2FnZV9pZCA9PT0gbm9ybWFsaXplZE1lc3NhZ2UubWVzc2FnZV9pZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwcmV2TWVzc2FnZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldk1lc3NhZ2VzLCBub3JtYWxpemVkTWVzc2FnZV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgdHlwaW5nIGFuaW1hdGlvbiB3aGVuIGFnZW50IG9yIHN5c3RlbSBtZXNzYWdlIGFycml2ZXNcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09IFwiYWdlbnRcIiB8fFxuICAgICAgICAgIG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09IFwic3BlY2lhbFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRUYWtlb3ZlckhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvblRha2VvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0RmluYWxpemVkSGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRmluYWxpemVSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRmluYWxpemVSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRDb25uZWN0aW9uU3RhdGVIYW5kbGVyKChzdGF0ZSkgPT4ge1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoc3RhdGUpO1xuICAgICAgICBpZiAoc3RhdGUgIT09IFwiY29ubmVjdGVkXCIpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0V2VsY29tZURhdGFIYW5kbGVyKChkYXRhKSA9PiB7XG4gICAgICAgIHNldFdlbGNvbWVUaXRsZShkYXRhLnRpdGxlID8/IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwoZGF0YS5pbWFnZVVybCA/PyBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2UoZGF0YS5tZXNzYWdlID8/IG51bGwpO1xuICAgICAgICBpZiAoZGF0YS5wb3NzaWJsZVF1ZXJpZXMgJiYgZGF0YS5wb3NzaWJsZVF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhkYXRhLnBvc3NpYmxlUXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFNlcnZlclVuYXZhaWxhYmxlQ29uZmlnKFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBmb3IgYSBzYXZlZCBjb252ZXJzYXRpb24gYW5kIGNvbm5lY3QgdG8gaXRcbiAgICAgIGNvbnN0IGNvbnZJZCA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q29udmVyc2F0aW9uSWQoKTtcbiAgICAgIGlmIChjb252SWQpIHtcbiAgICAgICAgc2V0Q29udmVyc2F0aW9uSWQoY29udklkKTtcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuaXNDb252ZXJzYXRpb25GaW5hbGl6ZWQoKSkge1xuICAgICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuY29ubmVjdFdlYlNvY2tldCgpO1xuICAgICAgICAgIGlmICghdXNlV3MpIHtcbiAgICAgICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFB1bGwgaW5pdGlhbCBzdGF0aWMgZGF0YVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzPy4oKSB8fCBbXTtcbiAgICAgICAgaWYgKHF1ZXJpZXMubGVuZ3RoKSBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgIGNvbnN0IHdlbGNvbWUgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhPy4oKTtcbiAgICAgICAgaWYgKHdlbGNvbWUpIHtcbiAgICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhpbmtpbmcgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnPy4oKTtcbiAgICAgICAgaWYgKHRoaW5raW5nKSB7XG4gICAgICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKHRoaW5raW5nLnBocmFzZXMgfHwgW10pO1xuICAgICAgICAgIHNldFRoaW5raW5nRGVsYXlNcyh0aGlua2luZy5kZWxheU1zIHx8IDEwMDApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGEgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENoYXRJbnB1dE1ldGFkYXRhPy4oKTtcbiAgICAgICAgaWYgKG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMobWV0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKG1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIG9uQ29uZmlnTG9hZGVkUmVmLmN1cnJlbnQ/Lih7IGNoYXRJbnB1dE1ldGFkYXRhOiBtZXRhID8/IHt9IH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgLy8gSnVzdCB1cGRhdGUgbWV0YWRhdGEgd2l0aG91dCByZS1pbml0aWFsaXppbmdcbiAgICAgIGlmIChtZXRhZGF0YUNoYW5nZWQpIHtcbiAgICAgICAgbWV0YWRhdGFSZWYuY3VycmVudCA9IG1ldGFkYXRhU3RyaW5nO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHdheXMgdXBkYXRlIGhhbmRsZXJzIHdoZW4gY2FsbGJhY2tzIGNoYW5nZSAod2l0aG91dCByZS1pbml0aWFsaXppbmcpXG4gICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0VGFrZW92ZXJIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25UYWtlb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25UYWtlb3ZlclJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkZpbmFsaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0U2VydmVyVW5hdmFpbGFibGVDb25maWcoXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBvbmx5IG9uIHVubW91bnRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gT25seSBjbGVhbnVwIG9uIHVubW91bnQsIG5vdCBvbiBldmVyeSBkZXBlbmRlbmN5IGNoYW5nZVxuICAgIH07XG4gIH0sIFtcbiAgICBiYXNlVXJsLFxuICAgIHdlYnNvY2tldFVybCxcbiAgICBhcGlLZXksXG4gICAgdGVuYW50LFxuICAgIG1ldGFkYXRhU3RyaW5nLFxuICAgIGxhbmd1YWdlLFxuICAgIHVzZVdzLFxuICAgIHVzZVBvbGwsXG4gICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgXSk7XG5cbiAgLy8gVXBkYXRlIGxhbmd1YWdlIHdoZW4gaXQgY2hhbmdlcyAod2l0aG91dCByZS1pbml0aWFsaXppbmcgdGhlIHNlcnZpY2UpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpO1xuICAgIH1cbiAgfSwgW2xhbmd1YWdlXSk7XG5cbiAgLy8gTG9hZCBtZXNzYWdlcyBmb3IgY3VycmVudCBwYWlyIHdoZW4gYXZhaWxhYmxlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoIWtleSkge1xuICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgY29uc3QgcGFyc2VkOiBDaGF0TWVzc2FnZVtdID0gc3RvcmVkID8gSlNPTi5wYXJzZShzdG9yZWQpIDogW107XG5cbiAgICAgIHNldE1lc3NhZ2VzKHBhcnNlZCk7XG4gICAgICAvLyBJbml0aWFsaXplIGxhc3Qgc2VlbiBjcmVhdGVfdGltZSBmcm9tIGNhY2hlZCBtZXNzYWdlc1xuICAgICAgaWYgKHBhcnNlZC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbWF4Q3JlYXRlVGltZSA9IE1hdGgubWF4KFxuICAgICAgICAgIC4uLnBhcnNlZC5tYXAoKG0pID0+IChtLmNyZWF0ZV90aW1lID8gbS5jcmVhdGVfdGltZSA6IDApKSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIGxhc3Qgc2VlbiBjcmVhdGVfdGltZSBmcm9tIGNhY2hlZCBtZXNzYWdlc1xuICAgICAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gTWF0aC5yb3VuZChtYXhDcmVhdGVUaW1lKSAqIDEwMDAgLyAxMDAwO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gMDtcbiAgICB9XG4gIH0sIFthcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gVmFsaWRhdGUgbWVzc2FnZXMgZm9yIHRha2VvdmVyIGFuZCBmaW5hbGl6ZWRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB2YWxpZGF0ZU1lc3NhZ2VzKG1lc3NhZ2VzKTtcbiAgfSwgW21lc3NhZ2VzXSk7XG5cbiAgLy8gUGVyc2lzdCBtZXNzYWdlcyBmb3IgY3VycmVudCBwYWlyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VzKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfSwgW21lc3NhZ2VzLCBhcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gSGVhcnRiZWF0IGxvbmcgcG9sbGluZyB3aGVuIFdlYlNvY2tldCBpcyBkaXNhYmxlZCBhbmQgd2UgaGF2ZSBhbiBpbi1wcm9ncmVzcyBjb252ZXJzYXRpb24uXG4gIC8vIC0gU3RhcnRzIHdpdGggYSBzaG9ydCBpbnRlcnZhbFxuICAvLyAtIEluY3JlYXNlcyB0aGUgaW50ZXJ2YWwgb3ZlciB0aW1lIChldmVyeSBzdWNjZXNzZnVsIHBvbGwpXG4gIC8vIC0gUmV0cmllcyB1cCB0byA1IHRpbWVzIG9uIGVycm9ycywgdGhlbiBzdG9wc1xuICBjb25zdCBIRUFSVEJFQVRfSU5JVElBTF9JTlRFUlZBTF9NUyA9IDIwMDA7XG4gIGNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9TVEVQX01TID0gNTAwMDtcbiAgY29uc3QgSEVBUlRCRUFUX01BWF9JTlRFUlZBTF9NUyA9IDMwMDAwO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHVzZVdzIHx8ICFjb252ZXJzYXRpb25JZCB8fCBpc0ZpbmFsaXplZCkgcmV0dXJuO1xuICAgIGNvbnN0IHN2YyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFzdmMpIHJldHVybjtcblxuICAgIC8vIFJlc2V0IHBlci1jb252ZXJzYXRpb24gZmxhZ3Mgc28gd2Ugb25seSBub3RpZnkgdGFrZW92ZXIvZmluYWxpemVkIG9uY2VcbiAgICB0YWtlb3ZlclByb2Nlc3NlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcblxuICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgICBsZXQgdGltZW91dElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0IHNjaGVkdWxlTmV4dCA9IChkZWxheU1zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgIHRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KHBvbGwsIGRlbGF5TXMpO1xuICAgIH07XG5cbiAgICBjb25zdCBwb2xsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIHBvbGxNZXNzYWdlcyB9ID0gYXdhaXQgc3ZjLnBvbGxJblByb2dyZXNzQ29udmVyc2F0aW9uKCk7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcblxuICAgICAgICAvLyBSZXNldCBmYWlsdXJlIGNvdW50ZXIgb24gc3VjY2Vzc1xuICAgICAgICBoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCA9IDA7XG5cbiAgICAgICAgLy8gT25seSB0YWtlIG1lc3NhZ2VzIG5ld2VyIHRoYW4gb3IgZXF1YWwgdG8gbGFzdCBzZWVuIGNyZWF0ZV90aW1lIChzZWNvbmRzKS5cbiAgICAgICAgLy8gVXNlIHNlY29uZHMgY29uc2lzdGVudGx5OiBwb2xsIG1lc3NhZ2VzIGFyZSBub3JtYWxpemVkIHRvIHNlY29uZHMgaW4gY2hhdFNlcnZpY2UuXG4gICAgICAgIGNvbnN0IGxhc3RTZXJ2ZXJDcmVhdGVUaW1lID0gTWF0aC5mbG9vcihOdW1iZXIobGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCkgfHwgMCk7XG5cbiAgICAgICAgY29uc3QgbmV3TWVzc2FnZXNSYXcgPSAocG9sbE1lc3NhZ2VzIHx8IFtdKS5maWx0ZXIoKG0pID0+IHtcbiAgICAgICAgICBjb25zdCBjdCA9IE51bWJlcigobSBhcyBhbnkpLmNyZWF0ZV90aW1lKTtcbiAgICAgICAgICBpZiAoY3QgPT09IDAgfHwgIU51bWJlci5pc0Zpbml0ZShjdCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gY3QgPiBsYXN0U2VydmVyQ3JlYXRlVGltZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG5ld01lc3NhZ2VzUmF3Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBzcGVha2VyVHlwZSA9IChzcGVha2VyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChzcGVha2VyID09PSBcImN1c3RvbWVyXCIpIHJldHVybiBcImN1c3RvbWVyXCI7XG4gICAgICAgICAgICBpZiAoc3BlYWtlciA9PT0gXCJhZ2VudFwiKSByZXR1cm4gXCJhZ2VudFwiO1xuICAgICAgICAgICAgcmV0dXJuIFwic3BlY2lhbFwiO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCB0ZXh0ID0gKG06IEluUHJvZ3Jlc3NQb2xsTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG0udHlwZSA9PT0gXCJ0YWtlb3ZlclwiKSByZXR1cm4gXCJTdXBlcnZpc29yIHRvb2sgb3ZlclwiO1xuICAgICAgICAgICAgaWYgKG0udHlwZSA9PT0gXCJmaW5hbGl6ZWRcIikgcmV0dXJuIFwiQ29udmVyc2F0aW9uIEZpbmFsaXplZFwiO1xuICAgICAgICAgICAgcmV0dXJuIChtIGFzIGFueSkudGV4dDtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgbmV3TWVzc2FnZXM6IENoYXRNZXNzYWdlW10gPSBuZXdNZXNzYWdlc1Jhdy5tYXAoKG0pID0+ICh7XG4gICAgICAgICAgICBtZXNzYWdlX2lkOiAobSBhcyBhbnkpLmlkLFxuICAgICAgICAgICAgY3JlYXRlX3RpbWU6IE51bWJlcigobSBhcyBhbnkpLmNyZWF0ZV90aW1lKSxcbiAgICAgICAgICAgIHN0YXJ0X3RpbWU6IE51bWJlcigobSBhcyBhbnkpLnN0YXJ0X3RpbWUgPz8gMCksXG4gICAgICAgICAgICBlbmRfdGltZTogTnVtYmVyKChtIGFzIGFueSkuZW5kX3RpbWUgPz8gMCksXG4gICAgICAgICAgICBzcGVha2VyOiBzcGVha2VyVHlwZSgobSBhcyBhbnkpLnNwZWFrZXIpLFxuICAgICAgICAgICAgdGV4dDogdGV4dChtKSxcbiAgICAgICAgICAgIHR5cGU6IChtIGFzIGFueSkudHlwZSxcbiAgICAgICAgICAgIGZlZWRiYWNrOiAobSBhcyBhbnkpLmZlZWRiYWNrLFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIC8vIEFwcGVuZCBvbmx5IG1lc3NhZ2VzIHdlIGRvbid0IGFscmVhZHkgaGF2ZSAoZGVkdXBlIGJ5IG1lc3NhZ2VfaWQ7IHNhbWUgY3JlYXRlX3RpbWUgY2FuIHJlcGVhdCBldmVyeSBwb2xsKVxuICAgICAgICAgIGlmIChuZXdNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZXRNZXNzYWdlcygocHJldk1lc3NhZ2VzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICBwcmV2TWVzc2FnZXMubWFwKChtKSA9PiBtLm1lc3NhZ2VfaWQpLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgdG9BZGQgPSBuZXdNZXNzYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKG0pID0+IG0ubWVzc2FnZV9pZCA9PSBudWxsIHx8ICFleGlzdGluZ0lkcy5oYXMobS5tZXNzYWdlX2lkKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHRvQWRkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHByZXZNZXNzYWdlcztcbiAgICAgICAgICAgICAgY29uc3QgbWF4Q3JlYXRlVGltZUZyb21Qb2xsID0gdG9BZGQucmVkdWNlKFxuICAgICAgICAgICAgICAgIChtYXgsIG1zZykgPT5cbiAgICAgICAgICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShtc2cuY3JlYXRlX3RpbWUpXG4gICAgICAgICAgICAgICAgICAgID8gTWF0aC5tYXgobWF4LCBtc2cuY3JlYXRlX3RpbWUpXG4gICAgICAgICAgICAgICAgICAgIDogbWF4LFxuICAgICAgICAgICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBtYXhDcmVhdGVUaW1lRnJvbVBvbGw7XG4gICAgICAgICAgICAgIHJldHVybiBbLi4ucHJldk1lc3NhZ2VzLCAuLi50b0FkZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBuZXcgbWVzc2FnZXMgZm9yIHRha2VvdmVyL2ZpbmFsaXplIG1hcmtlcnNcbiAgICAgICAgICBjb25zdCBoYXNUYWtlb3Zlck1lc3NhZ2UgPSBuZXdNZXNzYWdlcy5zb21lKFxuICAgICAgICAgICAgKG0pID0+IG0udHlwZSA9PT0gXCJ0YWtlb3ZlclwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaGFzRmluYWxpemVkTWVzc2FnZSA9IG5ld01lc3NhZ2VzLnNvbWUoXG4gICAgICAgICAgICAobSkgPT4gbS50eXBlID09PSBcImZpbmFsaXplZFwiLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoKHN0YXR1cyA9PT0gXCJmaW5hbGl6ZWRcIiB8fCBoYXNGaW5hbGl6ZWRNZXNzYWdlKSAmJiAhZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGZpbmFsaXplZFByb2Nlc3NlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKHN0YXR1cyA9PT0gXCJ0YWtlb3ZlclwiIHx8IGhhc1Rha2VvdmVyTWVzc2FnZSkgJiYgIXRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIG5ldyBtZXNzYWdlczsgc3RpbGwgaG9ub3Igc3RhdHVzIGlmIGl0IGluZGljYXRlcyBhIHRlcm1pbmFsIHN0YXRlIChvbmNlIHBlciBjb252ZXJzYXRpb24pXG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJmaW5hbGl6ZWRcIiAmJiAhZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGZpbmFsaXplZFByb2Nlc3NlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHN2Yy5oYW5kbGVDb252ZXJzYXRpb25GaW5hbGl6ZWQoKTtcbiAgICAgICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBcInRha2VvdmVyXCIgJiYgIXRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc3ZjLm5vdGlmeVRha2VvdmVyRnJvbVBvbGwoKTtcbiAgICAgICAgICAgIHNldElzVGFrZW5PdmVyKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09IFwiZmluYWxpemVkXCIpIHtcbiAgICAgICAgICAvLyBNYXJrIGZpbmFsaXplZCBhbmQgbGV0IHRoZSBlZmZlY3QgY2xlYW51cCBwcmV2ZW50IGZ1cnRoZXIgc2NoZWR1bGluZ1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY3JlYXNlIHBvbGxpbmcgaW50ZXJ2YWwgb3ZlciB0aW1lIG9uIHN1Y2Nlc3NcbiAgICAgICAgLy8gY29uc3QgbmV4dEludGVydmFsID0gTWF0aC5taW4oXG4gICAgICAgIC8vICAgKGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgfHwgSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVMpICtcbiAgICAgICAgLy8gICAgIEhFQVJUQkVBVF9JTlRFUlZBTF9TVEVQX01TLFxuICAgICAgICAvLyAgIEhFQVJUQkVBVF9NQVhfSU5URVJWQUxfTVMsXG4gICAgICAgIC8vICk7XG4gICAgICAgIGNvbnN0IG5leHRJbnRlcnZhbCA9IEhFQVJUQkVBVF9JTlRFUlZBTF9TVEVQX01TO1xuICAgICAgICBoZWFydGJlYXRJbnRlcnZhbFJlZi5jdXJyZW50ID0gbmV4dEludGVydmFsO1xuICAgICAgICBzY2hlZHVsZU5leHQobmV4dEludGVydmFsKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgIC8vIEluY3JlbWVudCBmYWlsdXJlIGNvdW50ZXIgYW5kIHN0b3AgYWZ0ZXIgNSBjb25zZWN1dGl2ZSBmYWlsdXJlc1xuICAgICAgICBoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCArPSAxO1xuICAgICAgICBpZiAoaGVhcnRiZWF0RmFpbHVyZUNvdW50UmVmLmN1cnJlbnQgPj0gNSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXRyeURlbGF5ID1cbiAgICAgICAgICBoZWFydGJlYXRJbnRlcnZhbFJlZi5jdXJyZW50IHx8IEhFQVJUQkVBVF9JTklUSUFMX0lOVEVSVkFMX01TO1xuICAgICAgICBzY2hlZHVsZU5leHQocmV0cnlEZWxheSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFJlc2V0IGNvdW50ZXJzIGZvciB0aGlzIGNvbnZlcnNhdGlvbiBhbmQgc3RhcnQgaW1tZWRpYXRlbHlcbiAgICBoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCA9IDA7XG4gICAgaGVhcnRiZWF0SW50ZXJ2YWxSZWYuY3VycmVudCA9IEhFQVJUQkVBVF9JTklUSUFMX0lOVEVSVkFMX01TO1xuXG4gICAgaWYgKHVzZVBvbGwgJiYgIXVzZVdzKSB7XG4gICAgICBwb2xsKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICBpZiAodGltZW91dElkICE9PSBudWxsKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFt1c2VXcywgY29udmVyc2F0aW9uSWQsIGlzRmluYWxpemVkLCB1c2VQb2xsXSk7XG5cbiAgLy8gUmVzZXQgY29udmVyc2F0aW9uXG4gIGNvbnN0IHJlc2V0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0aW5nXCIpO1xuICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICAgIHNldFdlbGNvbWVUaXRsZShudWxsKTtcbiAgICAgIHNldFdlbGNvbWVJbWFnZVVybChudWxsKTtcbiAgICAgIHNldFdlbGNvbWVNZXNzYWdlKG51bGwpO1xuICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKFtdKTtcbiAgICAgIHNldFRoaW5raW5nRGVsYXlNcygxMDAwKTtcbiAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSAwO1xuICAgICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH1cbiAgICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZXNldCB0aGUgY29udmVyc2F0aW9uIGluIHRoZSBjaGF0IHNlcnZpY2VcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcblxuICAgICAgICAvLyBTdGFydCBhIG5ldyBjb252ZXJzYXRpb25cbiAgICAgICAgY29uc3QgY29udklkID1cbiAgICAgICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnN0YXJ0Q29udmVyc2F0aW9uKHJlQ2FwdGNoYVRva2VuKTtcbiAgICAgICAgc2V0Q29udmVyc2F0aW9uSWQoY29udklkKTtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiY29ubmVjdGVkXCIpO1xuXG4gICAgICAgIC8vIEdldCBwb3NzaWJsZSBxdWVyaWVzIGZyb20gQVBJIHJlc3BvbnNlXG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcykge1xuICAgICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcygpO1xuICAgICAgICAgIGlmIChxdWVyaWVzICYmIHF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB3ZWxjb21lIGFuZCB0aGlua2luZyBkYXRhXG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKSB7XG4gICAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEoKTtcbiAgICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcpIHtcbiAgICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcoKTtcbiAgICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhtZXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0Q2hhdElucHV0TWV0YWRhdGEobWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgb25Db25maWdMb2FkZWRSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICBjaGF0SW5wdXRNZXRhZGF0YTpcbiAgICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpID8/IHt9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImRpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcblxuICBjb25zdCB1cGxvYWRGaWxlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKGZpbGU6IEZpbGUpOiBQcm9taXNlPEF0dGFjaG1lbnQgfCBudWxsPiA9PiB7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LmdldENvbnZlcnNhdGlvbklkKCk7XG4gICAgICBpZiAoIWNvbnZlcnNhdGlvbklkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cGxvYWRSZXN1bHQgPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50Py51cGxvYWRGaWxlKFxuICAgICAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgIGZpbGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gY29uc3RydWN0IHRoZSBmaWxlIHVybCB3aXRoIHRoZSBiYXNlIHVybFxuICAgICAgICBjb25zdCBmaWxlX3VybCA9IG5ldyBVUkwodXBsb2FkUmVzdWx0IS5maWxlX3VybCEsIGJhc2VVcmwpLmhyZWY7XG5cbiAgICAgICAgY29uc3QgYXR0YWNobWVudDogQXR0YWNobWVudCA9IHtcbiAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICB1cmw6IGZpbGVfdXJsLFxuICAgICAgICAgIGZpbGVfaWQ6IHVwbG9hZFJlc3VsdD8uZmlsZV9pZCxcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRQcmVsb2FkZWRBdHRhY2htZW50cygocHJldikgPT4gWy4uLnByZXYsIGF0dGFjaG1lbnRdKTtcbiAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChpc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGFwaUtleSxcbiAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgYnVpbGRNZXNzYWdlc0tleSxcbiAgICAgIGlzVG9rZW5FeHBpcmVkRXJyb3IsXG4gICAgICByZXNldFRvSW5pdGlhbFN0YXRlLFxuICAgIF0sXG4gICk7XG5cbiAgLy8gU2VuZCBtZXNzYWdlXG4gIGNvbnN0IHNlbmRNZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgZmlsZXM6IEZpbGVbXSA9IFtdLFxuICAgICAgZXh0cmFNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICByZUNhcHRjaGFUb2tlbj86IHN0cmluZyxcbiAgICApID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaGF0IHNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdO1xuXG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdXBsb2FkZWRGaWxlcyA9IGZpbGVzXG4gICAgICAgICAgICAubWFwKChmKSA9PlxuICAgICAgICAgICAgICBwcmVsb2FkZWRBdHRhY2htZW50cy5maW5kKFxuICAgICAgICAgICAgICAgIChwYSkgPT4gcGEubmFtZSA9PT0gZi5uYW1lICYmIHBhLnNpemUgPT09IGYuc2l6ZSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgQXR0YWNobWVudFtdO1xuICAgICAgICAgIG5ld0F0dGFjaG1lbnRzLnB1c2goLi4udXBsb2FkZWRGaWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB0eXBpbmcgaW1tZWRpYXRlbHkgd2hlbiB1c2VyIHNlbmRzLCB1bmxlc3MgY29udmVyc2F0aW9uIGlzIHRha2VuIG92ZXIgYnkgYSBodW1hblxuICAgICAgICBpZiAoIWlzVGFrZW5PdmVyKSB7XG4gICAgICAgICAgc2V0SXNBZ2VudFR5cGluZyh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2VuZE1lc3NhZ2UoXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBuZXdBdHRhY2htZW50cyxcbiAgICAgICAgICBleHRyYU1ldGFkYXRhLFxuICAgICAgICAgIHJlQ2FwdGNoYVRva2VuLFxuICAgICAgICApO1xuXG4gICAgICAgIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzKFtdKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChpc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc05ldHdvcmtPclNlcnZlckVycm9yKGVycm9yKSkge1xuICAgICAgICAgIC8vIFNob3cgY3VzdG9tIHNlcnZlci11bmF2YWlsYWJsZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICAgICAgY29uc3QgY3JlYXRlVGltZSA9XG4gICAgICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50Py5nZXRDb252ZXJzYXRpb25DcmVhdGVUaW1lKCk7XG4gICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gY3JlYXRlVGltZSAhPSBudWxsID8gbm93IC0gY3JlYXRlVGltZSA6IDA7XG4gICAgICAgICAgY29uc3QgZW5kVGltZSA9IHN0YXJ0VGltZSArIDAuMDE7XG4gICAgICAgICAgY29uc3Qgc3BlY2lhbE1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgICAgY3JlYXRlX3RpbWU6IG5vdyxcbiAgICAgICAgICAgIHN0YXJ0X3RpbWU6IHN0YXJ0VGltZSxcbiAgICAgICAgICAgIGVuZF90aW1lOiBlbmRUaW1lLFxuICAgICAgICAgICAgc3BlYWtlcjogXCJzcGVjaWFsXCIsXG4gICAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UgPz8gREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfTUVTU0FHRSxcbiAgICAgICAgICAgIC4uLihzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwgJiYge1xuICAgICAgICAgICAgICBsaW5rVXJsOiBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgICAgICAgICAgIGxpbmtMYWJlbDpcbiAgICAgICAgICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCA/P1xuICAgICAgICAgICAgICAgIERFRkFVTFRfU0VSVkVSX1VOQVZBSUxBQkxFX0NPTlRBQ1RfTEFCRUwsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2V0TWVzc2FnZXMoKHByZXYpID0+IFsuLi5wcmV2LCBzcGVjaWFsTWVzc2FnZV0pO1xuICAgICAgICAgIC8vIERvbid0IGNhbGwgb25FcnJvciBzbyB0aGUgdXNlciBvbmx5IHNlZXMgb3VyIGN1c3RvbSBtZXNzYWdlXG4gICAgICAgIH0gZWxzZSBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgcHJlbG9hZGVkQXR0YWNobWVudHMsXG4gICAgICBpc1Rha2VuT3ZlcixcbiAgICAgIGlzVG9rZW5FeHBpcmVkRXJyb3IsXG4gICAgICByZXNldFRvSW5pdGlhbFN0YXRlLFxuICAgICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gICAgXSxcbiAgKTtcblxuICBjb25zdCBzdGFydENvbnZlcnNhdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChyZUNhcHRjaGFUb2tlbj86IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RpbmdcIik7XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcblxuICAgICAgICAvLyBSZXNldCBzdGF0ZSBmb3IgbmV3IGNvbnZlcnNhdGlvblxuICAgICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhbXSk7XG4gICAgICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIoZmFsc2UpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcblxuICAgICAgICBjb25zdCBjb252SWQgPVxuICAgICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW4pO1xuICAgICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0ZWRcIik7XG5cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKSB7XG4gICAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEoKTtcbiAgICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcpIHtcbiAgICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcoKTtcbiAgICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhtZXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0Q2hhdElucHV0TWV0YWRhdGEobWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgb25Db25maWdMb2FkZWRSZWYuY3VycmVudD8uKHtcbiAgICAgICAgICBjaGF0SW5wdXRNZXRhZGF0YTpcbiAgICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpID8/IHt9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImRpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcblxuICAvLyBBZGQgZmVlZGJhY2sgdG8gYW4gYWdlbnQgbWVzc2FnZVxuICBjb25zdCBhZGRGZWVkYmFjayA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIG1lc3NhZ2VJZDogc3RyaW5nLFxuICAgICAgdmFsdWU6IFwiZ29vZFwiIHwgXCJiYWRcIixcbiAgICAgIGZlZWRiYWNrTWVzc2FnZT86IHN0cmluZyxcbiAgICApID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IHNlbmQgZmVlZGJhY2s6IENoYXRTZXJ2aWNlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFtZXNzYWdlSWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCBzZW5kIGZlZWRiYWNrOiBtZXNzYWdlSWQgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5hZGRGZWVkYmFjayhcbiAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgZmVlZGJhY2tNZXNzYWdlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZlZWRiYWNrOiBNZXNzYWdlRmVlZGJhY2sgPSB7XG4gICAgICAgICAgZmVlZGJhY2s6IHZhbHVlLFxuICAgICAgICAgIGZlZWRiYWNrX21lc3NhZ2U6IGZlZWRiYWNrTWVzc2FnZSxcbiAgICAgICAgICBmZWVkYmFja190aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRNZXNzYWdlcygocHJldikgPT5cbiAgICAgICAgICBwcmV2Lm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgLy8gTWF0Y2ggYnkgbWVzc2FnZV9pZCBvciBpZCBmaWVsZFxuICAgICAgICAgICAgY29uc3QgbXNnSWQgPSBtLm1lc3NhZ2VfaWQgfHwgKG0gYXMgYW55KS5pZDtcbiAgICAgICAgICAgIHJldHVybiBtc2dJZCA9PT0gbWVzc2FnZUlkXG4gICAgICAgICAgICAgID8geyAuLi5tLCBmZWVkYmFjazogWy4uLihtLmZlZWRiYWNrIHx8IFtdKSwgbmV3RmVlZGJhY2tdIH1cbiAgICAgICAgICAgICAgOiBtO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvciBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXMsXG4gICAgaXNMb2FkaW5nLFxuICAgIHNlbmRNZXNzYWdlLFxuICAgIHVwbG9hZEZpbGUsXG4gICAgcmVzZXRDb252ZXJzYXRpb24sXG4gICAgc3RhcnRDb252ZXJzYXRpb24sXG4gICAgY29ubmVjdGlvblN0YXRlLFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIHBvc3NpYmxlUXVlcmllcyxcbiAgICBpc1Rha2VuT3ZlcixcbiAgICBpc0ZpbmFsaXplZCxcbiAgICBpc0FnZW50VHlwaW5nLFxuICAgIGFkZEZlZWRiYWNrLFxuICAgIHdlbGNvbWVUaXRsZSxcbiAgICB3ZWxjb21lSW1hZ2VVcmwsXG4gICAgd2VsY29tZU1lc3NhZ2UsXG4gICAgdGhpbmtpbmdQaHJhc2VzLFxuICAgIHRoaW5raW5nRGVsYXlNcyxcbiAgICBjaGF0SW5wdXRNZXRhZGF0YSxcbiAgfTtcbn07XG4iXX0=
@@ -1,10 +1,12 @@
1
1
  interface AudioServiceConfig {
2
2
  baseUrl: string;
3
+ websocketUrl: string | undefined;
3
4
  apiKey: string;
4
5
  guestToken?: string;
5
6
  }
6
7
  export declare class AudioService {
7
8
  private baseUrl;
9
+ private websocketUrl;
8
10
  private apiKey;
9
11
  private guestToken;
10
12
  private ws;
@@ -37,12 +37,19 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  import { createWebSocket } from '../utils/websocket';
38
38
  var AudioService = /** @class */ (function () {
39
39
  function AudioService(config) {
40
+ var _a, _b;
40
41
  this.guestToken = null;
41
42
  this.ws = null;
42
43
  this.audioChunks = [];
43
44
  this.resolvePromise = null;
44
45
  this.rejectPromise = null;
45
46
  this.baseUrl = config.baseUrl;
47
+ if (!this.websocketUrl) {
48
+ this.websocketUrl = this.baseUrl.replace("http", "ws");
49
+ }
50
+ else {
51
+ this.websocketUrl = ((_a = config.websocketUrl) === null || _a === void 0 ? void 0 : _a.endsWith("/")) ? (_b = config.websocketUrl) === null || _b === void 0 ? void 0 : _b.slice(0, -1) : config.websocketUrl;
52
+ }
46
53
  this.apiKey = config.apiKey;
47
54
  this.guestToken = config.guestToken || null;
48
55
  }
@@ -62,7 +69,7 @@ var AudioService = /** @class */ (function () {
62
69
  _this.rejectPromise = reject;
63
70
  _this.audioChunks = [];
64
71
  // Build WebSocket URL with proper authentication
65
- var wsBase = _this.baseUrl.replace('http', 'ws');
72
+ var wsBase = _this.websocketUrl;
66
73
  // Use guest_token if available, otherwise fall back to api_key
67
74
  var authParam = _this.guestToken
68
75
  ? "access_token=".concat(encodeURIComponent(_this.guestToken))
@@ -129,4 +136,4 @@ var AudioService = /** @class */ (function () {
129
136
  return AudioService;
130
137
  }());
131
138
  export { AudioService };
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9TZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2F1ZGlvU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFRckQ7SUFTRSxzQkFBWSxNQUEwQjtRQU45QixlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyxPQUFFLEdBQXFCLElBQUksQ0FBQztRQUM1QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUFtQyxJQUFJLENBQUM7UUFDdEQsa0JBQWEsR0FBb0MsSUFBSSxDQUFDO1FBRzVELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQ0FBYSxHQUFiLFVBQWMsS0FBb0I7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVLLG1DQUFZLEdBQWxCOzREQUFtQixJQUFZLEVBQUUsS0FBdUI7O1lBQXZCLHNCQUFBLEVBQUEsZUFBdUI7O2dCQUN0RCxzQkFBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO3dCQUNqQyxLQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQzt3QkFDOUIsS0FBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7d0JBQzVCLEtBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO3dCQUV0QixpREFBaUQ7d0JBQ2pELElBQU0sTUFBTSxHQUFHLEtBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1B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SyxDQUFDLENBQUM7d0JBQ2hCLENBQUMsQ0FBQzt3QkFFRixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM3QixDQUFDLENBQUMsRUFBQzs7O0tBQ0o7SUFDSCxtQkFBQztBQUFELENBQUMsQUEzRkQsSUEyRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVXZWJTb2NrZXQgfSBmcm9tICcuLi91dGlscy93ZWJzb2NrZXQnO1xuXG5pbnRlcmZhY2UgQXVkaW9TZXJ2aWNlQ29uZmlnIHtcbiAgYmFzZVVybDogc3RyaW5nO1xuICBhcGlLZXk6IHN0cmluZztcbiAgZ3Vlc3RUb2tlbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEF1ZGlvU2VydmljZSB7XG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICBwcml2YXRlIGFwaUtleTogc3RyaW5nO1xuICBwcml2YXRlIGd1ZXN0VG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdzOiBXZWJTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhdWRpb0NodW5rczogQmxvYltdID0gW107XG4gIHByaXZhdGUgcmVzb2x2ZVByb21pc2U6ICgodmFsdWU6IEJsb2IpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVqZWN0UHJvbWlzZTogKChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBBdWRpb1NlcnZpY2VDb25maWcpIHtcbiAgICB0aGlzLmJhc2VVcmwgPSBjb25maWcuYmFzZVVybDtcbiAgICB0aGlzLmFwaUtleSA9IGNvbmZpZy5hcGlLZXk7XG4gICAgdGhpcy5ndWVzdFRva2VuID0gY29uZmlnLmd1ZXN0VG9rZW4gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGd1ZXN0IHRva2VuIGZvciBXZWJTb2NrZXQgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHNldEd1ZXN0VG9rZW4odG9rZW46IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmd1ZXN0VG9rZW4gPSB0b2tlbjtcbiAgfVxuXG4gIGFzeW5jIHRleHRUb1NwZWVjaCh0ZXh0OiBzdHJpbmcsIHZvaWNlOiBzdHJpbmcgPSAnYWxsb3knKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgICAgdGhpcy5yZWplY3RQcm9taXNlID0gcmVqZWN0O1xuICAgICAgdGhpcy5hdWRpb0NodW5rcyA9IFtdO1xuXG4gICAgICAvLyBCdWlsZCBXZWJTb2NrZXQgVVJMIHdpdGggcHJvcGVyIGF1dGhlbnRpY2F0aW9uXG4gICAgICBjb25zdCB3c0Jhc2UgPSB0aGlzLmJhc2VVcmwucmVwbGFjZSgnaHR0cCcsICd3cycpO1xuICAgICAgLy8gVXNlIGd1ZXN0X3Rva2VuIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBhcGlfa2V5XG4gICAgICBjb25zdCBhdXRoUGFyYW0gPSB0aGlzLmd1ZXN0VG9rZW4gXG4gICAgICAgID8gYGFjY2Vzc190b2tlbj0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmd1ZXN0VG9rZW4pfWBcbiAgICAgICAgOiBgYXBpX2tleT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmFwaUtleSl9YDtcbiAgICAgIGNvbnN0IHdzVXJsID0gYCR7d3NCYXNlfS9hcGkvdm9pY2UvYXVkaW8vdHRzPyR7YXV0aFBhcmFtfWA7XG4gICAgICB0aGlzLndzID0gY3JlYXRlV2ViU29ja2V0KHdzVXJsKTtcblxuICAgICAgdGhpcy53cy5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMud3M/LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB0ZXh0IH0pKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMud3Mub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5kYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICAgIHRoaXMuYXVkaW9DaHVua3MucHVzaChldmVudC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy53cy5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5hdWRpb0NodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgYXVkaW9CbG9iID0gbmV3IEJsb2IodGhpcy5hdWRpb0NodW5rcywgeyB0eXBlOiAnYXVkaW8vbXAzJyB9KTtcbiAgICAgICAgICB0aGlzLnJlc29sdmVQcm9taXNlPy4oYXVkaW9CbG9iKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlamVjdFByb21pc2U/LihuZXcgRXJyb3IoJ05vIGF1ZGlvIGRhdGEgcmVjZWl2ZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLndzLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5yZWplY3RQcm9taXNlPy4oZXJyb3IpO1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgICAgIHRoaXMud3MgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlc29sdmVQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLnJlamVjdFByb21pc2UgPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgcGxheUF1ZGlvKGF1ZGlvQmxvYjogQmxvYik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGF1ZGlvVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChhdWRpb0Jsb2IpO1xuICAgIGNvbnN0IGF1ZGlvID0gbmV3IEF1ZGlvKGF1ZGlvVXJsKTtcbiAgICBcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYXVkaW8ub25lbmRlZCA9ICgpID0+IHtcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChhdWRpb1VybCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGF1ZGlvLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChhdWRpb1VybCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuICAgICAgXG4gICAgICBhdWRpby5wbGF5KCkuY2F0Y2gocmVqZWN0KTtcbiAgICB9KTtcbiAgfVxufSAiXX0=
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9TZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2F1ZGlvU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFTckQ7SUFVRSxzQkFBWSxNQUEwQjs7UUFOOUIsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFDakMsT0FBRSxHQUFxQixJQUFJLENBQUM7UUFDNUIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsbUJBQWMsR0FBbUMsSUFBSSxDQUFDO1FBQ3RELGtCQUFhLEdBQW9DLElBQUksQ0FBQztRQUc1RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQSxNQUFBLE1BQU0sQ0FBQyxZQUFZLDBDQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBQyxDQUFDLENBQUMsTUFBQSxNQUFNLENBQUMsWUFBWSwwQ0FBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDbkgsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILG9DQUFhLEdBQWIsVUFBYyxLQUFv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QyxDQUFDO2dCQUMxQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRWxDLHNCQUFPLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07d0JBQ2pDLEtBQUssQ0FBQyxPQUFPLEdBQUc7NEJBQ2QsR0FBRyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDOUIsT0FBTyxFQUFFLENBQUM7d0JBQ1osQ0FBQyxDQUFDO3dCQUVGLEtBQUssQ0FBQyxPQUFPLEdBQUcsVUFBQyxLQUFLOzRCQUNwQixHQUFHLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ2hCLENBQUMsQ0FBQzt3QkFFRixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM3QixDQUFDLENBQUMsRUFBQzs7O0tBQ0o7SUFDSCxtQkFBQztBQUFELENBQUMsQUFqR0QsSUFpR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVXZWJTb2NrZXQgfSBmcm9tICcuLi91dGlscy93ZWJzb2NrZXQnO1xuXG5pbnRlcmZhY2UgQXVkaW9TZXJ2aWNlQ29uZmlnIHtcbiAgYmFzZVVybDogc3RyaW5nO1xuICB3ZWJzb2NrZXRVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIGd1ZXN0VG9rZW4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBBdWRpb1NlcnZpY2Uge1xuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSB3ZWJzb2NrZXRVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhcGlLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSBndWVzdFRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3czogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYXVkaW9DaHVua3M6IEJsb2JbXSA9IFtdO1xuICBwcml2YXRlIHJlc29sdmVQcm9taXNlOiAoKHZhbHVlOiBCbG9iKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlamVjdFByb21pc2U6ICgocmVhc29uPzogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQXVkaW9TZXJ2aWNlQ29uZmlnKSB7XG4gICAgdGhpcy5iYXNlVXJsID0gY29uZmlnLmJhc2VVcmw7XG4gICAgaWYgKCF0aGlzLndlYnNvY2tldFVybCkge1xuICAgICAgdGhpcy53ZWJzb2NrZXRVcmwgPSB0aGlzLmJhc2VVcmwucmVwbGFjZShcImh0dHBcIiwgXCJ3c1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53ZWJzb2NrZXRVcmwgPSBjb25maWcud2Vic29ja2V0VXJsPy5lbmRzV2l0aChcIi9cIikgPyBjb25maWcud2Vic29ja2V0VXJsPy5zbGljZSgwLCAtMSkgOiBjb25maWcud2Vic29ja2V0VXJsO1xuICAgIH1cbiAgICB0aGlzLmFwaUtleSA9IGNvbmZpZy5hcGlLZXk7XG4gICAgdGhpcy5ndWVzdFRva2VuID0gY29uZmlnLmd1ZXN0VG9rZW4gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGd1ZXN0IHRva2VuIGZvciBXZWJTb2NrZXQgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHNldEd1ZXN0VG9rZW4odG9rZW46IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmd1ZXN0VG9rZW4gPSB0b2tlbjtcbiAgfVxuXG4gIGFzeW5jIHRleHRUb1NwZWVjaCh0ZXh0OiBzdHJpbmcsIHZvaWNlOiBzdHJpbmcgPSAnYWxsb3knKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgICAgdGhpcy5yZWplY3RQcm9taXNlID0gcmVqZWN0O1xuICAgICAgdGhpcy5hdWRpb0NodW5rcyA9IFtdO1xuXG4gICAgICAvLyBCdWlsZCBXZWJTb2NrZXQgVVJMIHdpdGggcHJvcGVyIGF1dGhlbnRpY2F0aW9uXG4gICAgICBjb25zdCB3c0Jhc2UgPSB0aGlzLndlYnNvY2tldFVybDtcbiAgICAgIC8vIFVzZSBndWVzdF90b2tlbiBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gYXBpX2tleVxuICAgICAgY29uc3QgYXV0aFBhcmFtID0gdGhpcy5ndWVzdFRva2VuXG4gICAgICAgID8gYGFjY2Vzc190b2tlbj0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmd1ZXN0VG9rZW4pfWBcbiAgICAgICAgOiBgYXBpX2tleT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmFwaUtleSl9YDtcbiAgICAgIGNvbnN0IHdzVXJsID0gYCR7d3NCYXNlfS9hcGkvdm9pY2UvYXVkaW8vdHRzPyR7YXV0aFBhcmFtfWA7XG4gICAgICB0aGlzLndzID0gY3JlYXRlV2ViU29ja2V0KHdzVXJsKTtcblxuICAgICAgdGhpcy53cy5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMud3M/LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB0ZXh0IH0pKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMud3Mub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5kYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICAgIHRoaXMuYXVkaW9DaHVua3MucHVzaChldmVudC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy53cy5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5hdWRpb0NodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgYXVkaW9CbG9iID0gbmV3IEJsb2IodGhpcy5hdWRpb0NodW5rcywgeyB0eXBlOiAnYXVkaW8vbXAzJyB9KTtcbiAgICAgICAgICB0aGlzLnJlc29sdmVQcm9taXNlPy4oYXVkaW9CbG9iKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlamVjdFByb21pc2U/LihuZXcgRXJyb3IoJ05vIGF1ZGlvIGRhdGEgcmVjZWl2ZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLndzLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5yZWplY3RQcm9taXNlPy4oZXJyb3IpO1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgICAgIHRoaXMud3MgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlc29sdmVQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLnJlamVjdFByb21pc2UgPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgcGxheUF1ZGlvKGF1ZGlvQmxvYjogQmxvYik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGF1ZGlvVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChhdWRpb0Jsb2IpO1xuICAgIGNvbnN0IGF1ZGlvID0gbmV3IEF1ZGlvKGF1ZGlvVXJsKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBhdWRpby5vbmVuZGVkID0gKCkgPT4ge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGF1ZGlvVXJsKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgYXVkaW8ub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGF1ZGlvVXJsKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIGF1ZGlvLnBsYXkoKS5jYXRjaChyZWplY3QpO1xuICAgIH0pO1xuICB9XG59Il19
@@ -2,6 +2,7 @@ import { ChatMessage, Attachment, AgentThinkingConfig, AgentWelcomeData, FileUpl
2
2
  export declare const GENASSIST_AGENT_METADATA_UPDATED = "genassist_agent_metadata_updated";
3
3
  export declare class ChatService {
4
4
  private baseUrl;
5
+ private websocketUrl;
5
6
  private apiKey;
6
7
  private metadata;
7
8
  private conversationId;
@@ -28,7 +29,7 @@ export declare class ChatService {
28
29
  private serverUnavailableContactUrl;
29
30
  private serverUnavailableContactLabel;
30
31
  private usePoll;
31
- constructor(baseUrl: string, apiKey: string, metadata?: Record<string, any>, tenant?: string, language?: string, useWs?: boolean, usePoll?: boolean);
32
+ constructor(baseUrl: string, websocketUrl: string | undefined, apiKey: string, metadata?: Record<string, any>, tenant?: string, language?: string, useWs?: boolean, usePoll?: boolean);
32
33
  private getStorageKey;
33
34
  /**
34
35
  * Handle conversation finalized: emit special message, call finalized handler, persist state.