@sapui5/sap.fe.core 1.136.1 → 1.136.2
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 +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppStateHandler.js +9 -2
- package/src/sap/fe/core/AppStateHandler.ts +8 -2
- package/src/sap/fe/core/controllerextensions/EditFlow.js +30 -23
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +33 -31
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +27 -41
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +27 -41
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +16 -2
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +15 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +22 -15
- package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -2
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -0
- package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +9 -5
- package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.tsx +8 -3
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +30 -3
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +26 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +18 -13
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +33 -14
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +5 -3
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +5 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +5 -3
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +10 -2
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +15 -5
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +21 -6
- package/src/sap/fe/core/controls/inlineEditFlow/InlineEditExitDialog.js +144 -0
- package/src/sap/fe/core/controls/inlineEditFlow/{BeforeNavigationDialog.tsx → InlineEditExitDialog.tsx} +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action.js +17 -12
- package/src/sap/fe/core/converters/controls/Common/Action.ts +19 -11
- package/src/sap/fe/core/converters/controls/Common/Table.js +14 -2
- package/src/sap/fe/core/converters/controls/Common/Table.ts +13 -1
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +11 -10
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +13 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +11 -6
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +17 -10
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -3
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +26 -1
- package/src/sap/fe/core/designtime/messagebundle_en_US_saprigi.properties +7 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js +9 -9
- package/src/sap/fe/core/helpers/DeleteHelper.ts +8 -9
- package/src/sap/fe/core/helpers/ModelHelper.js +53 -5
- package/src/sap/fe/core/helpers/ModelHelper.ts +53 -3
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle_ar.properties +3 -2
- package/src/sap/fe/core/messagebundle_bg.properties +2 -1
- package/src/sap/fe/core/messagebundle_ca.properties +2 -1
- package/src/sap/fe/core/messagebundle_cnr.properties +2 -1
- package/src/sap/fe/core/messagebundle_cs.properties +4 -3
- package/src/sap/fe/core/messagebundle_cy.properties +2 -1
- package/src/sap/fe/core/messagebundle_da.properties +2 -1
- package/src/sap/fe/core/messagebundle_de.properties +8 -7
- package/src/sap/fe/core/messagebundle_el.properties +4 -3
- package/src/sap/fe/core/messagebundle_en.properties +2 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +2 -1
- package/src/sap/fe/core/messagebundle_es.properties +5 -4
- package/src/sap/fe/core/messagebundle_es_MX.properties +2 -1
- package/src/sap/fe/core/messagebundle_et.properties +2 -1
- package/src/sap/fe/core/messagebundle_fi.properties +2 -1
- package/src/sap/fe/core/messagebundle_fr.properties +2 -1
- package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -1
- package/src/sap/fe/core/messagebundle_hi.properties +2 -1
- package/src/sap/fe/core/messagebundle_hr.properties +2 -1
- package/src/sap/fe/core/messagebundle_hu.properties +2 -1
- package/src/sap/fe/core/messagebundle_id.properties +2 -1
- package/src/sap/fe/core/messagebundle_it.properties +2 -1
- package/src/sap/fe/core/messagebundle_iw.properties +2 -1
- package/src/sap/fe/core/messagebundle_ja.properties +3 -2
- package/src/sap/fe/core/messagebundle_kk.properties +2 -1
- package/src/sap/fe/core/messagebundle_ko.properties +2 -1
- package/src/sap/fe/core/messagebundle_lt.properties +2 -1
- package/src/sap/fe/core/messagebundle_lv.properties +2 -1
- package/src/sap/fe/core/messagebundle_mk.properties +2 -1
- package/src/sap/fe/core/messagebundle_ms.properties +2 -1
- package/src/sap/fe/core/messagebundle_nl.properties +2 -1
- package/src/sap/fe/core/messagebundle_no.properties +3 -2
- package/src/sap/fe/core/messagebundle_pl.properties +2 -1
- package/src/sap/fe/core/messagebundle_pt.properties +2 -1
- package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -1
- package/src/sap/fe/core/messagebundle_ro.properties +2 -1
- package/src/sap/fe/core/messagebundle_ru.properties +2 -1
- package/src/sap/fe/core/messagebundle_sh.properties +2 -1
- package/src/sap/fe/core/messagebundle_sk.properties +2 -1
- package/src/sap/fe/core/messagebundle_sl.properties +2 -1
- package/src/sap/fe/core/messagebundle_sr.properties +2 -1
- package/src/sap/fe/core/messagebundle_sv.properties +2 -1
- package/src/sap/fe/core/messagebundle_th.properties +2 -1
- package/src/sap/fe/core/messagebundle_tr.properties +2 -1
- package/src/sap/fe/core/messagebundle_uk.properties +2 -1
- package/src/sap/fe/core/messagebundle_vi.properties +2 -1
- package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -1
- package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -1
- package/src/sap/fe/core/rootView/Fcl.controller.js +8 -3
- package/src/sap/fe/core/rootView/Fcl.controller.ts +14 -7
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +8 -2
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +75 -90
- package/src/sap/fe/core/templating/EntitySetHelper.ts +92 -118
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +0 -68
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +0 -52
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +0 -144
|
@@ -216,6 +216,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
|
+
this.removeTransitionMessagesForPreviousContext();
|
|
219
220
|
return this._oRoutingService.navigateToContext(context, parameters, this._oView.getViewData(), this._oTargetInformation);
|
|
220
221
|
}
|
|
221
222
|
|
|
@@ -231,7 +232,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
231
232
|
if (ModelHelper.isCollaborationDraftSupported(metaModel) && originalContext.getProperty("IsActiveEntity") === false) {
|
|
232
233
|
// If we're in a collaboration application, and we're navigating to a draft instance from the LR,
|
|
233
234
|
// We want to check if the draft instance exists first. Otherwise we navigate to the original (draft) version.
|
|
234
|
-
|
|
235
|
+
let draftOrActiveContext = await getDraftOrActiveContext(originalContext);
|
|
235
236
|
if (draftOrActiveContext !== null && originalContext.getPath() !== draftOrActiveContext.getPath()) {
|
|
236
237
|
// Notify the user that we have navigated to the saved instance
|
|
237
238
|
const objectPath = getInvolvedDataModelObjects(metaModel.getMetaContext(originalContext.getPath()));
|
|
@@ -240,6 +241,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
240
241
|
// FCL: replace the context in the list binding
|
|
241
242
|
const contextToReplaceWith = model.getKeepAliveContext(draftOrActiveContext.getPath());
|
|
242
243
|
originalContext.replaceWith(contextToReplaceWith);
|
|
244
|
+
draftOrActiveContext = contextToReplaceWith; // Use the keep-alive context for navigation
|
|
243
245
|
} else {
|
|
244
246
|
// Fullscreen: trigger a refresh of the list binding
|
|
245
247
|
EditState.setEditStateDirty();
|
|
@@ -360,6 +362,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
360
362
|
// The route has level 0 --> we need to leave the collaboration session as no OP is displayed
|
|
361
363
|
this.base.collaborativeDraft.disconnect();
|
|
362
364
|
}
|
|
365
|
+
this.removeTransitionMessagesForPreviousContext();
|
|
363
366
|
this._setBindingContext(null); // This also call setKeepAlive(false) on the current context
|
|
364
367
|
resolve();
|
|
365
368
|
}, 0);
|
|
@@ -686,6 +689,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
686
689
|
const semanticKeys = oDraftRoot ? dataModelObject?.targetEntityType.annotations.Common?.SemanticKey?.map(key => key.value) ?? [] : [];
|
|
687
690
|
const oRootViewController = this._oAppComponent.getRootViewController();
|
|
688
691
|
if (oRootViewController.isFclEnabled()) {
|
|
692
|
+
mParameters.$$groupId = "$auto.Workers"; // We need to use the same group ID as for the parent list binding
|
|
689
693
|
const oContext = this._getKeepAliveContext(oModel, sPath, false, mParameters);
|
|
690
694
|
if (!oContext) {
|
|
691
695
|
throw new Error(`Cannot create keepAlive context ${sPath}`);
|
|
@@ -979,9 +983,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
|
|
|
979
983
|
}
|
|
980
984
|
// Removes transition message for the specified context
|
|
981
985
|
messageHandling.removeTransistionMessageForContext(oContext);
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
/**
|
|
989
|
+
* Removes all the transition messages of the context from where the navigation has been triggered.
|
|
990
|
+
*/;
|
|
991
|
+
_proto.removeTransitionMessagesForPreviousContext = function removeTransitionMessagesForPreviousContext() {
|
|
992
|
+
const previousContext = this.getView().getBindingContext();
|
|
993
|
+
if (previousContext) {
|
|
994
|
+
messageHandling.removeAllTransitionMessagesForContext(previousContext);
|
|
995
|
+
}
|
|
982
996
|
};
|
|
983
997
|
return InternalRouting;
|
|
984
998
|
}(ControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onDataReceived", [_dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onDataReceived"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype), _class2)) || _class);
|
|
985
999
|
return InternalRouting;
|
|
986
1000
|
}, false);
|
|
987
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJfZGVjNCIsInB1YmxpY0V4dGVuc2lvbiIsIl9kZWM1IiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsIl9kZWMxMSIsIl9kZWMxMiIsIl9kZWMxMyIsIl9kZWMxNCIsIl9kZWMxNSIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiQmVmb3JlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9Db250cm9sbGVyRXh0ZW5zaW9uIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsImRldGFjaFJvdXRlTWF0Y2hlZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiaXNBIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsImRlZmVycmVkQ3JlYXRpb24iLCJuYXZpZ2F0ZVRvVGFyZ2V0Iiwib0NvbnRleHQiLCJzTmF2aWdhdGlvblRhcmdldE5hbWUiLCJiUHJlc2VydmVIaXN0b3J5IiwiZGVsYXllZFVzYWdlIiwib05hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJvRGV0YWlsUm91dGUiLCJkZXRhaWwiLCJzUm91dGVOYW1lIiwicm91dGUiLCJtUGFyYW1ldGVyTWFwcGluZyIsInBhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvIiwiZ2V0SGFzaEZvck5hdmlnYXRpb24iLCJjb250ZXh0IiwibmF2aWdhdGlvblRhcmdldE5hbWUiLCJuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsImRldGFpbFJvdXRlIiwicm91dGVOYW1lIiwicGFyYW1ldGVyTWFwcGluZyIsImdldEhhc2hGcm9tUm91dGUiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImxlbmd0aCIsInVuZGVmaW5lZCIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY3JlYXRlZENvbnRleHQiLCJjaGVja05vSGFzaENoYW5nZSIsImVkaXRhYmxlIiwicGVyc2lzdE9QU2Nyb2xsIiwidXBkYXRlRkNMTGV2ZWwiLCJmb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJjYWxsRXh0ZW5zaW9uIiwiaW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwic2V0UHJvcGVydHkiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsImhpZGRlbkJpbmRpbmciLCJiYWNrUGF0aCIsImdldFBhdGhUb05hdmlnYXRlQmFjayIsImdldFBhdGgiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm92ZXJyaWRlTmF2Iiwib25CZWZvcmVOYXZpZ2F0aW9uIiwiZGVzdHJveSIsIlByb21pc2UiLCJyZXNvbHZlIiwiRkNMTGV2ZWwiLCJnZXRGQ0xMZXZlbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiaXNQYXRoT25EcmFmdFJvb3QiLCJjb250ZXh0Rm9yTmF2aWdhdGlvbiIsImdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUiLCJnZXRWaWV3RGF0YSIsIm9yaWdpbmFsQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRQcm9wZXJ0eSIsImRyYWZ0T3JBY3RpdmVDb250ZXh0IiwiZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGVhZGVySW5mbyIsIlR5cGVOYW1lIiwibmFtZSIsImlzRmNsRW5hYmxlZCIsImNvbnRleHRUb1JlcGxhY2VXaXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcGxhY2VXaXRoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJwYXJlbnRCaW5kaW5nIiwiZ2V0QmluZGluZyIsImFnZ3JlZ2F0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJoaWVyYXJjaHlRdWFsaWZpZXIiLCJncm91cCIsImFnZ3JlZ2F0ZSIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJzSGFzaCIsImdldEhhc2giLCJpbmNsdWRlcyIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibVBhcmFtZXRlcnMiLCJuYXZUb0hhc2giLCJnZXREZWZhdWx0Q3JlYXRlSGFzaCIsImRpc3BsYXlFcnJvclBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJfaXNWaWV3UGFydE9mUm91dGUiLCJyb3V0ZUluZm9ybWF0aW9uIiwiYVRhcmdldHMiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsInZpZXdMZXZlbCIsInJvdXRlTGV2ZWwiLCJnZXRSb3V0aW5nU2VydmljZSIsImFkZEJpbmRpbmdDbGVhbnVwUHJvbWlzZSIsInNldFRpbWVvdXQiLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJkaXNjb25uZWN0IiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImJBY3Rpb25DcmVhdGUiLCJvRXZlbnQiLCJnZXRQYXJhbWV0ZXIiLCJnZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsIm1Bcmd1bWVudHMiLCJnZXRQYXJhbWV0ZXJzIiwib05hdmlnYXRpb25QYXJhbWV0ZXJzIiwiYmluZFByb21pc2UiLCJvTW9kZWwiLCJfYmluZERlZmVycmVkIiwiRWRpdEZsb3dBY3Rpb24iLCJpc09wZW5JbkVkaXRNb2RlIiwiX2JpbmRQYWdlRm9yRWRpdCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ0b1N0cmluZyIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3IiwidGFyZ2V0UGF0aCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsImxpc3RCaW5kaW5nIiwicGFyZW50Q29udGV4dCIsImRhdGEiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJ0ZWNobmljYWxQYXRoIiwicmVzb2x2ZVBhdGgiLCJpc1N0aWNreUVkaXRNb2RlIiwiaXNTdGlja3kiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJhY3RpdmVDb250ZXh0IiwidXNlQ29udGV4dCIsIl9jcmVhdGVDb250ZXh0IiwiZWRpdEZsb3ciLCJlZGl0RG9jdW1lbnQiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsImUiLCJtZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlcyIsInNUYXJnZXRQYXRoIiwib0N1cnJlbnRDb250ZXh0IiwiX2dldEJpbmRpbmdDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwic2hvdWxkUmVmcmVzaENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImlzRHJhZnRTdXBwb3J0ZWQiLCJpc0Nvbm5lY3RlZCIsInJlc2V0Q2hhbmdlcyIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0R3JvdXBJZCIsImVyciIsImJQZXJzaXN0T1BTY3JvbGwiLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwiQXBwU3RhdGVDaGFuZ2VkIiwiUmVzdG9yZUhpc3RvcnkiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIl9zZXRLZWVwQWxpdmUiLCJpc0V4aXRpbmciLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsImV4ZWN1dGVTaGFyZUFjdGlvbiIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsImlubGluZUVkaXRGbG93IiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJJTkxJTkVFRElUX1VQREFURUdST1VQSUQiLCJvRHJhZnRSb290IiwiZ2V0T2JqZWN0Iiwib0RyYWZ0Tm9kZSIsImRhdGFNb2RlbE9iamVjdCIsImdldENvbnRleHQiLCJhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsInRhcmdldEVudGl0eVNldCIsInNlbWFudGljS2V5cyIsIkNvbW1vbiIsIlNlbWFudGljS2V5IiwibWFwIiwia2V5IiwidmFsdWUiLCJfZ2V0S2VlcEFsaXZlQ29udGV4dCIsInByb3BlcnRpZXNUb1JlcXVlc3QiLCJjb25jYXQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicHJvcGVydGllc1RvU2VsZWN0Iiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsInB1c2giLCIkc2VsZWN0Iiwiam9pbiIsIm9QcmV2aW91c0JpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwib0hpZGRlbkJpbmRpbmciLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsImhvbGRNZXNzYWdlc0ZvckNvbnRyb2wiLCJvbkRhdGFSZWNlaXZlZCIsImlzTG9ja2VkIiwidW5sb2NrIiwibVBhcmFtcyIsImVycm9yU3RhdHVzIiwic3RhdHVzIiwiY2F1c2UiLCJvUmVzb3VyY2VCdW5kbGUiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJzaGVsbEJhY2siLCJpc0RhdGFSZWNlaXZlZEVycm9yIiwiY29udHJvbCIsInJlbGVhc2VIb2xkQnlDb250cm9sIiwib0JpbmRpbmdDb250ZXh0Iiwib1NpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsInRhcmdldFByb3BlcnRpZXMiLCJ0YXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiYURlcGVuZGVudEJpbmRpbmdzIiwic1JlbGF0aXZlUGF0aCIsInNsaWNlIiwiZ2V0RGVwZW5kZW50QmluZGluZ3MiLCJpdGVtIiwiaSIsInJlZHVjZSIsInRhcmdldFByb3BlcnR5IiwiaW5kZXgiLCJpbmRleE9mIiwib1ByZXZpb3VzQ29udGV4dCIsIm9UYXJnZXRDb250cm9sIiwic2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsImJLZWVwQWxpdmUiLCJmbkJlZm9yZURlc3Ryb3kiLCJiUmVxdWVzdE1lc3NhZ2VzIiwiZW5kc1dpdGgiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwic3BsaXQiLCJhZGRpdGlvbm5hbFNlZ21lbnRzIiwicG9wIiwia2VwdEFsaXZlUGF0aCIsIm9LZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwibGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImlzRG9jdW1lbnRNb2RpZmllZCIsIlVpTW9kZWxDb25zdGFudHMiLCJEb2N1bWVudE1vZGlmaWVkIiwiaXNIaWRkZW5EcmFmdEVuYWJsZWQiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsImdldENhcGFiaWxpdGllcyIsIkhpZGRlbkRyYWZ0IiwiZW5hYmxlZCIsInNraXBEaXNjYXJkUG9wb3ZlciIsInNraXBCYWNrTmF2aWdhdGlvbiIsImNhbmNlbERvY3VtZW50IiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVRyYW5zaXN0aW9uTWVzc2FnZUZvckNvbnRleHQiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsIk9iamVjdCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZXJuYWxSb3V0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW50aXR5U2V0LCBFbnRpdHlUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IHsgdHlwZSBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQsIHR5cGUgU2hvd01lc3NhZ2VzUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB7IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0LCBpc1BhdGhPbkRyYWZ0Um9vdCwgcmVzb2x2ZVBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Db250ZXh0UGF0aEhlbHBlclwiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuaW1wb3J0IHR5cGUgUm91dGVyUHJveHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvUm91dGVyUHJveHlcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIEZjbENvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L0ZjbC5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbywgUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzLCBSb3V0aW5nU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdUYXJnZXQgfSBmcm9tIFwic2FwL3VpL2NvcmUvTWFuaWZlc3RcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBIaWRkZW5EcmFmdCB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1RhcmdldFR5cGUgfSBmcm9tIFwiLi4vc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcIi4vZWRpdEZsb3cvZWRpdEZsb3dDb25zdGFudHNcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5cbnR5cGUgUm91dGVJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0cz86IHVua25vd25bXTtcblx0cm91dGVMZXZlbDogbnVtYmVyO1xufTtcbi8qKlxuICoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5Db250cm9sbGVyRXh0ZW5zaW9uIENvbnRyb2xsZXIgZXh0ZW5zaW9ufVxuICogQHNpbmNlIDEuNzQuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcIilcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIF9vVmlldyE6IEZFVmlldztcblxuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXG5cdHByaXZhdGUgX29QYWdlQ29tcG9uZW50ITogRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+IHwgbnVsbDtcblxuXHRwcml2YXRlIF9vUm91dGVyITogUm91dGVyO1xuXG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXG5cdHByaXZhdGUgX2ZuUm91dGVNYXRjaGVkQm91bmQ/OiBGdW5jdGlvbjtcblxuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbiE6IFJvdXRpbmdUYXJnZXQ7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25FeGl0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9vUm91dGluZ1NlcnZpY2UgJiYgdGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCkge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHR9XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KSBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0dGhpcy5fb1JvdXRlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0dGhpcy5fb1JvdXRlclByb3h5ID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKCF0aGlzLl9vQXBwQ29tcG9uZW50IHx8ICF0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY29udHJvbGVyIGV4dGVuc2lvbiAnc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVzaW9ucy5JbnRlcm5hbFJvdXRpbmdcIik7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudCA9PT0gdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGlzbid0IGhvc3RlZCBpbiBhIGRlZGljYXRlZCBVSUNvbXBvbmVudCwgYnV0IGRpcmVjdGx5IGluIHRoZSBhcHBcblx0XHRcdC8vIC0tPiBqdXN0IGtlZXAgdGhlIHZpZXdcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBSb3V0aW5nU2VydmljZSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgPSBvUm91dGluZ1NlcnZpY2U7XG5cdFx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudD8uaXNBKFwic2FwLmZlLmNvcmUuUmV1c2VDb21wb25lbnRcIikgIT09IHRydWUpIHtcblx0XHRcdFx0XHQvLyBSZXVzZSBjb21wb25lbnRzIGNhbiBwb3RlbnRpYWxseSBlbWJlZCBhIHZpZXcgd2l0aCBhIHBhZ2UgY29udHJvbGxlciwgd2Ugd2FudCB0byBhdm9pZCBhdHRhY2hpbmcgdGhlIHJvdXRlIG1hdGNoZWQgZXZlbnQgaW4gdGhpcyBjYXNlXG5cdFx0XHRcdFx0dGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmF0dGFjaFJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fb1RhcmdldEluZm9ybWF0aW9uID0gb1JvdXRpbmdTZXJ2aWNlLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKHRoaXMuX29QYWdlQ29tcG9uZW50IHx8IHRoaXMuX29WaWV3KSEgPz8ge307XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGNhbm5vdCB3b3JrIHdpdGhvdXQgYSAncm91dGluZ1NlcnZpY2UnIG9uIHRoZSBtYWluIEFwcENvbXBvbmVudFwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJlZCBldmVyeSB0aW1lIHRoaXMgY29udHJvbGxlciBpcyBhIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZCgpOiB2b2lkIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZUJpbmRpbmcoX2JpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge31cblxuXHRiZWZvcmVTZXRCaW5kaW5nQ29udGV4dChiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCwgX21QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKGJpbmRpbmdDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkub25Db250ZXh0Qm91bmRUb1ZpZXcoYmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0YWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IG9iamVjdCk6IHZvaWQge1xuXHRcdHRoaXMub25BZnRlckJpbmRpbmcoYmluZGluZ0NvbnRleHQsIHsgLi4uX21QYXJhbWV0ZXJzLCBkZWZlcnJlZENyZWF0aW9uOiB0cnVlIH0pO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25BZnRlckJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRyaWdnZXJpbmcgYSBuYXZpZ2F0aW9uIGFmdGVyIGEgdXNlciBhY3Rpb25cblx0Ly8gKGUuZy4gY2xpY2sgb24gYSB0YWJsZSByb3csIGJ1dHRvbiwgZXRjLi4uKVxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHBhcmFtIGRlbGF5ZWRVc2FnZSBUcnVlIHRvIHJldHVybiBhIGZ1bmN0aW9uIGZvciBleGVjdXRpbmcgdGhlIG5hdmlnYXRpb24sIEZhbHNlIHRvIGV4ZWN1dGUgdGhlIG5hdmlnYXRpb24gaW1tZWRpYXRlbHlcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlVG9UYXJnZXQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0c05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0ZGVsYXllZFVzYWdlPzogdHJ1ZVxuXHQpOiBQcm9taXNlPCgpID0+IHZvaWQ+O1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IGJvb2xlYW5cblx0KTogUHJvbWlzZTwoKCkgPT4gdm9pZCkgfCB2b2lkPiB7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25Db25maWd1cmF0aW9uID1cblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oc05hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAob05hdmlnYXRpb25Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsUm91dGUgPSBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9EZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJNYXBwaW5nID0gb0RldGFpbFJvdXRlLnBhcmFtZXRlcnM7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJNYXBwaW5nLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIG51bGwsIG51bGwsIGJQcmVzZXJ2ZUhpc3RvcnksIGRlbGF5ZWRVc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgSGFzaCB3ZSdyZSBuYXZpZ2F0aW5nIHRvLlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcmV0dXJucyBUaGUgSGFzaCB3ZSdyZSBuYXZpZ2F0aW5nIHRvXG5cdCAqL1xuXHRhc3luYyBnZXRIYXNoRm9yTmF2aWdhdGlvbihjb250ZXh0OiBDb250ZXh0LCBuYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCBuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9IHRoaXM/Ll9vUGFnZUNvbXBvbmVudD8uZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24obmF2aWdhdGlvblRhcmdldE5hbWUpO1xuXHRcdGlmIChuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3QgZGV0YWlsUm91dGUgPSBuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbi5kZXRhaWw7XG5cdFx0XHRjb25zdCByb3V0ZU5hbWUgPSBkZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IHBhcmFtZXRlck1hcHBpbmcgPSBkZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRIYXNoRnJvbVJvdXRlKGNvbnRleHQsIHJvdXRlTmFtZSwgcGFyYW1ldGVyTWFwcGluZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0SGFzaEZyb21Sb3V0ZShjb250ZXh0LCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQgcm91dGUuXG5cdCAqIEBwYXJhbSBzVGFyZ2V0Um91dGVOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCByb3V0ZVxuXHQgKiBAcGFyYW0gW29QYXJhbWV0ZXJzXSBQYXJhbWV0ZXJzIHRvIGJlIHVzZWQgd2l0aCByb3V0ZSB0byBjcmVhdGUgdGhlIHRhcmdldCBoYXNoXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdGFzeW5jIG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB0byAndHJ1ZScgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQsICdmYWxzZScgaWYgdGhlIG5hdmlnYXRpb24gZGlkIG5vdCBoYXBwZW5cblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQ6IENvbnRleHQgfCBPRGF0YUxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmIChjb250ZXh0LmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRpZiAocGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycz8ubW9kZSA9PT0gXCJBc3luY1wiKSB7XG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGVpdGhlciBjcmVhdGVkIGFzeW5jIChQcm9taXNlKVxuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIGFjdGl2YXRlIHRoZSByb3V0ZU1hdGNoU3luY2hybyBvbiB0aGUgUm91dGVyUHJveHkgdG8gYXZvaWQgdGhhdFxuXHRcdFx0XHQvLyB0aGUgc3Vic2VxdWVudCBjYWxsIHRvIG5hdmlnYXRlVG9Db250ZXh0IGNvbmZsaWN0cyB3aXRoIHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKCk7XG5cblx0XHRcdFx0cGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycy5jcmVhdGVDb250ZXh0UHJvbWlzZVxuXHRcdFx0XHRcdC50aGVuKGFzeW5jIChjcmVhdGVkQ29udGV4dCkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gb25jZSB0aGUgY29udGV4dCBpcyByZXR1cm5lZCB3ZSBuYXZpZ2F0ZSBpbnRvIGl0XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChjcmVhdGVkQ29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogcGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZSxcblx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IHBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRcdFx0XHRcdHBlcnNpc3RPUFNjcm9sbDogcGFyYW1ldGVycy5wZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsOiBwYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsLFxuXHRcdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiBwYXJhbWV0ZXJzLmZvcmNlRm9jdXNcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdpdGggdGhlIGFzeW5jIGNvbnRleHRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgIT09IFwiRGVmZXJyZWRcIikge1xuXHRcdFx0XHQvLyBOYXZpZ2F0ZSB0byBhIGxpc3QgYmluZGluZyBub3QgeWV0IHN1cHBvcnRlZFxuXHRcdFx0XHR0aHJvdyBcIm5hdmlnYXRpb24gdG8gYSBsaXN0IGJpbmRpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWRcIjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMuY2FsbEV4dGVuc2lvbikge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXG5cdFx0XHQvLyBTdG9yaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0IHRvIHVzZSBpdCBpbiBpbnRlcm5hbCByb3V0ZSBuYXZpZ2F0aW9uIGlmIG5lY2Vzc2FyeS5cblx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IG51bGwgPSBjb250ZXh0O1xuXHRcdFx0bGV0IGhpZGRlbkJpbmRpbmc6IE9EYXRhQ29udGV4dEJpbmRpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAocGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9PT0gLTEpIHtcblx0XHRcdFx0Ly8gSWYgd2UncmUgbmF2aWdhdGluZyBiYWNrLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIFwicGFyZW50XCIgY29udGV4dFxuXHRcdFx0XHRjb25zdCBiYWNrUGF0aCA9IHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRQYXRoVG9OYXZpZ2F0ZUJhY2soY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHQvLyBBcyB3ZSBkb24ndCBjYWxsIHRoZSBleHRlbnNpb24gd2hlbiBuYXZpZ2F0aW5nIGJhY2sgdG8gdGhlIExSLCBiYWNrUGF0aCBpcyBuZXZlciBlbXB0eSBzbyB3ZSBjYW4gc2FmZWx5IGNyZWF0ZSBhIGNvbnRleHRcblx0XHRcdFx0aGlkZGVuQmluZGluZyA9IGNvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChiYWNrUGF0aCk7XG5cdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gaGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG92ZXJyaWRlTmF2ID0gYXdhaXQgdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkucm91dGluZy5vbkJlZm9yZU5hdmlnYXRpb24oeyBiaW5kaW5nQ29udGV4dDogY29udGV4dFRvTmF2aWdhdGUgfSk7XG5cdFx0XHRoaWRkZW5CaW5kaW5nPy5kZXN0cm95KCk7XG5cdFx0XHRpZiAob3ZlcnJpZGVOYXYpIHtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBjb250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRwYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0Ly8gSW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIGZyb20gYSB0YWJsZSBpbiBhIExpc3RSZXBvcnQgd2l0aCBkcmFmdCwgdGhlcmUncyBzcGVjaWFsIGhhbmRsaW5nIGZvciBjb2xsYWJvcmF0aW9uIGFuZCB0cmVlIHRhYmxlLlxuXHRcdC8vIFdlIG1heSBub3QgbmF2aWdhdGUgdG8gdGhlIGNvbnRleHQgdGhlIHVzZXIgY2xpY2tlZCBvbi5cblx0XHRpZiAocGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MgJiYgY29udGV4dC5pc0E8Q29udGV4dD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdFx0aWYgKGlzUGF0aE9uRHJhZnRSb290KGNvbnRleHQuZ2V0UGF0aCgpLCBtZXRhTW9kZWwpKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRGb3JOYXZpZ2F0aW9uID1cblx0XHRcdFx0XHQoYXdhaXQgdGhpcy5nZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMpKSA/P1xuXHRcdFx0XHRcdChhd2FpdCB0aGlzLmdldENvbnRleHRGb3JOYXZpZ2F0aW9uRnJvbVRyZWVPckFuYWx5dGljYWxUYWJsZShjb250ZXh0KSk7XG5cblx0XHRcdFx0Ly8gVXNlIGFub3RoZXIgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0aWYgKGNvbnRleHRGb3JOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHRGb3JOYXZpZ2F0aW9uO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0LCBwYXJhbWV0ZXJzLCB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQgaW5zdGFuY2UgZnJvbSB0aGUgTFIgYW5kIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbi5cblx0ICogQHBhcmFtIG9yaWdpbmFsQ29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29udGV4dCwgbnVsbCBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZ2V0Q29udGV4dEZvck5hdmlnYXRpb25XaXRoQ29sbGFib3JhdGlvbihcblx0XHRvcmlnaW5hbENvbnRleHQ6IENvbnRleHQsXG5cdFx0cGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCk6IFByb21pc2U8Q29udGV4dCB8IG51bGw+IHtcblx0XHRjb25zdCBtb2RlbCA9IG9yaWdpbmFsQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwpICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gSWYgd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhIGRyYWZ0IGluc3RhbmNlIGZyb20gdGhlIExSLFxuXHRcdFx0Ly8gV2Ugd2FudCB0byBjaGVjayBpZiB0aGUgZHJhZnQgaW5zdGFuY2UgZXhpc3RzIGZpcnN0LiBPdGhlcndpc2Ugd2UgbmF2aWdhdGUgdG8gdGhlIG9yaWdpbmFsIChkcmFmdCkgdmVyc2lvbi5cblx0XHRcdGNvbnN0IGRyYWZ0T3JBY3RpdmVDb250ZXh0ID0gYXdhaXQgZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQob3JpZ2luYWxDb250ZXh0KTtcblxuXHRcdFx0aWYgKGRyYWZ0T3JBY3RpdmVDb250ZXh0ICE9PSBudWxsICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkgIT09IGRyYWZ0T3JBY3RpdmVDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHQvLyBOb3RpZnkgdGhlIHVzZXIgdGhhdCB3ZSBoYXZlIG5hdmlnYXRlZCB0byB0aGUgc2F2ZWQgaW5zdGFuY2Vcblx0XHRcdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob3JpZ2luYWxDb250ZXh0LmdldFBhdGgoKSkpO1xuXHRcdFx0XHRwYXJhbWV0ZXJzLnJlZGlyZWN0ZWRUb05vbkRyYWZ0ID1cblx0XHRcdFx0XHQob2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5IZWFkZXJJbmZvPy5UeXBlTmFtZSBhcyB1bmtub3duIGFzIHN0cmluZykgPz9cblx0XHRcdFx0XHRvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUubmFtZTtcblxuXHRcdFx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdC8vIEZDTDogcmVwbGFjZSB0aGUgY29udGV4dCBpbiB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dFRvUmVwbGFjZVdpdGggPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGRyYWZ0T3JBY3RpdmVDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0b3JpZ2luYWxDb250ZXh0LnJlcGxhY2VXaXRoKGNvbnRleHRUb1JlcGxhY2VXaXRoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBGdWxsc2NyZWVuOiB0cmlnZ2VyIGEgcmVmcmVzaCBvZiB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVc2UgdGhlIHNhdmVkIGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBkcmFmdE9yQWN0aXZlQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbnRleHRcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgZnJvbSB0aGUgTFIgYW5kIHdlJ3JlIGluIGEgVHJlZSBvciBBbmFseXRpY2FsIHRhYmxlLlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUob3JpZ2luYWxDb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IHBhcmVudEJpbmRpbmcgPSBvcmlnaW5hbENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGlmICghcGFyZW50QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhZ2dyZWdhdGlvbiA9IHBhcmVudEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhc1xuXHRcdFx0fCB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZzsgZ3JvdXA/OiBvYmplY3Q7IGFnZ3JlZ2F0ZT86IG9iamVjdCB9XG5cdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRpZiAoIWFnZ3JlZ2F0aW9uPy5oaWVyYXJjaHlRdWFsaWZpZXIgJiYgIWFnZ3JlZ2F0aW9uPy5ncm91cCAmJiAhYWdncmVnYXRpb24/LmFnZ3JlZ2F0ZSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBoaWVyYXJjaGljYWwvYW5hbHl0aWNhbCBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0Ly8gSWYgd2UncmUgaW4gYSBUcmVlL0FuYWx5dGljYWwgdGFibGUsIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGFuIGFjdGl2ZSBpbnN0YW5jZSBpbnN0YW5jZSB0aGF0IGhhcyBhIGRyYWZ0LFxuXHRcdFx0Ly8gLS0+IFdlIHRyeSB0byBuYXZpZ2F0ZSB0byB0aGUgZHJhZnQgaW5zdGFuY2UgKGlmIGl0IHN0aWxsIGV4aXN0cylcblx0XHRcdGNvbnN0IGRyYWZ0T3JBY3RpdmVDb250ZXh0ID0gYXdhaXQgZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQob3JpZ2luYWxDb250ZXh0KTtcblxuXHRcdFx0aWYgKGRyYWZ0T3JBY3RpdmVDb250ZXh0ICE9PSBudWxsICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkgIT09IGRyYWZ0T3JBY3RpdmVDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHQvLyBVc2UgdGhlIGRyYWZ0IGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBkcmFmdE9yQWN0aXZlQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbnRleHRcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIGZyb20gYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCBmcm9tXG5cdCAqIEBwYXJhbSBbcGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlQmFja0Zyb21Db250ZXh0KGNvbnRleHQ6IENvbnRleHQsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IC0xO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGZvcndhcmRzIHRvIGEgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0LCBwYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiBoaXN0b3J5IGlmIHRoZSBjdXJyZW50IGhhc2ggY29ycmVzcG9uZHMgdG8gYSB0cmFuc2llbnQgc3RhdGUuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk6IHZvaWQge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKTtcblxuXHRcdC8vIGlmIHRyaWdnZXJlZCB3aGlsZSBuYXZpZ2F0aW5nIHRvICguLi4pLCB3ZSBuZWVkIHRvIG5hdmlnYXRlIGJhY2tcblx0XHRpZiAoc0hhc2guaW5jbHVkZXMoXCIoLi4uKVwiKSkge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdkJhY2soKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzcGxheXMgYW4gZXJyb3IgKGlsbHVzdHJhdGVkIG1lc3NhZ2UpIGluIHRoZSBwYWdlLlxuXHQgKiBAcGFyYW0gc0Vycm9yTWVzc2FnZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBwcm9taXNlXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogc3RyaW5nLCBtUGFyYW1ldGVyczogTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRpZiAodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWNyZWF0ZVwiKSB8fCB0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluY2x1ZGVzKFwiaS1hY3Rpb249YXV0b0NyZWF0ZVwiKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZUb0hhc2godGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldERlZmF1bHRDcmVhdGVIYXNoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5kaXNwbGF5RXJyb3JQYWdlKHNFcnJvck1lc3NhZ2UsIG1QYXJhbWV0ZXJzLCB0aGlzLmdldEZDTExldmVsKCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdGF0ZSBpcyBpbXBhY3RlZCBieSB0aGUgY29udGV4dFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0KTtcblx0fVxuXG5cdF9pc1ZpZXdQYXJ0T2ZSb3V0ZShyb3V0ZUluZm9ybWF0aW9uPzogUm91dGVJbmZvcm1hdGlvbik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gcm91dGVJbmZvcm1hdGlvbj8udGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8ICFhVGFyZ2V0cy5pbmNsdWRlcyh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udGFyZ2V0TmFtZSkpIHtcblx0XHRcdC8vIElmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBoYXMgYSB2aWV3IGxldmVsIGdyZWF0ZXIgdGhhbiB0aGUgcm91dGUgbGV2ZWwsIGl0IG1lYW5zIHRoaXMgdmlldyBjb21lcyBcImFmdGVyXCIgdGhlIHJvdXRlXG5cdFx0XHQvLyBpbiB0ZXJtcyBvZiBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gSW4gc3VjaCBjYXNlLCB3ZSByZW1vdmUgaXRzIGJpbmRpbmcgY29udGV4dCwgdG8gYXZvaWQgdGhpcyB2aWV3IHRvIGhhdmUgZGF0YSBpZiB3ZSBuYXZpZ2F0ZSB0byBpdCBsYXRlciBvblxuXHRcdFx0Ly8gVGhpcyBpcyBkb25lIGluIGEgdGltZW91dCB0byBhbGxvdyBmb3IgZm9jdXNvdXQgZXZlbnRzIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUgcHJvcGVybHkgaW4gY29sbGFib3JhdGl2ZSBkcmFmdFxuXHRcdFx0aWYgKCh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udmlld0xldmVsID8/IDApID49IChyb3V0ZUluZm9ybWF0aW9uPy5yb3V0ZUxldmVsID8/IDApKSB7XG5cdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hZGRCaW5kaW5nQ2xlYW51cFByb21pc2UoXG5cdFx0XHRcdFx0bmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSByb3V0ZSBoYXMgbGV2ZWwgMCAtLT4gd2UgbmVlZCB0byBsZWF2ZSB0aGUgY29sbGFib3JhdGlvbiBzZXNzaW9uIGFzIG5vIE9QIGlzIGRpc3BsYXllZFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpOyAvLyBUaGlzIGFsc28gY2FsbCBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIHRoZSBjdXJyZW50IGNvbnRleHRcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9idWlsZEJpbmRpbmdQYXRoKFxuXHRcdHJvdXRlQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBvYmplY3Q+LFxuXHRcdGJpbmRpbmdQYXR0ZXJuOiBzdHJpbmcsXG5cdFx0bmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mb1xuXHQpOiB7IHBhdGg6IHN0cmluZzsgZGVmZXJyZWQ6IGJvb2xlYW4gfSB7XG5cdFx0bGV0IHBhdGggPSBiaW5kaW5nUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0bGV0IGRlZmVycmVkID0gZmFsc2U7XG5cblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gcm91dGVBcmd1bWVudHMpIHtcblx0XHRcdGNvbnN0IHNWYWx1ZSA9IHJvdXRlQXJndW1lbnRzW3NLZXldO1xuXG5cdFx0XHRpZiAodHlwZW9mIHNWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNWYWx1ZSA9PT0gXCIuLi5cIiAmJiBiaW5kaW5nUGF0dGVybi5pbmNsdWRlcyhgeyR7c0tleX19YCkpIHtcblx0XHRcdFx0ZGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3NLZXl9fWAsIHNWYWx1ZSk7XG5cdFx0fVxuXHRcdGlmICgocm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik/LltcImktYWN0aW9uXCJdPy5pbmNsdWRlcyhcImNyZWF0ZVwiKSkge1xuXHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIGJpbmRpbmcgcGF0aCBpcyBhbHdheXMgYWJzb2x1dGVcblx0XHRpZiAocGF0aCAmJiBwYXRoWzBdICE9PSBcIi9cIikge1xuXHRcdFx0cGF0aCA9IGAvJHtwYXRofWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgcGF0aCwgZGVmZXJyZWQgfTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdG8gYmluZCB0aGUgcGFnZSB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZFxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEJ1aWxkcyB0aGUgYmluZGluZyBjb250ZXh0IGZyb20gdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycywgYW5kIGJpbmQgdGhlIHBhZ2UgYWNjb3JkaW5nbHkuXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChcblx0XHRvRXZlbnQ6IEV2ZW50PHtcblx0XHRcdHJvdXRlSW5mb3JtYXRpb24/OiBSb3V0ZUluZm9ybWF0aW9uO1xuXHRcdFx0cm91dGVQYXR0ZXJuOiBzdHJpbmc7XG5cdFx0XHRuYXZpZ2F0aW9uSW5mbzogUm91dGluZ05hdmlnYXRpb25JbmZvO1xuXHRcdFx0YXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBvYmplY3Q+O1xuXHRcdH0+XG5cdCk6IHZvaWQge1xuXHRcdC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBpcyBwYXJ0IG9mIHRoZSBldmVudCB0YXJnZXRzIChpLmUuIGlzIGEgdGFyZ2V0IGZvciB0aGUgY3VycmVudCByb3V0ZSkuXG5cdFx0Ly8gSWYgbm90LCB3ZSBkb24ndCBuZWVkIHRvIGJpbmQgaXQgLS0+IHJldHVyblxuXHRcdGlmICghdGhpcy5faXNWaWV3UGFydE9mUm91dGUob0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlSW5mb3JtYXRpb25cIikpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0cmlldmUgdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0bGV0IGJpbmRpbmdQYXR0ZXJuO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4pIHtcblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKCk7XG5cdFx0fVxuXHRcdGJpbmRpbmdQYXR0ZXJuID0gYmluZGluZ1BhdHRlcm4gPz8gdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLmNvbnRleHRQYXR0ZXJuO1xuXG5cdFx0aWYgKGJpbmRpbmdQYXR0ZXJuID09PSBudWxsIHx8IGJpbmRpbmdQYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIERvbid0IGRvIHRoaXMgaWYgd2UgYWxyZWFkeSBnb3Qgc1RhcmdldCA9PSAnJywgd2hpY2ggaXMgYSB2YWxpZCB0YXJnZXQgcGF0dGVyblxuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVQYXR0ZXJuXCIpO1xuXHRcdH1cblxuXHRcdC8vIFJlcGxhY2UgdGhlIHBhcmFtZXRlcnMgYnkgdGhlaXIgdmFsdWVzIGluIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGNvbnN0IG1Bcmd1bWVudHMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVycygpLmFyZ3VtZW50cztcblx0XHRjb25zdCBvTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmF2aWdhdGlvbkluZm9cIik7XG5cdFx0Y29uc3QgeyBwYXRoLCBkZWZlcnJlZCB9ID0gdGhpcy5fYnVpbGRCaW5kaW5nUGF0aChtQXJndW1lbnRzLCBiaW5kaW5nUGF0dGVybiwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblxuXHRcdHRoaXMub25Sb3V0ZU1hdGNoZWQoKTtcblxuXHRcdGxldCBiaW5kUHJvbWlzZTtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpO1xuXHRcdGlmIChkZWZlcnJlZCkge1xuXHRcdFx0YmluZFByb21pc2UgPSB0aGlzLl9iaW5kRGVmZXJyZWQocGF0aCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiAhPT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbiAmJlxuXHRcdFx0KHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1lZGl0XCIpIHx8ICh0aGlzLl9vUGFnZUNvbXBvbmVudD8uaXNPcGVuSW5FZGl0TW9kZT8uKCkgPz8gZmFsc2UpKVxuXHRcdCkge1xuXHRcdFx0YmluZFByb21pc2UgPSB0aGlzLl9iaW5kUGFnZUZvckVkaXQocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlKHBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cblx0XHRiaW5kUHJvbWlzZVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGR1cmluZyBwYWdlIGJpbmRpbmcgXCIgKyBlcnJvci50b1N0cmluZygpKTtcblx0XHRcdH0pO1xuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS51cGRhdGVVSVN0YXRlRm9yVmlldyh0aGlzLl9vVmlldywgdGhpcy5nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIF9iaW5kRGVmZXJyZWQodGFyZ2V0UGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsLCB7IGVkaXRhYmxlOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAoIW5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIHx8IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzLm1vZGUgPT09IFwiRGVmZXJyZWRcIikge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lmxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5kYXRhLFxuXHRcdFx0XHRcdCEhbmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSB0aGUgY29udGV4dCB0byBhdm9pZCBzaG93aW5nIG9sZCBkYXRhXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB0aGUgcGFnZSBmcm9tIGEgcGF0aCwgaWYgdGhlIGFwcCBpcyBzdGFydGVkIHdpdGggdGhlIHByZWZlcnJlZCBtb2RlIGVkaXQuXG5cdCAqXG5cdCAqIElmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhbiBhY3RpdmUgZW50aXR5LCBpdCBpcyBkaXJlY3RseSBjb252ZXJ0ZWQgdG8gZHJhZnQgdXNpbmcgdGhlIEVkaXRGbG93IGNvbnRyb2xsZXIgZXh0ZW5zaW9uLlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aFxuXHQgKiBAcGFyYW0gbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBiaW5kaW5nIGhhcyBiZWVuIHNldCBvbiB0aGUgcGFnZVxuXHQgKi9cblx0YXN5bmMgX2JpbmRQYWdlRm9yRWRpdCh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkIHwgQ29udGV4dD4ge1xuXHRcdGlmICh0YXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0ZWNobmljYWxQYXRoOiBzdHJpbmcgPSBhd2FpdCByZXNvbHZlUGF0aCh0YXJnZXRQYXRoLCBtb2RlbCwgdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLCB0aGlzLl9vUm91dGVyKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Ly8gY2hlY2sgZm9yIHN0aWNreSAmIHN0aWNreSBlZGl0IHNlc3Npb25cblx0XHRcdGNvbnN0IGlzU3RpY2t5RWRpdE1vZGUgPSBDb21tb25VdGlscy5pc1N0aWNreUVkaXRNb2RlKHRoaXMuYmFzZS5nZXRWaWV3KCkpO1xuXHRcdFx0Y29uc3QgaXNTdGlja3kgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQobWV0YU1vZGVsKTtcblx0XHRcdGlmICh0ZWNobmljYWxQYXRoLmluY2x1ZGVzKFwiSXNBY3RpdmVFbnRpdHk9dHJ1ZVwiKSB8fCAoaXNTdGlja3kgJiYgIWlzU3RpY2t5RWRpdE1vZGUpKSB7XG5cdFx0XHRcdC8vIGNyZWF0ZSBjb250ZXh0IG9yIHVzZSB0aGUgb25lIHRoZSB1c2VyIGNsaWNrZWQgb25cblx0XHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dCA9XG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dD8uZ2V0UGF0aCgpID09PSB0ZWNobmljYWxQYXRoXG5cdFx0XHRcdFx0XHQ/IG5hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHRcblx0XHRcdFx0XHRcdDogdGhpcy5fY3JlYXRlQ29udGV4dCh0ZWNobmljYWxQYXRoLCBtb2RlbCk7XG5cblx0XHRcdFx0Ly8gZWRpdCBkb2N1bWVudFxuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93LmVkaXREb2N1bWVudChhY3RpdmVDb250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRcdHRoaXMubmF2aWdhdGVUb01lc3NhZ2VQYWdlKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBvbiB0aGUgcGFnZSBpcyBzZXRcblx0ICovXG5cdGFzeW5jIF9iaW5kUGFnZSh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdC8vIFRoZSBwYWdlIGJpbmRpbmcgaXMgZG9uZSBhc3luY2hyb25vdXNseSwgdG8gbWFrZSBzdXJlIF9vblJvdXRlTWF0Y2hlZCBpcyBjYWxsZWQgZm9yIGFsbCB0YXJnZXRzIGJlZm9yZSwgYW5kIHRoZSBiaW5kaW5nIGNsZWFudXAgcHJvbWlzZXMgYXJlIHByb3Blcmx5IHN0b3JlZCBpbiB0aGUgcm91dGluZyBzZXJ2aWNlLlxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdGVjaG5pY2FsUGF0aCA9IGF3YWl0IHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpO1xuXHRcdFx0dGhpcy5fYmluZFBhZ2VUb1BhdGgodGVjaG5pY2FsUGF0aCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHt9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0ICh0aGlzIGlzIGEgcGF0aCBpbiB0aGUgbW9kZWwsIHNvIG9ubHkgdGVjaG5pY2FsIGtleXMgYXJlIGFsbG93ZWQpLlxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9QYXRoKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiB2b2lkIHtcblx0XHRjb25zdCBvQ3VycmVudENvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0c0N1cnJlbnRQYXRoID0gb0N1cnJlbnRDb250ZXh0ICYmIG9DdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRvVXNlQ29udGV4dCA9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0IGFzIENvbnRleHQgfCB1bmRlZmluZWQgfCBudWxsO1xuXG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCBvbmx5IGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0Ly8gb3IgaWYgd2UgaGF2ZSBhIGNvbnRleHQgYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRsZXQgc2hvdWxkUmVmcmVzaENvbnRleHQgPSBmYWxzZTtcblx0XHRcdFx0Ly8gV2UgYWxyZWFkeSBoYXZlIHRoZSBjb250ZXh0IHRvIGJlIHVzZWQsIGFuZCBpdCdzIG5vdCB0aGUgY3VycmVudCBvbmVcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiYgTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpIHx8XG5cdFx0XHRcdFx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkgJiZcblx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgYnV0IHdlJ3JlIGluIGNvbGxhYm9yYXRpb24gZHJhZnQsIHdlIGZvcmNlIHRoZSByZWZyZXNoIChkaXNjYXJkaW5nIHBlbmRpbmcgY2hhbmdlcykgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbi5cblx0XHRcdFx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBmcm9tIExSIHRvIE9QLCB0aGUgdmlldyBpcyBub3QgY29ubmVjdGVkIHlldCAtLT4gY2hlY2sgaWYgd2UncmUgaW4gZHJhZnQgd2l0aCBjb2xsYWJvcmF0aW9uIGZyb20gdGhlIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0c2hvdWxkUmVmcmVzaENvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVXNlQ29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoc2hvdWxkUmVmcmVzaENvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIG9Vc2VDb250ZXh0LCBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0R3JvdXBJZCgpKVxuXHRcdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKGBDYW5ub3QgcmVmcmVzaCBjb250ZXh0OiAke2Vycn1gKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IGJ1dCBhbiBlZGl0ZmxvdyBhY3Rpb24gaGFwcGVuZWQgKGUuZy4gQ2FuY2VsRG9jdW1lbnQgaW4gc3RpY2t5IG1vZGUpXG5cdFx0XHRcdC8vIC0tPiBXZSBuZWVkIHRvIGNhbGwgb25CZWZvcmUvQWZ0ZXJCaW5kaW5nIHRvIHJlZnJlc2ggdGhlIG9iamVjdCBwYWdlIHByb3Blcmx5XG5cdFx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHtcblx0XHRcdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdFx0XHRsaXN0QmluZGluZzogb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLFxuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoIHx8IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZm9yIGl0cyBwYXRoXG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dCh0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwpLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLlJlc3RvcmVIaXN0b3J5ICYmXG5cdFx0XHRFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpICYmXG5cdFx0XHQhb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0b0N1cnJlbnRDb250ZXh0XG5cdFx0KSB7XG5cdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0N1cnJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdGhlIHBhZ2UgdG8gYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBib3VuZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1BhcmVudExpc3RCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCAhb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUoXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQgJiYgIXRoaXMuX29BcHBDb21wb25lbnQuaXNFeGl0aW5nICYmIG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBiaW5kaW5nIGNvbnRleHQgaXMgcGFydCBvZiBhIGNvbGxhYm9yYXRpdmUgZHJhZnQsIHdlIGNhbGwgYWRkU2VsZiBiZWZvcmUgYmluZGluZyB0aGUgcGFnZSBzbyB0aGF0IHRoZSBTaGFyZSBhY3Rpb25cblx0XHQvLyBpcyBwYXJ0IG9mIHRoZSBzYW1lIGJhdGNoIGFzIHRoZSBwYWdlIGxvYWQsIGFuZCB3ZSBjYW4gZ2V0IHRoZSBsaXN0IG9mIHBhcnRpY2lwYXRpbmcgdXNlcnMgbGF0ZXJcblx0XHRpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQob01vZGVsLmdldE1ldGFNb2RlbCgpKSAmJiBvQ29udGV4dC5nZXRQYXRoKCkuaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT1mYWxzZVwiKSkge1xuXHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5leGVjdXRlU2hhcmVBY3Rpb24ob0NvbnRleHQpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0ZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUsXG5cdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRyZWFzb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5hZnRlclNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7IHJlZGlyZWN0ZWRUb05vbkRyYWZ0OiBvTmF2aWdhdGlvblBhcmFtZXRlcnM/LnJlZGlyZWN0ZWRUb05vbkRyYWZ0IH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKTogQ29udGV4dCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0aXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQgPSBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsKSxcblx0XHRcdG1QYXJhbWV0ZXJzOiBCaW5kQ29udGV4dFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIixcblx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIsXG5cdFx0XHRcdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWVcblx0XHRcdH07XG5cdFx0aWYgKHRoaXMuYmFzZS5pbmxpbmVFZGl0Rmxvdy5pc0lubGluZUVkaXRQb3NzaWJsZSgpKSB7XG5cdFx0XHQvLyBpZiBpbmxpbmUgZWRpdCBpcyBlbmFibGVkIG9uIHRoZSBwYWdlIGFuZCB0aGlzIGlzIHRoZSBhY3RpdmUgZW50aXR5LCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZ3JvdXAgaWQgdG8gaW5saW5lXG5cdFx0XHRtUGFyYW1ldGVycy4kJHVwZGF0ZUdyb3VwSWQgPSBzUGF0aC5pbmNsdWRlcyhcIklzQWN0aXZlRW50aXR5PXRydWVcIikgPyBDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQgOiBcIiRhdXRvXCI7XG5cdFx0fVxuXHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpIGFuZCBzZW1hbnRpYyBrZXlzIChmb3IgY3JlYXRpbmcgdGhlIHNlbWFudGljIFVSTClcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWApO1xuXHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdCA9IHNDb250ZXh0UGF0aFxuXHRcdFx0PyBvTWV0YU1vZGVsLmdldENvbnRleHQoc0NvbnRleHRQYXRoKSAmJiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCkpXG5cdFx0XHQ6IG51bGw7XG5cdFx0Y29uc3QgYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyA9IE1vZGVsSGVscGVyLmdldEFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMoXG5cdFx0XHRkYXRhTW9kZWxPYmplY3Q/LnRhcmdldEVudGl0eVR5cGUgYXMgRW50aXR5VHlwZSxcblx0XHRcdGRhdGFNb2RlbE9iamVjdD8udGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldFxuXHRcdCk7XG5cdFx0Y29uc3Qgc2VtYW50aWNLZXlzID0gb0RyYWZ0Um9vdFxuXHRcdFx0PyBkYXRhTW9kZWxPYmplY3Q/LnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TZW1hbnRpY0tleT8ubWFwKChrZXkpID0+IGtleS52YWx1ZSkgPz8gW11cblx0XHRcdDogW107XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWwsIHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUga2VlcEFsaXZlIGNvbnRleHQgJHtzUGF0aH1gKTtcblx0XHRcdH0gZWxzZSBpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnRpZXNUb1JlcXVlc3QgPSBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdLmNvbmNhdChzZW1hbnRpY0tleXMpO1xuXHRcdFx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHByb3BlcnRpZXNUb1JlcXVlc3QpO1xuXHRcdFx0XHRcdGlmIChvRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZHJhZnQgYW5kIGVkaXQgd2UgbmVlZCB0byBlbnN1cmUgdGhvc2UgcHJvcGVydGllcyBhcmUgcmVxdWVzdGVkIGFnYWluIGV2ZW4gaWYgdGhleSBhcmUgaW4gdGhlIGJpbmRpbmcncyBjYWNoZVxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3aGVuIHlvdSBlZGl0IGFuZCBnbyB0byB0aGUgc2F2ZWQgdmVyc2lvbiB5b3UgaGF2ZSBubyB3YXkgb2Ygc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGVkaXQgdmVyc2lvblxuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhvRHJhZnRSb290ID8gcHJvcGVydGllc1RvUmVxdWVzdC5jb25jYXQoW1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl0pIDogcHJvcGVydGllc1RvUmVxdWVzdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzVG9TZWxlY3Q6IHN0cmluZ1tdID0gW107XG5cdFx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgc0NvbnRleHRQYXRoKTtcblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaChzTWVzc2FnZXNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaChcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdHByb3BlcnRpZXNUb1NlbGVjdC5wdXNoKC4uLnNlbWFudGljS2V5cyk7XG5cdFx0XHR9XG5cdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaCguLi5hbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzKTtcblxuXHRcdFx0aWYgKGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkICYmIG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0cHJvcGVydGllc1RvU2VsZWN0LnB1c2goXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BlcnRpZXNUb1NlbGVjdC5sZW5ndGgpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHByb3BlcnRpZXNUb1NlbGVjdC5qb2luKFwiLFwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0Y29uc3Qgb1ByZXZpb3VzQmluZGluZyA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9QcmV2aW91c0JpbmRpbmcpIHtcblx0XHRcdFx0XHRvTW9kZWwucmVzZXRDaGFuZ2VzKG9QcmV2aW91c0JpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpKTtcblx0XHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvSGlkZGVuQmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChzUGF0aCwgdW5kZWZpbmVkLCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdFx0XHR0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIuaG9sZE1lc3NhZ2VzRm9yQ29udHJvbCh0aGlzLl9vVmlldyk7XG5cdFx0XHR9KTtcblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCB0aGlzLm9uRGF0YVJlY2VpdmVkLmJpbmQodGhpcykpO1xuXHRcdFx0cmV0dXJuIG9IaWRkZW5CaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBvbkRhdGFSZWNlaXZlZChvRXZlbnQ6IEV2ZW50PHsgZXJyb3I6IHsgc3RhdHVzPzogbnVtYmVyOyBjYXVzZT86IHsgc3RhdHVzPzogbnVtYmVyIH07IG1lc3NhZ2U/OiBzdHJpbmcgfSB9Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGVycm9yID0gb0V2ZW50Py5nZXRQYXJhbWV0ZXIoXCJlcnJvclwiKTtcblx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZCh0aGlzLl9vVmlldykpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cblx0XHRpZiAoZXJyb3IpIHtcblx0XHRcdC8vIFRPRE86IGluIGNhc2Ugb2YgNDA0IHRoZSB0ZXh0IHNoYWxsIGJlIGRpZmZlcmVudFxuXHRcdFx0Y29uc3QgbWVzc2FnZUhhbmRsZXIgPSB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0XHRsZXQgbVBhcmFtczogU2hvd01lc3NhZ2VzUGFyYW1ldGVycyA9IHt9O1xuXHRcdFx0Y29uc3QgZXJyb3JTdGF0dXMgPSBlcnJvci5zdGF0dXMgPz8gZXJyb3IuY2F1c2U/LnN0YXR1cztcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHRcdGlmIChlcnJvclN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoZXJyb3JTdGF0dXMgPT09IDQwMCkge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JfREVTQ1JJUFRJT05cIiksXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogZXJyb3I/Lm1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGNvcmUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0bVBhcmFtcy5jb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyhtUGFyYW1zKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyLnJlbGVhc2VIb2xkQnlDb250cm9sKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgc2lkZSBlZmZlY3RzIG9uIGEgYmluZGluZyBjb250ZXh0IHRvIFwicmVmcmVzaFwiIGl0LlxuXHQgKiBUT0RPOiBnZXQgcmlkIG9mIHRoaXMgb25jZSBwcm92aWRlZCBieSB0aGUgbW9kZWxcblx0ICogYSByZWZyZXNoIG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3Qgd29yayBpbiBjYXNlIGEgY3JlYXRpb24gcm93IHdpdGggYSB0cmFuc2llbnQgY29udGV4dCBpc1xuXHQgKiB1c2VkLiBhbHNvIGEgcmVxdWVzdFNpZGVFZmZlY3RzIHdpdGggYW4gZW1wdHkgcGF0aCB3b3VsZCBmYWlsIGR1ZSB0byB0aGUgdHJhbnNpZW50IGNvbnRleHRcblx0ICogdGhlcmVmb3JlIHdlIGdldCBhbGwgZGVwZW5kZW50IGJpbmRpbmdzICh2aWEgcHJpdmF0ZSBtb2RlbCBtZXRob2QpIHRvIGRldGVybWluZSBhbGwgcGF0aHMgYW5kIHRoZW5cblx0ICogcmVxdWVzdCB0aGVtLlxuXHQgKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IENvbnRleHQgdG8gYmUgcmVmcmVzaGVkXG5cdCAqL1xuXHRfcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9CaW5kaW5nQ29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPVxuXHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoO1xuXHRcdGNvbnN0IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBhUHJvcGVydHlQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGdldEJpbmRpbmdQYXRocyhvQmluZGluZzogQmluZGluZyk6IHZvaWQge1xuXHRcdFx0bGV0IGFEZXBlbmRlbnRCaW5kaW5ncztcblx0XHRcdGNvbnN0IHNSZWxhdGl2ZVBhdGggPSAob0JpbmRpbmcuZ2V0Q29udGV4dCgpPy5nZXRQYXRoKCkgPz8gXCJcIikucmVwbGFjZShzUm9vdENvbnRleHRQYXRoLCBcIlwiKTsgLy8gSWYgbm8gY29udGV4dCwgdGhpcyBpcyBhbiBhYnNvbHV0ZSBiaW5kaW5nIHNvIG5vIHJlbGF0aXZlIHBhdGhcblx0XHRcdGNvbnN0IHNQYXRoID0gKHNSZWxhdGl2ZVBhdGggPyBgJHtzUmVsYXRpdmVQYXRoLnNsaWNlKDEpfS9gIDogc1JlbGF0aXZlUGF0aCkgKyBvQmluZGluZy5nZXRQYXRoKCk7XG5cblx0XHRcdGlmIChvQmluZGluZy5pc0E8T0RhdGFDb250ZXh0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiAoc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0Ly8gbm93IGdldCB0aGUgZGVwZW5kZW50IGJpbmRpbmdzXG5cdFx0XHRcdGFEZXBlbmRlbnRCaW5kaW5ncyA9IG9CaW5kaW5nLmdldERlcGVuZGVudEJpbmRpbmdzKCk7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHQvLyBhc2sgdGhlIGRlcGVuZGVudCBiaW5kaW5ncyAoYW5kIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwSWRcblx0XHRcdFx0XHQvL2lmIChhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdQYXRocyhpdGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoIWFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKCFhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQTxPRGF0YVByb3BlcnR5QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKCFhUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgc0NvbnRleHRQYXRoKTtcblx0XHR9XG5cblx0XHQvLyBiaW5kaW5nIG9mIHRoZSBjb250ZXh0IG11c3QgaGF2ZSAkJFBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIHRydWUsIHRoaXMgYm91bmQgY29udGV4dCBtYXkgYmUgbmVlZGVkIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmdcblx0XHRnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSk7XG5cblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHNbaV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0eVBhdGhzO1xuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5wdXNoKHNNZXNzYWdlc1BhdGgpO1xuXHRcdH1cblx0XHQvL2FsbCB0aGlzIGxvZ2ljIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBTaWRlRWZmZWN0cyByZXF1ZXN0IGZvciBhbiBlbXB0eSBwYXRoIChyZWZyZXNoIGV2ZXJ5dGhpbmcpLCBhZnRlciB0ZXN0aW5nIHRyYW5zaWVudCBjb250ZXh0c1xuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gb1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucmVkdWNlKCh0YXJnZXRzOiBzdHJpbmdbXSwgdGFyZ2V0UHJvcGVydHkpID0+IHtcblx0XHRcdGlmICh0YXJnZXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBpbmRleCA9IHRhcmdldFByb3BlcnR5LmluZGV4T2YoXCIvXCIpO1xuXHRcdFx0XHR0YXJnZXRzLnB1c2goaW5kZXggPiAwID8gdGFyZ2V0UHJvcGVydHkuc2xpY2UoMCwgaW5kZXgpIDogdGFyZ2V0UHJvcGVydHkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRhcmdldHM7XG5cdFx0fSwgW10pO1xuXHRcdC8vIE9EYXRhIG1vZGVsIHdpbGwgdGFrZSBjYXJlIG9mIGR1cGxpY2F0ZXNcblx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbLi4ub1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLCAuLi5vU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllc10sIG9CaW5kaW5nQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdF9nZXRCaW5kaW5nQ29udGV4dCgpOiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRfc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQ6IENvbnRleHQgfCBudWxsKTogdm9pZCB7XG5cdFx0bGV0IG9QcmV2aW91c0NvbnRleHQsIG9UYXJnZXRDb250cm9sO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vVmlldztcblx0XHR9XG5cblx0XHRvVGFyZ2V0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRpZiAob1ByZXZpb3VzQ29udGV4dD8uaXNLZWVwQWxpdmUoKSAmJiBvUHJldmlvdXNDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5fc2V0S2VlcEFsaXZlKG9QcmV2aW91c0NvbnRleHQsIGZhbHNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmxleGlibGUgY29sdW1uIGxheW91dCAoRkNMKSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aWV3ICgtMSBpZiB0aGUgYXBwIGlzIG5vdCBGQ0wpLlxuXHQgKiBAcmV0dXJucyBUaGUgbGV2ZWxcblx0ICovXG5cdGdldEZDTExldmVsKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YktlZXBBbGl2ZTogYm9vbGVhbixcblx0XHRmbkJlZm9yZURlc3Ryb3k/OiBQYXJhbWV0ZXJzPENvbnRleHRbXCJzZXRLZWVwQWxpdmVcIl0+WzFdLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzTWV0YVBhdGgpO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KFxuXHRcdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0YlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sXG5cdFx0cGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVyc1xuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCk6IHZvaWQge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0XG5cdFx0XHQ/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSFcblx0XHRcdDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IGxheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0YXN5bmMgY2xvc2VDb2x1bW4oKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdG5vUHJlc2VydmF0aW9uQ2FjaGU6IHRydWUsXG5cdFx0XHRsYXlvdXQ6IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Nsb3NlQ29sdW1uXCIpLFxuXHRcdFx0Y2FsbEV4dGVuc2lvbjogdHJ1ZVxuXHRcdH07XG5cblx0XHRjb25zdCBpc0RvY3VtZW50TW9kaWZpZWQgPVxuXHRcdFx0ISF0aGlzLmdldFZpZXcoKT8uZ2V0TW9kZWwoXCJ1aVwiKT8uZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkKSB8fCAhb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0Y29uc3QgaXNIaWRkZW5EcmFmdEVuYWJsZWQgPSAodGhpcy5fb0FwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXMoKT8uSGlkZGVuRHJhZnQgYXMgSGlkZGVuRHJhZnQpXG5cdFx0XHQuZW5hYmxlZDtcblxuXHRcdGlmICghaXNEb2N1bWVudE1vZGlmaWVkICYmIGlzSGlkZGVuRHJhZnRFbmFibGVkKSB7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlLFxuXHRcdFx0XHRza2lwQmFja05hdmlnYXRpb246IHRydWVcblx0XHRcdH07XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0Ly8gUmVtb3ZlcyB0cmFuc2l0aW9uIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgY29udGV4dFxuXHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVUcmFuc2lzdGlvbk1lc3NhZ2VGb3JDb250ZXh0KG9Db250ZXh0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbFJvdXRpbmc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7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
|
|
1001
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJfZGVjNCIsInB1YmxpY0V4dGVuc2lvbiIsIl9kZWM1IiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsIl9kZWMxMSIsIl9kZWMxMiIsIl9kZWMxMyIsIl9kZWMxNCIsIl9kZWMxNSIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiQmVmb3JlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9Db250cm9sbGVyRXh0ZW5zaW9uIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsImRldGFjaFJvdXRlTWF0Y2hlZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiaXNBIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsImRlZmVycmVkQ3JlYXRpb24iLCJuYXZpZ2F0ZVRvVGFyZ2V0Iiwib0NvbnRleHQiLCJzTmF2aWdhdGlvblRhcmdldE5hbWUiLCJiUHJlc2VydmVIaXN0b3J5IiwiZGVsYXllZFVzYWdlIiwib05hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJvRGV0YWlsUm91dGUiLCJkZXRhaWwiLCJzUm91dGVOYW1lIiwicm91dGUiLCJtUGFyYW1ldGVyTWFwcGluZyIsInBhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvIiwiZ2V0SGFzaEZvck5hdmlnYXRpb24iLCJjb250ZXh0IiwibmF2aWdhdGlvblRhcmdldE5hbWUiLCJuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsImRldGFpbFJvdXRlIiwicm91dGVOYW1lIiwicGFyYW1ldGVyTWFwcGluZyIsImdldEhhc2hGcm9tUm91dGUiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImxlbmd0aCIsInVuZGVmaW5lZCIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY3JlYXRlZENvbnRleHQiLCJjaGVja05vSGFzaENoYW5nZSIsImVkaXRhYmxlIiwicGVyc2lzdE9QU2Nyb2xsIiwidXBkYXRlRkNMTGV2ZWwiLCJmb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJjYWxsRXh0ZW5zaW9uIiwiaW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwic2V0UHJvcGVydHkiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsImhpZGRlbkJpbmRpbmciLCJiYWNrUGF0aCIsImdldFBhdGhUb05hdmlnYXRlQmFjayIsImdldFBhdGgiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm92ZXJyaWRlTmF2Iiwib25CZWZvcmVOYXZpZ2F0aW9uIiwiZGVzdHJveSIsIlByb21pc2UiLCJyZXNvbHZlIiwiRkNMTGV2ZWwiLCJnZXRGQ0xMZXZlbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiaXNQYXRoT25EcmFmdFJvb3QiLCJjb250ZXh0Rm9yTmF2aWdhdGlvbiIsImdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXNGb3JQcmV2aW91c0NvbnRleHQiLCJnZXRWaWV3RGF0YSIsIm9yaWdpbmFsQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRQcm9wZXJ0eSIsImRyYWZ0T3JBY3RpdmVDb250ZXh0IiwiZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGVhZGVySW5mbyIsIlR5cGVOYW1lIiwibmFtZSIsImlzRmNsRW5hYmxlZCIsImNvbnRleHRUb1JlcGxhY2VXaXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcGxhY2VXaXRoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJwYXJlbnRCaW5kaW5nIiwiZ2V0QmluZGluZyIsImFnZ3JlZ2F0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJoaWVyYXJjaHlRdWFsaWZpZXIiLCJncm91cCIsImFnZ3JlZ2F0ZSIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJzSGFzaCIsImdldEhhc2giLCJpbmNsdWRlcyIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibVBhcmFtZXRlcnMiLCJuYXZUb0hhc2giLCJnZXREZWZhdWx0Q3JlYXRlSGFzaCIsImRpc3BsYXlFcnJvclBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJfaXNWaWV3UGFydE9mUm91dGUiLCJyb3V0ZUluZm9ybWF0aW9uIiwiYVRhcmdldHMiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsInZpZXdMZXZlbCIsInJvdXRlTGV2ZWwiLCJnZXRSb3V0aW5nU2VydmljZSIsImFkZEJpbmRpbmdDbGVhbnVwUHJvbWlzZSIsInNldFRpbWVvdXQiLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJkaXNjb25uZWN0IiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImJBY3Rpb25DcmVhdGUiLCJvRXZlbnQiLCJnZXRQYXJhbWV0ZXIiLCJnZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsIm1Bcmd1bWVudHMiLCJnZXRQYXJhbWV0ZXJzIiwib05hdmlnYXRpb25QYXJhbWV0ZXJzIiwiYmluZFByb21pc2UiLCJvTW9kZWwiLCJfYmluZERlZmVycmVkIiwiRWRpdEZsb3dBY3Rpb24iLCJpc09wZW5JbkVkaXRNb2RlIiwiX2JpbmRQYWdlRm9yRWRpdCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ0b1N0cmluZyIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3IiwidGFyZ2V0UGF0aCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsImxpc3RCaW5kaW5nIiwicGFyZW50Q29udGV4dCIsImRhdGEiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJ0ZWNobmljYWxQYXRoIiwicmVzb2x2ZVBhdGgiLCJpc1N0aWNreUVkaXRNb2RlIiwiaXNTdGlja3kiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJhY3RpdmVDb250ZXh0IiwidXNlQ29udGV4dCIsIl9jcmVhdGVDb250ZXh0IiwiZWRpdEZsb3ciLCJlZGl0RG9jdW1lbnQiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsImUiLCJtZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlcyIsInNUYXJnZXRQYXRoIiwib0N1cnJlbnRDb250ZXh0IiwiX2dldEJpbmRpbmdDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwic2hvdWxkUmVmcmVzaENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImlzRHJhZnRTdXBwb3J0ZWQiLCJpc0Nvbm5lY3RlZCIsInJlc2V0Q2hhbmdlcyIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0R3JvdXBJZCIsImVyciIsImJQZXJzaXN0T1BTY3JvbGwiLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwiQXBwU3RhdGVDaGFuZ2VkIiwiUmVzdG9yZUhpc3RvcnkiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIl9zZXRLZWVwQWxpdmUiLCJpc0V4aXRpbmciLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsImV4ZWN1dGVTaGFyZUFjdGlvbiIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsImlubGluZUVkaXRGbG93IiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJJTkxJTkVFRElUX1VQREFURUdST1VQSUQiLCJvRHJhZnRSb290IiwiZ2V0T2JqZWN0Iiwib0RyYWZ0Tm9kZSIsImRhdGFNb2RlbE9iamVjdCIsImdldENvbnRleHQiLCJhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsInRhcmdldEVudGl0eVNldCIsInNlbWFudGljS2V5cyIsIkNvbW1vbiIsIlNlbWFudGljS2V5IiwibWFwIiwia2V5IiwidmFsdWUiLCJfZ2V0S2VlcEFsaXZlQ29udGV4dCIsInByb3BlcnRpZXNUb1JlcXVlc3QiLCJjb25jYXQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicHJvcGVydGllc1RvU2VsZWN0Iiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsInB1c2giLCIkc2VsZWN0Iiwiam9pbiIsIm9QcmV2aW91c0JpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwib0hpZGRlbkJpbmRpbmciLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsImhvbGRNZXNzYWdlc0ZvckNvbnRyb2wiLCJvbkRhdGFSZWNlaXZlZCIsImlzTG9ja2VkIiwidW5sb2NrIiwibVBhcmFtcyIsImVycm9yU3RhdHVzIiwic3RhdHVzIiwiY2F1c2UiLCJvUmVzb3VyY2VCdW5kbGUiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJzaGVsbEJhY2siLCJpc0RhdGFSZWNlaXZlZEVycm9yIiwiY29udHJvbCIsInJlbGVhc2VIb2xkQnlDb250cm9sIiwib0JpbmRpbmdDb250ZXh0Iiwib1NpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsInRhcmdldFByb3BlcnRpZXMiLCJ0YXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiYURlcGVuZGVudEJpbmRpbmdzIiwic1JlbGF0aXZlUGF0aCIsInNsaWNlIiwiZ2V0RGVwZW5kZW50QmluZGluZ3MiLCJpdGVtIiwiaSIsInJlZHVjZSIsInRhcmdldFByb3BlcnR5IiwiaW5kZXgiLCJpbmRleE9mIiwib1ByZXZpb3VzQ29udGV4dCIsIm9UYXJnZXRDb250cm9sIiwic2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsImJLZWVwQWxpdmUiLCJmbkJlZm9yZURlc3Ryb3kiLCJiUmVxdWVzdE1lc3NhZ2VzIiwiZW5kc1dpdGgiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwic3BsaXQiLCJhZGRpdGlvbm5hbFNlZ21lbnRzIiwicG9wIiwia2VwdEFsaXZlUGF0aCIsIm9LZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwibGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImlzRG9jdW1lbnRNb2RpZmllZCIsIlVpTW9kZWxDb25zdGFudHMiLCJEb2N1bWVudE1vZGlmaWVkIiwiaXNIaWRkZW5EcmFmdEVuYWJsZWQiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsImdldENhcGFiaWxpdGllcyIsIkhpZGRlbkRyYWZ0IiwiZW5hYmxlZCIsInNraXBEaXNjYXJkUG9wb3ZlciIsInNraXBCYWNrTmF2aWdhdGlvbiIsImNhbmNlbERvY3VtZW50IiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVRyYW5zaXN0aW9uTWVzc2FnZUZvckNvbnRleHQiLCJwcmV2aW91c0NvbnRleHQiLCJyZW1vdmVBbGxUcmFuc2l0aW9uTWVzc2FnZXNGb3JDb250ZXh0IiwiQ29udHJvbGxlckV4dGVuc2lvbiIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVNldCwgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHR5cGUgTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0LCB0eXBlIFNob3dNZXNzYWdlc1BhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgeyBnZXREcmFmdE9yQWN0aXZlQ29udGV4dCwgaXNQYXRoT25EcmFmdFJvb3QsIHJlc29sdmVQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvQ29udGV4dFBhdGhIZWxwZXJcIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvbkluZm8sIFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycywgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nVGFyZ2V0IH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgSGlkZGVuRHJhZnQgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNUYXJnZXRUeXBlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCIuL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCIuL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuXG50eXBlIFJvdXRlSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldHM/OiB1bmtub3duW107XG5cdHJvdXRlTGV2ZWw6IG51bWJlcjtcbn07XG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpXG5jbGFzcyBJbnRlcm5hbFJvdXRpbmcgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBfb1ZpZXchOiBGRVZpZXc7XG5cblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblxuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50PiB8IG51bGw7XG5cblx0cHJpdmF0ZSBfb1JvdXRlciE6IFJvdXRlcjtcblxuXHRwcml2YXRlIF9vUm91dGluZ1NlcnZpY2UhOiBSb3V0aW5nU2VydmljZTtcblxuXHRwcml2YXRlIF9vUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblxuXHRwcml2YXRlIF9mblJvdXRlTWF0Y2hlZEJvdW5kPzogRnVuY3Rpb247XG5cblx0cHJvdGVjdGVkIF9vVGFyZ2V0SW5mb3JtYXRpb24hOiBSb3V0aW5nVGFyZ2V0O1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uRXhpdCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fb1JvdXRpbmdTZXJ2aWNlICYmIHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX29WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+O1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdHRoaXMuX29Sb3V0ZXJQcm94eSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmICghdGhpcy5fb0FwcENvbXBvbmVudCB8fCAhdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xlciBleHRlbnNpb24gJ3NhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQgPT09IHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpc24ndCBob3N0ZWQgaW4gYSBkZWRpY2F0ZWQgVUlDb21wb25lbnQsIGJ1dCBkaXJlY3RseSBpbiB0aGUgYXBwXG5cdFx0XHQvLyAtLT4ganVzdCBrZWVwIHRoZSB2aWV3XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlID0gb1JvdXRpbmdTZXJ2aWNlO1xuXHRcdFx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQ/LmlzQShcInNhcC5mZS5jb3JlLlJldXNlQ29tcG9uZW50XCIpICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0Ly8gUmV1c2UgY29tcG9uZW50cyBjYW4gcG90ZW50aWFsbHkgZW1iZWQgYSB2aWV3IHdpdGggYSBwYWdlIGNvbnRyb2xsZXIsIHdlIHdhbnQgdG8gYXZvaWQgYXR0YWNoaW5nIHRoZSByb3V0ZSBtYXRjaGVkIGV2ZW50IGluIHRoaXMgY2FzZVxuXHRcdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5hdHRhY2hSb3V0ZU1hdGNoZWQoe30sIHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldykhID8/IHt9O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk6IHZvaWQge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKF9iaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHt9XG5cblx0YmVmb3JlU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiB1bmtub3duKTogdm9pZCB7XG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcoYmluZGluZ0NvbnRleHQsIF9tUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KGJpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdGFmdGVyU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiBvYmplY3QpOiB2b2lkIHtcblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0LCB7IC4uLl9tUGFyYW1ldGVycywgZGVmZXJyZWRDcmVhdGlvbjogdHJ1ZSB9KTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEBwYXJhbSBkZWxheWVkVXNhZ2UgVHJ1ZSB0byByZXR1cm4gYSBmdW5jdGlvbiBmb3IgZXhlY3V0aW5nIHRoZSBuYXZpZ2F0aW9uLCBGYWxzZSB0byBleGVjdXRlIHRoZSBuYXZpZ2F0aW9uIGltbWVkaWF0ZWx5XG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IHRydWVcblx0KTogUHJvbWlzZTwoKSA9PiB2b2lkPjtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgbmF2aWdhdGVUb1RhcmdldChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRkZWxheWVkVXNhZ2U/OiBib29sZWFuXG5cdCk6IFByb21pc2U8KCgpID0+IHZvaWQpIHwgdm9pZD4ge1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3Qgb0RldGFpbFJvdXRlID0gb05hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyTWFwcGluZyA9IG9EZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSwgZGVsYXllZFVzYWdlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0by5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHJldHVybnMgVGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0b1xuXHQgKi9cblx0YXN5bmMgZ2V0SGFzaEZvck5hdmlnYXRpb24oY29udGV4dDogQ29udGV4dCwgbmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPSB0aGlzPy5fb1BhZ2VDb21wb25lbnQ/LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IGRldGFpbFJvdXRlID0gbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgcm91dGVOYW1lID0gZGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJNYXBwaW5nID0gZGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0SGFzaEZyb21Sb3V0ZShjb250ZXh0LCByb3V0ZU5hbWUsIHBhcmFtZXRlck1hcHBpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldEhhc2hGcm9tUm91dGUoY29udGV4dCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgdG8gJ3RydWUnIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoY29udGV4dC5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgPT09IFwiQXN5bmNcIikge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMuY3JlYXRlQ29udGV4dFByb21pc2Vcblx0XHRcdFx0XHQudGhlbihhc3luYyAoY3JlYXRlZENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY3JlYXRlZENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBwYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHBhcmFtZXRlcnMucGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogcGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogcGFyYW1ldGVycy5mb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5tb2RlICE9PSBcIkRlZmVycmVkXCIpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNlc3NhcnkuXG5cdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCBudWxsID0gY29udGV4dDtcblx0XHRcdGxldCBoaWRkZW5CaW5kaW5nOiBPRGF0YUNvbnRleHRCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPT09IC0xKSB7XG5cdFx0XHRcdC8vIElmIHdlJ3JlIG5hdmlnYXRpbmcgYmFjaywgd2UgbmVlZCB0byBmaW5kIHRoZSBcInBhcmVudFwiIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgYmFja1BhdGggPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0UGF0aFRvTmF2aWdhdGVCYWNrKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Ly8gQXMgd2UgZG9uJ3QgY2FsbCB0aGUgZXh0ZW5zaW9uIHdoZW4gbmF2aWdhdGluZyBiYWNrIHRvIHRoZSBMUiwgYmFja1BhdGggaXMgbmV2ZXIgZW1wdHkgc28gd2UgY2FuIHNhZmVseSBjcmVhdGUgYSBjb250ZXh0XG5cdFx0XHRcdGhpZGRlbkJpbmRpbmcgPSBjb250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoYmFja1BhdGgpO1xuXHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IGhpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvdmVycmlkZU5hdiA9IGF3YWl0IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmcub25CZWZvcmVOYXZpZ2F0aW9uKHsgYmluZGluZ0NvbnRleHQ6IGNvbnRleHRUb05hdmlnYXRlIH0pO1xuXHRcdFx0aGlkZGVuQmluZGluZz8uZGVzdHJveSgpO1xuXHRcdFx0aWYgKG92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgY29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdC8vIEluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyBmcm9tIGEgdGFibGUgaW4gYSBMaXN0UmVwb3J0IHdpdGggZHJhZnQsIHRoZXJlJ3Mgc3BlY2lhbCBoYW5kbGluZyBmb3IgY29sbGFib3JhdGlvbiBhbmQgdHJlZSB0YWJsZS5cblx0XHQvLyBXZSBtYXkgbm90IG5hdmlnYXRlIHRvIHRoZSBjb250ZXh0IHRoZSB1c2VyIGNsaWNrZWQgb24uXG5cdFx0aWYgKHBhcmFtZXRlcnMucmVhc29uID09PSBOYXZpZ2F0aW9uUmVhc29uLlJvd1ByZXNzICYmIGNvbnRleHQuaXNBPENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRcdGlmIChpc1BhdGhPbkRyYWZ0Um9vdChjb250ZXh0LmdldFBhdGgoKSwgbWV0YU1vZGVsKSkge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0Rm9yTmF2aWdhdGlvbiA9XG5cdFx0XHRcdFx0KGF3YWl0IHRoaXMuZ2V0Q29udGV4dEZvck5hdmlnYXRpb25XaXRoQ29sbGFib3JhdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKSkgPz9cblx0XHRcdFx0XHQoYXdhaXQgdGhpcy5nZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUoY29udGV4dCkpO1xuXG5cdFx0XHRcdC8vIFVzZSBhbm90aGVyIGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdGlmIChjb250ZXh0Rm9yTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0Rm9yTmF2aWdhdGlvbjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzRm9yUHJldmlvdXNDb250ZXh0KCk7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0LCBwYXJhbWV0ZXJzLCB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQgaW5zdGFuY2UgZnJvbSB0aGUgTFIgYW5kIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbi5cblx0ICogQHBhcmFtIG9yaWdpbmFsQ29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29udGV4dCwgbnVsbCBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZ2V0Q29udGV4dEZvck5hdmlnYXRpb25XaXRoQ29sbGFib3JhdGlvbihcblx0XHRvcmlnaW5hbENvbnRleHQ6IENvbnRleHQsXG5cdFx0cGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCk6IFByb21pc2U8Q29udGV4dCB8IG51bGw+IHtcblx0XHRjb25zdCBtb2RlbCA9IG9yaWdpbmFsQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwpICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gSWYgd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhIGRyYWZ0IGluc3RhbmNlIGZyb20gdGhlIExSLFxuXHRcdFx0Ly8gV2Ugd2FudCB0byBjaGVjayBpZiB0aGUgZHJhZnQgaW5zdGFuY2UgZXhpc3RzIGZpcnN0LiBPdGhlcndpc2Ugd2UgbmF2aWdhdGUgdG8gdGhlIG9yaWdpbmFsIChkcmFmdCkgdmVyc2lvbi5cblx0XHRcdGxldCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gTm90aWZ5IHRoZSB1c2VyIHRoYXQgd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdGhlIHNhdmVkIGluc3RhbmNlXG5cdFx0XHRcdGNvbnN0IG9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkpKTtcblx0XHRcdFx0cGFyYW1ldGVycy5yZWRpcmVjdGVkVG9Ob25EcmFmdCA9XG5cdFx0XHRcdFx0KG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWUgYXMgdW5rbm93biBhcyBzdHJpbmcpID8/XG5cdFx0XHRcdFx0b2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLm5hbWU7XG5cblx0XHRcdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHQvLyBGQ0w6IHJlcGxhY2UgdGhlIGNvbnRleHQgaW4gdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHRUb1JlcGxhY2VXaXRoID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdG9yaWdpbmFsQ29udGV4dC5yZXBsYWNlV2l0aChjb250ZXh0VG9SZXBsYWNlV2l0aCk7XG5cdFx0XHRcdFx0ZHJhZnRPckFjdGl2ZUNvbnRleHQgPSBjb250ZXh0VG9SZXBsYWNlV2l0aDsgLy8gVXNlIHRoZSBrZWVwLWFsaXZlIGNvbnRleHQgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBGdWxsc2NyZWVuOiB0cmlnZ2VyIGEgcmVmcmVzaCBvZiB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVc2UgdGhlIHNhdmVkIGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBkcmFmdE9yQWN0aXZlQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbnRleHRcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgZnJvbSB0aGUgTFIgYW5kIHdlJ3JlIGluIGEgVHJlZSBvciBBbmFseXRpY2FsIHRhYmxlLlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUob3JpZ2luYWxDb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IHBhcmVudEJpbmRpbmcgPSBvcmlnaW5hbENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGlmICghcGFyZW50QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhZ2dyZWdhdGlvbiA9IHBhcmVudEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhc1xuXHRcdFx0fCB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZzsgZ3JvdXA/OiBvYmplY3Q7IGFnZ3JlZ2F0ZT86IG9iamVjdCB9XG5cdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRpZiAoIWFnZ3JlZ2F0aW9uPy5oaWVyYXJjaHlRdWFsaWZpZXIgJiYgIWFnZ3JlZ2F0aW9uPy5ncm91cCAmJiAhYWdncmVnYXRpb24/LmFnZ3JlZ2F0ZSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBoaWVyYXJjaGljYWwvYW5hbHl0aWNhbCBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0Ly8gSWYgd2UncmUgaW4gYSBUcmVlL0FuYWx5dGljYWwgdGFibGUsIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGFuIGFjdGl2ZSBpbnN0YW5jZSBpbnN0YW5jZSB0aGF0IGhhcyBhIGRyYWZ0LFxuXHRcdFx0Ly8gLS0+IFdlIHRyeSB0byBuYXZpZ2F0ZSB0byB0aGUgZHJhZnQgaW5zdGFuY2UgKGlmIGl0IHN0aWxsIGV4aXN0cylcblx0XHRcdGNvbnN0IGRyYWZ0T3JBY3RpdmVDb250ZXh0ID0gYXdhaXQgZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQob3JpZ2luYWxDb250ZXh0KTtcblxuXHRcdFx0aWYgKGRyYWZ0T3JBY3RpdmVDb250ZXh0ICE9PSBudWxsICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkgIT09IGRyYWZ0T3JBY3RpdmVDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHQvLyBVc2UgdGhlIGRyYWZ0IGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBkcmFmdE9yQWN0aXZlQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbnRleHRcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIGZyb20gYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCBmcm9tXG5cdCAqIEBwYXJhbSBbcGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlQmFja0Zyb21Db250ZXh0KGNvbnRleHQ6IENvbnRleHQsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IC0xO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGZvcndhcmRzIHRvIGEgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0LCBwYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiBoaXN0b3J5IGlmIHRoZSBjdXJyZW50IGhhc2ggY29ycmVzcG9uZHMgdG8gYSB0cmFuc2llbnQgc3RhdGUuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk6IHZvaWQge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKTtcblxuXHRcdC8vIGlmIHRyaWdnZXJlZCB3aGlsZSBuYXZpZ2F0aW5nIHRvICguLi4pLCB3ZSBuZWVkIHRvIG5hdmlnYXRlIGJhY2tcblx0XHRpZiAoc0hhc2guaW5jbHVkZXMoXCIoLi4uKVwiKSkge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdkJhY2soKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzcGxheXMgYW4gZXJyb3IgKGlsbHVzdHJhdGVkIG1lc3NhZ2UpIGluIHRoZSBwYWdlLlxuXHQgKiBAcGFyYW0gc0Vycm9yTWVzc2FnZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBwcm9taXNlXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogc3RyaW5nLCBtUGFyYW1ldGVyczogTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRpZiAodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWNyZWF0ZVwiKSB8fCB0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluY2x1ZGVzKFwiaS1hY3Rpb249YXV0b0NyZWF0ZVwiKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZUb0hhc2godGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldERlZmF1bHRDcmVhdGVIYXNoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5kaXNwbGF5RXJyb3JQYWdlKHNFcnJvck1lc3NhZ2UsIG1QYXJhbWV0ZXJzLCB0aGlzLmdldEZDTExldmVsKCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdGF0ZSBpcyBpbXBhY3RlZCBieSB0aGUgY29udGV4dFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0KTtcblx0fVxuXG5cdF9pc1ZpZXdQYXJ0T2ZSb3V0ZShyb3V0ZUluZm9ybWF0aW9uPzogUm91dGVJbmZvcm1hdGlvbik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gcm91dGVJbmZvcm1hdGlvbj8udGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8ICFhVGFyZ2V0cy5pbmNsdWRlcyh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udGFyZ2V0TmFtZSkpIHtcblx0XHRcdC8vIElmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBoYXMgYSB2aWV3IGxldmVsIGdyZWF0ZXIgdGhhbiB0aGUgcm91dGUgbGV2ZWwsIGl0IG1lYW5zIHRoaXMgdmlldyBjb21lcyBcImFmdGVyXCIgdGhlIHJvdXRlXG5cdFx0XHQvLyBpbiB0ZXJtcyBvZiBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gSW4gc3VjaCBjYXNlLCB3ZSByZW1vdmUgaXRzIGJpbmRpbmcgY29udGV4dCwgdG8gYXZvaWQgdGhpcyB2aWV3IHRvIGhhdmUgZGF0YSBpZiB3ZSBuYXZpZ2F0ZSB0byBpdCBsYXRlciBvblxuXHRcdFx0Ly8gVGhpcyBpcyBkb25lIGluIGEgdGltZW91dCB0byBhbGxvdyBmb3IgZm9jdXNvdXQgZXZlbnRzIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUgcHJvcGVybHkgaW4gY29sbGFib3JhdGl2ZSBkcmFmdFxuXHRcdFx0aWYgKCh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udmlld0xldmVsID8/IDApID49IChyb3V0ZUluZm9ybWF0aW9uPy5yb3V0ZUxldmVsID8/IDApKSB7XG5cdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hZGRCaW5kaW5nQ2xlYW51cFByb21pc2UoXG5cdFx0XHRcdFx0bmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSByb3V0ZSBoYXMgbGV2ZWwgMCAtLT4gd2UgbmVlZCB0byBsZWF2ZSB0aGUgY29sbGFib3JhdGlvbiBzZXNzaW9uIGFzIG5vIE9QIGlzIGRpc3BsYXllZFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoaXMucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzRm9yUHJldmlvdXNDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpOyAvLyBUaGlzIGFsc28gY2FsbCBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIHRoZSBjdXJyZW50IGNvbnRleHRcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9idWlsZEJpbmRpbmdQYXRoKFxuXHRcdHJvdXRlQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBvYmplY3Q+LFxuXHRcdGJpbmRpbmdQYXR0ZXJuOiBzdHJpbmcsXG5cdFx0bmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mb1xuXHQpOiB7IHBhdGg6IHN0cmluZzsgZGVmZXJyZWQ6IGJvb2xlYW4gfSB7XG5cdFx0bGV0IHBhdGggPSBiaW5kaW5nUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0bGV0IGRlZmVycmVkID0gZmFsc2U7XG5cblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gcm91dGVBcmd1bWVudHMpIHtcblx0XHRcdGNvbnN0IHNWYWx1ZSA9IHJvdXRlQXJndW1lbnRzW3NLZXldO1xuXG5cdFx0XHRpZiAodHlwZW9mIHNWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNWYWx1ZSA9PT0gXCIuLi5cIiAmJiBiaW5kaW5nUGF0dGVybi5pbmNsdWRlcyhgeyR7c0tleX19YCkpIHtcblx0XHRcdFx0ZGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3NLZXl9fWAsIHNWYWx1ZSk7XG5cdFx0fVxuXHRcdGlmICgocm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik/LltcImktYWN0aW9uXCJdPy5pbmNsdWRlcyhcImNyZWF0ZVwiKSkge1xuXHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIGJpbmRpbmcgcGF0aCBpcyBhbHdheXMgYWJzb2x1dGVcblx0XHRpZiAocGF0aCAmJiBwYXRoWzBdICE9PSBcIi9cIikge1xuXHRcdFx0cGF0aCA9IGAvJHtwYXRofWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgcGF0aCwgZGVmZXJyZWQgfTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdG8gYmluZCB0aGUgcGFnZSB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZFxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEJ1aWxkcyB0aGUgYmluZGluZyBjb250ZXh0IGZyb20gdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycywgYW5kIGJpbmQgdGhlIHBhZ2UgYWNjb3JkaW5nbHkuXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChcblx0XHRvRXZlbnQ6IEV2ZW50PHtcblx0XHRcdHJvdXRlSW5mb3JtYXRpb24/OiBSb3V0ZUluZm9ybWF0aW9uO1xuXHRcdFx0cm91dGVQYXR0ZXJuOiBzdHJpbmc7XG5cdFx0XHRuYXZpZ2F0aW9uSW5mbzogUm91dGluZ05hdmlnYXRpb25JbmZvO1xuXHRcdFx0YXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBvYmplY3Q+O1xuXHRcdH0+XG5cdCk6IHZvaWQge1xuXHRcdC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBpcyBwYXJ0IG9mIHRoZSBldmVudCB0YXJnZXRzIChpLmUuIGlzIGEgdGFyZ2V0IGZvciB0aGUgY3VycmVudCByb3V0ZSkuXG5cdFx0Ly8gSWYgbm90LCB3ZSBkb24ndCBuZWVkIHRvIGJpbmQgaXQgLS0+IHJldHVyblxuXHRcdGlmICghdGhpcy5faXNWaWV3UGFydE9mUm91dGUob0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlSW5mb3JtYXRpb25cIikpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0cmlldmUgdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0bGV0IGJpbmRpbmdQYXR0ZXJuO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4pIHtcblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKCk7XG5cdFx0fVxuXHRcdGJpbmRpbmdQYXR0ZXJuID0gYmluZGluZ1BhdHRlcm4gPz8gdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLmNvbnRleHRQYXR0ZXJuO1xuXG5cdFx0aWYgKGJpbmRpbmdQYXR0ZXJuID09PSBudWxsIHx8IGJpbmRpbmdQYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIERvbid0IGRvIHRoaXMgaWYgd2UgYWxyZWFkeSBnb3Qgc1RhcmdldCA9PSAnJywgd2hpY2ggaXMgYSB2YWxpZCB0YXJnZXQgcGF0dGVyblxuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVQYXR0ZXJuXCIpO1xuXHRcdH1cblxuXHRcdC8vIFJlcGxhY2UgdGhlIHBhcmFtZXRlcnMgYnkgdGhlaXIgdmFsdWVzIGluIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGNvbnN0IG1Bcmd1bWVudHMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVycygpLmFyZ3VtZW50cztcblx0XHRjb25zdCBvTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmF2aWdhdGlvbkluZm9cIik7XG5cdFx0Y29uc3QgeyBwYXRoLCBkZWZlcnJlZCB9ID0gdGhpcy5fYnVpbGRCaW5kaW5nUGF0aChtQXJndW1lbnRzLCBiaW5kaW5nUGF0dGVybiwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblxuXHRcdHRoaXMub25Sb3V0ZU1hdGNoZWQoKTtcblxuXHRcdGxldCBiaW5kUHJvbWlzZTtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpO1xuXHRcdGlmIChkZWZlcnJlZCkge1xuXHRcdFx0YmluZFByb21pc2UgPSB0aGlzLl9iaW5kRGVmZXJyZWQocGF0aCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiAhPT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbiAmJlxuXHRcdFx0KHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1lZGl0XCIpIHx8ICh0aGlzLl9vUGFnZUNvbXBvbmVudD8uaXNPcGVuSW5FZGl0TW9kZT8uKCkgPz8gZmFsc2UpKVxuXHRcdCkge1xuXHRcdFx0YmluZFByb21pc2UgPSB0aGlzLl9iaW5kUGFnZUZvckVkaXQocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlKHBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cblx0XHRiaW5kUHJvbWlzZVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGR1cmluZyBwYWdlIGJpbmRpbmcgXCIgKyBlcnJvci50b1N0cmluZygpKTtcblx0XHRcdH0pO1xuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS51cGRhdGVVSVN0YXRlRm9yVmlldyh0aGlzLl9vVmlldywgdGhpcy5nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIF9iaW5kRGVmZXJyZWQodGFyZ2V0UGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsLCB7IGVkaXRhYmxlOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAoIW5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIHx8IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzLm1vZGUgPT09IFwiRGVmZXJyZWRcIikge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lmxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5kYXRhLFxuXHRcdFx0XHRcdCEhbmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSB0aGUgY29udGV4dCB0byBhdm9pZCBzaG93aW5nIG9sZCBkYXRhXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB0aGUgcGFnZSBmcm9tIGEgcGF0aCwgaWYgdGhlIGFwcCBpcyBzdGFydGVkIHdpdGggdGhlIHByZWZlcnJlZCBtb2RlIGVkaXQuXG5cdCAqXG5cdCAqIElmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhbiBhY3RpdmUgZW50aXR5LCBpdCBpcyBkaXJlY3RseSBjb252ZXJ0ZWQgdG8gZHJhZnQgdXNpbmcgdGhlIEVkaXRGbG93IGNvbnRyb2xsZXIgZXh0ZW5zaW9uLlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aFxuXHQgKiBAcGFyYW0gbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBiaW5kaW5nIGhhcyBiZWVuIHNldCBvbiB0aGUgcGFnZVxuXHQgKi9cblx0YXN5bmMgX2JpbmRQYWdlRm9yRWRpdCh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkIHwgQ29udGV4dD4ge1xuXHRcdGlmICh0YXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0ZWNobmljYWxQYXRoOiBzdHJpbmcgPSBhd2FpdCByZXNvbHZlUGF0aCh0YXJnZXRQYXRoLCBtb2RlbCwgdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLCB0aGlzLl9vUm91dGVyKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Ly8gY2hlY2sgZm9yIHN0aWNreSAmIHN0aWNreSBlZGl0IHNlc3Npb25cblx0XHRcdGNvbnN0IGlzU3RpY2t5RWRpdE1vZGUgPSBDb21tb25VdGlscy5pc1N0aWNreUVkaXRNb2RlKHRoaXMuYmFzZS5nZXRWaWV3KCkpO1xuXHRcdFx0Y29uc3QgaXNTdGlja3kgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQobWV0YU1vZGVsKTtcblx0XHRcdGlmICh0ZWNobmljYWxQYXRoLmluY2x1ZGVzKFwiSXNBY3RpdmVFbnRpdHk9dHJ1ZVwiKSB8fCAoaXNTdGlja3kgJiYgIWlzU3RpY2t5RWRpdE1vZGUpKSB7XG5cdFx0XHRcdC8vIGNyZWF0ZSBjb250ZXh0IG9yIHVzZSB0aGUgb25lIHRoZSB1c2VyIGNsaWNrZWQgb25cblx0XHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dCA9XG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dD8uZ2V0UGF0aCgpID09PSB0ZWNobmljYWxQYXRoXG5cdFx0XHRcdFx0XHQ/IG5hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHRcblx0XHRcdFx0XHRcdDogdGhpcy5fY3JlYXRlQ29udGV4dCh0ZWNobmljYWxQYXRoLCBtb2RlbCk7XG5cblx0XHRcdFx0Ly8gZWRpdCBkb2N1bWVudFxuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93LmVkaXREb2N1bWVudChhY3RpdmVDb250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRcdHRoaXMubmF2aWdhdGVUb01lc3NhZ2VQYWdlKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBvbiB0aGUgcGFnZSBpcyBzZXRcblx0ICovXG5cdGFzeW5jIF9iaW5kUGFnZSh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdC8vIFRoZSBwYWdlIGJpbmRpbmcgaXMgZG9uZSBhc3luY2hyb25vdXNseSwgdG8gbWFrZSBzdXJlIF9vblJvdXRlTWF0Y2hlZCBpcyBjYWxsZWQgZm9yIGFsbCB0YXJnZXRzIGJlZm9yZSwgYW5kIHRoZSBiaW5kaW5nIGNsZWFudXAgcHJvbWlzZXMgYXJlIHByb3Blcmx5IHN0b3JlZCBpbiB0aGUgcm91dGluZyBzZXJ2aWNlLlxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdGVjaG5pY2FsUGF0aCA9IGF3YWl0IHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpO1xuXHRcdFx0dGhpcy5fYmluZFBhZ2VUb1BhdGgodGVjaG5pY2FsUGF0aCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHt9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0ICh0aGlzIGlzIGEgcGF0aCBpbiB0aGUgbW9kZWwsIHNvIG9ubHkgdGVjaG5pY2FsIGtleXMgYXJlIGFsbG93ZWQpLlxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9QYXRoKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiB2b2lkIHtcblx0XHRjb25zdCBvQ3VycmVudENvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0c0N1cnJlbnRQYXRoID0gb0N1cnJlbnRDb250ZXh0ICYmIG9DdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRvVXNlQ29udGV4dCA9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0IGFzIENvbnRleHQgfCB1bmRlZmluZWQgfCBudWxsO1xuXG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCBvbmx5IGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0Ly8gb3IgaWYgd2UgaGF2ZSBhIGNvbnRleHQgYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRsZXQgc2hvdWxkUmVmcmVzaENvbnRleHQgPSBmYWxzZTtcblx0XHRcdFx0Ly8gV2UgYWxyZWFkeSBoYXZlIHRoZSBjb250ZXh0IHRvIGJlIHVzZWQsIGFuZCBpdCdzIG5vdCB0aGUgY3VycmVudCBvbmVcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiYgTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpIHx8XG5cdFx0XHRcdFx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkgJiZcblx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgYnV0IHdlJ3JlIGluIGNvbGxhYm9yYXRpb24gZHJhZnQsIHdlIGZvcmNlIHRoZSByZWZyZXNoIChkaXNjYXJkaW5nIHBlbmRpbmcgY2hhbmdlcykgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbi5cblx0XHRcdFx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBmcm9tIExSIHRvIE9QLCB0aGUgdmlldyBpcyBub3QgY29ubmVjdGVkIHlldCAtLT4gY2hlY2sgaWYgd2UncmUgaW4gZHJhZnQgd2l0aCBjb2xsYWJvcmF0aW9uIGZyb20gdGhlIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0c2hvdWxkUmVmcmVzaENvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVXNlQ29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoc2hvdWxkUmVmcmVzaENvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIG9Vc2VDb250ZXh0LCBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0R3JvdXBJZCgpKVxuXHRcdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKGBDYW5ub3QgcmVmcmVzaCBjb250ZXh0OiAke2Vycn1gKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IGJ1dCBhbiBlZGl0ZmxvdyBhY3Rpb24gaGFwcGVuZWQgKGUuZy4gQ2FuY2VsRG9jdW1lbnQgaW4gc3RpY2t5IG1vZGUpXG5cdFx0XHRcdC8vIC0tPiBXZSBuZWVkIHRvIGNhbGwgb25CZWZvcmUvQWZ0ZXJCaW5kaW5nIHRvIHJlZnJlc2ggdGhlIG9iamVjdCBwYWdlIHByb3Blcmx5XG5cdFx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHtcblx0XHRcdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdFx0XHRsaXN0QmluZGluZzogb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLFxuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoIHx8IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZm9yIGl0cyBwYXRoXG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dCh0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwpLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLlJlc3RvcmVIaXN0b3J5ICYmXG5cdFx0XHRFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpICYmXG5cdFx0XHQhb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0b0N1cnJlbnRDb250ZXh0XG5cdFx0KSB7XG5cdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0N1cnJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdGhlIHBhZ2UgdG8gYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBib3VuZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1BhcmVudExpc3RCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCAhb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUoXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQgJiYgIXRoaXMuX29BcHBDb21wb25lbnQuaXNFeGl0aW5nICYmIG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBiaW5kaW5nIGNvbnRleHQgaXMgcGFydCBvZiBhIGNvbGxhYm9yYXRpdmUgZHJhZnQsIHdlIGNhbGwgYWRkU2VsZiBiZWZvcmUgYmluZGluZyB0aGUgcGFnZSBzbyB0aGF0IHRoZSBTaGFyZSBhY3Rpb25cblx0XHQvLyBpcyBwYXJ0IG9mIHRoZSBzYW1lIGJhdGNoIGFzIHRoZSBwYWdlIGxvYWQsIGFuZCB3ZSBjYW4gZ2V0IHRoZSBsaXN0IG9mIHBhcnRpY2lwYXRpbmcgdXNlcnMgbGF0ZXJcblx0XHRpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQob01vZGVsLmdldE1ldGFNb2RlbCgpKSAmJiBvQ29udGV4dC5nZXRQYXRoKCkuaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT1mYWxzZVwiKSkge1xuXHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5leGVjdXRlU2hhcmVBY3Rpb24ob0NvbnRleHQpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0ZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUsXG5cdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRyZWFzb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5hZnRlclNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7IHJlZGlyZWN0ZWRUb05vbkRyYWZ0OiBvTmF2aWdhdGlvblBhcmFtZXRlcnM/LnJlZGlyZWN0ZWRUb05vbkRyYWZ0IH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKTogQ29udGV4dCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0aXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQgPSBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsKSxcblx0XHRcdG1QYXJhbWV0ZXJzOiBCaW5kQ29udGV4dFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIixcblx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIsXG5cdFx0XHRcdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWVcblx0XHRcdH07XG5cdFx0aWYgKHRoaXMuYmFzZS5pbmxpbmVFZGl0Rmxvdy5pc0lubGluZUVkaXRQb3NzaWJsZSgpKSB7XG5cdFx0XHQvLyBpZiBpbmxpbmUgZWRpdCBpcyBlbmFibGVkIG9uIHRoZSBwYWdlIGFuZCB0aGlzIGlzIHRoZSBhY3RpdmUgZW50aXR5LCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZ3JvdXAgaWQgdG8gaW5saW5lXG5cdFx0XHRtUGFyYW1ldGVycy4kJHVwZGF0ZUdyb3VwSWQgPSBzUGF0aC5pbmNsdWRlcyhcIklzQWN0aXZlRW50aXR5PXRydWVcIikgPyBDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQgOiBcIiRhdXRvXCI7XG5cdFx0fVxuXHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpIGFuZCBzZW1hbnRpYyBrZXlzIChmb3IgY3JlYXRpbmcgdGhlIHNlbWFudGljIFVSTClcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWApO1xuXHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdCA9IHNDb250ZXh0UGF0aFxuXHRcdFx0PyBvTWV0YU1vZGVsLmdldENvbnRleHQoc0NvbnRleHRQYXRoKSAmJiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCkpXG5cdFx0XHQ6IG51bGw7XG5cdFx0Y29uc3QgYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyA9IE1vZGVsSGVscGVyLmdldEFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMoXG5cdFx0XHRkYXRhTW9kZWxPYmplY3Q/LnRhcmdldEVudGl0eVR5cGUgYXMgRW50aXR5VHlwZSxcblx0XHRcdGRhdGFNb2RlbE9iamVjdD8udGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldFxuXHRcdCk7XG5cdFx0Y29uc3Qgc2VtYW50aWNLZXlzID0gb0RyYWZ0Um9vdFxuXHRcdFx0PyBkYXRhTW9kZWxPYmplY3Q/LnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TZW1hbnRpY0tleT8ubWFwKChrZXkpID0+IGtleS52YWx1ZSkgPz8gW11cblx0XHRcdDogW107XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLiQkZ3JvdXBJZCA9IFwiJGF1dG8uV29ya2Vyc1wiOyAvLyBXZSBuZWVkIHRvIHVzZSB0aGUgc2FtZSBncm91cCBJRCBhcyBmb3IgdGhlIHBhcmVudCBsaXN0IGJpbmRpbmdcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWwsIHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUga2VlcEFsaXZlIGNvbnRleHQgJHtzUGF0aH1gKTtcblx0XHRcdH0gZWxzZSBpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnRpZXNUb1JlcXVlc3QgPSBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdLmNvbmNhdChzZW1hbnRpY0tleXMpO1xuXHRcdFx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHByb3BlcnRpZXNUb1JlcXVlc3QpO1xuXHRcdFx0XHRcdGlmIChvRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZHJhZnQgYW5kIGVkaXQgd2UgbmVlZCB0byBlbnN1cmUgdGhvc2UgcHJvcGVydGllcyBhcmUgcmVxdWVzdGVkIGFnYWluIGV2ZW4gaWYgdGhleSBhcmUgaW4gdGhlIGJpbmRpbmcncyBjYWNoZVxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3aGVuIHlvdSBlZGl0IGFuZCBnbyB0byB0aGUgc2F2ZWQgdmVyc2lvbiB5b3UgaGF2ZSBubyB3YXkgb2Ygc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGVkaXQgdmVyc2lvblxuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhvRHJhZnRSb290ID8gcHJvcGVydGllc1RvUmVxdWVzdC5jb25jYXQoW1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl0pIDogcHJvcGVydGllc1RvUmVxdWVzdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzVG9TZWxlY3Q6IHN0cmluZ1tdID0gW107XG5cdFx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgc0NvbnRleHRQYXRoKTtcblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaChzTWVzc2FnZXNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaChcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdHByb3BlcnRpZXNUb1NlbGVjdC5wdXNoKC4uLnNlbWFudGljS2V5cyk7XG5cdFx0XHR9XG5cdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaCguLi5hbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzKTtcblxuXHRcdFx0aWYgKGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkICYmIG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0cHJvcGVydGllc1RvU2VsZWN0LnB1c2goXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BlcnRpZXNUb1NlbGVjdC5sZW5ndGgpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHByb3BlcnRpZXNUb1NlbGVjdC5qb2luKFwiLFwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0Y29uc3Qgb1ByZXZpb3VzQmluZGluZyA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9QcmV2aW91c0JpbmRpbmcpIHtcblx0XHRcdFx0XHRvTW9kZWwucmVzZXRDaGFuZ2VzKG9QcmV2aW91c0JpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpKTtcblx0XHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvSGlkZGVuQmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChzUGF0aCwgdW5kZWZpbmVkLCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdFx0XHR0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIuaG9sZE1lc3NhZ2VzRm9yQ29udHJvbCh0aGlzLl9vVmlldyk7XG5cdFx0XHR9KTtcblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCB0aGlzLm9uRGF0YVJlY2VpdmVkLmJpbmQodGhpcykpO1xuXHRcdFx0cmV0dXJuIG9IaWRkZW5CaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBvbkRhdGFSZWNlaXZlZChvRXZlbnQ6IEV2ZW50PHsgZXJyb3I6IHsgc3RhdHVzPzogbnVtYmVyOyBjYXVzZT86IHsgc3RhdHVzPzogbnVtYmVyIH07IG1lc3NhZ2U/OiBzdHJpbmcgfSB9Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGVycm9yID0gb0V2ZW50Py5nZXRQYXJhbWV0ZXIoXCJlcnJvclwiKTtcblx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZCh0aGlzLl9vVmlldykpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cblx0XHRpZiAoZXJyb3IpIHtcblx0XHRcdC8vIFRPRE86IGluIGNhc2Ugb2YgNDA0IHRoZSB0ZXh0IHNoYWxsIGJlIGRpZmZlcmVudFxuXHRcdFx0Y29uc3QgbWVzc2FnZUhhbmRsZXIgPSB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0XHRsZXQgbVBhcmFtczogU2hvd01lc3NhZ2VzUGFyYW1ldGVycyA9IHt9O1xuXHRcdFx0Y29uc3QgZXJyb3JTdGF0dXMgPSBlcnJvci5zdGF0dXMgPz8gZXJyb3IuY2F1c2U/LnN0YXR1cztcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHRcdGlmIChlcnJvclN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoZXJyb3JTdGF0dXMgPT09IDQwMCkge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JfREVTQ1JJUFRJT05cIiksXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogZXJyb3I/Lm1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGNvcmUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0bVBhcmFtcy5jb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyhtUGFyYW1zKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyLnJlbGVhc2VIb2xkQnlDb250cm9sKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgc2lkZSBlZmZlY3RzIG9uIGEgYmluZGluZyBjb250ZXh0IHRvIFwicmVmcmVzaFwiIGl0LlxuXHQgKiBUT0RPOiBnZXQgcmlkIG9mIHRoaXMgb25jZSBwcm92aWRlZCBieSB0aGUgbW9kZWxcblx0ICogYSByZWZyZXNoIG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3Qgd29yayBpbiBjYXNlIGEgY3JlYXRpb24gcm93IHdpdGggYSB0cmFuc2llbnQgY29udGV4dCBpc1xuXHQgKiB1c2VkLiBhbHNvIGEgcmVxdWVzdFNpZGVFZmZlY3RzIHdpdGggYW4gZW1wdHkgcGF0aCB3b3VsZCBmYWlsIGR1ZSB0byB0aGUgdHJhbnNpZW50IGNvbnRleHRcblx0ICogdGhlcmVmb3JlIHdlIGdldCBhbGwgZGVwZW5kZW50IGJpbmRpbmdzICh2aWEgcHJpdmF0ZSBtb2RlbCBtZXRob2QpIHRvIGRldGVybWluZSBhbGwgcGF0aHMgYW5kIHRoZW5cblx0ICogcmVxdWVzdCB0aGVtLlxuXHQgKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IENvbnRleHQgdG8gYmUgcmVmcmVzaGVkXG5cdCAqL1xuXHRfcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9CaW5kaW5nQ29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPVxuXHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoO1xuXHRcdGNvbnN0IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBhUHJvcGVydHlQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGdldEJpbmRpbmdQYXRocyhvQmluZGluZzogQmluZGluZyk6IHZvaWQge1xuXHRcdFx0bGV0IGFEZXBlbmRlbnRCaW5kaW5ncztcblx0XHRcdGNvbnN0IHNSZWxhdGl2ZVBhdGggPSAob0JpbmRpbmcuZ2V0Q29udGV4dCgpPy5nZXRQYXRoKCkgPz8gXCJcIikucmVwbGFjZShzUm9vdENvbnRleHRQYXRoLCBcIlwiKTsgLy8gSWYgbm8gY29udGV4dCwgdGhpcyBpcyBhbiBhYnNvbHV0ZSBiaW5kaW5nIHNvIG5vIHJlbGF0aXZlIHBhdGhcblx0XHRcdGNvbnN0IHNQYXRoID0gKHNSZWxhdGl2ZVBhdGggPyBgJHtzUmVsYXRpdmVQYXRoLnNsaWNlKDEpfS9gIDogc1JlbGF0aXZlUGF0aCkgKyBvQmluZGluZy5nZXRQYXRoKCk7XG5cblx0XHRcdGlmIChvQmluZGluZy5pc0E8T0RhdGFDb250ZXh0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiAoc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0Ly8gbm93IGdldCB0aGUgZGVwZW5kZW50IGJpbmRpbmdzXG5cdFx0XHRcdGFEZXBlbmRlbnRCaW5kaW5ncyA9IG9CaW5kaW5nLmdldERlcGVuZGVudEJpbmRpbmdzKCk7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHQvLyBhc2sgdGhlIGRlcGVuZGVudCBiaW5kaW5ncyAoYW5kIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwSWRcblx0XHRcdFx0XHQvL2lmIChhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdQYXRocyhpdGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoIWFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKCFhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQTxPRGF0YVByb3BlcnR5QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKCFhUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgc0NvbnRleHRQYXRoKTtcblx0XHR9XG5cblx0XHQvLyBiaW5kaW5nIG9mIHRoZSBjb250ZXh0IG11c3QgaGF2ZSAkJFBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIHRydWUsIHRoaXMgYm91bmQgY29udGV4dCBtYXkgYmUgbmVlZGVkIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmdcblx0XHRnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSk7XG5cblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHNbaV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0eVBhdGhzO1xuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5wdXNoKHNNZXNzYWdlc1BhdGgpO1xuXHRcdH1cblx0XHQvL2FsbCB0aGlzIGxvZ2ljIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBTaWRlRWZmZWN0cyByZXF1ZXN0IGZvciBhbiBlbXB0eSBwYXRoIChyZWZyZXNoIGV2ZXJ5dGhpbmcpLCBhZnRlciB0ZXN0aW5nIHRyYW5zaWVudCBjb250ZXh0c1xuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gb1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucmVkdWNlKCh0YXJnZXRzOiBzdHJpbmdbXSwgdGFyZ2V0UHJvcGVydHkpID0+IHtcblx0XHRcdGlmICh0YXJnZXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBpbmRleCA9IHRhcmdldFByb3BlcnR5LmluZGV4T2YoXCIvXCIpO1xuXHRcdFx0XHR0YXJnZXRzLnB1c2goaW5kZXggPiAwID8gdGFyZ2V0UHJvcGVydHkuc2xpY2UoMCwgaW5kZXgpIDogdGFyZ2V0UHJvcGVydHkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRhcmdldHM7XG5cdFx0fSwgW10pO1xuXHRcdC8vIE9EYXRhIG1vZGVsIHdpbGwgdGFrZSBjYXJlIG9mIGR1cGxpY2F0ZXNcblx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbLi4ub1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLCAuLi5vU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllc10sIG9CaW5kaW5nQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdF9nZXRCaW5kaW5nQ29udGV4dCgpOiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRfc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQ6IENvbnRleHQgfCBudWxsKTogdm9pZCB7XG5cdFx0bGV0IG9QcmV2aW91c0NvbnRleHQsIG9UYXJnZXRDb250cm9sO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vVmlldztcblx0XHR9XG5cblx0XHRvVGFyZ2V0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRpZiAob1ByZXZpb3VzQ29udGV4dD8uaXNLZWVwQWxpdmUoKSAmJiBvUHJldmlvdXNDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5fc2V0S2VlcEFsaXZlKG9QcmV2aW91c0NvbnRleHQsIGZhbHNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmxleGlibGUgY29sdW1uIGxheW91dCAoRkNMKSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aWV3ICgtMSBpZiB0aGUgYXBwIGlzIG5vdCBGQ0wpLlxuXHQgKiBAcmV0dXJucyBUaGUgbGV2ZWxcblx0ICovXG5cdGdldEZDTExldmVsKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YktlZXBBbGl2ZTogYm9vbGVhbixcblx0XHRmbkJlZm9yZURlc3Ryb3k/OiBQYXJhbWV0ZXJzPENvbnRleHRbXCJzZXRLZWVwQWxpdmVcIl0+WzFdLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzTWV0YVBhdGgpO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KFxuXHRcdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0YlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sXG5cdFx0cGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVyc1xuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCk6IHZvaWQge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0XG5cdFx0XHQ/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSFcblx0XHRcdDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IGxheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0YXN5bmMgY2xvc2VDb2x1bW4oKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdG5vUHJlc2VydmF0aW9uQ2FjaGU6IHRydWUsXG5cdFx0XHRsYXlvdXQ6IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Nsb3NlQ29sdW1uXCIpLFxuXHRcdFx0Y2FsbEV4dGVuc2lvbjogdHJ1ZVxuXHRcdH07XG5cblx0XHRjb25zdCBpc0RvY3VtZW50TW9kaWZpZWQgPVxuXHRcdFx0ISF0aGlzLmdldFZpZXcoKT8uZ2V0TW9kZWwoXCJ1aVwiKT8uZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkKSB8fCAhb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0Y29uc3QgaXNIaWRkZW5EcmFmdEVuYWJsZWQgPSAodGhpcy5fb0FwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXMoKT8uSGlkZGVuRHJhZnQgYXMgSGlkZGVuRHJhZnQpXG5cdFx0XHQuZW5hYmxlZDtcblxuXHRcdGlmICghaXNEb2N1bWVudE1vZGlmaWVkICYmIGlzSGlkZGVuRHJhZnRFbmFibGVkKSB7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlLFxuXHRcdFx0XHRza2lwQmFja05hdmlnYXRpb246IHRydWVcblx0XHRcdH07XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0Ly8gUmVtb3ZlcyB0cmFuc2l0aW9uIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgY29udGV4dFxuXHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVUcmFuc2lzdGlvbk1lc3NhZ2VGb3JDb250ZXh0KG9Db250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCB0aGUgdHJhbnNpdGlvbiBtZXNzYWdlcyBvZiB0aGUgY29udGV4dCBmcm9tIHdoZXJlIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZC5cblx0ICovXG5cdHByaXZhdGUgcmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzRm9yUHJldmlvdXNDb250ZXh0KCk6IHZvaWQge1xuXHRcdGNvbnN0IHByZXZpb3VzQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0aWYgKHByZXZpb3VzQ29udGV4dCkge1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUFsbFRyYW5zaXRpb25NZXNzYWdlc0ZvckNvbnRleHQocHJldmlvdXNDb250ZXh0KTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJuYWxSb3V0aW5nO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTJDQTtBQUNBO0FBQ0E7QUFDQTtFQUhBLElBS01BLGVBQWUsSUFBQUMsSUFBQSxHQURwQkMsY0FBYyxDQUFDLGtEQUFrRCxDQUFDLEVBQUFDLEtBQUEs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
|