@sapui5/sap.fe.test 1.112.0 → 1.113.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.test",
3
- "version": "1.112.0",
3
+ "version": "1.113.0",
4
4
  "description": "SAPUI5 Library sap.fe.test",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -6,7 +6,7 @@
6
6
  SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.112.0</version>
9
+ <version>1.113.0</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.test</documentation>
12
12
 
@@ -118,6 +118,38 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
118
118
  },
119
119
  pass: nodes && nodes.length === 0
120
120
  };
121
+ },
122
+ /**
123
+ * Checks for errors in `xml` created during templating of an XML string or
124
+ * an XML node.
125
+ *
126
+ * This function checkes for the xml errors created by the
127
+ * function [BuildingBlockTemplateProcessor.createErrorXML]{@link sap.fe.core.buildingBlocks.BuildingBlockTemplateProcessor#createErrorXML}.
128
+ *
129
+ * @param xml XML String or XML Node to be tested for errors
130
+ * @returns Jest Matcher result object
131
+ */
132
+ toHaveTemplatingErrors(xml) {
133
+ const xmlText = typeof xml === "string" ? xml : serializeXML(xml);
134
+ const base64Entries = xmlText.match(/BBF\.base64Decode\('([^']*)'\)/gm) || [];
135
+ const errorMessages = base64Entries.map(message => {
136
+ if (message && message.length > 0) {
137
+ var _message$match, _message$match$;
138
+ return atob(((_message$match = message.match(/('[^']*)/)) === null || _message$match === void 0 ? void 0 : (_message$match$ = _message$match[0]) === null || _message$match$ === void 0 ? void 0 : _message$match$.slice(1)) || "");
139
+ }
140
+ return "";
141
+ });
142
+ if (errorMessages.length <= 0) {
143
+ return {
144
+ message: () => `XML Templating without errors`,
145
+ pass: false
146
+ };
147
+ } else {
148
+ return {
149
+ message: () => errorMessages.join("\n"),
150
+ pass: true
151
+ };
152
+ }
121
153
  }
122
154
  });
123
155
  _exports.runXPathQuery = runXPathQuery;
@@ -134,10 +166,24 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
134
166
  const selector = `string(${_getTemplatedSelector(xmlDom, controlSelector)}/@${attributeName})`;
135
167
  return runXPathQuery(selector, xmlDom);
136
168
  };
169
+
170
+ /**
171
+ * Serialize the parts or the complete given XML DOM to string.
172
+ *
173
+ * @param xmlDom DOM node that is to be serialized.
174
+ * @param selector Optional selector of sub nodes
175
+ * @returns XML string
176
+ */
137
177
  _exports.getControlAttribute = getControlAttribute;
