@sapui5/sap.fe.macros 1.99.0 → 1.99.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/macros/.library +1 -1
- package/src/sap/fe/macros/CommonHelper.js +66 -67
- package/src/sap/fe/macros/field/FieldRuntime.js +7 -0
- package/src/sap/fe/macros/field/FieldTemplating.js +2 -8
- package/src/sap/fe/macros/field/FieldTemplating.ts +1 -7
- package/src/sap/fe/macros/internal/field/displayStyle/SemanticKeyWithDraftIndicator.fragment.xml +1 -1
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +74 -104
- package/src/sap/fe/macros/library.js +1 -1
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@ sap.ui.define(
|
|
|
16
16
|
"sap/ui/Device",
|
|
17
17
|
"sap/m/library"
|
|
18
18
|
],
|
|
19
|
-
function(
|
|
19
|
+
function (
|
|
20
20
|
ResourceModel,
|
|
21
21
|
ODataModelAnnotationHelper,
|
|
22
22
|
Log,
|
|
@@ -31,7 +31,7 @@ sap.ui.define(
|
|
|
31
31
|
"use strict";
|
|
32
32
|
var ValueColor = mobilelibrary.ValueColor;
|
|
33
33
|
var Helper = {
|
|
34
|
-
getPathToKey: function(oCtx) {
|
|
34
|
+
getPathToKey: function (oCtx) {
|
|
35
35
|
return oCtx.getObject();
|
|
36
36
|
},
|
|
37
37
|
|
|
@@ -42,7 +42,7 @@ sap.ui.define(
|
|
|
42
42
|
* @param {object} oInterface Interface instance
|
|
43
43
|
* @returns {string|boolean} Returns true, false, or expression with path, for example "{= !${IsActiveEntity} }"
|
|
44
44
|
*/
|
|
45
|
-
isVisible: function(target, oInterface) {
|
|
45
|
+
isVisible: function (target, oInterface) {
|
|
46
46
|
var oModel = oInterface.context.getModel(),
|
|
47
47
|
sPropertyPath = oInterface.context.getPath(),
|
|
48
48
|
oAnnotations = oModel.getObject(sPropertyPath + "@"),
|
|
@@ -58,7 +58,7 @@ sap.ui.define(
|
|
|
58
58
|
* @param oInterface
|
|
59
59
|
* @returns {boolean} `true` if a dialog is needed
|
|
60
60
|
*/
|
|
61
|
-
isDialog: function(oActionContext, oInterface) {
|
|
61
|
+
isDialog: function (oActionContext, oInterface) {
|
|
62
62
|
var oModel = oInterface.context.getModel(),
|
|
63
63
|
sPropertyPath = oInterface.context.getPath(),
|
|
64
64
|
isCritical = oModel.getObject(sPropertyPath + "/@$ui5.overload@com.sap.vocabularies.Common.v1.IsActionCritical");
|
|
@@ -80,7 +80,7 @@ sap.ui.define(
|
|
|
80
80
|
* @param {object} oInterface Interface instance
|
|
81
81
|
* @returns {string} A Binding Expression to determine if a field should be editable or not.
|
|
82
82
|
*/
|
|
83
|
-
getParameterEditMode: function(target, oInterface) {
|
|
83
|
+
getParameterEditMode: function (target, oInterface) {
|
|
84
84
|
var oModel = oInterface.context.getModel(),
|
|
85
85
|
sPropertyPath = oInterface.context.getPath(),
|
|
86
86
|
oAnnotations = oModel.getObject(sPropertyPath + "@"),
|
|
@@ -129,13 +129,13 @@ sap.ui.define(
|
|
|
129
129
|
* @param oInterface
|
|
130
130
|
* @returns {string | undefined}
|
|
131
131
|
*/
|
|
132
|
-
getMetaPath: function(target, oInterface) {
|
|
132
|
+
getMetaPath: function (target, oInterface) {
|
|
133
133
|
return (oInterface && oInterface.context && oInterface.context.getPath()) || undefined;
|
|
134
134
|
},
|
|
135
|
-
isDesktop: function() {
|
|
135
|
+
isDesktop: function () {
|
|
136
136
|
return Device.system.desktop === true;
|
|
137
137
|
},
|
|
138
|
-
getTargetCollection: function(oContext, navCollection) {
|
|
138
|
+
getTargetCollection: function (oContext, navCollection) {
|
|
139
139
|
var sPath = oContext.getPath(),
|
|
140
140
|
aParts,
|
|
141
141
|
entitySet,
|
|
@@ -149,13 +149,10 @@ sap.ui.define(
|
|
|
149
149
|
if (oContext.getModel) {
|
|
150
150
|
sPath =
|
|
151
151
|
(oContext.getModel().getMetaPath && oContext.getModel().getMetaPath(sPath)) ||
|
|
152
|
-
oContext
|
|
153
|
-
.getModel()
|
|
154
|
-
.getMetaModel()
|
|
155
|
-
.getMetaPath(sPath);
|
|
152
|
+
oContext.getModel().getMetaModel().getMetaPath(sPath);
|
|
156
153
|
}
|
|
157
154
|
//Supporting sPath of any format, either '/<entitySet>/<navigationCollection>' <OR> '/<entitySet>/$Type/<navigationCollection>'
|
|
158
|
-
aParts = sPath.split("/").filter(function(sPart) {
|
|
155
|
+
aParts = sPath.split("/").filter(function (sPart) {
|
|
159
156
|
return sPart && sPart != "$Type";
|
|
160
157
|
}); //filter out empty strings and parts referring to '$Type'
|
|
161
158
|
entitySet = "/" + aParts[0];
|
|
@@ -166,7 +163,7 @@ sap.ui.define(
|
|
|
166
163
|
return entitySet + "/$NavigationPropertyBinding/" + navigationCollection; // used in gotoTargetEntitySet method in the same file
|
|
167
164
|
},
|
|
168
165
|
|
|
169
|
-
isPropertyFilterable: function(property, oInterface, oDataField) {
|
|
166
|
+
isPropertyFilterable: function (property, oInterface, oDataField) {
|
|
170
167
|
var oModel = oInterface.context.getModel(),
|
|
171
168
|
sPropertyPath = oInterface.context.getPath(),
|
|
172
169
|
// LoacationPath would be the prefix of sPropertyPath, example: sPropertyPath = '/Customer/Set/Name' -> sPropertyLocationPath = '/Customer/Set'
|
|
@@ -184,7 +181,7 @@ sap.ui.define(
|
|
|
184
181
|
return CommonUtils.isPropertyFilterable(oModel, sPropertyLocationPath, sProperty);
|
|
185
182
|
},
|
|
186
183
|
|
|
187
|
-
getLocationForPropertyPath: function(oModel, sPropertyPath) {
|
|
184
|
+
getLocationForPropertyPath: function (oModel, sPropertyPath) {
|
|
188
185
|
var iLength;
|
|
189
186
|
var sCollectionPath = sPropertyPath.slice(0, sPropertyPath.lastIndexOf("/"));
|
|
190
187
|
if (oModel.getObject(sCollectionPath + "/$kind") === "EntityContainer") {
|
|
@@ -193,7 +190,7 @@ sap.ui.define(
|
|
|
193
190
|
}
|
|
194
191
|
return sCollectionPath;
|
|
195
192
|
},
|
|
196
|
-
gotoActionParameter: function(oContext) {
|
|
193
|
+
gotoActionParameter: function (oContext) {
|
|
197
194
|
var sPath = oContext.getPath(),
|
|
198
195
|
sPropertyName = oContext.getObject(sPath + "/$Name");
|
|
199
196
|
var sContext;
|
|
@@ -216,7 +213,7 @@ sap.ui.define(
|
|
|
216
213
|
* @private
|
|
217
214
|
* @ui5-restricted
|
|
218
215
|
*/
|
|
219
|
-
getEntitySetName: function(oMetaModel, sEntityType) {
|
|
216
|
+
getEntitySetName: function (oMetaModel, sEntityType) {
|
|
220
217
|
var oEntityContainer = oMetaModel.getObject("/");
|
|
221
218
|
for (var key in oEntityContainer) {
|
|
222
219
|
if (typeof oEntityContainer[key] === "object" && oEntityContainer[key].$Type === sEntityType) {
|
|
@@ -240,7 +237,7 @@ sap.ui.define(
|
|
|
240
237
|
* @private
|
|
241
238
|
* @ui5-restricted
|
|
242
239
|
*/
|
|
243
|
-
getActionPath: function(oAction, bReturnOnlyPath, sActionName, bCheckStaticValue) {
|
|
240
|
+
getActionPath: function (oAction, bReturnOnlyPath, sActionName, bCheckStaticValue) {
|
|
244
241
|
var sContextPath = oAction.getPath().split("/@")[0];
|
|
245
242
|
|
|
246
243
|
sActionName = !sActionName ? oAction.getObject(oAction.getPath()) : sActionName;
|
|
@@ -286,7 +283,7 @@ sap.ui.define(
|
|
|
286
283
|
* @param {string} sPropertyPath The property path
|
|
287
284
|
* @returns {string|boolean} A runtime binding or fixed string value for Field true/false for Rating Indicator
|
|
288
285
|
*/
|
|
289
|
-
getEditMode: function(
|
|
286
|
+
getEditMode: function (
|
|
290
287
|
oAnnotations,
|
|
291
288
|
sDataFieldType,
|
|
292
289
|
oFieldControl,
|
|
@@ -488,7 +485,7 @@ sap.ui.define(
|
|
|
488
485
|
return sExpression;
|
|
489
486
|
},
|
|
490
487
|
|
|
491
|
-
getNavigationContext: function(oContext) {
|
|
488
|
+
getNavigationContext: function (oContext) {
|
|
492
489
|
return ODataModelAnnotationHelper.getNavigationPath(oContext.getPath());
|
|
493
490
|
},
|
|
494
491
|
|
|
@@ -503,9 +500,9 @@ sap.ui.define(
|
|
|
503
500
|
* @param bKeepProperty
|
|
504
501
|
* @returns {string} The navigation path
|
|
505
502
|
*/
|
|
506
|
-
getNavigationPath: function(sPropertyPath, bKeepProperty) {
|
|
503
|
+
getNavigationPath: function (sPropertyPath, bKeepProperty) {
|
|
507
504
|
var bStartsWithEntityType = sPropertyPath.startsWith("/");
|
|
508
|
-
var aParts = sPropertyPath.split("/").filter(function(part) {
|
|
505
|
+
var aParts = sPropertyPath.split("/").filter(function (part) {
|
|
509
506
|
return !!part;
|
|
510
507
|
});
|
|
511
508
|
if (bStartsWithEntityType) {
|
|
@@ -534,7 +531,7 @@ sap.ui.define(
|
|
|
534
531
|
* @private
|
|
535
532
|
* @ui5-restricted
|
|
536
533
|
**/
|
|
537
|
-
getActionContext: function(oAction) {
|
|
534
|
+
getActionContext: function (oAction) {
|
|
538
535
|
return Helper.getActionPath(oAction, true);
|
|
539
536
|
},
|
|
540
537
|
/**
|
|
@@ -551,7 +548,7 @@ sap.ui.define(
|
|
|
551
548
|
* @private
|
|
552
549
|
* @ui5-restricted
|
|
553
550
|
**/
|
|
554
|
-
getPathToBoundActionOverload: function(oAction) {
|
|
551
|
+
getPathToBoundActionOverload: function (oAction) {
|
|
555
552
|
var sPath = Helper.getActionPath(oAction, true);
|
|
556
553
|
return sPath + "/@$ui5.overload/0";
|
|
557
554
|
},
|
|
@@ -565,7 +562,7 @@ sap.ui.define(
|
|
|
565
562
|
* @param {boolean} bEscape Should the string be escaped beforehand
|
|
566
563
|
* @returns {string} - String with single quotes
|
|
567
564
|
**/
|
|
568
|
-
addSingleQuotes: function(sValue, bEscape) {
|
|
565
|
+
addSingleQuotes: function (sValue, bEscape) {
|
|
569
566
|
if (bEscape && sValue) {
|
|
570
567
|
sValue = this.escapeSingleQuotes(sValue);
|
|
571
568
|
}
|
|
@@ -580,7 +577,7 @@ sap.ui.define(
|
|
|
580
577
|
* @param {string} sValue Some string that needs escaping of single quotes
|
|
581
578
|
* @returns {string} - String with escaped single quotes
|
|
582
579
|
**/
|
|
583
|
-
escapeSingleQuotes: function(sValue) {
|
|
580
|
+
escapeSingleQuotes: function (sValue) {
|
|
584
581
|
return sValue.replace(/[']/g, "\\'");
|
|
585
582
|
},
|
|
586
583
|
|
|
@@ -593,7 +590,7 @@ sap.ui.define(
|
|
|
593
590
|
* @param {string} sFuncName Some string for the function name
|
|
594
591
|
* @returns {string} - Function string depends on arguments passed
|
|
595
592
|
**/
|
|
596
|
-
generateFunction: function(sFuncName) {
|
|
593
|
+
generateFunction: function (sFuncName) {
|
|
597
594
|
var sParams = "";
|
|
598
595
|
for (var i = 1; i < arguments.length; i++) {
|
|
599
596
|
sParams += arguments[i];
|
|
@@ -619,7 +616,7 @@ sap.ui.define(
|
|
|
619
616
|
*
|
|
620
617
|
*/
|
|
621
618
|
|
|
622
|
-
getHeaderDataPointLinkVisibility: function(sPath, bLink, bFieldVisibility) {
|
|
619
|
+
getHeaderDataPointLinkVisibility: function (sPath, bLink, bFieldVisibility) {
|
|
623
620
|
var sVisibilityExp;
|
|
624
621
|
if (bFieldVisibility) {
|
|
625
622
|
sVisibilityExp = bLink
|
|
@@ -641,7 +638,7 @@ sap.ui.define(
|
|
|
641
638
|
* @param {string} oParams Some object
|
|
642
639
|
* @returns {string} - Object string
|
|
643
640
|
**/
|
|
644
|
-
objectToString: function(oParams) {
|
|
641
|
+
objectToString: function (oParams) {
|
|
645
642
|
var iNumberOfKeys = Object.keys(oParams).length,
|
|
646
643
|
sParams = "";
|
|
647
644
|
|
|
@@ -669,7 +666,7 @@ sap.ui.define(
|
|
|
669
666
|
* @param {string} sExpression An expression with escape characters
|
|
670
667
|
* @returns {string} Expression string without escape characters or undefined
|
|
671
668
|
**/
|
|
672
|
-
removeEscapeCharacters: function(sExpression) {
|
|
669
|
+
removeEscapeCharacters: function (sExpression) {
|
|
673
670
|
return sExpression ? sExpression.replace(/\\?\\([{}])/g, "$1") : undefined;
|
|
674
671
|
},
|
|
675
672
|
|
|
@@ -679,7 +676,7 @@ sap.ui.define(
|
|
|
679
676
|
* @param {string} sStringified
|
|
680
677
|
* @returns {string} The updated string representation of the object
|
|
681
678
|
*/
|
|
682
|
-
stringifyObject: function(sStringified) {
|
|
679
|
+
stringifyObject: function (sStringified) {
|
|
683
680
|
if (!sStringified) {
|
|
684
681
|
return undefined;
|
|
685
682
|
} else {
|
|
@@ -704,7 +701,7 @@ sap.ui.define(
|
|
|
704
701
|
* @param {object} vData The data to stringify
|
|
705
702
|
* @returns {string} The string representation of the data.
|
|
706
703
|
*/
|
|
707
|
-
stringifyCustomData: function(vData) {
|
|
704
|
+
stringifyCustomData: function (vData) {
|
|
708
705
|
var oObject = {
|
|
709
706
|
ui5object: true
|
|
710
707
|
};
|
|
@@ -718,7 +715,7 @@ sap.ui.define(
|
|
|
718
715
|
* @param {object | string} vData The data to parse
|
|
719
716
|
* @returns {object} The result of the data parsing
|
|
720
717
|
*/
|
|
721
|
-
parseCustomData: function(vData) {
|
|
718
|
+
parseCustomData: function (vData) {
|
|
722
719
|
var vData = typeof vData === "string" ? JSON.parse(vData) : vData;
|
|
723
720
|
if ("customData" in vData) {
|
|
724
721
|
return vData["customData"];
|
|
@@ -732,7 +729,7 @@ sap.ui.define(
|
|
|
732
729
|
* @param {string} sEntityType The EntityType name
|
|
733
730
|
* @returns {object} The DraftAdministrativeData
|
|
734
731
|
*/
|
|
735
|
-
_getDraftAdministrativeDataType: function(oMetaModel, sEntityType) {
|
|
732
|
+
_getDraftAdministrativeDataType: function (oMetaModel, sEntityType) {
|
|
736
733
|
return oMetaModel.requestObject("/" + sEntityType + "/DraftAdministrativeData/");
|
|
737
734
|
},
|
|
738
735
|
/**
|
|
@@ -742,8 +739,8 @@ sap.ui.define(
|
|
|
742
739
|
* @param {string} sEntityType The EntityType name
|
|
743
740
|
* @returns {string} The Binding Expression for the draft popover
|
|
744
741
|
*/
|
|
745
|
-
getPopoverText: function(iContext, sEntityType) {
|
|
746
|
-
return Helper._getDraftAdministrativeDataType(iContext.getModel(), sEntityType).then(function(oDADEntityType) {
|
|
742
|
+
getPopoverText: function (iContext, sEntityType) {
|
|
743
|
+
return Helper._getDraftAdministrativeDataType(iContext.getModel(), sEntityType).then(function (oDADEntityType) {
|
|
747
744
|
var sBinding =
|
|
748
745
|
"{parts: [{path: 'HasDraftEntity', targetType: 'any'}, " +
|
|
749
746
|
//"{path: 'DraftAdministrativeData/LastChangeDateTime'}, " +
|
|
@@ -760,7 +757,7 @@ sap.ui.define(
|
|
|
760
757
|
return sBinding;
|
|
761
758
|
});
|
|
762
759
|
},
|
|
763
|
-
getContextPath: function(oValue, oInterface) {
|
|
760
|
+
getContextPath: function (oValue, oInterface) {
|
|
764
761
|
var sPath = oInterface && oInterface.context && oInterface.context.getPath();
|
|
765
762
|
return sPath[sPath.length - 1] === "/" ? sPath.slice(0, -1) : sPath;
|
|
766
763
|
},
|
|
@@ -770,7 +767,7 @@ sap.ui.define(
|
|
|
770
767
|
* @param sPresentationVariantPath
|
|
771
768
|
* @returns {string} Stringified JSON object
|
|
772
769
|
*/
|
|
773
|
-
getSortConditions: function(oPresentationVariant, sPresentationVariantPath) {
|
|
770
|
+
getSortConditions: function (oPresentationVariant, sPresentationVariantPath) {
|
|
774
771
|
if (
|
|
775
772
|
oPresentationVariant &&
|
|
776
773
|
this._isPresentationVariantAnnotation(sPresentationVariantPath) &&
|
|
@@ -779,7 +776,7 @@ sap.ui.define(
|
|
|
779
776
|
var aSortConditions = {
|
|
780
777
|
sorters: []
|
|
781
778
|
};
|
|
782
|
-
oPresentationVariant.SortOrder.forEach(function(oCondition) {
|
|
779
|
+
oPresentationVariant.SortOrder.forEach(function (oCondition) {
|
|
783
780
|
var oSorter = {};
|
|
784
781
|
oSorter.name = oCondition.Property.$PropertyPath;
|
|
785
782
|
oSorter.descending = !!oCondition.Descending;
|
|
@@ -789,13 +786,13 @@ sap.ui.define(
|
|
|
789
786
|
}
|
|
790
787
|
return undefined;
|
|
791
788
|
},
|
|
792
|
-
_isPresentationVariantAnnotation: function(sAnnotationPath) {
|
|
789
|
+
_isPresentationVariantAnnotation: function (sAnnotationPath) {
|
|
793
790
|
return (
|
|
794
791
|
sAnnotationPath.indexOf("@com.sap.vocabularies.UI.v1.PresentationVariant") > -1 ||
|
|
795
792
|
sAnnotationPath.indexOf("@com.sap.vocabularies.UI.v1.SelectionPresentationVariant") > -1
|
|
796
793
|
);
|
|
797
794
|
},
|
|
798
|
-
createPresentationPathContext: function(oPresentationContext) {
|
|
795
|
+
createPresentationPathContext: function (oPresentationContext) {
|
|
799
796
|
var aPaths = oPresentationContext.sPath.split("@") || [];
|
|
800
797
|
var oModel = oPresentationContext.getModel();
|
|
801
798
|
if (aPaths.length && aPaths[aPaths.length - 1].indexOf("com.sap.vocabularies.UI.v1.SelectionPresentationVariant") > -1) {
|
|
@@ -804,7 +801,7 @@ sap.ui.define(
|
|
|
804
801
|
}
|
|
805
802
|
return oModel.createBindingContext(oPresentationContext.sPath + "@sapui.name");
|
|
806
803
|
},
|
|
807
|
-
getPressHandlerForDataFieldForIBN: function(oDataField, sContext, bNavigateWithConfirmationDialog) {
|
|
804
|
+
getPressHandlerForDataFieldForIBN: function (oDataField, sContext, bNavigateWithConfirmationDialog) {
|
|
808
805
|
var mNavigationParameters = {
|
|
809
806
|
navigationContexts: sContext ? sContext : "${$source>/}.getBindingContext()"
|
|
810
807
|
};
|
|
@@ -827,11 +824,11 @@ sap.ui.define(
|
|
|
827
824
|
this.objectToString(mNavigationParameters)
|
|
828
825
|
);
|
|
829
826
|
},
|
|
830
|
-
getEntitySet: function(oContext) {
|
|
827
|
+
getEntitySet: function (oContext) {
|
|
831
828
|
var sPath = oContext.getPath();
|
|
832
829
|
return ModelHelper.getEntitySetPath(sPath);
|
|
833
830
|
},
|
|
834
|
-
_isRatingIndicator: function(oControl) {
|
|
831
|
+
_isRatingIndicator: function (oControl) {
|
|
835
832
|
if (oControl.isA("sap.fe.core.controls.FieldWrapper")) {
|
|
836
833
|
var vContentDisplay = Array.isArray(oControl.getContentDisplay())
|
|
837
834
|
? oControl.getContentDisplay()[0]
|
|
@@ -842,7 +839,7 @@ sap.ui.define(
|
|
|
842
839
|
}
|
|
843
840
|
return false;
|
|
844
841
|
},
|
|
845
|
-
_updateStyleClassForRatingIndicator: function(oFieldWrapper, bLast) {
|
|
842
|
+
_updateStyleClassForRatingIndicator: function (oFieldWrapper, bLast) {
|
|
846
843
|
var vContentDisplay = Array.isArray(oFieldWrapper.getContentDisplay())
|
|
847
844
|
? oFieldWrapper.getContentDisplay()[0]
|
|
848
845
|
: oFieldWrapper.getContentDisplay();
|
|
@@ -869,7 +866,7 @@ sap.ui.define(
|
|
|
869
866
|
* @param {*} sVisibleValue Either static boolean values or Array of path expressions for visibility of menu button.
|
|
870
867
|
* @returns {*} The binding expression determining the visibility of menu actions.
|
|
871
868
|
**/
|
|
872
|
-
handleVisibilityOfMenuActions: function(sVisibleValue) {
|
|
869
|
+
handleVisibilityOfMenuActions: function (sVisibleValue) {
|
|
873
870
|
var combinedConditions = [];
|
|
874
871
|
if (Array.isArray(sVisibleValue)) {
|
|
875
872
|
for (var i = 0; i < sVisibleValue.length; i++) {
|
|
@@ -921,7 +918,7 @@ sap.ui.define(
|
|
|
921
918
|
* @param {string} sDeviationHigh ExpressionBinding for Higher Deviation level
|
|
922
919
|
* @returns {string} Returns criticality calculation as expression binding
|
|
923
920
|
*/
|
|
924
|
-
getCriticalityCalculationBinding: function(
|
|
921
|
+
getCriticalityCalculationBinding: function (
|
|
925
922
|
sImprovementDirection,
|
|
926
923
|
sValue,
|
|
927
924
|
sDeviationLow,
|
|
@@ -1074,7 +1071,7 @@ sap.ui.define(
|
|
|
1074
1071
|
* @returns {sIndicator} Return the indicator for criticality
|
|
1075
1072
|
* @private
|
|
1076
1073
|
*/
|
|
1077
|
-
_getCriticalityFromEnum: function(sCriticality) {
|
|
1074
|
+
_getCriticalityFromEnum: function (sCriticality) {
|
|
1078
1075
|
var sIndicator;
|
|
1079
1076
|
if (sCriticality === "com.sap.vocabularies.UI.v1.CriticalityType/Negative") {
|
|
1080
1077
|
sIndicator = ValueColor.Error;
|
|
@@ -1087,11 +1084,11 @@ sap.ui.define(
|
|
|
1087
1084
|
}
|
|
1088
1085
|
return sIndicator;
|
|
1089
1086
|
},
|
|
1090
|
-
getValueCriticality: function(sDimension, aValueCriticality) {
|
|
1087
|
+
getValueCriticality: function (sDimension, aValueCriticality) {
|
|
1091
1088
|
var sResult,
|
|
1092
1089
|
aValues = [];
|
|
1093
1090
|
if (aValueCriticality && aValueCriticality.length > 0) {
|
|
1094
|
-
aValueCriticality.forEach(function(oVC) {
|
|
1091
|
+
aValueCriticality.forEach(function (oVC) {
|
|
1095
1092
|
if (oVC.Value && oVC.Criticality.$EnumMember) {
|
|
1096
1093
|
var sValue =
|
|
1097
1094
|
"${" +
|
|
@@ -1116,13 +1113,13 @@ sap.ui.define(
|
|
|
1116
1113
|
* @returns {string} MeasureAttribute index.
|
|
1117
1114
|
* @private
|
|
1118
1115
|
*/
|
|
1119
|
-
getMeasureAttributeIndex: function(iMeasure, oChartAnnotations) {
|
|
1116
|
+
getMeasureAttributeIndex: function (iMeasure, oChartAnnotations) {
|
|
1120
1117
|
var aMeasures = oChartAnnotations.Measures,
|
|
1121
1118
|
bMeasureAttributeExists,
|
|
1122
1119
|
aMeasureAttributes = oChartAnnotations.MeasureAttributes,
|
|
1123
1120
|
sMeasurePropertyPath = aMeasures && aMeasures[iMeasure] && aMeasures[iMeasure].$PropertyPath,
|
|
1124
1121
|
iMeasureAttribute = -1,
|
|
1125
|
-
fnCheckMeasure = function(sMeasure, oMeasureAttribute, index) {
|
|
1122
|
+
fnCheckMeasure = function (sMeasure, oMeasureAttribute, index) {
|
|
1126
1123
|
if ((oMeasureAttribute && oMeasureAttribute.Measure && oMeasureAttribute.Measure.$PropertyPath) === sMeasure) {
|
|
1127
1124
|
iMeasureAttribute = index;
|
|
1128
1125
|
return true;
|
|
@@ -1139,13 +1136,13 @@ sap.ui.define(
|
|
|
1139
1136
|
* @param {object} oContext Context to the measure annotation
|
|
1140
1137
|
* @returns {string} Path to the measureAttribute of the measure
|
|
1141
1138
|
*/
|
|
1142
|
-
getMeasureAttributeForMeasure: function(oContext) {
|
|
1139
|
+
getMeasureAttributeForMeasure: function (oContext) {
|
|
1143
1140
|
var oMetaModel = oContext.getModel(),
|
|
1144
1141
|
sMeasurePath = oContext.getPath(),
|
|
1145
1142
|
sChartAnnotationPath = sMeasurePath.substring(0, sMeasurePath.lastIndexOf("Measure")),
|
|
1146
1143
|
iMeasure = sMeasurePath.replace(/.*\//, "");
|
|
1147
1144
|
|
|
1148
|
-
return oMetaModel.requestObject(sChartAnnotationPath).then(function(oChartAnnotations) {
|
|
1145
|
+
return oMetaModel.requestObject(sChartAnnotationPath).then(function (oChartAnnotations) {
|
|
1149
1146
|
var aMeasureAttributes = oChartAnnotations.MeasureAttributes,
|
|
1150
1147
|
iMeasureAttribute = Helper.getMeasureAttributeIndex(iMeasure, oChartAnnotations);
|
|
1151
1148
|
var sMeasureAttributePath =
|
|
@@ -1164,7 +1161,7 @@ sap.ui.define(
|
|
|
1164
1161
|
* @param {object} oTableMetadata Table metadata for which draft support shall be checked
|
|
1165
1162
|
* @returns {boolean} Returns true if draft
|
|
1166
1163
|
*/
|
|
1167
|
-
isDraftParentEntityForContainment: function(oTargetCollectionContainsTarget, oTableMetadata) {
|
|
1164
|
+
isDraftParentEntityForContainment: function (oTargetCollectionContainsTarget, oTableMetadata) {
|
|
1168
1165
|
if (oTargetCollectionContainsTarget) {
|
|
1169
1166
|
if (oTableMetadata && oTableMetadata.parentEntitySet && oTableMetadata.parentEntitySet.sPath) {
|
|
1170
1167
|
var sParentEntitySetPath = oTableMetadata.parentEntitySet.sPath;
|
|
@@ -1194,7 +1191,7 @@ sap.ui.define(
|
|
|
1194
1191
|
* @param {object} dataElement The data that is currently being processed.
|
|
1195
1192
|
* @returns {string} The correct path according to the template.
|
|
1196
1193
|
**/
|
|
1197
|
-
getDataFromTemplate: function(dataElement) {
|
|
1194
|
+
getDataFromTemplate: function (dataElement) {
|
|
1198
1195
|
var splitPath = dataElement.getPath().split("/");
|
|
1199
1196
|
var dataKey = splitPath[splitPath.length - 1];
|
|
1200
1197
|
var connectedDataPath = "/" + splitPath.slice(1, -2).join("/") + "/@";
|
|
@@ -1206,7 +1203,12 @@ sap.ui.define(
|
|
|
1206
1203
|
var key = splitTemp[i].split("{")[1].trim();
|
|
1207
1204
|
tempArray.push(key);
|
|
1208
1205
|
}
|
|
1209
|
-
|
|
1206
|
+
Object.keys(connectedObject.Data).forEach(function (sKey) {
|
|
1207
|
+
if (sKey.startsWith("$")) {
|
|
1208
|
+
delete connectedObject.Data[sKey];
|
|
1209
|
+
}
|
|
1210
|
+
});
|
|
1211
|
+
var index = Object.keys(connectedObject.Data).indexOf(dataKey);
|
|
1210
1212
|
return "/" + splitPath.slice(1, -2).join("/") + "/Data/" + tempArray[index];
|
|
1211
1213
|
},
|
|
1212
1214
|
|
|
@@ -1219,7 +1221,7 @@ sap.ui.define(
|
|
|
1219
1221
|
* @param {object} element The element that is currently being processed.
|
|
1220
1222
|
* @returns {boolean} True or False (depending on the template index).
|
|
1221
1223
|
**/
|
|
1222
|
-
notLastIndex: function(target, element) {
|
|
1224
|
+
notLastIndex: function (target, element) {
|
|
1223
1225
|
var template = target.Template;
|
|
1224
1226
|
var splitTemp = template.split("}");
|
|
1225
1227
|
var tempArray = [];
|
|
@@ -1229,7 +1231,7 @@ sap.ui.define(
|
|
|
1229
1231
|
tempArray.push(dataKey);
|
|
1230
1232
|
}
|
|
1231
1233
|
|
|
1232
|
-
tempArray.forEach(function(template) {
|
|
1234
|
+
tempArray.forEach(function (template) {
|
|
1233
1235
|
if (target.Data[template] === element && tempArray.indexOf(template) !== tempArray.length - 1) {
|
|
1234
1236
|
isLastIndex = true;
|
|
1235
1237
|
}
|
|
@@ -1245,18 +1247,15 @@ sap.ui.define(
|
|
|
1245
1247
|
* @param {string} template The template string.
|
|
1246
1248
|
* @returns {string} The delimiter in the template string.
|
|
1247
1249
|
**/
|
|
1248
|
-
getDelimiter: function(template) {
|
|
1249
|
-
return template
|
|
1250
|
-
.split("}")[1]
|
|
1251
|
-
.split("{")[0]
|
|
1252
|
-
.trim();
|
|
1250
|
+
getDelimiter: function (template) {
|
|
1251
|
+
return template.split("}")[1].split("{")[0].trim();
|
|
1253
1252
|
},
|
|
1254
1253
|
|
|
1255
|
-
setMetaModel: function(oMetaModel) {
|
|
1254
|
+
setMetaModel: function (oMetaModel) {
|
|
1256
1255
|
this.oMetaModel = oMetaModel;
|
|
1257
1256
|
},
|
|
1258
1257
|
|
|
1259
|
-
getMetaModel: function(oContext, oInterface) {
|
|
1258
|
+
getMetaModel: function (oContext, oInterface) {
|
|
1260
1259
|
if (oContext) {
|
|
1261
1260
|
var oMetaModel = oInterface.context.getModel();
|
|
1262
1261
|
return oMetaModel;
|
|
@@ -1264,7 +1263,7 @@ sap.ui.define(
|
|
|
1264
1263
|
return this.oMetaModel;
|
|
1265
1264
|
},
|
|
1266
1265
|
|
|
1267
|
-
getParameters: function(oContext, oInterface) {
|
|
1266
|
+
getParameters: function (oContext, oInterface) {
|
|
1268
1267
|
if (oContext) {
|
|
1269
1268
|
var oMetaModel = oInterface.context.getModel();
|
|
1270
1269
|
var sPath = oInterface.context.getPath();
|
|
@@ -110,6 +110,13 @@ sap.ui.define(
|
|
|
110
110
|
);
|
|
111
111
|
}
|
|
112
112
|
},
|
|
113
|
+
isDraftIndicatorVisible: function(sPropertyPath, sSemanticKeyHasDraftIndicator, HasDraftEntity, IsActiveEntity, hideDraftInfo) {
|
|
114
|
+
if (IsActiveEntity !== undefined && HasDraftEntity !== undefined && (!IsActiveEntity || HasDraftEntity) && !hideDraftInfo) {
|
|
115
|
+
return sPropertyPath === sSemanticKeyHasDraftIndicator;
|
|
116
|
+
} else {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
},
|
|
113
120
|
hasTargets: function(bSemanticObjectHasTargets, sSemanticObjectPathValue) {
|
|
114
121
|
return bSemanticObjectHasTargets ? bSemanticObjectHasTargets : false;
|
|
115
122
|
},
|
|
@@ -123,13 +123,7 @@ sap.ui.define(["sap/fe/core/templating/UIFormatters", "sap/fe/core/templating/Da
|
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
if (isPathExpression(oPropertyDataModelObjectPath.targetObject) && oPropertyDataModelObjectPath.targetObject.$target) {
|
|
126
|
-
|
|
127
|
-
oPropertyDataModelObjectPath.targetObject = oNavPath.target;
|
|
128
|
-
oNavPath.visitedObjects.forEach(function (oNavObj) {
|
|
129
|
-
if ((oNavObj === null || oNavObj === void 0 ? void 0 : oNavObj._type) === "NavigationProperty") {
|
|
130
|
-
oPropertyDataModelObjectPath.navigationProperties.push(oNavObj);
|
|
131
|
-
}
|
|
132
|
-
});
|
|
126
|
+
oPropertyDataModelObjectPath = enhanceDataModelPath(oPropertyDataModelObjectPath, oPropertyDataModelObjectPath.targetObject.path);
|
|
133
127
|
}
|
|
134
128
|
|
|
135
129
|
var oBindingExpression = bindingExpression(getContextRelativeTargetObjectPath(oPropertyDataModelObjectPath));
|
|
@@ -640,4 +634,4 @@ sap.ui.define(["sap/fe/core/templating/UIFormatters", "sap/fe/core/templating/Da
|
|
|
640
634
|
_exports.getSemanticObjects = getSemanticObjects;
|
|
641
635
|
return _exports;
|
|
642
636
|
}, false);
|
|
643
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpZWxkVGVtcGxhdGluZy50cyJdLCJuYW1lcyI6WyJhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uIiwiYmluZGluZ0V4cHJlc3Npb24iLCJmdWxsQ29udGV4dFBhdGgiLCJ0cmFuc2Zvcm1SZWN1cnNpdmVseSIsImV4cHJlc3Npb24iLCJvdXRFeHByZXNzaW9uIiwibW9kZWxOYW1lIiwidW5kZWZpbmVkIiwib1Byb3BlcnR5RGF0YU1vZGVsUGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwicGF0aCIsImdldEJpbmRpbmdXaXRoVGV4dEFycmFuZ2VtZW50IiwicHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiIsImZpZWxkRm9ybWF0T3B0aW9ucyIsInRhcmdldERpc3BsYXlNb2RlT3ZlcnJpZGUiLCJkaXNwbGF5TW9kZSIsIm9Qcm9wZXJ0eURlZmluaXRpb24iLCJ0YXJnZXRPYmplY3QiLCJ0eXBlIiwiJHRhcmdldCIsInRhcmdldERpc3BsYXlNb2RlIiwiZ2V0RGlzcGxheU1vZGUiLCJjb21tb25UZXh0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJUZXh0IiwicmVsYXRpdmVMb2NhdGlvbiIsImdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uIiwiY29udGV4dExvY2F0aW9uIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJtYXAiLCJucCIsIm5hbWUiLCJmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJmb3JtYXRSZXN1bHQiLCJ2YWx1ZUZvcm1hdHRlcnMiLCJmb3JtYXRXaXRoQnJhY2tldHMiLCJmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5IiwiZ2V0VGV4dEJpbmRpbmciLCJvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiYXNPYmplY3QiLCIkVHlwZSIsImZpZWxkVmFsdWUiLCJWYWx1ZSIsImNvbXBpbGVCaW5kaW5nIiwiY29uc3RhbnQiLCJpc1BhdGhFeHByZXNzaW9uIiwib05hdlBhdGgiLCJ0YXJnZXRFbnRpdHlUeXBlIiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXQiLCJ2aXNpdGVkT2JqZWN0cyIsImZvckVhY2giLCJvTmF2T2JqIiwiX3R5cGUiLCJwdXNoIiwib0JpbmRpbmdFeHByZXNzaW9uIiwiZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCIsIm9UYXJnZXRCaW5kaW5nIiwiTWVhc3VyZXMiLCJVbml0IiwiSVNPQ3VycmVuY3kiLCJnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5IiwibWVhc3VyZURpc3BsYXlNb2RlIiwiZm9ybWF0T3B0aW9ucyIsInNob3dNZWFzdXJlIiwiZ2V0VmFsdWVCaW5kaW5nIiwiaWdub3JlVW5pdCIsImlnbm9yZUZvcm1hdHRpbmciLCJiaW5kaW5nUGFyYW1ldGVycyIsInRhcmdldFR5cGVBbnkiLCJzaG93TWVhc3VyZU9ubHkiLCJpc1Byb3BlcnR5IiwiQ29tbXVuaWNhdGlvbiIsIklzRW1haWxBZGRyZXNzIiwib1Byb3BlcnR5VW5pdCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJvUHJvcGVydHlDdXJyZW5jeSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwiaGFzVmFsdWVIZWxwIiwic2hvd051bWJlciIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsImNvbnN0cmFpbnRzIiwicGFyYW1ldGVycyIsInRhcmdldFR5cGUiLCJnZXRVbml0QmluZGluZyIsInVuaXQiLCJnZXRBc3NvY2lhdGVkVGV4dEJpbmRpbmciLCJ0ZXh0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgiLCJvVGV4dFByb3BlcnR5UGF0aCIsIm9WYWx1ZUJpbmRpbmciLCIkJG5vUGF0Y2giLCJpc1VzZWRJbk5hdmlnYXRpb25XaXRoUXVpY2tWaWV3RmFjZXRzIiwib0RhdGFNb2RlbFBhdGgiLCJvUHJvcGVydHkiLCJhTmF2aWdhdGlvblByb3BlcnRpZXMiLCJiSXNVc2VkSW5OYXZpZ2F0aW9uV2l0aFF1aWNrVmlld0ZhY2V0cyIsIm9OYXZQcm9wIiwicmVmZXJlbnRpYWxDb25zdHJhaW50IiwibGVuZ3RoIiwib1JlZkNvbnN0cmFpbnQiLCJzb3VyY2VQcm9wZXJ0eSIsIlVJIiwiUXVpY2tWaWV3RmFjZXRzIiwiaXNSZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0RW5hYmxlZCIsIm9Qcm9wZXJ0eVBhdGgiLCJQcm9wZXJ0eUhlbHBlciIsInRleHRBbGlnbk1vZGUiLCJnZXREaXNwbGF5U3R5bGUiLCJvRGF0YUZpZWxkIiwic2VtYW50aWNPYmplY3QiLCJJc0ltYWdlVVJMIiwiSXNQaG9uZU51bWJlciIsIlRhcmdldCIsIlNlbWFudGljS2V5IiwiYVNlbWFudGljS2V5cyIsImJJc1NlbWFudGljS2V5IiwiZXZlcnkiLCJvS2V5Iiwic2VtYW50aWNLZXlTdHlsZSIsInRhcmdldEVudGl0eVNldCIsIkRyYWZ0Um9vdCIsIkNyaXRpY2FsaXR5IiwiU3RyaW5nIiwiaXNDdXJyZW5jeUFsaWduZWQiLCJNdWx0aUxpbmVUZXh0IiwiU2VtYW50aWNPYmplY3QiLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiZ2V0RWRpdFN0eWxlIiwib0ZpZWxkRm9ybWF0T3B0aW9ucyIsIlZpc3VhbGl6YXRpb24iLCJ2YWx1ZU9mIiwiZ2V0VmlzaWJsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRNb2RlbFBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCIsImlzQW5hbHl0aWNzIiwiSXNFeHBhbmRlZCIsImlzQW5hbHl0aWNhbExlYWYiLCJlcXVhbCIsIk5vZGVMZXZlbCIsImFuZCIsIm5vdCIsIkhpZGRlbiIsImlmRWxzZSIsIm9yIiwiZ2V0SW5wdXREZXNjcmlwdGlvbiIsImRlc2NyaXB0aW9uQmluZGluZ0V4cHJlc3Npb24iLCJ1bml0UHJvcGVydHkiLCJlZGl0YWJsZUV4cHJlc3Npb24iLCJpc1JlYWRPbmx5RXhwcmVzc2lvbiIsImlzQ29tcHV0ZWQiLCJRVlRleHRCaW5kaW5nIiwib1Byb3BlcnR5VmFsdWVEYXRhTW9kZWxPYmplY3RQYXRoIiwicmV0dXJuVmFsdWUiLCJnZXRRdWlja1ZpZXdUeXBlIiwiZ2V0U2VtYW50aWNPYmplY3RFeHByZXNzaW9uVG9SZXNvbHZlIiwib0Fubm90YXRpb25zIiwiYVNlbU9iakV4cHJUb1Jlc29sdmUiLCJhU2VtT2Jqa2V5cyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJlbGVtZW50Iiwic3RhcnRzV2l0aCIsImlTZW1PYmpDb3VudCIsInNTZW1PYmpFeHByZXNzaW9uIiwia2V5IiwiaW5kZXhPZiIsInNwbGl0IiwidmFsdWUiLCJnZXRTZW1hbnRpY09iamVjdHMiLCJzQ3VzdG9tRGF0YUtleSIsInNDdXN0b21EYXRhVmFsdWUiLCJhU2VtT2JqQ3VzdG9tRGF0YSIsIm9TZW1hbnRpY09iamVjdHNNb2RlbCIsIkpTT05Nb2RlbCIsIiQkdmFsdWVBc1Byb21pc2UiLCJvU2VtT2JqQmluZGluZ0NvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1BLHFDQUFxQyxHQUFHLFVBQ3BEQyxpQkFEb0QsRUFFcERDLGVBRm9ELEVBR2xDO0FBQ2xCLFdBQU9DLG9CQUFvQixDQUFDRixpQkFBRCxFQUFvQixTQUFwQixFQUErQixVQUFDRyxVQUFELEVBQWtEO0FBQzNHLFVBQUlDLGFBQThCLEdBQUdELFVBQXJDOztBQUNBLFVBQUlBLFVBQVUsQ0FBQ0UsU0FBWCxLQUF5QkMsU0FBN0IsRUFBd0M7QUFDdkM7QUFDQSxZQUFNQyxzQkFBc0IsR0FBR0Msb0JBQW9CLENBQUNQLGVBQUQsRUFBa0JFLFVBQVUsQ0FBQ00sSUFBN0IsQ0FBbkQ7QUFDQUwsUUFBQUEsYUFBYSxHQUFHTSw2QkFBNkIsQ0FBQ0gsc0JBQUQsRUFBeUJKLFVBQXpCLENBQTdDO0FBQ0E7O0FBQ0QsYUFB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QXBCLENBQW1DRSxHQUFwRDtBQUNBTSxRQUFBQSxnQkFBZ0IsR0FBR2xJLGNBQWMsQ0FBQ1gsb0JBQW9CLENBQUM4SCxvQkFBb0IsQ0FBQ08sWUFBRCxDQUFwQixDQUFtQ0ssS0FBcEMsQ0FBckIsQ0FBakM7QUFDQUksUUFBQUEsaUJBQWlCLENBQUN4SCxJQUFsQixDQUF1QjtBQUN0QmlILFVBQUFBLEdBQUcsRUFBRUssY0FEaUI7QUFFdEJGLFVBQUFBLEtBQUssRUFBRUc7QUFGZSxTQUF2QjtBQUlBOztBQUNELFVBQU1FLHFCQUEwQixHQUFHLElBQUlDLFNBQUosQ0FBY0YsaUJBQWQsQ0FBbkM7QUFDQUMsTUFBQUEscUJBQXFCLENBQUNFLGdCQUF0QixHQUF5QyxJQUF6QztBQUNBLFVBQU1DLHFCQUEwQixHQUFHSCxxQkFBcUIsQ0FBQ0ksb0JBQXRCLENBQTJDLEdBQTNDLENBQW5DO0FBQ0EsYUFBT0QscUJBQVA7QUFDQSxLQWhCRCxNQWdCTztBQUNOLGFBQU8sSUFBSUYsU0FBSixDQUFjLEVBQWQsRUFBa0JHLG9CQUFsQixDQUF1QyxHQUF2QyxDQUFQO0FBQ0E7QUFDRCxHQXBCTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Z2V0RGlzcGxheU1vZGUsXG5cdFByb3BlcnR5T3JQYXRoLFxuXHREaXNwbGF5TW9kZSxcblx0Z2V0QmluZGluZ1dpdGhVbml0T3JDdXJyZW5jeSxcblx0Zm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGVuaGFuY2VEYXRhTW9kZWxQYXRoLFxuXHRnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbixcblx0Z2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRFeHByZXNzaW9uLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Zm9ybWF0UmVzdWx0LFxuXHR0cmFuc2Zvcm1SZWN1cnNpdmVseSxcblx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbixcblx0Y29tcGlsZUJpbmRpbmcsXG5cdGNvbnN0YW50LFxuXHRiaW5kaW5nRXhwcmVzc2lvbixcblx0YW5kLFxuXHRpZkVsc2UsXG5cdG5vdCxcblx0Q29tcGxleFR5cGVFeHByZXNzaW9uLFxuXHRlcXVhbCxcblx0b3Jcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0V4cHJlc3Npb25cIjtcbmltcG9ydCB7XG5cdGlzUGF0aEV4cHJlc3Npb24sXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRpc1Byb3BlcnR5LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdmFsdWVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1ZhbHVlRm9ybWF0dGVyXCI7XG5pbXBvcnQgKiBhcyBQcm9wZXJ0eUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgaXNSZWFkT25seUV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIERhdGFGaWVsZFdpdGhVcmwsIERhdGFQb2ludFR5cGVUeXBlcywgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7IFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcblxuZXhwb3J0IHR5cGUgRmllbGRGb3JtYXRPcHRpb25zID0gUGFydGlhbDx7XG5cdHZhbHVlRm9ybWF0OiBTdHJpbmc7XG5cdHRleHRBbGlnbk1vZGU6IFN0cmluZztcblx0ZGlzcGxheU1vZGU6IERpc3BsYXlNb2RlO1xuXHRtZWFzdXJlRGlzcGxheU1vZGU6IFN0cmluZztcblx0dGV4dExpbmVzRWRpdDogU3RyaW5nO1xuXHR0ZXh0TWF4TGluZXM6IFN0cmluZztcblx0c2hvd0VtcHR5SW5kaWNhdG9yOiBib29sZWFuO1xuXHRzZW1hbnRpY0tleVN0eWxlOiBTdHJpbmc7XG5cdHNob3dJY29uVXJsOiBib29sZWFuO1xuXHRpc0FuYWx5dGljczogYm9vbGVhbjtcblx0aGFzRHJhZnRJbmRpY2F0b3I6IGJvb2xlYW47XG5cdHNlbWFudGlja2V5czogc3RyaW5nW107XG5cdHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Q6IGJvb2xlYW47XG5cdGlzQ3VycmVuY3lBbGlnbmVkOiBib29sZWFuO1xufT47XG5cbmV4cG9ydCB0eXBlIEVkaXRTdHlsZSA9XG5cdHwgXCJJbnB1dFdpdGhWYWx1ZUhlbHBcIlxuXHR8IFwiVGV4dEFyZWFcIlxuXHR8IFwiRmlsZVwiXG5cdHwgXCJEYXRlUGlja2VyXCJcblx0fCBcIlRpbWVQaWNrZXJcIlxuXHR8IFwiRGF0ZVRpbWVQaWNrZXJcIlxuXHR8IFwiQ2hlY2tCb3hcIlxuXHR8IFwiSW5wdXRXaXRoVW5pdFwiXG5cdHwgXCJJbnB1dFwiXG5cdHwgXCJSYXRpbmdJbmRpY2F0b3JcIjtcblxuZXhwb3J0IHR5cGUgRGlzcGxheVN0eWxlID1cblx0fCBcIlRleHRcIlxuXHR8IFwiTWRjRmllbGRXaXRoVmFsdWVIZWxwXCJcblx0fCBcIkF2YXRhclwiXG5cdHwgXCJGaWxlXCJcblx0fCBcIkRhdGFQb2ludFwiXG5cdHwgXCJDb250YWN0XCJcblx0fCBcIkJ1dHRvblwiXG5cdHwgXCJMaW5rXCJcblx0fCBcIk9iamVjdFN0YXR1c1wiXG5cdHwgXCJBbW91bnRXaXRoQ3VycmVuY3lcIlxuXHR8IFwiU2VtYW50aWNLZXlXaXRoRHJhZnRJbmRpY2F0b3JcIlxuXHR8IFwiT2JqZWN0SWRlbnRpZmllclwiXG5cdHwgXCJMYWJlbFNlbWFudGljS2V5XCJcblx0fCBcIkxpbmtXaXRoUXVpY2tWaWV3Rm9ybVwiXG5cdHwgXCJMaW5rV3JhcHBlclwiXG5cdHwgXCJFeHBhbmRhYmxlVGV4dFwiO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGFkZCB0aGUgdGV4dCBhcnJhbmdlbWVudCB0byBhIGJpbmRpbmcgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gYmluZGluZ0V4cHJlc3Npb24gVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBiZSBlbmhhbmNlZFxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgY3VycmVudCBjb250ZXh0IHBhdGggd2UncmUgb24gKHRvIHByb3Blcmx5IHJlc29sdmUgdGhlIHRleHQgYXJyYW5nZW1lbnQgcHJvcGVydGllcylcbiAqIEByZXR1cm5zIEFuIHVwZGF0ZWQgZXhwcmVzc2lvbiBjb250YWluaW5nIHRoZSB0ZXh0IGFycmFuZ2VtZW50IGJpbmRpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uID0gZnVuY3Rpb24oXG5cdGJpbmRpbmdFeHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4sXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aFxuKTogRXhwcmVzc2lvbjxhbnk+IHtcblx0cmV0dXJuIHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGJpbmRpbmdFeHByZXNzaW9uLCBcIkJpbmRpbmdcIiwgKGV4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxhbnk+KSA9PiB7XG5cdFx0bGV0IG91dEV4cHJlc3Npb246IEV4cHJlc3Npb248YW55PiA9IGV4cHJlc3Npb247XG5cdFx0aWYgKGV4cHJlc3Npb24ubW9kZWxOYW1lID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIEluIGNhc2Ugb2YgZGVmYXVsdCBtb2RlbCB3ZSB0aGVuIG5lZWQgdG8gcmVzb2x2ZSB0aGUgdGV4dCBhcnJhbmdlbWVudCBwcm9wZXJ0eVxuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5RGF0YU1vZGVsUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGZ1bGxDb250ZXh0UGF0aCwgZXhwcmVzc2lvbi5wYXRoKTtcblx0XHRcdG91dEV4cHJlc3Npb24gPSBnZXRCaW5kaW5nV2l0aFRleHRBcnJhbmdlbWVudChvUHJvcGVydHlEYXRhTW9kZWxQYXRoLCBleHByZXNzaW9uKTtcblx0XHR9XG5cdFx0cmV0dXJuIG91dEV4cHJlc3Npb247XG5cdH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoVGV4dEFycmFuZ2VtZW50ID0gZnVuY3Rpb24oXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEV4cHJlc3Npb248c3RyaW5nPixcblx0ZmllbGRGb3JtYXRPcHRpb25zPzogRmllbGRGb3JtYXRPcHRpb25zXG4pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCB0YXJnZXREaXNwbGF5TW9kZU92ZXJyaWRlID0gZmllbGRGb3JtYXRPcHRpb25zPy5kaXNwbGF5TW9kZTtcblx0bGV0IG91dEV4cHJlc3Npb24gPSBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uO1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID1cblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdC50eXBlID09PSBcIlByb3BlcnR5UGF0aFwiXG5cdFx0XHQ/IChvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdC4kdGFyZ2V0IGFzIFByb3BlcnR5KVxuXHRcdFx0OiAob1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHkpO1xuXHRjb25zdCB0YXJnZXREaXNwbGF5TW9kZSA9IHRhcmdldERpc3BsYXlNb2RlT3ZlcnJpZGUgfHwgZ2V0RGlzcGxheU1vZGUob1Byb3BlcnR5RGVmaW5pdGlvbiwgb1Byb3BlcnR5RGF0YU1vZGVsUGF0aCk7XG5cdGNvbnN0IGNvbW1vblRleHQgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5Db21tb24/LlRleHQ7XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbihcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbixcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzXG5cdCkubWFwKG5wID0+IG5wLm5hbWUpO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0aWYgKHRhcmdldERpc3BsYXlNb2RlICE9PSBcIlZhbHVlXCIgJiYgY29tbW9uVGV4dCkge1xuXHRcdHN3aXRjaCAodGFyZ2V0RGlzcGxheU1vZGUpIHtcblx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRvdXRFeHByZXNzaW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oY29tbW9uVGV4dCwgcmVsYXRpdmVMb2NhdGlvbikgYXMgRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdG91dEV4cHJlc3Npb24gPSBmb3JtYXRSZXN1bHQoXG5cdFx0XHRcdFx0W2Fubm90YXRpb25FeHByZXNzaW9uKGNvbW1vblRleHQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEV4cHJlc3Npb248c3RyaW5nPiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbl0sXG5cdFx0XHRcdFx0dmFsdWVGb3JtYXR0ZXJzLmZvcm1hdFdpdGhCcmFja2V0c1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdG91dEV4cHJlc3Npb24gPSBmb3JtYXRSZXN1bHQoXG5cdFx0XHRcdFx0W3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIGFubm90YXRpb25FeHByZXNzaW9uKGNvbW1vblRleHQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEV4cHJlc3Npb248c3RyaW5nPl0sXG5cdFx0XHRcdFx0dmFsdWVGb3JtYXR0ZXJzLmZvcm1hdFdpdGhCcmFja2V0c1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0VmFsdWVSZWN1cnNpdmVseSA9IGZ1bmN0aW9uKGJpbmRpbmdFeHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4sIGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IEV4cHJlc3Npb248YW55PiB7XG5cdHJldHVybiB0cmFuc2Zvcm1SZWN1cnNpdmVseShiaW5kaW5nRXhwcmVzc2lvbiwgXCJCaW5kaW5nXCIsIChleHByZXNzaW9uOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248YW55PikgPT4ge1xuXHRcdGxldCBvdXRFeHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4gPSBleHByZXNzaW9uO1xuXHRcdGlmIChleHByZXNzaW9uLm1vZGVsTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRlZmF1bHQgbW9kZWwgd2UgdGhlbiBuZWVkIHRvIHJlc29sdmUgdGhlIHRleHQgYXJyYW5nZW1lbnQgcHJvcGVydHlcblx0XHRcdGNvbnN0IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChmdWxsQ29udGV4dFBhdGgsIGV4cHJlc3Npb24ucGF0aCk7XG5cdFx0XHRvdXRFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCwgZXhwcmVzc2lvbik7XG5cdFx0fVxuXHRcdHJldHVybiBvdXRFeHByZXNzaW9uO1xuXHR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0QmluZGluZyA9IGZ1bmN0aW9uKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmaWVsZEZvcm1hdE9wdGlvbnM6IEZpZWxkRm9ybWF0T3B0aW9ucyxcblx0YXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZVxuKTogRXhwcmVzc2lvbjxzdHJpbmc+IHwgQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGlmIChcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdD8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkXCIgfHxcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdD8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50VHlwZVwiIHx8XG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aFwiIHx8XG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhVcmxcIlxuXHQpIHtcblx0XHQvLyBJZiB0aGVyZSBpcyBubyByZXNvbHZlZCBwcm9wZXJ0eSwgdGhlIHZhbHVlIGlzIHJldHVybmVkIGFzIGEgY29uc3RhbnRcblx0XHRjb25zdCBmaWVsZFZhbHVlID0gb1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuVmFsdWUgfHwgXCJcIjtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoY29uc3RhbnQoZmllbGRWYWx1ZSkpO1xuXHR9XG5cdGlmIChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KSAmJiBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC4kdGFyZ2V0KSB7XG5cdFx0Y29uc3Qgb05hdlBhdGggPSBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgob1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QucGF0aCwgdHJ1ZSk7XG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvTmF2UGF0aC50YXJnZXQ7XG5cdFx0b05hdlBhdGgudmlzaXRlZE9iamVjdHMuZm9yRWFjaCgob05hdk9iajogYW55KSA9PiB7XG5cdFx0XHRpZiAob05hdk9iaj8uX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5wdXNoKG9OYXZPYmopO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdGNvbnN0IG9CaW5kaW5nRXhwcmVzc2lvbiA9IGJpbmRpbmdFeHByZXNzaW9uKGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgob1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCkpO1xuXHRsZXQgb1RhcmdldEJpbmRpbmc7XG5cdGlmIChcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0IHx8XG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3lcblx0KSB7XG5cdFx0b1RhcmdldEJpbmRpbmcgPSBnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5KG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIG9CaW5kaW5nRXhwcmVzc2lvbik7XG5cdFx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8ubWVhc3VyZURpc3BsYXlNb2RlID09PSBcIkhpZGRlblwiKSB7XG5cdFx0XHQvLyBUT0RPOiBSZWZhY3RvciBvbmNlIHR5cGVzIGFyZSBsZXNzIGdlbmVyaWMgaGVyZVxuXHRcdFx0KG9UYXJnZXRCaW5kaW5nIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxTdHJpbmc+KS5mb3JtYXRPcHRpb25zID0ge1xuXHRcdFx0XHQuLi4ob1RhcmdldEJpbmRpbmcgYXMgQ29tcGxleFR5cGVFeHByZXNzaW9uPFN0cmluZz4pLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdHNob3dNZWFzdXJlOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0b1RhcmdldEJpbmRpbmcgPSBnZXRCaW5kaW5nV2l0aFRleHRBcnJhbmdlbWVudChvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCBvQmluZGluZ0V4cHJlc3Npb24sIGZpZWxkRm9ybWF0T3B0aW9ucyk7XG5cdH1cblx0aWYgKGFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIG9UYXJnZXRCaW5kaW5nO1xuXHR9XG5cdC8vIFdlIGRvbid0IGluY2x1ZGUgJCRub3BhdGNoIGFuZCBwYXJzZUtlZXBFbXB0eVN0cmluZyBhcyB0aGV5IG1ha2Ugbm8gc2Vuc2UgaW4gdGhlIHRleHQgYmluZGluZyBjYXNlXG5cdHJldHVybiBjb21waWxlQmluZGluZyhvVGFyZ2V0QmluZGluZyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmFsdWVCaW5kaW5nID0gZnVuY3Rpb24oXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGZpZWxkRm9ybWF0T3B0aW9uczogRmllbGRGb3JtYXRPcHRpb25zLFxuXHRpZ25vcmVVbml0OiBib29sZWFuID0gZmFsc2UsXG5cdGlnbm9yZUZvcm1hdHRpbmc6IGJvb2xlYW4gPSBmYWxzZSxcblx0YmluZGluZ1BhcmFtZXRlcnM/OiBvYmplY3QsXG5cdHRhcmdldFR5cGVBbnk/OiBib29sZWFuLFxuXHRzaG93TWVhc3VyZU9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGlmIChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KSAmJiBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC4kdGFyZ2V0KSB7XG5cdFx0Y29uc3Qgb05hdlBhdGggPSBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgob1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QucGF0aCwgdHJ1ZSk7XG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvTmF2UGF0aC50YXJnZXQ7XG5cdFx0b05hdlBhdGgudmlzaXRlZE9iamVjdHMuZm9yRWFjaCgob05hdk9iajogYW55KSA9PiB7XG5cdFx0XHRpZiAob05hdk9iaiAmJiBvTmF2T2JqLl90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChvTmF2T2JqKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGNvbnN0IHRhcmdldE9iamVjdCA9IG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRpZiAoaXNQcm9wZXJ0eSh0YXJnZXRPYmplY3QpKSB7XG5cdFx0bGV0IG9CaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPHN0cmluZz4gPSBiaW5kaW5nRXhwcmVzc2lvbihcblx0XHRcdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgob1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aClcblx0XHQpIGFzIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRcdGlmICh0YXJnZXRPYmplY3QuYW5ub3RhdGlvbnM/LkNvbW11bmljYXRpb24/LklzRW1haWxBZGRyZXNzKSB7XG5cdFx0XHRvQmluZGluZ0V4cHJlc3Npb24udHlwZSA9IFwic2FwLmZlLmNvcmUudHlwZS5FbWFpbFwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvUHJvcGVydHlVbml0ID0gZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCk7XG5cdFx0XHRjb25zdCBvUHJvcGVydHlDdXJyZW5jeSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KTtcblx0XHRcdGlmICghaWdub3JlVW5pdCAmJiAob1Byb3BlcnR5VW5pdCB8fCBvUHJvcGVydHlDdXJyZW5jeSkpIHtcblx0XHRcdFx0b0JpbmRpbmdFeHByZXNzaW9uID0gZ2V0QmluZGluZ1dpdGhVbml0T3JDdXJyZW5jeShvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCBvQmluZGluZ0V4cHJlc3Npb24pIGFzIGFueTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdChvUHJvcGVydHlVbml0ICYmICFoYXNWYWx1ZUhlbHAob1Byb3BlcnR5VW5pdCkpIHx8XG5cdFx0XHRcdFx0KG9Qcm9wZXJ0eUN1cnJlbmN5ICYmICFoYXNWYWx1ZUhlbHAob1Byb3BlcnR5Q3VycmVuY3kpKSB8fFxuXHRcdFx0XHRcdGZpZWxkRm9ybWF0T3B0aW9ucz8ubWVhc3VyZURpc3BsYXlNb2RlID09PSBcIkhpZGRlblwiXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGEgdW5pdCBvciBjdXJyZW5jeSB3aXRob3V0IGEgdmFsdWUgaGVscCwgb3IgaW4gY2FzZSB0aGUgY3VycmVuY3kgc2hvdWxkIGJlIGV4cGxpY2l0bHkgaGlkZGVuLFxuXHRcdFx0XHRcdC8vIHdlIG5lZWQgdG8gY29uZmlndXJlIHRoZSBiaW5kaW5nIHRvIG5vdCBzaG93IHRoZSBtZWFzdXJlLCBvdGhlcndpc2UgaXQncyBuZWVkZWQgZm9yIHRoZSBtZGMgZmllbGRcblx0XHRcdFx0XHRpZiAoIW9CaW5kaW5nRXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdFx0XHRvQmluZGluZ0V4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoc2hvd01lYXN1cmVPbmx5KSB7XG5cdFx0XHRcdFx0XHRvQmluZGluZ0V4cHJlc3Npb24uZm9ybWF0T3B0aW9ucy5zaG93TnVtYmVyID0gZmFsc2U7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9CaW5kaW5nRXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLnNob3dNZWFzdXJlID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvQmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKHRhcmdldE9iamVjdCwgb0JpbmRpbmdFeHByZXNzaW9uKSBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248c3RyaW5nPjtcblx0XHRcdFx0aWYgKG9CaW5kaW5nRXhwcmVzc2lvbi50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0b0JpbmRpbmdFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChpZ25vcmVGb3JtYXR0aW5nKSB7XG5cdFx0XHRkZWxldGUgb0JpbmRpbmdFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnM7XG5cdFx0XHRkZWxldGUgb0JpbmRpbmdFeHByZXNzaW9uLmNvbnN0cmFpbnRzO1xuXHRcdFx0ZGVsZXRlIG9CaW5kaW5nRXhwcmVzc2lvbi50eXBlO1xuXHRcdH1cblx0XHRpZiAoYmluZGluZ1BhcmFtZXRlcnMpIHtcblx0XHRcdG9CaW5kaW5nRXhwcmVzc2lvbi5wYXJhbWV0ZXJzID0gYmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0fVxuXHRcdGlmICh0YXJnZXRUeXBlQW55KSB7XG5cdFx0XHRvQmluZGluZ0V4cHJlc3Npb24udGFyZ2V0VHlwZSA9IFwiYW55XCI7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhvQmluZGluZ0V4cHJlc3Npb24pO1xuXHR9IGVsc2Uge1xuXHRcdGlmIChcblx0XHRcdHRhcmdldE9iamVjdD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwgfHxcblx0XHRcdHRhcmdldE9iamVjdD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKCh0YXJnZXRPYmplY3QgYXMgRGF0YUZpZWxkV2l0aFVybCkuVmFsdWUpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VW5pdEJpbmRpbmcgPSBmdW5jdGlvbihvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0bGV0IHVuaXQgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNcblx0KS5tYXAobnAgPT4gbnAubmFtZSk7XG5cdHVuaXQgPSB1bml0ID8gdW5pdCA6IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0cmV0dXJuIHVuaXQgPyBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKSkgOiB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXNzb2NpYXRlZFRleHRCaW5kaW5nID0gZnVuY3Rpb24oXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGZpZWxkRm9ybWF0T3B0aW9uczogRmllbGRGb3JtYXRPcHRpb25zXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgdGV4dFByb3BlcnR5UGF0aCA9IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KTtcblx0aWYgKHRleHRQcm9wZXJ0eVBhdGgpIHtcblx0XHRjb25zdCBvVGV4dFByb3BlcnR5UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRleHRQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IG9WYWx1ZUJpbmRpbmcgPSBnZXRWYWx1ZUJpbmRpbmcob1RleHRQcm9wZXJ0eVBhdGgsIGZpZWxkRm9ybWF0T3B0aW9ucywgdHJ1ZSwgdHJ1ZSwgeyAkJG5vUGF0Y2g6IHRydWUgfSk7XG5cdFx0cmV0dXJuIG9WYWx1ZUJpbmRpbmc7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1VzZWRJbk5hdmlnYXRpb25XaXRoUXVpY2tWaWV3RmFjZXRzID0gZnVuY3Rpb24ob0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsIG9Qcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gb0RhdGFNb2RlbFBhdGg/LnRhcmdldEVudGl0eVR5cGU/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzIHx8IFtdO1xuXHRsZXQgYklzVXNlZEluTmF2aWdhdGlvbldpdGhRdWlja1ZpZXdGYWNldHMgPSBmYWxzZTtcblx0YU5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2gob05hdlByb3AgPT4ge1xuXHRcdGlmIChvTmF2UHJvcC5yZWZlcmVudGlhbENvbnN0cmFpbnQgJiYgb05hdlByb3AucmVmZXJlbnRpYWxDb25zdHJhaW50Lmxlbmd0aCkge1xuXHRcdFx0b05hdlByb3AucmVmZXJlbnRpYWxDb25zdHJhaW50LmZvckVhY2gob1JlZkNvbnN0cmFpbnQgPT4ge1xuXHRcdFx0XHRpZiAob1JlZkNvbnN0cmFpbnQ/LnNvdXJjZVByb3BlcnR5ID09PSBvUHJvcGVydHkubmFtZSkge1xuXHRcdFx0XHRcdGlmIChvTmF2UHJvcD8udGFyZ2V0VHlwZT8uYW5ub3RhdGlvbnM/LlVJPy5RdWlja1ZpZXdGYWNldHMpIHtcblx0XHRcdFx0XHRcdGJJc1VzZWRJbk5hdmlnYXRpb25XaXRoUXVpY2tWaWV3RmFjZXRzID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBiSXNVc2VkSW5OYXZpZ2F0aW9uV2l0aFF1aWNrVmlld0ZhY2V0cztcbn07XG5cbmV4cG9ydCBjb25zdCBpc1JldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3RFbmFibGVkID0gZnVuY3Rpb24oXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0ZmllbGRGb3JtYXRPcHRpb25zOiBGaWVsZEZvcm1hdE9wdGlvbnNcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBvUHJvcGVydHk6IFByb3BlcnR5ID0gKGlzUGF0aEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdGlmIChcblx0XHQhKGZpZWxkRm9ybWF0T3B0aW9ucy5kaXNwbGF5TW9kZSA9PT0gXCJWYWx1ZVwiKSAmJlxuXHRcdCFvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCAmJlxuXHRcdCFvUHJvcGVydHkuYW5ub3RhdGlvbnM/Lk1lYXN1cmVzICYmXG5cdFx0UHJvcGVydHlIZWxwZXIuaGFzVmFsdWVIZWxwKG9Qcm9wZXJ0eSkgJiZcblx0XHRmaWVsZEZvcm1hdE9wdGlvbnMudGV4dEFsaWduTW9kZSA9PT0gXCJGb3JtXCJcblx0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpc3BsYXlTdHlsZSA9IGZ1bmN0aW9uKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGQ6IGFueSxcblx0b0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGZpZWxkRm9ybWF0T3B0aW9uczogRmllbGRGb3JtYXRPcHRpb25zLFxuXHRzZW1hbnRpY09iamVjdDogc3RyaW5nXG4pOiBEaXNwbGF5U3R5bGUge1xuXHQvLyBhbGdvcml0aG0gdG8gZGV0ZXJtaW5lIHRoZSBmaWVsZCBmcmFnbWVudCB0byB1c2Vcblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHRpZiAoXG5cdFx0c2VtYW50aWNPYmplY3QgJiZcblx0XHQhb1Byb3BlcnR5LmFubm90YXRpb25zPy5VST8uSXNJbWFnZVVSTCAmJlxuXHRcdCEob1Byb3BlcnR5LnR5cGUgPT09IFwiRWRtLlN0cmVhbVwiKSAmJlxuXHRcdCEob1Byb3BlcnR5LmFubm90YXRpb25zPy5Db21tdW5pY2F0aW9uPy5Jc0VtYWlsQWRkcmVzcyB8fCBvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW11bmljYXRpb24/LklzUGhvbmVOdW1iZXIpXG5cdCkge1xuXHRcdHJldHVybiBcIkxpbmtXaXRoUXVpY2tWaWV3Rm9ybVwiO1xuXHR9XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBcIlRleHRcIjtcblx0fVxuXHRpZiAob1Byb3BlcnR5LnR5cGUgPT09IFwiRWRtLlN0cmVhbVwiKSB7XG5cdFx0cmV0dXJuIFwiRmlsZVwiO1xuXHR9XG5cdGlmIChvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5Jc0ltYWdlVVJMKSB7XG5cdFx0cmV0dXJuIFwiQXZhdGFyXCI7XG5cdH1cblx0c3dpdGNoIChvRGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFR5cGVcIjpcblx0XHRcdHJldHVybiBcIkRhdGFQb2ludFwiO1xuXHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCI6XG5cdFx0XHRpZiAob0RhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFR5cGVcIikge1xuXHRcdFx0XHRyZXR1cm4gXCJEYXRhUG9pbnRcIjtcblx0XHRcdH0gZWxzZSBpZiAob0RhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQ29udGFjdFR5cGVcIikge1xuXHRcdFx0XHRyZXR1cm4gXCJDb250YWN0XCI7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCI6XG5cdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiOlxuXHRcdFx0cmV0dXJuIFwiQnV0dG9uXCI7XG5cdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aFwiOlxuXHRcdFx0cmV0dXJuIFwiTGlua1wiO1xuXHR9XG5cdGlmIChvRGF0YU1vZGVsUGF0aD8udGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNLZXkpIHtcblx0XHRjb25zdCBhU2VtYW50aWNLZXlzID0gb0RhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24uU2VtYW50aWNLZXk7XG5cdFx0Y29uc3QgYklzU2VtYW50aWNLZXkgPSAhYVNlbWFudGljS2V5cy5ldmVyeShmdW5jdGlvbihvS2V5KSB7XG5cdFx0XHRyZXR1cm4gb0tleT8uJHRhcmdldD8ubmFtZSAhPT0gb1Byb3BlcnR5Lm5hbWU7XG5cdFx0fSk7XG5cdFx0aWYgKGJJc1NlbWFudGljS2V5ICYmIGZpZWxkRm9ybWF0T3B0aW9ucy5zZW1hbnRpY0tleVN0eWxlKSB7XG5cdFx0XHRpZiAob0RhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QpIHtcblx0XHRcdFx0Ly8gJiYgZmllbGRGb3JtYXRPcHRpb25zLmhhc0RyYWZ0SW5kaWNhdG9yKSB7XG5cdFx0XHRcdC8vIHdlIHRoZW4gc3RpbGwgY2hlY2sgd2hldGhlciB0aGlzIGlzIGF2YWlsYWJsZSBhdCBkZXNpZ250aW1lIG9uIHRoZSBlbnRpdHlzZXRcblx0XHRcdFx0cmV0dXJuIFwiU2VtYW50aWNLZXlXaXRoRHJhZnRJbmRpY2F0b3JcIjtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmaWVsZEZvcm1hdE9wdGlvbnMuc2VtYW50aWNLZXlTdHlsZSA9PT0gXCJPYmplY3RJZGVudGlmaWVyXCIgPyBcIk9iamVjdElkZW50aWZpZXJcIiA6IFwiTGFiZWxTZW1hbnRpY0tleVwiO1xuXHRcdH1cblx0fVxuXHRpZiAob0RhdGFGaWVsZC5Dcml0aWNhbGl0eSkge1xuXHRcdHJldHVybiBcIk9iamVjdFN0YXR1c1wiO1xuXHR9XG5cdGlmIChvUHJvcGVydHkuYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSAmJiBTdHJpbmcoZmllbGRGb3JtYXRPcHRpb25zLmlzQ3VycmVuY3lBbGlnbmVkKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRpZiAoZmllbGRGb3JtYXRPcHRpb25zLm1lYXN1cmVEaXNwbGF5TW9kZSA9PT0gXCJIaWRkZW5cIikge1xuXHRcdFx0cmV0dXJuIFwiVGV4dFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJBbW91bnRXaXRoQ3VycmVuY3lcIjtcblx0fVxuXHRpZiAob1Byb3BlcnR5LmFubm90YXRpb25zPy5Db21tdW5pY2F0aW9uPy5Jc0VtYWlsQWRkcmVzcyB8fCBvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW11bmljYXRpb24/LklzUGhvbmVOdW1iZXIpIHtcblx0XHRyZXR1cm4gXCJMaW5rXCI7XG5cdH1cblx0aWYgKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/Lk11bHRpTGluZVRleHQpIHtcblx0XHRyZXR1cm4gXCJFeHBhbmRhYmxlVGV4dFwiO1xuXHR9XG5cblx0aWYgKGlzVXNlZEluTmF2aWdhdGlvbldpdGhRdWlja1ZpZXdGYWNldHMob0RhdGFNb2RlbFBhdGgsIG9Qcm9wZXJ0eSkpIHtcblx0XHRyZXR1cm4gXCJMaW5rV2l0aFF1aWNrVmlld0Zvcm1cIjtcblx0fVxuXHRpZiAob1Byb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlNlbWFudGljT2JqZWN0KSB7XG5cdFx0cmV0dXJuIFwiTGlua1dyYXBwZXJcIjtcblx0fVxuXHRpZiAob0RhdGFGaWVsZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoVXJsXCIpIHtcblx0XHRyZXR1cm4gXCJMaW5rXCI7XG5cdH1cblx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucy5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuIFwiTWRjRmllbGRXaXRoVmFsdWVIZWxwXCI7XG5cdH1cblx0cmV0dXJuIFwiVGV4dFwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVkaXRTdHlsZSA9IGZ1bmN0aW9uKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGQ6IGFueSxcblx0b0ZpZWxkRm9ybWF0T3B0aW9uczogRmllbGRGb3JtYXRPcHRpb25zXG4pOiBFZGl0U3R5bGUgfCBudWxsIHtcblx0Ly8gYWxnb3JpdGhtIHRvIGRldGVybWluZSB0aGUgZmllbGQgZnJhZ21lbnQgdG8gdXNlXG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGNvbnN0IG9Qcm9wZXJ0eTogUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0aWYgKG9Qcm9wZXJ0eS50eXBlID09PSBcIkVkbS5TdHJlYW1cIikge1xuXHRcdHJldHVybiBcIkZpbGVcIjtcblx0fVxuXHRzd2l0Y2ggKG9EYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiOlxuXHRcdFx0aWYgKG9EYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkNvbnRhY3RUeXBlXCIpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9IGVsc2UgaWYgKG9EYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py5WaXN1YWxpemF0aW9uID09PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1JhdGluZ1wiKSB7XG5cdFx0XHRcdHJldHVybiBcIlJhdGluZ0luZGljYXRvclwiO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFR5cGVcIjpcblx0XHRcdGlmIChvRGF0YUZpZWxkPy5WaXN1YWxpemF0aW9uID09PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1JhdGluZ1wiKSB7XG5cdFx0XHRcdHJldHVybiBcIlJhdGluZ0luZGljYXRvclwiO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiOlxuXHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGhcIjpcblx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uXCI6XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRjb25zdCBvUHJvcGVydHlVbml0ID0gZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHkpO1xuXHRjb25zdCBvUHJvcGVydHlDdXJyZW5jeSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KG9Qcm9wZXJ0eSk7XG5cdGlmIChcblx0XHQoUHJvcGVydHlIZWxwZXIuaGFzVmFsdWVIZWxwKG9Qcm9wZXJ0eSkgJiYgb1Byb3BlcnR5LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIikgfHxcblx0XHQob1Byb3BlcnR5VW5pdCAmJiBQcm9wZXJ0eUhlbHBlci5oYXNWYWx1ZUhlbHAob1Byb3BlcnR5VW5pdCkpIHx8XG5cdFx0KG9Qcm9wZXJ0eUN1cnJlbmN5ICYmIFByb3BlcnR5SGVscGVyLmhhc1ZhbHVlSGVscChvUHJvcGVydHlDdXJyZW5jeSkpXG5cdCkge1xuXHRcdGlmIChvRmllbGRGb3JtYXRPcHRpb25zPy5tZWFzdXJlRGlzcGxheU1vZGUgPT09IFwiSGlkZGVuXCIpIHtcblx0XHRcdHJldHVybiBcIklucHV0XCI7XG5cdFx0fVxuXHRcdHJldHVybiBcIklucHV0V2l0aFZhbHVlSGVscFwiO1xuXHR9XG5cdGlmIChvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5NdWx0aUxpbmVUZXh0Py52YWx1ZU9mKCkgJiYgb1Byb3BlcnR5LnR5cGUgPT09IFwiRWRtLlN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIFwiVGV4dEFyZWFcIjtcblx0fVxuXHRzd2l0Y2ggKG9Qcm9wZXJ0eS50eXBlKSB7XG5cdFx0Y2FzZSBcIkVkbS5EYXRlXCI6XG5cdFx0XHRyZXR1cm4gXCJEYXRlUGlja2VyXCI7XG5cdFx0Y2FzZSBcIkVkbS5UaW1lXCI6XG5cdFx0Y2FzZSBcIkVkbS5UaW1lT2ZEYXlcIjpcblx0XHRcdHJldHVybiBcIlRpbWVQaWNrZXJcIjtcblx0XHRjYXNlIFwiRWRtLkRhdGVUaW1lXCI6XG5cdFx0Y2FzZSBcIkVkbS5EYXRlVGltZU9mZnNldFwiOlxuXHRcdFx0cmV0dXJuIFwiRGF0ZVRpbWVQaWNrZXJcIjtcblx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdHJldHVybiBcIkNoZWNrQm94XCI7XG5cdH1cblx0aWYgKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQpIHtcblx0XHRyZXR1cm4gXCJJbnB1dFdpdGhVbml0XCI7XG5cdH1cblx0cmV0dXJuIFwiSW5wdXRcIjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmluZGluZyBleHByZXNzaW9uIHRvIGV2YWx1YXRlIHRoZSB2aXNpYmlsaXR5IG9mIGEgRGF0YUZpZWxkIG9yIERhdGFQb2ludCBhbm5vdGF0aW9uLlxuICpcbiAqIFNBUCBGaW9yaSBlbGVtZW50cyB3aWxsIGV2YWx1YXRlIGVpdGhlciB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZGVmaW5lZCBvbiB0aGUgYW5ub3RhdGlvbiBpdHNlbGYgb3Igb24gdGhlIHRhcmdldCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge0RhdGFNb2RlbE9iamVjdFBhdGh9IGRhdGFGaWVsZE1vZGVsUGF0aCBUaGUgbWV0YXBhdGggcmVmZXJyaW5nIHRvIHRoZSBhbm5vdGF0aW9uIHdlIGFyZSBldmFsdWF0aW5nLlxuICogQHBhcmFtIHtGaWVsZEZvcm1hdE9wdGlvbnN9IFtmb3JtYXRPcHRpb25zXSBGb3JtYXRPcHRpb25zIG9wdGlvbmFsLlxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPHN0cmluZz59IEFuIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIGJpbmQgdG8gdGhlIFVJLlxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbihcblx0ZGF0YUZpZWxkTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmb3JtYXRPcHRpb25zPzogRmllbGRGb3JtYXRPcHRpb25zXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgdGFyZ2V0T2JqZWN0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzID0gZGF0YUZpZWxkTW9kZWxQYXRoLnRhcmdldE9iamVjdDtcblx0bGV0IHByb3BlcnR5VmFsdWU7XG5cdGlmICh0YXJnZXRPYmplY3QpIHtcblx0XHRzd2l0Y2ggKHRhcmdldE9iamVjdC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0Ly8gaWYgaXQgaXMgYSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgRGF0YVBvaW50IHdlIGxvb2sgYXQgdGhlIGRhdGFQb2ludCdzIHZhbHVlXG5cdFx0XHRcdGlmICh0YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlRhcmdldC4kdGFyZ2V0Py5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBVSS5Jc0V4cGFuZGVkIDogY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBlcXVhbChVSS5Ob2RlTGV2ZWwsIDApIDogY29uc3RhbnQoZmFsc2UpO1xuXG5cdC8vIEEgZGF0YSBmaWVsZCBpcyB2aXNpYmxlIGlmOlxuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBwcm9wZXJ0eSBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSBpbiBjYXNlIG9mIEFuYWx5dGljcyBpdCdzIG5vdCB2aXNpYmxlIGZvciBhbiBleHBhbmRlZCBHcm91cEhlYWRlclxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0YW5kKFxuXHRcdFx0Li4uW1xuXHRcdFx0XHRub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSxcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdCEhcHJvcGVydHlWYWx1ZSxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlICYmIG5vdChlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KSxcblx0XHRcdFx0b3Iobm90KGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQpLCBpc0FuYWx5dGljYWxMZWFmKVxuXHRcdFx0XVxuXHRcdClcblx0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbnB1dERlc2NyaXB0aW9uID0gZnVuY3Rpb24oXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0ZGVzY3JpcHRpb25CaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPlxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShvUHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkob1Byb3BlcnR5KTtcblx0aWYgKCF1bml0UHJvcGVydHkpIHtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXCJcIik7XG5cdH1cblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gYW5kKG5vdChpc1JlYWRPbmx5RXhwcmVzc2lvbih1bml0UHJvcGVydHkpKSwgbm90KFByb3BlcnR5SGVscGVyLmlzQ29tcHV0ZWQodW5pdFByb3BlcnR5KSkpO1xuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoaWZFbHNlKGVkaXRhYmxlRXhwcmVzc2lvbiwgXCJcIiwgZGVzY3JpcHRpb25CaW5kaW5nRXhwcmVzc2lvbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IFFWVGV4dEJpbmRpbmcgPSBmdW5jdGlvbihcblx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0b1Byb3BlcnR5VmFsdWVEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmaWVsZEZvcm1hdE9wdGlvbnM6IEZpZWxkRm9ybWF0T3B0aW9ucyxcblx0YXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG5cdGxldCByZXR1cm5WYWx1ZTogYW55ID0gZ2V0VmFsdWVCaW5kaW5nKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIGZpZWxkRm9ybWF0T3B0aW9ucywgYXNPYmplY3QpO1xuXHRpZiAocmV0dXJuVmFsdWUgPT09IFwiXCIpIHtcblx0XHRyZXR1cm5WYWx1ZSA9IGdldFRleHRCaW5kaW5nKG9Qcm9wZXJ0eVZhbHVlRGF0YU1vZGVsT2JqZWN0UGF0aCwgZmllbGRGb3JtYXRPcHRpb25zLCBhc09iamVjdCk7XG5cdH1cblx0cmV0dXJuIHJldHVyblZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFF1aWNrVmlld1R5cGUgPSBmdW5jdGlvbihvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogc3RyaW5nIHtcblx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gb1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdGlmICh0YXJnZXRPYmplY3Q/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tdW5pY2F0aW9uPy5Jc0VtYWlsQWRkcmVzcykge1xuXHRcdHJldHVybiBcImVtYWlsXCI7XG5cdH1cblx0aWYgKHRhcmdldE9iamVjdD8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW11bmljYXRpb24/LklzUGhvbmVOdW1iZXIpIHtcblx0XHRyZXR1cm4gXCJwaG9uZVwiO1xuXHR9XG5cdHJldHVybiBcInRleHRcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZW1hbnRpY09iamVjdEV4cHJlc3Npb25Ub1Jlc29sdmUgPSBmdW5jdGlvbihvQW5ub3RhdGlvbnM6IGFueSk6IGFueVtdIHtcblx0Y29uc3QgYVNlbU9iakV4cHJUb1Jlc29sdmU6IGFueVtdID0gW107XG5cdGlmIChvQW5ub3RhdGlvbnMpIHtcblx0XHRjb25zdCBhU2VtT2Jqa2V5cyA9IE9iamVjdC5rZXlzKG9Bbm5vdGF0aW9ucykuZmlsdGVyKGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRcdHJldHVybiBlbGVtZW50ID09PSBcIlNlbWFudGljT2JqZWN0XCIgfHwgZWxlbWVudC5zdGFydHNXaXRoKFwiU2VtYW50aWNPYmplY3QjXCIpO1xuXHRcdH0pO1xuXHRcdGZvciAobGV0IGlTZW1PYmpDb3VudCA9IDA7IGlTZW1PYmpDb3VudCA8IGFTZW1PYmprZXlzLmxlbmd0aDsgaVNlbU9iakNvdW50KyspIHtcblx0XHRcdGNvbnN0IHNTZW1PYmpFeHByZXNzaW9uID0gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ob0Fubm90YXRpb25zW2FTZW1PYmprZXlzW2lTZW1PYmpDb3VudF1dKSk7XG5cdFx0XHRhU2VtT2JqRXhwclRvUmVzb2x2ZS5wdXNoKHtcblx0XHRcdFx0a2V5OiBzU2VtT2JqRXhwcmVzc2lvbj8uaW5kZXhPZihcIntcIikgPT09IC0xID8gc1NlbU9iakV4cHJlc3Npb24gOiBzU2VtT2JqRXhwcmVzc2lvbj8uc3BsaXQoXCJ7XCIpWzFdLnNwbGl0KFwifVwiKVswXSxcblx0XHRcdFx0dmFsdWU6IHNTZW1PYmpFeHByZXNzaW9uXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFTZW1PYmpFeHByVG9SZXNvbHZlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNlbWFudGljT2JqZWN0cyA9IGZ1bmN0aW9uKGFTZW1PYmpFeHByVG9SZXNvbHZlOiBhbnlbXSk6IGFueSB7XG5cdGlmIChhU2VtT2JqRXhwclRvUmVzb2x2ZS5sZW5ndGggPiAwKSB7XG5cdFx0bGV0IHNDdXN0b21EYXRhS2V5OiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCBzQ3VzdG9tRGF0YVZhbHVlOiBhbnkgPSBcIlwiO1xuXHRcdGNvbnN0IGFTZW1PYmpDdXN0b21EYXRhOiBhbnlbXSA9IFtdO1xuXHRcdGZvciAobGV0IGlTZW1PYmpDb3VudCA9IDA7IGlTZW1PYmpDb3VudCA8IGFTZW1PYmpFeHByVG9SZXNvbHZlLmxlbmd0aDsgaVNlbU9iakNvdW50KyspIHtcblx0XHRcdHNDdXN0b21EYXRhS2V5ID0gYVNlbU9iakV4cHJUb1Jlc29sdmVbaVNlbU9iakNvdW50XS5rZXk7XG5cdFx0XHRzQ3VzdG9tRGF0YVZhbHVlID0gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24oYVNlbU9iakV4cHJUb1Jlc29sdmVbaVNlbU9iakNvdW50XS52YWx1ZSkpO1xuXHRcdFx0YVNlbU9iakN1c3RvbURhdGEucHVzaCh7XG5cdFx0XHRcdGtleTogc0N1c3RvbURhdGFLZXksXG5cdFx0XHRcdHZhbHVlOiBzQ3VzdG9tRGF0YVZhbHVlXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3Qgb1NlbWFudGljT2JqZWN0c01vZGVsOiBhbnkgPSBuZXcgSlNPTk1vZGVsKGFTZW1PYmpDdXN0b21EYXRhKTtcblx0XHRvU2VtYW50aWNPYmplY3RzTW9kZWwuJCR2YWx1ZUFzUHJvbWlzZSA9IHRydWU7XG5cdFx0Y29uc3Qgb1NlbU9iakJpbmRpbmdDb250ZXh0OiBhbnkgPSBvU2VtYW50aWNPYmplY3RzTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHRcdHJldHVybiBvU2VtT2JqQmluZGluZ0NvbnRleHQ7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG5ldyBKU09OTW9kZWwoW10pLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0fVxufTtcbiJdfQ==
|
|
637
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpZWxkVGVtcGxhdGluZy50cyJdLCJuYW1lcyI6WyJhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uIiwiYmluZGluZ0V4cHJlc3Npb24iLCJmdWxsQ29udGV4dFBhdGgiLCJ0cmFuc2Zvcm1SZWN1cnNpdmVseSIsImV4cHJlc3Npb24iLCJvdXRFeHByZXNzaW9uIiwibW9kZWxOYW1lIiwidW5kZWZpbmVkIiwib1Byb3BlcnR5RGF0YU1vZGVsUGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwicGF0aCIsImdldEJpbmRpbmdXaXRoVGV4dEFycmFuZ2VtZW50IiwicHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiIsImZpZWxkRm9ybWF0T3B0aW9ucyIsInRhcmdldERpc3BsYXlNb2RlT3ZlcnJpZGUiLCJkaXNwbGF5TW9kZSIsIm9Qcm9wZXJ0eURlZmluaXRpb24iLCJ0YXJnZXRPYmplY3QiLCJ0eXBlIiwiJHRhcmdldCIsInRhcmdldERpc3BsYXlNb2RlIiwiZ2V0RGlzcGxheU1vZGUiLCJjb21tb25UZXh0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJUZXh0IiwicmVsYXRpdmVMb2NhdGlvbiIsImdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uIiwiY29udGV4dExvY2F0aW9uIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJtYXAiLCJucCIsIm5hbWUiLCJmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJmb3JtYXRSZXN1bHQiLCJ2YWx1ZUZvcm1hdHRlcnMiLCJmb3JtYXRXaXRoQnJhY2tldHMiLCJmb3JtYXRWYWx1ZVJlY3Vyc2l2ZWx5IiwiZ2V0VGV4dEJpbmRpbmciLCJvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiYXNPYmplY3QiLCIkVHlwZSIsImZpZWxkVmFsdWUiLCJWYWx1ZSIsImNvbXBpbGVCaW5kaW5nIiwiY29uc3RhbnQiLCJpc1BhdGhFeHByZXNzaW9uIiwib0JpbmRpbmdFeHByZXNzaW9uIiwiZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCIsIm9UYXJnZXRCaW5kaW5nIiwiTWVhc3VyZXMiLCJVbml0IiwiSVNPQ3VycmVuY3kiLCJnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5IiwibWVhc3VyZURpc3BsYXlNb2RlIiwiZm9ybWF0T3B0aW9ucyIsInNob3dNZWFzdXJlIiwiZ2V0VmFsdWVCaW5kaW5nIiwiaWdub3JlVW5pdCIsImlnbm9yZUZvcm1hdHRpbmciLCJiaW5kaW5nUGFyYW1ldGVycyIsInRhcmdldFR5cGVBbnkiLCJzaG93TWVhc3VyZU9ubHkiLCJvTmF2UGF0aCIsInRhcmdldEVudGl0eVR5cGUiLCJyZXNvbHZlUGF0aCIsInRhcmdldCIsInZpc2l0ZWRPYmplY3RzIiwiZm9yRWFjaCIsIm9OYXZPYmoiLCJfdHlwZSIsInB1c2giLCJpc1Byb3BlcnR5IiwiQ29tbXVuaWNhdGlvbiIsIklzRW1haWxBZGRyZXNzIiwib1Byb3BlcnR5VW5pdCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJvUHJvcGVydHlDdXJyZW5jeSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwiaGFzVmFsdWVIZWxwIiwic2hvd051bWJlciIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsImNvbnN0cmFpbnRzIiwicGFyYW1ldGVycyIsInRhcmdldFR5cGUiLCJnZXRVbml0QmluZGluZyIsInVuaXQiLCJnZXRBc3NvY2lhdGVkVGV4dEJpbmRpbmciLCJ0ZXh0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgiLCJvVGV4dFByb3BlcnR5UGF0aCIsIm9WYWx1ZUJpbmRpbmciLCIkJG5vUGF0Y2giLCJpc1VzZWRJbk5hdmlnYXRpb25XaXRoUXVpY2tWaWV3RmFjZXRzIiwib0RhdGFNb2RlbFBhdGgiLCJvUHJvcGVydHkiLCJhTmF2aWdhdGlvblByb3BlcnRpZXMiLCJiSXNVc2VkSW5OYXZpZ2F0aW9uV2l0aFF1aWNrVmlld0ZhY2V0cyIsIm9OYXZQcm9wIiwicmVmZXJlbnRpYWxDb25zdHJhaW50IiwibGVuZ3RoIiwib1JlZkNvbnN0cmFpbnQiLCJzb3VyY2VQcm9wZXJ0eSIsIlVJIiwiUXVpY2tWaWV3RmFjZXRzIiwiaXNSZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0RW5hYmxlZCIsIm9Qcm9wZXJ0eVBhdGgiLCJQcm9wZXJ0eUhlbHBlciIsInRleHRBbGlnbk1vZGUiLCJnZXREaXNwbGF5U3R5bGUiLCJvRGF0YUZpZWxkIiwic2VtYW50aWNPYmplY3QiLCJJc0ltYWdlVVJMIiwiSXNQaG9uZU51bWJlciIsIlRhcmdldCIsIlNlbWFudGljS2V5IiwiYVNlbWFudGljS2V5cyIsImJJc1NlbWFudGljS2V5IiwiZXZlcnkiLCJvS2V5Iiwic2VtYW50aWNLZXlTdHlsZSIsInRhcmdldEVudGl0eVNldCIsIkRyYWZ0Um9vdCIsIkNyaXRpY2FsaXR5IiwiU3RyaW5nIiwiaXNDdXJyZW5jeUFsaWduZWQiLCJNdWx0aUxpbmVUZXh0IiwiU2VtYW50aWNPYmplY3QiLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiZ2V0RWRpdFN0eWxlIiwib0ZpZWxkRm9ybWF0T3B0aW9ucyIsIlZpc3VhbGl6YXRpb24iLCJ2YWx1ZU9mIiwiZ2V0VmlzaWJsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRNb2RlbFBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCIsImlzQW5hbHl0aWNzIiwiSXNFeHBhbmRlZCIsImlzQW5hbHl0aWNhbExlYWYiLCJlcXVhbCIsIk5vZGVMZXZlbCIsImFuZCIsIm5vdCIsIkhpZGRlbiIsImlmRWxzZSIsIm9yIiwiZ2V0SW5wdXREZXNjcmlwdGlvbiIsImRlc2NyaXB0aW9uQmluZGluZ0V4cHJlc3Npb24iLCJ1bml0UHJvcGVydHkiLCJlZGl0YWJsZUV4cHJlc3Npb24iLCJpc1JlYWRPbmx5RXhwcmVzc2lvbiIsImlzQ29tcHV0ZWQiLCJRVlRleHRCaW5kaW5nIiwib1Byb3BlcnR5VmFsdWVEYXRhTW9kZWxPYmplY3RQYXRoIiwicmV0dXJuVmFsdWUiLCJnZXRRdWlja1ZpZXdUeXBlIiwiZ2V0U2VtYW50aWNPYmplY3RFeHByZXNzaW9uVG9SZXNvbHZlIiwib0Fubm90YXRpb25zIiwiYVNlbU9iakV4cHJUb1Jlc29sdmUiLCJhU2VtT2Jqa2V5cyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJlbGVtZW50Iiwic3RhcnRzV2l0aCIsImlTZW1PYmpDb3VudCIsInNTZW1PYmpFeHByZXNzaW9uIiwia2V5IiwiaW5kZXhPZiIsInNwbGl0IiwidmFsdWUiLCJnZXRTZW1hbnRpY09iamVjdHMiLCJzQ3VzdG9tRGF0YUtleSIsInNDdXN0b21EYXRhVmFsdWUiLCJhU2VtT2JqQ3VzdG9tRGF0YSIsIm9TZW1hbnRpY09iamVjdHNNb2RlbCIsIkpTT05Nb2RlbCIsIiQkdmFsdWVBc1Byb21pc2UiLCJvU2VtT2JqQmluZGluZ0NvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1BLHFDQUFxQyxHQUFHLFVBQ3BEQyxpQkFEb0QsRUFFcERDLGVBRm9ELEVBR2xDO0FBQ2xCLFdBQU9DLG9CQUFvQixDQUFDRixpQkFBRCxFQUFvQixTQUFwQixFQUErQixVQUFDRyxVQUFELEVBQWtEO0FBQzNHLFVBQUlDLGFBQThCLEdBQUdELFVBQXJDOztBQUNBLFVBQUlBLFVBQVUsQ0FBQ0UsU0FBWCxLQUF5QkMsU0FBN0IsRUFBd0M7QUFDdkM7QUFDQSxZQUFNQyxzQkFBc0IsR0FBR0Msb0JBQW9CLENBQUNQLGVBQUQsRUFBa0JFLFVBQVUsQ0FBQ00sSUFBN0IsQ0FBbkQ7QUFDQUwsUUFBQUEsYUFBYSxHQUFHTSw2QkFBNkIsQ0FBQ0gsc0JBQUQsRUFBeUJKLFVBQXpCLENBQTdDO0FBQ0E7O0FBQ0QsYUFB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QUF0QixHQUF5QyxJQUF6QztBQUNBLFVBQU1DLHFCQUEwQixHQUFHSCxxQkFBcUIsQ0FBQ0ksb0JBQXRCLENBQTJDLEdBQTNDLENBQW5DO0FBQ0EsYUFBT0QscUJBQVA7QUFDQSxLQWhCRCxNQWdCTztBQUNOLGFBQU8sSUFBSUYsU0FBSixDQUFjLEVBQWQsRUFBa0JHLG9CQUFsQixDQUF1QyxHQUF2QyxDQUFQO0FBQ0E7QUFDRCxHQXBCTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Z2V0RGlzcGxheU1vZGUsXG5cdFByb3BlcnR5T3JQYXRoLFxuXHREaXNwbGF5TW9kZSxcblx0Z2V0QmluZGluZ1dpdGhVbml0T3JDdXJyZW5jeSxcblx0Zm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGVuaGFuY2VEYXRhTW9kZWxQYXRoLFxuXHRnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbixcblx0Z2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRFeHByZXNzaW9uLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Zm9ybWF0UmVzdWx0LFxuXHR0cmFuc2Zvcm1SZWN1cnNpdmVseSxcblx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbixcblx0Y29tcGlsZUJpbmRpbmcsXG5cdGNvbnN0YW50LFxuXHRiaW5kaW5nRXhwcmVzc2lvbixcblx0YW5kLFxuXHRpZkVsc2UsXG5cdG5vdCxcblx0Q29tcGxleFR5cGVFeHByZXNzaW9uLFxuXHRlcXVhbCxcblx0b3Jcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0V4cHJlc3Npb25cIjtcbmltcG9ydCB7XG5cdGlzUGF0aEV4cHJlc3Npb24sXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRpc1Byb3BlcnR5LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdmFsdWVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1ZhbHVlRm9ybWF0dGVyXCI7XG5pbXBvcnQgKiBhcyBQcm9wZXJ0eUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgaXNSZWFkT25seUV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIERhdGFGaWVsZFdpdGhVcmwsIERhdGFQb2ludFR5cGVUeXBlcywgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7IFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcblxuZXhwb3J0IHR5cGUgRmllbGRGb3JtYXRPcHRpb25zID0gUGFydGlhbDx7XG5cdHZhbHVlRm9ybWF0OiBTdHJpbmc7XG5cdHRleHRBbGlnbk1vZGU6IFN0cmluZztcblx0ZGlzcGxheU1vZGU6IERpc3BsYXlNb2RlO1xuXHRtZWFzdXJlRGlzcGxheU1vZGU6IFN0cmluZztcblx0dGV4dExpbmVzRWRpdDogU3RyaW5nO1xuXHR0ZXh0TWF4TGluZXM6IFN0cmluZztcblx0c2hvd0VtcHR5SW5kaWNhdG9yOiBib29sZWFuO1xuXHRzZW1hbnRpY0tleVN0eWxlOiBTdHJpbmc7XG5cdHNob3dJY29uVXJsOiBib29sZWFuO1xuXHRpc0FuYWx5dGljczogYm9vbGVhbjtcblx0aGFzRHJhZnRJbmRpY2F0b3I6IGJvb2xlYW47XG5cdHNlbWFudGlja2V5czogc3RyaW5nW107XG5cdHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Q6IGJvb2xlYW47XG5cdGlzQ3VycmVuY3lBbGlnbmVkOiBib29sZWFuO1xufT47XG5cbmV4cG9ydCB0eXBlIEVkaXRTdHlsZSA9XG5cdHwgXCJJbnB1dFdpdGhWYWx1ZUhlbHBcIlxuXHR8IFwiVGV4dEFyZWFcIlxuXHR8IFwiRmlsZVwiXG5cdHwgXCJEYXRlUGlja2VyXCJcblx0fCBcIlRpbWVQaWNrZXJcIlxuXHR8IFwiRGF0ZVRpbWVQaWNrZXJcIlxuXHR8IFwiQ2hlY2tCb3hcIlxuXHR8IFwiSW5wdXRXaXRoVW5pdFwiXG5cdHwgXCJJbnB1dFwiXG5cdHwgXCJSYXRpbmdJbmRpY2F0b3JcIjtcblxuZXhwb3J0IHR5cGUgRGlzcGxheVN0eWxlID1cblx0fCBcIlRleHRcIlxuXHR8IFwiTWRjRmllbGRXaXRoVmFsdWVIZWxwXCJcblx0fCBcIkF2YXRhclwiXG5cdHwgXCJGaWxlXCJcblx0fCBcIkRhdGFQb2ludFwiXG5cdHwgXCJDb250YWN0XCJcblx0fCBcIkJ1dHRvblwiXG5cdHwgXCJMaW5rXCJcblx0fCBcIk9iamVjdFN0YXR1c1wiXG5cdHwgXCJBbW91bnRXaXRoQ3VycmVuY3lcIlxuXHR8IFwiU2VtYW50aWNLZXlXaXRoRHJhZnRJbmRpY2F0b3JcIlxuXHR8IFwiT2JqZWN0SWRlbnRpZmllclwiXG5cdHwgXCJMYWJlbFNlbWFudGljS2V5XCJcblx0fCBcIkxpbmtXaXRoUXVpY2tWaWV3Rm9ybVwiXG5cdHwgXCJMaW5rV3JhcHBlclwiXG5cdHwgXCJFeHBhbmRhYmxlVGV4dFwiO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGFkZCB0aGUgdGV4dCBhcnJhbmdlbWVudCB0byBhIGJpbmRpbmcgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gYmluZGluZ0V4cHJlc3Npb24gVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBiZSBlbmhhbmNlZFxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgY3VycmVudCBjb250ZXh0IHBhdGggd2UncmUgb24gKHRvIHByb3Blcmx5IHJlc29sdmUgdGhlIHRleHQgYXJyYW5nZW1lbnQgcHJvcGVydGllcylcbiAqIEByZXR1cm5zIEFuIHVwZGF0ZWQgZXhwcmVzc2lvbiBjb250YWluaW5nIHRoZSB0ZXh0IGFycmFuZ2VtZW50IGJpbmRpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uID0gZnVuY3Rpb24oXG5cdGJpbmRpbmdFeHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4sXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aFxuKTogRXhwcmVzc2lvbjxhbnk+IHtcblx0cmV0dXJuIHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGJpbmRpbmdFeHByZXNzaW9uLCBcIkJpbmRpbmdcIiwgKGV4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxhbnk+KSA9PiB7XG5cdFx0bGV0IG91dEV4cHJlc3Npb246IEV4cHJlc3Npb248YW55PiA9IGV4cHJlc3Npb247XG5cdFx0aWYgKGV4cHJlc3Npb24ubW9kZWxOYW1lID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIEluIGNhc2Ugb2YgZGVmYXVsdCBtb2RlbCB3ZSB0aGVuIG5lZWQgdG8gcmVzb2x2ZSB0aGUgdGV4dCBhcnJhbmdlbWVudCBwcm9wZXJ0eVxuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5RGF0YU1vZGVsUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGZ1bGxDb250ZXh0UGF0aCwgZXhwcmVzc2lvbi5wYXRoKTtcblx0XHRcdG91dEV4cHJlc3Npb24gPSBnZXRCaW5kaW5nV2l0aFRleHRBcnJhbmdlbWVudChvUHJvcGVydHlEYXRhTW9kZWxQYXRoLCBleHByZXNzaW9uKTtcblx0XHR9XG5cdFx0cmV0dXJuIG91dEV4cHJlc3Npb247XG5cdH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoVGV4dEFycmFuZ2VtZW50ID0gZnVuY3Rpb24oXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEV4cHJlc3Npb248c3RyaW5nPixcblx0ZmllbGRGb3JtYXRPcHRpb25zPzogRmllbGRGb3JtYXRPcHRpb25zXG4pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCB0YXJnZXREaXNwbGF5TW9kZU92ZXJyaWRlID0gZmllbGRGb3JtYXRPcHRpb25zPy5kaXNwbGF5TW9kZTtcblx0bGV0IG91dEV4cHJlc3Npb24gPSBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uO1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID1cblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdC50eXBlID09PSBcIlByb3BlcnR5UGF0aFwiXG5cdFx0XHQ/IChvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdC4kdGFyZ2V0IGFzIFByb3BlcnR5KVxuXHRcdFx0OiAob1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHkpO1xuXHRjb25zdCB0YXJnZXREaXNwbGF5TW9kZSA9IHRhcmdldERpc3BsYXlNb2RlT3ZlcnJpZGUgfHwgZ2V0RGlzcGxheU1vZGUob1Byb3BlcnR5RGVmaW5pdGlvbiwgb1Byb3BlcnR5RGF0YU1vZGVsUGF0aCk7XG5cdGNvbnN0IGNvbW1vblRleHQgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5Db21tb24/LlRleHQ7XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbihcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbixcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzXG5cdCkubWFwKG5wID0+IG5wLm5hbWUpO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0aWYgKHRhcmdldERpc3BsYXlNb2RlICE9PSBcIlZhbHVlXCIgJiYgY29tbW9uVGV4dCkge1xuXHRcdHN3aXRjaCAodGFyZ2V0RGlzcGxheU1vZGUpIHtcblx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRvdXRFeHByZXNzaW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oY29tbW9uVGV4dCwgcmVsYXRpdmVMb2NhdGlvbikgYXMgRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdG91dEV4cHJlc3Npb24gPSBmb3JtYXRSZXN1bHQoXG5cdFx0XHRcdFx0W2Fubm90YXRpb25FeHByZXNzaW9uKGNvbW1vblRleHQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEV4cHJlc3Npb248c3RyaW5nPiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbl0sXG5cdFx0XHRcdFx0dmFsdWVGb3JtYXR0ZXJzLmZvcm1hdFdpdGhCcmFja2V0c1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdG91dEV4cHJlc3Npb24gPSBmb3JtYXRSZXN1bHQoXG5cdFx0XHRcdFx0W3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIGFubm90YXRpb25FeHByZXNzaW9uKGNvbW1vblRleHQsIHJlbGF0aXZlTG9jYXRpb24pIGFzIEV4cHJlc3Npb248c3RyaW5nPl0sXG5cdFx0XHRcdFx0dmFsdWVGb3JtYXR0ZXJzLmZvcm1hdFdpdGhCcmFja2V0c1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0VmFsdWVSZWN1cnNpdmVseSA9IGZ1bmN0aW9uKGJpbmRpbmdFeHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4sIGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IEV4cHJlc3Npb248YW55PiB7XG5cdHJldHVybiB0cmFuc2Zvcm1SZWN1cnNpdmVseShiaW5kaW5nRXhwcmVzc2lvbiwgXCJCaW5kaW5nXCIsIChleHByZXNzaW9uOiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248YW55PikgPT4ge1xuXHRcdGxldCBvdXRFeHByZXNzaW9uOiBFeHByZXNzaW9uPGFueT4gPSBleHByZXNzaW9uO1xuXHRcdGlmIChleHByZXNzaW9uLm1vZGVsTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRlZmF1bHQgbW9kZWwgd2UgdGhlbiBuZWVkIHRvIHJlc29sdmUgdGhlIHRleHQgYXJyYW5nZW1lbnQgcHJvcGVydHlcblx0XHRcdGNvbnN0IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChmdWxsQ29udGV4dFBhdGgsIGV4cHJlc3Npb24ucGF0aCk7XG5cdFx0XHRvdXRFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCwgZXhwcmVzc2lvbik7XG5cdFx0fVxuXHRcdHJldHVybiBvdXRFeHByZXNzaW9uO1xuXHR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0QmluZGluZyA9IGZ1bmN0aW9uKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmaWVsZEZvcm1hdE9wdGlvbnM6IEZpZWxkRm9ybWF0T3B0aW9ucyxcblx0YXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZVxuKTogRXhwcmVzc2lvbjxzdHJpbmc+IHwgQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGlmIChcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdD8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkXCIgfHxcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdD8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50VHlwZVwiIHx8XG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aFwiIHx8XG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhVcmxcIlxuXHQpIHtcblx0XHQvLyBJZiB0aGVyZSBpcyBubyByZXNvbHZlZCBwcm9wZXJ0eSwgdGhlIHZhbHVlIGlzIHJldHVybmVkIGFzIGEgY29uc3RhbnRcblx0XHRjb25zdCBmaWVsZFZhbHVlID0gb1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuVmFsdWUgfHwgXCJcIjtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoY29uc3RhbnQoZmllbGRWYWx1ZSkpO1xuXHR9XG5cdGlmIChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KSAmJiBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC4kdGFyZ2V0KSB7XG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnBhdGgpO1xuXHR9XG5cdGNvbnN0IG9CaW5kaW5nRXhwcmVzc2lvbiA9IGJpbmRpbmdFeHByZXNzaW9uKGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgob1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCkpO1xuXHRsZXQgb1RhcmdldEJpbmRpbmc7XG5cdGlmIChcblx0XHRvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0IHx8XG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3lcblx0KSB7XG5cdFx0b1RhcmdldEJpbmRpbmcgPSBnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5KG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIG9CaW5kaW5nRXhwcmVzc2lvbik7XG5cdFx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8ubWVhc3VyZURpc3BsYXlNb2RlID09PSBcIkhpZGRlblwiKSB7XG5cdFx0XHQvLyBUT0RPOiBSZWZhY3RvciBvbmNlIHR5cGVzIGFyZSBsZXNzIGdlbmVyaWMgaGVyZVxuXHRcdFx0KG9UYXJnZXRCaW5kaW5nIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxTdHJpbmc+KS5mb3JtYXRPcHRpb25zID0ge1xuXHRcdFx0XHQuLi4ob1RhcmdldEJpbmRpbmcgYXMgQ29tcGxleFR5cGVFeHByZXNzaW9uPFN0cmluZz4pLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdHNob3dNZWFzdXJlOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0b1RhcmdldEJpbmRpbmcgPSBnZXRCaW5kaW5nV2l0aFRleHRBcnJhbmdlbWVudChvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCBvQmluZGluZ0V4cHJlc3Npb24sIGZpZWxkRm9ybWF0T3B0aW9ucyk7XG5cdH1cblx0aWYgKGFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIG9UYXJnZXRCaW5kaW5nO1xuXHR9XG5cdC8vIFdlIGRvbid0IGluY2x1ZGUgJCRub3BhdGNoIGFuZCBwYXJzZUtlZXBFbXB0eVN0cmluZyBhcyB0aGV5IG1ha2Ugbm8gc2Vuc2UgaW4gdGhlIHRleHQgYmluZGluZyBjYXNlXG5cdHJldHVybiBjb21waWxlQmluZGluZyhvVGFyZ2V0QmluZGluZyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmFsdWVCaW5kaW5nID0gZnVuY3Rpb24oXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGZpZWxkRm9ybWF0T3B0aW9uczogRmllbGRGb3JtYXRPcHRpb25zLFxuXHRpZ25vcmVVbml0OiBib29sZWFuID0gZmFsc2UsXG5cdGlnbm9yZUZvcm1hdHRpbmc6IGJvb2xlYW4gPSBmYWxzZSxcblx0YmluZGluZ1BhcmFtZXRlcnM/OiBvYmplY3QsXG5cdHRhcmdldFR5cGVBbnk/OiBib29sZWFuLFxuXHRzaG93TWVhc3VyZU9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGlmIChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KSAmJiBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC4kdGFyZ2V0KSB7XG5cdFx0Y29uc3Qgb05hdlBhdGggPSBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgob1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QucGF0aCwgdHJ1ZSk7XG5cdFx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvTmF2UGF0aC50YXJnZXQ7XG5cdFx0b05hdlBhdGgudmlzaXRlZE9iamVjdHMuZm9yRWFjaCgob05hdk9iajogYW55KSA9PiB7XG5cdFx0XHRpZiAob05hdk9iaiAmJiBvTmF2T2JqLl90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChvTmF2T2JqKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGNvbnN0IHRhcmdldE9iamVjdCA9IG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRpZiAoaXNQcm9wZXJ0eSh0YXJnZXRPYmplY3QpKSB7XG5cdFx0bGV0IG9CaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPHN0cmluZz4gPSBiaW5kaW5nRXhwcmVzc2lvbihcblx0XHRcdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgob1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aClcblx0XHQpIGFzIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRcdGlmICh0YXJnZXRPYmplY3QuYW5ub3RhdGlvbnM/LkNvbW11bmljYXRpb24/LklzRW1haWxBZGRyZXNzKSB7XG5cdFx0XHRvQmluZGluZ0V4cHJlc3Npb24udHlwZSA9IFwic2FwLmZlLmNvcmUudHlwZS5FbWFpbFwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvUHJvcGVydHlVbml0ID0gZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCk7XG5cdFx0XHRjb25zdCBvUHJvcGVydHlDdXJyZW5jeSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KTtcblx0XHRcdGlmICghaWdub3JlVW5pdCAmJiAob1Byb3BlcnR5VW5pdCB8fCBvUHJvcGVydHlDdXJyZW5jeSkpIHtcblx0XHRcdFx0b0JpbmRpbmdFeHByZXNzaW9uID0gZ2V0QmluZGluZ1dpdGhVbml0T3JDdXJyZW5jeShvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCBvQmluZGluZ0V4cHJlc3Npb24pIGFzIGFueTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdChvUHJvcGVydHlVbml0ICYmICFoYXNWYWx1ZUhlbHAob1Byb3BlcnR5VW5pdCkpIHx8XG5cdFx0XHRcdFx0KG9Qcm9wZXJ0eUN1cnJlbmN5ICYmICFoYXNWYWx1ZUhlbHAob1Byb3BlcnR5Q3VycmVuY3kpKSB8fFxuXHRcdFx0XHRcdGZpZWxkRm9ybWF0T3B0aW9ucz8ubWVhc3VyZURpc3BsYXlNb2RlID09PSBcIkhpZGRlblwiXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGEgdW5pdCBvciBjdXJyZW5jeSB3aXRob3V0IGEgdmFsdWUgaGVscCwgb3IgaW4gY2FzZSB0aGUgY3VycmVuY3kgc2hvdWxkIGJlIGV4cGxpY2l0bHkgaGlkZGVuLFxuXHRcdFx0XHRcdC8vIHdlIG5lZWQgdG8gY29uZmlndXJlIHRoZSBiaW5kaW5nIHRvIG5vdCBzaG93IHRoZSBtZWFzdXJlLCBvdGhlcndpc2UgaXQncyBuZWVkZWQgZm9yIHRoZSBtZGMgZmllbGRcblx0XHRcdFx0XHRpZiAoIW9CaW5kaW5nRXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdFx0XHRvQmluZGluZ0V4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoc2hvd01lYXN1cmVPbmx5KSB7XG5cdFx0XHRcdFx0XHRvQmluZGluZ0V4cHJlc3Npb24uZm9ybWF0T3B0aW9ucy5zaG93TnVtYmVyID0gZmFsc2U7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9CaW5kaW5nRXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zLnNob3dNZWFzdXJlID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvQmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKHRhcmdldE9iamVjdCwgb0JpbmRpbmdFeHByZXNzaW9uKSBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248c3RyaW5nPjtcblx0XHRcdFx0aWYgKG9CaW5kaW5nRXhwcmVzc2lvbi50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0b0JpbmRpbmdFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChpZ25vcmVGb3JtYXR0aW5nKSB7XG5cdFx0XHRkZWxldGUgb0JpbmRpbmdFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnM7XG5cdFx0XHRkZWxldGUgb0JpbmRpbmdFeHByZXNzaW9uLmNvbnN0cmFpbnRzO1xuXHRcdFx0ZGVsZXRlIG9CaW5kaW5nRXhwcmVzc2lvbi50eXBlO1xuXHRcdH1cblx0XHRpZiAoYmluZGluZ1BhcmFtZXRlcnMpIHtcblx0XHRcdG9CaW5kaW5nRXhwcmVzc2lvbi5wYXJhbWV0ZXJzID0gYmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0fVxuXHRcdGlmICh0YXJnZXRUeXBlQW55KSB7XG5cdFx0XHRvQmluZGluZ0V4cHJlc3Npb24udGFyZ2V0VHlwZSA9IFwiYW55XCI7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhvQmluZGluZ0V4cHJlc3Npb24pO1xuXHR9IGVsc2Uge1xuXHRcdGlmIChcblx0XHRcdHRhcmdldE9iamVjdD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwgfHxcblx0XHRcdHRhcmdldE9iamVjdD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKCh0YXJnZXRPYmplY3QgYXMgRGF0YUZpZWxkV2l0aFVybCkuVmFsdWUpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VW5pdEJpbmRpbmcgPSBmdW5jdGlvbihvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0bGV0IHVuaXQgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXNcblx0KS5tYXAobnAgPT4gbnAubmFtZSk7XG5cdHVuaXQgPSB1bml0ID8gdW5pdCA6IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0cmV0dXJuIHVuaXQgPyBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKSkgOiB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXNzb2NpYXRlZFRleHRCaW5kaW5nID0gZnVuY3Rpb24oXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGZpZWxkRm9ybWF0T3B0aW9uczogRmllbGRGb3JtYXRPcHRpb25zXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgdGV4dFByb3BlcnR5UGF0aCA9IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KTtcblx0aWYgKHRleHRQcm9wZXJ0eVBhdGgpIHtcblx0XHRjb25zdCBvVGV4dFByb3BlcnR5UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRleHRQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IG9WYWx1ZUJpbmRpbmcgPSBnZXRWYWx1ZUJpbmRpbmcob1RleHRQcm9wZXJ0eVBhdGgsIGZpZWxkRm9ybWF0T3B0aW9ucywgdHJ1ZSwgdHJ1ZSwgeyAkJG5vUGF0Y2g6IHRydWUgfSk7XG5cdFx0cmV0dXJuIG9WYWx1ZUJpbmRpbmc7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1VzZWRJbk5hdmlnYXRpb25XaXRoUXVpY2tWaWV3RmFjZXRzID0gZnVuY3Rpb24ob0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsIG9Qcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gb0RhdGFNb2RlbFBhdGg/LnRhcmdldEVudGl0eVR5cGU/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzIHx8IFtdO1xuXHRsZXQgYklzVXNlZEluTmF2aWdhdGlvbldpdGhRdWlja1ZpZXdGYWNldHMgPSBmYWxzZTtcblx0YU5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2gob05hdlByb3AgPT4ge1xuXHRcdGlmIChvTmF2UHJvcC5yZWZlcmVudGlhbENvbnN0cmFpbnQgJiYgb05hdlByb3AucmVmZXJlbnRpYWxDb25zdHJhaW50Lmxlbmd0aCkge1xuXHRcdFx0b05hdlByb3AucmVmZXJlbnRpYWxDb25zdHJhaW50LmZvckVhY2gob1JlZkNvbnN0cmFpbnQgPT4ge1xuXHRcdFx0XHRpZiAob1JlZkNvbnN0cmFpbnQ/LnNvdXJjZVByb3BlcnR5ID09PSBvUHJvcGVydHkubmFtZSkge1xuXHRcdFx0XHRcdGlmIChvTmF2UHJvcD8udGFyZ2V0VHlwZT8uYW5ub3RhdGlvbnM/LlVJPy5RdWlja1ZpZXdGYWNldHMpIHtcblx0XHRcdFx0XHRcdGJJc1VzZWRJbk5hdmlnYXRpb25XaXRoUXVpY2tWaWV3RmFjZXRzID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBiSXNVc2VkSW5OYXZpZ2F0aW9uV2l0aFF1aWNrVmlld0ZhY2V0cztcbn07XG5cbmV4cG9ydCBjb25zdCBpc1JldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3RFbmFibGVkID0gZnVuY3Rpb24oXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0ZmllbGRGb3JtYXRPcHRpb25zOiBGaWVsZEZvcm1hdE9wdGlvbnNcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBvUHJvcGVydHk6IFByb3BlcnR5ID0gKGlzUGF0aEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdGlmIChcblx0XHQhKGZpZWxkRm9ybWF0T3B0aW9ucy5kaXNwbGF5TW9kZSA9PT0gXCJWYWx1ZVwiKSAmJlxuXHRcdCFvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCAmJlxuXHRcdCFvUHJvcGVydHkuYW5ub3RhdGlvbnM/Lk1lYXN1cmVzICYmXG5cdFx0UHJvcGVydHlIZWxwZXIuaGFzVmFsdWVIZWxwKG9Qcm9wZXJ0eSkgJiZcblx0XHRmaWVsZEZvcm1hdE9wdGlvbnMudGV4dEFsaWduTW9kZSA9PT0gXCJGb3JtXCJcblx0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpc3BsYXlTdHlsZSA9IGZ1bmN0aW9uKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGQ6IGFueSxcblx0b0RhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGZpZWxkRm9ybWF0T3B0aW9uczogRmllbGRGb3JtYXRPcHRpb25zLFxuXHRzZW1hbnRpY09iamVjdDogc3RyaW5nXG4pOiBEaXNwbGF5U3R5bGUge1xuXHQvLyBhbGdvcml0aG0gdG8gZGV0ZXJtaW5lIHRoZSBmaWVsZCBmcmFnbWVudCB0byB1c2Vcblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHRpZiAoXG5cdFx0c2VtYW50aWNPYmplY3QgJiZcblx0XHQhb1Byb3BlcnR5LmFubm90YXRpb25zPy5VST8uSXNJbWFnZVVSTCAmJlxuXHRcdCEob1Byb3BlcnR5LnR5cGUgPT09IFwiRWRtLlN0cmVhbVwiKSAmJlxuXHRcdCEob1Byb3BlcnR5LmFubm90YXRpb25zPy5Db21tdW5pY2F0aW9uPy5Jc0VtYWlsQWRkcmVzcyB8fCBvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW11bmljYXRpb24/LklzUGhvbmVOdW1iZXIpXG5cdCkge1xuXHRcdHJldHVybiBcIkxpbmtXaXRoUXVpY2tWaWV3Rm9ybVwiO1xuXHR9XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBcIlRleHRcIjtcblx0fVxuXHRpZiAob1Byb3BlcnR5LnR5cGUgPT09IFwiRWRtLlN0cmVhbVwiKSB7XG5cdFx0cmV0dXJuIFwiRmlsZVwiO1xuXHR9XG5cdGlmIChvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5Jc0ltYWdlVVJMKSB7XG5cdFx0cmV0dXJuIFwiQXZhdGFyXCI7XG5cdH1cblx0c3dpdGNoIChvRGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFR5cGVcIjpcblx0XHRcdHJldHVybiBcIkRhdGFQb2ludFwiO1xuXHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JBbm5vdGF0aW9uXCI6XG5cdFx0XHRpZiAob0RhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFR5cGVcIikge1xuXHRcdFx0XHRyZXR1cm4gXCJEYXRhUG9pbnRcIjtcblx0XHRcdH0gZWxzZSBpZiAob0RhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQ29udGFjdFR5cGVcIikge1xuXHRcdFx0XHRyZXR1cm4gXCJDb250YWN0XCI7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCI6XG5cdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiOlxuXHRcdFx0cmV0dXJuIFwiQnV0dG9uXCI7XG5cdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aFwiOlxuXHRcdFx0cmV0dXJuIFwiTGlua1wiO1xuXHR9XG5cdGlmIChvRGF0YU1vZGVsUGF0aD8udGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNLZXkpIHtcblx0XHRjb25zdCBhU2VtYW50aWNLZXlzID0gb0RhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24uU2VtYW50aWNLZXk7XG5cdFx0Y29uc3QgYklzU2VtYW50aWNLZXkgPSAhYVNlbWFudGljS2V5cy5ldmVyeShmdW5jdGlvbihvS2V5KSB7XG5cdFx0XHRyZXR1cm4gb0tleT8uJHRhcmdldD8ubmFtZSAhPT0gb1Byb3BlcnR5Lm5hbWU7XG5cdFx0fSk7XG5cdFx0aWYgKGJJc1NlbWFudGljS2V5ICYmIGZpZWxkRm9ybWF0T3B0aW9ucy5zZW1hbnRpY0tleVN0eWxlKSB7XG5cdFx0XHRpZiAob0RhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QpIHtcblx0XHRcdFx0Ly8gJiYgZmllbGRGb3JtYXRPcHRpb25zLmhhc0RyYWZ0SW5kaWNhdG9yKSB7XG5cdFx0XHRcdC8vIHdlIHRoZW4gc3RpbGwgY2hlY2sgd2hldGhlciB0aGlzIGlzIGF2YWlsYWJsZSBhdCBkZXNpZ250aW1lIG9uIHRoZSBlbnRpdHlzZXRcblx0XHRcdFx0cmV0dXJuIFwiU2VtYW50aWNLZXlXaXRoRHJhZnRJbmRpY2F0b3JcIjtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmaWVsZEZvcm1hdE9wdGlvbnMuc2VtYW50aWNLZXlTdHlsZSA9PT0gXCJPYmplY3RJZGVudGlmaWVyXCIgPyBcIk9iamVjdElkZW50aWZpZXJcIiA6IFwiTGFiZWxTZW1hbnRpY0tleVwiO1xuXHRcdH1cblx0fVxuXHRpZiAob0RhdGFGaWVsZC5Dcml0aWNhbGl0eSkge1xuXHRcdHJldHVybiBcIk9iamVjdFN0YXR1c1wiO1xuXHR9XG5cdGlmIChvUHJvcGVydHkuYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSAmJiBTdHJpbmcoZmllbGRGb3JtYXRPcHRpb25zLmlzQ3VycmVuY3lBbGlnbmVkKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRpZiAoZmllbGRGb3JtYXRPcHRpb25zLm1lYXN1cmVEaXNwbGF5TW9kZSA9PT0gXCJIaWRkZW5cIikge1xuXHRcdFx0cmV0dXJuIFwiVGV4dFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJBbW91bnRXaXRoQ3VycmVuY3lcIjtcblx0fVxuXHRpZiAob1Byb3BlcnR5LmFubm90YXRpb25zPy5Db21tdW5pY2F0aW9uPy5Jc0VtYWlsQWRkcmVzcyB8fCBvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW11bmljYXRpb24/LklzUGhvbmVOdW1iZXIpIHtcblx0XHRyZXR1cm4gXCJMaW5rXCI7XG5cdH1cblx0aWYgKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/Lk11bHRpTGluZVRleHQpIHtcblx0XHRyZXR1cm4gXCJFeHBhbmRhYmxlVGV4dFwiO1xuXHR9XG5cblx0aWYgKGlzVXNlZEluTmF2aWdhdGlvbldpdGhRdWlja1ZpZXdGYWNldHMob0RhdGFNb2RlbFBhdGgsIG9Qcm9wZXJ0eSkpIHtcblx0XHRyZXR1cm4gXCJMaW5rV2l0aFF1aWNrVmlld0Zvcm1cIjtcblx0fVxuXHRpZiAob1Byb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlNlbWFudGljT2JqZWN0KSB7XG5cdFx0cmV0dXJuIFwiTGlua1dyYXBwZXJcIjtcblx0fVxuXHRpZiAob0RhdGFGaWVsZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoVXJsXCIpIHtcblx0XHRyZXR1cm4gXCJMaW5rXCI7XG5cdH1cblx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucy5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuIFwiTWRjRmllbGRXaXRoVmFsdWVIZWxwXCI7XG5cdH1cblx0cmV0dXJuIFwiVGV4dFwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVkaXRTdHlsZSA9IGZ1bmN0aW9uKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGQ6IGFueSxcblx0b0ZpZWxkRm9ybWF0T3B0aW9uczogRmllbGRGb3JtYXRPcHRpb25zXG4pOiBFZGl0U3R5bGUgfCBudWxsIHtcblx0Ly8gYWxnb3JpdGhtIHRvIGRldGVybWluZSB0aGUgZmllbGQgZnJhZ21lbnQgdG8gdXNlXG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGNvbnN0IG9Qcm9wZXJ0eTogUHJvcGVydHkgPSAoaXNQYXRoRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0aWYgKG9Qcm9wZXJ0eS50eXBlID09PSBcIkVkbS5TdHJlYW1cIikge1xuXHRcdHJldHVybiBcIkZpbGVcIjtcblx0fVxuXHRzd2l0Y2ggKG9EYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiOlxuXHRcdFx0aWYgKG9EYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkNvbnRhY3RUeXBlXCIpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9IGVsc2UgaWYgKG9EYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py5WaXN1YWxpemF0aW9uID09PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1JhdGluZ1wiKSB7XG5cdFx0XHRcdHJldHVybiBcIlJhdGluZ0luZGljYXRvclwiO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFR5cGVcIjpcblx0XHRcdGlmIChvRGF0YUZpZWxkPy5WaXN1YWxpemF0aW9uID09PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1JhdGluZ1wiKSB7XG5cdFx0XHRcdHJldHVybiBcIlJhdGluZ0luZGljYXRvclwiO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiOlxuXHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGhcIjpcblx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uXCI6XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRjb25zdCBvUHJvcGVydHlVbml0ID0gZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHkpO1xuXHRjb25zdCBvUHJvcGVydHlDdXJyZW5jeSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KG9Qcm9wZXJ0eSk7XG5cdGlmIChcblx0XHQoUHJvcGVydHlIZWxwZXIuaGFzVmFsdWVIZWxwKG9Qcm9wZXJ0eSkgJiYgb1Byb3BlcnR5LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIikgfHxcblx0XHQob1Byb3BlcnR5VW5pdCAmJiBQcm9wZXJ0eUhlbHBlci5oYXNWYWx1ZUhlbHAob1Byb3BlcnR5VW5pdCkpIHx8XG5cdFx0KG9Qcm9wZXJ0eUN1cnJlbmN5ICYmIFByb3BlcnR5SGVscGVyLmhhc1ZhbHVlSGVscChvUHJvcGVydHlDdXJyZW5jeSkpXG5cdCkge1xuXHRcdGlmIChvRmllbGRGb3JtYXRPcHRpb25zPy5tZWFzdXJlRGlzcGxheU1vZGUgPT09IFwiSGlkZGVuXCIpIHtcblx0XHRcdHJldHVybiBcIklucHV0XCI7XG5cdFx0fVxuXHRcdHJldHVybiBcIklucHV0V2l0aFZhbHVlSGVscFwiO1xuXHR9XG5cdGlmIChvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5NdWx0aUxpbmVUZXh0Py52YWx1ZU9mKCkgJiYgb1Byb3BlcnR5LnR5cGUgPT09IFwiRWRtLlN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIFwiVGV4dEFyZWFcIjtcblx0fVxuXHRzd2l0Y2ggKG9Qcm9wZXJ0eS50eXBlKSB7XG5cdFx0Y2FzZSBcIkVkbS5EYXRlXCI6XG5cdFx0XHRyZXR1cm4gXCJEYXRlUGlja2VyXCI7XG5cdFx0Y2FzZSBcIkVkbS5UaW1lXCI6XG5cdFx0Y2FzZSBcIkVkbS5UaW1lT2ZEYXlcIjpcblx0XHRcdHJldHVybiBcIlRpbWVQaWNrZXJcIjtcblx0XHRjYXNlIFwiRWRtLkRhdGVUaW1lXCI6XG5cdFx0Y2FzZSBcIkVkbS5EYXRlVGltZU9mZnNldFwiOlxuXHRcdFx0cmV0dXJuIFwiRGF0ZVRpbWVQaWNrZXJcIjtcblx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdHJldHVybiBcIkNoZWNrQm94XCI7XG5cdH1cblx0aWYgKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQpIHtcblx0XHRyZXR1cm4gXCJJbnB1dFdpdGhVbml0XCI7XG5cdH1cblx0cmV0dXJuIFwiSW5wdXRcIjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmluZGluZyBleHByZXNzaW9uIHRvIGV2YWx1YXRlIHRoZSB2aXNpYmlsaXR5IG9mIGEgRGF0YUZpZWxkIG9yIERhdGFQb2ludCBhbm5vdGF0aW9uLlxuICpcbiAqIFNBUCBGaW9yaSBlbGVtZW50cyB3aWxsIGV2YWx1YXRlIGVpdGhlciB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZGVmaW5lZCBvbiB0aGUgYW5ub3RhdGlvbiBpdHNlbGYgb3Igb24gdGhlIHRhcmdldCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge0RhdGFNb2RlbE9iamVjdFBhdGh9IGRhdGFGaWVsZE1vZGVsUGF0aCBUaGUgbWV0YXBhdGggcmVmZXJyaW5nIHRvIHRoZSBhbm5vdGF0aW9uIHdlIGFyZSBldmFsdWF0aW5nLlxuICogQHBhcmFtIHtGaWVsZEZvcm1hdE9wdGlvbnN9IFtmb3JtYXRPcHRpb25zXSBGb3JtYXRPcHRpb25zIG9wdGlvbmFsLlxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPHN0cmluZz59IEFuIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIGJpbmQgdG8gdGhlIFVJLlxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbihcblx0ZGF0YUZpZWxkTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmb3JtYXRPcHRpb25zPzogRmllbGRGb3JtYXRPcHRpb25zXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgdGFyZ2V0T2JqZWN0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzID0gZGF0YUZpZWxkTW9kZWxQYXRoLnRhcmdldE9iamVjdDtcblx0bGV0IHByb3BlcnR5VmFsdWU7XG5cdGlmICh0YXJnZXRPYmplY3QpIHtcblx0XHRzd2l0Y2ggKHRhcmdldE9iamVjdC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0Ly8gaWYgaXQgaXMgYSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgRGF0YVBvaW50IHdlIGxvb2sgYXQgdGhlIGRhdGFQb2ludCdzIHZhbHVlXG5cdFx0XHRcdGlmICh0YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlRhcmdldC4kdGFyZ2V0Py5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBVSS5Jc0V4cGFuZGVkIDogY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBlcXVhbChVSS5Ob2RlTGV2ZWwsIDApIDogY29uc3RhbnQoZmFsc2UpO1xuXG5cdC8vIEEgZGF0YSBmaWVsZCBpcyB2aXNpYmxlIGlmOlxuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBwcm9wZXJ0eSBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSBpbiBjYXNlIG9mIEFuYWx5dGljcyBpdCdzIG5vdCB2aXNpYmxlIGZvciBhbiBleHBhbmRlZCBHcm91cEhlYWRlclxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0YW5kKFxuXHRcdFx0Li4uW1xuXHRcdFx0XHRub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSxcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdCEhcHJvcGVydHlWYWx1ZSxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlICYmIG5vdChlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KSxcblx0XHRcdFx0b3Iobm90KGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQpLCBpc0FuYWx5dGljYWxMZWFmKVxuXHRcdFx0XVxuXHRcdClcblx0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbnB1dERlc2NyaXB0aW9uID0gZnVuY3Rpb24oXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0ZGVzY3JpcHRpb25CaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPlxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShvUHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkob1Byb3BlcnR5KTtcblx0aWYgKCF1bml0UHJvcGVydHkpIHtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXCJcIik7XG5cdH1cblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gYW5kKG5vdChpc1JlYWRPbmx5RXhwcmVzc2lvbih1bml0UHJvcGVydHkpKSwgbm90KFByb3BlcnR5SGVscGVyLmlzQ29tcHV0ZWQodW5pdFByb3BlcnR5KSkpO1xuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoaWZFbHNlKGVkaXRhYmxlRXhwcmVzc2lvbiwgXCJcIiwgZGVzY3JpcHRpb25CaW5kaW5nRXhwcmVzc2lvbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IFFWVGV4dEJpbmRpbmcgPSBmdW5jdGlvbihcblx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0b1Byb3BlcnR5VmFsdWVEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmaWVsZEZvcm1hdE9wdGlvbnM6IEZpZWxkRm9ybWF0T3B0aW9ucyxcblx0YXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG5cdGxldCByZXR1cm5WYWx1ZTogYW55ID0gZ2V0VmFsdWVCaW5kaW5nKG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIGZpZWxkRm9ybWF0T3B0aW9ucywgYXNPYmplY3QpO1xuXHRpZiAocmV0dXJuVmFsdWUgPT09IFwiXCIpIHtcblx0XHRyZXR1cm5WYWx1ZSA9IGdldFRleHRCaW5kaW5nKG9Qcm9wZXJ0eVZhbHVlRGF0YU1vZGVsT2JqZWN0UGF0aCwgZmllbGRGb3JtYXRPcHRpb25zLCBhc09iamVjdCk7XG5cdH1cblx0cmV0dXJuIHJldHVyblZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFF1aWNrVmlld1R5cGUgPSBmdW5jdGlvbihvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogc3RyaW5nIHtcblx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gb1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdGlmICh0YXJnZXRPYmplY3Q/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tdW5pY2F0aW9uPy5Jc0VtYWlsQWRkcmVzcykge1xuXHRcdHJldHVybiBcImVtYWlsXCI7XG5cdH1cblx0aWYgKHRhcmdldE9iamVjdD8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW11bmljYXRpb24/LklzUGhvbmVOdW1iZXIpIHtcblx0XHRyZXR1cm4gXCJwaG9uZVwiO1xuXHR9XG5cdHJldHVybiBcInRleHRcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZW1hbnRpY09iamVjdEV4cHJlc3Npb25Ub1Jlc29sdmUgPSBmdW5jdGlvbihvQW5ub3RhdGlvbnM6IGFueSk6IGFueVtdIHtcblx0Y29uc3QgYVNlbU9iakV4cHJUb1Jlc29sdmU6IGFueVtdID0gW107XG5cdGlmIChvQW5ub3RhdGlvbnMpIHtcblx0XHRjb25zdCBhU2VtT2Jqa2V5cyA9IE9iamVjdC5rZXlzKG9Bbm5vdGF0aW9ucykuZmlsdGVyKGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRcdHJldHVybiBlbGVtZW50ID09PSBcIlNlbWFudGljT2JqZWN0XCIgfHwgZWxlbWVudC5zdGFydHNXaXRoKFwiU2VtYW50aWNPYmplY3QjXCIpO1xuXHRcdH0pO1xuXHRcdGZvciAobGV0IGlTZW1PYmpDb3VudCA9IDA7IGlTZW1PYmpDb3VudCA8IGFTZW1PYmprZXlzLmxlbmd0aDsgaVNlbU9iakNvdW50KyspIHtcblx0XHRcdGNvbnN0IHNTZW1PYmpFeHByZXNzaW9uID0gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ob0Fubm90YXRpb25zW2FTZW1PYmprZXlzW2lTZW1PYmpDb3VudF1dKSk7XG5cdFx0XHRhU2VtT2JqRXhwclRvUmVzb2x2ZS5wdXNoKHtcblx0XHRcdFx0a2V5OiBzU2VtT2JqRXhwcmVzc2lvbj8uaW5kZXhPZihcIntcIikgPT09IC0xID8gc1NlbU9iakV4cHJlc3Npb24gOiBzU2VtT2JqRXhwcmVzc2lvbj8uc3BsaXQoXCJ7XCIpWzFdLnNwbGl0KFwifVwiKVswXSxcblx0XHRcdFx0dmFsdWU6IHNTZW1PYmpFeHByZXNzaW9uXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFTZW1PYmpFeHByVG9SZXNvbHZlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNlbWFudGljT2JqZWN0cyA9IGZ1bmN0aW9uKGFTZW1PYmpFeHByVG9SZXNvbHZlOiBhbnlbXSk6IGFueSB7XG5cdGlmIChhU2VtT2JqRXhwclRvUmVzb2x2ZS5sZW5ndGggPiAwKSB7XG5cdFx0bGV0IHNDdXN0b21EYXRhS2V5OiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCBzQ3VzdG9tRGF0YVZhbHVlOiBhbnkgPSBcIlwiO1xuXHRcdGNvbnN0IGFTZW1PYmpDdXN0b21EYXRhOiBhbnlbXSA9IFtdO1xuXHRcdGZvciAobGV0IGlTZW1PYmpDb3VudCA9IDA7IGlTZW1PYmpDb3VudCA8IGFTZW1PYmpFeHByVG9SZXNvbHZlLmxlbmd0aDsgaVNlbU9iakNvdW50KyspIHtcblx0XHRcdHNDdXN0b21EYXRhS2V5ID0gYVNlbU9iakV4cHJUb1Jlc29sdmVbaVNlbU9iakNvdW50XS5rZXk7XG5cdFx0XHRzQ3VzdG9tRGF0YVZhbHVlID0gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24oYVNlbU9iakV4cHJUb1Jlc29sdmVbaVNlbU9iakNvdW50XS52YWx1ZSkpO1xuXHRcdFx0YVNlbU9iakN1c3RvbURhdGEucHVzaCh7XG5cdFx0XHRcdGtleTogc0N1c3RvbURhdGFLZXksXG5cdFx0XHRcdHZhbHVlOiBzQ3VzdG9tRGF0YVZhbHVlXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3Qgb1NlbWFudGljT2JqZWN0c01vZGVsOiBhbnkgPSBuZXcgSlNPTk1vZGVsKGFTZW1PYmpDdXN0b21EYXRhKTtcblx0XHRvU2VtYW50aWNPYmplY3RzTW9kZWwuJCR2YWx1ZUFzUHJvbWlzZSA9IHRydWU7XG5cdFx0Y29uc3Qgb1NlbU9iakJpbmRpbmdDb250ZXh0OiBhbnkgPSBvU2VtYW50aWNPYmplY3RzTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHRcdHJldHVybiBvU2VtT2JqQmluZGluZ0NvbnRleHQ7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG5ldyBKU09OTW9kZWwoW10pLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0fVxufTtcbiJdfQ==
|
|
@@ -181,13 +181,7 @@ export const getTextBinding = function(
|
|
|
181
181
|
return compileBinding(constant(fieldValue));
|
|
182
182
|
}
|
|
183
183
|
if (isPathExpression(oPropertyDataModelObjectPath.targetObject) && oPropertyDataModelObjectPath.targetObject.$target) {
|
|
184
|
-
|
|
185
|
-
oPropertyDataModelObjectPath.targetObject = oNavPath.target;
|
|
186
|
-
oNavPath.visitedObjects.forEach((oNavObj: any) => {
|
|
187
|
-
if (oNavObj?._type === "NavigationProperty") {
|
|
188
|
-
oPropertyDataModelObjectPath.navigationProperties.push(oNavObj);
|
|
189
|
-
}
|
|
190
|
-
});
|
|
184
|
+
oPropertyDataModelObjectPath = enhanceDataModelPath(oPropertyDataModelObjectPath, oPropertyDataModelObjectPath.targetObject.path);
|
|
191
185
|
}
|
|
192
186
|
const oBindingExpression = bindingExpression(getContextRelativeTargetObjectPath(oPropertyDataModelObjectPath));
|
|
193
187
|
let oTargetBinding;
|
package/src/sap/fe/macros/internal/field/displayStyle/SemanticKeyWithDraftIndicator.fragment.xml
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
<macro:DraftIndicator
|
|
24
24
|
DraftIndicatorType="IconAndText"
|
|
25
25
|
entitySet="{entitySet>}"
|
|
26
|
-
isDraftIndicatorVisible="{=
|
|
26
|
+
isDraftIndicatorVisible="{='{parts: [{value: \'' + ${propertyPath>} + '\'}, {path: \'internal>semanticKeyHasDraftIndicator\'} , {path: \'HasDraftEntity\'}, {path: \'IsActiveEntity\'}, {path: \'pageInternal>hideDraftInfo\'}] , formatter: \'sap.fe.macros.field.FieldRuntime.isDraftIndicatorVisible\'}'}"
|
|
27
27
|
ariaLabelledBy="{this>ariaLabelledBy}"
|
|
28
28
|
/>
|
|
29
29
|
</VBox>
|
|
@@ -94,87 +94,28 @@ sap.ui.define(
|
|
|
94
94
|
});
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
function
|
|
98
|
-
var
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
!
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
? true
|
|
118
|
-
: false;
|
|
119
|
-
// Check some conditions for hidding redundant columns
|
|
120
|
-
if (bFindRedundantColumn) {
|
|
121
|
-
aRelevantColumn = oValueList.Parameters.filter(function(oParameter) {
|
|
122
|
-
if (
|
|
123
|
-
oParameter.ValueListProperty !== oVLParameter.ValueListProperty &&
|
|
124
|
-
oVLParameter.$Type !== "com.sap.vocabularies.Common.v1.ValueListParameterInOut"
|
|
125
|
-
) {
|
|
126
|
-
oPropertyAnnotations = oMetaModel.getObject(
|
|
127
|
-
"/" + oValueList.CollectionPath + "/" + oParameter.ValueListProperty + "@"
|
|
128
|
-
);
|
|
129
|
-
sDescriptionPath =
|
|
130
|
-
oPropertyAnnotations &&
|
|
131
|
-
oPropertyAnnotations["@com.sap.vocabularies.Common.v1.Text"] &&
|
|
132
|
-
oPropertyAnnotations["@com.sap.vocabularies.Common.v1.Text"].$Path;
|
|
133
|
-
}
|
|
134
|
-
return sDescriptionPath && sDescriptionPath === oVLParameter.ValueListProperty;
|
|
135
|
-
});
|
|
136
|
-
aRelevantColumn.forEach(function(oParameter) {
|
|
137
|
-
if (oParameter.ValueListProperty !== oVLParameter.ValueListProperty) {
|
|
138
|
-
oPropertyAnnotations = oMetaModel.getObject(
|
|
139
|
-
"/" + oValueList.CollectionPath + "/" + oParameter.ValueListProperty + "@"
|
|
140
|
-
);
|
|
141
|
-
sTextArrangement =
|
|
142
|
-
oPropertyAnnotations["@com.sap.vocabularies.Common.v1.Text@com.sap.vocabularies.UI.v1.TextArrangement"];
|
|
143
|
-
// DropDownListe use default #TextFirst whether no TextArrangement for the Text is annotated
|
|
144
|
-
if (
|
|
145
|
-
(sTextArrangement &&
|
|
146
|
-
(sTextArrangement.$EnumMember === "com.sap.vocabularies.UI.v1.TextArrangementType/TextOnly" ||
|
|
147
|
-
sTextArrangement.$EnumMember === "com.sap.vocabularies.UI.v1.TextArrangementType/TextFirst" ||
|
|
148
|
-
sTextArrangement.$EnumMember === "com.sap.vocabularies.UI.v1.TextArrangementType/TextLast")) ||
|
|
149
|
-
(bIsDropDownListe &&
|
|
150
|
-
oPropertyAnnotations["@com.sap.vocabularies.Common.v1.Text"] &&
|
|
151
|
-
sTextArrangement === undefined) ||
|
|
152
|
-
(sTextArrangement &&
|
|
153
|
-
!sTextArrangement.$EnumMember === "com.sap.vocabularies.UI.v1.TextArrangementType/TextSeparate")
|
|
154
|
-
) {
|
|
155
|
-
bIsTextArrangement = true;
|
|
156
|
-
sRedundantColumn =
|
|
157
|
-
oMetaModel.getObject(
|
|
158
|
-
"/" +
|
|
159
|
-
oValueList.CollectionPath +
|
|
160
|
-
"/" +
|
|
161
|
-
oParameter.ValueListProperty +
|
|
162
|
-
"@com.sap.vocabularies.UI.v1.Hidden"
|
|
163
|
-
) !== true
|
|
164
|
-
? "{_VHUI>/hideColumn}"
|
|
165
|
-
: undefined;
|
|
166
|
-
}
|
|
167
|
-
if (!oParameter["@com.sap.vocabularies.UI.v1.Importance"]) {
|
|
168
|
-
if (!bIsTextArrangement) {
|
|
169
|
-
sRedundantColumn = undefined;
|
|
170
|
-
} else {
|
|
171
|
-
sRedundantColumn = bConsiderImportanceHigh ? "{_VHUI>/showColumnInTypeAhead}" : "{_VHUI>/hideColumn}";
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
return sRedundantColumn;
|
|
97
|
+
function _getValueHelpColumnDisplayFormat(oPropertyAnnotations, isValueHelpWithFixedValues) {
|
|
98
|
+
var sDisplayMode = CommonUtils.computeDisplayMode(oPropertyAnnotations, undefined);
|
|
99
|
+
var oTextAnnotation = oPropertyAnnotations && oPropertyAnnotations["@com.sap.vocabularies.Common.v1.Text"];
|
|
100
|
+
var oTextArrangementAnnotation =
|
|
101
|
+
oTextAnnotation && oPropertyAnnotations["@com.sap.vocabularies.Common.v1.Text@com.sap.vocabularies.UI.v1.TextArrangement"];
|
|
102
|
+
if (isValueHelpWithFixedValues) {
|
|
103
|
+
return oTextAnnotation && typeof oTextAnnotation !== "string" && oTextAnnotation.$Path ? sDisplayMode : "Value";
|
|
104
|
+
} else {
|
|
105
|
+
// Only explicit defined TextArrangements in a Value Help with Dialog are considered
|
|
106
|
+
return oTextArrangementAnnotation ? sDisplayMode : "Value";
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function _redundantDescription(oVLParameter, oColumnInfo) {
|
|
111
|
+
if (
|
|
112
|
+
oVLParameter.ValueListProperty === oColumnInfo.textColumnName &&
|
|
113
|
+
!oColumnInfo.keyColumnHidden &&
|
|
114
|
+
oColumnInfo.keyColumnDisplayFormat !== "Value"
|
|
115
|
+
) {
|
|
116
|
+
return true;
|
|
177
117
|
}
|
|
118
|
+
return undefined;
|
|
178
119
|
}
|
|
179
120
|
|
|
180
121
|
function _getDefaultSortPropertyName(oValueList) {
|
|
@@ -318,25 +259,50 @@ sap.ui.define(
|
|
|
318
259
|
aSuggestCachedValueHelp = [];
|
|
319
260
|
},
|
|
320
261
|
|
|
262
|
+
getColumnVisibilityInfo: function(oValueList, sPropertyFullPath, bIsDropDownListe) {
|
|
263
|
+
var columnInfo;
|
|
264
|
+
var oMetaModel = oValueList.$model.getMetaModel(),
|
|
265
|
+
oPropertyAnnotations,
|
|
266
|
+
sPropertyName = sPropertyFullPath && sPropertyFullPath.split("/").pop();
|
|
267
|
+
|
|
268
|
+
var oParamWithKey = oValueList.Parameters.find(function(oParameter) {
|
|
269
|
+
return oParameter.LocalDataProperty && oParameter.LocalDataProperty.$PropertyPath === sPropertyName;
|
|
270
|
+
});
|
|
271
|
+
oPropertyAnnotations =
|
|
272
|
+
oParamWithKey &&
|
|
273
|
+
oParamWithKey.ValueListProperty &&
|
|
274
|
+
oMetaModel.getObject("/" + oValueList.CollectionPath + "/" + oParamWithKey.ValueListProperty + "@");
|
|
275
|
+
columnInfo = {
|
|
276
|
+
keyColumnHidden: oPropertyAnnotations && oPropertyAnnotations["@com.sap.vocabularies.UI.v1.Hidden"] ? true : false,
|
|
277
|
+
keyColumnDisplayFormat:
|
|
278
|
+
oPropertyAnnotations && _getValueHelpColumnDisplayFormat(oPropertyAnnotations, bIsDropDownListe),
|
|
279
|
+
textColumnName:
|
|
280
|
+
oPropertyAnnotations &&
|
|
281
|
+
oPropertyAnnotations["@com.sap.vocabularies.Common.v1.Text"] &&
|
|
282
|
+
oPropertyAnnotations["@com.sap.vocabularies.Common.v1.Text"].$Path
|
|
283
|
+
};
|
|
284
|
+
return columnInfo;
|
|
285
|
+
},
|
|
286
|
+
|
|
321
287
|
getColumnVisibility: function(oValueList, oVLParameter, oSource) {
|
|
322
|
-
var
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
if (
|
|
326
|
-
return
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
} else {
|
|
337
|
-
return "{_VHUI>/showAllColumns}";
|
|
288
|
+
var bIsDropDownList = oSource && !!oSource.valueHelpWithFixedValues,
|
|
289
|
+
oColumnInfo = oSource && oSource.columnInfo,
|
|
290
|
+
bRedundantColumn = _redundantDescription(oVLParameter, oColumnInfo);
|
|
291
|
+
if (bIsDropDownList) {
|
|
292
|
+
return bRedundantColumn ? false : undefined;
|
|
293
|
+
} else if (!bIsDropDownList && !_hasImportanceHigh(oValueList)) {
|
|
294
|
+
return bRedundantColumn ? false : undefined;
|
|
295
|
+
} else if (!bIsDropDownList && _hasImportanceHigh(oValueList)) {
|
|
296
|
+
return oVLParameter &&
|
|
297
|
+
oVLParameter["@com.sap.vocabularies.UI.v1.Importance"] &&
|
|
298
|
+
oVLParameter["@com.sap.vocabularies.UI.v1.Importance"].$EnumMember ===
|
|
299
|
+
"com.sap.vocabularies.UI.v1.ImportanceType/High"
|
|
300
|
+
? true
|
|
301
|
+
: false;
|
|
338
302
|
}
|
|
303
|
+
return undefined;
|
|
339
304
|
},
|
|
305
|
+
|
|
340
306
|
getDialogTableColumnVisibility: function(oValueList, oVLParameter) {
|
|
341
307
|
var oMetaModel = oValueList.$model.getMetaModel(),
|
|
342
308
|
oPropertyAnnotations,
|
|
@@ -1035,14 +1001,22 @@ sap.ui.define(
|
|
|
1035
1001
|
oFVH.setDescriptionPath(oValueListInfo.descriptionValue);
|
|
1036
1002
|
oFVH.setFilterFields(_entityIsSearchable(oValueListInfo, oPropertyAnnotations) ? "$search" : "");
|
|
1037
1003
|
}
|
|
1004
|
+
var bValueHelpWithFixedValues = oFVH
|
|
1005
|
+
.getModel()
|
|
1006
|
+
.getMetaModel()
|
|
1007
|
+
.getObject(propertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueListWithFixedValues"];
|
|
1008
|
+
var oColumnInfo = ValueListHelper.getColumnVisibilityInfo(
|
|
1009
|
+
oValueListInfo.valueListInfo,
|
|
1010
|
+
propertyPath,
|
|
1011
|
+
bValueHelpWithFixedValues
|
|
1012
|
+
);
|
|
1038
1013
|
var oSourceModel = new JSONModel({
|
|
1039
1014
|
id: sValueHelpId || oFVH.getId(),
|
|
1040
1015
|
groupId: oFVH.data("requestGroupId") || undefined,
|
|
1041
1016
|
bSuggestion: bSuggestion,
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
.getObject(propertyPath + "@")["@com.sap.vocabularies.Common.v1.ValueListWithFixedValues"]
|
|
1017
|
+
propertyPath: propertyPath,
|
|
1018
|
+
columnInfo: oColumnInfo,
|
|
1019
|
+
valueHelpWithFixedValues: bValueHelpWithFixedValues
|
|
1046
1020
|
});
|
|
1047
1021
|
oTable =
|
|
1048
1022
|
oTable ||
|
|
@@ -1176,7 +1150,6 @@ sap.ui.define(
|
|
|
1176
1150
|
oFilterBar,
|
|
1177
1151
|
oSuggestTable,
|
|
1178
1152
|
bExists,
|
|
1179
|
-
bIsDropDownList = oFVH.getProperty("noDialog"),
|
|
1180
1153
|
oVHUIModel,
|
|
1181
1154
|
sValueHelpId;
|
|
1182
1155
|
if (bSuggestion) {
|
|
@@ -1203,9 +1176,6 @@ sap.ui.define(
|
|
|
1203
1176
|
);
|
|
1204
1177
|
}
|
|
1205
1178
|
oVHUIModel.setProperty("/isSuggestion", bSuggestion);
|
|
1206
|
-
oVHUIModel.setProperty("/showAllColumns", bIsDropDownList ? true : !bSuggestion);
|
|
1207
|
-
oVHUIModel.setProperty("/hideColumn", false);
|
|
1208
|
-
oVHUIModel.setProperty("/showColumnInTypeAhead", bSuggestion);
|
|
1209
1179
|
oVHUIModel.setProperty("/minScreenWidth", !bSuggestion ? "418px" : undefined);
|
|
1210
1180
|
sValueHelpId = oFVH.getModel("_VHUI").getProperty("/valueHelpId");
|
|
1211
1181
|
if (oDialogTable) {
|