@sapui5/sap.fe.core 1.120.2 → 1.120.3

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.core",
3
- "version": "1.120.2",
3
+ "version": "1.120.3",
4
4
  "description": "SAPUI5 Library sap.fe.core",
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.120.2</version>
9
+ <version>1.120.3</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.core</documentation>
12
12
 
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2023 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/Synchronization", "sap/ui/base/Object", "sap/ui/core/Core", "sap/ui/thirdparty/URI"], function (Log, ClassSupport, Synchronization, BaseObject, Core, URI) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/Synchronization", "sap/ui/base/Object", "sap/ui/core/Core"], function (Log, ClassSupport, Synchronization, BaseObject, Core) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _class;
@@ -128,6 +128,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
128
128
  _proto.findAppStateInHash = function findAppStateInHash(sHash) {
129
129
  const aAppState = sHash.match(new RegExp(`\\?.*${enumURLParams.IAPPSTATEPARAM}=([^&]*)`));
130
130
  return aAppState && aAppState.length > 1 ? aAppState[1] : null;
131
+ };
132
+ _proto.getDecodedWindowHash = function getDecodedWindowHash() {
133
+ return decodeURI(window.location.hash);
131
134
  }
132
135
 
133
136
  /**
@@ -141,13 +144,30 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
141
144
  this._oNavigationGuard = null;
142
145
  const sCurrentAppHash = this.getHash();
143
146
  this._oManagedHistory.push(this._extractStateFromHash(sCurrentAppHash));
144
- this.appName = this.getAppNameFromHash(window.location.hash);
147
+ this.appName = this.getAppNameFromHash(this.getDecodedWindowHash());
145
148
 
146
149
  // Set the iAppState if the initial hash contains one
147
150
  this.sIAppStateKey = this.findAppStateInHash(sCurrentAppHash);
151
+ }
152
+
153
+ /**
154
+ * Returns the full app-specific hash part from window.location.hash.
155
+ *
156
+ * Compared to {@link getHash} this function includes sub-routes of nested components.
157
+ *
158
+ * @returns The app-specific hash part (i.e., without the shell part), or an empty string if there is none.
159
+ */;
160
+ _proto.getFullHash = function getFullHash() {
161
+ const splitHash = this._oShellServices.splitHash(this.getDecodedWindowHash());
162
+ if ("appSpecificRoute" in splitHash) {
163
+ var _splitHash$appSpecifi;
164
+ return ((_splitHash$appSpecifi = splitHash.appSpecificRoute) === null || _splitHash$appSpecifi === void 0 ? void 0 : _splitHash$appSpecifi.substring(2)) ?? ""; // remove the leading "&/"
165
+ }
166
+
167
+ return "";
148
168
  };
149
169
  _proto.getHash = function getHash() {
150
- return this._oRouter.getHashChanger().getHash();
170
+ return this._oRouter.getHashChanger().getHash() ?? "";
151
171
  };
152
172
  _proto.getAppNameFromHash = function getAppNameFromHash(hash) {
153
173
  var _this$_oShellServices;
@@ -456,7 +476,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
456
476
 
457
477
  /**
458
478
  * Adds a new state into the internal history structure.
459
- * Makes sure this new state is added after an ancestor.
479
+ * Ensures this new state is added after an ancestor.
460
480
  * Also sets the iAppState key in the whole history.
461
481
  *
462
482
  * @param oNewState The new state to be added
@@ -467,8 +487,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
467
487
  * @final
468
488
  */;
469
489
  _proto._pushNewState = function _pushNewState(oNewState, bRebuildOnly, bPreserveHistory, bDisableHistoryPreservation) {
470
- const splitHash = this._oShellServices.splitHash(window.location.hash);
471
- const sCurrentHash = (splitHash.appSpecificRoute ?? "").replace(/^&\//, ""); // Remove leading '&/'
490
+ const segments = RouterProxy.splitAppSpecificRoute(this.getFullHash());
491
+ const sCurrentHash = segments[0] ?? "";
472
492
  let lastIndex = this._oManagedHistory.length - 1;
473
493
  let iPopCount = bRebuildOnly ? 1 : 0;
474
494
 
@@ -683,7 +703,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
683
703
  });
684
704
  };
685
705
  _proto.hashGuard = function hashGuard() {
686
- let sHash = window.location.hash;
706
+ let sHash = this.getDecodedWindowHash();
687
707
  const currentAppName = this.getAppNameFromHash(sHash);
688
708
  if (currentAppName != this.appName) {
689
709
  // When doing external navigation in another window, the current window location is temporarily modified with the URL of the target app
@@ -700,7 +720,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
700
720
  if (mapping) {
701
721
  // Replace the current hash
702
722
  sHash = sHash.replace(mapping.oldPath, mapping.newPath);
703
- history.replaceState(Object.assign({}, history.state), "", sHash);
723
+ history.replaceState(Object.assign({}, history.state), "", encodeURI(sHash));
704
724
  }
705
725
  const aHashSplit = sHash.split("&/");
706
726
  const sAppHash = aHashSplit[1] ? aHashSplit[1] : "";
@@ -756,43 +776,54 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
756
776
  return oState1.sLayout === oState2.sLayout ? enumState.EQUAL : enumState.COMPATIBLE;
757
777
  }
758
778
 
779
+ /**
780
+ * Split the app-specific route at the "&/" separator.
781
+ *
782
+ * The app-specific route consists of one or more segments separated by "&/".
783
+ *
784
+ * @example
785
+ * splitAppSpecificRoute("&/Entity('abc')/NextEntity('xyz')");
786
+ * // ["Entity('abc')/NextEntity('xyz')"]
787
+ *
788
+ * splitAppSpecificRoute("&/Entity('abc')/NextEntity('xyz')&/Prefix/NestedRoute");
789
+ * // ["Entity('abc')/NextEntity('xyz')", "Prefix/NestedRoute"]
790
+ * @param appSpecificRoute The app-specific route.
791
+ * @returns An array of app-specific route segments.
792
+ */;
793
+ RouterProxy.splitAppSpecificRoute = function splitAppSpecificRoute(appSpecificRoute) {
794
+ const routeSplit = (appSpecificRoute === null || appSpecificRoute === void 0 ? void 0 : appSpecificRoute.split("&/")) ?? [];
795
+ if (!routeSplit[0]) {
796
+ routeSplit.shift(); // remove the leading empty segment (the app-specific route starts with "&/")
797
+ }
798
+
799
+ return routeSplit;
800
+ }
801
+
759
802
  /**
760
803
  * Checks if back exits the present guard set.
761
804
  *
762
- * @param sPresentHash The current hash. Only used for unit tests.
763
- * @returns `true` if back exits there is a guard exit on back
764
- */;
765
- _proto.checkIfBackIsOutOfGuard = function checkIfBackIsOutOfGuard(sPresentHash) {
766
- let sPrevHash;
767
- let sCurrentHash;
768
- if (sPresentHash === undefined) {
769
- // We use window.location.hash instead of HashChanger.getInstance().getHash() because the latter
770
- // replaces characters in the URL (e.g. %24 replaced by $) and it causes issues when comparing
771
- // with the URLs in the managed history
772
- const oSplitHash = this._oShellServices.splitHash(window.location.hash);
773
- if (oSplitHash && oSplitHash.appSpecificRoute) {
774
- sCurrentHash = oSplitHash.appSpecificRoute;
775
- if (sCurrentHash.indexOf("&/") === 0) {
776
- sCurrentHash = sCurrentHash.substring(2);
777
- }
778
- } else {
779
- sCurrentHash = window.location.hash.substring(1); // To remove the '#'
780
- if (sCurrentHash[0] === "/") {
781
- sCurrentHash = sCurrentHash.substring(1);
782
- }
783
- }
784
- } else {
785
- sCurrentHash = sPresentHash;
805
+ * @returns `true` if back exits the guard
806
+ */;
807
+ _proto.checkIfBackIsOutOfGuard = function checkIfBackIsOutOfGuard() {
808
+ // We use window.location.hash instead of HashChanger.getInstance().getHash() because the latter
809
+ // replaces characters in the URL (e.g. %24 replaced by $) and it causes issues when comparing
810
+ // with the URLs in the managed history
811
+ const splitHash = this.getFullHash();
812
+ const segments = RouterProxy.splitAppSpecificRoute(splitHash);
813
+ if (segments.length > 1) {
814
+ // there is a nested route involved -> assume we are still inside the guard
815
+ return false;
786
816
  }
787
- sPresentHash = URI.decode(sCurrentHash);
817
+ const hash = segments[0] ?? "";
818
+ let previousHash;
788
819
  if (this._oNavigationGuard) {
789
820
  for (let i = this._oManagedHistory.length - 1; i > 0; i--) {
790
- if (this._oManagedHistory[i].hash === sPresentHash) {
791
- sPrevHash = this._oManagedHistory[i - 1].hash;
821
+ if (this._oManagedHistory[i].hash === hash) {
822
+ previousHash = this._oManagedHistory[i - 1].hash;
792
823
  break;
793
824
  }
794
825
  }
795
- return !sPrevHash || !this.checkHashWithGuard(sPrevHash);
826
+ return !previousHash || !this.checkHashWithGuard(previousHash);
796
827
  }
797
828
  return false;
798
829
  }
@@ -875,4 +906,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/
875
906
  }(BaseObject)) || _class);
876
907
  return RouterProxy;
877
908
  }, false);