138
- const serializeXML = function (xmlDom) {
178
+ const serializeXML = function (xmlDom, selector) {
139
179
  const serializer = new window.XMLSerializer();
140
- const xmlString = serializer.serializeToString(xmlDom);
180
+ let xmlString;
181
+ if (selector) {
182
+ const nodes = runXPathQuery(selector, xmlDom);
183
+ xmlString = nodes.map(node => serializer.serializeToString(node)).join("\n");
184
+ } else {
185
+ xmlString = serializer.serializeToString(xmlDom);
186
+ }
141
187
  return formatXML(xmlString);
142
188
  };
143
189
  _exports.serializeXML = serializeXML;
@@ -397,7 +443,9 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
397
443
  _exports.getTemplatingResult = getTemplatingResult;
398
444
  const getTemplatedXML = async function (xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges, fakeSideEffectService) {
399
445
  const templatedXML = await getTemplatingResult(xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges, fakeSideEffectService);
400
- return serializeXML(templatedXML);
446
+ const serialiedXML = serializeXML(templatedXML);
447
+ expect(serialiedXML).not.toHaveTemplatingErrors();
448
+ return serialiedXML;
401
449
  };
402
450
 
403
451
  /**
@@ -570,4 +618,4 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
570
618
  _exports.createAwaiter = createAwaiter;
571
619
  return _exports;
572
620
  }, false);
573
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3JtYXRYbWwiLCJyZXF1aXJlIiwiTG9nIiwic2V0TGV2ZWwiLCJqZXN0Iiwic2V0VGltZW91dCIsIm5hbWVTcGFjZU1hcCIsIm1hY3JvcyIsIm1hY3JvIiwibWFjcm9GaWVsZCIsIm1hY3JvZGF0YSIsImxvZyIsInVuaXR0ZXN0IiwiY29udHJvbCIsImNvbnRyb2xzIiwiY29yZSIsImR0IiwibSIsImYiLCJmbCIsImludGVybmFsTWFjcm8iLCJtZGMiLCJtZGNhdCIsIm1kY0ZpZWxkIiwibWRjVGFibGUiLCJ1IiwibWFjcm9NaWNyb0NoYXJ0IiwibWljcm9DaGFydCIsIm1hY3JvVGFibGUiLCJzZWxlY3QiLCJ4cGF0aCIsInVzZU5hbWVzcGFjZXMiLCJkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlIiwiY29tcHV0ZUZpZWxkR3JvdXBJZHMiLCJfZ2V0VGVtcGxhdGVkU2VsZWN0b3IiLCJ4bWxkb20iLCJzZWxlY3RvciIsInJvb3RQYXRoIiwibm9kZU5hbWUiLCJzdGFydHNXaXRoIiwiX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3MiLCJzTWV0YWRhdGFVcmwiLCJtQmluZGluZ0NvbnRleHRzIiwibU1vZGVscyIsImZha2VTaWRlRWZmZWN0U2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJoYXNPd25Qcm9wZXJ0eSIsIk9iamVjdCIsImFzc2lnbiIsImNvbnZlcnRlckNvbnRleHQiLCJUZW1wbGF0ZU1vZGVsIiwia2V5cyIsImZvckVhY2giLCJzTW9kZWxOYW1lIiwiaXNUZW1wbGF0ZU1vZGVsIiwiZGF0YSIsInNldHRpbmdzIiwibW9kZWxzIiwibWV0YU1vZGVsIiwiYmluZGluZ0NvbnRleHRzIiwiYXBwQ29tcG9uZW50IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZm4iLCJnZXREaWFnbm9zdGljcyIsInVuZGVmaW5lZCIsIm1vY2tSZXR1cm5WYWx1ZSIsInNLZXkiLCJleHBlY3QiLCJnZXRPYmplY3QiLCJ0b0JlRGVmaW5lZCIsIm9Nb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiX3JlbW92ZUNvbW1lbnRGcm9tWG1sIiwieG1sIiwiZmlsdGVyIiwibm9kZSIsInR5cGUiLCJfbG9hZFJlc291cmNlVmlldyIsInZpZXdOYW1lIiwibmFtZSIsInJlcGxhY2UiLCJ2aWV3IiwiTG9hZGVyRXh0ZW5zaW9ucyIsImxvYWRSZXNvdXJjZSIsImRvY3VtZW50RWxlbWVudCIsInJ1blhQYXRoUXVlcnkiLCJleHRlbmQiLCJ0b0hhdmVDb250cm9sIiwibm9kZXMiLCJtZXNzYWdlIiwib3V0cHV0WG1sIiwic2VyaWFsaXplWE1MIiwicGFzcyIsImxlbmd0aCIsInRvTm90SGF2ZUNvbnRyb2wiLCJmb3JtYXRCdWlsZGluZ0Jsb2NrWE1MIiwieG1sU3RyaW5nIiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsInhtbEZvcm1hdHRlZCIsImZvcm1hdFhNTCIsImdldENvbnRyb2xBdHRyaWJ1dGUiLCJjb250cm9sU2VsZWN0b3IiLCJhdHRyaWJ1dGVOYW1lIiwieG1sRG9tIiwic2VyaWFsaXplciIsIndpbmRvdyIsIlhNTFNlcmlhbGl6ZXIiLCJzZXJpYWxpemVUb1N0cmluZyIsImZvcm1hdCIsInBhcnNlciIsInhtbFdoaXRlc3BhY2VTZW5zaXRpdml0eSIsInBsdWdpbnMiLCJwbHVnaW4iLCJjb21waWxlQ0RTIiwiY2RzVXJsIiwib3B0aW9ucyIsImVkbXhGaWxlTmFtZSIsInBhdGgiLCJiYXNlbmFtZSIsImNkc1N0cmluZyIsImZzIiwicmVhZEZpbGVTeW5jIiwiZWRteENvbnRlbnQiLCJjZHMyZWRteCIsImRpciIsInJlc29sdmUiLCJlZG14RmlsZVBhdGgiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJ3cml0ZUZpbGVTeW5jIiwiY2RzIiwic2VydmljZSIsInNvdXJjZXMiLCJpbmNsdWRlcyIsImNzbiIsImNvbXBpbGVyIiwiY29tcGlsZVNvdXJjZXMiLCJlZG14T3B0aW9ucyIsIm9kYXRhRm9yZWlnbktleXMiLCJvZGF0YUZvcm1hdCIsIm9kYXRhQ29udGFpbm1lbnQiLCJlZG14IiwidG8iLCJFcnJvciIsImdldEZha2VTaWRlRWZmZWN0c1NlcnZpY2UiLCJvU2VydmljZUNvbnRleHQiLCJzY29wZU9iamVjdCIsInNjb3BlVHlwZSIsIlNpZGVFZmZlY3RzRmFjdG9yeSIsImNyZWF0ZUluc3RhbmNlIiwidGhlbiIsIm9TZXJ2aWNlSW5zdGFuY2UiLCJvSmVzdFNpZGVFZmZlY3RzU2VydmljZSIsImdldEludGVyZmFjZSIsImdldENvbnRleHQiLCJnZXRNb2RlbCIsImdldEZha2VEaWFnbm9zdGljcyIsImlzc3VlcyIsImFkZElzc3VlIiwiaXNzdWVDYXRlZ29yeSIsImlzc3VlU2V2ZXJpdHkiLCJkZXRhaWxzIiwicHVzaCIsImdldElzc3VlcyIsImNoZWNrSWZJc3N1ZUV4aXN0cyIsImZpbmQiLCJpc3N1ZSIsImdldENvbnZlcnRlckNvbnRleHRGb3JUZXN0IiwiY29udmVydGVkVHlwZXMiLCJtYW5pZmVzdFNldHRpbmdzIiwiZW50aXR5U2V0IiwiZW50aXR5U2V0cyIsImVzIiwiZGF0YU1vZGVsUGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSIsIkNvbnZlcnRlckNvbnRleHQiLCJtZXJnZSIsIm1ldGFNb2RlbENhY2hlIiwib1JlcXVlc3RvciIsIl9NZXRhZGF0YVJlcXVlc3RvciIsImNyZWF0ZSIsIk9EYXRhTWV0YU1vZGVsIiwiZmV0Y2hFbnRpdHlDb250YWluZXIiLCJwcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJzdGFydGluZ0VudGl0eVNldCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJjb250ZXh0TG9jYXRpb24iLCJldmFsdWF0ZUJpbmRpbmciLCJiaW5kaW5nU3RyaW5nIiwiYmluZGluZ0VsZW1lbnQiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsImFyZ3MiLCJmb3JtYXR0ZXIiLCJhcHBseSIsImV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbCIsIm1vZGVsQ29udGVudCIsIm5hbWVkTW9kZWxzQ29udGVudCIsInRleHQiLCJJbnZpc2libGVUZXh0IiwiYmluZFByb3BlcnR5IiwiZGVmYXVsdE1vZGVsIiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNvbnRlbnQiLCJlbnRyaWVzIiwibW9kZWwiLCJnZXRUZXh0IiwiVEVTVFZJRVdJRCIsImFwcGx5RmxleENoYW5nZXMiLCJmbGV4Q2hhbmdlcyIsInJlc3VsdFhNTCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpZCIsImNoYW5nZXMiLCJjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QiLCJhcHBJZCIsIm9NYW5pZmVzdCIsImNyb3NzTmF2aWdhdGlvbiIsIm91dGJvdW5kcyIsIm9BcHBDb21wb25lbnQiLCJnZXRDb21wb25lbnREYXRhIiwiZ2V0TWFuaWZlc3RPYmplY3QiLCJnZXRFbnRyeSIsImdldExvY2FsSWQiLCJzSWQiLCJzcHlPbiIsIkFwcFN0b3JhZ2UiLCJQcm9taXNlIiwiQ29tcG9uZW50IiwiVXRpbHMiLCJGbGV4U3RhdGUiLCJpbml0aWFsaXplIiwiY29tcG9uZW50SWQiLCJYbWxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwiY2hhbmdlc0FwcGxpZWQiLCJnZXRDaGFuZ2VzRnJvbVhNTCIsInRvQmUiLCJ2YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMiLCJmbGF0TWFwIiwiZSIsImF0dHJpYnV0ZXMiLCJtYXAiLCJhIiwiYXR0ciIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsImNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsIiwidGVtcGxhdGVkWG1sIiwiRE9NUGFyc2VyIiwieG1sRG9jIiwicGFyc2VGcm9tU3RyaW5nIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwiWE1MUHJlcHJvY2Vzc29yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJnZXRUZW1wbGF0ZWRYTUwiLCJ0ZW1wbGF0ZWRYTUwiLCJwcm9jZXNzVmlldyIsIm9WaWV3RG9jdW1lbnQiLCJvUHJlcHJvY2Vzc2VkVmlldyIsImFzRWxlbWVudCIsImFzU3RyaW5nIiwib3V0ZXJIVE1MIiwicHJvY2Vzc0ZyYWdtZW50IiwidGVzdERhdGEiLCJpbnB1dFhtbCIsImlucHV0RG9jIiwianNvbk1vZGVsIiwic2V0RGF0YSIsInJlc3VsdERvYyIsImZyYWdtZW50cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZnJhZ21lbnQiLCJpbm5lckhUTUwiLCJ4bWxSZXN1bHQiLCJjaGlsZHJlbiIsInNlcmlhbGl6ZUNvbnRyb2wiLCJjb250cm9sVG9TZXJpYWxpemUiLCJ0YWJDb3VudCIsImdldFRhYiIsInRvQWRkIiwidGFiIiwiaSIsInNlcmlhbGl6ZURlbGVnYXRlIiwic3RhcnQiLCJzQWdncmVnYXRpb25OYW1lIiwiY29udHJvbERldGFpbCIsImdldFBhcmVudCIsImluZGV4SW5QYXJlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImluZGV4T2YiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJlbmQiLCJtaWRkbGUiLCJnZXRJZCIsIk1hbmFnZWRPYmplY3RNZXRhZGF0YSIsImlzR2VuZXJhdGVkSWQiLCJvQ29udHJvbEtleSIsIm1Qcm9wZXJ0aWVzIiwibUJpbmRpbmdJbmZvcyIsImJpbmRpbmdEZXRhaWwiLCJKU09OIiwic3RyaW5naWZ5IiwibUFzc29jaWF0aW9ucyIsIm1FdmVudFJlZ2lzdHJ5Iiwic3RhcnRBZ2dyZWdhdGlvbiIsInNOYW1lIiwib3V0IiwiZW5kQWdncmVnYXRpb24iLCJjb250cm9sVG9SZW5kZXIiLCJTZXJpYWxpemVyIiwic2VyaWFsaXplIiwiY3JlYXRlQXdhaXRlciIsImZuUmVzb2x2ZSIsIm15UHJvbWlzZSIsInByb21pc2UiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQW55QW5ub3RhdGlvbiwgQ29udmVydGVkTWV0YWRhdGEsIEVudGl0eVNldCwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBjb21waWxlciBmcm9tIFwiQHNhcC9jZHMtY29tcGlsZXJcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0ICogYXMgcGx1Z2luIGZyb20gXCJAcHJldHRpZXIvcGx1Z2luLXhtbFwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwicHJldHRpZXJcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IExvYWRlckV4dGVuc2lvbnMgZnJvbSBcInNhcC9iYXNlL3V0aWwvTG9hZGVyRXh0ZW5zaW9uc1wiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzLCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgSURpYWdub3N0aWNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCBTaWRlRWZmZWN0c0ZhY3RvcnkgZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBjcmVhdGVNb2NrUmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvdGVzdC9VSTVNb2NrSGVscGVyXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RNZXRhZGF0YVwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEludmlzaWJsZVRleHQgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVRleHRcIjtcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL3NlcmlhbGl6ZXIvU2VyaWFsaXplclwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBGbGV4U3RhdGUgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvZmxleFN0YXRlL0ZsZXhTdGF0ZVwiO1xuaW1wb3J0IFhtbFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L19pbnRlcm5hbC9wcmVwcm9jZXNzb3JzL1htbFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEFwcFN0b3JhZ2UgZnJvbSBcInNhcC91aS9mbC9pbml0aWFsL19pbnRlcm5hbC9TdG9yYWdlXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcInNhcC91aS9mbC9VdGlsc1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IE1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01ldGFNb2RlbFwiO1xuaW1wb3J0IF9NZXRhZGF0YVJlcXVlc3RvciBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L2xpYi9fTWV0YWRhdGFSZXF1ZXN0b3JcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCB4cGF0aCBmcm9tIFwieHBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZUZsZXhpYmlsaXR5Q2hhbmdlc09iamVjdCB9IGZyb20gXCIuL0plc3RGbGV4aWJpbGl0eUhlbHBlclwiO1xuXG50eXBlIFByZVByb2Nlc3NvclNldHRpbmdzVHlwZSA9IHtcblx0bW9kZWxzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IEpTT05Nb2RlbCB8IE9EYXRhTWV0YU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRbbmFtZTogc3RyaW5nXTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0fTtcbn07XG5cbnR5cGUgSmVzdFRlbXBsYXRlZFZpZXcgPSB7XG5cdGFzRWxlbWVudDogRWxlbWVudCB8IHVuZGVmaW5lZDtcblx0YXNTdHJpbmc6IHN0cmluZztcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5jb25zdCBmb3JtYXRYbWwgPSByZXF1aXJlKFwieG1sLWZvcm1hdHRlclwiKTtcblxuTG9nLnNldExldmVsKDEgYXMgYW55LCBcInNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yXCIpO1xuamVzdC5zZXRUaW1lb3V0KDQwMDAwKTtcblxuY29uc3QgbmFtZVNwYWNlTWFwID0ge1xuXHRtYWNyb3M6IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRtYWNybzogXCJzYXAuZmUubWFjcm9zXCIsXG5cdG1hY3JvRmllbGQ6IFwic2FwLmZlLm1hY3Jvcy5maWVsZFwiLFxuXHRtYWNyb2RhdGE6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRsb2c6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHR1bml0dGVzdDogXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9wcmVwcm9jZXNzb3JleHRlbnNpb24vc2FwLmZlLnVuaXR0ZXN0aW5nLzFcIixcblx0Y29udHJvbDogXCJzYXAuZmUuY29yZS5jb250cm9sc1wiLFxuXHRjb250cm9sczogXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzXCIsXG5cdGNvcmU6IFwic2FwLnVpLmNvcmVcIixcblx0ZHQ6IFwic2FwLnVpLmR0XCIsXG5cdG06IFwic2FwLm1cIixcblx0ZjogXCJzYXAudWkubGF5b3V0LmZvcm1cIixcblx0Zmw6IFwic2FwLnVpLmZsXCIsXG5cdGludGVybmFsTWFjcm86IFwic2FwLmZlLm1hY3Jvcy5pbnRlcm5hbFwiLFxuXHRtZGM6IFwic2FwLnVpLm1kY1wiLFxuXHRtZGNhdDogXCJzYXAudWkubWRjLmFjdGlvbnRvb2xiYXJcIixcblx0bWRjRmllbGQ6IFwic2FwLnVpLm1kYy5maWVsZFwiLFxuXHRtZGNUYWJsZTogXCJzYXAudWkubWRjLnRhYmxlXCIsXG5cdHU6IFwic2FwLnVpLnVuaWZpZWRcIixcblx0bWFjcm9NaWNyb0NoYXJ0OiBcInNhcC5mZS5tYWNyb3MubWljcm9jaGFydFwiLFxuXHRtaWNyb0NoYXJ0OiBcInNhcC5zdWl0ZS51aS5taWNyb2NoYXJ0XCIsXG5cdG1hY3JvVGFibGU6IFwic2FwLmZlLm1hY3Jvcy50YWJsZVwiXG59O1xuY29uc3Qgc2VsZWN0ID0geHBhdGgudXNlTmFtZXNwYWNlcyhuYW1lU3BhY2VNYXApO1xuXG5jb25zdCBkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlID0geyBjb21wdXRlRmllbGRHcm91cElkczogKCkgPT4gW10gfTtcblxuZnVuY3Rpb24gX2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbGRvbTogTm9kZSwgc2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG5cdC8qKlxuXHQgKiBpZiBhIHJvb3QgZWxlbWVudCBoYXMgYmVlbiBhZGRlZCBkdXJpbmcgdGhlIHRlbXBsYXRpbmcgYnkgb3VyIEplc3QgVGVtcGxhdGluZyBtZXRob2RzXG5cdCAqIHRoZSByb290IGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIHNlbGVjdG9yIHBhdGguXG5cdCAqL1xuXHRjb25zdCByb290UGF0aCA9IFwiL3Jvb3RcIjtcblx0cmV0dXJuIGAke3htbGRvbS5ub2RlTmFtZSA9PT0gXCJyb290XCIgJiYgIXNlbGVjdG9yLnN0YXJ0c1dpdGgocm9vdFBhdGgpID8gcm9vdFBhdGggOiBcIlwifSR7c2VsZWN0b3J9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3MoXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZha2VTaWRlRWZmZWN0U2VydmljZT86IHVua25vd25cbik6IFByb21pc2U8UHJlUHJvY2Vzc29yU2V0dGluZ3NUeXBlPiB7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcblxuXHQvLyBUbyBlbnN1cmUgb3VyIG1hY3JvIGNhbiB1c2UgI3NldEJpbmRpbmdDb250ZXh0IHdlIGVuc3VyZSB0aGVyZSBpcyBhIHByZSBleGlzdGluZyBKU09OTW9kZWwgZm9yIGNvbnZlcnRlckNvbnRleHRcblx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cdGlmICghbU1vZGVscy5oYXNPd25Qcm9wZXJ0eShcImNvbnZlcnRlckNvbnRleHRcIikpIHtcblx0XHRtTW9kZWxzID0gT2JqZWN0LmFzc2lnbihtTW9kZWxzLCB7IGNvbnZlcnRlckNvbnRleHQ6IG5ldyBUZW1wbGF0ZU1vZGVsKHt9LCBvTWV0YU1vZGVsKSB9KTtcblx0fVxuXG5cdE9iamVjdC5rZXlzKG1Nb2RlbHMpLmZvckVhY2goZnVuY3Rpb24gKHNNb2RlbE5hbWUpIHtcblx0XHRpZiAobU1vZGVsc1tzTW9kZWxOYW1lXSAmJiBtTW9kZWxzW3NNb2RlbE5hbWVdLmlzVGVtcGxhdGVNb2RlbCkge1xuXHRcdFx0bU1vZGVsc1tzTW9kZWxOYW1lXSA9IG5ldyBUZW1wbGF0ZU1vZGVsKG1Nb2RlbHNbc01vZGVsTmFtZV0uZGF0YSwgb01ldGFNb2RlbCk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBzZXR0aW5nczogYW55ID0ge1xuXHRcdG1vZGVsczogT2JqZWN0LmFzc2lnbihcblx0XHRcdHtcblx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsXG5cdFx0XHR9LFxuXHRcdFx0bU1vZGVsc1xuXHRcdCksXG5cdFx0YmluZGluZ0NvbnRleHRzOiB7fSxcblx0XHRhcHBDb21wb25lbnQ6IHsgZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlOiBqZXN0LmZuKCksIGdldERpYWdub3N0aWNzOiAoKSA9PiB1bmRlZmluZWQgfVxuXHR9O1xuXG5cdHNldHRpbmdzLmFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UubW9ja1JldHVyblZhbHVlKGZha2VTaWRlRWZmZWN0U2VydmljZSA/PyBkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlKTtcblx0Ly9JbmplY3QgbW9kZWxzIGFuZCBiaW5kaW5nQ29udGV4dHNcblx0T2JqZWN0LmtleXMobUJpbmRpbmdDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbiAoc0tleSkge1xuXHRcdC8qIEFzc2VydCB0byBtYWtlIHN1cmUgdGhlIGFubm90YXRpb25zIGFyZSBpbiB0aGUgdGVzdCBtZXRhZGF0YSAtPiBhdm9pZCBtaXNsZWFkaW5nIHRlc3RzICovXG5cdFx0ZXhwZWN0KHR5cGVvZiBvTWV0YU1vZGVsLmdldE9iamVjdChtQmluZGluZ0NvbnRleHRzW3NLZXldKSkudG9CZURlZmluZWQoKTtcblx0XHRjb25zdCBvTW9kZWwgPSBtTW9kZWxzW3NLZXldIHx8IG9NZXRhTW9kZWw7XG5cdFx0c2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NLZXldID0gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pOyAvL1ZhbHVlIGlzIHNQYXRoXG5cdFx0c2V0dGluZ3MubW9kZWxzW3NLZXldID0gb01vZGVsO1xuXHR9KTtcblx0cmV0dXJuIHNldHRpbmdzO1xufVxuXG5mdW5jdGlvbiBfcmVtb3ZlQ29tbWVudEZyb21YbWwoeG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gZm9ybWF0WG1sKHhtbCwge1xuXHRcdGZpbHRlcjogKG5vZGU6IGFueSkgPT4gbm9kZS50eXBlICE9PSBcIkNvbW1lbnRcIlxuXHR9KTtcbn1cblxuZnVuY3Rpb24gX2xvYWRSZXNvdXJjZVZpZXcodmlld05hbWU6IHN0cmluZyk6IEVsZW1lbnQge1xuXHRjb25zdCBuYW1lID0gdmlld05hbWUucmVwbGFjZSgvXFwuL2csIFwiL1wiKSArIFwiLnZpZXcueG1sXCI7XG5cdGNvbnN0IHZpZXcgPSBMb2FkZXJFeHRlbnNpb25zLmxvYWRSZXNvdXJjZShuYW1lKTtcblx0cmV0dXJuIHZpZXcuZG9jdW1lbnRFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgcnVuWFBhdGhRdWVyeSA9IGZ1bmN0aW9uIChzZWxlY3Rvcjogc3RyaW5nLCB4bWxkb206IE5vZGUgfCB1bmRlZmluZWQpIHtcblx0cmV0dXJuIHNlbGVjdChzZWxlY3RvciwgeG1sZG9tKTtcbn07XG5cbmV4cGVjdC5leHRlbmQoe1xuXHR0b0hhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoX2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbGRvbSwgc2VsZWN0b3IpLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYGRpZCBub3QgZmluZCBjb250cm9scyBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA+PSAxXG5cdFx0fTtcblx0fSxcblx0dG9Ob3RIYXZlQ29udHJvbCh4bWxkb20sIHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb20sIHNlbGVjdG9yKSwgeG1sZG9tKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvdXRwdXRYbWwgPSBzZXJpYWxpemVYTUwoeG1sZG9tKTtcblx0XHRcdFx0cmV0dXJuIGBUaGVyZSBpcyBhIGNvbnRyb2wgbWF0Y2hpbmcgJHtzZWxlY3Rvcn0gaW4gZ2VuZXJhdGVkIHhtbDpcXG4gJHtvdXRwdXRYbWx9YDtcblx0XHRcdH0sXG5cdFx0XHRwYXNzOiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPT09IDBcblx0XHR9O1xuXHR9XG59KTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEJ1aWxkaW5nQmxvY2tYTUwgPSBmdW5jdGlvbiAoeG1sU3RyaW5nOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuXHRpZiAoQXJyYXkuaXNBcnJheSh4bWxTdHJpbmcpKSB7XG5cdFx0eG1sU3RyaW5nID0geG1sU3RyaW5nLmpvaW4oXCJcIik7XG5cdH1cblx0bGV0IHhtbEZvcm1hdHRlZCA9IGZvcm1hdFhNTCh4bWxTdHJpbmcpO1xuXHR4bWxGb3JtYXR0ZWQgPSB4bWxGb3JtYXR0ZWQucmVwbGFjZSgvdWlkLS1pZC1bMC05XXsxM30tWzAtOV17MSwzfS9nLCBcInVpZC0taWRcIik7XG5cdHJldHVybiB4bWxGb3JtYXR0ZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJvbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChjb250cm9sU2VsZWN0b3I6IHN0cmluZywgYXR0cmlidXRlTmFtZTogc3RyaW5nLCB4bWxEb206IE5vZGUpIHtcblx0Y29uc3Qgc2VsZWN0b3IgPSBgc3RyaW5nKCR7X2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbERvbSwgY29udHJvbFNlbGVjdG9yKX0vQCR7YXR0cmlidXRlTmFtZX0pYDtcblx0cmV0dXJuIHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplWE1MID0gZnVuY3Rpb24gKHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZXJpYWxpemVyID0gbmV3IHdpbmRvdy5YTUxTZXJpYWxpemVyKCk7XG5cdGNvbnN0IHhtbFN0cmluZyA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoeG1sRG9tKTtcblx0cmV0dXJuIGZvcm1hdFhNTCh4bWxTdHJpbmcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFhNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZykge1xuXHRyZXR1cm4gZm9ybWF0KHhtbFN0cmluZywge1xuXHRcdHBhcnNlcjogXCJ4bWxcIixcblx0XHR4bWxXaGl0ZXNwYWNlU2Vuc2l0aXZpdHk6IFwiaWdub3JlXCIsXG5cdFx0cGx1Z2luczogW3BsdWdpbl1cblx0fSBhcyBPcHRpb25zICYgeyB4bWxXaGl0ZXNwYWNlU2Vuc2l0aXZpdHk6IFwiaWdub3JlXCIgfCBcInN0cmljdFwiIH0pO1xufTtcblxuLyoqXG4gKiBDb21waWxlIGEgQ0RTIGZpbGUgaW50byBhbiBFRE1YIGZpbGUuXG4gKlxuICogQHBhcmFtIGNkc1VybCBUaGUgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBDRFMgZGVmaW5pdGlvbi4gVGhpcyBmaWxlIG11c3QgZGVjbGFyZSB0aGUgbmFtZXNwYWNlXG4gKiBzYXAuZmUudGVzdCBhbmQgYSBzZXJ2aWNlIEplc3RTZXJ2aWNlXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBjcmVhdGluZyB0aGUgRURNWCBvdXRwdXRcbiAqIEBwYXJhbSBlZG14RmlsZU5hbWUgQWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZWQgRURNWCBtZXRhZGF0YSBmaWxlXG4gKiBAcmV0dXJucyBUaGUgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIEVETVhcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBpbGVDRFMgPSBmdW5jdGlvbiAoXG5cdGNkc1VybDogc3RyaW5nLFxuXHRvcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7fSxcblx0ZWRteEZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShjZHNVcmwpLnJlcGxhY2UoXCIuY2RzXCIsIFwiLnhtbFwiKVxuKSB7XG5cdGNvbnN0IGNkc1N0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhjZHNVcmwsIFwidXRmLThcIik7XG5cdGNvbnN0IGVkbXhDb250ZW50ID0gY2RzMmVkbXgoY2RzU3RyaW5nLCBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIsIG9wdGlvbnMpO1xuXHRjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUoY2RzVXJsLCBcIi4uXCIsIFwiZ2VuXCIpO1xuXG5cdGNvbnN0IGVkbXhGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXIsIGVkbXhGaWxlTmFtZSk7XG5cblx0ZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0ZnMud3JpdGVGaWxlU3luYyhlZG14RmlsZVBhdGgsIGVkbXhDb250ZW50KTtcblx0cmV0dXJuIGVkbXhGaWxlUGF0aDtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBDRFMgdG8gRURNWC5cbiAqXG4gKiBAcGFyYW0gY2RzIFRoZSBDRFMgbW9kZWwuIEl0IG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBzZXJ2aWNlLlxuICogQHBhcmFtIHNlcnZpY2UgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGJlIGNvbXBpbGVkLiBEZWZhdWx0cyB0byBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBjcmVhdGluZyB0aGUgRURNWCBvdXRwdXRcbiAqIEByZXR1cm5zIFRoZSBjb21waWxlZCBzZXJ2aWNlIG1vZGVsIGFzIEVETVguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZHMyZWRteChjZHM6IHN0cmluZywgc2VydmljZSA9IFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIiwgb3B0aW9uczogY29tcGlsZXIuT0RhdGFPcHRpb25zID0ge30pIHtcblx0Y29uc3Qgc291cmNlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgXCJzb3VyY2UuY2RzXCI6IGNkcyB9O1xuXG5cdC8vIGFsbG93IHRvIGluY2x1ZGUgc3R1ZmYgZnJvbSBAc2FwL2Nkcy9jb21tb25cblx0aWYgKGNkcy5pbmNsdWRlcyhcIidAc2FwL2Nkcy9jb21tb24nXCIpKSB7XG5cdFx0c291cmNlc1tcImNvbW1vbi5jZHNcIl0gPSBmcy5yZWFkRmlsZVN5bmMocmVxdWlyZS5yZXNvbHZlKFwiQHNhcC9jZHMvY29tbW9uLmNkc1wiKSwgXCJ1dGYtOFwiKTtcblx0fVxuXG5cdGNvbnN0IGNzbiA9IGNvbXBpbGVyLmNvbXBpbGVTb3VyY2VzKHNvdXJjZXMsIHt9KTtcblxuXHRjb25zdCBlZG14T3B0aW9uczogY29tcGlsZXIuT0RhdGFPcHRpb25zID0ge1xuXHRcdG9kYXRhRm9yZWlnbktleXM6IHRydWUsXG5cdFx0b2RhdGFGb3JtYXQ6IFwic3RydWN0dXJlZFwiLFxuXHRcdG9kYXRhQ29udGFpbm1lbnQ6IGZhbHNlLFxuXHRcdC4uLm9wdGlvbnMsXG5cdFx0c2VydmljZTogc2VydmljZVxuXHR9O1xuXG5cdGNvbnN0IGVkbXggPSBjb21waWxlci50by5lZG14KGNzbiwgZWRteE9wdGlvbnMpO1xuXHRpZiAoIWVkbXgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYENvbXBpbGF0aW9uIGZhaWxlZC4gSGludDogTWFrZSBzdXJlIHRoYXQgdGhlIENEUyBtb2RlbCBkZWZpbmVzIHNlcnZpY2UgJHtzZXJ2aWNlfS5gKTtcblx0fVxuXHRyZXR1cm4gZWRteDtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZha2VTaWRlRWZmZWN0c1NlcnZpY2UgPSBhc3luYyBmdW5jdGlvbiAob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBQcm9taXNlPGFueT4ge1xuXHRjb25zdCBvU2VydmljZUNvbnRleHQgPSB7IHNjb3BlT2JqZWN0OiB7fSwgc2NvcGVUeXBlOiBcIlwiLCBzZXR0aW5nczoge30gfSBhcyBTZXJ2aWNlQ29udGV4dDxhbnk+O1xuXHRyZXR1cm4gbmV3IFNpZGVFZmZlY3RzRmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dCkudGhlbihmdW5jdGlvbiAob1NlcnZpY2VJbnN0YW5jZTogYW55KSB7XG5cdFx0Y29uc3Qgb0plc3RTaWRlRWZmZWN0c1NlcnZpY2UgPSBvU2VydmljZUluc3RhbmNlLmdldEludGVyZmFjZSgpO1xuXHRcdG9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzY29wZU9iamVjdDoge1xuXHRcdFx0XHRcdGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRnZXRNZXRhTW9kZWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01ldGFNb2RlbDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fTtcblx0XHRyZXR1cm4gb0plc3RTaWRlRWZmZWN0c1NlcnZpY2U7XG5cdH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VEaWFnbm9zdGljcyA9IGZ1bmN0aW9uICgpOiBJRGlhZ25vc3RpY3Mge1xuXHRjb25zdCBpc3N1ZXM6IGFueVtdID0gW107XG5cdHJldHVybiB7XG5cdFx0YWRkSXNzdWUoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRcdGlzc3VlQ2F0ZWdvcnksXG5cdFx0XHRcdGlzc3VlU2V2ZXJpdHksXG5cdFx0XHRcdGRldGFpbHNcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0Z2V0SXNzdWVzKCk6IGFueVtdIHtcblx0XHRcdHJldHVybiBpc3N1ZXM7XG5cdFx0fSxcblx0XHRjaGVja0lmSXNzdWVFeGlzdHMoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzLmZpbmQoKGlzc3VlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBpc3N1ZS5pc3N1ZUNhdGVnb3J5ID09PSBpc3N1ZUNhdGVnb3J5ICYmIGlzc3VlLmlzc3VlU2V2ZXJpdHkgPT09IGlzc3VlU2V2ZXJpdHkgJiYgaXNzdWUuZGV0YWlscyA9PT0gZGV0YWlscztcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yVGVzdCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRtYW5pZmVzdFNldHRpbmdzOiBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncyB8IE9iamVjdFBhZ2VNYW5pZmVzdFNldHRpbmdzXG4pIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVkVHlwZXMuZW50aXR5U2V0cy5maW5kKChlcykgPT4gZXMubmFtZSA9PT0gbWFuaWZlc3RTZXR0aW5ncy5lbnRpdHlTZXQpO1xuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5KGVudGl0eVNldCBhcyBFbnRpdHlTZXQsIGNvbnZlcnRlZFR5cGVzLCBlbnRpdHlTZXQpO1xuXHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQoY29udmVydGVkVHlwZXMsIG1hbmlmZXN0U2V0dGluZ3MsIGdldEZha2VEaWFnbm9zdGljcygpLCBtZXJnZSwgZGF0YU1vZGVsUGF0aCk7XG59O1xuY29uc3QgbWV0YU1vZGVsQ2FjaGU6IGFueSA9IHt9O1xuZXhwb3J0IGNvbnN0IGdldE1ldGFNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIChzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwgdW5kZWZpbmVkLCB7fSk7XG5cdGlmICghbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBuZXcgKE9EYXRhTWV0YU1vZGVsIGFzIGFueSkob1JlcXVlc3Rvciwgc01ldGFkYXRhVXJsLCB1bmRlZmluZWQsIG51bGwpO1xuXHRcdGF3YWl0IG9NZXRhTW9kZWwuZmV0Y2hFbnRpdHlDb250YWluZXIoKTtcblx0XHRtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdID0gb01ldGFNb2RlbDtcblx0fVxuXG5cdHJldHVybiBtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0cHJvcGVydHk/OiBQcm9wZXJ0eSB8IEVudGl0eVNldCB8IEFueUFubm90YXRpb25cbik6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRjb25zdCB0YXJnZXRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdHRhcmdldE9iamVjdDogcHJvcGVydHksXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogZW50aXR5U2V0LmVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVkVHlwZXM6IGNvbnZlcnRlZFR5cGVzXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aDtcblx0cmV0dXJuIHRhcmdldFBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVCaW5kaW5nID0gZnVuY3Rpb24gKGJpbmRpbmdTdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdHJldHVybiBiaW5kaW5nRWxlbWVudC5mb3JtYXR0ZXIuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbn07XG5cbnR5cGUgTW9kZWxDb250ZW50ID0ge1xuXHRbbmFtZTogc3RyaW5nXTogYW55O1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSBhIGJpbmRpbmcgYWdhaW5zdCBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBiaW5kaW5nU3RyaW5nIFRoZSBiaW5kaW5nIHN0cmluZy5cbiAqIEBwYXJhbSBtb2RlbENvbnRlbnQgQ29udGVudCBvZiB0aGUgZGVmYXVsdCBtb2RlbCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gbmFtZWRNb2RlbHNDb250ZW50IENvbnRlbnRzIG9mIGFkZGl0aW9uYWwsIG5hbWVkIG1vZGVscyB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgZXZhbHVhdGVkIGJpbmRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwoXG5cdGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxDb250ZW50OiBNb2RlbENvbnRlbnQsXG5cdG5hbWVkTW9kZWxzQ29udGVudD86IHsgW21vZGVsTmFtZTogc3RyaW5nXTogTW9kZWxDb250ZW50IH1cbik6IHN0cmluZyB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRjb25zdCB0ZXh0ID0gbmV3IEludmlzaWJsZVRleHQoKTtcblx0dGV4dC5iaW5kUHJvcGVydHkoXCJ0ZXh0XCIsIGJpbmRpbmdFbGVtZW50KTtcblxuXHRjb25zdCBkZWZhdWx0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1vZGVsQ29udGVudCk7XG5cdHRleHQuc2V0TW9kZWwoZGVmYXVsdE1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChkZWZhdWx0TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpKTtcblxuXHRpZiAobmFtZWRNb2RlbHNDb250ZW50KSB7XG5cdFx0Zm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMobmFtZWRNb2RlbHNDb250ZW50KSkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBuZXcgSlNPTk1vZGVsKGNvbnRlbnQpO1xuXHRcdFx0dGV4dC5zZXRNb2RlbChtb2RlbCwgbmFtZSk7XG5cdFx0XHR0ZXh0LnNldEJpbmRpbmdDb250ZXh0KG1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSwgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRleHQuZ2V0VGV4dCgpO1xufVxuXG5jb25zdCBURVNUVklFV0lEID0gXCJ0ZXN0Vmlld0lkXCI7XG5cbmNvbnN0IGFwcGx5RmxleENoYW5nZXMgPSBhc3luYyBmdW5jdGlvbiAoZmxleENoYW5nZXM6IHsgW3g6IHN0cmluZ106IG9iamVjdFtdIH0sIG9NZXRhTW9kZWw6IE1ldGFNb2RlbCwgcmVzdWx0WE1MOiBhbnkpIHtcblx0Ly8gcHJlZml4IElkc1xuXHRbLi4ucmVzdWx0WE1MLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaWRdXCIpXS5mb3JFYWNoKChub2RlKSA9PiB7XG5cdFx0bm9kZS5pZCA9IGAke1RFU1RWSUVXSUR9LS0ke25vZGUuaWR9YDtcblx0fSk7XG5cdGNvbnN0IGNoYW5nZXMgPSBjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QoVEVTVFZJRVdJRCwgZmxleENoYW5nZXMpO1xuXHRjb25zdCBhcHBJZCA9IFwic29tZUNvbXBvbmVudFwiO1xuXHRjb25zdCBvTWFuaWZlc3QgPSB7XG5cdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdGlkOiBhcHBJZCxcblx0XHRcdHR5cGU6IFwiYXBwbGljYXRpb25cIixcblx0XHRcdGNyb3NzTmF2aWdhdGlvbjoge1xuXHRcdFx0XHRvdXRib3VuZHM6IFtdXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQgPSB7XG5cdFx0Z2V0RGlhZ25vc3RpY3M6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoZ2V0RmFrZURpYWdub3N0aWNzKCkpLFxuXHRcdGdldE1vZGVsOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcblx0XHRcdGdldE1ldGFNb2RlbDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShvTWV0YU1vZGVsKVxuXHRcdH0pLFxuXHRcdGdldENvbXBvbmVudERhdGE6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe30pLFxuXHRcdGdldE1hbmlmZXN0T2JqZWN0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcblx0XHRcdGdldEVudHJ5OiBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiAob01hbmlmZXN0IGFzIGFueSlbbmFtZV07XG5cdFx0XHR9XG5cdFx0fSksXG5cdFx0Z2V0TG9jYWxJZDogamVzdC5mbigoc0lkKSA9PiBzSWQpXG5cdH0gYXMgdW5rbm93biBhcyBBcHBDb21wb25lbnQ7XG5cdC8vZmFrZSBjaGFuZ2VzXG5cdGplc3Quc3B5T24oQXBwU3RvcmFnZSwgXCJsb2FkRmxleERhdGFcIikubW9ja1JldHVyblZhbHVlKFByb21pc2UucmVzb2x2ZShjaGFuZ2VzKSk7XG5cdGplc3Quc3B5T24oQ29tcG9uZW50LCBcImdldFwiKS5tb2NrUmV0dXJuVmFsdWUob0FwcENvbXBvbmVudCk7XG5cdGplc3Quc3B5T24oVXRpbHMsIFwiZ2V0QXBwQ29tcG9uZW50Rm9yQ29udHJvbFwiKS5tb2NrUmV0dXJuVmFsdWUob0FwcENvbXBvbmVudCk7XG5cdGF3YWl0IEZsZXhTdGF0ZS5pbml0aWFsaXplKHtcblx0XHRjb21wb25lbnRJZDogYXBwSWRcblx0fSk7XG5cdHJlc3VsdFhNTCA9IGF3YWl0IFhtbFByZXByb2Nlc3Nvci5wcm9jZXNzKHJlc3VsdFhNTCwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiwgY29tcG9uZW50SWQ6IGFwcElkLCBpZDogVEVTVFZJRVdJRCB9KTtcblxuXHQvL0Fzc2VydCB0aGF0IGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBhcHBsaWVkXG5cdGNvbnN0IGNoYW5nZXNBcHBsaWVkID0gZ2V0Q2hhbmdlc0Zyb21YTUwocmVzdWx0WE1MKTtcblx0ZXhwZWN0KGNoYW5nZXNBcHBsaWVkLmxlbmd0aCkudG9CZShmbGV4Q2hhbmdlcz8uY2hhbmdlcz8ubGVuZ3RoID8/IDAgKyBmbGV4Q2hhbmdlcz8udmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzPy5sZW5ndGggPz8gMCk7XG5cdHJldHVybiByZXN1bHRYTUw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q2hhbmdlc0Zyb21YTUwgPSAoeG1sOiBhbnkpID0+XG5cdFsuLi54bWwucXVlcnlTZWxlY3RvckFsbChcIipcIildXG5cdFx0LmZsYXRNYXAoKGUpID0+IFsuLi5lLmF0dHJpYnV0ZXNdLm1hcCgoYSkgPT4gYS5uYW1lKSlcblx0XHQuZmlsdGVyKChhdHRyKSA9PiBhdHRyLmluY2x1ZGVzKFwic2FwLnVpLmZsLmFwcGxpZWRDaGFuZ2VzXCIpKTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRpbmdSZXN1bHQgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBhbnk7IGVudGl0eVNldD86IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9LFxuXHRmYWtlU2lkZUVmZmVjdFNlcnZpY2U/OiB1bmtub3duXG4pIHtcblx0aWYgKCFtTW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHRtTW9kZWxzW1wic2FwLmZlLmkxOG5cIl0gPSBjcmVhdGVNb2NrUmVzb3VyY2VNb2RlbCgpO1xuXHR9XG5cblx0Y29uc3QgdGVtcGxhdGVkWG1sID0gYDxyb290PiR7eG1sSW5wdXR9PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IHhtbERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGVtcGxhdGVkWG1sLCBcInRleHQveG1sXCIpO1xuXHQvLyBUbyBlbnN1cmUgb3VyIG1hY3JvIGNhbiB1c2UgI3NldEJpbmRpbmdDb250ZXh0IHdlIGVuc3VyZSB0aGVyZSBpcyBhIHByZSBleGlzdGluZyBKU09OTW9kZWwgZm9yIGNvbnZlcnRlckNvbnRleHRcblx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRjb25zdCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSBhd2FpdCBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMsIGZha2VTaWRlRWZmZWN0U2VydmljZSk7XG5cblx0Ly9UaGlzIGNvbnRleHQgZm9yIG1hY3JvIHRlc3Rpbmdcblx0aWYgKG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdKSB7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tcInRoaXNcIl0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHRsZXQgcmVzdWx0WE1MID0gKGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKHhtbERvYy5maXJzdEVsZW1lbnRDaGlsZCEsIHsgbmFtZTogXCJUZXN0IEZyYWdtZW50XCIgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKSkgYXMgYW55O1xuXG5cdGlmIChmbGV4Q2hhbmdlcykge1xuXHRcdC8vIGFwcGx5IGZsZXggY2hhbmdlc1xuXHRcdHJlc3VsdFhNTCA9IGF3YWl0IGFwcGx5RmxleENoYW5nZXMoZmxleENoYW5nZXMsIG9NZXRhTW9kZWwsIHJlc3VsdFhNTCk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdFhNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0ZWRYTUwgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfSxcblx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlPzogdW5rbm93blxuKSB7XG5cdGNvbnN0IHRlbXBsYXRlZFhNTCA9IGF3YWl0IGdldFRlbXBsYXRpbmdSZXN1bHQoeG1sSW5wdXQsIHNNZXRhZGF0YVVybCwgbUJpbmRpbmdDb250ZXh0cywgbU1vZGVscywgZmxleENoYW5nZXMsIGZha2VTaWRlRWZmZWN0U2VydmljZSk7XG5cdHJldHVybiBzZXJpYWxpemVYTUwodGVtcGxhdGVkWE1MKTtcbn07XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgcmVxdWVzdGVkIHZpZXcgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdmlldyB0byBiZSB0ZXN0ZWQuXG4gKiBAcGFyYW0gc01ldGFkYXRhVXJsIFVybCBvZiB0aGUgbWV0YWRhdGEuXG4gKiBAcGFyYW0gbUJpbmRpbmdDb250ZXh0cyBNYXAgb2YgdGhlIGJpbmRpbmdDb250ZXh0cyB0byBzZXQgb24gdGhlIG1vZGVscy5cbiAqIEBwYXJhbSBtTW9kZWxzIE1hcCBvZiB0aGUgbW9kZWxzLlxuICogQHBhcmFtIGZsZXhDaGFuZ2VzIE9iamVjdCB3aXRoIFVJIGNoYW5nZXMgbGlrZSAnY2hhbmdlcycgb3IgJ3ZhcmlhbnREZXBlbmRlbnRDb250cm9sQ2hhbmdlcydcbiAqIEByZXR1cm5zIFRlbXBsYXRlZCB2aWV3IGFzIHN0cmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1ZpZXcoXG5cdG5hbWU6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9XG4pOiBQcm9taXNlPEplc3RUZW1wbGF0ZWRWaWV3PiB7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcblx0Y29uc3Qgb1ZpZXdEb2N1bWVudCA9IF9sb2FkUmVzb3VyY2VWaWV3KG5hbWUpO1xuXHRjb25zdCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSBhd2FpdCBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMpO1xuXHRsZXQgb1ByZXByb2Nlc3NlZFZpZXcgPSBhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2VzcyhvVmlld0RvY3VtZW50LCB7IG5hbWU6IG5hbWUgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKTtcblx0aWYgKGZsZXhDaGFuZ2VzKSB7XG5cdFx0b1ByZXByb2Nlc3NlZFZpZXcgPSBhd2FpdCBhcHBseUZsZXhDaGFuZ2VzKGZsZXhDaGFuZ2VzID8/IFtdLCBvTWV0YU1vZGVsLCBvUHJlcHJvY2Vzc2VkVmlldyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRhc0VsZW1lbnQ6IG9QcmVwcm9jZXNzZWRWaWV3LFxuXHRcdGFzU3RyaW5nOiBfcmVtb3ZlQ29tbWVudEZyb21YbWwob1ByZXByb2Nlc3NlZFZpZXc/Lm91dGVySFRNTCB8fCBcIlwiKVxuXHR9O1xufVxuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCBYTUwgZnJhZ21lbnQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHRlc3REYXRhIFRlc3QgZGF0YSBjb25zaXN0aW5nXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgZnJhZ21lbnQgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhZ21lbnQobmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogeyBbbW9kZWw6IHN0cmluZ106IG9iamVjdCB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0Y29uc3QgaW5wdXRYbWwgPSBgPHJvb3Q+PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwiJHtuYW1lfVwiIHR5cGU9XCJYTUxcIiB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIiAvPjwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCBpbnB1dERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaW5wdXRYbWwsIFwidGV4dC94bWxcIik7XG5cblx0Ly8gYnVpbGQgbW9kZWwgYW5kIGJpbmRpbmdzIGZvciBnaXZlbiB0ZXN0IGRhdGFcblx0Y29uc3Qgc2V0dGluZ3MgPSB7XG5cdFx0bW9kZWxzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWwgfSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IG9iamVjdCB9LFxuXHRcdGFwcENvbXBvbmVudDogeyBnZXRTaWRlRWZmZWN0c1NlcnZpY2U6IGplc3QuZm4oKSwgZ2V0RGlhZ25vc3RpY3M6ICgpID0+IHVuZGVmaW5lZCB9XG5cdH07XG5cdGZvciAoY29uc3QgbW9kZWwgaW4gdGVzdERhdGEpIHtcblx0XHRjb25zdCBqc29uTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0anNvbk1vZGVsLnNldERhdGEodGVzdERhdGFbbW9kZWxdKTtcblx0XHRzZXR0aW5ncy5tb2RlbHNbbW9kZWxdID0ganNvbk1vZGVsO1xuXHRcdHNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1ttb2RlbF0gPSBzZXR0aW5ncy5tb2RlbHNbbW9kZWxdLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0fVxuXHRzZXR0aW5ncy5hcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlLm1vY2tSZXR1cm5WYWx1ZShkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlKTtcblxuXHQvLyBleGVjdXRlIHRoZSBwcmUtcHJvY2Vzc29yXG5cdGNvbnN0IHJlc3VsdERvYyA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0RG9jLmZpcnN0RWxlbWVudENoaWxkLCB7IG5hbWUgfSwgc2V0dGluZ3MpO1xuXG5cdC8vIGV4Y2x1ZGUgbmVzdGVkIGZyYWdtZW50cyBmcm9tIHRlc3Qgc25hcHNob3RzXG5cdGNvbnN0IGZyYWdtZW50cyA9IHJlc3VsdERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvcmU6RnJhZ21lbnRcIikgYXMgYW55O1xuXHRpZiAoZnJhZ21lbnRzPy5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yIChjb25zdCBmcmFnbWVudCBvZiBmcmFnbWVudHMpIHtcblx0XHRcdGZyYWdtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0fVxuXHR9XG5cblx0Ly8gS2VlcCB0aGUgZnJhZ21lbnQgcmVzdWx0IGFzIGNoaWxkIG9mIHJvb3Qgbm9kZSB3aGVuIGZyYWdtZW50IGdlbmVyYXRlcyBtdWx0aXBsZSByb290IGNvbnRyb2xzXG5cdGNvbnN0IHhtbFJlc3VsdCA9IHJlc3VsdERvYy5jaGlsZHJlbi5sZW5ndGggPiAxID8gcmVzdWx0RG9jLm91dGVySFRNTCA6IHJlc3VsdERvYy5pbm5lckhUTUw7XG5cblx0cmV0dXJuIF9yZW1vdmVDb21tZW50RnJvbVhtbCh4bWxSZXN1bHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQ29udHJvbChjb250cm9sVG9TZXJpYWxpemU6IENvbnRyb2wgfCBDb250cm9sW10pIHtcblx0bGV0IHRhYkNvdW50ID0gMDtcblx0ZnVuY3Rpb24gZ2V0VGFiKHRvQWRkOiBudW1iZXIgPSAwKSB7XG5cdFx0bGV0IHRhYiA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0YWJDb3VudCArIHRvQWRkOyBpKyspIHtcblx0XHRcdHRhYiArPSBcIlxcdFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFiO1xuXHR9XG5cdGNvbnN0IHNlcmlhbGl6ZURlbGVnYXRlID0ge1xuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBjb250cm9sRGV0YWlsID0gXCJcIjtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLmdldFBhcmVudCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXhJblBhcmVudCA9IChjb250cm9sLmdldFBhcmVudCgpLmdldEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUpIGFzIE1hbmFnZWRPYmplY3RbXSk/LmluZGV4T2Y/Lihjb250cm9sKTtcblx0XHRcdFx0XHRpZiAoaW5kZXhJblBhcmVudCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYCxcXG4ke2dldFRhYigpfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb250cm9sRGV0YWlsICs9IGAke2NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9KGA7XG5cdFx0XHRyZXR1cm4gY29udHJvbERldGFpbDtcblx0XHR9LFxuXHRcdGVuZDogZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIFwifSlcIjtcblx0XHR9LFxuXHRcdG1pZGRsZTogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSkge1xuXHRcdFx0Y29uc3QgaWQgPSBjb250cm9sLmdldElkKCk7XG5cdFx0XHRsZXQgZGF0YSA9IGB7aWQ6ICR7TWFuYWdlZE9iamVjdE1ldGFkYXRhLmlzR2VuZXJhdGVkSWQoaWQpID8gXCJfX2R5bmFtaWNJZFwiIDogaWR9YDtcblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tUHJvcGVydGllcykge1xuXHRcdFx0XHRpZiAoY29udHJvbC5tUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06ICR7Y29udHJvbC5tUHJvcGVydGllc1tvQ29udHJvbEtleV19YDtcblx0XHRcdFx0fSBlbHNlIGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3MuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYmluZGluZ0RldGFpbCA9IGNvbnRyb2wubUJpbmRpbmdJbmZvc1tvQ29udHJvbEtleV07XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAke0pTT04uc3RyaW5naWZ5KGJpbmRpbmdEZXRhaWwpfWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tQXNzb2NpYXRpb25zKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1Bc3NvY2lhdGlvbnMuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAke1xuXHRcdFx0XHRcdFx0KGNvbnRyb2wubUFzc29jaWF0aW9uc1tvQ29udHJvbEtleV0/LmpvaW4/LihcIixcIikgPz8gY29udHJvbC5tQXNzb2NpYXRpb25zW29Db250cm9sS2V5XSkgfHwgdW5kZWZpbmVkXG5cdFx0XHRcdFx0fWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tRXZlbnRSZWdpc3RyeSkge1xuXHRcdFx0XHRpZiAoY29udHJvbC5tRXZlbnRSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06IHRydWV9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGF0YSArPSBgYDtcblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH0sXG5cdFx0c3RhcnRBZ2dyZWdhdGlvbjogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSwgc05hbWU6IHN0cmluZykge1xuXHRcdFx0bGV0IG91dCA9IGAsXFxuJHtnZXRUYWIoKX0ke3NOYW1lfWA7XG5cdFx0XHR0YWJDb3VudCsrO1xuXG5cdFx0XHRpZiAoY29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXSkge1xuXHRcdFx0XHRvdXQgKz0gYD17IHBhdGg6JyR7Y29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXS5wYXRofScsIHRlbXBsYXRlOlxcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dCArPSBgPVtcXG4ke2dldFRhYigpfWA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb3V0O1xuXHRcdH0sXG5cdFx0ZW5kQWdncmVnYXRpb246IGZ1bmN0aW9uIChjb250cm9sOiBhbnksIHNOYW1lOiBzdHJpbmcpIHtcblx0XHRcdHRhYkNvdW50LS07XG5cdFx0XHRpZiAoY29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXSkge1xuXHRcdFx0XHRyZXR1cm4gYFxcbiR7Z2V0VGFiKCl9fWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYFxcbiR7Z2V0VGFiKCl9XWA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoQXJyYXkuaXNBcnJheShjb250cm9sVG9TZXJpYWxpemUpKSB7XG5cdFx0cmV0dXJuIGNvbnRyb2xUb1NlcmlhbGl6ZS5tYXAoKGNvbnRyb2xUb1JlbmRlcjogQ29udHJvbCkgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1JlbmRlciwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBuZXcgU2VyaWFsaXplcihjb250cm9sVG9TZXJpYWxpemUsIHNlcmlhbGl6ZURlbGVnYXRlKS5zZXJpYWxpemUoKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXdhaXRlcigpIHtcblx0bGV0IGZuUmVzb2x2ZSE6IEZ1bmN0aW9uO1xuXHRjb25zdCBteVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdH0pO1xuXHRyZXR1cm4geyBwcm9taXNlOiBteVByb21pc2UsIHJlc29sdmU6IGZuUmVzb2x2ZSB9O1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7OztFQXdEQTtFQUNBLE1BQU1BLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGVBQWUsQ0FBQztFQUUxQ0MsR0FBRyxDQUFDQyxRQUFRLENBQUMsQ0FBQyxFQUFTLGtDQUFrQyxDQUFDO0VBQzFEQyxJQUFJLENBQUNDLFVBQVUsQ0FBQyxLQUFLLENBQUM7RUFFdEIsTUFBTUMsWUFBWSxHQUFHO0lBQ3BCQyxNQUFNLEVBQUUsZUFBZTtJQUN2QkMsS0FBSyxFQUFFLGVBQWU7SUFDdEJDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakNDLFNBQVMsRUFBRSxrRUFBa0U7SUFDN0VDLEdBQUcsRUFBRSxrRUFBa0U7SUFDdkVDLFFBQVEsRUFBRSwwRUFBMEU7SUFDcEZDLE9BQU8sRUFBRSxzQkFBc0I7SUFDL0JDLFFBQVEsRUFB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
621
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3JtYXRYbWwiLCJyZXF1aXJlIiwiTG9nIiwic2V0TGV2ZWwiLCJqZXN0Iiwic2V0VGltZW91dCIsIm5hbWVTcGFjZU1hcCIsIm1hY3JvcyIsIm1hY3JvIiwibWFjcm9GaWVsZCIsIm1hY3JvZGF0YSIsImxvZyIsInVuaXR0ZXN0IiwiY29udHJvbCIsImNvbnRyb2xzIiwiY29yZSIsImR0IiwibSIsImYiLCJmbCIsImludGVybmFsTWFjcm8iLCJtZGMiLCJtZGNhdCIsIm1kY0ZpZWxkIiwibWRjVGFibGUiLCJ1IiwibWFjcm9NaWNyb0NoYXJ0IiwibWljcm9DaGFydCIsIm1hY3JvVGFibGUiLCJzZWxlY3QiLCJ4cGF0aCIsInVzZU5hbWVzcGFjZXMiLCJkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlIiwiY29tcHV0ZUZpZWxkR3JvdXBJZHMiLCJfZ2V0VGVtcGxhdGVkU2VsZWN0b3IiLCJ4bWxkb20iLCJzZWxlY3RvciIsInJvb3RQYXRoIiwibm9kZU5hbWUiLCJzdGFydHNXaXRoIiwiX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3MiLCJzTWV0YWRhdGFVcmwiLCJtQmluZGluZ0NvbnRleHRzIiwibU1vZGVscyIsImZha2VTaWRlRWZmZWN0U2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJoYXNPd25Qcm9wZXJ0eSIsIk9iamVjdCIsImFzc2lnbiIsImNvbnZlcnRlckNvbnRleHQiLCJUZW1wbGF0ZU1vZGVsIiwia2V5cyIsImZvckVhY2giLCJzTW9kZWxOYW1lIiwiaXNUZW1wbGF0ZU1vZGVsIiwiZGF0YSIsInNldHRpbmdzIiwibW9kZWxzIiwibWV0YU1vZGVsIiwiYmluZGluZ0NvbnRleHRzIiwiYXBwQ29tcG9uZW50IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZm4iLCJnZXREaWFnbm9zdGljcyIsInVuZGVmaW5lZCIsIm1vY2tSZXR1cm5WYWx1ZSIsInNLZXkiLCJleHBlY3QiLCJnZXRPYmplY3QiLCJ0b0JlRGVmaW5lZCIsIm9Nb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiX3JlbW92ZUNvbW1lbnRGcm9tWG1sIiwieG1sIiwiZmlsdGVyIiwibm9kZSIsInR5cGUiLCJfbG9hZFJlc291cmNlVmlldyIsInZpZXdOYW1lIiwibmFtZSIsInJlcGxhY2UiLCJ2aWV3IiwiTG9hZGVyRXh0ZW5zaW9ucyIsImxvYWRSZXNvdXJjZSIsImRvY3VtZW50RWxlbWVudCIsInJ1blhQYXRoUXVlcnkiLCJleHRlbmQiLCJ0b0hhdmVDb250cm9sIiwibm9kZXMiLCJtZXNzYWdlIiwib3V0cHV0WG1sIiwic2VyaWFsaXplWE1MIiwicGFzcyIsImxlbmd0aCIsInRvTm90SGF2ZUNvbnRyb2wiLCJ0b0hhdmVUZW1wbGF0aW5nRXJyb3JzIiwieG1sVGV4dCIsImJhc2U2NEVudHJpZXMiLCJtYXRjaCIsImVycm9yTWVzc2FnZXMiLCJtYXAiLCJhdG9iIiwic2xpY2UiLCJqb2luIiwiZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCIsInhtbFN0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsInhtbEZvcm1hdHRlZCIsImZvcm1hdFhNTCIsImdldENvbnRyb2xBdHRyaWJ1dGUiLCJjb250cm9sU2VsZWN0b3IiLCJhdHRyaWJ1dGVOYW1lIiwieG1sRG9tIiwic2VyaWFsaXplciIsIndpbmRvdyIsIlhNTFNlcmlhbGl6ZXIiLCJzZXJpYWxpemVUb1N0cmluZyIsImZvcm1hdCIsInBhcnNlciIsInhtbFdoaXRlc3BhY2VTZW5zaXRpdml0eSIsInBsdWdpbnMiLCJwbHVnaW4iLCJjb21waWxlQ0RTIiwiY2RzVXJsIiwib3B0aW9ucyIsImVkbXhGaWxlTmFtZSIsInBhdGgiLCJiYXNlbmFtZSIsImNkc1N0cmluZyIsImZzIiwicmVhZEZpbGVTeW5jIiwiZWRteENvbnRlbnQiLCJjZHMyZWRteCIsImRpciIsInJlc29sdmUiLCJlZG14RmlsZVBhdGgiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJ3cml0ZUZpbGVTeW5jIiwiY2RzIiwic2VydmljZSIsInNvdXJjZXMiLCJpbmNsdWRlcyIsImNzbiIsImNvbXBpbGVyIiwiY29tcGlsZVNvdXJjZXMiLCJlZG14T3B0aW9ucyIsIm9kYXRhRm9yZWlnbktleXMiLCJvZGF0YUZvcm1hdCIsIm9kYXRhQ29udGFpbm1lbnQiLCJlZG14IiwidG8iLCJFcnJvciIsImdldEZha2VTaWRlRWZmZWN0c1NlcnZpY2UiLCJvU2VydmljZUNvbnRleHQiLCJzY29wZU9iamVjdCIsInNjb3BlVHlwZSIsIlNpZGVFZmZlY3RzRmFjdG9yeSIsImNyZWF0ZUluc3RhbmNlIiwidGhlbiIsIm9TZXJ2aWNlSW5zdGFuY2UiLCJvSmVzdFNpZGVFZmZlY3RzU2VydmljZSIsImdldEludGVyZmFjZSIsImdldENvbnRleHQiLCJnZXRNb2RlbCIsImdldEZha2VEaWFnbm9zdGljcyIsImlzc3VlcyIsImFkZElzc3VlIiwiaXNzdWVDYXRlZ29yeSIsImlzc3VlU2V2ZXJpdHkiLCJkZXRhaWxzIiwicHVzaCIsImdldElzc3VlcyIsImNoZWNrSWZJc3N1ZUV4aXN0cyIsImZpbmQiLCJpc3N1ZSIsImdldENvbnZlcnRlckNvbnRleHRGb3JUZXN0IiwiY29udmVydGVkVHlwZXMiLCJtYW5pZmVzdFNldHRpbmdzIiwiZW50aXR5U2V0IiwiZW50aXR5U2V0cyIsImVzIiwiZGF0YU1vZGVsUGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSIsIkNvbnZlcnRlckNvbnRleHQiLCJtZXJnZSIsIm1ldGFNb2RlbENhY2hlIiwib1JlcXVlc3RvciIsIl9NZXRhZGF0YVJlcXVlc3RvciIsImNyZWF0ZSIsIk9EYXRhTWV0YU1vZGVsIiwiZmV0Y2hFbnRpdHlDb250YWluZXIiLCJwcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJzdGFydGluZ0VudGl0eVNldCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJjb250ZXh0TG9jYXRpb24iLCJldmFsdWF0ZUJpbmRpbmciLCJiaW5kaW5nU3RyaW5nIiwiYmluZGluZ0VsZW1lbnQiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsImFyZ3MiLCJmb3JtYXR0ZXIiLCJhcHBseSIsImV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbCIsIm1vZGVsQ29udGVudCIsIm5hbWVkTW9kZWxzQ29udGVudCIsInRleHQiLCJJbnZpc2libGVUZXh0IiwiYmluZFByb3BlcnR5IiwiZGVmYXVsdE1vZGVsIiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNvbnRlbnQiLCJlbnRyaWVzIiwibW9kZWwiLCJnZXRUZXh0IiwiVEVTVFZJRVdJRCIsImFwcGx5RmxleENoYW5nZXMiLCJmbGV4Q2hhbmdlcyIsInJlc3VsdFhNTCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpZCIsImNoYW5nZXMiLCJjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QiLCJhcHBJZCIsIm9NYW5pZmVzdCIsImNyb3NzTmF2aWdhdGlvbiIsIm91dGJvdW5kcyIsIm9BcHBDb21wb25lbnQiLCJnZXRDb21wb25lbnREYXRhIiwiZ2V0TWFuaWZlc3RPYmplY3QiLCJnZXRFbnRyeSIsImdldExvY2FsSWQiLCJzSWQiLCJzcHlPbiIsIkFwcFN0b3JhZ2UiLCJQcm9taXNlIiwiQ29tcG9uZW50IiwiVXRpbHMiLCJGbGV4U3RhdGUiLCJpbml0aWFsaXplIiwiY29tcG9uZW50SWQiLCJYbWxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwiY2hhbmdlc0FwcGxpZWQiLCJnZXRDaGFuZ2VzRnJvbVhNTCIsInRvQmUiLCJ2YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMiLCJmbGF0TWFwIiwiZSIsImF0dHJpYnV0ZXMiLCJhIiwiYXR0ciIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsImNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsIiwidGVtcGxhdGVkWG1sIiwiRE9NUGFyc2VyIiwieG1sRG9jIiwicGFyc2VGcm9tU3RyaW5nIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwiWE1MUHJlcHJvY2Vzc29yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJnZXRUZW1wbGF0ZWRYTUwiLCJ0ZW1wbGF0ZWRYTUwiLCJzZXJpYWxpZWRYTUwiLCJub3QiLCJwcm9jZXNzVmlldyIsIm9WaWV3RG9jdW1lbnQiLCJvUHJlcHJvY2Vzc2VkVmlldyIsImFzRWxlbWVudCIsImFzU3RyaW5nIiwib3V0ZXJIVE1MIiwicHJvY2Vzc0ZyYWdtZW50IiwidGVzdERhdGEiLCJpbnB1dFhtbCIsImlucHV0RG9jIiwianNvbk1vZGVsIiwic2V0RGF0YSIsInJlc3VsdERvYyIsImZyYWdtZW50cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZnJhZ21lbnQiLCJpbm5lckhUTUwiLCJ4bWxSZXN1bHQiLCJjaGlsZHJlbiIsInNlcmlhbGl6ZUNvbnRyb2wiLCJjb250cm9sVG9TZXJpYWxpemUiLCJ0YWJDb3VudCIsImdldFRhYiIsInRvQWRkIiwidGFiIiwiaSIsInNlcmlhbGl6ZURlbGVnYXRlIiwic3RhcnQiLCJzQWdncmVnYXRpb25OYW1lIiwiY29udHJvbERldGFpbCIsImdldFBhcmVudCIsImluZGV4SW5QYXJlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImluZGV4T2YiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJlbmQiLCJtaWRkbGUiLCJnZXRJZCIsIk1hbmFnZWRPYmplY3RNZXRhZGF0YSIsImlzR2VuZXJhdGVkSWQiLCJvQ29udHJvbEtleSIsIm1Qcm9wZXJ0aWVzIiwibUJpbmRpbmdJbmZvcyIsImJpbmRpbmdEZXRhaWwiLCJKU09OIiwic3RyaW5naWZ5IiwibUFzc29jaWF0aW9ucyIsIm1FdmVudFJlZ2lzdHJ5Iiwic3RhcnRBZ2dyZWdhdGlvbiIsInNOYW1lIiwib3V0IiwiZW5kQWdncmVnYXRpb24iLCJjb250cm9sVG9SZW5kZXIiLCJTZXJpYWxpemVyIiwic2VyaWFsaXplIiwiY3JlYXRlQXdhaXRlciIsImZuUmVzb2x2ZSIsIm15UHJvbWlzZSIsInByb21pc2UiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQW55QW5ub3RhdGlvbiwgQ29udmVydGVkTWV0YWRhdGEsIEVudGl0eVNldCwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBjb21waWxlciBmcm9tIFwiQHNhcC9jZHMtY29tcGlsZXJcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0ICogYXMgcGx1Z2luIGZyb20gXCJAcHJldHRpZXIvcGx1Z2luLXhtbFwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwicHJldHRpZXJcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IExvYWRlckV4dGVuc2lvbnMgZnJvbSBcInNhcC9iYXNlL3V0aWwvTG9hZGVyRXh0ZW5zaW9uc1wiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzLCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgSURpYWdub3N0aWNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCBTaWRlRWZmZWN0c0ZhY3RvcnkgZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBjcmVhdGVNb2NrUmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvdGVzdC9VSTVNb2NrSGVscGVyXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RNZXRhZGF0YVwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEludmlzaWJsZVRleHQgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVRleHRcIjtcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL3NlcmlhbGl6ZXIvU2VyaWFsaXplclwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBGbGV4U3RhdGUgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvZmxleFN0YXRlL0ZsZXhTdGF0ZVwiO1xuaW1wb3J0IFhtbFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L19pbnRlcm5hbC9wcmVwcm9jZXNzb3JzL1htbFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEFwcFN0b3JhZ2UgZnJvbSBcInNhcC91aS9mbC9pbml0aWFsL19pbnRlcm5hbC9TdG9yYWdlXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcInNhcC91aS9mbC9VdGlsc1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IE1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01ldGFNb2RlbFwiO1xuaW1wb3J0IF9NZXRhZGF0YVJlcXVlc3RvciBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L2xpYi9fTWV0YWRhdGFSZXF1ZXN0b3JcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCB4cGF0aCBmcm9tIFwieHBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZUZsZXhpYmlsaXR5Q2hhbmdlc09iamVjdCB9IGZyb20gXCIuL0plc3RGbGV4aWJpbGl0eUhlbHBlclwiO1xuXG50eXBlIFByZVByb2Nlc3NvclNldHRpbmdzVHlwZSA9IHtcblx0bW9kZWxzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IEpTT05Nb2RlbCB8IE9EYXRhTWV0YU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRbbmFtZTogc3RyaW5nXTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0fTtcbn07XG5cbnR5cGUgSmVzdFRlbXBsYXRlZFZpZXcgPSB7XG5cdGFzRWxlbWVudDogRWxlbWVudCB8IHVuZGVmaW5lZDtcblx0YXNTdHJpbmc6IHN0cmluZztcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5jb25zdCBmb3JtYXRYbWwgPSByZXF1aXJlKFwieG1sLWZvcm1hdHRlclwiKTtcblxuTG9nLnNldExldmVsKDEgYXMgYW55LCBcInNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yXCIpO1xuamVzdC5zZXRUaW1lb3V0KDQwMDAwKTtcblxuY29uc3QgbmFtZVNwYWNlTWFwID0ge1xuXHRtYWNyb3M6IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRtYWNybzogXCJzYXAuZmUubWFjcm9zXCIsXG5cdG1hY3JvRmllbGQ6IFwic2FwLmZlLm1hY3Jvcy5maWVsZFwiLFxuXHRtYWNyb2RhdGE6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRsb2c6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHR1bml0dGVzdDogXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9wcmVwcm9jZXNzb3JleHRlbnNpb24vc2FwLmZlLnVuaXR0ZXN0aW5nLzFcIixcblx0Y29udHJvbDogXCJzYXAuZmUuY29yZS5jb250cm9sc1wiLFxuXHRjb250cm9sczogXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzXCIsXG5cdGNvcmU6IFwic2FwLnVpLmNvcmVcIixcblx0ZHQ6IFwic2FwLnVpLmR0XCIsXG5cdG06IFwic2FwLm1cIixcblx0ZjogXCJzYXAudWkubGF5b3V0LmZvcm1cIixcblx0Zmw6IFwic2FwLnVpLmZsXCIsXG5cdGludGVybmFsTWFjcm86IFwic2FwLmZlLm1hY3Jvcy5pbnRlcm5hbFwiLFxuXHRtZGM6IFwic2FwLnVpLm1kY1wiLFxuXHRtZGNhdDogXCJzYXAudWkubWRjLmFjdGlvbnRvb2xiYXJcIixcblx0bWRjRmllbGQ6IFwic2FwLnVpLm1kYy5maWVsZFwiLFxuXHRtZGNUYWJsZTogXCJzYXAudWkubWRjLnRhYmxlXCIsXG5cdHU6IFwic2FwLnVpLnVuaWZpZWRcIixcblx0bWFjcm9NaWNyb0NoYXJ0OiBcInNhcC5mZS5tYWNyb3MubWljcm9jaGFydFwiLFxuXHRtaWNyb0NoYXJ0OiBcInNhcC5zdWl0ZS51aS5taWNyb2NoYXJ0XCIsXG5cdG1hY3JvVGFibGU6IFwic2FwLmZlLm1hY3Jvcy50YWJsZVwiXG59O1xuY29uc3Qgc2VsZWN0ID0geHBhdGgudXNlTmFtZXNwYWNlcyhuYW1lU3BhY2VNYXApO1xuXG5jb25zdCBkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlID0geyBjb21wdXRlRmllbGRHcm91cElkczogKCkgPT4gW10gfTtcblxuZnVuY3Rpb24gX2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbGRvbTogTm9kZSwgc2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG5cdC8qKlxuXHQgKiBpZiBhIHJvb3QgZWxlbWVudCBoYXMgYmVlbiBhZGRlZCBkdXJpbmcgdGhlIHRlbXBsYXRpbmcgYnkgb3VyIEplc3QgVGVtcGxhdGluZyBtZXRob2RzXG5cdCAqIHRoZSByb290IGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIHNlbGVjdG9yIHBhdGguXG5cdCAqL1xuXHRjb25zdCByb290UGF0aCA9IFwiL3Jvb3RcIjtcblx0cmV0dXJuIGAke3htbGRvbS5ub2RlTmFtZSA9PT0gXCJyb290XCIgJiYgIXNlbGVjdG9yLnN0YXJ0c1dpdGgocm9vdFBhdGgpID8gcm9vdFBhdGggOiBcIlwifSR7c2VsZWN0b3J9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3MoXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZha2VTaWRlRWZmZWN0U2VydmljZT86IHVua25vd25cbik6IFByb21pc2U8UHJlUHJvY2Vzc29yU2V0dGluZ3NUeXBlPiB7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcblxuXHQvLyBUbyBlbnN1cmUgb3VyIG1hY3JvIGNhbiB1c2UgI3NldEJpbmRpbmdDb250ZXh0IHdlIGVuc3VyZSB0aGVyZSBpcyBhIHByZSBleGlzdGluZyBKU09OTW9kZWwgZm9yIGNvbnZlcnRlckNvbnRleHRcblx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cdGlmICghbU1vZGVscy5oYXNPd25Qcm9wZXJ0eShcImNvbnZlcnRlckNvbnRleHRcIikpIHtcblx0XHRtTW9kZWxzID0gT2JqZWN0LmFzc2lnbihtTW9kZWxzLCB7IGNvbnZlcnRlckNvbnRleHQ6IG5ldyBUZW1wbGF0ZU1vZGVsKHt9LCBvTWV0YU1vZGVsKSB9KTtcblx0fVxuXG5cdE9iamVjdC5rZXlzKG1Nb2RlbHMpLmZvckVhY2goZnVuY3Rpb24gKHNNb2RlbE5hbWUpIHtcblx0XHRpZiAobU1vZGVsc1tzTW9kZWxOYW1lXSAmJiBtTW9kZWxzW3NNb2RlbE5hbWVdLmlzVGVtcGxhdGVNb2RlbCkge1xuXHRcdFx0bU1vZGVsc1tzTW9kZWxOYW1lXSA9IG5ldyBUZW1wbGF0ZU1vZGVsKG1Nb2RlbHNbc01vZGVsTmFtZV0uZGF0YSwgb01ldGFNb2RlbCk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBzZXR0aW5nczogYW55ID0ge1xuXHRcdG1vZGVsczogT2JqZWN0LmFzc2lnbihcblx0XHRcdHtcblx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsXG5cdFx0XHR9LFxuXHRcdFx0bU1vZGVsc1xuXHRcdCksXG5cdFx0YmluZGluZ0NvbnRleHRzOiB7fSxcblx0XHRhcHBDb21wb25lbnQ6IHsgZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlOiBqZXN0LmZuKCksIGdldERpYWdub3N0aWNzOiAoKSA9PiB1bmRlZmluZWQgfVxuXHR9O1xuXG5cdHNldHRpbmdzLmFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UubW9ja1JldHVyblZhbHVlKGZha2VTaWRlRWZmZWN0U2VydmljZSA/PyBkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlKTtcblx0Ly9JbmplY3QgbW9kZWxzIGFuZCBiaW5kaW5nQ29udGV4dHNcblx0T2JqZWN0LmtleXMobUJpbmRpbmdDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbiAoc0tleSkge1xuXHRcdC8qIEFzc2VydCB0byBtYWtlIHN1cmUgdGhlIGFubm90YXRpb25zIGFyZSBpbiB0aGUgdGVzdCBtZXRhZGF0YSAtPiBhdm9pZCBtaXNsZWFkaW5nIHRlc3RzICovXG5cdFx0ZXhwZWN0KHR5cGVvZiBvTWV0YU1vZGVsLmdldE9iamVjdChtQmluZGluZ0NvbnRleHRzW3NLZXldKSkudG9CZURlZmluZWQoKTtcblx0XHRjb25zdCBvTW9kZWwgPSBtTW9kZWxzW3NLZXldIHx8IG9NZXRhTW9kZWw7XG5cdFx0c2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NLZXldID0gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pOyAvL1ZhbHVlIGlzIHNQYXRoXG5cdFx0c2V0dGluZ3MubW9kZWxzW3NLZXldID0gb01vZGVsO1xuXHR9KTtcblx0cmV0dXJuIHNldHRpbmdzO1xufVxuXG5mdW5jdGlvbiBfcmVtb3ZlQ29tbWVudEZyb21YbWwoeG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gZm9ybWF0WG1sKHhtbCwge1xuXHRcdGZpbHRlcjogKG5vZGU6IGFueSkgPT4gbm9kZS50eXBlICE9PSBcIkNvbW1lbnRcIlxuXHR9KTtcbn1cblxuZnVuY3Rpb24gX2xvYWRSZXNvdXJjZVZpZXcodmlld05hbWU6IHN0cmluZyk6IEVsZW1lbnQge1xuXHRjb25zdCBuYW1lID0gdmlld05hbWUucmVwbGFjZSgvXFwuL2csIFwiL1wiKSArIFwiLnZpZXcueG1sXCI7XG5cdGNvbnN0IHZpZXcgPSBMb2FkZXJFeHRlbnNpb25zLmxvYWRSZXNvdXJjZShuYW1lKTtcblx0cmV0dXJuIHZpZXcuZG9jdW1lbnRFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgcnVuWFBhdGhRdWVyeSA9IGZ1bmN0aW9uIChzZWxlY3Rvcjogc3RyaW5nLCB4bWxkb206IE5vZGUgfCB1bmRlZmluZWQpIHtcblx0cmV0dXJuIHNlbGVjdChzZWxlY3RvciwgeG1sZG9tKTtcbn07XG5cbmV4cGVjdC5leHRlbmQoe1xuXHR0b0hhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoX2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbGRvbSwgc2VsZWN0b3IpLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYGRpZCBub3QgZmluZCBjb250cm9scyBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA+PSAxXG5cdFx0fTtcblx0fSxcblx0dG9Ob3RIYXZlQ29udHJvbCh4bWxkb20sIHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb20sIHNlbGVjdG9yKSwgeG1sZG9tKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvdXRwdXRYbWwgPSBzZXJpYWxpemVYTUwoeG1sZG9tKTtcblx0XHRcdFx0cmV0dXJuIGBUaGVyZSBpcyBhIGNvbnRyb2wgbWF0Y2hpbmcgJHtzZWxlY3Rvcn0gaW4gZ2VuZXJhdGVkIHhtbDpcXG4gJHtvdXRwdXRYbWx9YDtcblx0XHRcdH0sXG5cdFx0XHRwYXNzOiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPT09IDBcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogQ2hlY2tzIGZvciBlcnJvcnMgaW4gYHhtbGAgY3JlYXRlZCBkdXJpbmcgdGVtcGxhdGluZyBvZiBhbiBYTUwgc3RyaW5nIG9yXG5cdCAqIGFuIFhNTCBub2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrZXMgZm9yIHRoZSB4bWwgZXJyb3JzIGNyZWF0ZWQgYnkgdGhlXG5cdCAqIGZ1bmN0aW9uIFtCdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3IuY3JlYXRlRXJyb3JYTUxde0BsaW5rIHNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLkJ1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvciNjcmVhdGVFcnJvclhNTH0uXG5cdCAqXG5cdCAqIEBwYXJhbSB4bWwgWE1MIFN0cmluZyBvciBYTUwgTm9kZSB0byBiZSB0ZXN0ZWQgZm9yIGVycm9yc1xuXHQgKiBAcmV0dXJucyBKZXN0IE1hdGNoZXIgcmVzdWx0IG9iamVjdFxuXHQgKi9cblx0dG9IYXZlVGVtcGxhdGluZ0Vycm9ycyh4bWw6IHN0cmluZyB8IE5vZGUpIHtcblx0XHRjb25zdCB4bWxUZXh0ID0gdHlwZW9mIHhtbCA9PT0gXCJzdHJpbmdcIiA/IHhtbCA6IHNlcmlhbGl6ZVhNTCh4bWwpO1xuXHRcdGNvbnN0IGJhc2U2NEVudHJpZXM6IHN0cmluZ1tdID0geG1sVGV4dC5tYXRjaCgvQkJGXFwuYmFzZTY0RGVjb2RlXFwoJyhbXiddKiknXFwpL2dtKSB8fCAoW10gYXMgc3RyaW5nW10pO1xuXHRcdGNvbnN0IGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdID0gYmFzZTY0RW50cmllcy5tYXAoKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuXHRcdFx0aWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBhdG9iKG1lc3NhZ2UubWF0Y2goLygnW14nXSopLyk/LlswXT8uc2xpY2UoMSkgfHwgXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9KTtcblx0XHRpZiAoZXJyb3JNZXNzYWdlcy5sZW5ndGggPD0gMCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWVzc2FnZTogKCkgPT4gYFhNTCBUZW1wbGF0aW5nIHdpdGhvdXQgZXJyb3JzYCxcblx0XHRcdFx0cGFzczogZmFsc2Vcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1lc3NhZ2U6ICgpID0+IGVycm9yTWVzc2FnZXMuam9pbihcIlxcblwiKSxcblx0XHRcdFx0cGFzczogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG5cdGlmIChBcnJheS5pc0FycmF5KHhtbFN0cmluZykpIHtcblx0XHR4bWxTdHJpbmcgPSB4bWxTdHJpbmcuam9pbihcIlwiKTtcblx0fVxuXHRsZXQgeG1sRm9ybWF0dGVkID0gZm9ybWF0WE1MKHhtbFN0cmluZyk7XG5cdHhtbEZvcm1hdHRlZCA9IHhtbEZvcm1hdHRlZC5yZXBsYWNlKC91aWQtLWlkLVswLTldezEzfS1bMC05XXsxLDN9L2csIFwidWlkLS1pZFwiKTtcblx0cmV0dXJuIHhtbEZvcm1hdHRlZDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250cm9sQXR0cmlidXRlID0gZnVuY3Rpb24gKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoJHtfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sRG9tLCBjb250cm9sU2VsZWN0b3IpfS9AJHthdHRyaWJ1dGVOYW1lfSlgO1xuXHRyZXR1cm4gcnVuWFBhdGhRdWVyeShzZWxlY3RvciwgeG1sRG9tKTtcbn07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBwYXJ0cyBvciB0aGUgY29tcGxldGUgZ2l2ZW4gWE1MIERPTSB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHhtbERvbSBET00gbm9kZSB0aGF0IGlzIHRvIGJlIHNlcmlhbGl6ZWQuXG4gKiBAcGFyYW0gc2VsZWN0b3IgT3B0aW9uYWwgc2VsZWN0b3Igb2Ygc3ViIG5vZGVzXG4gKiBAcmV0dXJucyBYTUwgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVYTUwgPSBmdW5jdGlvbiAoeG1sRG9tOiBOb2RlLCBzZWxlY3Rvcj86IHN0cmluZykge1xuXHRjb25zdCBzZXJpYWxpemVyID0gbmV3IHdpbmRvdy5YTUxTZXJpYWxpemVyKCk7XG5cdGxldCB4bWxTdHJpbmc6IHN0cmluZztcblx0aWYgKHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KHNlbGVjdG9yLCB4bWxEb20pIGFzIE5vZGVbXTtcblx0XHR4bWxTdHJpbmcgPSBub2Rlcy5tYXAoKG5vZGUpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcobm9kZSkpLmpvaW4oXCJcXG5cIik7XG5cdH0gZWxzZSB7XG5cdFx0eG1sU3RyaW5nID0gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoeG1sU3RyaW5nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRYTUwgPSBmdW5jdGlvbiAoeG1sU3RyaW5nOiBzdHJpbmcpIHtcblx0cmV0dXJuIGZvcm1hdCh4bWxTdHJpbmcsIHtcblx0XHRwYXJzZXI6IFwieG1sXCIsXG5cdFx0eG1sV2hpdGVzcGFjZVNlbnNpdGl2aXR5OiBcImlnbm9yZVwiLFxuXHRcdHBsdWdpbnM6IFtwbHVnaW5dXG5cdH0gYXMgT3B0aW9ucyAmIHsgeG1sV2hpdGVzcGFjZVNlbnNpdGl2aXR5OiBcImlnbm9yZVwiIHwgXCJzdHJpY3RcIiB9KTtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBhIENEUyBmaWxlIGludG8gYW4gRURNWCBmaWxlLlxuICpcbiAqIEBwYXJhbSBjZHNVcmwgVGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgQ0RTIGRlZmluaXRpb24uIFRoaXMgZmlsZSBtdXN0IGRlY2xhcmUgdGhlIG5hbWVzcGFjZVxuICogc2FwLmZlLnRlc3QgYW5kIGEgc2VydmljZSBKZXN0U2VydmljZVxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIEVETVggb3V0cHV0XG4gKiBAcGFyYW0gZWRteEZpbGVOYW1lIEFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVkIEVETVggbWV0YWRhdGEgZmlsZVxuICogQHJldHVybnMgVGhlIHBhdGggb2YgdGhlIGdlbmVyYXRlZCBFRE1YXG4gKi9cbmV4cG9ydCBjb25zdCBjb21waWxlQ0RTID0gZnVuY3Rpb24gKFxuXHRjZHNVcmw6IHN0cmluZyxcblx0b3B0aW9uczogY29tcGlsZXIuT0RhdGFPcHRpb25zID0ge30sXG5cdGVkbXhGaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoY2RzVXJsKS5yZXBsYWNlKFwiLmNkc1wiLCBcIi54bWxcIilcbikge1xuXHRjb25zdCBjZHNTdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoY2RzVXJsLCBcInV0Zi04XCIpO1xuXHRjb25zdCBlZG14Q29udGVudCA9IGNkczJlZG14KGNkc1N0cmluZywgXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zKTtcblx0Y29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKGNkc1VybCwgXCIuLlwiLCBcImdlblwiKTtcblxuXHRjb25zdCBlZG14RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyLCBlZG14RmlsZU5hbWUpO1xuXG5cdGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdGZzLndyaXRlRmlsZVN5bmMoZWRteEZpbGVQYXRoLCBlZG14Q29udGVudCk7XG5cdHJldHVybiBlZG14RmlsZVBhdGg7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgQ0RTIHRvIEVETVguXG4gKlxuICogQHBhcmFtIGNkcyBUaGUgQ0RTIG1vZGVsLiBJdCBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgc2VydmljZS5cbiAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VydmljZSB0byBiZSBjb21waWxlZC4gRGVmYXVsdHMgdG8gXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIEVETVggb3V0cHV0XG4gKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgc2VydmljZSBtb2RlbCBhcyBFRE1YLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2RzMmVkbXgoY2RzOiBzdHJpbmcsIHNlcnZpY2UgPSBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIsIG9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IFwic291cmNlLmNkc1wiOiBjZHMgfTtcblxuXHQvLyBhbGxvdyB0byBpbmNsdWRlIHN0dWZmIGZyb20gQHNhcC9jZHMvY29tbW9uXG5cdGlmIChjZHMuaW5jbHVkZXMoXCInQHNhcC9jZHMvY29tbW9uJ1wiKSkge1xuXHRcdHNvdXJjZXNbXCJjb21tb24uY2RzXCJdID0gZnMucmVhZEZpbGVTeW5jKHJlcXVpcmUucmVzb2x2ZShcIkBzYXAvY2RzL2NvbW1vbi5jZHNcIiksIFwidXRmLThcIik7XG5cdH1cblxuXHRjb25zdCBjc24gPSBjb21waWxlci5jb21waWxlU291cmNlcyhzb3VyY2VzLCB7fSk7XG5cblx0Y29uc3QgZWRteE9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHtcblx0XHRvZGF0YUZvcmVpZ25LZXlzOiB0cnVlLFxuXHRcdG9kYXRhRm9ybWF0OiBcInN0cnVjdHVyZWRcIixcblx0XHRvZGF0YUNvbnRhaW5tZW50OiBmYWxzZSxcblx0XHQuLi5vcHRpb25zLFxuXHRcdHNlcnZpY2U6IHNlcnZpY2Vcblx0fTtcblxuXHRjb25zdCBlZG14ID0gY29tcGlsZXIudG8uZWRteChjc24sIGVkbXhPcHRpb25zKTtcblx0aWYgKCFlZG14KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBDb21waWxhdGlvbiBmYWlsZWQuIEhpbnQ6IE1ha2Ugc3VyZSB0aGF0IHRoZSBDRFMgbW9kZWwgZGVmaW5lcyBzZXJ2aWNlICR7c2VydmljZX0uYCk7XG5cdH1cblx0cmV0dXJuIGVkbXg7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogUHJvbWlzZTxhbnk+IHtcblx0Y29uc3Qgb1NlcnZpY2VDb250ZXh0ID0geyBzY29wZU9iamVjdDoge30sIHNjb3BlVHlwZTogXCJcIiwgc2V0dGluZ3M6IHt9IH0gYXMgU2VydmljZUNvbnRleHQ8YW55Pjtcblx0cmV0dXJuIG5ldyBTaWRlRWZmZWN0c0ZhY3RvcnkoKS5jcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQpLnRoZW4oZnVuY3Rpb24gKG9TZXJ2aWNlSW5zdGFuY2U6IGFueSkge1xuXHRcdGNvbnN0IG9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlID0gb1NlcnZpY2VJbnN0YW5jZS5nZXRJbnRlcmZhY2UoKTtcblx0XHRvSmVzdFNpZGVFZmZlY3RzU2VydmljZS5nZXRDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2NvcGVPYmplY3Q6IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0Z2V0TWV0YU1vZGVsOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NZXRhTW9kZWw7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0cmV0dXJuIG9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlO1xuXHR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlRGlhZ25vc3RpY3MgPSBmdW5jdGlvbiAoKTogSURpYWdub3N0aWNzIHtcblx0Y29uc3QgaXNzdWVzOiBhbnlbXSA9IFtdO1xuXHRyZXR1cm4ge1xuXHRcdGFkZElzc3VlKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0aXNzdWVzLnB1c2goe1xuXHRcdFx0XHRpc3N1ZUNhdGVnb3J5LFxuXHRcdFx0XHRpc3N1ZVNldmVyaXR5LFxuXHRcdFx0XHRkZXRhaWxzXG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGdldElzc3VlcygpOiBhbnlbXSB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzO1xuXHRcdH0sXG5cdFx0Y2hlY2tJZklzc3VlRXhpc3RzKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIGlzc3Vlcy5maW5kKChpc3N1ZSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gaXNzdWUuaXNzdWVDYXRlZ29yeSA9PT0gaXNzdWVDYXRlZ29yeSAmJiBpc3N1ZS5pc3N1ZVNldmVyaXR5ID09PSBpc3N1ZVNldmVyaXR5ICYmIGlzc3VlLmRldGFpbHMgPT09IGRldGFpbHM7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0bWFuaWZlc3RTZXR0aW5nczogTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MgfCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5nc1xuKSB7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlZFR5cGVzLmVudGl0eVNldHMuZmluZCgoZXMpID0+IGVzLm5hbWUgPT09IG1hbmlmZXN0U2V0dGluZ3MuZW50aXR5U2V0KTtcblx0Y29uc3QgZGF0YU1vZGVsUGF0aCA9IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eShlbnRpdHlTZXQgYXMgRW50aXR5U2V0LCBjb252ZXJ0ZWRUeXBlcywgZW50aXR5U2V0KTtcblx0cmV0dXJuIG5ldyBDb252ZXJ0ZXJDb250ZXh0KGNvbnZlcnRlZFR5cGVzLCBtYW5pZmVzdFNldHRpbmdzLCBnZXRGYWtlRGlhZ25vc3RpY3MoKSwgbWVyZ2UsIGRhdGFNb2RlbFBhdGgpO1xufTtcbmNvbnN0IG1ldGFNb2RlbENhY2hlOiBhbnkgPSB7fTtcbmV4cG9ydCBjb25zdCBnZXRNZXRhTW9kZWwgPSBhc3luYyBmdW5jdGlvbiAoc01ldGFkYXRhVXJsOiBzdHJpbmcpIHtcblx0Y29uc3Qgb1JlcXVlc3RvciA9IF9NZXRhZGF0YVJlcXVlc3Rvci5jcmVhdGUoe30sIFwiNC4wXCIsIHVuZGVmaW5lZCwge30pO1xuXHRpZiAoIW1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gbmV3IChPRGF0YU1ldGFNb2RlbCBhcyBhbnkpKG9SZXF1ZXN0b3IsIHNNZXRhZGF0YVVybCwgdW5kZWZpbmVkLCBudWxsKTtcblx0XHRhd2FpdCBvTWV0YU1vZGVsLmZldGNoRW50aXR5Q29udGFpbmVyKCk7XG5cdFx0bWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHRyZXR1cm4gbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdGVudGl0eVNldDogRW50aXR5U2V0LFxuXHRjb252ZXJ0ZWRUeXBlczogQ29udmVydGVkTWV0YWRhdGEsXG5cdHByb3BlcnR5PzogUHJvcGVydHkgfCBFbnRpdHlTZXQgfCBBbnlBbm5vdGF0aW9uXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgdGFyZ2V0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHR0YXJnZXRPYmplY3Q6IHByb3BlcnR5LFxuXHRcdHRhcmdldEVudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGVudGl0eVNldC5lbnRpdHlUeXBlLFxuXHRcdGNvbnZlcnRlZFR5cGVzOiBjb252ZXJ0ZWRUeXBlc1xuXHR9O1xuXHR0YXJnZXRQYXRoLmNvbnRleHRMb2NhdGlvbiA9IHRhcmdldFBhdGg7XG5cdHJldHVybiB0YXJnZXRQYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZyA9IGZ1bmN0aW9uIChiaW5kaW5nU3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRyZXR1cm4gYmluZGluZ0VsZW1lbnQuZm9ybWF0dGVyLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG59O1xuXG50eXBlIE1vZGVsQ29udGVudCA9IHtcblx0W25hbWU6IHN0cmluZ106IGFueTtcbn07XG5cbi8qKlxuICogRXZhbHVhdGUgYSBiaW5kaW5nIGFnYWluc3QgYSBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gYmluZGluZ1N0cmluZyBUaGUgYmluZGluZyBzdHJpbmcuXG4gKiBAcGFyYW0gbW9kZWxDb250ZW50IENvbnRlbnQgb2YgdGhlIGRlZmF1bHQgbW9kZWwgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIG5hbWVkTW9kZWxzQ29udGVudCBDb250ZW50cyBvZiBhZGRpdGlvbmFsLCBuYW1lZCBtb2RlbHMgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIGV2YWx1YXRlZCBiaW5kaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsKFxuXHRiaW5kaW5nU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1vZGVsQ29udGVudDogTW9kZWxDb250ZW50LFxuXHRuYW1lZE1vZGVsc0NvbnRlbnQ/OiB7IFttb2RlbE5hbWU6IHN0cmluZ106IE1vZGVsQ29udGVudCB9XG4pOiBzdHJpbmcge1xuXHRjb25zdCBiaW5kaW5nRWxlbWVudCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihiaW5kaW5nU3RyaW5nKTtcblx0Y29uc3QgdGV4dCA9IG5ldyBJbnZpc2libGVUZXh0KCk7XG5cdHRleHQuYmluZFByb3BlcnR5KFwidGV4dFwiLCBiaW5kaW5nRWxlbWVudCk7XG5cblx0Y29uc3QgZGVmYXVsdE1vZGVsID0gbmV3IEpTT05Nb2RlbChtb2RlbENvbnRlbnQpO1xuXHR0ZXh0LnNldE1vZGVsKGRlZmF1bHRNb2RlbCk7XG5cdHRleHQuc2V0QmluZGluZ0NvbnRleHQoZGVmYXVsdE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSk7XG5cblx0aWYgKG5hbWVkTW9kZWxzQ29udGVudCkge1xuXHRcdGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVkTW9kZWxzQ29udGVudCkpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gbmV3IEpTT05Nb2RlbChjb250ZW50KTtcblx0XHRcdHRleHQuc2V0TW9kZWwobW9kZWwsIG5hbWUpO1xuXHRcdFx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChtb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiksIG5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0ZXh0LmdldFRleHQoKTtcbn1cblxuY29uc3QgVEVTVFZJRVdJRCA9IFwidGVzdFZpZXdJZFwiO1xuXG5jb25zdCBhcHBseUZsZXhDaGFuZ2VzID0gYXN5bmMgZnVuY3Rpb24gKGZsZXhDaGFuZ2VzOiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9LCBvTWV0YU1vZGVsOiBNZXRhTW9kZWwsIHJlc3VsdFhNTDogYW55KSB7XG5cdC8vIHByZWZpeCBJZHNcblx0Wy4uLnJlc3VsdFhNTC5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkXVwiKV0uZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdG5vZGUuaWQgPSBgJHtURVNUVklFV0lEfS0tJHtub2RlLmlkfWA7XG5cdH0pO1xuXHRjb25zdCBjaGFuZ2VzID0gY3JlYXRlRmxleGliaWxpdHlDaGFuZ2VzT2JqZWN0KFRFU1RWSUVXSUQsIGZsZXhDaGFuZ2VzKTtcblx0Y29uc3QgYXBwSWQgPSBcInNvbWVDb21wb25lbnRcIjtcblx0Y29uc3Qgb01hbmlmZXN0ID0ge1xuXHRcdFwic2FwLmFwcFwiOiB7XG5cdFx0XHRpZDogYXBwSWQsXG5cdFx0XHR0eXBlOiBcImFwcGxpY2F0aW9uXCIsXG5cdFx0XHRjcm9zc05hdmlnYXRpb246IHtcblx0XHRcdFx0b3V0Ym91bmRzOiBbXVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3Qgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50ID0ge1xuXHRcdGdldERpYWdub3N0aWNzOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKGdldEZha2VEaWFnbm9zdGljcygpKSxcblx0XHRnZXRNb2RlbDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7XG5cdFx0XHRnZXRNZXRhTW9kZWw6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUob01ldGFNb2RlbClcblx0XHR9KSxcblx0XHRnZXRDb21wb25lbnREYXRhOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHt9KSxcblx0XHRnZXRNYW5pZmVzdE9iamVjdDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7XG5cdFx0XHRnZXRFbnRyeTogZnVuY3Rpb24gKG5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRyZXR1cm4gKG9NYW5pZmVzdCBhcyBhbnkpW25hbWVdO1xuXHRcdFx0fVxuXHRcdH0pLFxuXHRcdGdldExvY2FsSWQ6IGplc3QuZm4oKHNJZCkgPT4gc0lkKVxuXHR9IGFzIHVua25vd24gYXMgQXBwQ29tcG9uZW50O1xuXHQvL2Zha2UgY2hhbmdlc1xuXHRqZXN0LnNweU9uKEFwcFN0b3JhZ2UsIFwibG9hZEZsZXhEYXRhXCIpLm1vY2tSZXR1cm5WYWx1ZShQcm9taXNlLnJlc29sdmUoY2hhbmdlcykpO1xuXHRqZXN0LnNweU9uKENvbXBvbmVudCwgXCJnZXRcIikubW9ja1JldHVyblZhbHVlKG9BcHBDb21wb25lbnQpO1xuXHRqZXN0LnNweU9uKFV0aWxzLCBcImdldEFwcENvbXBvbmVudEZvckNvbnRyb2xcIikubW9ja1JldHVyblZhbHVlKG9BcHBDb21wb25lbnQpO1xuXHRhd2FpdCBGbGV4U3RhdGUuaW5pdGlhbGl6ZSh7XG5cdFx0Y29tcG9uZW50SWQ6IGFwcElkXG5cdH0pO1xuXHRyZXN1bHRYTUwgPSBhd2FpdCBYbWxQcmVwcm9jZXNzb3IucHJvY2VzcyhyZXN1bHRYTUwsIHsgbmFtZTogXCJUZXN0IEZyYWdtZW50XCIsIGNvbXBvbmVudElkOiBhcHBJZCwgaWQ6IFRFU1RWSUVXSUQgfSk7XG5cblx0Ly9Bc3NlcnQgdGhhdCBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gYXBwbGllZFxuXHRjb25zdCBjaGFuZ2VzQXBwbGllZCA9IGdldENoYW5nZXNGcm9tWE1MKHJlc3VsdFhNTCk7XG5cdGV4cGVjdChjaGFuZ2VzQXBwbGllZC5sZW5ndGgpLnRvQmUoZmxleENoYW5nZXM/LmNoYW5nZXM/Lmxlbmd0aCA/PyAwICsgZmxleENoYW5nZXM/LnZhcmlhbnREZXBlbmRlbnRDb250cm9sQ2hhbmdlcz8ubGVuZ3RoID8/IDApO1xuXHRyZXR1cm4gcmVzdWx0WE1MO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENoYW5nZXNGcm9tWE1MID0gKHhtbDogYW55KSA9PlxuXHRbLi4ueG1sLnF1ZXJ5U2VsZWN0b3JBbGwoXCIqXCIpXVxuXHRcdC5mbGF0TWFwKChlKSA9PiBbLi4uZS5hdHRyaWJ1dGVzXS5tYXAoKGEpID0+IGEubmFtZSkpXG5cdFx0LmZpbHRlcigoYXR0cikgPT4gYXR0ci5pbmNsdWRlcyhcInNhcC51aS5mbC5hcHBsaWVkQ2hhbmdlc1wiKSk7XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0aW5nUmVzdWx0ID0gYXN5bmMgZnVuY3Rpb24gKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogYW55OyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfSxcblx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlPzogdW5rbm93blxuKSB7XG5cdGlmICghbU1vZGVsc1tcInNhcC5mZS5pMThuXCJdKSB7XG5cdFx0bU1vZGVsc1tcInNhcC5mZS5pMThuXCJdID0gY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwoKTtcblx0fVxuXG5cdGNvbnN0IHRlbXBsYXRlZFhtbCA9IGA8cm9vdD4ke3htbElucHV0fTwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCB4bWxEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRlbXBsYXRlZFhtbCwgXCJ0ZXh0L3htbFwiKTtcblx0Ly8gVG8gZW5zdXJlIG91ciBtYWNybyBjYW4gdXNlICNzZXRCaW5kaW5nQ29udGV4dCB3ZSBlbnN1cmUgdGhlcmUgaXMgYSBwcmUgZXhpc3RpbmcgSlNPTk1vZGVsIGZvciBjb252ZXJ0ZXJDb250ZXh0XG5cdC8vIGlmIG5vdCBhbHJlYWR5IHBhc3NlZCB0byB0ZWggdGVtcGxhdGluZ1xuXG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gYXdhaXQgX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3Moc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzLCBmYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXG5cdC8vVGhpcyBjb250ZXh0IGZvciBtYWNybyB0ZXN0aW5nXG5cdGlmIChvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXSkge1xuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbXCJ0aGlzXCJdID0gb1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tcInRoaXNcIl0uY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHR9XG5cblx0bGV0IHJlc3VsdFhNTCA9IChhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyh4bWxEb2MuZmlyc3RFbGVtZW50Q2hpbGQhLCB7IG5hbWU6IFwiVGVzdCBGcmFnbWVudFwiIH0sIG9QcmVwcm9jZXNzb3JTZXR0aW5ncykpIGFzIGFueTtcblxuXHRpZiAoZmxleENoYW5nZXMpIHtcblx0XHQvLyBhcHBseSBmbGV4IGNoYW5nZXNcblx0XHRyZXN1bHRYTUwgPSBhd2FpdCBhcHBseUZsZXhDaGFuZ2VzKGZsZXhDaGFuZ2VzLCBvTWV0YU1vZGVsLCByZXN1bHRYTUwpO1xuXHR9XG5cdHJldHVybiByZXN1bHRYTUw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGVtcGxhdGVkWE1MID0gYXN5bmMgZnVuY3Rpb24gKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuXHRmbGV4Q2hhbmdlcz86IHsgW3g6IHN0cmluZ106IG9iamVjdFtdIH0sXG5cdGZha2VTaWRlRWZmZWN0U2VydmljZT86IHVua25vd25cbikge1xuXHRjb25zdCB0ZW1wbGF0ZWRYTUwgPSBhd2FpdCBnZXRUZW1wbGF0aW5nUmVzdWx0KHhtbElucHV0LCBzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMsIGZsZXhDaGFuZ2VzLCBmYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXHRjb25zdCBzZXJpYWxpZWRYTUwgPSBzZXJpYWxpemVYTUwodGVtcGxhdGVkWE1MKTtcblx0ZXhwZWN0KHNlcmlhbGllZFhNTCkubm90LnRvSGF2ZVRlbXBsYXRpbmdFcnJvcnMoKTtcblx0cmV0dXJuIHNlcmlhbGllZFhNTDtcbn07XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgcmVxdWVzdGVkIHZpZXcgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdmlldyB0byBiZSB0ZXN0ZWQuXG4gKiBAcGFyYW0gc01ldGFkYXRhVXJsIFVybCBvZiB0aGUgbWV0YWRhdGEuXG4gKiBAcGFyYW0gbUJpbmRpbmdDb250ZXh0cyBNYXAgb2YgdGhlIGJpbmRpbmdDb250ZXh0cyB0byBzZXQgb24gdGhlIG1vZGVscy5cbiAqIEBwYXJhbSBtTW9kZWxzIE1hcCBvZiB0aGUgbW9kZWxzLlxuICogQHBhcmFtIGZsZXhDaGFuZ2VzIE9iamVjdCB3aXRoIFVJIGNoYW5nZXMgbGlrZSAnY2hhbmdlcycgb3IgJ3ZhcmlhbnREZXBlbmRlbnRDb250cm9sQ2hhbmdlcydcbiAqIEByZXR1cm5zIFRlbXBsYXRlZCB2aWV3IGFzIHN0cmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1ZpZXcoXG5cdG5hbWU6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9XG4pOiBQcm9taXNlPEplc3RUZW1wbGF0ZWRWaWV3PiB7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcblx0Y29uc3Qgb1ZpZXdEb2N1bWVudCA9IF9sb2FkUmVzb3VyY2VWaWV3KG5hbWUpO1xuXHRjb25zdCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSBhd2FpdCBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMpO1xuXHRsZXQgb1ByZXByb2Nlc3NlZFZpZXcgPSBhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2VzcyhvVmlld0RvY3VtZW50LCB7IG5hbWU6IG5hbWUgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKTtcblx0aWYgKGZsZXhDaGFuZ2VzKSB7XG5cdFx0b1ByZXByb2Nlc3NlZFZpZXcgPSBhd2FpdCBhcHBseUZsZXhDaGFuZ2VzKGZsZXhDaGFuZ2VzID8/IFtdLCBvTWV0YU1vZGVsLCBvUHJlcHJvY2Vzc2VkVmlldyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRhc0VsZW1lbnQ6IG9QcmVwcm9jZXNzZWRWaWV3LFxuXHRcdGFzU3RyaW5nOiBfcmVtb3ZlQ29tbWVudEZyb21YbWwob1ByZXByb2Nlc3NlZFZpZXc/Lm91dGVySFRNTCB8fCBcIlwiKVxuXHR9O1xufVxuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCBYTUwgZnJhZ21lbnQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHRlc3REYXRhIFRlc3QgZGF0YSBjb25zaXN0aW5nXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgZnJhZ21lbnQgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhZ21lbnQobmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogeyBbbW9kZWw6IHN0cmluZ106IG9iamVjdCB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0Y29uc3QgaW5wdXRYbWwgPSBgPHJvb3Q+PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwiJHtuYW1lfVwiIHR5cGU9XCJYTUxcIiB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIiAvPjwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCBpbnB1dERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaW5wdXRYbWwsIFwidGV4dC94bWxcIik7XG5cblx0Ly8gYnVpbGQgbW9kZWwgYW5kIGJpbmRpbmdzIGZvciBnaXZlbiB0ZXN0IGRhdGFcblx0Y29uc3Qgc2V0dGluZ3MgPSB7XG5cdFx0bW9kZWxzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWwgfSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IG9iamVjdCB9LFxuXHRcdGFwcENvbXBvbmVudDogeyBnZXRTaWRlRWZmZWN0c1NlcnZpY2U6IGplc3QuZm4oKSwgZ2V0RGlhZ25vc3RpY3M6ICgpID0+IHVuZGVmaW5lZCB9XG5cdH07XG5cdGZvciAoY29uc3QgbW9kZWwgaW4gdGVzdERhdGEpIHtcblx0XHRjb25zdCBqc29uTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0anNvbk1vZGVsLnNldERhdGEodGVzdERhdGFbbW9kZWxdKTtcblx0XHRzZXR0aW5ncy5tb2RlbHNbbW9kZWxdID0ganNvbk1vZGVsO1xuXHRcdHNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1ttb2RlbF0gPSBzZXR0aW5ncy5tb2RlbHNbbW9kZWxdLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0fVxuXHRzZXR0aW5ncy5hcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlLm1vY2tSZXR1cm5WYWx1ZShkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlKTtcblxuXHQvLyBleGVjdXRlIHRoZSBwcmUtcHJvY2Vzc29yXG5cdGNvbnN0IHJlc3VsdERvYyA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0RG9jLmZpcnN0RWxlbWVudENoaWxkLCB7IG5hbWUgfSwgc2V0dGluZ3MpO1xuXG5cdC8vIGV4Y2x1ZGUgbmVzdGVkIGZyYWdtZW50cyBmcm9tIHRlc3Qgc25hcHNob3RzXG5cdGNvbnN0IGZyYWdtZW50cyA9IHJlc3VsdERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvcmU6RnJhZ21lbnRcIikgYXMgYW55O1xuXHRpZiAoZnJhZ21lbnRzPy5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yIChjb25zdCBmcmFnbWVudCBvZiBmcmFnbWVudHMpIHtcblx0XHRcdGZyYWdtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0fVxuXHR9XG5cblx0Ly8gS2VlcCB0aGUgZnJhZ21lbnQgcmVzdWx0IGFzIGNoaWxkIG9mIHJvb3Qgbm9kZSB3aGVuIGZyYWdtZW50IGdlbmVyYXRlcyBtdWx0aXBsZSByb290IGNvbnRyb2xzXG5cdGNvbnN0IHhtbFJlc3VsdCA9IHJlc3VsdERvYy5jaGlsZHJlbi5sZW5ndGggPiAxID8gcmVzdWx0RG9jLm91dGVySFRNTCA6IHJlc3VsdERvYy5pbm5lckhUTUw7XG5cblx0cmV0dXJuIF9yZW1vdmVDb21tZW50RnJvbVhtbCh4bWxSZXN1bHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQ29udHJvbChjb250cm9sVG9TZXJpYWxpemU6IENvbnRyb2wgfCBDb250cm9sW10pIHtcblx0bGV0IHRhYkNvdW50ID0gMDtcblx0ZnVuY3Rpb24gZ2V0VGFiKHRvQWRkOiBudW1iZXIgPSAwKSB7XG5cdFx0bGV0IHRhYiA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0YWJDb3VudCArIHRvQWRkOyBpKyspIHtcblx0XHRcdHRhYiArPSBcIlxcdFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFiO1xuXHR9XG5cdGNvbnN0IHNlcmlhbGl6ZURlbGVnYXRlID0ge1xuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBjb250cm9sRGV0YWlsID0gXCJcIjtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLmdldFBhcmVudCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXhJblBhcmVudCA9IChjb250cm9sLmdldFBhcmVudCgpLmdldEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUpIGFzIE1hbmFnZWRPYmplY3RbXSk/LmluZGV4T2Y/Lihjb250cm9sKTtcblx0XHRcdFx0XHRpZiAoaW5kZXhJblBhcmVudCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYCxcXG4ke2dldFRhYigpfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb250cm9sRGV0YWlsICs9IGAke2NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9KGA7XG5cdFx0XHRyZXR1cm4gY29udHJvbERldGFpbDtcblx0XHR9LFxuXHRcdGVuZDogZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIFwifSlcIjtcblx0XHR9LFxuXHRcdG1pZGRsZTogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSkge1xuXHRcdFx0Y29uc3QgaWQgPSBjb250cm9sLmdldElkKCk7XG5cdFx0XHRsZXQgZGF0YSA9IGB7aWQ6ICR7TWFuYWdlZE9iamVjdE1ldGFkYXRhLmlzR2VuZXJhdGVkSWQoaWQpID8gXCJfX2R5bmFtaWNJZFwiIDogaWR9YDtcblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tUHJvcGVydGllcykge1xuXHRcdFx0XHRpZiAoY29udHJvbC5tUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06ICR7Y29udHJvbC5tUHJvcGVydGllc1tvQ29udHJvbEtleV19YDtcblx0XHRcdFx0fSBlbHNlIGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3MuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYmluZGluZ0RldGFpbCA9IGNvbnRyb2wubUJpbmRpbmdJbmZvc1tvQ29udHJvbEtleV07XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAke0pTT04uc3RyaW5naWZ5KGJpbmRpbmdEZXRhaWwpfWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tQXNzb2NpYXRpb25zKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1Bc3NvY2lhdGlvbnMuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAke1xuXHRcdFx0XHRcdFx0KGNvbnRyb2wubUFzc29jaWF0aW9uc1tvQ29udHJvbEtleV0/LmpvaW4/LihcIixcIikgPz8gY29udHJvbC5tQXNzb2NpYXRpb25zW29Db250cm9sS2V5XSkgfHwgdW5kZWZpbmVkXG5cdFx0XHRcdFx0fWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tRXZlbnRSZWdpc3RyeSkge1xuXHRcdFx0XHRpZiAoY29udHJvbC5tRXZlbnRSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06IHRydWV9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGF0YSArPSBgYDtcblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH0sXG5cdFx0c3RhcnRBZ2dyZWdhdGlvbjogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSwgc05hbWU6IHN0cmluZykge1xuXHRcdFx0bGV0IG91dCA9IGAsXFxuJHtnZXRUYWIoKX0ke3NOYW1lfWA7XG5cdFx0XHR0YWJDb3VudCsrO1xuXG5cdFx0XHRpZiAoY29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXSkge1xuXHRcdFx0XHRvdXQgKz0gYD17IHBhdGg6JyR7Y29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXS5wYXRofScsIHRlbXBsYXRlOlxcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dCArPSBgPVtcXG4ke2dldFRhYigpfWA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb3V0O1xuXHRcdH0sXG5cdFx0ZW5kQWdncmVnYXRpb246IGZ1bmN0aW9uIChjb250cm9sOiBhbnksIHNOYW1lOiBzdHJpbmcpIHtcblx0XHRcdHRhYkNvdW50LS07XG5cdFx0XHRpZiAoY29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXSkge1xuXHRcdFx0XHRyZXR1cm4gYFxcbiR7Z2V0VGFiKCl9fWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYFxcbiR7Z2V0VGFiKCl9XWA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoQXJyYXkuaXNBcnJheShjb250cm9sVG9TZXJpYWxpemUpKSB7XG5cdFx0cmV0dXJuIGNvbnRyb2xUb1NlcmlhbGl6ZS5tYXAoKGNvbnRyb2xUb1JlbmRlcjogQ29udHJvbCkgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1JlbmRlciwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBuZXcgU2VyaWFsaXplcihjb250cm9sVG9TZXJpYWxpemUsIHNlcmlhbGl6ZURlbGVnYXRlKS5zZXJpYWxpemUoKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXdhaXRlcigpIHtcblx0bGV0IGZuUmVzb2x2ZSE6IEZ1bmN0aW9uO1xuXHRjb25zdCBteVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdH0pO1xuXHRyZXR1cm4geyBwcm9taXNlOiBteVByb21pc2UsIHJlc29sdmU6IGZuUmVzb2x2ZSB9O1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7OztFQXdEQTtFQUNBLE1BQU1BLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGVBQWUsQ0FBQztFQUUxQ0MsR0FBRyxDQUFDQyxRQUFRLENBQUMsQ0FBQyxFQUFTLGtDQUFrQyxDQUFDO0VBQzFEQyxJQUFJLENBQUNDLFVBQVUsQ0FBQyxLQUFLLENBQUM7RUFFdEIsTUFBTUMsWUFBWSxHQUFHO0lBQ3BCQyxNQUFNLEVBQUUsZUFBZTtJQUN2QkMsS0FBSyxFQUFFLGVBQWU7SUFDdEJDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakNDLFNBQVMsRUFBRSxrRUFBa0U7SUFDN0VDLEdBQUcsRUFBRSxrRUFBa0U7SUFDdkVDLFFBQVEsRUFBRSwwRUFBMEU7SUFDcEZDLE9BQU8sRUFBRSxzQkFBc0I7SUFDL0JDLFFB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
@@ -176,6 +176,37 @@ expect.extend({
176
176
  },
177
177
  pass: nodes && nodes.length === 0
178
178
  };
179
+ },
180
+ /**
181
+ * Checks for errors in `xml` created during templating of an XML string or
182
+ * an XML node.
183
+ *
184
+ * This function checkes for the xml errors created by the
185
+ * function [BuildingBlockTemplateProcessor.createErrorXML]{@link sap.fe.core.buildingBlocks.BuildingBlockTemplateProcessor#createErrorXML}.
186
+ *
187
+ * @param xml XML String or XML Node to be tested for errors
188
+ * @returns Jest Matcher result object
189
+ */
190
+ toHaveTemplatingErrors(xml: string | Node) {
191
+ const xmlText = typeof xml === "string" ? xml : serializeXML(xml);
192
+ const base64Entries: string[] = xmlText.match(/BBF\.base64Decode\('([^']*)'\)/gm) || ([] as string[]);
193
+ const errorMessages: string[] = base64Entries.map((message: string) => {
194
+ if (message && message.length > 0) {
195
+ return atob(message.match(/('[^']*)/)?.[0]?.slice(1) || "");
196
+ }
197
+ return "";
198
+ });
199
+ if (errorMessages.length <= 0) {
200
+ return {
201
+ message: () => `XML Templating without errors`,
202
+ pass: false
203
+ };
204
+ } else {
205
+ return {
206
+ message: () => errorMessages.join("\n"),
207
+ pass: true
208
+ };
209
+ }
179
210
  }
180
211
  });
181
212
 
@@ -193,9 +224,22 @@ export const getControlAttribute = function (controlSelector: string, attributeN
193
224
  return runXPathQuery(selector, xmlDom);
194
225
  };
195
226
 
196
- export const serializeXML = function (xmlDom: Node) {
227
+ /**
228
+ * Serialize the parts or the complete given XML DOM to string.
229
+ *
230
+ * @param xmlDom DOM node that is to be serialized.
231
+ * @param selector Optional selector of sub nodes
232
+ * @returns XML string
233
+ */
234
+ export const serializeXML = function (xmlDom: Node, selector?: string) {
197
235
  const serializer = new window.XMLSerializer();
198
- const xmlString = serializer.serializeToString(xmlDom);
236
+ let xmlString: string;
237
+ if (selector) {
238
+ const nodes = runXPathQuery(selector, xmlDom) as Node[];
239
+ xmlString = nodes.map((node) => serializer.serializeToString(node)).join("\n");
240
+ } else {
241
+ xmlString = serializer.serializeToString(xmlDom);
242
+ }
199
243
  return formatXML(xmlString);
200
244
  };
201
245
 
@@ -481,7 +525,9 @@ export const getTemplatedXML = async function (
481
525
  fakeSideEffectService?: unknown
482
526
  ) {
483
527
  const templatedXML = await getTemplatingResult(xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges, fakeSideEffectService);
484
- return serializeXML(templatedXML);
528
+ const serialiedXML = serializeXML(templatedXML);
529
+ expect(serialiedXML).not.toHaveTemplatingErrors();
530
+ return serialiedXML;
485
531
  };
486
532
 
487
533
  /**
@@ -16,9 +16,7 @@ sap.ui.define([], function () {
16
16
  /**
17
17
  * List of error message patterns that are always accepted.
18
18
  */
19
- const GLOBALLY_ACCEPTED_ERRORS = ["failed to load JavaScript resource: sap/esh/search/ui/i18n.js",
20
- // shell
21
- "Custom attributes are not exist" // accept console error temporarily - remove as soon as unified shell ticket is resolved
19
+ const GLOBALLY_ACCEPTED_ERRORS = ["failed to load JavaScript resource: sap/esh/search/ui/i18n.js" // shell
22
20
  ].map(wrapPatterns);
23
21
  let ConsoleErrorChecker = /*#__PURE__*/function () {
24
22
  function ConsoleErrorChecker(window) {
@@ -193,4 +191,4 @@ sap.ui.define([], function () {
193
191
  }();
194
192
  return ConsoleErrorChecker.getInstance(window);
195
193
  }, false);
196
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3cmFwUGF0dGVybnMiLCJwYXR0ZXJuIiwiUmVnRXhwIiwibWVzc2FnZSIsIm1hdGNoIiwiaW5jbHVkZXMiLCJHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlMiLCJtYXAiLCJDb25zb2xlRXJyb3JDaGVja2VyIiwid2luZG93IiwibWF0Y2hlcnMiLCJtZXNzYWdlcyIsIm9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm9wYUZyYW1lIiwicmVkdWNlIiwiaUZyYW1lIiwibXV0YXRpb24iLCJub2RlIiwiQXJyYXkiLCJmcm9tIiwiYWRkZWROb2RlcyIsIkVsZW1lbnQiLCJlbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIkhUTUxJRnJhbWVFbGVtZW50IiwiY29udGVudFdpbmRvdyIsInByZXBhcmVXaW5kb3ciLCJRVW5pdCIsIm1vZHVsZVN0YXJ0Iiwib2JzZXJ2ZSIsImRvY3VtZW50IiwiYm9keSIsImNoaWxkTGlzdCIsIm1vZHVsZURvbmUiLCJkaXNjb25uZWN0IiwidGVzdFN0YXJ0IiwicmVzZXQiLCJsb2ciLCJoYW5kbGVGYWlsZWRNZXNzYWdlcyIsImthcm1hIiwiX19rYXJtYV9fIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwibG9jYXRpb24iLCJ1cmxQYXJhbSIsImdldCIsImlzU3RyaWN0IiwiY29uZmlnIiwidWk1Iiwic3RyaWN0Y29uc29sZWVycm9ycyIsImZhaWxlZE1lc3NhZ2VzIiwibGVuZ3RoIiwiYXNzZXJ0IiwicHVzaFJlc3VsdCIsInJlc3VsdCIsInNvdXJjZSIsImFjdHVhbCIsImV4cGVjdGVkIiwic2V0QWNjZXB0ZWRFcnJvclBhdHRlcm5zIiwicGF0dGVybnMiLCJjb25jYXQiLCJjaGVja0FuZExvZyIsInR5cGUiLCJkYXRhIiwibWVzc2FnZVRleHQiLCJpc0FsbG93ZWQiLCJzb21lIiwibWF0Y2hlciIsInB1c2giLCJ3cmFwcGVkRGF0YSIsImQiLCJjb25zb2xlIiwicGF0Y2hDb25zb2xlTWV0aG9kIiwibWV0aG9kIiwiZm5PcmlnaW5hbCIsImFwcGx5IiwiY29uZGl0aW9uIiwiZmlyc3QiLCJ1bnNoaWZ0IiwiZXJyb3IiLCJvblByb21pc2VSZWplY3Rpb24iLCJldmVudCIsInJlYXNvbiIsInN0YWNrIiwib25FcnJvciIsImZpbGVuYW1lIiwiYWRkRXZlbnRMaXN0ZW5lciIsImJpbmQiLCJwYXNzaXZlIiwiZ2V0SW5zdGFuY2UiLCJzYXBGRUNvbnNvbGVFcnJvckNoZWNrZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbnNvbGVFcnJvckNoZWNrZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCcm93c2VyQ29uc29sZUxvZ09wdGlvbnMgfSBmcm9tIFwia2FybWFcIjtcblxudHlwZSBNZXNzYWdlTWF0Y2hlckZ1bmN0aW9uID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gYm9vbGVhbjtcbnR5cGUgS2FybWEgPSB7XG5cdGxvZzogKGxldmVsOiBCcm93c2VyQ29uc29sZUxvZ09wdGlvbnNbXCJsZXZlbFwiXSwgLi4uZGF0YTogYW55W10pID0+IHZvaWQ7XG5cdGNvbmZpZzoge1xuXHRcdHVpNT86IHtcblx0XHRcdGNvbmZpZzoge1xuXHRcdFx0XHRzdHJpY3Rjb25zb2xlZXJyb3JzPzogYm9vbGVhbjsgLy8gS2FybWEgb3B0aW9ucyBhcmUgYWxsIGxvd2VyY2FzZSBhdCBydW50aW1lIVxuXHRcdFx0fTtcblx0XHR9O1xuXHR9O1xufTtcblxuZnVuY3Rpb24gd3JhcFBhdHRlcm5zKHBhdHRlcm46IFJlZ0V4cCB8IHN0cmluZyk6IE1lc3NhZ2VNYXRjaGVyRnVuY3Rpb24ge1xuXHRpZiAocGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuXHRcdHJldHVybiAobWVzc2FnZSkgPT4gbWVzc2FnZS5tYXRjaChwYXR0ZXJuKSAhPT0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gKG1lc3NhZ2UpID0+IG1lc3NhZ2UuaW5jbHVkZXMocGF0dGVybik7XG5cdH1cbn1cblxuLyoqXG4gKiBMaXN0IG9mIGVycm9yIG1lc3NhZ2UgcGF0dGVybnMgdGhhdCBhcmUgYWx3YXlzIGFjY2VwdGVkLlxuICovXG5jb25zdCBHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlMgPSBbXG5cdFwiZmFpbGVkIHRvIGxvYWQgSmF2YVNjcmlwdCByZXNvdXJjZTogc2FwL2VzaC9zZWFyY2gvdWkvaTE4bi5qc1wiLCAvLyBzaGVsbFxuXHRcIkN1c3RvbSBhdHRyaWJ1dGVzIGFyZSBub3QgZXhpc3RcIiAvLyBhY2NlcHQgY29uc29sZSBlcnJvciB0ZW1wb3JhcmlseSAtIHJlbW92ZSBhcyBzb29uIGFzIHVuaWZpZWQgc2hlbGwgdGlja2V0IGlzIHJlc29sdmVkXG5dLm1hcCh3cmFwUGF0dGVybnMpO1xuXG5jbGFzcyBDb25zb2xlRXJyb3JDaGVja2VyIHtcblx0cHJpdmF0ZSBtYXRjaGVyczogTWVzc2FnZU1hdGNoZXJGdW5jdGlvbltdID0gW107XG5cblx0cHJpdmF0ZSBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGthcm1hOiBLYXJtYSB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGlzU3RyaWN0OiBib29sZWFuO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG5cdFx0Y29uc3Qgb3BhRnJhbWUgPSBtdXRhdGlvbnMucmVkdWNlKChpRnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCwgbXV0YXRpb246IE11dGF0aW9uUmVjb3JkKSA9PiB7XG5cdFx0XHRpZiAoaUZyYW1lICE9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBpRnJhbWU7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpKSB7XG5cdFx0XHRcdGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuXHRcdFx0XHRcdGNvbnN0IGVsZW1lbnQgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoXCIjT3BhRnJhbWVcIik7XG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCAmJiBlbGVtZW50LmNvbnRlbnRXaW5kb3cpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaUZyYW1lO1xuXHRcdH0sIG51bGwpO1xuXG5cdFx0aWYgKG9wYUZyYW1lICYmIG9wYUZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcblx0XHRcdHRoaXMucHJlcGFyZVdpbmRvdyhvcGFGcmFtZS5jb250ZW50V2luZG93KTtcblx0XHR9XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKHdpbmRvdzogV2luZG93ICYgeyBfX2thcm1hX18/OiBLYXJtYSB9KSB7XG5cdFx0UVVuaXQubW9kdWxlU3RhcnQoKCkgPT4ge1xuXHRcdFx0dGhpcy5vYnNlcnZlci5vYnNlcnZlKHdpbmRvdy5kb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcblx0XHR9KTtcblxuXHRcdFFVbml0Lm1vZHVsZURvbmUoKCkgPT4ge1xuXHRcdFx0dGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0fSk7XG5cblx0XHRRVW5pdC50ZXN0U3RhcnQoKCkgPT4ge1xuXHRcdFx0dGhpcy5yZXNldCgpO1xuXHRcdH0pO1xuXG5cdFx0UVVuaXQubG9nKCgpID0+IHtcblx0XHRcdHRoaXMuaGFuZGxlRmFpbGVkTWVzc2FnZXMoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMua2FybWEgPSB3aW5kb3cuX19rYXJtYV9fO1xuXG5cdFx0Ly8gZWl0aGVyIGdvIGZvciBLYXJtYSBjb25maWcgb3B0aW9uIFwidWk1LmNvbmZpZy5zdHJpY3RDb25zb2xlRXJyb3JzXCIgb3IgdXNlIFVSTCBxdWVyeSBwYXJhbWV0ZXIgXCJzdHJpY3RcIlxuXHRcdGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cdFx0Y29uc3QgdXJsUGFyYW0gPSBzZWFyY2guZ2V0KFwic3RyaWN0Q29uc29sZUVycm9yc1wiKTtcblx0XHRpZiAodXJsUGFyYW0gIT09IG51bGwpIHtcblx0XHRcdHRoaXMuaXNTdHJpY3QgPSB1cmxQYXJhbSA9PT0gXCJ0cnVlXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuaXNTdHJpY3QgPSB0aGlzLmthcm1hPy5jb25maWcudWk1Py5jb25maWcuc3RyaWN0Y29uc29sZWVycm9ycyA/PyBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLnJlc2V0KCk7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZUZhaWxlZE1lc3NhZ2VzKCkge1xuXHRcdGNvbnN0IGZhaWxlZE1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcztcblx0XHR0aGlzLm1lc3NhZ2VzID0gW107XG5cblx0XHRpZiAoZmFpbGVkTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0UVVuaXQuYXNzZXJ0LnB1c2hSZXN1bHQoe1xuXHRcdFx0XHRyZXN1bHQ6IGZhbHNlLFxuXHRcdFx0XHRzb3VyY2U6IFwiRkUgQ29uc29sZSBMb2cgQ2hlY2tcIixcblx0XHRcdFx0bWVzc2FnZTogYFRoZXJlIHdlcmUgJHtmYWlsZWRNZXNzYWdlcy5sZW5ndGh9IHVuZXhwZWN0ZWQgY29uc29sZSBlcnJvcnNgLFxuXHRcdFx0XHRhY3R1YWw6IGZhaWxlZE1lc3NhZ2VzLFxuXHRcdFx0XHRleHBlY3RlZDogW11cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcmVzZXQoKSB7XG5cdFx0dGhpcy5tZXNzYWdlcyA9IFtdO1xuXG5cdFx0Ly8gdGhpcyBzZXRzIHRoZSBkZWZhdWx0IHRvIGFwcGx5IGlmIG5vIGFsbG93ZWQgcGF0dGVybnMgYXJlIHNldCB2aWEgc2V0QWNjZXB0ZWRFcnJvclBhdHRlcm5zKCkuXG5cdFx0aWYgKHRoaXMuaXNTdHJpY3QpIHtcblx0XHRcdHRoaXMubWF0Y2hlcnMgPSBHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubWF0Y2hlcnMgPSBbKCkgPT4gdHJ1ZV07XG5cdFx0fVxuXHR9XG5cblx0c2V0QWNjZXB0ZWRFcnJvclBhdHRlcm5zKHBhdHRlcm5zPzogKFJlZ0V4cCB8IHN0cmluZylbXSkge1xuXHRcdGlmICghcGF0dGVybnMgfHwgcGF0dGVybnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aGlzLm1hdGNoZXJzID0gR0xPQkFMTFlfQUNDRVBURURfRVJST1JTO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm1hdGNoZXJzID0gcGF0dGVybnMubWFwKHdyYXBQYXR0ZXJucykuY29uY2F0KEdMT0JBTExZX0FDQ0VQVEVEX0VSUk9SUyk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBjaGVja0FuZExvZyh0eXBlOiBCcm93c2VyQ29uc29sZUxvZ09wdGlvbnNbXCJsZXZlbFwiXSwgLi4uZGF0YTogYW55W10pIHtcblx0XHQvLyBvbmx5IGNoZWNrIHRoZSBlcnJvciBtZXNzYWdlc1xuXHRcdGlmICh0eXBlID09PSBcImVycm9yXCIpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2VUZXh0ID0gZGF0YVswXTtcblx0XHRcdGNvbnN0IGlzQWxsb3dlZCA9IHRoaXMubWF0Y2hlcnMuc29tZSgobWF0Y2hlcikgPT4gbWF0Y2hlcihtZXNzYWdlVGV4dCkpO1xuXHRcdFx0aWYgKCFpc0FsbG93ZWQpIHtcblx0XHRcdFx0dGhpcy5tZXNzYWdlcy5wdXNoKG1lc3NhZ2VUZXh0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5rYXJtYSkge1xuXHRcdFx0Ly8gd3JhcCB0aGUgZGF0YSB0byBmYWNpbGl0YXRlIHBhcnNpbmcgaW4gdGhlIGJhY2tlbmRcblx0XHRcdGNvbnN0IHdyYXBwZWREYXRhID0gZGF0YS5tYXAoKGQpID0+IFtkXSk7XG5cdFx0XHR0aGlzLmthcm1hLmxvZyh0eXBlLCB3cmFwcGVkRGF0YSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBwcmVwYXJlV2luZG93KHdpbmRvdzogV2luZG93KSB7XG5cdFx0Y29uc3QgY29uc29sZTogQ29uc29sZSA9ICh3aW5kb3cgYXMgYW55KS5jb25zb2xlO1xuXG5cdFx0Ly8gY2FwdHVyZSBjb25zb2xlLmxvZygpLCBjb25zb2xlLmRlYnVnKCksIGV0Yy5cblx0XHRjb25zdCBwYXRjaENvbnNvbGVNZXRob2QgPSAobWV0aG9kOiBcImxvZ1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIiB8IFwiZGVidWdcIikgPT4ge1xuXHRcdFx0Y29uc3QgZm5PcmlnaW5hbCA9IGNvbnNvbGVbbWV0aG9kXTtcblx0XHRcdGNvbnNvbGVbbWV0aG9kXSA9ICguLi5kYXRhOiBhbnlbXSk6IHZvaWQgPT4ge1xuXHRcdFx0XHR0aGlzLmNoZWNrQW5kTG9nKG1ldGhvZCwgLi4uZGF0YSk7XG5cdFx0XHRcdHJldHVybiBmbk9yaWdpbmFsLmFwcGx5KGNvbnNvbGUsIGRhdGEpO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0cGF0Y2hDb25zb2xlTWV0aG9kKFwibG9nXCIpO1xuXHRcdHBhdGNoQ29uc29sZU1ldGhvZChcImRlYnVnXCIpO1xuXHRcdHBhdGNoQ29uc29sZU1ldGhvZChcImluZm9cIik7XG5cdFx0cGF0Y2hDb25zb2xlTWV0aG9kKFwid2FyblwiKTtcblx0XHRwYXRjaENvbnNvbGVNZXRob2QoXCJlcnJvclwiKTtcblxuXHRcdC8vIGNhcHR1cmUgY29uc29sZS5hc3NlcnQoKVxuXHRcdC8vIHNlZSBodHRwczovL2NvbnNvbGUuc3BlYy53aGF0d2cub3JnLyNhc3NlcnRcblx0XHRjb25zb2xlLmFzc2VydCA9IGZ1bmN0aW9uIChjb25kaXRpb24gPSBmYWxzZSwgLi4uZGF0YTogYW55W10pIHtcblx0XHRcdGlmIChjb25kaXRpb24pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtZXNzYWdlID0gXCJBc3NlcnRpb24gZmFpbGVkXCI7XG5cdFx0XHRpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0ZGF0YS5wdXNoKG1lc3NhZ2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGV0IGZpcnN0ID0gZGF0YVswXTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmaXJzdCAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdGRhdGEudW5zaGlmdChtZXNzYWdlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmaXJzdCA9IGAke21lc3NhZ2V9OiAke2ZpcnN0fWA7XG5cdFx0XHRcdFx0ZGF0YVswXSA9IGZpcnN0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoLi4uZGF0YSk7XG5cdFx0fTtcblxuXHRcdC8vIGNhcHR1cmUgZXJyb3JzXG5cdFx0ZnVuY3Rpb24gb25Qcm9taXNlUmVqZWN0aW9uKHRoaXM6IENvbnNvbGVFcnJvckNoZWNrZXIsIGV2ZW50OiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBgVU5IQU5ETEVEIFBST01JU0UgUkVKRUNUSU9OOiAke2V2ZW50LnJlYXNvbn1gO1xuXHRcdFx0dGhpcy5jaGVja0FuZExvZyhcImVycm9yXCIsIG1lc3NhZ2UsIGV2ZW50LnJlYXNvbj8uc3RhY2spO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIG9uRXJyb3IodGhpczogQ29uc29sZUVycm9yQ2hlY2tlciwgZXZlbnQ6IEVycm9yRXZlbnQpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBldmVudC5tZXNzYWdlO1xuXHRcdFx0dGhpcy5jaGVja0FuZExvZyhcImVycm9yXCIsIG1lc3NhZ2UsIGV2ZW50LmZpbGVuYW1lKTtcblx0XHR9XG5cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidW5oYW5kbGVkcmVqZWN0aW9uXCIsIG9uUHJvbWlzZVJlamVjdGlvbi5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0SW5zdGFuY2Uod2luZG93OiBXaW5kb3cgJiB7IHNhcEZFQ29uc29sZUVycm9yQ2hlY2tlcj86IENvbnNvbGVFcnJvckNoZWNrZXIgfSk6IENvbnNvbGVFcnJvckNoZWNrZXIge1xuXHRcdC8vIHRoZSBnbG9iYWwgaW5zdGFuY2UgaXMgbmVlZGVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgdGVzdHMgaW4gYSByb3cgKGluIEthcm1hKVxuXHRcdGlmICghd2luZG93LnNhcEZFQ29uc29sZUVycm9yQ2hlY2tlcikge1xuXHRcdFx0d2luZG93LnNhcEZFQ29uc29sZUVycm9yQ2hlY2tlciA9IG5ldyBDb25zb2xlRXJyb3JDaGVja2VyKHdpbmRvdyk7XG5cdFx0fVxuXHRcdHJldHVybiB3aW5kb3cuc2FwRkVDb25zb2xlRXJyb3JDaGVja2VyO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbnNvbGVFcnJvckNoZWNrZXIuZ2V0SW5zdGFuY2Uod2luZG93KTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQWNBLFNBQVNBLFlBQVksQ0FBQ0MsT0FBd0IsRUFBMEI7SUFDdkUsSUFBSUEsT0FBTyxZQUFZQyxNQUFNLEVBQUU7TUFDOUIsT0FBUUMsT0FBTyxJQUFLQSxPQUFPLENBQUNDLEtBQUssQ0FBQ0gsT0FBTyxDQUFDLEtBQUssSUFBSTtJQUNwRCxDQUFDLE1BQU07TUFDTixPQUFRRSxPQUFPLElBQUtBLE9BQU8sQ0FBQ0UsUUFBUSxDQUFDSixPQUFPLENBQUM7SUFDOUM7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7RUFDQSxNQUFNSyx3QkFBd0IsR0FBRyxDQUNoQywrREFBK0Q7RUFBRTtFQUNqRSxpQ0FBaUMsQ0FBQztFQUFBLENBQ2xDLENBQUNDLEdBQUcsQ0FBQ1AsWUFBWSxDQUFDO0VBQUMsSUFFZFEsbUJBQW1CO0lBZ0N4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
194
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3cmFwUGF0dGVybnMiLCJwYXR0ZXJuIiwiUmVnRXhwIiwibWVzc2FnZSIsIm1hdGNoIiwiaW5jbHVkZXMiLCJHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlMiLCJtYXAiLCJDb25zb2xlRXJyb3JDaGVja2VyIiwid2luZG93IiwibWF0Y2hlcnMiLCJtZXNzYWdlcyIsIm9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm9wYUZyYW1lIiwicmVkdWNlIiwiaUZyYW1lIiwibXV0YXRpb24iLCJub2RlIiwiQXJyYXkiLCJmcm9tIiwiYWRkZWROb2RlcyIsIkVsZW1lbnQiLCJlbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIkhUTUxJRnJhbWVFbGVtZW50IiwiY29udGVudFdpbmRvdyIsInByZXBhcmVXaW5kb3ciLCJRVW5pdCIsIm1vZHVsZVN0YXJ0Iiwib2JzZXJ2ZSIsImRvY3VtZW50IiwiYm9keSIsImNoaWxkTGlzdCIsIm1vZHVsZURvbmUiLCJkaXNjb25uZWN0IiwidGVzdFN0YXJ0IiwicmVzZXQiLCJsb2ciLCJoYW5kbGVGYWlsZWRNZXNzYWdlcyIsImthcm1hIiwiX19rYXJtYV9fIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwibG9jYXRpb24iLCJ1cmxQYXJhbSIsImdldCIsImlzU3RyaWN0IiwiY29uZmlnIiwidWk1Iiwic3RyaWN0Y29uc29sZWVycm9ycyIsImZhaWxlZE1lc3NhZ2VzIiwibGVuZ3RoIiwiYXNzZXJ0IiwicHVzaFJlc3VsdCIsInJlc3VsdCIsInNvdXJjZSIsImFjdHVhbCIsImV4cGVjdGVkIiwic2V0QWNjZXB0ZWRFcnJvclBhdHRlcm5zIiwicGF0dGVybnMiLCJjb25jYXQiLCJjaGVja0FuZExvZyIsInR5cGUiLCJkYXRhIiwibWVzc2FnZVRleHQiLCJpc0FsbG93ZWQiLCJzb21lIiwibWF0Y2hlciIsInB1c2giLCJ3cmFwcGVkRGF0YSIsImQiLCJjb25zb2xlIiwicGF0Y2hDb25zb2xlTWV0aG9kIiwibWV0aG9kIiwiZm5PcmlnaW5hbCIsImFwcGx5IiwiY29uZGl0aW9uIiwiZmlyc3QiLCJ1bnNoaWZ0IiwiZXJyb3IiLCJvblByb21pc2VSZWplY3Rpb24iLCJldmVudCIsInJlYXNvbiIsInN0YWNrIiwib25FcnJvciIsImZpbGVuYW1lIiwiYWRkRXZlbnRMaXN0ZW5lciIsImJpbmQiLCJwYXNzaXZlIiwiZ2V0SW5zdGFuY2UiLCJzYXBGRUNvbnNvbGVFcnJvckNoZWNrZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbnNvbGVFcnJvckNoZWNrZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCcm93c2VyQ29uc29sZUxvZ09wdGlvbnMgfSBmcm9tIFwia2FybWFcIjtcblxudHlwZSBNZXNzYWdlTWF0Y2hlckZ1bmN0aW9uID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gYm9vbGVhbjtcbnR5cGUgS2FybWEgPSB7XG5cdGxvZzogKGxldmVsOiBCcm93c2VyQ29uc29sZUxvZ09wdGlvbnNbXCJsZXZlbFwiXSwgLi4uZGF0YTogYW55W10pID0+IHZvaWQ7XG5cdGNvbmZpZzoge1xuXHRcdHVpNT86IHtcblx0XHRcdGNvbmZpZzoge1xuXHRcdFx0XHRzdHJpY3Rjb25zb2xlZXJyb3JzPzogYm9vbGVhbjsgLy8gS2FybWEgb3B0aW9ucyBhcmUgYWxsIGxvd2VyY2FzZSBhdCBydW50aW1lIVxuXHRcdFx0fTtcblx0XHR9O1xuXHR9O1xufTtcblxuZnVuY3Rpb24gd3JhcFBhdHRlcm5zKHBhdHRlcm46IFJlZ0V4cCB8IHN0cmluZyk6IE1lc3NhZ2VNYXRjaGVyRnVuY3Rpb24ge1xuXHRpZiAocGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuXHRcdHJldHVybiAobWVzc2FnZSkgPT4gbWVzc2FnZS5tYXRjaChwYXR0ZXJuKSAhPT0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gKG1lc3NhZ2UpID0+IG1lc3NhZ2UuaW5jbHVkZXMocGF0dGVybik7XG5cdH1cbn1cblxuLyoqXG4gKiBMaXN0IG9mIGVycm9yIG1lc3NhZ2UgcGF0dGVybnMgdGhhdCBhcmUgYWx3YXlzIGFjY2VwdGVkLlxuICovXG5jb25zdCBHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlMgPSBbXG5cdFwiZmFpbGVkIHRvIGxvYWQgSmF2YVNjcmlwdCByZXNvdXJjZTogc2FwL2VzaC9zZWFyY2gvdWkvaTE4bi5qc1wiIC8vIHNoZWxsXG5dLm1hcCh3cmFwUGF0dGVybnMpO1xuXG5jbGFzcyBDb25zb2xlRXJyb3JDaGVja2VyIHtcblx0cHJpdmF0ZSBtYXRjaGVyczogTWVzc2FnZU1hdGNoZXJGdW5jdGlvbltdID0gW107XG5cblx0cHJpdmF0ZSBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGthcm1hOiBLYXJtYSB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGlzU3RyaWN0OiBib29sZWFuO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG5cdFx0Y29uc3Qgb3BhRnJhbWUgPSBtdXRhdGlvbnMucmVkdWNlKChpRnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCwgbXV0YXRpb246IE11dGF0aW9uUmVjb3JkKSA9PiB7XG5cdFx0XHRpZiAoaUZyYW1lICE9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBpRnJhbWU7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpKSB7XG5cdFx0XHRcdGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuXHRcdFx0XHRcdGNvbnN0IGVsZW1lbnQgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoXCIjT3BhRnJhbWVcIik7XG5cdFx0XHRcdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCAmJiBlbGVtZW50LmNvbnRlbnRXaW5kb3cpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaUZyYW1lO1xuXHRcdH0sIG51bGwpO1xuXG5cdFx0aWYgKG9wYUZyYW1lICYmIG9wYUZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcblx0XHRcdHRoaXMucHJlcGFyZVdpbmRvdyhvcGFGcmFtZS5jb250ZW50V2luZG93KTtcblx0XHR9XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKHdpbmRvdzogV2luZG93ICYgeyBfX2thcm1hX18/OiBLYXJtYSB9KSB7XG5cdFx0UVVuaXQubW9kdWxlU3RhcnQoKCkgPT4ge1xuXHRcdFx0dGhpcy5vYnNlcnZlci5vYnNlcnZlKHdpbmRvdy5kb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcblx0XHR9KTtcblxuXHRcdFFVbml0Lm1vZHVsZURvbmUoKCkgPT4ge1xuXHRcdFx0dGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0fSk7XG5cblx0XHRRVW5pdC50ZXN0U3RhcnQoKCkgPT4ge1xuXHRcdFx0dGhpcy5yZXNldCgpO1xuXHRcdH0pO1xuXG5cdFx0UVVuaXQubG9nKCgpID0+IHtcblx0XHRcdHRoaXMuaGFuZGxlRmFpbGVkTWVzc2FnZXMoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMua2FybWEgPSB3aW5kb3cuX19rYXJtYV9fO1xuXG5cdFx0Ly8gZWl0aGVyIGdvIGZvciBLYXJtYSBjb25maWcgb3B0aW9uIFwidWk1LmNvbmZpZy5zdHJpY3RDb25zb2xlRXJyb3JzXCIgb3IgdXNlIFVSTCBxdWVyeSBwYXJhbWV0ZXIgXCJzdHJpY3RcIlxuXHRcdGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cdFx0Y29uc3QgdXJsUGFyYW0gPSBzZWFyY2guZ2V0KFwic3RyaWN0Q29uc29sZUVycm9yc1wiKTtcblx0XHRpZiAodXJsUGFyYW0gIT09IG51bGwpIHtcblx0XHRcdHRoaXMuaXNTdHJpY3QgPSB1cmxQYXJhbSA9PT0gXCJ0cnVlXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuaXNTdHJpY3QgPSB0aGlzLmthcm1hPy5jb25maWcudWk1Py5jb25maWcuc3RyaWN0Y29uc29sZWVycm9ycyA/PyBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLnJlc2V0KCk7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZUZhaWxlZE1lc3NhZ2VzKCkge1xuXHRcdGNvbnN0IGZhaWxlZE1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcztcblx0XHR0aGlzLm1lc3NhZ2VzID0gW107XG5cblx0XHRpZiAoZmFpbGVkTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0UVVuaXQuYXNzZXJ0LnB1c2hSZXN1bHQoe1xuXHRcdFx0XHRyZXN1bHQ6IGZhbHNlLFxuXHRcdFx0XHRzb3VyY2U6IFwiRkUgQ29uc29sZSBMb2cgQ2hlY2tcIixcblx0XHRcdFx0bWVzc2FnZTogYFRoZXJlIHdlcmUgJHtmYWlsZWRNZXNzYWdlcy5sZW5ndGh9IHVuZXhwZWN0ZWQgY29uc29sZSBlcnJvcnNgLFxuXHRcdFx0XHRhY3R1YWw6IGZhaWxlZE1lc3NhZ2VzLFxuXHRcdFx0XHRleHBlY3RlZDogW11cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcmVzZXQoKSB7XG5cdFx0dGhpcy5tZXNzYWdlcyA9IFtdO1xuXG5cdFx0Ly8gdGhpcyBzZXRzIHRoZSBkZWZhdWx0IHRvIGFwcGx5IGlmIG5vIGFsbG93ZWQgcGF0dGVybnMgYXJlIHNldCB2aWEgc2V0QWNjZXB0ZWRFcnJvclBhdHRlcm5zKCkuXG5cdFx0aWYgKHRoaXMuaXNTdHJpY3QpIHtcblx0XHRcdHRoaXMubWF0Y2hlcnMgPSBHTE9CQUxMWV9BQ0NFUFRFRF9FUlJPUlM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubWF0Y2hlcnMgPSBbKCkgPT4gdHJ1ZV07XG5cdFx0fVxuXHR9XG5cblx0c2V0QWNjZXB0ZWRFcnJvclBhdHRlcm5zKHBhdHRlcm5zPzogKFJlZ0V4cCB8IHN0cmluZylbXSkge1xuXHRcdGlmICghcGF0dGVybnMgfHwgcGF0dGVybnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aGlzLm1hdGNoZXJzID0gR0xPQkFMTFlfQUNDRVBURURfRVJST1JTO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm1hdGNoZXJzID0gcGF0dGVybnMubWFwKHdyYXBQYXR0ZXJucykuY29uY2F0KEdMT0JBTExZX0FDQ0VQVEVEX0VSUk9SUyk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBjaGVja0FuZExvZyh0eXBlOiBCcm93c2VyQ29uc29sZUxvZ09wdGlvbnNbXCJsZXZlbFwiXSwgLi4uZGF0YTogYW55W10pIHtcblx0XHQvLyBvbmx5IGNoZWNrIHRoZSBlcnJvciBtZXNzYWdlc1xuXHRcdGlmICh0eXBlID09PSBcImVycm9yXCIpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2VUZXh0ID0gZGF0YVswXTtcblx0XHRcdGNvbnN0IGlzQWxsb3dlZCA9IHRoaXMubWF0Y2hlcnMuc29tZSgobWF0Y2hlcikgPT4gbWF0Y2hlcihtZXNzYWdlVGV4dCkpO1xuXHRcdFx0aWYgKCFpc0FsbG93ZWQpIHtcblx0XHRcdFx0dGhpcy5tZXNzYWdlcy5wdXNoKG1lc3NhZ2VUZXh0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5rYXJtYSkge1xuXHRcdFx0Ly8gd3JhcCB0aGUgZGF0YSB0byBmYWNpbGl0YXRlIHBhcnNpbmcgaW4gdGhlIGJhY2tlbmRcblx0XHRcdGNvbnN0IHdyYXBwZWREYXRhID0gZGF0YS5tYXAoKGQpID0+IFtkXSk7XG5cdFx0XHR0aGlzLmthcm1hLmxvZyh0eXBlLCB3cmFwcGVkRGF0YSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBwcmVwYXJlV2luZG93KHdpbmRvdzogV2luZG93KSB7XG5cdFx0Y29uc3QgY29uc29sZTogQ29uc29sZSA9ICh3aW5kb3cgYXMgYW55KS5jb25zb2xlO1xuXG5cdFx0Ly8gY2FwdHVyZSBjb25zb2xlLmxvZygpLCBjb25zb2xlLmRlYnVnKCksIGV0Yy5cblx0XHRjb25zdCBwYXRjaENvbnNvbGVNZXRob2QgPSAobWV0aG9kOiBcImxvZ1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIiB8IFwiZGVidWdcIikgPT4ge1xuXHRcdFx0Y29uc3QgZm5PcmlnaW5hbCA9IGNvbnNvbGVbbWV0aG9kXTtcblx0XHRcdGNvbnNvbGVbbWV0aG9kXSA9ICguLi5kYXRhOiBhbnlbXSk6IHZvaWQgPT4ge1xuXHRcdFx0XHR0aGlzLmNoZWNrQW5kTG9nKG1ldGhvZCwgLi4uZGF0YSk7XG5cdFx0XHRcdHJldHVybiBmbk9yaWdpbmFsLmFwcGx5KGNvbnNvbGUsIGRhdGEpO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0cGF0Y2hDb25zb2xlTWV0aG9kKFwibG9nXCIpO1xuXHRcdHBhdGNoQ29uc29sZU1ldGhvZChcImRlYnVnXCIpO1xuXHRcdHBhdGNoQ29uc29sZU1ldGhvZChcImluZm9cIik7XG5cdFx0cGF0Y2hDb25zb2xlTWV0aG9kKFwid2FyblwiKTtcblx0XHRwYXRjaENvbnNvbGVNZXRob2QoXCJlcnJvclwiKTtcblxuXHRcdC8vIGNhcHR1cmUgY29uc29sZS5hc3NlcnQoKVxuXHRcdC8vIHNlZSBodHRwczovL2NvbnNvbGUuc3BlYy53aGF0d2cub3JnLyNhc3NlcnRcblx0XHRjb25zb2xlLmFzc2VydCA9IGZ1bmN0aW9uIChjb25kaXRpb24gPSBmYWxzZSwgLi4uZGF0YTogYW55W10pIHtcblx0XHRcdGlmIChjb25kaXRpb24pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtZXNzYWdlID0gXCJBc3NlcnRpb24gZmFpbGVkXCI7XG5cdFx0XHRpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0ZGF0YS5wdXNoKG1lc3NhZ2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGV0IGZpcnN0ID0gZGF0YVswXTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmaXJzdCAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdGRhdGEudW5zaGlmdChtZXNzYWdlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmaXJzdCA9IGAke21lc3NhZ2V9OiAke2ZpcnN0fWA7XG5cdFx0XHRcdFx0ZGF0YVswXSA9IGZpcnN0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoLi4uZGF0YSk7XG5cdFx0fTtcblxuXHRcdC8vIGNhcHR1cmUgZXJyb3JzXG5cdFx0ZnVuY3Rpb24gb25Qcm9taXNlUmVqZWN0aW9uKHRoaXM6IENvbnNvbGVFcnJvckNoZWNrZXIsIGV2ZW50OiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBgVU5IQU5ETEVEIFBST01JU0UgUkVKRUNUSU9OOiAke2V2ZW50LnJlYXNvbn1gO1xuXHRcdFx0dGhpcy5jaGVja0FuZExvZyhcImVycm9yXCIsIG1lc3NhZ2UsIGV2ZW50LnJlYXNvbj8uc3RhY2spO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIG9uRXJyb3IodGhpczogQ29uc29sZUVycm9yQ2hlY2tlciwgZXZlbnQ6IEVycm9yRXZlbnQpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBldmVudC5tZXNzYWdlO1xuXHRcdFx0dGhpcy5jaGVja0FuZExvZyhcImVycm9yXCIsIG1lc3NhZ2UsIGV2ZW50LmZpbGVuYW1lKTtcblx0XHR9XG5cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidW5oYW5kbGVkcmVqZWN0aW9uXCIsIG9uUHJvbWlzZVJlamVjdGlvbi5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0SW5zdGFuY2Uod2luZG93OiBXaW5kb3cgJiB7IHNhcEZFQ29uc29sZUVycm9yQ2hlY2tlcj86IENvbnNvbGVFcnJvckNoZWNrZXIgfSk6IENvbnNvbGVFcnJvckNoZWNrZXIge1xuXHRcdC8vIHRoZSBnbG9iYWwgaW5zdGFuY2UgaXMgbmVlZGVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgdGVzdHMgaW4gYSByb3cgKGluIEthcm1hKVxuXHRcdGlmICghd2luZG93LnNhcEZFQ29uc29sZUVycm9yQ2hlY2tlcikge1xuXHRcdFx0d2luZG93LnNhcEZFQ29uc29sZUVycm9yQ2hlY2tlciA9IG5ldyBDb25zb2xlRXJyb3JDaGVja2VyKHdpbmRvdyk7XG5cdFx0fVxuXHRcdHJldHVybiB3aW5kb3cuc2FwRkVDb25zb2xlRXJyb3JDaGVja2VyO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbnNvbGVFcnJvckNoZWNrZXIuZ2V0SW5zdGFuY2Uod2luZG93KTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQWNBLFNBQVNBLFlBQVksQ0FBQ0MsT0FBd0IsRUFBMEI7SUFDdkUsSUFBSUEsT0FBTyxZQUFZQyxNQUFNLEVBQUU7TUFDOUIsT0FBUUMsT0FBTyxJQUFLQSxPQUFPLENBQUNDLEtBQUssQ0FBQ0gsT0FBTyxDQUFDLEtBQUssSUFBSTtJQUNwRCxDQUFDLE1BQU07TUFDTixPQUFRRSxPQUFPLElBQUtBLE9BQU8sQ0FBQ0UsUUFBUSxDQUFDSixPQUFPLENBQUM7SUFDOUM7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7RUFDQSxNQUFNSyx3QkFBd0IsR0FBRyxDQUNoQywrREFBK0QsQ0FBQztFQUFBLENBQ2hFLENBQUNDLEdBQUcsQ0FBQ1AsWUFBWSxDQUFDO0VBQUMsSUFFZFEsbUJBQW1CO0lBZ0N4Qiw2QkFBWUMsTUFBc0MsRUFBRTtNQUFBLEtBL0I1Q0MsUUFBUSxHQUE2QixFQUFFO01BQUEsS0FFdkNDLFFBQVEsR0FBYSxFQUFFO01BQUEsS0FNZEMsUUFBUSxHQUFHLElBQUlDLGdCQUFnQixDQUFFQyxTQUFTLElBQUs7UUFDL0QsTUFBTUMsUUFBUSxHQUFH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
@@ -24,8 +24,7 @@ function wrapPatterns(pattern: RegExp | string): MessageMatcherFunction {
24
24
  * List of error message patterns that are always accepted.
25
25
  */
26
26
  const GLOBALLY_ACCEPTED_ERRORS = [
27
- "failed to load JavaScript resource: sap/esh/search/ui/i18n.js", // shell
28
- "Custom attributes are not exist" // accept console error temporarily - remove as soon as unified shell ticket is resolved
27
+ "failed to load JavaScript resource: sap/esh/search/ui/i18n.js" // shell
29
28
  ].map(wrapPatterns);
30
29
 
31
30
  class ConsoleErrorChecker {