878
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnVtU3RhdGUiLCJFUVVBTCIsIkNPTVBBVElCTEUiLCJBTkNFU1RPUiIsIkRJRkZFUkVOVCIsImVudW1VUkxQYXJhbXMiLCJMQVlPVVRQQVJBTSIsIklBUFBTVEFURVBBUkFNIiwiY3JlYXRlR3VhcmRGcm9tSGFzaCIsInNHdWFyZEhhc2giLCJfZ3VhcmRIYXNoIiwicmVwbGFjZSIsImNoZWNrIiwic0hhc2giLCJpbmRleE9mIiwicmVtb3ZlQXBwU3RhdGVJbkhhc2giLCJSZWdFeHAiLCJSb3V0ZXJQcm94eSIsImRlZmluZVVJNUNsYXNzIiwiYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nIiwiYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSIsImJJc0d1YXJkQ3Jvc3NBbGxvd2VkIiwic0lBcHBTdGF0ZUtleSIsIl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyIsIl9iQXBwbHlSZXN0b3JlIiwiX2JEZWxheWVkUmVidWlsZCIsIl9wYXRoTWFwcGluZ3MiLCJyZXN0b3JlSGlzdG9yeVRyaWdnZXJlZCIsImluaXQiLCJvQXBwQ29tcG9uZW50IiwiaXNmY2xFbmFibGVkIiwiZ2V0U2VydmljZSIsInRoZW4iLCJfb1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW5pdFJhdyIsImdldFJvdXRlciIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmZUxldmVsIiwic3RhdGUiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImZjbEVuYWJsZWQiLCJfZm5CbG9ja2luZ05hdkZpbHRlciIsIl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIiLCJiaW5kIiwicmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIl9mbkhhc2hHdWFyZCIsImhhc2hHdWFyZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJfYkRpc2FibGVPbkhhc2hDaGFuZ2UiLCJfYklnbm9yZVJlc3RvcmUiLCJfYkZvcmNlRm9jdXMiLCJkZXN0cm95IiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0QXBwU3RhdGVJbkhhc2giLCJzQXBwU3RhdGVLZXkiLCJzTmV3SGFzaCIsImluY2x1ZGVzIiwiZmluZEFwcFN0YXRlSW5IYXNoIiwiYUFwcFN0YXRlIiwibWF0Y2giLCJsZW5ndGgiLCJvUm91dGVyIiwiX29Sb3V0ZXIiLCJfb01hbmFnZWRIaXN0b3J5IiwiX29OYXZpZ2F0aW9uR3VhcmQiLCJzQ3VycmVudEFwcEhhc2giLCJnZXRIYXNoIiwicHVzaCIsIl9leHRyYWN0U3RhdGVGcm9tSGFzaCIsImFwcE5hbWUiLCJnZXRBcHBOYW1lRnJvbUhhc2giLCJoYXNoIiwiZ2V0SGFzaENoYW5nZXIiLCJzcGxpdEhhc2giLCJzaGVsbFBhcnQiLCJpc0ZvY3VzRm9yY2VkIiwic2V0Rm9jdXNGb3JjZWQiLCJiRm9yY2VkIiwicmVtb3ZlSUFwcFN0YXRlS2V5IiwibmF2VG9IYXNoIiwiYlByZXNlcnZlSGlzdG9yeSIsImJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUiLCJiRm9yY2VGb2N1cyIsImJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyIiwic2V0QmFja05hdmlnYXRpb24iLCJfb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24iLCJ3YWl0Rm9yIiwidW5kZWZpbmVkIiwiX2ludGVybmFsTmF2VG9IYXNoIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwib1Jlc291cmNlQnVuZGxlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImNvbmZpcm0iLCJnZXRUZXh0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJvTmV3U3RhdGUiLCJhQ3VycmVudEhhc2hLZXlzIiwiX2V4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2giLCJrZXlzIiwiZXZlcnkiLCJrZXkiLCJpbmRleCIsIm9IaXN0b3J5QWN0aW9uIiwiX3B1c2hOZXdTdGF0ZSIsInN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2giLCJfcmVidWlsZEJyb3dzZXJIaXN0b3J5IiwicmVzdG9yZUhpc3RvcnkiLCJzVGFyZ2V0SGFzaCIsImNoZWNrUmVzdG9yZUhpc3RvcnlXYXNUcmlnZ2VyZWQiLCJyZXNldFJlc3RvcmVIaXN0b3J5RmxhZyIsIm5hdkJhY2siLCJzQ3VycmVudEhhc2giLCJzUHJldmlvdXNIYXNoIiwiaSIsImJhY2siLCJuYXZUbyIsInNSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsImdldFVSTCIsIm5vUHJlc2VydmF0aW9uQ2FjaGUiLCJiSXNTdGlja3lNb2RlIiwiZXhpdEZyb21BcHAiLCJiYWNrVG9QcmV2aW91c0FwcCIsImlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeSIsInN1YnN0cmluZyIsIm9Mb2NhbEd1YXJkIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwic2V0TmF2aWdhdGlvbkd1YXJkIiwiZGlzY2FyZE5hdmlnYXRpb25HdWFyZCIsImhhc05hdmlnYXRpb25HdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJhY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24iLCJyZXNvbHZlUm91dGVNYXRjaCIsIlN5bmNocm9uaXphdGlvbiIsInNIYXNoTm9QYXJhbXMiLCJzcGxpdCIsImFUb2tlbnMiLCJuYW1lcyIsImZvckVhY2giLCJzVG9rZW4iLCJvU3RhdGUiLCJhTGF5b3V0Iiwic0xheW91dCIsInNjcmVlbk1vZGUiLCJiUmVidWlsZE9ubHkiLCJiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24iLCJhcHBTcGVjaWZpY1JvdXRlIiwibGFzdEluZGV4IiwiaVBvcENvdW50IiwicG9wIiwicHJlc2VydmVkIiwib0xhc3RSZW1vdmVkSXRlbSIsIm9Ub3BTdGF0ZSIsIl9jb21wYXJlQ2FjaGVTdGF0ZXMiLCJzUHJldmlvdXNJQXBwU3RhdGVLZXkiLCJvQ29tcGFyaXNvblN0YXRlUmVzdWx0IiwiYkhhc1NhbWVIYXNoIiwiZm9jdXNDb250cm9sSWQiLCJmb2N1c0luZm8iLCJ0eXBlIiwic3RlcHMiLCJfZGlzYWJsZUV2ZW50T25IYXNoQ2hhbmdlIiwic3RvcCIsIl9lbmFibGVFdmVudE9uSGFzaENoYW5nZSIsImJJZ25vcmVDdXJyZW50SGFzaCIsImluaXRpYWxpemUiLCJ0aGF0Iiwib1RhcmdldFN0YXRlIiwibmV3TGV2ZWwiLCJyZXBsYWNlQXN5bmMiLCJyZXBsYWNlSGFzaCIsInNldFRpbWVvdXQiLCJiYWNrUmVwbGFjZUFzeW5jIiwiYmFja0FzeW5jIiwic2V0SGFzaCIsImdvIiwiZ2V0TGFzdEhpc3RvcnlFbnRyeSIsInNldFBhdGhNYXBwaW5nIiwibWFwcGluZ3MiLCJmaWx0ZXIiLCJtYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjdXJyZW50QXBwTmFtZSIsImZpbmQiLCJtIiwiYUhhc2hTcGxpdCIsInNBcHBIYXNoIiwib1N0YXRlMSIsIm9TdGF0ZTIiLCJlcXVhbCIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwic1ByZXNlbnRIYXNoIiwic1ByZXZIYXNoIiwib1NwbGl0SGFzaCIsIlVSSSIsImRlY29kZSIsImNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQiLCJvQ3VycmVudFN0YXRlIiwib1ByZXZpb3VzU3RhdGUiLCJyZXN0b3JlRm9jdXNGb3JDdXJyZW50SGFzaCIsImN1cnJlbnRIYXNoIiwic3RhdGVGb3JIYXNoIiwiZm9jdXNBcHBsaWVkIiwiZm9jdXNDb250cm9sIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiYnlJZCIsImZvY3VzIiwiZ2V0Q3VycmVudEZvY3VzZWRDb250cm9sSWQiLCJnZXRGb2N1c0luZm8iLCJmaW5kTGF5b3V0Rm9ySGFzaCIsImhhc2hOb1BhcmFtIiwidGFyZ2V0U3RhdGUiLCJCYXNlT2JqZWN0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJSb3V0ZXJQcm94eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IFN5bmNocm9uaXphdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TeW5jaHJvbml6YXRpb25cIjtcbmltcG9ydCB0eXBlIHsgSVNoZWxsU2VydmljZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2hlbGxTZXJ2aWNlc0ZhY3RvcnlcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgVVJJIGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9VUklcIjtcblxuY29uc3QgZW51bVN0YXRlID0ge1xuXHRFUVVBTDogMCxcblx0Q09NUEFUSUJMRTogMSxcblx0QU5DRVNUT1I6IDIsXG5cdERJRkZFUkVOVDogM1xufTtcbmNvbnN0IGVudW1VUkxQYXJhbXMgPSB7XG5cdExBWU9VVFBBUkFNOiBcImxheW91dFwiLFxuXHRJQVBQU1RBVEVQQVJBTTogXCJzYXAtaWFwcC1zdGF0ZVwiXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBIYXNoR3VhcmQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBzR3VhcmRIYXNoIFRoZSBoYXNoIHVzZWQgZm9yIHRoZSBndWFyZFxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQgaGFzaCBndWFyZFxuICovXG5mdW5jdGlvbiBjcmVhdGVHdWFyZEZyb21IYXNoKHNHdWFyZEhhc2g6IHN0cmluZykge1xuXHRyZXR1cm4ge1xuXHRcdF9ndWFyZEhhc2g6IHNHdWFyZEhhc2gucmVwbGFjZSgvXFw/W14/XSokLywgXCJcIiksIC8vIFJlbW92ZSBxdWVyeSBwYXJ0XG5cdFx0Y2hlY2s6IGZ1bmN0aW9uIChzSGFzaDogYW55KSB7XG5cdFx0XHRyZXR1cm4gc0hhc2guaW5kZXhPZih0aGlzLl9ndWFyZEhhc2gpID09PSAwO1xuXHRcdH1cblx0fTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGhhc2ggd2l0aG91dCBpdHMgaUFwcFN0YXRlIHBhcnQuXG4gKlxuICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoXG4gKiBAcmV0dXJucyBUaGUgaGFzaCB3aXRob3V0IHRoZSBpQXBwU3RhdGVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZykge1xuXHRyZXR1cm4gc0hhc2gucmVwbGFjZShuZXcgUmVnRXhwKGBbJj9dKiR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09W14mXSpgKSwgXCJcIik7XG59XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLlJvdXRlclByb3h5XCIpXG5jbGFzcyBSb3V0ZXJQcm94eSBleHRlbmRzIEJhc2VPYmplY3Qge1xuXHRiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblxuXHRiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5ID0gZmFsc2U7XG5cblx0YklzR3VhcmRDcm9zc0FsbG93ZWQgPSBmYWxzZTtcblxuXHRzSUFwcFN0YXRlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuXHRfb1NoZWxsU2VydmljZXMhOiBJU2hlbGxTZXJ2aWNlcztcblxuXHRmY2xFbmFibGVkITogYm9vbGVhbjtcblxuXHRfZm5CbG9ja2luZ05hdkZpbHRlciE6IEZ1bmN0aW9uO1xuXG5cdF9mbkhhc2hHdWFyZCE6IEZ1bmN0aW9uO1xuXG5cdF9iRGlzYWJsZU9uSGFzaENoYW5nZSE6IGJvb2xlYW47XG5cblx0X2JJZ25vcmVSZXN0b3JlITogYm9vbGVhbjtcblxuXHRfYkZvcmNlRm9jdXMhOiBib29sZWFuO1xuXG5cdF9vUm91dGVyITogUm91dGVyO1xuXG5cdF9vTWFuYWdlZEhpc3RvcnkhOiBhbnlbXTtcblxuXHRfb05hdmlnYXRpb25HdWFyZDogYW55O1xuXG5cdG9SZXNvdXJjZUJ1bmRsZT86IFJlc291cmNlQnVuZGxlO1xuXG5cdF9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbj86IFN5bmNocm9uaXphdGlvbjtcblxuXHRfYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSBmYWxzZTtcblxuXHRfYkFwcGx5UmVzdG9yZSA9IGZhbHNlO1xuXG5cdF9iRGVsYXllZFJlYnVpbGQgPSBmYWxzZTtcblxuXHRfcGF0aE1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdHJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gZmFsc2U7XG5cblx0YXBwTmFtZSE6IHN0cmluZztcblxuXHRpbml0KG9BcHBDb21wb25lbnQ6IGFueSwgaXNmY2xFbmFibGVkOiBib29sZWFuKSB7XG5cdFx0Ly8gU2F2ZSB0aGUgbmFtZSBvZiB0aGUgYXBwIChpbmNsdWRpbmcgc3RhcnR1cCBwYXJhbWV0ZXJzKSBmb3IgcmVidWlsZGluZyBmdWxsIGhhc2hlcyBsYXRlclxuXHRcdG9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwic2hlbGxTZXJ2aWNlc1wiKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXG5cdFx0XHRcdHRoaXMuaW5pdFJhdyhvQXBwQ29tcG9uZW50LmdldFJvdXRlcigpKTtcblx0XHRcdFx0Ly8gV2Ugd2FudCB0byB3YWl0IHVudGlsIHRoZSBpbml0aWFsIHJvdXRlTWF0Y2hlZCBpcyBkb25lIGJlZm9yZSBkb2luZyBhbnkgbmF2aWdhdGlvblxuXHRcdFx0XHR0aGlzLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXG5cdFx0XHRcdC8vIFNldCBmZUxldmVsPTAgZm9yIHRoZSBmaXJzdCBBcHBsaWNhdGlvbiBwYWdlIGluIHRoZSBoaXN0b3J5XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuXHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGZlTGV2ZWw6IDBcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRoaXN0b3J5LnN0YXRlXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcIlwiLFxuXHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbiBhcyBhbnlcblx0XHRcdFx0KTtcblx0XHRcdFx0dGhpcy5mY2xFbmFibGVkID0gaXNmY2xFbmFibGVkO1xuXG5cdFx0XHRcdHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIgPSB0aGlzLl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBzaGVsbCBzZXJ2aWNlc1wiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0dGhpcy5fZm5IYXNoR3VhcmQgPSB0aGlzLmhhc2hHdWFyZC5iaW5kKHRoaXMpO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQgYXMgYW55KTtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JJZ25vcmVSZXN0b3JlID0gZmFsc2U7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSB0cnVlOyAvLyBUcmlnZ2VyIHRoZSBmb2N1cyBtZWNoYW5pc20gZm9yIHRoZSBmaXJzdCB2aWV3IGRpc3BsYXllZCBieSB0aGUgYXBwXG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdGlmICh0aGlzLl9vU2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMudW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdFx0fVxuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQgYXMgYW55KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGFuIGlBcHBTdGF0ZSBpbnNpZGUgYSBoYXNoIChvciByZXBsYWNlcyBhbiBleGlzdGluZyBvbmUpLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2hcblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUgaUFwcFN0YXRlIHRvIGFkZFxuXHQgKiBAcmV0dXJucyBUaGUgaGFzaCB3aXRoIHRoZSBhcHAgc3RhdGVcblx0ICovXG5cdHNldEFwcFN0YXRlSW5IYXNoKHNIYXNoOiBzdHJpbmcsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgc05ld0hhc2g6IHN0cmluZztcblxuXHRcdGlmIChzSGFzaC5pbmNsdWRlcyhlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNKSkge1xuXHRcdFx0Ly8gSWYgdGhlcmUncyBhbHJlYWR5IGFuIGlBcHBTdGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIGhhc2gsIHJlcGxhY2UgaXRcblx0XHRcdHNOZXdIYXNoID0gc0hhc2gucmVwbGFjZShcblx0XHRcdFx0bmV3IFJlZ0V4cChgJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT1bXiZdKmApLFxuXHRcdFx0XHRgJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT0ke3NBcHBTdGF0ZUtleX1gXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBBZGQgdGhlIGlBcHBTdGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIGhhc2hcblx0XHRcdGlmICghc0hhc2guaW5jbHVkZXMoXCI/XCIpKSB7XG5cdFx0XHRcdHNOZXdIYXNoID0gYCR7c0hhc2h9P2A7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzTmV3SGFzaCA9IGAke3NIYXNofSZgO1xuXHRcdFx0fVxuXHRcdFx0c05ld0hhc2ggKz0gYCR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09JHtzQXBwU3RhdGVLZXl9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4gc05ld0hhc2g7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgaUFwcFN0YXRlIHBhcnQgZnJvbSBhIGhhc2ggKG9yIG51bGwgaWYgbm90IGZvdW5kKS5cblx0ICpcblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoXG5cdCAqIEByZXR1cm5zIFRoZSBpQXBwU3RhdGUgcGFydCBvZiB0aGUgaGFzaFxuXHQgKi9cblx0ZmluZEFwcFN0YXRlSW5IYXNoKHNIYXNoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRjb25zdCBhQXBwU3RhdGUgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKGBcXFxcPy4qJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT0oW14mXSopYCkpO1xuXHRcdHJldHVybiBhQXBwU3RhdGUgJiYgYUFwcFN0YXRlLmxlbmd0aCA+IDEgPyBhQXBwU3RhdGVbMV0gOiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJhdyBpbml0aWFsaXphdGlvbiAoZm9yIHVuaXQgdGVzdHMpLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1JvdXRlciBUaGUgcm91dGVyIHVzZWQgYnkgdGhpcyBwcm94eVxuXHQgKi9cblx0aW5pdFJhdyhvUm91dGVyOiBSb3V0ZXIpIHtcblx0XHR0aGlzLl9vUm91dGVyID0gb1JvdXRlcjtcblx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkgPSBbXTtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gbnVsbDtcblxuXHRcdGNvbnN0IHNDdXJyZW50QXBwSGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wdXNoKHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNDdXJyZW50QXBwSGFzaCkpO1xuXG5cdFx0dGhpcy5hcHBOYW1lID0gdGhpcy5nZXRBcHBOYW1lRnJvbUhhc2god2luZG93LmxvY2F0aW9uLmhhc2gpO1xuXG5cdFx0Ly8gU2V0IHRoZSBpQXBwU3RhdGUgaWYgdGhlIGluaXRpYWwgaGFzaCBjb250YWlucyBvbmVcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSB0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChzQ3VycmVudEFwcEhhc2gpO1xuXHR9XG5cblx0Z2V0SGFzaCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKTtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRBcHBOYW1lRnJvbUhhc2goaGFzaDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLl9vU2hlbGxTZXJ2aWNlcz8uc3BsaXRIYXNoKGhhc2gpIGFzIHsgc2hlbGxQYXJ0OiBzdHJpbmc7IGFwcFNwZWNpZmljUm91dGU6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXHRcdHJldHVybiBzcGxpdEhhc2g/LnNoZWxsUGFydCA/PyBcIlwiO1xuXHR9XG5cblx0aXNGb2N1c0ZvcmNlZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fYkZvcmNlRm9jdXM7XG5cdH1cblxuXHRzZXRGb2N1c0ZvcmNlZChiRm9yY2VkOiBib29sZWFuKSB7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSBiRm9yY2VkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgdmFyaWFibGUgc0lBcHBTdGF0ZUtleS5cblx0ICpcblx0ICovXG5cdHJlbW92ZUlBcHBTdGF0ZUtleSgpIHtcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGhhc2guXG5cdCAqXG5cdCAqIEBwYXJhbSBzSGFzaCBIYXNoIHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBJZiBzZXQgdG8gdHJ1ZSwgbm9uLWFuY2VzdG9yIGVudHJpZXMgaW4gaGlzdG9yeSB3aWxsIGJlIHJldGFpbmVkXG5cdCAqIEBwYXJhbSBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlIElmIHNldCB0byB0cnVlLCBjYWNoZSBwcmVzZXJ2YXRpb24gbWVjaGFuaXNtIGlzIGRpc2FibGVkIGZvciB0aGUgY3VycmVudCBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBiRm9yY2VGb2N1cyBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGxvZ2ljIHRvIHNldCB0aGUgZm9jdXMgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWQgd2lsbCBiZSB0cmlnZ2VyZWQgKG9uUGFnZVJlYWR5KVxuXHQgKiBAcGFyYW0gYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIgSWYgbm90IHNldCB0byBmYWxzZSwgdGhlIGJhY2sgbmF2aWdhdGlvbiBpcyBzZXQgdG8gdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgKHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkKSB0aGF0IHJldHVybnMgJ3RydWUnIGlmIGEgbmF2aWdhdGlvbiB0b29rIHBsYWNlLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZG4ndCBoYXBwZW5cblx0ICovXG5cdG5hdlRvSGFzaChcblx0XHRzSGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuLFxuXHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhbixcblx0XHRiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlcj86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKGJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyICE9PSBmYWxzZSkge1xuXHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24ud2FpdEZvcigpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiA9IHVuZGVmaW5lZDtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2ludGVybmFsTmF2VG9IYXNoKHNIYXNoLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlLCBiRm9yY2VGb2N1cyk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvKSB7XG5cdFx0XHRcdHRoaXMud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5faW50ZXJuYWxOYXZUb0hhc2goc0hhc2gsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUsIGJGb3JjZUZvY3VzKTtcblx0XHR9XG5cdH1cblxuXHRfaW50ZXJuYWxOYXZUb0hhc2goc0hhc2g6IGFueSwgYlByZXNlcnZlSGlzdG9yeTogYW55LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlOiBhbnksIGJGb3JjZUZvY3VzPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIEFkZCB0aGUgYXBwIHN0YXRlIGluIHRoZSBoYXNoIGlmIG5lZWRlZFxuXHRcdGlmICh0aGlzLmZjbEVuYWJsZWQgJiYgdGhpcy5zSUFwcFN0YXRlS2V5ICYmICF0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChzSGFzaCkpIHtcblx0XHRcdHNIYXNoID0gdGhpcy5zZXRBcHBTdGF0ZUluSGFzaChzSGFzaCwgdGhpcy5zSUFwcFN0YXRlS2V5KTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNIYXNoKSkge1xuXHRcdFx0aWYgKCF0aGlzLm9SZXNvdXJjZUJ1bmRsZSkge1xuXHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlIGhhdmUgdG8gdXNlIGEgY29uZmlybSBoZXJlIGZvciBVSSBjb25zaXN0ZW5jeSByZWFzb25zLCBhcyB3aXRoIHNvbWUgc2NlbmFyaW9zXG5cdFx0XHQvLyBpbiB0aGUgRWRpdEZsb3cgd2UgcmVseSBvbiBhIFVJNSBtZWNoYW5pc20gdGhhdCBkaXNwbGF5cyBhIGNvbmZpcm0gZGlhbG9nLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFsZXJ0XG5cdFx0XHRpZiAoIWNvbmZpcm0odGhpcy5vUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfUk9VVEVSX1BST1hZX1NBUEZFX0VYSVRfTk9UU0FWRURfTUVTU0FHRVwiKSkpIHtcblx0XHRcdFx0Ly8gVGhlIHVzZXIgY2xpY2tlZCBvbiBDYW5jZWwgLS0+IGNhbmNlbCBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5iSXNHdWFyZENyb3NzQWxsb3dlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gSW4gY2FzZSB0aGUgbmF2aWdhdGlvbiB3aWxsIGNhdXNlIGEgbmV3IHZpZXcgdG8gYmUgZGlzcGxheWVkLCB3ZSBmb3JjZSB0aGUgZm9jdXNcblx0XHQvLyBJLmUuIGlmIHRoZSBrZXlzIGZvciB0aGUgaGFzaCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGlzIGEgc3VwZXJzZXQgb2YgdGhlIGN1cnJlbnQgaGFzaCBrZXlzLlxuXHRcdGNvbnN0IG9OZXdTdGF0ZSA9IHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNIYXNoKTtcblx0XHRpZiAoIXRoaXMuX2JGb3JjZUZvY3VzKSB7XG5cdFx0XHQvLyBJZiB0aGUgZm9jdXMgd2FzIGFscmVhZHkgZm9yY2VkLCBrZWVwIGl0XG5cdFx0XHRjb25zdCBhQ3VycmVudEhhc2hLZXlzID0gdGhpcy5fZXh0cmFjdEVudGl0eVNldHNGcm9tSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0XHR0aGlzLl9iRm9yY2VGb2N1cyA9XG5cdFx0XHRcdGJGb3JjZUZvY3VzIHx8XG5cdFx0XHRcdChhQ3VycmVudEhhc2hLZXlzLmxlbmd0aCA8IG9OZXdTdGF0ZS5rZXlzLmxlbmd0aCAmJlxuXHRcdFx0XHRcdGFDdXJyZW50SGFzaEtleXMuZXZlcnkoZnVuY3Rpb24gKGtleTogYW55LCBpbmRleDogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ga2V5ID09PSBvTmV3U3RhdGUua2V5c1tpbmRleF07XG5cdFx0XHRcdFx0fSkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9IaXN0b3J5QWN0aW9uID0gdGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgZmFsc2UsIGJQcmVzZXJ2ZUhpc3RvcnksIGJEaXNhYmxlUHJlc2VydmF0aW9uQ2FjaGUpO1xuXHRcdHRoaXMuc3RvcmVGb2N1c0luZm9Gb3JDdXJyZW50SGFzaCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbiwgZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFycyBicm93c2VyIGhpc3RvcnkgaWYgZW50cmllcyBoYXZlIGJlZW4gYWRkZWQgd2l0aG91dCB1c2luZyB0aGUgUm91dGVyUHJveHkuXG5cdCAqIFVwZGF0ZXMgdGhlIGludGVybmFsIGhpc3RvcnkgYWNjb3JkaW5nbHkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvbmNlIHRoZSBoaXN0b3J5IGlzIHJlYnVpbHRcblx0ICovXG5cdHJlc3RvcmVIaXN0b3J5KCkge1xuXHRcdGlmICh0aGlzLl9iQXBwbHlSZXN0b3JlKSB7XG5cdFx0XHR0aGlzLl9iQXBwbHlSZXN0b3JlID0gZmFsc2U7XG5cdFx0XHRsZXQgc1RhcmdldEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRcdHNUYXJnZXRIYXNoID0gc1RhcmdldEhhc2gucmVwbGFjZSgvKFxcP3wmKXJlc3RvcmVIaXN0b3J5PXRydWUvLCBcIlwiKTtcblx0XHRcdGNvbnN0IG9OZXdTdGF0ZSA9IHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNUYXJnZXRIYXNoKTtcblxuXHRcdFx0Y29uc3Qgb0hpc3RvcnlBY3Rpb24gPSB0aGlzLl9wdXNoTmV3U3RhdGUob05ld1N0YXRlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG5cblx0XHRcdHRoaXMucmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3JlYnVpbGRCcm93c2VySGlzdG9yeShvSGlzdG9yeUFjdGlvbiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIFJlc3RvcmVIaXN0b3J5IGhhcyBiZWVuIHRyaWdnZXJlZCBvbiB0aGUgUm91dGVyUHJveHkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgaXQgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRjaGVja1Jlc3RvcmVIaXN0b3J5V2FzVHJpZ2dlcmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgZmxhZyB0aGF0IHNheXMgaWYgUmVzdG9yZUhpc3RvcnkgaGFzIGJlZW4gdHJpZ2dlcmVkIG9uIHRoZSBSb3V0ZXJQcm94eS5cblx0ICovXG5cdHJlc2V0UmVzdG9yZUhpc3RvcnlGbGFnKCk6IHZvaWQge1xuXHRcdHRoaXMucmVzdG9yZUhpc3RvcnlUcmlnZ2VyZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiB0aGUgaGlzdG9yeS5cblx0ICpcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqL1xuXHRuYXZCYWNrKCkge1xuXHRcdGNvbnN0IHNDdXJyZW50SGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdGxldCBzUHJldmlvdXNIYXNoO1xuXG5cdFx0Ly8gTG9vayBmb3IgdGhlIGN1cnJlbnQgaGFzaCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5XG5cdFx0Zm9yIChsZXQgaSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG5cdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5W2ldLmhhc2ggPT09IHNDdXJyZW50SGFzaCkge1xuXHRcdFx0XHRzUHJldmlvdXNIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W2kgLSAxXS5oYXNoO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc1ByZXZpb3VzSGFzaCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF2VG9IYXNoKHNQcmV2aW91c0hhc2gpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBjb3VsZG4ndCBmaW5kIGEgcHJldmlvdXMgaGFzaCBpbiBoaXN0b3J5XG5cdFx0XHQvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSB0cmFuc2llbnQgaGFzaCBpbiBhIGNyZWF0ZSBhcHAsIGFuZFxuXHRcdFx0Ly8gaW4gdGhhdCBjYXNlIGhpc3RvcnkuYmFjayB3b3VsZCBnbyBiYWNrIHRvIHRoZSBGTFBcblx0XHRcdHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGEgcm91dGUgd2l0aCBwYXJhbWV0ZXJzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1JvdXRlTmFtZSBUaGUgcm91dGUgbmFtZSB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIG9QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKi9cblx0bmF2VG8oc1JvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyLmdldFVSTChzUm91dGVOYW1lLCBvUGFyYW1ldGVycyk7XG5cdFx0cmV0dXJuIHRoaXMubmF2VG9IYXNoKHNIYXNoLCBmYWxzZSwgb1BhcmFtZXRlcnMubm9QcmVzZXJ2YXRpb25DYWNoZSwgZmFsc2UsICFvUGFyYW1ldGVycy5iSXNTdGlja3lNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGl0cyB0aGUgY3VycmVudCBhcHAgYnkgbmF2aWdhdGluZyBiYWNrXG5cdCAqIHRvIHRoZSBwcmV2aW91cyBhcHAgKGlmIGFueSkgb3IgdGhlIEZMUC5cblx0ICpcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gd2UgZXhpdCB0aGUgYXBwXG5cdCAqL1xuXHRleGl0RnJvbUFwcCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1NoZWxsU2VydmljZXMuYmFja1RvUHJldmlvdXNBcHAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGhhc2ggY2FuIGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBjdXJyZW50IHN0YXRlXG5cdCAqIGkuZS4gaWYgdGhlIGhhc2ggaXMgZXF1YWwsIGNvbXBhdGlibGUgb3IgYW4gYW5jZXN0b3Igb2YgdGhlIGN1cnJlbnQgc3RhdGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzSGFzaCBgdHJ1ZWAgaWYgdGhlcmUgaXMgYW4gaW1wYWN0XG5cdCAqIEByZXR1cm5zIElmIHRoZXJlIGlzIGFuIGltcGFjdFxuXHQgKi9cblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNIYXNoOiBhbnkpIHtcblx0XHRpZiAoc0hhc2hbMF0gPT09IFwiL1wiKSB7XG5cdFx0XHRzSGFzaCA9IHNIYXNoLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0xvY2FsR3VhcmQgPSBjcmVhdGVHdWFyZEZyb21IYXNoKHNIYXNoKTtcblx0XHRyZXR1cm4gb0xvY2FsR3VhcmQuY2hlY2sodGhpcy5nZXRIYXNoKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cblx0ICpcblx0ICogQHJldHVybnMgYGZhbHNlYCBpZiBhIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGluIHRoZSBSb3V0ZXJQcm94eSBhbmQgaXMgbm90IHlldCBmaW5hbGl6ZWRcblx0ICovXG5cdGlzTmF2aWdhdGlvbkZpbmFsaXplZCgpIHtcblx0XHRyZXR1cm4gIXRoaXMuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nICYmICF0aGlzLl9iRGVsYXllZFJlYnVpbGQ7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgbGFzdCBzdGF0ZSBhcyBhIGd1YXJkLlxuXHQgKiBFYWNoIGZ1dHVyZSBuYXZpZ2F0aW9uIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoaXMgZ3VhcmQsIGFuZCBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgd2lsbFxuXHQgKiBiZSBkaXNwbGF5ZWQgYmVmb3JlIHRoZSBuYXZpZ2F0aW9uIGNyb3NzZXMgdGhlIGd1YXJkIChpLmUuIGdvZXMgdG8gYW4gYW5jZXN0b3Igb2YgdGhlIGd1YXJkKS5cblx0ICpcblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoIGZvciB0aGUgZ3VhcmRcblx0ICovXG5cdHNldE5hdmlnYXRpb25HdWFyZChzSGFzaDogc3RyaW5nKSB7XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IGNyZWF0ZUd1YXJkRnJvbUhhc2goc0hhc2gpO1xuXHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICovXG5cdGRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKSB7XG5cdFx0dGhpcy5fb05hdmlnYXRpb25HdWFyZCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBuYXZpZ2F0aW9uIGd1YXJkLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbmF2aWdhdGluZyBndWFyZCBpcyBhdmFpbGFibGVcblx0ICovXG5cdGhhc05hdmlnYXRpb25HdWFyZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb05hdmlnYXRpb25HdWFyZCAhPT0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUZXN0cyBhIGhhc2ggYWdhaW5zdCB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICpcblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoIHRvIGJlIHRlc3RlZFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbmF2aWdhdGluZyB0byB0aGUgaGFzaCBkb2Vzbid0IGNyb3NzIHRoZSBndWFyZFxuXHQgKi9cblx0Y2hlY2tIYXNoV2l0aEd1YXJkKHNIYXNoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy5fb05hdmlnYXRpb25HdWFyZCA9PT0gbnVsbCB8fCB0aGlzLl9vTmF2aWdhdGlvbkd1YXJkLmNoZWNrKHNIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHVzZXIgYWxsb3dlZCB0aGUgbmF2aWdhdGlvbiBndWFyZCB0byBiZSBjcm9zc2VkLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBiZWVuIGFsbG93ZWQgYnkgdGhlIHVzZXJcblx0ICovXG5cdGlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQWN0aXZhdGVzIHRoZSBzeW5jaHJvbml6YXRpb24gZm9yIHJvdXRlTWF0Y2hlZEV2ZW50LlxuXHQgKiBUaGUgbmV4dCBOYXZUb0hhc2ggY2FsbCB3aWxsIGNyZWF0ZSBhIFN5bmNocm9uaXphdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlIHJlc29sdmVkXG5cdCAqIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG9uUm91dGVNYXRjaGVkIGV2ZW50LCBwcmV2ZW50aW5nIGFub3RoZXIgTmF2VG9IYXNoIHRvIGhhcHBlbiBpbiBwYXJhbGxlbC5cblx0ICovXG5cdGFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpIHtcblx0XHR0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSB0aGUgcm91dGVNYXRjaCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCB1bmxvY2tpbmcgcG90ZW50aWFsIHBlbmRpbmcgTmF2VG9IYXNoIGNhbGxzLlxuXHQgKi9cblx0cmVzb2x2ZVJvdXRlTWF0Y2goKSB7XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbi5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2VzIHN1cmUgbm8gbmF2aWdhdGlvbiBjYW4gaGFwcGVuIGJlZm9yZSBhIHJvdXRlTWF0Y2ggaGFwcGVuZWQuXG5cdCAqL1xuXHR3YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24oKSB7XG5cdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24gPSBuZXcgU3luY2hyb25pemF0aW9uKCk7XG5cdFx0dGhpcy5fYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSBmYWxzZTtcblx0fVxuXG5cdF9leHRyYWN0RW50aXR5U2V0c0Zyb21IYXNoKHNIYXNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cdFx0Y29uc3Qgc0hhc2hOb1BhcmFtcyA9IHNIYXNoLnNwbGl0KFwiP1wiKVswXTsgLy8gcmVtb3ZlIHBhcmFtc1xuXHRcdGNvbnN0IGFUb2tlbnMgPSBzSGFzaE5vUGFyYW1zLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGFUb2tlbnMuZm9yRWFjaCgoc1Rva2VuKSA9PiB7XG5cdFx0XHRpZiAoc1Rva2VuLmxlbmd0aCkge1xuXHRcdFx0XHRuYW1lcy5wdXNoKHNUb2tlbi5zcGxpdChcIihcIilbMF0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG5hbWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkcyBhIHN0YXRlIGZyb20gYSBoYXNoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gYmUgdXNlZCBhcyBlbnRyeVxuXHQgKiBAcmV0dXJucyBUaGUgc3RhdGVcblx0ICovXG5cdF9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaDogc3RyaW5nKSB7XG5cdFx0aWYgKHNIYXNoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHNIYXNoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBvU3RhdGU6IGFueSA9IHtcblx0XHRcdGtleXM6IHRoaXMuX2V4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2goc0hhc2gpXG5cdFx0fTtcblxuXHRcdC8vIFJldHJpZXZlIGxheW91dCAoaWYgYW55KVxuXHRcdGNvbnN0IGFMYXlvdXQgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKGBcXFxcPy4qJHtlbnVtVVJMUGFyYW1zLkxBWU9VVFBBUkFNfT0oW14mXSopYCkpO1xuXHRcdG9TdGF0ZS5zTGF5b3V0ID0gYUxheW91dCAmJiBhTGF5b3V0Lmxlbmd0aCA+IDEgPyBhTGF5b3V0WzFdIDogbnVsbDtcblx0XHRpZiAob1N0YXRlLnNMYXlvdXQgPT09IFwiTWlkQ29sdW1uRnVsbFNjcmVlblwiKSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDE7XG5cdFx0fSBlbHNlIGlmIChvU3RhdGUuc0xheW91dCA9PT0gXCJFbmRDb2x1bW5GdWxsU2NyZWVuXCIpIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAwO1xuXHRcdH1cblxuXHRcdG9TdGF0ZS5oYXNoID0gc0hhc2g7XG5cdFx0cmV0dXJuIG9TdGF0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgbmV3IHN0YXRlIGludG8gdGhlIGludGVybmFsIGhpc3Rvcnkgc3RydWN0dXJlLlxuXHQgKiBNYWtlcyBzdXJlIHRoaXMgbmV3IHN0YXRlIGlzIGFkZGVkIGFmdGVyIGFuIGFuY2VzdG9yLlxuXHQgKiBBbHNvIHNldHMgdGhlIGlBcHBTdGF0ZSBrZXkgaW4gdGhlIHdob2xlIGhpc3RvcnkuXG5cdCAqXG5cdCAqIEBwYXJhbSBvTmV3U3RhdGUgVGhlIG5ldyBzdGF0ZSB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0gYlJlYnVpbGRPbmx5IGB0cnVlYCBpZiB3ZSdyZSByZWJ1aWxkaW5nIHRoZSBoaXN0b3J5IGFmdGVyIGEgc2hlbGwgbWVudSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBiUHJlc2VydmVIaXN0b3J5IElmIHNldCB0byB0cnVlLCBub24tYW5jZXN0b3IgZW50cmllcyBpbiBoaXN0b3J5IHdpbGwgYmUgcmV0YWluZWRcblx0ICogQHBhcmFtIGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiBEaXNhYmxlIHRoZSBtZWNoYW5pc20gdG8gcmV0YWluZWQgbWFya2VkIGVudHJpZXMgaW4gY2FjaGVcblx0ICogQHJldHVybnMgVGhlIG5ldyBzdGF0ZVxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9wdXNoTmV3U3RhdGUob05ld1N0YXRlOiBhbnksIGJSZWJ1aWxkT25seTogYm9vbGVhbiwgYlByZXNlcnZlSGlzdG9yeTogYm9vbGVhbiwgYkRpc2FibGVIaXN0b3J5UHJlc2VydmF0aW9uOiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgc3BsaXRIYXNoID0gdGhpcy5fb1NoZWxsU2VydmljZXMuc3BsaXRIYXNoKHdpbmRvdy5sb2NhdGlvbi5oYXNoKSBhcyB7IHNoZWxsUGFydDogc3RyaW5nOyBhcHBTcGVjaWZpY1JvdXRlPzogc3RyaW5nIH07XG5cdFx0Y29uc3Qgc0N1cnJlbnRIYXNoID0gKHNwbGl0SGFzaC5hcHBTcGVjaWZpY1JvdXRlID8/IFwiXCIpLnJlcGxhY2UoL14mXFwvLywgXCJcIik7IC8vIFJlbW92ZSBsZWFkaW5nICcmLydcblx0XHRsZXQgbGFzdEluZGV4ID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7XG5cdFx0bGV0IGlQb3BDb3VudCA9IGJSZWJ1aWxkT25seSA/IDEgOiAwO1xuXG5cdFx0Ly8gMS4gRG8gc29tZSBjbGVhbnVwIGluIHRoZSBtYW5hZ2VkIGhpc3RvcnkgOiBpbiBjYXNlIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWQgYmFjayBpbiB0aGUgYnJvd3NlciBoaXN0b3J5LCB3ZSBuZWVkIHRvIHJlbW92ZVxuXHRcdC8vIHRoZSBzdGF0ZXMgYWhlYWQgaW4gaGlzdG9yeSBhbmQgbWFrZSBzdXJlIHRoZSB0b3Agc3RhdGUgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgcGFnZVxuXHRcdC8vIFdlIGRvbid0IGRvIHRoYXQgd2hlbiByZXN0b3JpbmcgdGhlIGhpc3RvcnksIGFzIHRoZSBjdXJyZW50IHN0YXRlIGhhcyBiZWVuIGFkZGVkIG9uIHRvcCBvZiB0aGUgYnJvd3NlciBoaXN0b3J5XG5cdFx0Ly8gYW5kIGlzIG5vdCByZWZsZWN0ZWQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGlmICghYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHR3aGlsZSAobGFzdEluZGV4ID49IDAgJiYgdGhpcy5fb01hbmFnZWRIaXN0b3J5W2xhc3RJbmRleF0uaGFzaCAhPT0gc0N1cnJlbnRIYXNoKSB7XG5cdFx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0bGFzdEluZGV4LS07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIFdlIGNvdWxkbid0IGZpbmQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGhpc3RvcnkuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIGJyb3dzZXIgcmVsb2FkXG5cdFx0XHRcdC8vIGhhcHBlbmVkLCBjYXVzaW5nIGEgcmVpbml0aWFsaXphdGlvbiBvZiB0aGUgbWFuYWdlZCBoaXN0b3J5LlxuXHRcdFx0XHQvLyBJbiB0aGF0IGNhc2UsIHdlIHVzZSB0aGUgY3VycmVudCBsb2NhdGlvbiBhcyB0aGUgbmV3IHN0YXJ0aW5nIHBvaW50IGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2godGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0N1cnJlbnRIYXNoKSk7XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiAwIH0sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyAyLiBNYXJrIHRoZSB0b3Agc3RhdGUgYXMgcHJlc2VydmVkIGlmIHJlcXVpcmVkXG5cdFx0aWYgKGJQcmVzZXJ2ZUhpc3RvcnkgJiYgIWJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbikge1xuXHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXS5wcmVzZXJ2ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIDMuIFRoZW4gcG9wIGFsbCBzdGF0ZXMgdW50aWwgd2UgZmluZCBhbiBhbmNlc3RvciBvZiB0aGUgbmV3IHN0YXRlLCBvciB3ZSBmaW5kIGEgc3RhdGUgdGhhdCBuZWVkIHRvIGJlIHByZXNlcnZlZFxuXHRcdGxldCBvTGFzdFJlbW92ZWRJdGVtO1xuXHRcdHdoaWxlICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1RvcFN0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXTtcblx0XHRcdGlmIChcblx0XHRcdFx0KGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiB8fCAhb1RvcFN0YXRlLnByZXNlcnZlZCkgJiZcblx0XHRcdFx0dGhpcy5fY29tcGFyZUNhY2hlU3RhdGVzKG9Ub3BTdGF0ZSwgb05ld1N0YXRlKSAhPT0gZW51bVN0YXRlLkFOQ0VTVE9SXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhlIHRvcCBzdGF0ZSBpcyBub3QgYW4gYW5jZXN0b3Igb2Ygb05ld1N0YXRlIGFuZCBpcyBub3QgcHJlc2VydmVkIC0tPiB3ZSBjYW4gcG9wIGl0XG5cdFx0XHRcdG9MYXN0UmVtb3ZlZEl0ZW0gPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkucG9wKCk7XG5cdFx0XHRcdGlQb3BDb3VudCsrO1xuXHRcdFx0fSBlbHNlIGlmIChvVG9wU3RhdGUucHJlc2VydmVkICYmIHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9Ub3BTdGF0ZS5oYXNoKSA9PT0gcmVtb3ZlQXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gpKSB7XG5cdFx0XHRcdC8vIFdlIHRyeSB0byBhZGQgYSBzdGF0ZSB0aGF0IGlzIGFscmVhZHkgaW4gY2FjaGUgKGR1ZSB0byBwcmVzZXJ2ZWQgZmxhZykgYnV0IHdpdGggYSBkaWZmZXJlbnQgaWFwcC1zdGF0ZVxuXHRcdFx0XHQvLyAtLT4gd2Ugc2hvdWxkIGRlbGV0ZSB0aGUgcHJldmlvdXMgZW50cnkgKGl0IHdpbGwgYmUgbGF0ZXIgcmVwbGFjZWQgYnkgdGhlIG5ldyBvbmUpIGFuZCBzdG9wIHBvcHBpbmdcblx0XHRcdFx0b0xhc3RSZW1vdmVkSXRlbSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0aVBvcENvdW50Kys7XG5cdFx0XHRcdG9OZXdTdGF0ZS5wcmVzZXJ2ZWQgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJyZWFrOyAvLyBBbmNlc3RvciBvciBwcmVzZXJ2ZWQgc3RhdGUgZm91bmQgLS0+IHdlIHN0b3AgcG9wcGluZyBvdXQgc3RhdGVzXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gNC4gaUFwcFN0YXRlIG1hbmFnZW1lbnRcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSB0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCk7XG5cdFx0aWYgKCF0aGlzLmZjbEVuYWJsZWQgJiYgb0xhc3RSZW1vdmVkSXRlbSkge1xuXHRcdFx0Y29uc3Qgc1ByZXZpb3VzSUFwcFN0YXRlS2V5ID0gdGhpcy5maW5kQXBwU3RhdGVJbkhhc2gob0xhc3RSZW1vdmVkSXRlbS5oYXNoKTtcblx0XHRcdGNvbnN0IG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPSB0aGlzLl9jb21wYXJlQ2FjaGVTdGF0ZXMob0xhc3RSZW1vdmVkSXRlbSwgb05ld1N0YXRlKTtcblx0XHRcdC8vIGlmIGN1cnJlbnQgc3RhdGUgZG9lc24ndCBjb250YWluIGEgaS1hcHBzdGF0ZSBhbmQgdGhpcyBzdGF0ZSBzaG91bGQgcmVwbGFjZSBhIHN0YXRlIGNvbnRhaW5pbmcgYSBpQXBwU3RhdGVcblx0XHRcdC8vIHRoZW4gdGhlIHByZXZpb3VzIGlBcHBTdGF0ZSBpcyBwcmVzZXJ2ZWRcblx0XHRcdGlmIChcblx0XHRcdFx0IXRoaXMuc0lBcHBTdGF0ZUtleSAmJlxuXHRcdFx0XHRzUHJldmlvdXNJQXBwU3RhdGVLZXkgJiZcblx0XHRcdFx0KG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPT09IGVudW1TdGF0ZS5FUVVBTCB8fCBvQ29tcGFyaXNvblN0YXRlUmVzdWx0ID09PSBlbnVtU3RhdGUuQ09NUEFUSUJMRSlcblx0XHRcdCkge1xuXHRcdFx0XHRvTmV3U3RhdGUuaGFzaCA9IHRoaXMuc2V0QXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gsIHNQcmV2aW91c0lBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gNS4gTm93IHdlIGNhbiBwdXNoIHRoZSBzdGF0ZSBhdCB0aGUgdG9wIG9mIHRoZSBpbnRlcm5hbCBoaXN0b3J5XG5cdFx0Y29uc3QgYkhhc1NhbWVIYXNoID0gb0xhc3RSZW1vdmVkSXRlbSAmJiBvTmV3U3RhdGUuaGFzaCA9PT0gb0xhc3RSZW1vdmVkSXRlbS5oYXNoO1xuXHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID09PSAwIHx8IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV0uaGFzaCAhPT0gb05ld1N0YXRlLmhhc2gpIHtcblx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wdXNoKG9OZXdTdGF0ZSk7XG5cdFx0XHRpZiAob0xhc3RSZW1vdmVkSXRlbSAmJiByZW1vdmVBcHBTdGF0ZUluSGFzaChvTGFzdFJlbW92ZWRJdGVtLmhhc2gpID09PSByZW1vdmVBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCkpIHtcblx0XHRcdFx0b05ld1N0YXRlLmZvY3VzQ29udHJvbElkID0gb0xhc3RSZW1vdmVkSXRlbS5mb2N1c0NvbnRyb2xJZDtcblx0XHRcdFx0b05ld1N0YXRlLmZvY3VzSW5mbyA9IG9MYXN0UmVtb3ZlZEl0ZW0uZm9jdXNJbmZvO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDYuIERldGVybWluZSB3aGljaCBhY3Rpb25zIHRvIGRvIG9uIHRoZSBoaXN0b3J5XG5cdFx0aWYgKGlQb3BDb3VudCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gc3RhdGUgd2FzIHBvcHBlZCAtLT4gYXBwZW5kXG5cdFx0XHRyZXR1cm4geyB0eXBlOiBcImFwcGVuZFwiIH07XG5cdFx0fSBlbHNlIGlmIChpUG9wQ291bnQgPT09IDEpIHtcblx0XHRcdC8vIE9ubHkgMSBzdGF0ZSB3YXMgcG9wcGVkIC0tPiByZXBsYWNlIGN1cnJlbnQgaGFzaCB1bmxlc3MgaGFzaCBpcyB0aGUgc2FtZSAodGhlbiBub3RoaW5nIHRvIGRvKVxuXHRcdFx0cmV0dXJuIGJIYXNTYW1lSGFzaCA/IHsgdHlwZTogXCJub25lXCIgfSA6IHsgdHlwZTogXCJyZXBsYWNlXCIgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTW9yZSB0aGFuIDEgc3RhdGUgd2FzIHBvcHBlZCAtLT4gZ28gYmFrYyBpbiBoaXN0b3J5IGFuZCByZXBsYWNlIGhhc2ggaWYgbmVjZXNzYXJ5XG5cdFx0XHRyZXR1cm4gYkhhc1NhbWVIYXNoID8geyB0eXBlOiBcImJhY2tcIiwgc3RlcHM6IGlQb3BDb3VudCAtIDEgfSA6IHsgdHlwZTogXCJiYWNrLXJlcGxhY2VcIiwgc3RlcHM6IGlQb3BDb3VudCAtIDEgfTtcblx0XHR9XG5cdH1cblxuXHRfYmxvY2tpbmdOYXZpZ2F0aW9uRmlsdGVyKCkge1xuXHRcdHJldHVybiB0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA/IFwiQ3VzdG9tXCIgOiBcIkNvbnRpbnVlXCI7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZSB0aGUgcm91dGluZyBieSBjYWxsaW5nIHRoZSByb3V0ZXIgc3RvcCBtZXRob2QuXG5cdCAqXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2Rpc2FibGVFdmVudE9uSGFzaENoYW5nZSgpIHtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IHRydWU7XG5cdFx0dGhpcy5fb1JvdXRlci5zdG9wKCk7XG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlIHRoZSByb3V0aW5nIGJ5IGNhbGxpbmcgdGhlIHJvdXRlciBpbml0aWFsaXplIG1ldGhvZC5cblx0ICpcblx0ICogQHBhcmFtIFtiSWdub3JlQ3VycmVudEhhc2hdIElnbm9yZSB0aGUgbGFzdCBoYXNoIGV2ZW50IHRyaWdnZXJlZCBiZWZvcmUgdGhlIHJvdXRlciBoYXMgaW5pdGlhbGl6ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UoYklnbm9yZUN1cnJlbnRIYXNoOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9vUm91dGVyLmluaXRpYWxpemUoYklnbm9yZUN1cnJlbnRIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTeW5jaHJvbml6ZXMgdGhlIGJyb3dzZXIgaGlzdG9yeSB3aXRoIHRoZSBpbnRlcm5hbCBoaXN0b3J5IG9mIHRoZSByb3V0ZXJQcm94eSwgYW5kIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiBpZiBuZWVkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvSGlzdG9yeUFjdGlvbiBTcGVjaWZpZXMgdGhlIG5hdmlnYXRpb24gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZFxuXHQgKiBAcGFyYW0gYlJlYnVpbGRPbmx5IGB0cnVlYCBpZiBpbnRlcm5hbCBoaXN0b3J5IGlzIGN1cnJlbnRseSBiZWluZyByZWJ1aWx0XG5cdCAqIEByZXR1cm5zIFByb21pc2UgKHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkKSB0aGF0IHJldHVybnMgJ3RydWUnIGlmIGEgbmF2aWdhdGlvbiB0b29rIHBsYWNlLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZG4ndCBoYXBwZW5cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfcmVidWlsZEJyb3dzZXJIaXN0b3J5KG9IaXN0b3J5QWN0aW9uOiBhbnksIGJSZWJ1aWxkT25seTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSB0cnVlO1xuXHRcdFx0Y29uc3Qgb1RhcmdldFN0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXSxcblx0XHRcdFx0bmV3TGV2ZWwgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTtcblxuXHRcdFx0ZnVuY3Rpb24gcmVwbGFjZUFzeW5jKCkge1xuXHRcdFx0XHRpZiAoIWJSZWJ1aWxkT25seSkge1xuXHRcdFx0XHRcdHRoYXQuX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0KHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IG5ld0xldmVsIH0sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiKTtcblxuXHRcdFx0XHRpZiAoYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBUaW1lb3V0IHRvIGxldCAnaGFzaGNoYW5nZScgZXZlbnQgYmUgcHJvY2Vzc2VkIGJlZm9yZSBieSB0aGUgSGFzaENoYW5nZXIsIHNvIHRoYXRcblx0XHRcdFx0XHRcdC8vIG9uUm91dGVNYXRjaGVkIG5vdGlmaWNhdGlvbiBpc24ndCByYWlzZWRcblx0XHRcdFx0XHRcdHRoYXQuX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKHRydWUpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdC8vIEFzeW5jIGNhbGxiYWNrcyB3aGVuIG5hdmlnYXRpbmcgYmFjaywgaW4gb3JkZXIgdG8gbGV0IGFsbCBub3RpZmljYXRpb25zIGFuZCBldmVudHMgZ2V0IHByb2Nlc3NlZFxuXHRcdFx0ZnVuY3Rpb24gYmFja1JlcGxhY2VBc3luYygpIHtcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBiYWNrUmVwbGFjZUFzeW5jKTtcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gVGltZW91dCB0byBsZXQgJ2hhc2hjaGFuZ2UnIGV2ZW50IGJlIHByb2Nlc3NlZCBiZWZvcmUgYnkgdGhlIEhhc2hDaGFuZ2VyXG5cdFx0XHRcdFx0cmVwbGFjZUFzeW5jKCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBiYWNrQXN5bmMoKSB7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja0FzeW5jKTtcblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdHRoYXQuX2JJZ25vcmVSZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0c3dpdGNoIChvSGlzdG9yeUFjdGlvbi50eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJyZXBsYWNlXCI6XG5cdFx0XHRcdFx0Y29uc3QgZm9jdXNJbmZvID0gaGlzdG9yeS5zdGF0ZT8uZm9jdXNJbmZvO1xuXHRcdFx0XHRcdCh0aGF0Ll9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkucmVwbGFjZUhhc2ggYXMgYW55KShvVGFyZ2V0U3RhdGUuaGFzaCk7XG5cdFx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoXG5cdFx0XHRcdFx0XHRPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0ZmVMZXZlbDogbmV3TGV2ZWwsXG5cdFx0XHRcdFx0XHRcdFx0Zm9jdXNJbmZvOiBmb2N1c0luZm9cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0aGlzdG9yeS5zdGF0ZVxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImFwcGVuZFwiOlxuXHRcdFx0XHRcdHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5zZXRIYXNoKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImJhY2tcIjpcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tBc3luYyk7XG5cdFx0XHRcdFx0aGlzdG9yeS5nbygtb0hpc3RvcnlBY3Rpb24uc3RlcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJiYWNrLXJlcGxhY2VcIjpcblx0XHRcdFx0XHR0aGlzLl9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKTtcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tSZXBsYWNlQXN5bmMpO1xuXHRcdFx0XHRcdGhpc3RvcnkuZ28oLW9IaXN0b3J5QWN0aW9uLnN0ZXBzKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vIE5vIG5hdmlnYXRpb25cblx0XHRcdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHJlc29sdmUoZmFsc2UpOyAvLyBubyBuYXZpZ2F0aW9uIC0tPiByZXNvbHZlIHRvIGZhbHNlXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRMYXN0SGlzdG9yeUVudHJ5KCkge1xuXHRcdHJldHVybiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHR9XG5cblx0c2V0UGF0aE1hcHBpbmcobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKSB7XG5cdFx0dGhpcy5fcGF0aE1hcHBpbmdzID0gbWFwcGluZ3MuZmlsdGVyKChtYXBwaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gbWFwcGluZy5vbGRQYXRoICE9PSBtYXBwaW5nLm5ld1BhdGg7XG5cdFx0fSk7XG5cdH1cblxuXHRoYXNoR3VhcmQoKSB7XG5cdFx0bGV0IHNIYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0Y29uc3QgY3VycmVudEFwcE5hbWUgPSB0aGlzLmdldEFwcE5hbWVGcm9tSGFzaChzSGFzaCk7XG5cdFx0aWYgKGN1cnJlbnRBcHBOYW1lICE9IHRoaXMuYXBwTmFtZSkge1xuXHRcdFx0Ly8gV2hlbiBkb2luZyBleHRlcm5hbCBuYXZpZ2F0aW9uIGluIGFub3RoZXIgd2luZG93LCB0aGUgY3VycmVudCB3aW5kb3cgbG9jYXRpb24gaXMgdGVtcG9yYXJpbHkgbW9kaWZpZWQgd2l0aCB0aGUgVVJMIG9mIHRoZSB0YXJnZXQgYXBwXG5cdFx0XHQvLyBJbiB0aGlzIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gdXBkYXRlIHRoZSBpbnRlcm5hbGx5IG1hbmFnZWQgaGlzdG9yeSwgc28gd2Ugc2ltcGx5IGRvIG5vdGhpbmdcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoc0hhc2guaW5jbHVkZXMoXCJyZXN0b3JlSGlzdG9yeT10cnVlXCIpKSB7XG5cdFx0XHR0aGlzLl9iQXBwbHlSZXN0b3JlID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKCF0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZykge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGhhc2ggbmVlZHMgdG8gYmUgY2hhbmdlZCAodGhpcyBoYXBwZW5zIGluIEZDTCB3aGVuIHN3aXRjaGluZyBiL3cgZWRpdCBhbmQgcmVhZC1vbmx5IHdpdGggMyBjb2x1bW5zIG9wZW4pXG5cdFx0XHRjb25zdCBtYXBwaW5nID0gdGhpcy5fcGF0aE1hcHBpbmdzLmZpbmQoKG0pID0+IHtcblx0XHRcdFx0cmV0dXJuIHNIYXNoLmluY2x1ZGVzKG0ub2xkUGF0aCk7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChtYXBwaW5nKSB7XG5cdFx0XHRcdC8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgaGFzaFxuXHRcdFx0XHRzSGFzaCA9IHNIYXNoLnJlcGxhY2UobWFwcGluZy5vbGRQYXRoLCBtYXBwaW5nLm5ld1BhdGgpO1xuXHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHt9LCBoaXN0b3J5LnN0YXRlKSwgXCJcIiwgc0hhc2gpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBhSGFzaFNwbGl0ID0gc0hhc2guc3BsaXQoXCImL1wiKTtcblx0XHRcdGNvbnN0IHNBcHBIYXNoID0gYUhhc2hTcGxpdFsxXSA/IGFIYXNoU3BsaXRbMV0gOiBcIlwiO1xuXHRcdFx0aWYgKHRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNBcHBIYXNoKSkge1xuXHRcdFx0XHR0aGlzLl9iRGVsYXllZFJlYnVpbGQgPSB0cnVlO1xuXHRcdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQXBwSGFzaCk7XG5cdFx0XHRcdHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG5cblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fYkRlbGF5ZWRSZWJ1aWxkID0gZmFsc2U7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wYXJlcyAyIHN0YXRlcy5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTFcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTJcblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbjpcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkVRVUFMIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGVxdWFsXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5DT01QQVRJQkxFIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGNvbXBhdGlibGVcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkFOQ0VTVE9SIGlmIG9TdGF0ZTEgaXMgYW4gYW5jZXN0b3Igb2Ygb1N0YXRlMlxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuRElGRkVSRU5UIGlmIHRoZSAyIHN0YXRlcyBhcmUgZGlmZmVyZW50XG5cdCAqL1xuXG5cdF9jb21wYXJlQ2FjaGVTdGF0ZXMob1N0YXRlMTogYW55LCBvU3RhdGUyOiBhbnkpIHtcblx0XHQvLyBGaXJzdCBjb21wYXJlIG9iamVjdCBrZXlzXG5cdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPiBvU3RhdGUyLmtleXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDtcblx0XHR9XG5cdFx0bGV0IGVxdWFsID0gdHJ1ZTtcblx0XHRsZXQgaW5kZXg7XG5cdFx0Zm9yIChpbmRleCA9IDA7IGVxdWFsICYmIGluZGV4IDwgb1N0YXRlMS5rZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuXHRcdFx0aWYgKG9TdGF0ZTEua2V5c1tpbmRleF0gIT09IG9TdGF0ZTIua2V5c1tpbmRleF0pIHtcblx0XHRcdFx0ZXF1YWwgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFlcXVhbCkge1xuXHRcdFx0Ly8gU29tZSBvYmplY3RzIGtleXMgYXJlIGRpZmZlcmVudFxuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGtleXMgZnJvbSBvU3RhdGUxIGFyZSBpbiBvU3RhdGUyIC0tPiBjaGVjayBpZiBhbmNlc3RvclxuXHRcdGlmIChvU3RhdGUxLmtleXMubGVuZ3RoIDwgb1N0YXRlMi5rZXlzLmxlbmd0aCB8fCBvU3RhdGUxLnNjcmVlbk1vZGUgPCBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuQU5DRVNUT1I7XG5cdFx0fVxuXHRcdGlmIChvU3RhdGUxLnNjcmVlbk1vZGUgPiBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UOyAvLyBOb3Qgc3VyZSB0aGlzIGNhc2UgY2FuIGhhcHBlbi4uLlxuXHRcdH1cblxuXHRcdC8vIEF0IHRoaXMgc3RhZ2UsIHRoZSAyIHN0YXRlcyBoYXZlIHRoZSBzYW1lIG9iamVjdCBrZXlzIChpbiB0aGUgc2FtZSBvcmRlcikgYW5kIHNhbWUgc2NyZWVubW9kZVxuXHRcdC8vIFRoZXkgY2FuIGJlIGVpdGhlciBjb21wYXRpYmxlIG9yIGVxdWFsXG5cdFx0cmV0dXJuIG9TdGF0ZTEuc0xheW91dCA9PT0gb1N0YXRlMi5zTGF5b3V0ID8gZW51bVN0YXRlLkVRVUFMIDogZW51bVN0YXRlLkNPTVBBVElCTEU7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGJhY2sgZXhpdHMgdGhlIHByZXNlbnQgZ3VhcmQgc2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc1ByZXNlbnRIYXNoIFRoZSBjdXJyZW50IGhhc2guIE9ubHkgdXNlZCBmb3IgdW5pdCB0ZXN0cy5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGJhY2sgZXhpdHMgdGhlcmUgaXMgYSBndWFyZCBleGl0IG9uIGJhY2tcblx0ICovXG5cdGNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKHNQcmVzZW50SGFzaD86IHN0cmluZykge1xuXHRcdGxldCBzUHJldkhhc2g7XG5cdFx0bGV0IHNDdXJyZW50SGFzaDogc3RyaW5nO1xuXHRcdGlmIChzUHJlc2VudEhhc2ggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gV2UgdXNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoIGluc3RlYWQgb2YgSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCkgYmVjYXVzZSB0aGUgbGF0dGVyXG5cdFx0XHQvLyByZXBsYWNlcyBjaGFyYWN0ZXJzIGluIHRoZSBVUkwgKGUuZy4gJTI0IHJlcGxhY2VkIGJ5ICQpIGFuZCBpdCBjYXVzZXMgaXNzdWVzIHdoZW4gY29tcGFyaW5nXG5cdFx0XHQvLyB3aXRoIHRoZSBVUkxzIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRcdGNvbnN0IG9TcGxpdEhhc2ggPSB0aGlzLl9vU2hlbGxTZXJ2aWNlcy5zcGxpdEhhc2god2luZG93LmxvY2F0aW9uLmhhc2gpIGFzIGFueTtcblx0XHRcdGlmIChvU3BsaXRIYXNoICYmIG9TcGxpdEhhc2guYXBwU3BlY2lmaWNSb3V0ZSkge1xuXHRcdFx0XHRzQ3VycmVudEhhc2ggPSBvU3BsaXRIYXNoLmFwcFNwZWNpZmljUm91dGU7XG5cdFx0XHRcdGlmIChzQ3VycmVudEhhc2guaW5kZXhPZihcIiYvXCIpID09PSAwKSB7XG5cdFx0XHRcdFx0c0N1cnJlbnRIYXNoID0gc0N1cnJlbnRIYXNoLnN1YnN0cmluZygyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0N1cnJlbnRIYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpOyAvLyBUbyByZW1vdmUgdGhlICcjJ1xuXHRcdFx0XHRpZiAoc0N1cnJlbnRIYXNoWzBdID09PSBcIi9cIikge1xuXHRcdFx0XHRcdHNDdXJyZW50SGFzaCA9IHNDdXJyZW50SGFzaC5zdWJzdHJpbmcoMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c0N1cnJlbnRIYXNoID0gc1ByZXNlbnRIYXNoO1xuXHRcdH1cblx0XHRzUHJlc2VudEhhc2ggPSBVUkkuZGVjb2RlKHNDdXJyZW50SGFzaCk7XG5cdFx0aWYgKHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQpIHtcblx0XHRcdGZvciAobGV0IGkgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5W2ldLmhhc2ggPT09IHNQcmVzZW50SGFzaCkge1xuXHRcdFx0XHRcdHNQcmV2SGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gIXNQcmV2SGFzaCB8fCAhdGhpcy5jaGVja0hhc2hXaXRoR3VhcmQoc1ByZXZIYXNoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgbGFzdCAyIGVudHJpZXMgaW4gdGhlIGhpc3Rvcnkgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cblx0ICpcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZXkgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cblx0ICovXG5cdGNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQoKSB7XG5cdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPCAyKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV07XG5cdFx0Y29uc3Qgb1ByZXZpb3VzU3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDJdO1xuXG5cdFx0cmV0dXJuIG9DdXJyZW50U3RhdGUuaGFzaC5zcGxpdChcIj9cIilbMF0gPT09IG9QcmV2aW91c1N0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc3RvcmVzIHRoZSBmb2N1cyBmb3IgdGhlIGN1cnJlbnQgaGFzaCwgaWYgd2UgY2FuIGZpbmQgaXQgaW4gdGhlIGhpc3RvcnkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgZm9jdXMgd2FzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQgKi9cblx0cmVzdG9yZUZvY3VzRm9yQ3VycmVudEhhc2goKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY3VycmVudEhhc2ggPSByZW1vdmVBcHBTdGF0ZUluSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0Y29uc3Qgc3RhdGVGb3JIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LmZpbmQoKHN0YXRlKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc3RhdGUuaGFzaCkgPT09IGN1cnJlbnRIYXNoO1xuXHRcdH0pO1xuXG5cdFx0bGV0IGZvY3VzQXBwbGllZCA9IGZhbHNlO1xuXHRcdGlmIChzdGF0ZUZvckhhc2g/LmZvY3VzQ29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBmb2N1c0NvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoc3RhdGVGb3JIYXNoLmZvY3VzQ29udHJvbElkKTtcblx0XHRcdGZvY3VzQ29udHJvbD8uZm9jdXMoc3RhdGVGb3JIYXNoLmZvY3VzSW5mbyk7XG5cdFx0XHRmb2N1c0FwcGxpZWQgPSBmb2N1c0NvbnRyb2wgIT09IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm9jdXNBcHBsaWVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN0b3JlcyB0aGUgSUQgb2YgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGNvbnRyb2wgaW4gdGhlIGhpc3RvcnkgZm9yIHRoZSBjdXJyZW50IGhhc2guXG5cdCAqXG5cdCAqL1xuXHRwcml2YXRlIHN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2goKSB7XG5cdFx0Y29uc3QgY3VycmVudEhhc2ggPSByZW1vdmVBcHBTdGF0ZUluSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0Y29uc3Qgc3RhdGVGb3JIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LmZpbmQoKHN0YXRlKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc3RhdGUuaGFzaCkgPT09IGN1cnJlbnRIYXNoO1xuXHRcdH0pO1xuXHRcdGlmIChzdGF0ZUZvckhhc2gpIHtcblx0XHRcdGNvbnN0IGZvY3VzQ29udHJvbElkID0gc2FwLnVpLmdldENvcmUoKS5nZXRDdXJyZW50Rm9jdXNlZENvbnRyb2xJZCgpO1xuXHRcdFx0Y29uc3QgZm9jdXNDb250cm9sID0gZm9jdXNDb250cm9sSWQgPyBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoZm9jdXNDb250cm9sSWQpIDogdW5kZWZpbmVkO1xuXHRcdFx0c3RhdGVGb3JIYXNoLmZvY3VzQ29udHJvbElkID0gZm9jdXNDb250cm9sSWQ7XG5cdFx0XHRzdGF0ZUZvckhhc2guZm9jdXNJbmZvID0gZm9jdXNDb250cm9sPy5nZXRGb2N1c0luZm8oKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmluZHMgYSBsYXlvdXQgdmFsdWUgZm9yIGEgaGFzaCBpbiB0aGUgaGlzdG9yeS5cblx0ICpcblx0ICogQHBhcmFtIGhhc2ggVGhlIGhhc2ggdG8gbG9vayBmb3IgaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEByZXR1cm5zIEEgbGF5b3V0IHZhbHVlIGlmIGl0IGNvdWxkIGJlIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlLlxuXHQgKi9cblx0ZmluZExheW91dEZvckhhc2goaGFzaDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIXRoaXMuZmNsRW5hYmxlZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgYWxsIHF1ZXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgaGFzaFxuXHRcdGNvbnN0IGhhc2hOb1BhcmFtID0gaGFzaC5zcGxpdChcIj9cIilbMF07XG5cblx0XHQvLyBMb29rIGZvciB0aGUgc3RhdGUgYmFja3dhcmRzLCBzbyB0aGF0IHdlIGZpbmQgdGhlIGxhc3Qgc3RhdGUgaW4gdGhlIGhpc3RvcnkgKGUuZy4gaWYgd2UgaGF2ZSAyIHN0YXRlcyB3aXRoIHRoZSBzYW1lIGhhc2ggYnV0IDIgZGlmZmVyZW50IGxheW91dHMpXG5cdFx0bGV0IHRhcmdldFN0YXRlOiBhbnk7XG5cdFx0Zm9yIChsZXQgaW5kZXggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaW5kZXggPj0gMCAmJiB0YXJnZXRTdGF0ZSA9PT0gdW5kZWZpbmVkOyBpbmRleC0tKSB7XG5cdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5W2luZGV4XS5oYXNoLnNwbGl0KFwiP1wiKVswXSA9PT0gaGFzaE5vUGFyYW0pIHtcblx0XHRcdFx0dGFyZ2V0U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaW5kZXhdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXRT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
909
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnVtU3RhdGUiLCJFUVVBTCIsIkNPTVBBVElCTEUiLCJBTkNFU1RPUiIsIkRJRkZFUkVOVCIsImVudW1VUkxQYXJhbXMiLCJMQVlPVVRQQVJBTSIsIklBUFBTVEFURVBBUkFNIiwiY3JlYXRlR3VhcmRGcm9tSGFzaCIsInNHdWFyZEhhc2giLCJfZ3VhcmRIYXNoIiwicmVwbGFjZSIsImNoZWNrIiwic0hhc2giLCJpbmRleE9mIiwicmVtb3ZlQXBwU3RhdGVJbkhhc2giLCJSZWdFeHAiLCJSb3V0ZXJQcm94eSIsImRlZmluZVVJNUNsYXNzIiwiYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nIiwiYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSIsImJJc0d1YXJkQ3Jvc3NBbGxvd2VkIiwic0lBcHBTdGF0ZUtleSIsIl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybyIsIl9iQXBwbHlSZXN0b3JlIiwiX2JEZWxheWVkUmVidWlsZCIsIl9wYXRoTWFwcGluZ3MiLCJyZXN0b3JlSGlzdG9yeVRyaWdnZXJlZCIsImluaXQiLCJvQXBwQ29tcG9uZW50IiwiaXNmY2xFbmFibGVkIiwiZ2V0U2VydmljZSIsInRoZW4iLCJfb1NoZWxsU2VydmljZXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwiaW5pdFJhdyIsImdldFJvdXRlciIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmZUxldmVsIiwic3RhdGUiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImZjbEVuYWJsZWQiLCJfZm5CbG9ja2luZ05hdkZpbHRlciIsIl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIiLCJiaW5kIiwicmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIl9mbkhhc2hHdWFyZCIsImhhc2hHdWFyZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJfYkRpc2FibGVPbkhhc2hDaGFuZ2UiLCJfYklnbm9yZVJlc3RvcmUiLCJfYkZvcmNlRm9jdXMiLCJkZXN0cm95IiwidW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0QXBwU3RhdGVJbkhhc2giLCJzQXBwU3RhdGVLZXkiLCJzTmV3SGFzaCIsImluY2x1ZGVzIiwiZmluZEFwcFN0YXRlSW5IYXNoIiwiYUFwcFN0YXRlIiwibWF0Y2giLCJsZW5ndGgiLCJnZXREZWNvZGVkV2luZG93SGFzaCIsImRlY29kZVVSSSIsImhhc2giLCJvUm91dGVyIiwiX29Sb3V0ZXIiLCJfb01hbmFnZWRIaXN0b3J5IiwiX29OYXZpZ2F0aW9uR3VhcmQiLCJzQ3VycmVudEFwcEhhc2giLCJnZXRIYXNoIiwicHVzaCIsIl9leHRyYWN0U3RhdGVGcm9tSGFzaCIsImFwcE5hbWUiLCJnZXRBcHBOYW1lRnJvbUhhc2giLCJnZXRGdWxsSGFzaCIsInNwbGl0SGFzaCIsImFwcFNwZWNpZmljUm91dGUiLCJzdWJzdHJpbmciLCJnZXRIYXNoQ2hhbmdlciIsInNoZWxsUGFydCIsImlzRm9jdXNGb3JjZWQiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZWQiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJuYXZUb0hhc2giLCJiUHJlc2VydmVIaXN0b3J5IiwiYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSIsImJGb3JjZUZvY3VzIiwiYlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXIiLCJzZXRCYWNrTmF2aWdhdGlvbiIsIl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsIndhaXRGb3IiLCJ1bmRlZmluZWQiLCJfaW50ZXJuYWxOYXZUb0hhc2giLCJjaGVja0hhc2hXaXRoR3VhcmQiLCJvUmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiY29uZmlybSIsImdldFRleHQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9OZXdTdGF0ZSIsImFDdXJyZW50SGFzaEtleXMiLCJfZXh0cmFjdEVudGl0eVNldHNGcm9tSGFzaCIsImtleXMiLCJldmVyeSIsImtleSIsImluZGV4Iiwib0hpc3RvcnlBY3Rpb24iLCJfcHVzaE5ld1N0YXRlIiwic3RvcmVGb2N1c0luZm9Gb3JDdXJyZW50SGFzaCIsIl9yZWJ1aWxkQnJvd3Nlckhpc3RvcnkiLCJyZXN0b3JlSGlzdG9yeSIsInNUYXJnZXRIYXNoIiwiY2hlY2tSZXN0b3JlSGlzdG9yeVdhc1RyaWdnZXJlZCIsInJlc2V0UmVzdG9yZUhpc3RvcnlGbGFnIiwibmF2QmFjayIsInNDdXJyZW50SGFzaCIsInNQcmV2aW91c0hhc2giLCJpIiwiYmFjayIsIm5hdlRvIiwic1JvdXRlTmFtZSIsIm9QYXJhbWV0ZXJzIiwiZ2V0VVJMIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImJJc1N0aWNreU1vZGUiLCJleGl0RnJvbUFwcCIsImJhY2tUb1ByZXZpb3VzQXBwIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5Iiwib0xvY2FsR3VhcmQiLCJpc05hdmlnYXRpb25GaW5hbGl6ZWQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsInJlc29sdmVSb3V0ZU1hdGNoIiwiU3luY2hyb25pemF0aW9uIiwic0hhc2hOb1BhcmFtcyIsInNwbGl0IiwiYVRva2VucyIsIm5hbWVzIiwiZm9yRWFjaCIsInNUb2tlbiIsIm9TdGF0ZSIsImFMYXlvdXQiLCJzTGF5b3V0Iiwic2NyZWVuTW9kZSIsImJSZWJ1aWxkT25seSIsImJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiIsInNlZ21lbnRzIiwic3BsaXRBcHBTcGVjaWZpY1JvdXRlIiwibGFzdEluZGV4IiwiaVBvcENvdW50IiwicG9wIiwicHJlc2VydmVkIiwib0xhc3RSZW1vdmVkSXRlbSIsIm9Ub3BTdGF0ZSIsIl9jb21wYXJlQ2FjaGVTdGF0ZXMiLCJzUHJldmlvdXNJQXBwU3RhdGVLZXkiLCJvQ29tcGFyaXNvblN0YXRlUmVzdWx0IiwiYkhhc1NhbWVIYXNoIiwiZm9jdXNDb250cm9sSWQiLCJmb2N1c0luZm8iLCJ0eXBlIiwic3RlcHMiLCJfZGlzYWJsZUV2ZW50T25IYXNoQ2hhbmdlIiwic3RvcCIsIl9lbmFibGVFdmVudE9uSGFzaENoYW5nZSIsImJJZ25vcmVDdXJyZW50SGFzaCIsImluaXRpYWxpemUiLCJ0aGF0Iiwib1RhcmdldFN0YXRlIiwibmV3TGV2ZWwiLCJyZXBsYWNlQXN5bmMiLCJyZXBsYWNlSGFzaCIsInNldFRpbWVvdXQiLCJiYWNrUmVwbGFjZUFzeW5jIiwiYmFja0FzeW5jIiwic2V0SGFzaCIsImdvIiwiZ2V0TGFzdEhpc3RvcnlFbnRyeSIsInNldFBhdGhNYXBwaW5nIiwibWFwcGluZ3MiLCJmaWx0ZXIiLCJtYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjdXJyZW50QXBwTmFtZSIsImZpbmQiLCJtIiwiZW5jb2RlVVJJIiwiYUhhc2hTcGxpdCIsInNBcHBIYXNoIiwib1N0YXRlMSIsIm9TdGF0ZTIiLCJlcXVhbCIsInJvdXRlU3BsaXQiLCJzaGlmdCIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwicHJldmlvdXNIYXNoIiwiY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCIsIm9DdXJyZW50U3RhdGUiLCJvUHJldmlvdXNTdGF0ZSIsInJlc3RvcmVGb2N1c0ZvckN1cnJlbnRIYXNoIiwiY3VycmVudEhhc2giLCJzdGF0ZUZvckhhc2giLCJmb2N1c0FwcGxpZWQiLCJmb2N1c0NvbnRyb2wiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJieUlkIiwiZm9jdXMiLCJnZXRDdXJyZW50Rm9jdXNlZENvbnRyb2xJZCIsImdldEZvY3VzSW5mbyIsImZpbmRMYXlvdXRGb3JIYXNoIiwiaGFzaE5vUGFyYW0iLCJ0YXJnZXRTdGF0ZSIsIkJhc2VPYmplY3QiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlJvdXRlclByb3h5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgU3luY2hyb25pemF0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N5bmNocm9uaXphdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBJU2hlbGxTZXJ2aWNlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaGVsbFNlcnZpY2VzRmFjdG9yeVwiO1xuaW1wb3J0IEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcblxuY29uc3QgZW51bVN0YXRlID0ge1xuXHRFUVVBTDogMCxcblx0Q09NUEFUSUJMRTogMSxcblx0QU5DRVNUT1I6IDIsXG5cdERJRkZFUkVOVDogM1xufTtcbmNvbnN0IGVudW1VUkxQYXJhbXMgPSB7XG5cdExBWU9VVFBBUkFNOiBcImxheW91dFwiLFxuXHRJQVBQU1RBVEVQQVJBTTogXCJzYXAtaWFwcC1zdGF0ZVwiXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBIYXNoR3VhcmQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBzR3VhcmRIYXNoIFRoZSBoYXNoIHVzZWQgZm9yIHRoZSBndWFyZFxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQgaGFzaCBndWFyZFxuICovXG5mdW5jdGlvbiBjcmVhdGVHdWFyZEZyb21IYXNoKHNHdWFyZEhhc2g6IHN0cmluZykge1xuXHRyZXR1cm4ge1xuXHRcdF9ndWFyZEhhc2g6IHNHdWFyZEhhc2gucmVwbGFjZSgvXFw/W14/XSokLywgXCJcIiksIC8vIFJlbW92ZSBxdWVyeSBwYXJ0XG5cdFx0Y2hlY2s6IGZ1bmN0aW9uIChzSGFzaDogYW55KSB7XG5cdFx0XHRyZXR1cm4gc0hhc2guaW5kZXhPZih0aGlzLl9ndWFyZEhhc2gpID09PSAwO1xuXHRcdH1cblx0fTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGhhc2ggd2l0aG91dCBpdHMgaUFwcFN0YXRlIHBhcnQuXG4gKlxuICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoXG4gKiBAcmV0dXJucyBUaGUgaGFzaCB3aXRob3V0IHRoZSBpQXBwU3RhdGVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc0hhc2g6IHN0cmluZykge1xuXHRyZXR1cm4gc0hhc2gucmVwbGFjZShuZXcgUmVnRXhwKGBbJj9dKiR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09W14mXSpgKSwgXCJcIik7XG59XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLlJvdXRlclByb3h5XCIpXG5jbGFzcyBSb3V0ZXJQcm94eSBleHRlbmRzIEJhc2VPYmplY3Qge1xuXHRiSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblxuXHRiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5ID0gZmFsc2U7XG5cblx0YklzR3VhcmRDcm9zc0FsbG93ZWQgPSBmYWxzZTtcblxuXHRzSUFwcFN0YXRlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuXHRfb1NoZWxsU2VydmljZXMhOiBJU2hlbGxTZXJ2aWNlcztcblxuXHRmY2xFbmFibGVkITogYm9vbGVhbjtcblxuXHRfZm5CbG9ja2luZ05hdkZpbHRlciE6IEZ1bmN0aW9uO1xuXG5cdF9mbkhhc2hHdWFyZCE6IEZ1bmN0aW9uO1xuXG5cdF9iRGlzYWJsZU9uSGFzaENoYW5nZSE6IGJvb2xlYW47XG5cblx0X2JJZ25vcmVSZXN0b3JlITogYm9vbGVhbjtcblxuXHRfYkZvcmNlRm9jdXMhOiBib29sZWFuO1xuXG5cdF9vUm91dGVyITogUm91dGVyO1xuXG5cdF9vTWFuYWdlZEhpc3RvcnkhOiBhbnlbXTtcblxuXHRfb05hdmlnYXRpb25HdWFyZDogYW55O1xuXG5cdG9SZXNvdXJjZUJ1bmRsZT86IFJlc291cmNlQnVuZGxlO1xuXG5cdF9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbj86IFN5bmNocm9uaXphdGlvbjtcblxuXHRfYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSBmYWxzZTtcblxuXHRfYkFwcGx5UmVzdG9yZSA9IGZhbHNlO1xuXG5cdF9iRGVsYXllZFJlYnVpbGQgPSBmYWxzZTtcblxuXHRfcGF0aE1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdHJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gZmFsc2U7XG5cblx0YXBwTmFtZSE6IHN0cmluZztcblxuXHRpbml0KG9BcHBDb21wb25lbnQ6IGFueSwgaXNmY2xFbmFibGVkOiBib29sZWFuKSB7XG5cdFx0Ly8gU2F2ZSB0aGUgbmFtZSBvZiB0aGUgYXBwIChpbmNsdWRpbmcgc3RhcnR1cCBwYXJhbWV0ZXJzKSBmb3IgcmVidWlsZGluZyBmdWxsIGhhc2hlcyBsYXRlclxuXHRcdG9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwic2hlbGxTZXJ2aWNlc1wiKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXG5cdFx0XHRcdHRoaXMuaW5pdFJhdyhvQXBwQ29tcG9uZW50LmdldFJvdXRlcigpKTtcblx0XHRcdFx0Ly8gV2Ugd2FudCB0byB3YWl0IHVudGlsIHRoZSBpbml0aWFsIHJvdXRlTWF0Y2hlZCBpcyBkb25lIGJlZm9yZSBkb2luZyBhbnkgbmF2aWdhdGlvblxuXHRcdFx0XHR0aGlzLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXG5cdFx0XHRcdC8vIFNldCBmZUxldmVsPTAgZm9yIHRoZSBmaXJzdCBBcHBsaWNhdGlvbiBwYWdlIGluIHRoZSBoaXN0b3J5XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuXHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGZlTGV2ZWw6IDBcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRoaXN0b3J5LnN0YXRlXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcIlwiLFxuXHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbiBhcyBhbnlcblx0XHRcdFx0KTtcblx0XHRcdFx0dGhpcy5mY2xFbmFibGVkID0gaXNmY2xFbmFibGVkO1xuXG5cdFx0XHRcdHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIgPSB0aGlzLl9ibG9ja2luZ05hdmlnYXRpb25GaWx0ZXIuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMucmVnaXN0ZXJOYXZpZ2F0aW9uRmlsdGVyKHRoaXMuX2ZuQmxvY2tpbmdOYXZGaWx0ZXIpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBzaGVsbCBzZXJ2aWNlc1wiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0dGhpcy5fZm5IYXNoR3VhcmQgPSB0aGlzLmhhc2hHdWFyZC5iaW5kKHRoaXMpO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQgYXMgYW55KTtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IGZhbHNlO1xuXHRcdHRoaXMuX2JJZ25vcmVSZXN0b3JlID0gZmFsc2U7XG5cdFx0dGhpcy5fYkZvcmNlRm9jdXMgPSB0cnVlOyAvLyBUcmlnZ2VyIHRoZSBmb2N1cyBtZWNoYW5pc20gZm9yIHRoZSBmaXJzdCB2aWV3IGRpc3BsYXllZCBieSB0aGUgYXBwXG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdGlmICh0aGlzLl9vU2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0dGhpcy5fb1NoZWxsU2VydmljZXMudW5yZWdpc3Rlck5hdmlnYXRpb25GaWx0ZXIodGhpcy5fZm5CbG9ja2luZ05hdkZpbHRlcik7XG5cdFx0fVxuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5fZm5IYXNoR3VhcmQgYXMgYW55KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGFuIGlBcHBTdGF0ZSBpbnNpZGUgYSBoYXNoIChvciByZXBsYWNlcyBhbiBleGlzdGluZyBvbmUpLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2hcblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUgaUFwcFN0YXRlIHRvIGFkZFxuXHQgKiBAcmV0dXJucyBUaGUgaGFzaCB3aXRoIHRoZSBhcHAgc3RhdGVcblx0ICovXG5cdHNldEFwcFN0YXRlSW5IYXNoKHNIYXNoOiBzdHJpbmcsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgc05ld0hhc2g6IHN0cmluZztcblxuXHRcdGlmIChzSGFzaC5pbmNsdWRlcyhlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNKSkge1xuXHRcdFx0Ly8gSWYgdGhlcmUncyBhbHJlYWR5IGFuIGlBcHBTdGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIGhhc2gsIHJlcGxhY2UgaXRcblx0XHRcdHNOZXdIYXNoID0gc0hhc2gucmVwbGFjZShcblx0XHRcdFx0bmV3IFJlZ0V4cChgJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT1bXiZdKmApLFxuXHRcdFx0XHRgJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT0ke3NBcHBTdGF0ZUtleX1gXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBBZGQgdGhlIGlBcHBTdGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIGhhc2hcblx0XHRcdGlmICghc0hhc2guaW5jbHVkZXMoXCI/XCIpKSB7XG5cdFx0XHRcdHNOZXdIYXNoID0gYCR7c0hhc2h9P2A7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzTmV3SGFzaCA9IGAke3NIYXNofSZgO1xuXHRcdFx0fVxuXHRcdFx0c05ld0hhc2ggKz0gYCR7ZW51bVVSTFBhcmFtcy5JQVBQU1RBVEVQQVJBTX09JHtzQXBwU3RhdGVLZXl9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4gc05ld0hhc2g7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgaUFwcFN0YXRlIHBhcnQgZnJvbSBhIGhhc2ggKG9yIG51bGwgaWYgbm90IGZvdW5kKS5cblx0ICpcblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoXG5cdCAqIEByZXR1cm5zIFRoZSBpQXBwU3RhdGUgcGFydCBvZiB0aGUgaGFzaFxuXHQgKi9cblx0ZmluZEFwcFN0YXRlSW5IYXNoKHNIYXNoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRjb25zdCBhQXBwU3RhdGUgPSBzSGFzaC5tYXRjaChuZXcgUmVnRXhwKGBcXFxcPy4qJHtlbnVtVVJMUGFyYW1zLklBUFBTVEFURVBBUkFNfT0oW14mXSopYCkpO1xuXHRcdHJldHVybiBhQXBwU3RhdGUgJiYgYUFwcFN0YXRlLmxlbmd0aCA+IDEgPyBhQXBwU3RhdGVbMV0gOiBudWxsO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXREZWNvZGVkV2luZG93SGFzaCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBkZWNvZGVVUkkod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJhdyBpbml0aWFsaXphdGlvbiAoZm9yIHVuaXQgdGVzdHMpLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1JvdXRlciBUaGUgcm91dGVyIHVzZWQgYnkgdGhpcyBwcm94eVxuXHQgKi9cblx0aW5pdFJhdyhvUm91dGVyOiBSb3V0ZXIpIHtcblx0XHR0aGlzLl9vUm91dGVyID0gb1JvdXRlcjtcblx0XHR0aGlzLl9vTWFuYWdlZEhpc3RvcnkgPSBbXTtcblx0XHR0aGlzLl9vTmF2aWdhdGlvbkd1YXJkID0gbnVsbDtcblxuXHRcdGNvbnN0IHNDdXJyZW50QXBwSGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wdXNoKHRoaXMuX2V4dHJhY3RTdGF0ZUZyb21IYXNoKHNDdXJyZW50QXBwSGFzaCkpO1xuXG5cdFx0dGhpcy5hcHBOYW1lID0gdGhpcy5nZXRBcHBOYW1lRnJvbUhhc2godGhpcy5nZXREZWNvZGVkV2luZG93SGFzaCgpKTtcblxuXHRcdC8vIFNldCB0aGUgaUFwcFN0YXRlIGlmIHRoZSBpbml0aWFsIGhhc2ggY29udGFpbnMgb25lXG5cdFx0dGhpcy5zSUFwcFN0YXRlS2V5ID0gdGhpcy5maW5kQXBwU3RhdGVJbkhhc2goc0N1cnJlbnRBcHBIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBmdWxsIGFwcC1zcGVjaWZpYyBoYXNoIHBhcnQgZnJvbSB3aW5kb3cubG9jYXRpb24uaGFzaC5cblx0ICpcblx0ICogQ29tcGFyZWQgdG8ge0BsaW5rIGdldEhhc2h9IHRoaXMgZnVuY3Rpb24gaW5jbHVkZXMgc3ViLXJvdXRlcyBvZiBuZXN0ZWQgY29tcG9uZW50cy5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGFwcC1zcGVjaWZpYyBoYXNoIHBhcnQgKGkuZS4sIHdpdGhvdXQgdGhlIHNoZWxsIHBhcnQpLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm9uZS5cblx0ICovXG5cdGdldEZ1bGxIYXNoKCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc3BsaXRIYXNoID0gdGhpcy5fb1NoZWxsU2VydmljZXMuc3BsaXRIYXNoKHRoaXMuZ2V0RGVjb2RlZFdpbmRvd0hhc2goKSk7XG5cblx0XHRpZiAoXCJhcHBTcGVjaWZpY1JvdXRlXCIgaW4gc3BsaXRIYXNoKSB7XG5cdFx0XHRyZXR1cm4gKHNwbGl0SGFzaC5hcHBTcGVjaWZpY1JvdXRlIGFzIHN0cmluZyk/LnN1YnN0cmluZygyKSA/PyBcIlwiOyAvLyByZW1vdmUgdGhlIGxlYWRpbmcgXCImL1wiXG5cdFx0fVxuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0Z2V0SGFzaCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuZ2V0SGFzaCgpID8/IFwiXCI7XG5cdH1cblxuXHRwcm90ZWN0ZWQgZ2V0QXBwTmFtZUZyb21IYXNoKGhhc2g6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc3BsaXRIYXNoID0gdGhpcy5fb1NoZWxsU2VydmljZXM/LnNwbGl0SGFzaChoYXNoKSBhcyB7IHNoZWxsUGFydDogc3RyaW5nOyBhcHBTcGVjaWZpY1JvdXRlOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4gc3BsaXRIYXNoPy5zaGVsbFBhcnQgPz8gXCJcIjtcblx0fVxuXG5cdGlzRm9jdXNGb3JjZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2JGb3JjZUZvY3VzO1xuXHR9XG5cblx0c2V0Rm9jdXNGb3JjZWQoYkZvcmNlZDogYm9vbGVhbikge1xuXHRcdHRoaXMuX2JGb3JjZUZvY3VzID0gYkZvcmNlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNldHMgdGhlIGludGVybmFsIHZhcmlhYmxlIHNJQXBwU3RhdGVLZXkuXG5cdCAqXG5cdCAqL1xuXHRyZW1vdmVJQXBwU3RhdGVLZXkoKSB7XG5cdFx0dGhpcy5zSUFwcFN0YXRlS2V5ID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBoYXNoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0hhc2ggSGFzaCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgSWYgc2V0IHRvIHRydWUsIG5vbi1hbmNlc3RvciBlbnRyaWVzIGluIGhpc3Rvcnkgd2lsbCBiZSByZXRhaW5lZFxuXHQgKiBAcGFyYW0gYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSBJZiBzZXQgdG8gdHJ1ZSwgY2FjaGUgcHJlc2VydmF0aW9uIG1lY2hhbmlzbSBpcyBkaXNhYmxlZCBmb3IgdGhlIGN1cnJlbnQgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gYkZvcmNlRm9jdXMgSWYgc2V0IHRvIHRydWUsIHRoZSBsb2dpYyB0byBzZXQgdGhlIGZvY3VzIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkIHdpbGwgYmUgdHJpZ2dlcmVkIChvblBhZ2VSZWFkeSlcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZVNoZWxsQmFja05hdmlnYXRpb25IYW5kbGVyIElmIG5vdCBzZXQgdG8gZmFsc2UsIHRoZSBiYWNrIG5hdmlnYXRpb24gaXMgc2V0IHRvIHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIChyZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZCkgdGhhdCByZXR1cm5zICd0cnVlJyBpZiBhIG5hdmlnYXRpb24gdG9vayBwbGFjZSwgJ2ZhbHNlJyBpZiB0aGUgbmF2aWdhdGlvbiBkaWRuJ3QgaGFwcGVuXG5cdCAqL1xuXHRuYXZUb0hhc2goXG5cdFx0c0hhc2g6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlPzogYm9vbGVhbixcblx0XHRiRm9yY2VGb2N1cz86IGJvb2xlYW4sXG5cdFx0YlByZXNlcnZlU2hlbGxCYWNrTmF2aWdhdGlvbkhhbmRsZXI/OiBib29sZWFuXG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmIChiUHJlc2VydmVTaGVsbEJhY2tOYXZpZ2F0aW9uSGFuZGxlciAhPT0gZmFsc2UpIHtcblx0XHRcdHRoaXMuX29TaGVsbFNlcnZpY2VzLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbikge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uLndhaXRGb3IoKS50aGVuKCgpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9pbnRlcm5hbE5hdlRvSGFzaChzSGFzaCwgYlByZXNlcnZlSGlzdG9yeSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZSwgYkZvcmNlRm9jdXMpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLl9iQWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hybykge1xuXHRcdFx0XHR0aGlzLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuX2ludGVybmFsTmF2VG9IYXNoKHNIYXNoLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlLCBiRm9yY2VGb2N1cyk7XG5cdFx0fVxuXHR9XG5cblx0X2ludGVybmFsTmF2VG9IYXNoKHNIYXNoOiBhbnksIGJQcmVzZXJ2ZUhpc3Rvcnk6IGFueSwgYkRpc2FibGVQcmVzZXJ2YXRpb25DYWNoZTogYW55LCBiRm9yY2VGb2N1cz86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyBBZGQgdGhlIGFwcCBzdGF0ZSBpbiB0aGUgaGFzaCBpZiBuZWVkZWRcblx0XHRpZiAodGhpcy5mY2xFbmFibGVkICYmIHRoaXMuc0lBcHBTdGF0ZUtleSAmJiAhdGhpcy5maW5kQXBwU3RhdGVJbkhhc2goc0hhc2gpKSB7XG5cdFx0XHRzSGFzaCA9IHRoaXMuc2V0QXBwU3RhdGVJbkhhc2goc0hhc2gsIHRoaXMuc0lBcHBTdGF0ZUtleSk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmNoZWNrSGFzaFdpdGhHdWFyZChzSGFzaCkpIHtcblx0XHRcdGlmICghdGhpcy5vUmVzb3VyY2VCdW5kbGUpIHtcblx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSBoYXZlIHRvIHVzZSBhIGNvbmZpcm0gaGVyZSBmb3IgVUkgY29uc2lzdGVuY3kgcmVhc29ucywgYXMgd2l0aCBzb21lIHNjZW5hcmlvc1xuXHRcdFx0Ly8gaW4gdGhlIEVkaXRGbG93IHdlIHJlbHkgb24gYSBVSTUgbWVjaGFuaXNtIHRoYXQgZGlzcGxheXMgYSBjb25maXJtIGRpYWxvZy5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hbGVydFxuXHRcdFx0aWYgKCFjb25maXJtKHRoaXMub1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1JPVVRFUl9QUk9YWV9TQVBGRV9FWElUX05PVFNBVkVEX01FU1NBR0VcIikpKSB7XG5cdFx0XHRcdC8vIFRoZSB1c2VyIGNsaWNrZWQgb24gQ2FuY2VsIC0tPiBjYW5jZWwgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYklzR3VhcmRDcm9zc0FsbG93ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEluIGNhc2UgdGhlIG5hdmlnYXRpb24gd2lsbCBjYXVzZSBhIG5ldyB2aWV3IHRvIGJlIGRpc3BsYXllZCwgd2UgZm9yY2UgdGhlIGZvY3VzXG5cdFx0Ly8gSS5lLiBpZiB0aGUga2V5cyBmb3IgdGhlIGhhc2ggd2UncmUgbmF2aWdhdGluZyB0byBpcyBhIHN1cGVyc2V0IG9mIHRoZSBjdXJyZW50IGhhc2gga2V5cy5cblx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzSGFzaCk7XG5cdFx0aWYgKCF0aGlzLl9iRm9yY2VGb2N1cykge1xuXHRcdFx0Ly8gSWYgdGhlIGZvY3VzIHdhcyBhbHJlYWR5IGZvcmNlZCwga2VlcCBpdFxuXHRcdFx0Y29uc3QgYUN1cnJlbnRIYXNoS2V5cyA9IHRoaXMuX2V4dHJhY3RFbnRpdHlTZXRzRnJvbUhhc2godGhpcy5nZXRIYXNoKCkpO1xuXHRcdFx0dGhpcy5fYkZvcmNlRm9jdXMgPVxuXHRcdFx0XHRiRm9yY2VGb2N1cyB8fFxuXHRcdFx0XHQoYUN1cnJlbnRIYXNoS2V5cy5sZW5ndGggPCBvTmV3U3RhdGUua2V5cy5sZW5ndGggJiZcblx0XHRcdFx0XHRhQ3VycmVudEhhc2hLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXk6IGFueSwgaW5kZXg6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGtleSA9PT0gb05ld1N0YXRlLmtleXNbaW5kZXhdO1xuXHRcdFx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHRjb25zdCBvSGlzdG9yeUFjdGlvbiA9IHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBiUHJlc2VydmVIaXN0b3J5LCBiRGlzYWJsZVByZXNlcnZhdGlvbkNhY2hlKTtcblx0XHR0aGlzLnN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2goKTtcblxuXHRcdHJldHVybiB0aGlzLl9yZWJ1aWxkQnJvd3Nlckhpc3Rvcnkob0hpc3RvcnlBY3Rpb24sIGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhcnMgYnJvd3NlciBoaXN0b3J5IGlmIGVudHJpZXMgaGF2ZSBiZWVuIGFkZGVkIHdpdGhvdXQgdXNpbmcgdGhlIFJvdXRlclByb3h5LlxuXHQgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBoaXN0b3J5IGFjY29yZGluZ2x5LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgaGlzdG9yeSBpcyByZWJ1aWx0XG5cdCAqL1xuXHRyZXN0b3JlSGlzdG9yeSgpIHtcblx0XHRpZiAodGhpcy5fYkFwcGx5UmVzdG9yZSkge1xuXHRcdFx0dGhpcy5fYkFwcGx5UmVzdG9yZSA9IGZhbHNlO1xuXHRcdFx0bGV0IHNUYXJnZXRIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG5cdFx0XHRzVGFyZ2V0SGFzaCA9IHNUYXJnZXRIYXNoLnJlcGxhY2UoLyhcXD98JilyZXN0b3JlSGlzdG9yeT10cnVlLywgXCJcIik7XG5cdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzVGFyZ2V0SGFzaCk7XG5cblx0XHRcdGNvbnN0IG9IaXN0b3J5QWN0aW9uID0gdGhpcy5fcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuXG5cdFx0XHR0aGlzLnJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gdHJ1ZTtcblx0XHRcdHJldHVybiB0aGlzLl9yZWJ1aWxkQnJvd3Nlckhpc3Rvcnkob0hpc3RvcnlBY3Rpb24sIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBSZXN0b3JlSGlzdG9yeSBoYXMgYmVlbiB0cmlnZ2VyZWQgb24gdGhlIFJvdXRlclByb3h5LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGl0IGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0Y2hlY2tSZXN0b3JlSGlzdG9yeVdhc1RyaWdnZXJlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5yZXN0b3JlSGlzdG9yeVRyaWdnZXJlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNldHMgdGhlIGZsYWcgdGhhdCBzYXlzIGlmIFJlc3RvcmVIaXN0b3J5IGhhcyBiZWVuIHRyaWdnZXJlZCBvbiB0aGUgUm91dGVyUHJveHkuXG5cdCAqL1xuXHRyZXNldFJlc3RvcmVIaXN0b3J5RmxhZygpOiB2b2lkIHtcblx0XHR0aGlzLnJlc3RvcmVIaXN0b3J5VHJpZ2dlcmVkID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gdGhlIGhpc3RvcnkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKi9cblx0bmF2QmFjaygpIHtcblx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0XHRsZXQgc1ByZXZpb3VzSGFzaDtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSBjdXJyZW50IGhhc2ggaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGZvciAobGV0IGkgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpXS5oYXNoID09PSBzQ3VycmVudEhhc2gpIHtcblx0XHRcdFx0c1ByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNQcmV2aW91c0hhc2gpIHtcblx0XHRcdHJldHVybiB0aGlzLm5hdlRvSGFzaChzUHJldmlvdXNIYXNoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCBhIHByZXZpb3VzIGhhc2ggaW4gaGlzdG9yeVxuXHRcdFx0Ly8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgdHJhbnNpZW50IGhhc2ggaW4gYSBjcmVhdGUgYXBwLCBhbmRcblx0XHRcdC8vIGluIHRoYXQgY2FzZSBoaXN0b3J5LmJhY2sgd291bGQgZ28gYmFjayB0byB0aGUgRkxQXG5cdFx0XHR3aW5kb3cuaGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHJvdXRlIHdpdGggcGFyYW1ldGVycy5cblx0ICpcblx0ICogQHBhcmFtIHNSb3V0ZU5hbWUgVGhlIHJvdXRlIG5hbWUgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBvUGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdG5hdlRvKHNSb3V0ZU5hbWU6IHN0cmluZywgb1BhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlci5nZXRVUkwoc1JvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHRcdHJldHVybiB0aGlzLm5hdlRvSGFzaChzSGFzaCwgZmFsc2UsIG9QYXJhbWV0ZXJzLm5vUHJlc2VydmF0aW9uQ2FjaGUsIGZhbHNlLCAhb1BhcmFtZXRlcnMuYklzU3RpY2t5TW9kZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhpdHMgdGhlIGN1cnJlbnQgYXBwIGJ5IG5hdmlnYXRpbmcgYmFja1xuXHQgKiB0byB0aGUgcHJldmlvdXMgYXBwIChpZiBhbnkpIG9yIHRoZSBGTFAuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHdlIGV4aXQgdGhlIGFwcFxuXHQgKi9cblx0ZXhpdEZyb21BcHAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaGVsbFNlcnZpY2VzLmJhY2tUb1ByZXZpb3VzQXBwKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBoYXNoIGNhbiBoYXZlIGFuIGltcGFjdCBvbiB0aGUgY3VycmVudCBzdGF0ZVxuXHQgKiBpLmUuIGlmIHRoZSBoYXNoIGlzIGVxdWFsLCBjb21wYXRpYmxlIG9yIGFuIGFuY2VzdG9yIG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0hhc2ggYHRydWVgIGlmIHRoZXJlIGlzIGFuIGltcGFjdFxuXHQgKiBAcmV0dXJucyBJZiB0aGVyZSBpcyBhbiBpbXBhY3Rcblx0ICovXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShzSGFzaDogYW55KSB7XG5cdFx0aWYgKHNIYXNoWzBdID09PSBcIi9cIikge1xuXHRcdFx0c0hhc2ggPSBzSGFzaC5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXHRcdGNvbnN0IG9Mb2NhbEd1YXJkID0gY3JlYXRlR3VhcmRGcm9tSGFzaChzSGFzaCk7XG5cdFx0cmV0dXJuIG9Mb2NhbEd1YXJkLmNoZWNrKHRoaXMuZ2V0SGFzaCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIGBmYWxzZWAgaWYgYSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBpbiB0aGUgUm91dGVyUHJveHkgYW5kIGlzIG5vdCB5ZXQgZmluYWxpemVkXG5cdCAqL1xuXHRpc05hdmlnYXRpb25GaW5hbGl6ZWQoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyAmJiAhdGhpcy5fYkRlbGF5ZWRSZWJ1aWxkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGxhc3Qgc3RhdGUgYXMgYSBndWFyZC5cblx0ICogRWFjaCBmdXR1cmUgbmF2aWdhdGlvbiB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGlzIGd1YXJkLCBhbmQgYSBjb25maXJtYXRpb24gZGlhbG9nIHdpbGxcblx0ICogYmUgZGlzcGxheWVkIGJlZm9yZSB0aGUgbmF2aWdhdGlvbiBjcm9zc2VzIHRoZSBndWFyZCAoaS5lLiBnb2VzIHRvIGFuIGFuY2VzdG9yIG9mIHRoZSBndWFyZCkuXG5cdCAqXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCBmb3IgdGhlIGd1YXJkXG5cdCAqL1xuXHRzZXROYXZpZ2F0aW9uR3VhcmQoc0hhc2g6IHN0cmluZykge1xuXHRcdHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQgPSBjcmVhdGVHdWFyZEZyb21IYXNoKHNIYXNoKTtcblx0XHR0aGlzLmJJc0d1YXJkQ3Jvc3NBbGxvd2VkID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZXMgdGhlIG5hdmlnYXRpb24gZ3VhcmQuXG5cdCAqL1xuXHRkaXNjYXJkTmF2aWdhdGlvbkd1YXJkKCkge1xuXHRcdHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgbmF2aWdhdGlvbiBndWFyZC5cblx0ICpcblx0ICogQHJldHVybnMgYHRydWVgIGlmIG5hdmlnYXRpbmcgZ3VhcmQgaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRoYXNOYXZpZ2F0aW9uR3VhcmQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQgIT09IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogVGVzdHMgYSBoYXNoIGFnYWluc3QgdGhlIG5hdmlnYXRpb24gZ3VhcmQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzSGFzaCBUaGUgaGFzaCB0byBiZSB0ZXN0ZWRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIG5hdmlnYXRpbmcgdG8gdGhlIGhhc2ggZG9lc24ndCBjcm9zcyB0aGUgZ3VhcmRcblx0ICovXG5cdGNoZWNrSGFzaFdpdGhHdWFyZChzSGFzaDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29OYXZpZ2F0aW9uR3VhcmQgPT09IG51bGwgfHwgdGhpcy5fb05hdmlnYXRpb25HdWFyZC5jaGVjayhzSGFzaCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSB1c2VyIGFsbG93ZWQgdGhlIG5hdmlnYXRpb24gZ3VhcmQgdG8gYmUgY3Jvc3NlZC5cblx0ICpcblx0ICogQHJldHVybnMgYHRydWVgIGlmIGNyb3NzaW5nIHRoZSBndWFyZCBoYXMgYmVlbiBhbGxvd2VkIGJ5IHRoZSB1c2VyXG5cdCAqL1xuXHRpc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyKCkge1xuXHRcdHJldHVybiB0aGlzLmJJc0d1YXJkQ3Jvc3NBbGxvd2VkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFjdGl2YXRlcyB0aGUgc3luY2hyb25pemF0aW9uIGZvciByb3V0ZU1hdGNoZWRFdmVudC5cblx0ICogVGhlIG5leHQgTmF2VG9IYXNoIGNhbGwgd2lsbCBjcmVhdGUgYSBTeW5jaHJvbml6YXRpb24gb2JqZWN0IHRoYXQgd2lsbCBiZSByZXNvbHZlZFxuXHQgKiBieSB0aGUgY29ycmVzcG9uZGluZyBvblJvdXRlTWF0Y2hlZCBldmVudCwgcHJldmVudGluZyBhbm90aGVyIE5hdlRvSGFzaCB0byBoYXBwZW4gaW4gcGFyYWxsZWwuXG5cdCAqL1xuXHRhY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKSB7XG5cdFx0dGhpcy5fYkFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm8gPSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc29sdmUgdGhlIHJvdXRlTWF0Y2ggc3luY2hyb25pemF0aW9uIG9iamVjdCwgdW5sb2NraW5nIHBvdGVudGlhbCBwZW5kaW5nIE5hdlRvSGFzaCBjYWxscy5cblx0ICovXG5cdHJlc29sdmVSb3V0ZU1hdGNoKCkge1xuXHRcdGlmICh0aGlzLl9vUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbikge1xuXHRcdFx0dGhpcy5fb1JvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24ucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlcyBzdXJlIG5vIG5hdmlnYXRpb24gY2FuIGhhcHBlbiBiZWZvcmUgYSByb3V0ZU1hdGNoIGhhcHBlbmVkLlxuXHQgKi9cblx0d2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCkge1xuXHRcdHRoaXMuX29Sb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uID0gbmV3IFN5bmNocm9uaXphdGlvbigpO1xuXHRcdHRoaXMuX2JBY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvID0gZmFsc2U7XG5cdH1cblxuXHRfZXh0cmFjdEVudGl0eVNldHNGcm9tSGFzaChzSGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuXHRcdGlmIChzSGFzaCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzSGFzaCA9IFwiXCI7XG5cdFx0fVxuXHRcdGNvbnN0IHNIYXNoTm9QYXJhbXMgPSBzSGFzaC5zcGxpdChcIj9cIilbMF07IC8vIHJlbW92ZSBwYXJhbXNcblx0XHRjb25zdCBhVG9rZW5zID0gc0hhc2hOb1BhcmFtcy5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgbmFtZXM6IHN0cmluZ1tdID0gW107XG5cblx0XHRhVG9rZW5zLmZvckVhY2goKHNUb2tlbikgPT4ge1xuXHRcdFx0aWYgKHNUb2tlbi5sZW5ndGgpIHtcblx0XHRcdFx0bmFtZXMucHVzaChzVG9rZW4uc3BsaXQoXCIoXCIpWzBdKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBuYW1lcztcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgYSBzdGF0ZSBmcm9tIGEgaGFzaC5cblx0ICpcblx0ICogQHBhcmFtIHNIYXNoIFRoZSBoYXNoIHRvIGJlIHVzZWQgYXMgZW50cnlcblx0ICogQHJldHVybnMgVGhlIHN0YXRlXG5cdCAqL1xuXHRfZXh0cmFjdFN0YXRlRnJvbUhhc2goc0hhc2g6IHN0cmluZykge1xuXHRcdGlmIChzSGFzaCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzSGFzaCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1N0YXRlOiBhbnkgPSB7XG5cdFx0XHRrZXlzOiB0aGlzLl9leHRyYWN0RW50aXR5U2V0c0Zyb21IYXNoKHNIYXNoKVxuXHRcdH07XG5cblx0XHQvLyBSZXRyaWV2ZSBsYXlvdXQgKGlmIGFueSlcblx0XHRjb25zdCBhTGF5b3V0ID0gc0hhc2gubWF0Y2gobmV3IFJlZ0V4cChgXFxcXD8uKiR7ZW51bVVSTFBhcmFtcy5MQVlPVVRQQVJBTX09KFteJl0qKWApKTtcblx0XHRvU3RhdGUuc0xheW91dCA9IGFMYXlvdXQgJiYgYUxheW91dC5sZW5ndGggPiAxID8gYUxheW91dFsxXSA6IG51bGw7XG5cdFx0aWYgKG9TdGF0ZS5zTGF5b3V0ID09PSBcIk1pZENvbHVtbkZ1bGxTY3JlZW5cIikge1xuXHRcdFx0b1N0YXRlLnNjcmVlbk1vZGUgPSAxO1xuXHRcdH0gZWxzZSBpZiAob1N0YXRlLnNMYXlvdXQgPT09IFwiRW5kQ29sdW1uRnVsbFNjcmVlblwiKSB7XG5cdFx0XHRvU3RhdGUuc2NyZWVuTW9kZSA9IDI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9TdGF0ZS5zY3JlZW5Nb2RlID0gMDtcblx0XHR9XG5cblx0XHRvU3RhdGUuaGFzaCA9IHNIYXNoO1xuXHRcdHJldHVybiBvU3RhdGU7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIG5ldyBzdGF0ZSBpbnRvIHRoZSBpbnRlcm5hbCBoaXN0b3J5IHN0cnVjdHVyZS5cblx0ICogRW5zdXJlcyB0aGlzIG5ldyBzdGF0ZSBpcyBhZGRlZCBhZnRlciBhbiBhbmNlc3Rvci5cblx0ICogQWxzbyBzZXRzIHRoZSBpQXBwU3RhdGUga2V5IGluIHRoZSB3aG9sZSBoaXN0b3J5LlxuXHQgKlxuXHQgKiBAcGFyYW0gb05ld1N0YXRlIFRoZSBuZXcgc3RhdGUgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIGJSZWJ1aWxkT25seSBgdHJ1ZWAgaWYgd2UncmUgcmVidWlsZGluZyB0aGUgaGlzdG9yeSBhZnRlciBhIHNoZWxsIG1lbnUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBJZiBzZXQgdG8gdHJ1ZSwgbm9uLWFuY2VzdG9yIGVudHJpZXMgaW4gaGlzdG9yeSB3aWxsIGJlIHJldGFpbmVkXG5cdCAqIEBwYXJhbSBiRGlzYWJsZUhpc3RvcnlQcmVzZXJ2YXRpb24gRGlzYWJsZSB0aGUgbWVjaGFuaXNtIHRvIHJldGFpbmVkIG1hcmtlZCBlbnRyaWVzIGluIGNhY2hlXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgc3RhdGVcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfcHVzaE5ld1N0YXRlKG9OZXdTdGF0ZTogYW55LCBiUmVidWlsZE9ubHk6IGJvb2xlYW4sIGJQcmVzZXJ2ZUhpc3Rvcnk6IGJvb2xlYW4sIGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbjogYm9vbGVhbikge1xuXHRcdGNvbnN0IHNlZ21lbnRzID0gUm91dGVyUHJveHkuc3BsaXRBcHBTcGVjaWZpY1JvdXRlKHRoaXMuZ2V0RnVsbEhhc2goKSk7XG5cdFx0Y29uc3Qgc0N1cnJlbnRIYXNoID0gc2VnbWVudHNbMF0gPz8gXCJcIjtcblx0XHRsZXQgbGFzdEluZGV4ID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDE7XG5cdFx0bGV0IGlQb3BDb3VudCA9IGJSZWJ1aWxkT25seSA/IDEgOiAwO1xuXG5cdFx0Ly8gMS4gRG8gc29tZSBjbGVhbnVwIGluIHRoZSBtYW5hZ2VkIGhpc3RvcnkgOiBpbiBjYXNlIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWQgYmFjayBpbiB0aGUgYnJvd3NlciBoaXN0b3J5LCB3ZSBuZWVkIHRvIHJlbW92ZVxuXHRcdC8vIHRoZSBzdGF0ZXMgYWhlYWQgaW4gaGlzdG9yeSBhbmQgbWFrZSBzdXJlIHRoZSB0b3Agc3RhdGUgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgcGFnZVxuXHRcdC8vIFdlIGRvbid0IGRvIHRoYXQgd2hlbiByZXN0b3JpbmcgdGhlIGhpc3RvcnksIGFzIHRoZSBjdXJyZW50IHN0YXRlIGhhcyBiZWVuIGFkZGVkIG9uIHRvcCBvZiB0aGUgYnJvd3NlciBoaXN0b3J5XG5cdFx0Ly8gYW5kIGlzIG5vdCByZWZsZWN0ZWQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeVxuXHRcdGlmICghYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHR3aGlsZSAobGFzdEluZGV4ID49IDAgJiYgdGhpcy5fb01hbmFnZWRIaXN0b3J5W2xhc3RJbmRleF0uaGFzaCAhPT0gc0N1cnJlbnRIYXNoKSB7XG5cdFx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0bGFzdEluZGV4LS07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIFdlIGNvdWxkbid0IGZpbmQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGhpc3RvcnkuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIGJyb3dzZXIgcmVsb2FkXG5cdFx0XHRcdC8vIGhhcHBlbmVkLCBjYXVzaW5nIGEgcmVpbml0aWFsaXphdGlvbiBvZiB0aGUgbWFuYWdlZCBoaXN0b3J5LlxuXHRcdFx0XHQvLyBJbiB0aGF0IGNhc2UsIHdlIHVzZSB0aGUgY3VycmVudCBsb2NhdGlvbiBhcyB0aGUgbmV3IHN0YXJ0aW5nIHBvaW50IGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5LnB1c2godGhpcy5fZXh0cmFjdFN0YXRlRnJvbUhhc2goc0N1cnJlbnRIYXNoKSk7XG5cdFx0XHRcdGhpc3RvcnkucmVwbGFjZVN0YXRlKE9iamVjdC5hc3NpZ24oeyBmZUxldmVsOiAwIH0sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyAyLiBNYXJrIHRoZSB0b3Agc3RhdGUgYXMgcHJlc2VydmVkIGlmIHJlcXVpcmVkXG5cdFx0aWYgKGJQcmVzZXJ2ZUhpc3RvcnkgJiYgIWJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbikge1xuXHRcdFx0dGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXS5wcmVzZXJ2ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIDMuIFRoZW4gcG9wIGFsbCBzdGF0ZXMgdW50aWwgd2UgZmluZCBhbiBhbmNlc3RvciBvZiB0aGUgbmV3IHN0YXRlLCBvciB3ZSBmaW5kIGEgc3RhdGUgdGhhdCBuZWVkIHRvIGJlIHByZXNlcnZlZFxuXHRcdGxldCBvTGFzdFJlbW92ZWRJdGVtO1xuXHRcdHdoaWxlICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1RvcFN0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXTtcblx0XHRcdGlmIChcblx0XHRcdFx0KGJEaXNhYmxlSGlzdG9yeVByZXNlcnZhdGlvbiB8fCAhb1RvcFN0YXRlLnByZXNlcnZlZCkgJiZcblx0XHRcdFx0dGhpcy5fY29tcGFyZUNhY2hlU3RhdGVzKG9Ub3BTdGF0ZSwgb05ld1N0YXRlKSAhPT0gZW51bVN0YXRlLkFOQ0VTVE9SXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhlIHRvcCBzdGF0ZSBpcyBub3QgYW4gYW5jZXN0b3Igb2Ygb05ld1N0YXRlIGFuZCBpcyBub3QgcHJlc2VydmVkIC0tPiB3ZSBjYW4gcG9wIGl0XG5cdFx0XHRcdG9MYXN0UmVtb3ZlZEl0ZW0gPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkucG9wKCk7XG5cdFx0XHRcdGlQb3BDb3VudCsrO1xuXHRcdFx0fSBlbHNlIGlmIChvVG9wU3RhdGUucHJlc2VydmVkICYmIHJlbW92ZUFwcFN0YXRlSW5IYXNoKG9Ub3BTdGF0ZS5oYXNoKSA9PT0gcmVtb3ZlQXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gpKSB7XG5cdFx0XHRcdC8vIFdlIHRyeSB0byBhZGQgYSBzdGF0ZSB0aGF0IGlzIGFscmVhZHkgaW4gY2FjaGUgKGR1ZSB0byBwcmVzZXJ2ZWQgZmxhZykgYnV0IHdpdGggYSBkaWZmZXJlbnQgaWFwcC1zdGF0ZVxuXHRcdFx0XHQvLyAtLT4gd2Ugc2hvdWxkIGRlbGV0ZSB0aGUgcHJldmlvdXMgZW50cnkgKGl0IHdpbGwgYmUgbGF0ZXIgcmVwbGFjZWQgYnkgdGhlIG5ldyBvbmUpIGFuZCBzdG9wIHBvcHBpbmdcblx0XHRcdFx0b0xhc3RSZW1vdmVkSXRlbSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wb3AoKTtcblx0XHRcdFx0aVBvcENvdW50Kys7XG5cdFx0XHRcdG9OZXdTdGF0ZS5wcmVzZXJ2ZWQgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJyZWFrOyAvLyBBbmNlc3RvciBvciBwcmVzZXJ2ZWQgc3RhdGUgZm91bmQgLS0+IHdlIHN0b3AgcG9wcGluZyBvdXQgc3RhdGVzXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gNC4gaUFwcFN0YXRlIG1hbmFnZW1lbnRcblx0XHR0aGlzLnNJQXBwU3RhdGVLZXkgPSB0aGlzLmZpbmRBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCk7XG5cdFx0aWYgKCF0aGlzLmZjbEVuYWJsZWQgJiYgb0xhc3RSZW1vdmVkSXRlbSkge1xuXHRcdFx0Y29uc3Qgc1ByZXZpb3VzSUFwcFN0YXRlS2V5ID0gdGhpcy5maW5kQXBwU3RhdGVJbkhhc2gob0xhc3RSZW1vdmVkSXRlbS5oYXNoKTtcblx0XHRcdGNvbnN0IG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPSB0aGlzLl9jb21wYXJlQ2FjaGVTdGF0ZXMob0xhc3RSZW1vdmVkSXRlbSwgb05ld1N0YXRlKTtcblx0XHRcdC8vIGlmIGN1cnJlbnQgc3RhdGUgZG9lc24ndCBjb250YWluIGEgaS1hcHBzdGF0ZSBhbmQgdGhpcyBzdGF0ZSBzaG91bGQgcmVwbGFjZSBhIHN0YXRlIGNvbnRhaW5pbmcgYSBpQXBwU3RhdGVcblx0XHRcdC8vIHRoZW4gdGhlIHByZXZpb3VzIGlBcHBTdGF0ZSBpcyBwcmVzZXJ2ZWRcblx0XHRcdGlmIChcblx0XHRcdFx0IXRoaXMuc0lBcHBTdGF0ZUtleSAmJlxuXHRcdFx0XHRzUHJldmlvdXNJQXBwU3RhdGVLZXkgJiZcblx0XHRcdFx0KG9Db21wYXJpc29uU3RhdGVSZXN1bHQgPT09IGVudW1TdGF0ZS5FUVVBTCB8fCBvQ29tcGFyaXNvblN0YXRlUmVzdWx0ID09PSBlbnVtU3RhdGUuQ09NUEFUSUJMRSlcblx0XHRcdCkge1xuXHRcdFx0XHRvTmV3U3RhdGUuaGFzaCA9IHRoaXMuc2V0QXBwU3RhdGVJbkhhc2gob05ld1N0YXRlLmhhc2gsIHNQcmV2aW91c0lBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gNS4gTm93IHdlIGNhbiBwdXNoIHRoZSBzdGF0ZSBhdCB0aGUgdG9wIG9mIHRoZSBpbnRlcm5hbCBoaXN0b3J5XG5cdFx0Y29uc3QgYkhhc1NhbWVIYXNoID0gb0xhc3RSZW1vdmVkSXRlbSAmJiBvTmV3U3RhdGUuaGFzaCA9PT0gb0xhc3RSZW1vdmVkSXRlbS5oYXNoO1xuXHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoID09PSAwIHx8IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV0uaGFzaCAhPT0gb05ld1N0YXRlLmhhc2gpIHtcblx0XHRcdHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5wdXNoKG9OZXdTdGF0ZSk7XG5cdFx0XHRpZiAob0xhc3RSZW1vdmVkSXRlbSAmJiByZW1vdmVBcHBTdGF0ZUluSGFzaChvTGFzdFJlbW92ZWRJdGVtLmhhc2gpID09PSByZW1vdmVBcHBTdGF0ZUluSGFzaChvTmV3U3RhdGUuaGFzaCkpIHtcblx0XHRcdFx0b05ld1N0YXRlLmZvY3VzQ29udHJvbElkID0gb0xhc3RSZW1vdmVkSXRlbS5mb2N1c0NvbnRyb2xJZDtcblx0XHRcdFx0b05ld1N0YXRlLmZvY3VzSW5mbyA9IG9MYXN0UmVtb3ZlZEl0ZW0uZm9jdXNJbmZvO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDYuIERldGVybWluZSB3aGljaCBhY3Rpb25zIHRvIGRvIG9uIHRoZSBoaXN0b3J5XG5cdFx0aWYgKGlQb3BDb3VudCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gc3RhdGUgd2FzIHBvcHBlZCAtLT4gYXBwZW5kXG5cdFx0XHRyZXR1cm4geyB0eXBlOiBcImFwcGVuZFwiIH07XG5cdFx0fSBlbHNlIGlmIChpUG9wQ291bnQgPT09IDEpIHtcblx0XHRcdC8vIE9ubHkgMSBzdGF0ZSB3YXMgcG9wcGVkIC0tPiByZXBsYWNlIGN1cnJlbnQgaGFzaCB1bmxlc3MgaGFzaCBpcyB0aGUgc2FtZSAodGhlbiBub3RoaW5nIHRvIGRvKVxuXHRcdFx0cmV0dXJuIGJIYXNTYW1lSGFzaCA/IHsgdHlwZTogXCJub25lXCIgfSA6IHsgdHlwZTogXCJyZXBsYWNlXCIgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTW9yZSB0aGFuIDEgc3RhdGUgd2FzIHBvcHBlZCAtLT4gZ28gYmFrYyBpbiBoaXN0b3J5IGFuZCByZXBsYWNlIGhhc2ggaWYgbmVjZXNzYXJ5XG5cdFx0XHRyZXR1cm4gYkhhc1NhbWVIYXNoID8geyB0eXBlOiBcImJhY2tcIiwgc3RlcHM6IGlQb3BDb3VudCAtIDEgfSA6IHsgdHlwZTogXCJiYWNrLXJlcGxhY2VcIiwgc3RlcHM6IGlQb3BDb3VudCAtIDEgfTtcblx0XHR9XG5cdH1cblxuXHRfYmxvY2tpbmdOYXZpZ2F0aW9uRmlsdGVyKCkge1xuXHRcdHJldHVybiB0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA/IFwiQ3VzdG9tXCIgOiBcIkNvbnRpbnVlXCI7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZSB0aGUgcm91dGluZyBieSBjYWxsaW5nIHRoZSByb3V0ZXIgc3RvcCBtZXRob2QuXG5cdCAqXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2Rpc2FibGVFdmVudE9uSGFzaENoYW5nZSgpIHtcblx0XHR0aGlzLl9iRGlzYWJsZU9uSGFzaENoYW5nZSA9IHRydWU7XG5cdFx0dGhpcy5fb1JvdXRlci5zdG9wKCk7XG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlIHRoZSByb3V0aW5nIGJ5IGNhbGxpbmcgdGhlIHJvdXRlciBpbml0aWFsaXplIG1ldGhvZC5cblx0ICpcblx0ICogQHBhcmFtIFtiSWdub3JlQ3VycmVudEhhc2hdIElnbm9yZSB0aGUgbGFzdCBoYXNoIGV2ZW50IHRyaWdnZXJlZCBiZWZvcmUgdGhlIHJvdXRlciBoYXMgaW5pdGlhbGl6ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZW5hYmxlRXZlbnRPbkhhc2hDaGFuZ2UoYklnbm9yZUN1cnJlbnRIYXNoOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG5cdFx0dGhpcy5fYkRpc2FibGVPbkhhc2hDaGFuZ2UgPSBmYWxzZTtcblx0XHR0aGlzLl9vUm91dGVyLmluaXRpYWxpemUoYklnbm9yZUN1cnJlbnRIYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTeW5jaHJvbml6ZXMgdGhlIGJyb3dzZXIgaGlzdG9yeSB3aXRoIHRoZSBpbnRlcm5hbCBoaXN0b3J5IG9mIHRoZSByb3V0ZXJQcm94eSwgYW5kIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiBpZiBuZWVkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvSGlzdG9yeUFjdGlvbiBTcGVjaWZpZXMgdGhlIG5hdmlnYXRpb24gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZFxuXHQgKiBAcGFyYW0gYlJlYnVpbGRPbmx5IGB0cnVlYCBpZiBpbnRlcm5hbCBoaXN0b3J5IGlzIGN1cnJlbnRseSBiZWluZyByZWJ1aWx0XG5cdCAqIEByZXR1cm5zIFByb21pc2UgKHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkKSB0aGF0IHJldHVybnMgJ3RydWUnIGlmIGEgbmF2aWdhdGlvbiB0b29rIHBsYWNlLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZG4ndCBoYXBwZW5cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfcmVidWlsZEJyb3dzZXJIaXN0b3J5KG9IaXN0b3J5QWN0aW9uOiBhbnksIGJSZWJ1aWxkT25seTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSB0cnVlO1xuXHRcdFx0Y29uc3Qgb1RhcmdldFN0YXRlID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5W3RoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxXSxcblx0XHRcdFx0bmV3TGV2ZWwgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTtcblxuXHRcdFx0ZnVuY3Rpb24gcmVwbGFjZUFzeW5jKCkge1xuXHRcdFx0XHRpZiAoIWJSZWJ1aWxkT25seSkge1xuXHRcdFx0XHRcdHRoYXQuX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0KHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7IGZlTGV2ZWw6IG5ld0xldmVsIH0sIGhpc3Rvcnkuc3RhdGUpLCBcIlwiKTtcblxuXHRcdFx0XHRpZiAoYlJlYnVpbGRPbmx5KSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBUaW1lb3V0IHRvIGxldCAnaGFzaGNoYW5nZScgZXZlbnQgYmUgcHJvY2Vzc2VkIGJlZm9yZSBieSB0aGUgSGFzaENoYW5nZXIsIHNvIHRoYXRcblx0XHRcdFx0XHRcdC8vIG9uUm91dGVNYXRjaGVkIG5vdGlmaWNhdGlvbiBpc24ndCByYWlzZWRcblx0XHRcdFx0XHRcdHRoYXQuX2VuYWJsZUV2ZW50T25IYXNoQ2hhbmdlKHRydWUpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdC8vIEFzeW5jIGNhbGxiYWNrcyB3aGVuIG5hdmlnYXRpbmcgYmFjaywgaW4gb3JkZXIgdG8gbGV0IGFsbCBub3RpZmljYXRpb25zIGFuZCBldmVudHMgZ2V0IHByb2Nlc3NlZFxuXHRcdFx0ZnVuY3Rpb24gYmFja1JlcGxhY2VBc3luYygpIHtcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBiYWNrUmVwbGFjZUFzeW5jKTtcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gVGltZW91dCB0byBsZXQgJ2hhc2hjaGFuZ2UnIGV2ZW50IGJlIHByb2Nlc3NlZCBiZWZvcmUgYnkgdGhlIEhhc2hDaGFuZ2VyXG5cdFx0XHRcdFx0cmVwbGFjZUFzeW5jKCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBiYWNrQXN5bmMoKSB7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgYmFja0FzeW5jKTtcblx0XHRcdFx0dGhhdC5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHR9XG5cblx0XHRcdHRoYXQuX2JJZ25vcmVSZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0c3dpdGNoIChvSGlzdG9yeUFjdGlvbi50eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJyZXBsYWNlXCI6XG5cdFx0XHRcdFx0Y29uc3QgZm9jdXNJbmZvID0gaGlzdG9yeS5zdGF0ZT8uZm9jdXNJbmZvO1xuXHRcdFx0XHRcdCh0aGF0Ll9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkucmVwbGFjZUhhc2ggYXMgYW55KShvVGFyZ2V0U3RhdGUuaGFzaCk7XG5cdFx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoXG5cdFx0XHRcdFx0XHRPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0ZmVMZXZlbDogbmV3TGV2ZWwsXG5cdFx0XHRcdFx0XHRcdFx0Zm9jdXNJbmZvOiBmb2N1c0luZm9cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0aGlzdG9yeS5zdGF0ZVxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImFwcGVuZFwiOlxuXHRcdFx0XHRcdHRoYXQuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5zZXRIYXNoKG9UYXJnZXRTdGF0ZS5oYXNoKTtcblx0XHRcdFx0XHRoaXN0b3J5LnJlcGxhY2VTdGF0ZShPYmplY3QuYXNzaWduKHsgZmVMZXZlbDogbmV3TGV2ZWwgfSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIpO1xuXHRcdFx0XHRcdHRoYXQuYklzUmVidWlsZEhpc3RvcnlSdW5uaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTsgLy8gYSBuYXZpZ2F0aW9uIG9jY3VycmVkXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImJhY2tcIjpcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tBc3luYyk7XG5cdFx0XHRcdFx0aGlzdG9yeS5nbygtb0hpc3RvcnlBY3Rpb24uc3RlcHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJiYWNrLXJlcGxhY2VcIjpcblx0XHRcdFx0XHR0aGlzLl9kaXNhYmxlRXZlbnRPbkhhc2hDaGFuZ2UoKTtcblx0XHRcdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIGJhY2tSZXBsYWNlQXN5bmMpO1xuXHRcdFx0XHRcdGhpc3RvcnkuZ28oLW9IaXN0b3J5QWN0aW9uLnN0ZXBzKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vIE5vIG5hdmlnYXRpb25cblx0XHRcdFx0XHR0aGlzLmJJc1JlYnVpbGRIaXN0b3J5UnVubmluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdHJlc29sdmUoZmFsc2UpOyAvLyBubyBuYXZpZ2F0aW9uIC0tPiByZXNvbHZlIHRvIGZhbHNlXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRMYXN0SGlzdG9yeUVudHJ5KCkge1xuXHRcdHJldHVybiB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXHR9XG5cblx0c2V0UGF0aE1hcHBpbmcobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKSB7XG5cdFx0dGhpcy5fcGF0aE1hcHBpbmdzID0gbWFwcGluZ3MuZmlsdGVyKChtYXBwaW5nKSA9PiB7XG5cdFx0XHRyZXR1cm4gbWFwcGluZy5vbGRQYXRoICE9PSBtYXBwaW5nLm5ld1BhdGg7XG5cdFx0fSk7XG5cdH1cblxuXHRoYXNoR3VhcmQoKSB7XG5cdFx0bGV0IHNIYXNoID0gdGhpcy5nZXREZWNvZGVkV2luZG93SGFzaCgpO1xuXHRcdGNvbnN0IGN1cnJlbnRBcHBOYW1lID0gdGhpcy5nZXRBcHBOYW1lRnJvbUhhc2goc0hhc2gpO1xuXHRcdGlmIChjdXJyZW50QXBwTmFtZSAhPSB0aGlzLmFwcE5hbWUpIHtcblx0XHRcdC8vIFdoZW4gZG9pbmcgZXh0ZXJuYWwgbmF2aWdhdGlvbiBpbiBhbm90aGVyIHdpbmRvdywgdGhlIGN1cnJlbnQgd2luZG93IGxvY2F0aW9uIGlzIHRlbXBvcmFyaWx5IG1vZGlmaWVkIHdpdGggdGhlIFVSTCBvZiB0aGUgdGFyZ2V0IGFwcFxuXHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSB0aGUgaW50ZXJuYWxseSBtYW5hZ2VkIGhpc3RvcnksIHNvIHdlIHNpbXBseSBkbyBub3RoaW5nXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKFwicmVzdG9yZUhpc3Rvcnk9dHJ1ZVwiKSkge1xuXHRcdFx0dGhpcy5fYkFwcGx5UmVzdG9yZSA9IHRydWU7XG5cdFx0fSBlbHNlIGlmICghdGhpcy5iSXNSZWJ1aWxkSGlzdG9yeVJ1bm5pbmcpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSBoYXNoIG5lZWRzIHRvIGJlIGNoYW5nZWQgKHRoaXMgaGFwcGVucyBpbiBGQ0wgd2hlbiBzd2l0Y2hpbmcgYi93IGVkaXQgYW5kIHJlYWQtb25seSB3aXRoIDMgY29sdW1ucyBvcGVuKVxuXHRcdFx0Y29uc3QgbWFwcGluZyA9IHRoaXMuX3BhdGhNYXBwaW5ncy5maW5kKChtKSA9PiB7XG5cdFx0XHRcdHJldHVybiBzSGFzaC5pbmNsdWRlcyhtLm9sZFBhdGgpO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAobWFwcGluZykge1xuXHRcdFx0XHQvLyBSZXBsYWNlIHRoZSBjdXJyZW50IGhhc2hcblx0XHRcdFx0c0hhc2ggPSBzSGFzaC5yZXBsYWNlKG1hcHBpbmcub2xkUGF0aCwgbWFwcGluZy5uZXdQYXRoKTtcblx0XHRcdFx0aGlzdG9yeS5yZXBsYWNlU3RhdGUoT2JqZWN0LmFzc2lnbih7fSwgaGlzdG9yeS5zdGF0ZSksIFwiXCIsIGVuY29kZVVSSShzSGFzaCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBhSGFzaFNwbGl0ID0gc0hhc2guc3BsaXQoXCImL1wiKTtcblx0XHRcdGNvbnN0IHNBcHBIYXNoID0gYUhhc2hTcGxpdFsxXSA/IGFIYXNoU3BsaXRbMV0gOiBcIlwiO1xuXHRcdFx0aWYgKHRoaXMuY2hlY2tIYXNoV2l0aEd1YXJkKHNBcHBIYXNoKSkge1xuXHRcdFx0XHR0aGlzLl9iRGVsYXllZFJlYnVpbGQgPSB0cnVlO1xuXHRcdFx0XHRjb25zdCBvTmV3U3RhdGUgPSB0aGlzLl9leHRyYWN0U3RhdGVGcm9tSGFzaChzQXBwSGFzaCk7XG5cdFx0XHRcdHRoaXMuX3B1c2hOZXdTdGF0ZShvTmV3U3RhdGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG5cblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fYkRlbGF5ZWRSZWJ1aWxkID0gZmFsc2U7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wYXJlcyAyIHN0YXRlcy5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTFcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TdGF0ZTJcblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbjpcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkVRVUFMIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGVxdWFsXG5cdCAqICAgICAgICAtIGVudW1TdGF0ZS5DT01QQVRJQkxFIGlmIG9TdGF0ZTEgYW5kIG9TdGF0ZTIgYXJlIGNvbXBhdGlibGVcblx0ICogICAgICAgIC0gZW51bVN0YXRlLkFOQ0VTVE9SIGlmIG9TdGF0ZTEgaXMgYW4gYW5jZXN0b3Igb2Ygb1N0YXRlMlxuXHQgKiAgICAgICAgLSBlbnVtU3RhdGUuRElGRkVSRU5UIGlmIHRoZSAyIHN0YXRlcyBhcmUgZGlmZmVyZW50XG5cdCAqL1xuXG5cdF9jb21wYXJlQ2FjaGVTdGF0ZXMob1N0YXRlMTogYW55LCBvU3RhdGUyOiBhbnkpIHtcblx0XHQvLyBGaXJzdCBjb21wYXJlIG9iamVjdCBrZXlzXG5cdFx0aWYgKG9TdGF0ZTEua2V5cy5sZW5ndGggPiBvU3RhdGUyLmtleXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZW51bVN0YXRlLkRJRkZFUkVOVDtcblx0XHR9XG5cdFx0bGV0IGVxdWFsID0gdHJ1ZTtcblx0XHRsZXQgaW5kZXg7XG5cdFx0Zm9yIChpbmRleCA9IDA7IGVxdWFsICYmIGluZGV4IDwgb1N0YXRlMS5rZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuXHRcdFx0aWYgKG9TdGF0ZTEua2V5c1tpbmRleF0gIT09IG9TdGF0ZTIua2V5c1tpbmRleF0pIHtcblx0XHRcdFx0ZXF1YWwgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFlcXVhbCkge1xuXHRcdFx0Ly8gU29tZSBvYmplY3RzIGtleXMgYXJlIGRpZmZlcmVudFxuXHRcdFx0cmV0dXJuIGVudW1TdGF0ZS5ESUZGRVJFTlQ7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGtleXMgZnJvbSBvU3RhdGUxIGFyZSBpbiBvU3RhdGUyIC0tPiBjaGVjayBpZiBhbmNlc3RvclxuXHRcdGlmIChvU3RhdGUxLmtleXMubGVuZ3RoIDwgb1N0YXRlMi5rZXlzLmxlbmd0aCB8fCBvU3RhdGUxLnNjcmVlbk1vZGUgPCBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuQU5DRVNUT1I7XG5cdFx0fVxuXHRcdGlmIChvU3RhdGUxLnNjcmVlbk1vZGUgPiBvU3RhdGUyLnNjcmVlbk1vZGUpIHtcblx0XHRcdHJldHVybiBlbnVtU3RhdGUuRElGRkVSRU5UOyAvLyBOb3Qgc3VyZSB0aGlzIGNhc2UgY2FuIGhhcHBlbi4uLlxuXHRcdH1cblxuXHRcdC8vIEF0IHRoaXMgc3RhZ2UsIHRoZSAyIHN0YXRlcyBoYXZlIHRoZSBzYW1lIG9iamVjdCBrZXlzIChpbiB0aGUgc2FtZSBvcmRlcikgYW5kIHNhbWUgc2NyZWVubW9kZVxuXHRcdC8vIFRoZXkgY2FuIGJlIGVpdGhlciBjb21wYXRpYmxlIG9yIGVxdWFsXG5cdFx0cmV0dXJuIG9TdGF0ZTEuc0xheW91dCA9PT0gb1N0YXRlMi5zTGF5b3V0ID8gZW51bVN0YXRlLkVRVUFMIDogZW51bVN0YXRlLkNPTVBBVElCTEU7XG5cdH1cblxuXHQvKipcblx0ICogU3BsaXQgdGhlIGFwcC1zcGVjaWZpYyByb3V0ZSBhdCB0aGUgXCImL1wiIHNlcGFyYXRvci5cblx0ICpcblx0ICogVGhlIGFwcC1zcGVjaWZpYyByb3V0ZSBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBzZWdtZW50cyBzZXBhcmF0ZWQgYnkgXCImL1wiLlxuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBzcGxpdEFwcFNwZWNpZmljUm91dGUoXCImL0VudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIik7XG5cdCAqIC8vIFtcIkVudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIl1cblx0ICpcblx0ICogc3BsaXRBcHBTcGVjaWZpY1JvdXRlKFwiJi9FbnRpdHkoJ2FiYycpL05leHRFbnRpdHkoJ3h5eicpJi9QcmVmaXgvTmVzdGVkUm91dGVcIik7XG5cdCAqIC8vIFtcIkVudGl0eSgnYWJjJykvTmV4dEVudGl0eSgneHl6JylcIiwgXCJQcmVmaXgvTmVzdGVkUm91dGVcIl1cblx0ICogQHBhcmFtIGFwcFNwZWNpZmljUm91dGVcdFRoZSBhcHAtc3BlY2lmaWMgcm91dGUuXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFwcC1zcGVjaWZpYyByb3V0ZSBzZWdtZW50cy5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIHNwbGl0QXBwU3BlY2lmaWNSb3V0ZShhcHBTcGVjaWZpY1JvdXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3Qgcm91dGVTcGxpdCA9IGFwcFNwZWNpZmljUm91dGU/LnNwbGl0KFwiJi9cIikgPz8gW107XG5cdFx0aWYgKCFyb3V0ZVNwbGl0WzBdKSB7XG5cdFx0XHRyb3V0ZVNwbGl0LnNoaWZ0KCk7IC8vIHJlbW92ZSB0aGUgbGVhZGluZyBlbXB0eSBzZWdtZW50ICh0aGUgYXBwLXNwZWNpZmljIHJvdXRlIHN0YXJ0cyB3aXRoIFwiJi9cIilcblx0XHR9XG5cdFx0cmV0dXJuIHJvdXRlU3BsaXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGJhY2sgZXhpdHMgdGhlIHByZXNlbnQgZ3VhcmQgc2V0LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYmFjayBleGl0cyB0aGUgZ3VhcmRcblx0ICovXG5cdGNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkKCk6IGJvb2xlYW4ge1xuXHRcdC8vIFdlIHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBpbnN0ZWFkIG9mIEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpIGJlY2F1c2UgdGhlIGxhdHRlclxuXHRcdC8vIHJlcGxhY2VzIGNoYXJhY3RlcnMgaW4gdGhlIFVSTCAoZS5nLiAlMjQgcmVwbGFjZWQgYnkgJCkgYW5kIGl0IGNhdXNlcyBpc3N1ZXMgd2hlbiBjb21wYXJpbmdcblx0XHQvLyB3aXRoIHRoZSBVUkxzIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnlcblx0XHRjb25zdCBzcGxpdEhhc2ggPSB0aGlzLmdldEZ1bGxIYXNoKCk7XG5cblx0XHRjb25zdCBzZWdtZW50cyA9IFJvdXRlclByb3h5LnNwbGl0QXBwU3BlY2lmaWNSb3V0ZShzcGxpdEhhc2gpO1xuXG5cdFx0aWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIHRoZXJlIGlzIGEgbmVzdGVkIHJvdXRlIGludm9sdmVkIC0+IGFzc3VtZSB3ZSBhcmUgc3RpbGwgaW5zaWRlIHRoZSBndWFyZFxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhc2ggPSBzZWdtZW50c1swXSA/PyBcIlwiO1xuXG5cdFx0bGV0IHByZXZpb3VzSGFzaDtcblx0XHRpZiAodGhpcy5fb05hdmlnYXRpb25HdWFyZCkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaV0uaGFzaCA9PT0gaGFzaCkge1xuXHRcdFx0XHRcdHByZXZpb3VzSGFzaCA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVtpIC0gMV0uaGFzaDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gIXByZXZpb3VzSGFzaCB8fCAhdGhpcy5jaGVja0hhc2hXaXRoR3VhcmQocHJldmlvdXNIYXNoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgbGFzdCAyIGVudHJpZXMgaW4gdGhlIGhpc3Rvcnkgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cblx0ICpcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZXkgc2hhcmUgdGhlIHNhbWUgY29udGV4dC5cblx0ICovXG5cdGNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQoKSB7XG5cdFx0aWYgKHRoaXMuX29NYW5hZ2VkSGlzdG9yeS5sZW5ndGggPCAyKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZSA9IHRoaXMuX29NYW5hZ2VkSGlzdG9yeVt0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMV07XG5cdFx0Y29uc3Qgb1ByZXZpb3VzU3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbdGhpcy5fb01hbmFnZWRIaXN0b3J5Lmxlbmd0aCAtIDJdO1xuXG5cdFx0cmV0dXJuIG9DdXJyZW50U3RhdGUuaGFzaC5zcGxpdChcIj9cIilbMF0gPT09IG9QcmV2aW91c1N0YXRlLmhhc2guc3BsaXQoXCI/XCIpWzBdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc3RvcmVzIHRoZSBmb2N1cyBmb3IgdGhlIGN1cnJlbnQgaGFzaCwgaWYgd2UgY2FuIGZpbmQgaXQgaW4gdGhlIGhpc3RvcnkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgZm9jdXMgd2FzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQgKi9cblx0cmVzdG9yZUZvY3VzRm9yQ3VycmVudEhhc2goKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY3VycmVudEhhc2ggPSByZW1vdmVBcHBTdGF0ZUluSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0Y29uc3Qgc3RhdGVGb3JIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LmZpbmQoKHN0YXRlKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc3RhdGUuaGFzaCkgPT09IGN1cnJlbnRIYXNoO1xuXHRcdH0pO1xuXG5cdFx0bGV0IGZvY3VzQXBwbGllZCA9IGZhbHNlO1xuXHRcdGlmIChzdGF0ZUZvckhhc2g/LmZvY3VzQ29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBmb2N1c0NvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoc3RhdGVGb3JIYXNoLmZvY3VzQ29udHJvbElkKTtcblx0XHRcdGZvY3VzQ29udHJvbD8uZm9jdXMoc3RhdGVGb3JIYXNoLmZvY3VzSW5mbyk7XG5cdFx0XHRmb2N1c0FwcGxpZWQgPSBmb2N1c0NvbnRyb2wgIT09IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm9jdXNBcHBsaWVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN0b3JlcyB0aGUgSUQgb2YgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGNvbnRyb2wgaW4gdGhlIGhpc3RvcnkgZm9yIHRoZSBjdXJyZW50IGhhc2guXG5cdCAqXG5cdCAqL1xuXHRwcml2YXRlIHN0b3JlRm9jdXNJbmZvRm9yQ3VycmVudEhhc2goKSB7XG5cdFx0Y29uc3QgY3VycmVudEhhc2ggPSByZW1vdmVBcHBTdGF0ZUluSGFzaCh0aGlzLmdldEhhc2goKSk7XG5cdFx0Y29uc3Qgc3RhdGVGb3JIYXNoID0gdGhpcy5fb01hbmFnZWRIaXN0b3J5LmZpbmQoKHN0YXRlKSA9PiB7XG5cdFx0XHRyZXR1cm4gcmVtb3ZlQXBwU3RhdGVJbkhhc2goc3RhdGUuaGFzaCkgPT09IGN1cnJlbnRIYXNoO1xuXHRcdH0pO1xuXHRcdGlmIChzdGF0ZUZvckhhc2gpIHtcblx0XHRcdGNvbnN0IGZvY3VzQ29udHJvbElkID0gc2FwLnVpLmdldENvcmUoKS5nZXRDdXJyZW50Rm9jdXNlZENvbnRyb2xJZCgpO1xuXHRcdFx0Y29uc3QgZm9jdXNDb250cm9sID0gZm9jdXNDb250cm9sSWQgPyBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoZm9jdXNDb250cm9sSWQpIDogdW5kZWZpbmVkO1xuXHRcdFx0c3RhdGVGb3JIYXNoLmZvY3VzQ29udHJvbElkID0gZm9jdXNDb250cm9sSWQ7XG5cdFx0XHRzdGF0ZUZvckhhc2guZm9jdXNJbmZvID0gZm9jdXNDb250cm9sPy5nZXRGb2N1c0luZm8oKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmluZHMgYSBsYXlvdXQgdmFsdWUgZm9yIGEgaGFzaCBpbiB0aGUgaGlzdG9yeS5cblx0ICpcblx0ICogQHBhcmFtIGhhc2ggVGhlIGhhc2ggdG8gbG9vayBmb3IgaW4gdGhlIGhpc3RvcnkuXG5cdCAqIEByZXR1cm5zIEEgbGF5b3V0IHZhbHVlIGlmIGl0IGNvdWxkIGJlIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlLlxuXHQgKi9cblx0ZmluZExheW91dEZvckhhc2goaGFzaDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIXRoaXMuZmNsRW5hYmxlZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgYWxsIHF1ZXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgaGFzaFxuXHRcdGNvbnN0IGhhc2hOb1BhcmFtID0gaGFzaC5zcGxpdChcIj9cIilbMF07XG5cblx0XHQvLyBMb29rIGZvciB0aGUgc3RhdGUgYmFja3dhcmRzLCBzbyB0aGF0IHdlIGZpbmQgdGhlIGxhc3Qgc3RhdGUgaW4gdGhlIGhpc3RvcnkgKGUuZy4gaWYgd2UgaGF2ZSAyIHN0YXRlcyB3aXRoIHRoZSBzYW1lIGhhc2ggYnV0IDIgZGlmZmVyZW50IGxheW91dHMpXG5cdFx0bGV0IHRhcmdldFN0YXRlOiBhbnk7XG5cdFx0Zm9yIChsZXQgaW5kZXggPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnkubGVuZ3RoIC0gMTsgaW5kZXggPj0gMCAmJiB0YXJnZXRTdGF0ZSA9PT0gdW5kZWZpbmVkOyBpbmRleC0tKSB7XG5cdFx0XHRpZiAodGhpcy5fb01hbmFnZWRIaXN0b3J5W2luZGV4XS5oYXNoLnNwbGl0KFwiP1wiKVswXSA9PT0gaGFzaE5vUGFyYW0pIHtcblx0XHRcdFx0dGFyZ2V0U3RhdGUgPSB0aGlzLl9vTWFuYWdlZEhpc3RvcnlbaW5kZXhdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXRTdGF0ZT8uc0xheW91dDtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBSb3V0ZXJQcm94eTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7RUFTQSxNQUFNQSxTQUFTLEdBQUc7SUFDakJDLEtBQUssRUFBRSxDQUFDO0lBQ1JDLFVBQVUsRUFBRSxDQUFDO0lBQ2JDLFFBQVEsRUFBRSxDQUFDO0lBQ1hDLFNBQVMsRUFBRTtFQUNaLENBQUM7RUFDRCxNQUFNQyxhQUFhLEdBQUc7SUFDckJDLFdBQVcsRUFBRSxRQUFRO0lBQ3JCQyxjQUFjLEVBQUU7RUFDakIsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQyxtQkFBbUIsQ0FBQ0MsVUFBa0IsRUFBRTtJQUNoRCxPQUFPO01BQ05DLFVBQVUsRUFBRUQsVUFBVSxDQUFDRSxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztNQUFFO01BQ2hEQyxLQUFLLEVBQUUsVUFBVUMsS0FBVSxFQUFFO1FBQzVCLE9BQU9BLEtBQUssQ0FBQ0MsT0FBTyxDQUFDLElBQUksQ0FBQ0osVUFBVSxDQUFDLEtBQUssQ0FBQztNQUM1QztJQUNELENBQUM7RUFDRjtFQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNLLG9CQUFvQixDQUFDRixLQUFhLEVBQUU7SUFDNUMsT0FBT0EsS0FBSyxDQUFDRixPQUFPLENBQUMsSUFBSUssTUFBTSxDQUFFLFFBQU9YLGFBQWEsQ0FBQ0UsY0FBZSxRQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDbkY7RUFBQyxJQUdLVSxXQUFXLFdBRGhCQyxjQUFjLENBQUMseUJBQXlCLENBQUM7SUFBQTtJ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