ts2famix 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -117,7 +117,7 @@ class EntityDictionary {
|
|
|
117
117
|
}
|
|
118
118
|
// The +1 is because the source anchor (Pharo) is 1-based, but ts-morph is 0-based
|
|
119
119
|
sourceAnchor.startPos = sourceStart + 1;
|
|
120
|
-
sourceAnchor.endPos = sourceEnd
|
|
120
|
+
sourceAnchor.endPos = sourceEnd;
|
|
121
121
|
let fileName = node.getSourceFile().getFilePath();
|
|
122
122
|
if (fileName.startsWith("/")) {
|
|
123
123
|
fileName = fileName.substring(1);
|
|
@@ -204,7 +204,7 @@ class EntityDictionary {
|
|
|
204
204
|
}
|
|
205
205
|
// note: the +1 is because the source anchor is 1-based, but ts-morph is 0-based
|
|
206
206
|
fmxIndexFileAnchor.startPos = sourceStart + 1;
|
|
207
|
-
fmxIndexFileAnchor.endPos = sourceEnd
|
|
207
|
+
fmxIndexFileAnchor.endPos = sourceEnd;
|
|
208
208
|
// if (!(famixElement instanceof Famix.ImportClause || famixElement instanceof Famix.Access || famixElement instanceof Famix.Reference || famixElement instanceof Famix.Invocation || famixElement instanceof Famix.Inheritance) && !(famixElement instanceof Famix.Comment) && !(sourceElement instanceof CommentRange) && !(sourceElement instanceof Identifier) && !(sourceElement instanceof ImportSpecifier) && !(sourceElement instanceof ExpressionWithTypeArguments)) {
|
|
209
209
|
// initFQN(sourceElement, famixElement);
|
|
210
210
|
// }
|
|
@@ -1875,4 +1875,4 @@ function getPrimitiveTypeName(type) {
|
|
|
1875
1875
|
// }
|
|
1876
1876
|
// return interfaceDeclaration;
|
|
1877
1877
|
// }
|
|
1878
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW50aXR5RGljdGlvbmFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYW1peF9mdW5jdGlvbnMvRW50aXR5RGljdGlvbmFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBczFESCwwQ0FhQztBQW1IRCxvREFpQkM7QUFwK0RELHVDQUF1bUI7QUFDdm1CLDhFQUFnRjtBQUNoRixnRUFBa0Q7QUFDbEQsb0VBQWdFO0FBQ2hFLHdDQUE0QztBQUM1QyxpRUFBaUU7QUFDakUsc0RBQXVEO0FBQ3ZELDREQUE4QztBQUM5QyxxREFBdUM7QUFDdkMsZ0RBQXdCO0FBY3hCLE1BQWEsZ0JBQWdCO0lBcUJ6QjtRQW5CTyxhQUFRLEdBQUcsSUFBSSxrQ0FBZSxFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQyxDQUFDLDRDQUE0QztRQUMxRixnQkFBVyxHQUFHLElBQUksR0FBRyxFQUErQyxDQUFDLENBQUMsNERBQTREO1FBQ2xJLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXVELENBQUMsQ0FBQyxnREFBZ0Q7UUFDbEksaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBbUMsQ0FBQyxDQUFDLGdEQUFnRDtRQUMzRyxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQTZDLENBQUMsQ0FBQyxrREFBa0Q7UUFDckgsZUFBVSxHQUFHLElBQUksR0FBRyxFQUE0RCxDQUFDLENBQUMsbURBQW1EO1FBQ3JJLHdCQUFtQixHQUFHLElBQUksR0FBRyxFQUErQixDQUFDLENBQUMscURBQXFEO1FBQ25ILDRCQUF1QixHQUFHLElBQUksR0FBOEYsQ0FBQyxDQUFDLCtDQUErQztRQUM3Syx3QkFBbUIsR0FBRyxJQUFJLEdBQWdDLENBQUMsQ0FBQywrQ0FBK0M7UUFDM0csb0JBQWUsR0FBRyxJQUFJLEdBQUcsRUFBeUMsQ0FBQyxDQUFDLDJD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QztJQUNuRCxJQUFJLEtBQUssR0FBRyxhQUFFLENBQUMsU0FBUyxDQUFDLFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUN2RCxJQUFJLEtBQUssR0FBRyxhQUFFLENBQUMsU0FBUyxDQUFDLElBQUk7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUM3QyxJQUFJLEtBQUssR0FBRyxhQUFFLENBQUMsU0FBUyxDQUFDLElBQUk7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUM3QyxJQUFJLEtBQUssR0FBRyxhQUFFLENBQUMsU0FBUyxDQUFDLEtBQUs7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUMvQyxJQUFJLEtBQUssR0FBRyxhQUFFLENBQUMsU0FBUyxDQUFDLEdBQUc7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzQyxJQUFJLEtBQUssR0FBRyxhQUFFLENBQUMsU0FBUyxDQUFDLE9BQU87UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVuRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsaUlBQWlJO0FBQ2pJLG9CQUFvQjtBQUNwQixvRUFBb0U7QUFDcEUseUNBQXlDO0FBRXpDLGdEQUFnRDtBQUNoRCxzRkFBc0Y7QUFFdEYscUJBQXFCO0FBQ3JCLDZJQUE2STtBQUM3SSx5RkFBeUY7QUFDekYsNkJBQTZCO0FBQzdCLG9GQUFvRjtBQUNwRixZQUFZO0FBQ1osMkNBQTJDO0FBQzNDLHlCQUF5QjtBQUN6QixnRkFBZ0Y7QUFDaEYsWUFBWTtBQUNaLFFBQVE7QUFFUixpRUFBaUU7QUFDakUscURBQXFEO0FBRXJELGlEQUFpRDtBQUNqRCxzSkFBc0o7QUFFdEosbUNBQW1DO0FBQ25DLDJGQUEyRjtBQUMzRixRQUFRO0FBRVIsbUNBQW1DO0FBQ25DLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGEgZnVuY3Rpb24gZ2V0T3JDcmVhdGVYVHlwZSB0YWtlcyBhcmd1bWVudHMgbmFtZTogc3RyaW5nIGFuZCBlbGVtZW50OiB0cy1tb3JwaC10eXBlIGFuZCByZXR1cm5zIGEgRmFtaXguVHlwZVxuICogVGhlIGdvYWwgaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgdHlwZXMgKGUuZy4sIGEgbWV0aG9kJ3MgZGVmaW5lZFR5cGUpLCBmb3IgdGhlIG1vZGVsLlxuICogVGhlIG5hbWUgZG9lc24ndCBuZWVkIHRvIGJlIGZ1bGx5IHF1YWxpZmllZCAoaXQncyB0aGUgbmFtZSB1c2VkIGluIHRoZSBzb3VyY2UgY29kZSwgb3IgdGhlIEZhbWl4IG1vZGVsKS5cbiAqL1xuXG5cbmltcG9ydCB7IENsYXNzRGVjbGFyYXRpb24sIENvbnN0cnVjdG9yRGVjbGFyYXRpb24sIEZ1bmN0aW9uRGVjbGFyYXRpb24sIElkZW50aWZpZXIsIEludGVyZmFjZURlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kU2lnbmF0dXJlLCBNb2R1bGVEZWNsYXJhdGlvbiwgUHJvcGVydHlEZWNsYXJhdGlvbiwgUHJvcGVydHlTaWduYXR1cmUsIFNvdXJjZUZpbGUsIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbiwgUGFyYW1ldGVyRGVjbGFyYXRpb24sIERlY29yYXRvciwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiwgSW1wb3J0U3BlY2lmaWVyLCBDb21tZW50UmFuZ2UsIEVudW1EZWNsYXJhdGlvbiwgRW51bU1lbWJlciwgVHlwZUFsaWFzRGVjbGFyYXRpb24sIEZ1bmN0aW9uRXhwcmVzc2lvbiwgSW1wb3J0RGVjbGFyYXRpb24sIEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uLCBTeW50YXhLaW5kLCBFeHByZXNzaW9uLCBUeXBlTm9kZSwgU2NvcGUsIEFycm93RnVuY3Rpb24sIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cywgSGVyaXRhZ2VDbGF1c2UsIHRzLCBUeXBlIH0gZnJvbSBcInRzLW1vcnBoXCI7XG5pbXBvcnQgeyBpc0FtYmllbnQsIGlzTmFtZXNwYWNlIH0gZnJvbSBcIi4uL2FuYWx5emVfZnVuY3Rpb25zL3Byb2Nlc3NfZnVuY3Rpb25zXCI7XG5pbXBvcnQgKiBhcyBGYW1peCBmcm9tIFwiLi4vbGliL2ZhbWl4L21vZGVsL2ZhbWl4XCI7XG5pbXBvcnQgeyBGYW1peFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vbGliL2ZhbWl4L2ZhbWl4X3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IGxvZ2dlciwgY29uZmlnIH0gZnJvbSBcIi4uL2FuYWx5emVcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5pbXBvcnQgR3JhcGhlbWVTcGxpdHRlciA9IHJlcXVpcmUoJ2dyYXBoZW1lLXNwbGl0dGVyJyk7XG5pbXBvcnQgKiBhcyBIZWxwZXJzIGZyb20gXCIuL2hlbHBlcnNfY3JlYXRpb25cIjtcbmltcG9ydCAqIGFzIEZRTkZ1bmN0aW9ucyBmcm9tIFwiLi4vZnFuXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgdHlwZSBUU01vcnBoT2JqZWN0VHlwZSA9IEltcG9ydERlY2xhcmF0aW9uIHwgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24gfCBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24gfCBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBWYXJpYWJsZURlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IFByb3BlcnR5U2lnbmF0dXJlIHwgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgSWRlbnRpZmllciB8IERlY29yYXRvciB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgSW1wb3J0U3BlY2lmaWVyIHwgQ29tbWVudFJhbmdlIHwgRW51bURlY2xhcmF0aW9uIHwgRW51bU1lbWJlciB8IFR5cGVBbGlhc0RlY2xhcmF0aW9uIHwgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIHwgVFNNb3JwaFBhcmFtZXRyaWNUeXBlO1xuXG5leHBvcnQgdHlwZSBUU01vcnBoVHlwZURlY2xhcmF0aW9uID0gVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgUHJvcGVydHlTaWduYXR1cmUgfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFZhcmlhYmxlRGVjbGFyYXRpb24gfCBFbnVtTWVtYmVyIHwgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24gfCBUU01vcnBoUGFyYW1ldHJpY1R5cGUgfCBUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gO1xuXG5leHBvcnQgdHlwZSBUU01vcnBoUGFyYW1ldHJpY1R5cGUgPSBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBBcnJvd0Z1bmN0aW9uO1xuXG50eXBlIFBhcmFtZXRyaWNWYXJpYW50VHlwZSA9IEZhbWl4LlBhcmFtZXRyaWNDbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljTWV0aG9kO1xuXG50eXBlIENvbmNyZXRlRWxlbWVudFRTTW9ycGhUeXBlID0gQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uO1xuXG5leHBvcnQgdHlwZSBJbnZvY2FibGVUeXBlID0gTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgQXJyb3dGdW5jdGlvbjtcblxuZXhwb3J0IGNsYXNzIEVudGl0eURpY3Rpb25hcnkge1xuICAgIFxuICAgIHB1YmxpYyBmYW1peFJlcCA9IG5ldyBGYW1peFJlcG9zaXRvcnkoKTtcbiAgICBwcml2YXRlIGZteEFsaWFzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZhbWl4LkFsaWFzPigpOyAvLyBNYXBzIHRoZSBhbGlhcyBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxuICAgIHByaXZhdGUgZm14Q2xhc3NNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljQ2xhc3M+KCk7IC8vIE1hcHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxuICAgIHByaXZhdGUgZm14SW50ZXJmYWNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZhbWl4LkludGVyZmFjZSB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2U+KCk7IC8vIE1hcHMgdGhlIGludGVyZmFjZSBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxuICAgIHByaXZhdGUgZm14TW9kdWxlTWFwID0gbmV3IE1hcDxNb2R1bGVEZWNsYXJhdGlvbiwgRmFtaXguTW9kdWxlPigpOyAvLyBNYXBzIHRoZSBuYW1lc3BhY2UgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteEZpbGVNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguU2NyaXB0RW50aXR5IHwgRmFtaXguTW9kdWxlPigpOyAvLyBNYXBzIHRoZSBzb3VyY2UgZmlsZSBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxuICAgIHByaXZhdGUgZm14VHlwZU1hcCA9IG5ldyBNYXA8VFNNb3JwaFR5cGVEZWNsYXJhdGlvbiwgRmFtaXguVHlwZSB8IEZhbWl4LlBhcmFtZXRlclR5cGU+KCk7IC8vIE1hcHMgdGhlIHR5cGVzIGRlY2xhcmF0aW9ucyB0byB0aGVpciBGYW1peCBtb2RlbFxuICAgIHByaXZhdGUgZm14UHJpbWl0aXZlVHlwZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5QcmltaXRpdmVUeXBlPigpOyAvLyBNYXBzIHRoZSBwcmltaXRpdmUgdHlwZSBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxuICAgIHByaXZhdGUgZm14RnVuY3Rpb25BbmRNZXRob2RNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24gfCBGYW1peC5NZXRob2QgfCBGYW1peC5QYXJhbWV0cmljTWV0aG9kPjsgLy8gTWFwcyB0aGUgZnVuY3Rpb24gbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteEFycm93RnVuY3Rpb25NYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguQXJyb3dGdW5jdGlvbj47IC8vIE1hcHMgdGhlIGZ1bmN0aW9uIG5hbWVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXG4gICAgcHJpdmF0ZSBmbXhQYXJhbWV0ZXJNYXAgPSBuZXcgTWFwPFBhcmFtZXRlckRlY2xhcmF0aW9uLCBGYW1peC5QYXJhbWV0ZXI+KCk7IC8vIE1hcHMgdGhlIHBhcmFtZXRlcnMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteFZhcmlhYmxlTWFwID0gbmV3IE1hcDxWYXJpYWJsZURlY2xhcmF0aW9uLCBGYW1peC5WYXJpYWJsZT4oKTsgLy8gTWFwcyB0aGUgdmFyaWFibGVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXG4gICAgcHJpdmF0ZSBmbXhJbXBvcnRDbGF1c2VNYXAgPSBuZXcgTWFwPEltcG9ydERlY2xhcmF0aW9uIHwgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24sIEZhbWl4LkltcG9ydENsYXVzZT4oKTsgLy8gTWFwcyB0aGUgaW1wb3J0IGNsYXVzZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteEVudW1NYXAgPSBuZXcgTWFwPEVudW1EZWNsYXJhdGlvbiwgRmFtaXguRW51bT4oKTsgLy8gTWFwcyB0aGUgZW51bSBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxuICAgIHByaXZhdGUgZm14SW5oZXJpdGFuY2VNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguSW5oZXJpdGFuY2U+KCk7IC8vIE1hcHMgdGhlIGluaGVyaXRhbmNlIG5hbWVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXG4gICAgcHJpdmF0ZSBVTktOT1dOX1ZBTFVFID0gJyh1bmtub3duIGR1ZSB0byBwYXJzaW5nIGVycm9yKSc7IC8vIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiBhIG5hbWUgaXMgbm90IHVzYWJsZVxuICAgIHB1YmxpYyBmbXhFbGVtZW50T2JqZWN0TWFwID0gbmV3IE1hcDxGYW1peC5FbnRpdHksVFNNb3JwaE9iamVjdFR5cGU+KCk7XG4gICAgcHVibGljIHRzTW9ycGhFbGVtZW50T2JqZWN0TWFwID0gbmV3IE1hcDxUU01vcnBoT2JqZWN0VHlwZSxGYW1peC5FbnRpdHk+KCk7XG4gICAgICAgICAgICBcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5mYW1peFJlcC5zZXRGbXhFbGVtZW50T2JqZWN0TWFwKHRoaXMuZm14RWxlbWVudE9iamVjdE1hcCk7ICAgICAgXG4gICAgfVxuXG4gICAgcHVibGljIGFkZFNvdXJjZUFuY2hvcihmbXg6IEZhbWl4LlNvdXJjZWRFbnRpdHksIG5vZGU6IFRTTW9ycGhPYmplY3RUeXBlKTogRmFtaXguSW5kZXhlZEZpbGVBbmNob3Ige1xuICAgICAgICBjb25zdCBzb3VyY2VBbmNob3I6IEZhbWl4LkluZGV4ZWRGaWxlQW5jaG9yID0gbmV3IEZhbWl4LkluZGV4ZWRGaWxlQW5jaG9yKCk7XG4gICAgICAgIGxldCBzb3VyY2VTdGFydCwgc291cmNlRW5kOiBudW1iZXI7XG4gICAgICAgIGlmIChmbXggJiYgbm9kZSkge1xuICAgICAgICAgICAgLy8gZmluZCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgb2YgdGhlIHNvdXJjZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgQ29tbWVudFJhbmdlKSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gbm9kZS5nZXRTdGFydCgpO1xuICAgICAgICAgICAgICAgIHNvdXJjZUVuZCA9IG5vZGUuZ2V0RW5kKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gbm9kZS5nZXRQb3MoKTtcbiAgICAgICAgICAgICAgICBzb3VyY2VFbmQgPSBub2RlLmdldEVuZCgpO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgaWYgKGNvbmZpZy5leHBlY3RHcmFwaGVtZXMpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGxvZ2ljIGhhbmRsZXMgdGhlIGNhc2Ugb2YgbXVsdGktY29kZSBwb2ludCBjaGFyYWN0ZXJzIChlLmcuIGVtb2ppKSBpbiB0aGUgc291cmNlIHRleHQuXG4gICAgICAgICAgICAgICAgICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBQaGFyby9TbWFsbHRhbGsgdHJlYXRzIG11bHRpLWNvZGUgcG9pbnQgY2hhcmFjdGVycyBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIFxuICAgICAgICAgICAgICAgICAqIGJ1dCBKYXZhU2NyaXB0IHRyZWF0cyB0aGVtIGFzIG11bHRpcGxlIGNoYXJhY3RlcnMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnNcbiAgICAgICAgICAgICAgICAgKiBvZiBhIHNvdXJjZSBlbGVtZW50IGluIFBoYXJvL1NtYWxsdGFsayB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGVcbiAgICAgICAgICAgICAgICAgKiBzYW1lIHNvdXJjZSBlbGVtZW50IGluIEphdmFTY3JpcHQuIFRoaXMgbG9naWMgZmluZHMgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIG9mIHRoZSBzb3VyY2VcbiAgICAgICAgICAgICAgICAgKiBlbGVtZW50IGluIEphdmFTY3JpcHQgYW5kIHRoZW4gdXNlcyB0aG9zZSBwb3NpdGlvbnMgdG8gc2V0IHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGVcbiAgICAgICAgICAgICAgICAgKiBGYW1peCBpbmRleCBmaWxlIGFuY2hvci5cbiAgICAgICAgICAgICAgICAgKiBJdCBkZXBlbmRzIG9uIGNvZGUgaW4gdGhlICdncmFwaGVtZS1zcGxpdHRlcicgcGFja2FnZSBpbiBucG0uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgR3JhcGhlbWVTcGxpdHRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVUZXh0ID0gbm9kZS5nZXRTb3VyY2VGaWxlKCkuZ2V0RnVsbFRleHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNHcmFwaGVtZUNsdXN0ZXJzID0gc3BsaXR0ZXIuY291bnRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQpID4gMTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzR3JhcGhlbWVDbHVzdGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50VGV4dCA9IHNvdXJjZUZpbGVUZXh0LnN1YnN0cmluZyhzb3VyY2VTdGFydCwgc291cmNlRW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMgPSBzcGxpdHRlci5zcGxpdEdyYXBoZW1lcyhzb3VyY2VFbGVtZW50VGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVUZXh0R3JhcGhlbWVzID0gc3BsaXR0ZXIuc3BsaXRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJPZkdyYXBoZW1lQ2x1c3RlcnNCZWZvcmVTdGFydCA9IHNwbGl0dGVyLmNvdW50R3JhcGhlbWVzKHNvdXJjZUZpbGVUZXh0LnN1YnN0cmluZygwLCBzb3VyY2VTdGFydCkpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzIGFycmF5IGluIHRoZSBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VTdGFydCA9IEhlbHBlcnMuaW5kZXhPZlNwbGl0QXJyYXkoe3NlYXJjaEFycmF5OiBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEFycmF5OiBzb3VyY2VFbGVtZW50VGV4dEdyYXBoZW1lcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzb3VyY2VTdGFydCAtIG51bWJlck9mR3JhcGhlbWVDbHVzdGVyc0JlZm9yZVN0YXJ0fSk7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUVuZCA9IHNvdXJjZVN0YXJ0ICsgc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRoZSArMSBpcyBiZWNhdXNlIHRoZSBzb3VyY2UgYW5jaG9yIChQaGFybykgaXMgMS1iYXNlZCwgYnV0IHRzLW1vcnBoIGlzIDAtYmFzZWRcbiAgICAgICAgICAgIHNvdXJjZUFuY2hvci5zdGFydFBvcyA9IHNvdXJjZVN0YXJ0ICsgMTtcbiAgICAgICAgICAgIHNvdXJjZUFuY2hvci5lbmRQb3MgPSBzb3VyY2VFbmQgKyAxO1xuXG4gICAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBub2RlLmdldFNvdXJjZUZpbGUoKS5nZXRGaWxlUGF0aCgpIGFzIHN0cmluZztcbiAgICAgICAgICAgIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc291cmNlQW5jaG9yLmVsZW1lbnQgPSBmbXg7XG4gICAgICAgICAgICBzb3VyY2VBbmNob3IuZmlsZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgICAgICAgIGZteC5zb3VyY2VBbmNob3IgPSBzb3VyY2VBbmNob3I7XG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoc291cmNlQW5jaG9yKTtcblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2VBbmNob3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBGYW1peCBpbmRleCBmaWxlIGFuY2hvclxuICAgICAqIEBwYXJhbSBzb3VyY2VFbGVtZW50IEEgc291cmNlIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZmFtaXhFbGVtZW50IFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgc291cmNlIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgbWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHNvdXJjZUVsZW1lbnQ6IFRTTW9ycGhPYmplY3RUeXBlLCBmYW1peEVsZW1lbnQ6IEZhbWl4LlNvdXJjZWRFbnRpdHkpOiB2b2lkIHtcbiAgICAgICAgLy8gRmFtaXguQ29tbWVudCBpcyBub3QgYSBuYW1lZCBlbnRpdHkgKGRvZXMgbm90IGhhdmUgYSBmdWxseVF1YWxpZmllZE5hbWUpXG4gICAgICAgIGlmICghKGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LkNvbW1lbnQpKSB7ICAvLyBtdXN0IGJlIGEgbmFtZWQgZW50aXR5XG4gICAgICAgICAgICAvLyBpbnNhbml0eSBjaGVjazogbmFtZWQgZW50aXRpZXMgc2hvdWxkIGhhdmUgZnVsbHlRdWFsaWZpZWROYW1lXG4gICAgICAgICAgICBjb25zdCBmdWxseVF1YWxpZmllZE5hbWUgPSAoZmFtaXhFbGVtZW50IGFzIEZhbWl4Lk5hbWVkRW50aXR5KS5mdWxseVF1YWxpZmllZE5hbWU7XG4gICAgICAgICAgICBpZiAoIWZ1bGx5UXVhbGlmaWVkTmFtZSB8fCBmdWxseVF1YWxpZmllZE5hbWUgPT09IHRoaXMuVU5LTk9XTl9WQUxVRSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggZWxlbWVudCAke2ZhbWl4RWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfSBoYXMgbm8gdmFsaWQgZnVsbHlRdWFsaWZpZWROYW1lLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwibWFraW5nIGluZGV4IGZpbGUgYW5jaG9yIGZvciAnXCIgKyBzb3VyY2VFbGVtZW50Py5nZXRUZXh0KCkgKyBcIicgd2l0aCBmYW1peEVsZW1lbnQgXCIgKyBmYW1peEVsZW1lbnQuZ2V0SlNPTigpKTtcbiAgICAgICAgY29uc3QgZm14SW5kZXhGaWxlQW5jaG9yID0gbmV3IEZhbWl4LkluZGV4ZWRGaWxlQW5jaG9yKCk7XG4gICAgICAgIGZteEluZGV4RmlsZUFuY2hvci5lbGVtZW50ID0gZmFtaXhFbGVtZW50O1xuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZhbWl4RWxlbWVudCwgc291cmNlRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZUVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aFByb2plY3QgPSB0aGlzLmZhbWl4UmVwLmdldEFic29sdXRlUGF0aCgpO1xuICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgubm9ybWFsaXplKHNvdXJjZUVsZW1lbnQuZ2V0U291cmNlRmlsZSgpLmdldEZpbGVQYXRoKCkpO1xuXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbk5vZGVNb2R1bGVzID0gYWJzb2x1dGVQYXRoLmluZGV4T2YoJ25vZGVfbW9kdWxlcycpO1xuXG4gICAgICAgICAgICBsZXQgcGF0aEluUHJvamVjdDogc3RyaW5nID0gXCJcIjtcblxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uTm9kZU1vZHVsZXMgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aEZyb21Ob2RlTW9kdWxlcyA9IGFic29sdXRlUGF0aC5zdWJzdHJpbmcocG9zaXRpb25Ob2RlTW9kdWxlcyk7XG4gICAgICAgICAgICAgICAgcGF0aEluUHJvamVjdCA9IHBhdGhGcm9tTm9kZU1vZHVsZXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhdGhJblByb2plY3QgPSB0aGlzLmNvbnZlcnRUb1JlbGF0aXZlUGF0aChhYnNvbHV0ZVBhdGgsIGFic29sdXRlUGF0aFByb2plY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyByZXZlcnQgYW55IGJhY2tzbGFzaGVzIHRvIGZvcndhcmQgc2xhc2hlcyAocGF0aC5ub3JtYWxpemUgb24gd2luZG93cyBpbnRyb2R1Y2VzIHRoZW0pXG4gICAgICAgICAgICBwYXRoSW5Qcm9qZWN0ID0gcGF0aEluUHJvamVjdC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblxuICAgICAgICAgICAgaWYgKHBhdGhJblByb2plY3Quc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICBwYXRoSW5Qcm9qZWN0ID0gcGF0aEluUHJvamVjdC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZteEluZGV4RmlsZUFuY2hvci5maWxlTmFtZSA9IHBhdGhJblByb2plY3Q7XG4gICAgICAgICAgICBsZXQgc291cmNlU3RhcnQsIHNvdXJjZUVuZFxuICAgICAgICAgICAgLy8gLHNvdXJjZUxpbmVTdGFydCwgc291cmNlTGluZUVuZFxuICAgICAgICAgICAgOiBudW1iZXI7XG4gICAgICAgICAgICBpZiAoIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgQ29tbWVudFJhbmdlKSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gc291cmNlRWxlbWVudC5nZXRTdGFydCgpO1xuICAgICAgICAgICAgICAgIHNvdXJjZUVuZCA9IHNvdXJjZUVsZW1lbnQuZ2V0RW5kKCk7XG4gICAgICAgICAgICAgICAgLy8gc291cmNlTGluZVN0YXJ0ID0gc291cmNlRWxlbWVudC5nZXRTdGFydExpbmVOdW1iZXIoKTtcbiAgICAgICAgICAgICAgICAvLyBzb3VyY2VMaW5lRW5kID0gc291cmNlRWxlbWVudC5nZXRFbmRMaW5lTnVtYmVyKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gc291cmNlRWxlbWVudC5nZXRQb3MoKTtcbiAgICAgICAgICAgICAgICBzb3VyY2VFbmQgPSBzb3VyY2VFbGVtZW50LmdldEVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZy5leHBlY3RHcmFwaGVtZXMpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGxvZ2ljIGhhbmRsZXMgdGhlIGNhc2Ugb2YgbXVsdGktY29kZSBwb2ludCBjaGFyYWN0ZXJzIChlLmcuIGVtb2ppKSBpbiB0aGUgc291cmNlIHRleHQuXG4gICAgICAgICAgICAgICAgICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBQaGFyby9TbWFsbHRhbGsgdHJlYXRzIG11bHRpLWNvZGUgcG9pbnQgY2hhcmFjdGVycyBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIFxuICAgICAgICAgICAgICAgICAqIGJ1dCBKYXZhU2NyaXB0IHRyZWF0cyB0aGVtIGFzIG11bHRpcGxlIGNoYXJhY3RlcnMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnNcbiAgICAgICAgICAgICAgICAgKiBvZiBhIHNvdXJjZSBlbGVtZW50IGluIFBoYXJvL1NtYWxsdGFsayB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGVcbiAgICAgICAgICAgICAgICAgKiBzYW1lIHNvdXJjZSBlbGVtZW50IGluIEphdmFTY3JpcHQuIFRoaXMgbG9naWMgZmluZHMgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIG9mIHRoZSBzb3VyY2VcbiAgICAgICAgICAgICAgICAgKiBlbGVtZW50IGluIEphdmFTY3JpcHQgYW5kIHRoZW4gdXNlcyB0aG9zZSBwb3NpdGlvbnMgdG8gc2V0IHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGVcbiAgICAgICAgICAgICAgICAgKiBGYW1peCBpbmRleCBmaWxlIGFuY2hvci5cbiAgICAgICAgICAgICAgICAgKiBJdCBkZXBlbmRzIG9uIGNvZGUgaW4gdGhlICdncmFwaGVtZS1zcGxpdHRlcicgcGFja2FnZSBpbiBucG0uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgR3JhcGhlbWVTcGxpdHRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVUZXh0ID0gc291cmNlRWxlbWVudC5nZXRTb3VyY2VGaWxlKCkuZ2V0RnVsbFRleHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNHcmFwaGVtZUNsdXN0ZXJzID0gc3BsaXR0ZXIuY291bnRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQpID4gMTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzR3JhcGhlbWVDbHVzdGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50VGV4dCA9IHNvdXJjZUZpbGVUZXh0LnN1YnN0cmluZyhzb3VyY2VTdGFydCwgc291cmNlRW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMgPSBzcGxpdHRlci5zcGxpdEdyYXBoZW1lcyhzb3VyY2VFbGVtZW50VGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVUZXh0R3JhcGhlbWVzID0gc3BsaXR0ZXIuc3BsaXRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJPZkdyYXBoZW1lQ2x1c3RlcnNCZWZvcmVTdGFydCA9IHNwbGl0dGVyLmNvdW50R3JhcGhlbWVzKHNvdXJjZUZpbGVUZXh0LnN1YnN0cmluZygwLCBzb3VyY2VTdGFydCkpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzIGFycmF5IGluIHRoZSBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VTdGFydCA9IEhlbHBlcnMuaW5kZXhPZlNwbGl0QXJyYXkoe3NlYXJjaEFycmF5OiBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEFycmF5OiBzb3VyY2VFbGVtZW50VGV4dEdyYXBoZW1lcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzb3VyY2VTdGFydCAtIG51bWJlck9mR3JhcGhlbWVDbHVzdGVyc0JlZm9yZVN0YXJ0fSk7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUVuZCA9IHNvdXJjZVN0YXJ0ICsgc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBub3RlOiB0aGUgKzEgaXMgYmVjYXVzZSB0aGUgc291cmNlIGFuY2hvciBpcyAxLWJhc2VkLCBidXQgdHMtbW9ycGggaXMgMC1iYXNlZFxuICAgICAgICAgICAgZm14SW5kZXhGaWxlQW5jaG9yLnN0YXJ0UG9zID0gc291cmNlU3RhcnQgKyAxO1xuICAgICAgICAgICAgZm14SW5kZXhGaWxlQW5jaG9yLmVuZFBvcyA9IHNvdXJjZUVuZCArIDE7XG5cbiAgICAgICAgICAgIC8vIGlmICghKGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LkltcG9ydENsYXVzZSB8fCBmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5BY2Nlc3MgfHwgZmFtaXhFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUmVmZXJlbmNlIHx8IGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4Lkludm9jYXRpb24gfHwgZmFtaXhFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguSW5oZXJpdGFuY2UpICYmICEoZmFtaXhFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguQ29tbWVudCkgJiYgIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgQ29tbWVudFJhbmdlKSAmJiAhKHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBJZGVudGlmaWVyKSAmJiAhKHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBJbXBvcnRTcGVjaWZpZXIpICYmICEoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cykpIHtcbiAgICAgICAgICAgIC8vICAgIGluaXRGUU4oc291cmNlRWxlbWVudCwgZmFtaXhFbGVtZW50KTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNvdXJjZUVsZW1lbnQgaXMgbnVsbFxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJzb3VyY2VFbGVtZW50IGlzIG51bGwgZm9yIGZhbWl4RWxlbWVudCBcIiArIGZhbWl4RWxlbWVudC5nZXRKU09OKCkpO1xuICAgICAgICAgICAgZm14SW5kZXhGaWxlQW5jaG9yLmZpbGVOYW1lID0gXCJ1bmtub3duXCI7XG4gICAgICAgICAgICBmbXhJbmRleEZpbGVBbmNob3Iuc3RhcnRQb3MgPSAwO1xuICAgICAgICAgICAgZm14SW5kZXhGaWxlQW5jaG9yLmVuZFBvcyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14SW5kZXhGaWxlQW5jaG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBzY3JpcHQgZW50aXR5IG9yIG1vZHVsZVxuICAgICAqIEBwYXJhbSBmIEEgc291cmNlIGZpbGVcbiAgICAgKiBAcGFyYW0gaXNNb2R1bGUgQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIGEgbW9kdWxlXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBzb3VyY2UgZmlsZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4RmlsZShmOiBTb3VyY2VGaWxlLCBpc01vZHVsZTogYm9vbGVhbik6IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSB7XG4gICAgICAgIGxldCBmbXhGaWxlOiBGYW1peC5TY3JpcHRFbnRpdHk7IC8vIHwgRmFtaXguTW9kdWxlO1xuXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZi5nZXRCYXNlTmFtZSgpO1xuICAgICAgICBjb25zdCBmdWxseVF1YWxpZmllZEZpbGVuYW1lID0gZi5nZXRGaWxlUGF0aCgpO1xuICAgICAgICBjb25zdCBmb3VuZEZpbGVOYW1lID0gdGhpcy5mbXhGaWxlTWFwLmdldChmdWxseVF1YWxpZmllZEZpbGVuYW1lKTtcbiAgICAgICAgaWYgKCFmb3VuZEZpbGVOYW1lKSB7XG4gICAgICAgICAgICBpZiAoaXNNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICBmbXhGaWxlID0gbmV3IEZhbWl4Lk1vZHVsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm14RmlsZSA9IG5ldyBGYW1peC5TY3JpcHRFbnRpdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZteEZpbGUubmFtZSA9IGZpbGVOYW1lO1xuICAgICAgICAgICAgZm14RmlsZS5udW1iZXJPZkxpbmVzT2ZUZXh0ID0gZi5nZXRFbmRMaW5lTnVtYmVyKCkgLSBmLmdldFN0YXJ0TGluZU51bWJlcigpO1xuICAgICAgICAgICAgZm14RmlsZS5udW1iZXJPZkNoYXJhY3RlcnMgPSBmLmdldEZ1bGxUZXh0KCkubGVuZ3RoO1xuXG4gICAgICAgICAgICBpbml0RlFOKGYsIGZteEZpbGUpO1xuXG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihmLCBmbXhGaWxlKTtcblxuICAgICAgICAgICAgdGhpcy5mbXhGaWxlTWFwLnNldChmdWxseVF1YWxpZmllZEZpbGVuYW1lLCBmbXhGaWxlKTtcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZteEZpbGUgPSBmb3VuZEZpbGVOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhGaWxlLGYpO1xuICAgICAgICByZXR1cm4gZm14RmlsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBNb2R1bGVcbiAgICAgKiBAcGFyYW0gbW9kdWxlRGVjbGFyYXRpb24gQSBtb2R1bGVcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIG1vZHVsZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4TW9kdWxlKG1vZHVsZURlY2xhcmF0aW9uOiBNb2R1bGVEZWNsYXJhdGlvbik6IEZhbWl4Lk1vZHVsZSB7XG4gICAgICAgIGlmICh0aGlzLmZteE1vZHVsZU1hcC5oYXMobW9kdWxlRGVjbGFyYXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCByTW9kdWxlID0gdGhpcy5mbXhNb2R1bGVNYXAuZ2V0KG1vZHVsZURlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIGlmIChyTW9kdWxlKSB7IFxuICAgICAgICAgICAgICAgcmV0dXJuIHJNb2R1bGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggbW9kdWxlICR7bW9kdWxlRGVjbGFyYXRpb24uZ2V0TmFtZSgpfSBpcyBub3QgZm91bmQgaW4gdGhlIG1vZHVsZSBtYXAuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmbXhNb2R1bGUgPSBuZXcgRmFtaXguTW9kdWxlKCk7XG4gICAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBtb2R1bGVEZWNsYXJhdGlvbi5nZXROYW1lKCk7XG4gICAgICAgIGZteE1vZHVsZS5uYW1lID0gbW9kdWxlTmFtZTtcbiAgICAgICAgZm14TW9kdWxlLmlzQW1iaWVudCA9IGlzQW1iaWVudChtb2R1bGVEZWNsYXJhdGlvbik7XG4gICAgICAgIGZteE1vZHVsZS5pc05hbWVzcGFjZSA9IGlzTmFtZXNwYWNlKG1vZHVsZURlY2xhcmF0aW9uKTtcbiAgICAgICAgZm14TW9kdWxlLmlzTW9kdWxlID0gIWZteE1vZHVsZS5pc05hbWVzcGFjZSAmJiAhZm14TW9kdWxlLmlzQW1iaWVudDtcblxuICAgICAgICBpbml0RlFOKG1vZHVsZURlY2xhcmF0aW9uLCBmbXhNb2R1bGUpO1xuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihtb2R1bGVEZWNsYXJhdGlvbiwgZm14TW9kdWxlKTtcblxuICAgICAgICB0aGlzLmZteE1vZHVsZU1hcC5zZXQobW9kdWxlRGVjbGFyYXRpb24sIGZteE1vZHVsZSk7XG5cbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteE1vZHVsZSk7XG5cbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhNb2R1bGUsbW9kdWxlRGVjbGFyYXRpb24pO1xuICAgICAgICByZXR1cm4gZm14TW9kdWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBhbGlhc1xuICAgICAqIEBwYXJhbSB0eXBlQWxpYXNEZWNsYXJhdGlvbiBBbiBhbGlhc1xuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgYWxpYXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhBbGlhcyh0eXBlQWxpYXNEZWNsYXJhdGlvbjogVHlwZUFsaWFzRGVjbGFyYXRpb24pOiBGYW1peC5BbGlhcyB7XG4gICAgICAgIGxldCBmbXhBbGlhczogRmFtaXguQWxpYXM7XG4gICAgICAgIGNvbnN0IGFsaWFzTmFtZSA9IHR5cGVBbGlhc0RlY2xhcmF0aW9uLmdldE5hbWUoKTtcbiAgICAgICAgLy9jb25zdCBhbGlhc0Z1bGx5UXVhbGlmaWVkTmFtZSA9IGEuZ2V0VHlwZSgpLmdldFRleHQoKTsgLy8gRlFORnVuY3Rpb25zLmdldEZRTihhKTtcbiAgICAgICAgY29uc3QgYWxpYXNGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKHR5cGVBbGlhc0RlY2xhcmF0aW9uKTtcbiAgICAgICAgY29uc3QgZm91bmRBbGlhcyA9IHRoaXMuZm14QWxpYXNNYXAuZ2V0KGFsaWFzRnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICAgICAgaWYgKCFmb3VuZEFsaWFzKSB7XG4gICAgICAgICAgICBmbXhBbGlhcyA9IG5ldyBGYW1peC5BbGlhcygpO1xuICAgICAgICAgICAgZm14QWxpYXMubmFtZSA9IHR5cGVBbGlhc0RlY2xhcmF0aW9uLmdldE5hbWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGFsaWFzTmFtZVdpdGhHZW5lcmljcyA9IGFsaWFzTmFtZSArICh0eXBlQWxpYXNEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA/IChcIjxcIiArIHR5cGVBbGlhc0RlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKHRwID0+IHRwLmdldE5hbWUoKSkuam9pbihcIiwgXCIpICsgXCI+XCIpIDogXCJcIik7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYD4gTk9URTogYWxpYXMgJHthbGlhc05hbWV9IGhhcyBmdWxseSBxdWFsaWZpZWQgbmFtZSAke2FsaWFzRnVsbHlRdWFsaWZpZWROYW1lfSBhbmQgbmFtZSB3aXRoIGdlbmVyaWNzICR7YWxpYXNOYW1lV2l0aEdlbmVyaWNzfS5gKTtcblxuICAgICAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoYWxpYXNOYW1lV2l0aEdlbmVyaWNzLCB0eXBlQWxpYXNEZWNsYXJhdGlvbi5nZXRUeXBlKCksIHR5cGVBbGlhc0RlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIGZteEFsaWFzLmFsaWFzZWRFbnRpdHkgPSBmbXhUeXBlO1xuICAgICAgICAgICAgaW5pdEZRTih0eXBlQWxpYXNEZWNsYXJhdGlvbiwgZm14QWxpYXMpO1xuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IodHlwZUFsaWFzRGVjbGFyYXRpb24sIGZteEFsaWFzKTtcblxuICAgICAgICAgICAgdGhpcy5mbXhBbGlhc01hcC5zZXQoYWxpYXNGdWxseVF1YWxpZmllZE5hbWUsIGZteEFsaWFzKTtcblxuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEFsaWFzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZteEFsaWFzID0gZm91bmRBbGlhcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEFsaWFzLHR5cGVBbGlhc0RlY2xhcmF0aW9uKTtcblxuICAgICAgICByZXR1cm4gZm14QWxpYXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggY2xhc3Mgb3IgcGFyYW1ldGVyaXphYmxlIGNsYXNzXG4gICAgICogQHBhcmFtIGNscyBBIGNsYXNzXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjbGFzc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4Q2xhc3MoY2xzOiBDbGFzc0RlY2xhcmF0aW9uKTogRmFtaXguQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljQ2xhc3Mge1xuICAgICAgICBsZXQgZm14Q2xhc3M6IEZhbWl4LkNsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0NsYXNzO1xuICAgICAgICBjb25zdCBpc0Fic3RyYWN0ID0gY2xzLmlzQWJzdHJhY3QoKTtcbiAgICAgICAgY29uc3QgY2xhc3NGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGNscyk7XG4gICAgICAgIGNvbnN0IGNsc05hbWUgPSBjbHMuZ2V0TmFtZSgpIHx8IHRoaXMuVU5LTk9XTl9WQUxVRTtcbiAgICAgICAgY29uc3QgaXNHZW5lcmljID0gY2xzLmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoO1xuICAgICAgICBjb25zdCBmb3VuZENsYXNzID0gdGhpcy5mbXhDbGFzc01hcC5nZXQoY2xhc3NGdWxseVF1YWxpZmllZE5hbWUpO1xuICAgICAgICBpZiAoIWZvdW5kQ2xhc3MpIHtcbiAgICAgICAgICAgIGlmIChpc0dlbmVyaWMpIHtcbiAgICAgICAgICAgICAgICBmbXhDbGFzcyA9IG5ldyBGYW1peC5QYXJhbWV0cmljQ2xhc3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZteENsYXNzID0gbmV3IEZhbWl4LkNsYXNzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZteENsYXNzLm5hbWUgPSBjbHNOYW1lO1xuICAgICAgICAgICAgaW5pdEZRTihjbHMsIGZteENsYXNzKTtcbiAgICAgICAgICAgIC8vIGZteENsYXNzLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGNsYXNzRnVsbHlRdWFsaWZpZWROYW1lO1xuICAgICAgICAgICAgZm14Q2xhc3MuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7XG5cbiAgICAgICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGNscywgZm14Q2xhc3MpO1xuXG4gICAgICAgICAgICB0aGlzLmZteENsYXNzTWFwLnNldChjbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZSwgZm14Q2xhc3MpO1xuXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14Q2xhc3MpO1xuXG4gICAgICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteENsYXNzLGNscyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmbXhDbGFzcyA9IGZvdW5kQ2xhc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm14Q2xhc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggaW50ZXJmYWNlIG9yIHBhcmFtZXRlcml6YWJsZSBpbnRlcmZhY2VcbiAgICAgKiBAcGFyYW0gaW50ZXIgQW4gaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBpbnRlcmZhY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZShpbnRlcjogSW50ZXJmYWNlRGVjbGFyYXRpb24pOiBGYW1peC5JbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlIHtcblxuICAgICAgICBsZXQgZm14SW50ZXJmYWNlOiBGYW1peC5JbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlO1xuICAgICAgICBjb25zdCBpbnRlck5hbWUgPSBpbnRlci5nZXROYW1lKCk7XG4gICAgICAgIGNvbnN0IGludGVyRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihpbnRlcik7XG4gICAgICAgIGNvbnN0IGZvdW5kSW50ZXJmYWNlID0gdGhpcy5mbXhJbnRlcmZhY2VNYXAuZ2V0KGludGVyRnVsbHlRdWFsaWZpZWROYW1lKTtcbiAgICAgICAgaWYgKCFmb3VuZEludGVyZmFjZSkge1xuICAgICAgICAgICAgY29uc3QgaXNHZW5lcmljID0gaW50ZXIuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoaXNHZW5lcmljKSB7XG4gICAgICAgICAgICAgICAgZm14SW50ZXJmYWNlID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZteEludGVyZmFjZSA9IG5ldyBGYW1peC5JbnRlcmZhY2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm14SW50ZXJmYWNlLm5hbWUgPSBpbnRlck5hbWU7XG4gICAgICAgICAgICBpbml0RlFOKGludGVyLCBmbXhJbnRlcmZhY2UpO1xuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoaW50ZXIsIGZteEludGVyZmFjZSk7XG5cbiAgICAgICAgICAgIHRoaXMuZm14SW50ZXJmYWNlTWFwLnNldChpbnRlckZ1bGx5UXVhbGlmaWVkTmFtZSwgZm14SW50ZXJmYWNlKTtcblxuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEludGVyZmFjZSk7XG5cbiAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14SW50ZXJmYWNlLGludGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZteEludGVyZmFjZSA9IGZvdW5kSW50ZXJmYWNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbXhJbnRlcmZhY2U7XG4gICAgfVxuXG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggY29uY3JldGUgZWxlbWVudFxuICAgICAqIEBwYXJhbSBjb25jcmV0ZUVsZW1lbnQgQSBwYXJhbWV0cmljIEVsZW1lbnQgICBcbiAgICAgKiBAcGFyYW0gY29uY3JldGVFbGVtZW50RGVjbGFyYXRpb24gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb25cbiAgICAgKiBAcGFyYW0gY29uY3JldGVBcmd1bWVudHMgY29uY3JldGUgYXJndW1lbnRzXG4gICAgICogQHJldHVybnMgQSBwYXJhbWV0cmljIEVsZW1lbnQgIFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4Q29uY3JldGVFbGVtZW50KGNvbmNyZXRlRWxlbWVudCA6IFBhcmFtZXRyaWNWYXJpYW50VHlwZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3JldGVFbGVtZW50RGVjbGFyYXRpb24gOiBDb25jcmV0ZUVsZW1lbnRUU01vcnBoVHlwZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3JldGVBcmd1bWVudHM6IFR5cGVOb2RlW10pOiBQYXJhbWV0cmljVmFyaWFudFR5cGUge1xuICAgICAgICBcbiAgICAgICAgbGV0IGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUgPSBjb25jcmV0ZUVsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lO1xuICAgICAgICBsZXQgcGFyYW1zID0gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGNvbmNyZXRlQXJndW1lbnRzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcytwYXJhbS5nZXRUZXh0KCkrJywnO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zdWJzdHJpbmcoMCwgcGFyYW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICBmdWxseVF1YWxpZmllZEZpbGVuYW1lID0gSGVscGVycy5yZXBsYWNlTGFzdEJldHdlZW5UYWdzKGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUscGFyYW1zKTtcblxuICAgICAgICBsZXQgY29uY0VsZW1lbnQ6IFBhcmFtZXRyaWNWYXJpYW50VHlwZTtcblxuICAgICAgICBpZiAoIXRoaXMuZm14SW50ZXJmYWNlTWFwLmhhcyhmdWxseVF1YWxpZmllZEZpbGVuYW1lKSAmJiBcbiAgICAgICAgICAgICF0aGlzLmZteENsYXNzTWFwLmhhcyhmdWxseVF1YWxpZmllZEZpbGVuYW1lKSAmJiBcbiAgICAgICAgICAgICF0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmhhcyhmdWxseVF1YWxpZmllZEZpbGVuYW1lKSl7XG4gICAgICAgICAgICBjb25jRWxlbWVudCA9IF8uY2xvbmVEZWVwKGNvbmNyZXRlRWxlbWVudCk7IFxuICAgICAgICAgICAgY29uY0VsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lID0gZnVsbHlRdWFsaWZpZWRGaWxlbmFtZTtcbiAgICAgICAgICAgIGNvbmNFbGVtZW50LmNsZWFyR2VuZXJpY1BhcmFtZXRlcnMoKTtcbiAgICAgICAgICAgIGNvbmNyZXRlQXJndW1lbnRzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVyID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShwYXJhbS5nZXRUZXh0KCkscGFyYW0uZ2V0VHlwZSgpLCBwYXJhbSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNFbGVtZW50LmFkZENvbmNyZXRlUGFyYW1ldGVyKHBhcmFtZXRlcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYD4gV0FSTklORzogY29uY3JldGUgYXJndW1lbnQgJHtwYXJhbS5nZXRUZXh0KCl9IGlzIG5vdCBhIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi4gSXQgaXMgYSAke3BhcmFtLmdldEtpbmROYW1lKCl9LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mbXhDbGFzc01hcC5zZXQoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSwgY29uY0VsZW1lbnQgYXMgRmFtaXguUGFyYW1ldHJpY0NsYXNzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm14SW50ZXJmYWNlTWFwLnNldChmdWxseVF1YWxpZmllZEZpbGVuYW1lLCBjb25jRWxlbWVudCBhcyBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5zZXQoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSwgY29uY0VsZW1lbnQgYXMgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljTWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5zZXQoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSwgY29uY0VsZW1lbnQgYXMgRmFtaXguUGFyYW1ldHJpY01ldGhvZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoY29uY0VsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChjb25jRWxlbWVudCxjb25jcmV0ZUVsZW1lbnREZWNsYXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgY29uY0VsZW1lbnQgPSB0aGlzLmZteENsYXNzTWFwLmdldChmdWxseVF1YWxpZmllZEZpbGVuYW1lKSBhcyBGYW1peC5QYXJhbWV0cmljQ2xhc3M7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmNyZXRlRWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UpIHtcbiAgICAgICAgICAgICAgICBjb25jRWxlbWVudCA9IHRoaXMuZm14SW50ZXJmYWNlTWFwLmdldChmdWxseVF1YWxpZmllZEZpbGVuYW1lKSBhcyBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBjb25jRWxlbWVudCA9IHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuZ2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpIGFzIEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbjtcbiAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY01ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbmNFbGVtZW50ID0gdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5nZXQoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSkgYXMgRmFtaXguUGFyYW1ldHJpY01ldGhvZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY0VsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IHByb3BlcnR5XG4gICAgICogQHBhcmFtIHByb3BlcnR5IEEgcHJvcGVydHlcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHByb3BlcnR5XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4UHJvcGVydHkocHJvcGVydHk6IFByb3BlcnR5RGVjbGFyYXRpb24gfCBQcm9wZXJ0eVNpZ25hdHVyZSk6IEZhbWl4LlByb3BlcnR5IHtcbiAgICAgICAgY29uc3QgZm14UHJvcGVydHkgPSBuZXcgRmFtaXguUHJvcGVydHkoKTtcbiAgICAgICAgY29uc3QgaXNTaWduYXR1cmUgPSBwcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5U2lnbmF0dXJlO1xuICAgICAgICBmbXhQcm9wZXJ0eS5uYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpO1xuXG4gICAgICAgIGxldCBwcm9wVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcm9wVHlwZU5hbWUgPSBwcm9wZXJ0eS5nZXRUeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciBwcm9wZXJ0eTogJHtwcm9wZXJ0eS5nZXROYW1lKCl9LiBDb250aW51aW5nLi4uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmbXhUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShwcm9wVHlwZU5hbWUsIHByb3BlcnR5LmdldFR5cGUoKSwgcHJvcGVydHkpO1xuICAgICAgICBmbXhQcm9wZXJ0eS5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgdmlzaWJpbGl0eSAocHVibGljLCBwcml2YXRlLCBldGMuKSB0byB0aGUgZm14UHJvcGVydHlcbiAgICAgICAgZm14UHJvcGVydHkudmlzaWJpbGl0eSA9IFwiXCI7XG5cbiAgICAgICAgcHJvcGVydHkuZ2V0TW9kaWZpZXJzKCkuZm9yRWFjaChtID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAobS5nZXRUZXh0KCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFNjb3BlLlB1YmxpYzpcbiAgICAgICAgICAgICAgICAgICAgZm14UHJvcGVydHkudmlzaWJpbGl0eSA9IFwicHVibGljXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgU2NvcGUuUHJvdGVjdGVkOlxuICAgICAgICAgICAgICAgICAgICBmbXhQcm9wZXJ0eS52aXNpYmlsaXR5ID0gXCJwcm90ZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBTY29wZS5Qcml2YXRlOlxuICAgICAgICAgICAgICAgICAgICBmbXhQcm9wZXJ0eS52aXNpYmlsaXR5ID0gXCJwcml2YXRlXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdGF0aWNcIjpcbiAgICAgICAgICAgICAgICAgICAgZm14UHJvcGVydHkuaXNDbGFzc1NpZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicmVhZG9ubHlcIjpcbiAgICAgICAgICAgICAgICAgICAgZm14UHJvcGVydHkucmVhZE9ubHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFpc1NpZ25hdHVyZSAmJiBwcm9wZXJ0eS5nZXRFeGNsYW1hdGlvblRva2VuTm9kZSgpKSB7XG4gICAgICAgICAgICBmbXhQcm9wZXJ0eS5pc0RlZmluaXRlbHlBc3NpZ25lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5LmdldFF1ZXN0aW9uVG9rZW5Ob2RlKCkpIHtcbiAgICAgICAgICAgIGZteFByb3BlcnR5LmlzT3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eS5nZXROYW1lKCkuc3Vic3RyaW5nKDAsIDEpID09PSBcIiNcIikge1xuICAgICAgICAgICAgZm14UHJvcGVydHkuaXNKYXZhU2NyaXB0UHJpdmF0ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpbml0RlFOKHByb3BlcnR5LCBmbXhQcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHByb3BlcnR5LCBmbXhQcm9wZXJ0eSk7XG5cbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFByb3BlcnR5KTtcblxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteFByb3BlcnR5LHByb3BlcnR5KTtcblxuICAgICAgICByZXR1cm4gZm14UHJvcGVydHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IG1ldGhvZCBvciBhY2Nlc3NvclxuICAgICAqIEBwYXJhbSBtZXRob2QgQSBtZXRob2Qgb3IgYW4gYWNjZXNzb3JcbiAgICAgKiBAcGFyYW0gY3VycmVudENDIFRoZSBjeWNsb21hdGljIGNvbXBsZXhpdHkgbWV0cmljcyBvZiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZVxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgbWV0aG9kIG9yIHRoZSBhY2Nlc3NvclxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4TWV0aG9kKFxuICAgICAgICBtZXRob2Q6IE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IE1ldGhvZFNpZ25hdHVyZSB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICAgICAgICBjdXJyZW50Q0M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH1cbiAgICApOiBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvciB8IEZhbWl4LlBhcmFtZXRyaWNNZXRob2QgeyBcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFxcbj09PSBDcmVhdGluZy9HZXR0aW5nIE1ldGhvZCA9PT1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYE1ldGhvZCBraW5kOiAke21ldGhvZC5nZXRLaW5kTmFtZSgpfWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgTWV0aG9kIHRleHQ6ICR7bWV0aG9kLmdldFRleHQoKS5zbGljZSgwLCA1MCl9Li4uYCk7XG4gICAgICAgIGNvbnN0IGZxbiA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4obWV0aG9kKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYE1ldGhvZCBGUU46ICR7ZnFufWApO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFByb2Nlc3NpbmcgbWV0aG9kICR7ZnFufWApO1xuICAgICAgIFxuICAgIFxuICAgICAgICBsZXQgZm14TWV0aG9kID0gdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5nZXQoZnFuKSBhcyBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvciB8IEZhbWl4LlBhcmFtZXRyaWNNZXRob2Q7XG4gICAgICAgIGlmICghZm14TWV0aG9kKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnTWV0aG9kIG5vdCBmb3VuZCBpbiBtYXAsIGNyZWF0aW5nIG5ldycpO1xuICAgICAgICAgICAgY29uc3QgaXNHZW5lcmljID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIFNldEFjY2Vzc29yRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBmbXhNZXRob2QgPSBuZXcgRmFtaXguQWNjZXNzb3IoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0dldHRlciA9IG1ldGhvZCBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgaXNTZXR0ZXIgPSBtZXRob2QgaW5zdGFuY2VvZiBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChpc0dldHRlcikgeyAoZm14TWV0aG9kIGFzIEZhbWl4LkFjY2Vzc29yKS5raW5kID0gXCJnZXR0ZXJcIjsgfVxuICAgICAgICAgICAgICAgIGlmIChpc1NldHRlcikgeyAoZm14TWV0aG9kIGFzIEZhbWl4LkFjY2Vzc29yKS5raW5kID0gXCJzZXR0ZXJcIjsgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbXhNZXRob2QgPSBpc0dlbmVyaWMgPyBuZXcgRmFtaXguUGFyYW1ldHJpY01ldGhvZCgpIDogbmV3IEZhbWl4Lk1ldGhvZCgpO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgY29uc3QgaXNDb25zdHJ1Y3RvciA9IG1ldGhvZCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb247XG4gICAgICAgICAgICBjb25zdCBpc1NpZ25hdHVyZSA9IG1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZTtcbiAgICAgICAgICAgIGxldCBpc0Fic3RyYWN0ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaXNTdGF0aWMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiB8fCBtZXRob2QgaW5zdGFuY2VvZiBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIFNldEFjY2Vzc29yRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpc0Fic3RyYWN0ID0gbWV0aG9kLmlzQWJzdHJhY3QoKTtcbiAgICAgICAgICAgICAgICBpc1N0YXRpYyA9IG1ldGhvZC5pc1N0YXRpYygpO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IpIHsgKGZteE1ldGhvZCBhcyBGYW1peC5BY2Nlc3Nvcikua2luZCA9IFwiY29uc3RydWN0b3JcIjsgfVxuICAgICAgICAgICAgZm14TWV0aG9kLmlzQWJzdHJhY3QgPSBpc0Fic3RyYWN0O1xuICAgICAgICAgICAgZm14TWV0aG9kLmlzQ2xhc3NTaWRlID0gaXNTdGF0aWM7XG4gICAgICAgICAgICBmbXhNZXRob2QuaXNQcml2YXRlID0gKG1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfHwgbWV0aG9kIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbilcbiAgICAgICAgICAgICAgICA/ICEhbWV0aG9kLmdldE1vZGlmaWVycygpLmZpbmQoeCA9PiB4LmdldFRleHQoKSA9PT0gJ3ByaXZhdGUnKSA6IGZhbHNlO1xuICAgICAgICAgICAgZm14TWV0aG9kLmlzUHJvdGVjdGVkID0gKG1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfHwgbWV0aG9kIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbilcbiAgICAgICAgICAgICAgICA/ICEhbWV0aG9kLmdldE1vZGlmaWVycygpLmZpbmQoeCA9PiB4LmdldFRleHQoKSA9PT0gJ3Byb3RlY3RlZCcpIDogZmFsc2U7XG4gICAgICAgICAgICBmbXhNZXRob2Quc2lnbmF0dXJlID0gSGVscGVycy5jb21wdXRlU2lnbmF0dXJlKG1ldGhvZC5nZXRUZXh0KCkpO1xuICAgIFxuICAgICAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGlzQ29uc3RydWN0b3IgPyBcImNvbnN0cnVjdG9yXCIgOiBtZXRob2QuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgZm14TWV0aG9kLm5hbWUgPSBtZXRob2ROYW1lO1xuICAgIFxuICAgICAgICAgICAgaWYgKCFpc0NvbnN0cnVjdG9yICYmIG1ldGhvZE5hbWUuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgICAgICAgICAgICBmbXhNZXRob2QuaXNQcml2YXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZteE1ldGhvZC5pc1B1YmxpYyA9ICFmbXhNZXRob2QuaXNQcml2YXRlICYmICFmbXhNZXRob2QuaXNQcm90ZWN0ZWQ7XG4gICAgXG4gICAgICAgICAgICBmbXhNZXRob2QuY3ljbG9tYXRpY0NvbXBsZXhpdHkgPSBpc1NpZ25hdHVyZSA/IDAgOiAoY3VycmVudENDW21ldGhvZE5hbWVdIHx8IDApO1xuICAgICAgICAgICAgbGV0IG1ldGhvZFR5cGVOYW1lID0gdGhpcy5VTktOT1dOX1ZBTFVFO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBtZXRob2RUeXBlTmFtZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYE1ldGhvZCByZXR1cm4gdHlwZTogJHttZXRob2RUeXBlTmFtZX1gKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldHVybiB0eXBlIGZvciAke2Zxbn06ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBjb25zdCBmbXhUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShtZXRob2RUeXBlTmFtZSwgbWV0aG9kLmdldFR5cGUoKSwgbWV0aG9kKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBDcmVhdGVkL3JldHJpZXZlZCByZXR1cm4gdHlwZSB3aXRoIEZRTjogJHtmbXhUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcbiAgICAgICAgICAgIGZteE1ldGhvZC5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xuICAgICAgICAgICAgZm14TWV0aG9kLm51bWJlck9mTGluZXNPZkNvZGUgPSBtZXRob2QuZ2V0RW5kTGluZU51bWJlcigpIC0gbWV0aG9kLmdldFN0YXJ0TGluZU51bWJlcigpO1xuICAgICAgICAgICAgZm14TWV0aG9kLm51bWJlck9mUGFyYW1ldGVycyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkubGVuZ3RoO1xuICAgICAgICAgICAgZm14TWV0aG9kLm51bWJlck9mU3RhdGVtZW50cyA9IGlzU2lnbmF0dXJlID8gMCA6IG1ldGhvZC5nZXRTdGF0ZW1lbnRzKCkubGVuZ3RoO1xuICAgIFxuICAgICAgICAgICAgLy8gQWRkIHRvIGZhbWl4UmVwXG4gICAgICAgICAgICBpbml0RlFOKG1ldGhvZCwgZm14TWV0aG9kKTtcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhNZXRob2QpO1xuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IobWV0aG9kLCBmbXhNZXRob2QpO1xuICAgICAgICAgICAgdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5zZXQoZnFuLCBmbXhNZXRob2QpO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBBZGRlZCBtZXRob2QgJHtmcW59IHRvIGZhbWl4UmVwYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYE1ldGhvZCAke2Zxbn0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteE1ldGhvZCwgbWV0aG9kKTtcbiAgICAgICAgcmV0dXJuIGZteE1ldGhvZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gZnVuYyBBIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIGN1cnJlbnRDQyBUaGUgY3ljbG9tYXRpYyBjb21wbGV4aXR5IG1ldHJpY3Mgb2YgdGhlIGN1cnJlbnQgc291cmNlIGZpbGVcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGZ1bmN0aW9uXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhGdW5jdGlvbihmdW5jOiBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uLCBjdXJyZW50Q0M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0pOiBGYW1peC5GdW5jdGlvbiB8IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbiB7XG4gICAgICAgIGxldCBmbXhGdW5jdGlvbjogRmFtaXguRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb247XG4gICAgICAgIGNvbnN0IGlzR2VuZXJpYyA9IGZ1bmMuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oZnVuYyk7XG4gICAgICAgIGlmICghdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5oYXMoZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUpKSB7XG4gICAgICAgICAgICBpZiAoaXNHZW5lcmljKSB7XG4gICAgICAgICAgICAgICAgZm14RnVuY3Rpb24gPSBuZXcgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbXhGdW5jdGlvbiA9IG5ldyBGYW1peC5GdW5jdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGZ1bmMuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgICAgICBmbXhGdW5jdGlvbi5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZteEZ1bmN0aW9uLm5hbWUgPSBcImFub255bW91c1wiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbXhGdW5jdGlvbi5zaWduYXR1cmUgPSBIZWxwZXJzLmNvbXB1dGVTaWduYXR1cmUoZnVuYy5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgZm14RnVuY3Rpb24uY3ljbG9tYXRpY0NvbXBsZXhpdHkgPSBjdXJyZW50Q0NbZm14RnVuY3Rpb24ubmFtZV07XG4gICAgICAgICAgICBpbml0RlFOKGZ1bmMsIGZteEZ1bmN0aW9uKTtcbiAgICAgICAgICAgIC8vIGZteEZ1bmN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lO1xuICAgIFxuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZU5hbWUgPSBmdW5jLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiAke2Vycm9yfS4gRmFpbGVkIHRvIGdldCB1c2FibGUgbmFtZSBmb3IgcmV0dXJuIHR5cGUgb2YgZnVuY3Rpb246ICR7ZnVuYy5nZXROYW1lKCl9LiBDb250aW51aW5nLi4uYCk7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBjb25zdCBmbXhUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShmdW5jdGlvblR5cGVOYW1lLCBmdW5jLmdldFR5cGUoKSwgZnVuYyk7XG4gICAgICAgICAgICBmbXhGdW5jdGlvbi5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xuICAgICAgICAgICAgZm14RnVuY3Rpb24ubnVtYmVyT2ZMaW5lc09mQ29kZSA9IGZ1bmMuZ2V0RW5kTGluZU51bWJlcigpIC0gZnVuYy5nZXRTdGFydExpbmVOdW1iZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBmdW5jLmdldFBhcmFtZXRlcnMoKTtcbiAgICAgICAgICAgIGZteEZ1bmN0aW9uLm51bWJlck9mUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMubGVuZ3RoO1xuICAgICAgICAgICAgZm14RnVuY3Rpb24ubnVtYmVyT2ZTdGF0ZW1lbnRzID0gZnVuYy5nZXRTdGF0ZW1lbnRzKCkubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoZnVuYywgZm14RnVuY3Rpb24pO1xuICAgIFxuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEZ1bmN0aW9uKTtcbiAgICBcbiAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14RnVuY3Rpb24sZnVuYyk7XG5cbiAgICAgICAgICAgIHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuc2V0KGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lLCBmbXhGdW5jdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmbXhGdW5jdGlvbiA9IHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuZ2V0KGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lKSBhcyAoRmFtaXguRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZteEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBwYXJhbWV0ZXJcbiAgICAgKiBAcGFyYW0gcGFyYW0gQSBwYXJhbWV0ZXJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHBhcmFtZXRlclxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4UGFyYW1ldGVyKHBhcmFtOiBQYXJhbWV0ZXJEZWNsYXJhdGlvbik6IEZhbWl4LlBhcmFtZXRlciB7XG4gICAgICAgIGlmICh0aGlzLmZteFBhcmFtZXRlck1hcC5oYXMocGFyYW0pKSB7XG4gICAgICAgICAgICBjb25zdCByUGFyYW1ldGVyID0gdGhpcy5mbXhQYXJhbWV0ZXJNYXAuZ2V0KHBhcmFtKTtcbiAgICAgICAgICAgIGlmIChyUGFyYW1ldGVyKSB7IFxuICAgICAgICAgICAgICAgcmV0dXJuIHJQYXJhbWV0ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggcGFyYW1ldGVyICR7cGFyYW0uZ2V0TmFtZSgpfSBpcyBub3QgZm91bmQgaW4gdGhlIHBhcmFtZXRlciBtYXAuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmbXhQYXJhbSA9IG5ldyBGYW1peC5QYXJhbWV0ZXIoKTtcblxuICAgICAgICBsZXQgcGFyYW1UeXBlTmFtZSA9IHRoaXMuVU5LTk9XTl9WQUxVRTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhcmFtVHlwZU5hbWUgPSBwYXJhbS5nZXRUeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciBwYXJhbWV0ZXI6ICR7cGFyYW0uZ2V0TmFtZSgpfS4gQ29udGludWluZy4uLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUocGFyYW1UeXBlTmFtZSwgcGFyYW0uZ2V0VHlwZSgpLCBwYXJhbSk7XG4gICAgICAgIGZteFBhcmFtLmRlY2xhcmVkVHlwZSA9IGZteFR5cGU7XG4gICAgICAgIGZteFBhcmFtLm5hbWUgPSBwYXJhbS5nZXROYW1lKCk7XG5cbiAgICAgICAgaW5pdEZRTihwYXJhbSwgZm14UGFyYW0pO1xuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihwYXJhbSwgZm14UGFyYW0pO1xuXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhQYXJhbSk7XG5cbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhQYXJhbSwgcGFyYW0pO1xuICAgICAgICB0aGlzLmZteFBhcmFtZXRlck1hcC5zZXQocGFyYW0sIGZteFBhcmFtKTtcblxuICAgICAgICByZXR1cm4gZm14UGFyYW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IHR5cGUgcGFyYW1ldGVyXG4gICAgICogQHBhcmFtIHRwIEEgdHlwZSBwYXJhbWV0ZXJcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHR5cGUgcGFyYW1ldGVyXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4UGFyYW1ldGVyVHlwZSh0cDogVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKTogRmFtaXguUGFyYW1ldGVyVHlwZSB7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmbXhQYXJhbWV0ZXJUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRlclR5cGUoKTtcbiAgIFxuICAgICAgICBmbXhQYXJhbWV0ZXJUeXBlLm5hbWUgPSB0cC5nZXROYW1lKCk7ICAgICAgXG4gICAgICAgIGluaXRGUU4odHAsIGZteFBhcmFtZXRlclR5cGUpO1xuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcih0cCwgZm14UGFyYW1ldGVyVHlwZSk7XG5cbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFBhcmFtZXRlclR5cGUpO1xuXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14UGFyYW1ldGVyVHlwZSx0cCk7XG5cbiAgICAgICAgcmV0dXJuIGZteFBhcmFtZXRlclR5cGU7XG4gICAgfVxuXG5cbiAgICAvLyAvKipcbiAgICAvLyAgKiBDcmVhdGVzIGEgRmFtaXggdHlwZSBpbiB0aGUgY29udGV4dCBvZiBjb25jcmV0aXphdGlvbnNcbiAgICAvLyAgKiBAcGFyYW0gdHlwZU5hbWUgQSB0eXBlIG5hbWVcbiAgICAvLyAgKiBAcGFyYW0gZWxlbWVudCBBbiBlbGVtZW50XG4gICAgLy8gICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSB0eXBlXG4gICAgLy8gICovXG4gICAgLy8gcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZVR5cGUoZWxlbWVudDogVHlwZU5vZGUpOiBcbiAgICAvLyAgICAgRmFtaXguUGFyYW1ldGVyVHlwZSB8IEZhbWl4LlByaW1pdGl2ZVR5cGUgfCBGYW1peC5DbGFzcyB8IEZhbWl4LkludGVyZmFjZSB7XG4gICAgLy8gICAgICAgICBpZiAodGhpcy5mbXhUeXBlTWFwLmhhcyhlbGVtZW50KSkge1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHJUeXBlID0gdGhpcy5mbXhUeXBlTWFwLmdldChlbGVtZW50KTtcbiAgICAvLyAgICAgICAgICAgICBpZiAoclR5cGUpIHsgXG4gICAgLy8gICAgICAgICAgICAgICAgcmV0dXJuIHJUeXBlO1xuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggdHlwZSAke2VsZW1lbnQuZ2V0VGV4dCgpfSBpcyBub3QgZm91bmQgaW4gdGhlIHR5cGUgbWFwLmApO1xuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cblxuICAgIC8vICAgICBjb25zdCB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gPSBlbGVtZW50LmdldFN5bWJvbCgpPy5nZXREZWNsYXJhdGlvbnMoKVswXSBhcyBUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247XG4gICAgLy8gICAgIC8vIGNvbnN0IHBhcmFtZXRlclR5cGVOYW1lIDogc3RyaW5nID0gZWxlbWVudC5nZXRUZXh0KCk7XG4gICAgLy8gICAgIGNvbnN0IHBhcmFtZXRlclR5cGVOYW1lID0gZ2V0UHJpbWl0aXZlVHlwZU5hbWUoZWxlbWVudC5nZXRUeXBlKCkpIHx8IGVsZW1lbnQuZ2V0VGV4dCgpO1xuICAgIC8vICAgICBsZXQgZm14UGFyYW1ldGVyVHlwZTogRmFtaXguVHlwZSB8IEZhbWl4LkNsYXNzIHwgRmFtaXguSW50ZXJmYWNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gICAgIC8vIGdldCBhIFR5cGVSZWZlcmVuY2UgZnJvbSBhIFR5cGVOb2RlXG4gICAgLy8gICAgIGNvbnN0IHR5cGVSZWZlcmVuY2UgPSBlbGVtZW50LmdldFR5cGUoKTtcbiAgICAvLyAgICAgLy8gZ2V0IGEgVHlwZURlY2xhcmF0aW9uIGZyb20gYSBUeXBlUmVmZXJlbmNlXG4gICAgLy8gICAgIGNvbnN0IHR5cGVEZWNsYXJhdGlvbiA9IHR5cGVSZWZlcmVuY2UuZ2V0U3ltYm9sKCk/LmdldERlY2xhcmF0aW9ucygpWzBdIGFzIFRTTW9ycGhUeXBlRGVjbGFyYXRpb247XG5cbiAgICAvLyAgICAgbGV0IGlzQ2xhc3NPckludGVyZmFjZSA9IGZhbHNlO1xuICAgIC8vICAgICBpZiAodGhpcy5mbXhDbGFzc01hcC5oYXMocGFyYW1ldGVyVHlwZU5hbWUpKXtcbiAgICAvLyAgICAgICAgIHRoaXMuZm14Q2xhc3NNYXAuZm9yRWFjaCgob2JqLCBuYW1lKSA9PiB7XG4gICAgLy8gICAgICAgICAgICAgaWYob2JqIGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0NsYXNzKXtcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGVsZW1lbnQuZ2V0VGV4dCgpICYmIG9iai5nZW5lcmljUGFyYW1ldGVycy5zaXplPjApIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlclR5cGUgPSBvYmo7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpc0NsYXNzT3JJbnRlcmZhY2UgPSB0cnVlO1xuICAgIC8vICAgICAgICAgICAgICAgICB9IFxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBlbGVtZW50LmdldFRleHQoKSkge1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG9iajtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlzQ2xhc3NPckludGVyZmFjZSA9IHRydWU7XG4gICAgLy8gICAgICAgICAgICAgICAgIH0gXG4gICAgLy8gICAgICAgICAgICAgfSAgIFxuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBpZiAodGhpcy5mbXhJbnRlcmZhY2VNYXAuaGFzKHBhcmFtZXRlclR5cGVOYW1lKSl7XG4gICAgLy8gICAgICAgICB0aGlzLmZteEludGVyZmFjZU1hcC5mb3JFYWNoKChvYmosIG5hbWUpID0+IHtcbiAgICAvLyAgICAgICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKXtcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGVsZW1lbnQuZ2V0VGV4dCgpICYmIG9iai5nZW5lcmljUGFyYW1ldGVycy5zaXplPjApIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlclR5cGUgPSBvYmo7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpc0NsYXNzT3JJbnRlcmZhY2UgPSB0cnVlO1xuICAgIC8vICAgICAgICAgICAgICAgICB9IFxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBlbGVtZW50LmdldFRleHQoKSkge1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG9iajtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlzQ2xhc3NPckludGVyZmFjZSA9IHRydWU7XG4gICAgLy8gICAgICAgICAgICAgICAgIH0gXG4gICAgLy8gICAgICAgICAgICAgfSAgIFxuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBpZighaXNDbGFzc09ySW50ZXJmYWNlKXtcbiAgICAvLyAgICAgICAgIGlmICghdGhpcy5mbXhUeXBlTWFwLmhhcyh0eXBlRGVjbGFyYXRpb24pKSB7ICAgIFxuICAgIC8vICAgICAgICAgICAgIC8vIFRPRE8gcmVmYWN0b3IgXG4gICAgLy8gICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlVHlwZShwYXJhbWV0ZXJUeXBlTmFtZSkpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFByaW1pdGl2ZVR5cGUocGFyYW1ldGVyVHlwZU5hbWUpO1xuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlclR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldGVyVHlwZSgpO1xuICAgIC8vICAgICAgICAgICAgIH0gXG4gICAgXG4gICAgLy8gICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZS5uYW1lID0gcGFyYW1ldGVyVHlwZU5hbWU7XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFBhcmFtZXRlclR5cGUpO1xuICAgIC8vICAgICAgICAgICAgIHRoaXMuZm14VHlwZU1hcC5zZXQodHlwZURlY2xhcmF0aW9uLCBmbXhQYXJhbWV0ZXJUeXBlKTtcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteFBhcmFtZXRlclR5cGUsdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIGVsc2Uge1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZm14VHlwZU1hcC5nZXQodHlwZURlY2xhcmF0aW9uKTtcbiAgICAvLyAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlclR5cGUgPSByZXN1bHQ7XG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCB0eXBlICR7dHlwZURlY2xhcmF0aW9ufSBpcyBub3QgZm91bmQgaW4gdGhlIFR5cGUgbWFwLmApO1xuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBpZiAoIWZteFBhcmFtZXRlclR5cGUpIHtcbiAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZm14UGFyYW1ldGVyVHlwZSB3YXMgdW5kZWZpbmVkIGZvciBwYXJhbWV0ZXJUeXBlTmFtZSAke3BhcmFtZXRlclR5cGVOYW1lfWApO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHJldHVybiBmbXhQYXJhbWV0ZXJUeXBlO1xuICAgIC8vIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCB2YXJpYWJsZVxuICAgICAqIEBwYXJhbSB2YXJpYWJsZSBBIHZhcmlhYmxlXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSB2YXJpYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4VmFyaWFibGUodmFyaWFibGU6IFZhcmlhYmxlRGVjbGFyYXRpb24pOiBGYW1peC5WYXJpYWJsZSB7XG4gICAgICAgIGlmICh0aGlzLmZteFZhcmlhYmxlTWFwLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJWYXJpYWJsZSA9IHRoaXMuZm14VmFyaWFibGVNYXAuZ2V0KHZhcmlhYmxlKTtcbiAgICAgICAgICAgIGlmIChyVmFyaWFibGUpIHsgXG4gICAgICAgICAgICAgICByZXR1cm4gclZhcmlhYmxlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhbWl4IHBhcmFtZXRlciAke3ZhcmlhYmxlLmdldE5hbWUoKX0gaXMgbm90IGZvdW5kIGluIHRoZSB2YXJpYWJsZSBtYXAuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm14VmFyaWFibGUgPSBuZXcgRmFtaXguVmFyaWFibGUoKTtcbiAgICBcbiAgICAgICAgbGV0IHZhcmlhYmxlVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXJpYWJsZVR5cGVOYW1lID0gdmFyaWFibGUuZ2V0VHlwZSgpLmdldFRleHQoKS50cmltKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiAke2Vycm9yfS4gRmFpbGVkIHRvIGdldCB1c2FibGUgbmFtZSBmb3IgdmFyaWFibGU6ICR7dmFyaWFibGUuZ2V0TmFtZSgpfS4gQ29udGludWluZy4uLmApO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKHZhcmlhYmxlVHlwZU5hbWUsIHZhcmlhYmxlLmdldFR5cGUoKSwgdmFyaWFibGUpO1xuICAgICAgICBmbXhWYXJpYWJsZS5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xuICAgICAgICBmbXhWYXJpYWJsZS5uYW1lID0gdmFyaWFibGUuZ2V0TmFtZSgpO1xuICAgICAgICBpbml0RlFOKHZhcmlhYmxlLCBmbXhWYXJpYWJsZSk7XG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHZhcmlhYmxlLCBmbXhWYXJpYWJsZSk7XG4gICAgXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhWYXJpYWJsZSk7XG4gICAgXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14VmFyaWFibGUsdmFyaWFibGUpO1xuICAgICAgICB0aGlzLmZteFZhcmlhYmxlTWFwLnNldCh2YXJpYWJsZSwgZm14VmFyaWFibGUpO1xuICAgIFxuICAgICAgICByZXR1cm4gZm14VmFyaWFibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGVudW1cbiAgICAgKiBAcGFyYW0gZW51bUVudGl0eSBBbiBlbnVtXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBlbnVtXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhFbnVtKGVudW1FbnRpdHk6IEVudW1EZWNsYXJhdGlvbik6IEZhbWl4LkVudW0ge1xuICAgICAgICBpZiAodGhpcy5mbXhFbnVtTWFwLmhhcyhlbnVtRW50aXR5KSkge1xuICAgICAgICAgICAgY29uc3QgckVudW0gPSB0aGlzLmZteEVudW1NYXAuZ2V0KGVudW1FbnRpdHkpO1xuICAgICAgICAgICAgaWYgKHJFbnVtKSB7IFxuICAgICAgICAgICAgICAgcmV0dXJuIHJFbnVtO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhbWl4IGVudW0gJHtlbnVtRW50aXR5LmdldE5hbWUoKX0gaXMgbm90IGZvdW5kIGluIHRoZSBlbnVtIG1hcC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmbXhFbnVtID0gbmV3IEZhbWl4LkVudW0oKTtcbiAgICAgICAgZm14RW51bS5uYW1lID0gZW51bUVudGl0eS5nZXROYW1lKCk7XG4gICAgICAgIGluaXRGUU4oZW51bUVudGl0eSwgZm14RW51bSk7XG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGVudW1FbnRpdHksIGZteEVudW0pO1xuXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhFbnVtKTtcblxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEVudW0sZW51bUVudGl0eSk7XG4gICAgICAgIHRoaXMuZm14RW51bU1hcC5zZXQoZW51bUVudGl0eSwgZm14RW51bSk7XG5cbiAgICAgICAgcmV0dXJuIGZteEVudW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gZW51bU1lbWJlciBBbiBlbnVtIG1lbWJlclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgZW51bSBtZW1iZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhFbnVtVmFsdWUoZW51bU1lbWJlcjogRW51bU1lbWJlcik6IEZhbWl4LkVudW1WYWx1ZSB7XG4gICAgICAgIGNvbnN0IGZteEVudW1WYWx1ZSA9IG5ldyBGYW1peC5FbnVtVmFsdWUoKTtcblxuICAgICAgICBsZXQgZW51bVZhbHVlVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVUeXBlTmFtZSA9IGVudW1NZW1iZXIuZ2V0VHlwZSgpLmdldFRleHQoKS50cmltKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiAke2Vycm9yfS4gRmFpbGVkIHRvIGdldCB1c2FibGUgbmFtZSBmb3IgZW51bSB2YWx1ZTogJHtlbnVtTWVtYmVyLmdldE5hbWUoKX0uIENvbnRpbnVpbmcuLi5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKGVudW1WYWx1ZVR5cGVOYW1lLCBlbnVtTWVtYmVyLmdldFR5cGUoKSwgZW51bU1lbWJlcik7XG4gICAgICAgIGZteEVudW1WYWx1ZS5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xuICAgICAgICBmbXhFbnVtVmFsdWUubmFtZSA9IGVudW1NZW1iZXIuZ2V0TmFtZSgpO1xuICAgICAgICBpbml0RlFOKGVudW1NZW1iZXIsIGZteEVudW1WYWx1ZSk7XG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGVudW1NZW1iZXIsIGZteEVudW1WYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEVudW1WYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhFbnVtVmFsdWUsZW51bU1lbWJlcik7XG5cbiAgICAgICAgcmV0dXJuIGZteEVudW1WYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBkZWNvcmF0b3JcbiAgICAgKiBAcGFyYW0gZGVjb3JhdG9yIEEgZGVjb3JhdG9yXG4gICAgICogQHBhcmFtIGRlY29yYXRlZEVudGl0eSBBIGNsYXNzLCBhIG1ldGhvZCwgYSBwYXJhbWV0ZXIgb3IgYSBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgZGVjb3JhdG9yXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhEZWNvcmF0b3IoZGVjb3JhdG9yOiBEZWNvcmF0b3IsIGRlY29yYXRlZEVudGl0eTogQ2xhc3NEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFByb3BlcnR5RGVjbGFyYXRpb24pOiBGYW1peC5EZWNvcmF0b3Ige1xuICAgICAgICBjb25zdCBmbXhEZWNvcmF0b3IgPSBuZXcgRmFtaXguRGVjb3JhdG9yKCk7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvck5hbWUgPSBcIkBcIiArIGRlY29yYXRvci5nZXROYW1lKCk7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvckV4cHJlc3Npb24gPSBkZWNvcmF0b3IuZ2V0VGV4dCgpLnN1YnN0cmluZygxKTtcblxuICAgICAgICBmbXhEZWNvcmF0b3IubmFtZSA9IGRlY29yYXRvck5hbWU7XG4gICAgICAgIGZteERlY29yYXRvci5kZWNvcmF0b3JFeHByZXNzaW9uID0gZGVjb3JhdG9yRXhwcmVzc2lvbjtcbiAgICAgICAgY29uc3QgZGVjb3JhdGVkRW50aXR5RnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihkZWNvcmF0ZWRFbnRpdHkpO1xuICAgICAgICBjb25zdCBmbXhEZWNvcmF0ZWRFbnRpdHkgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWUoZGVjb3JhdGVkRW50aXR5RnVsbHlRdWFsaWZpZWROYW1lKSBhcyBGYW1peC5OYW1lZEVudGl0eTtcbiAgICAgICAgZm14RGVjb3JhdG9yLmRlY29yYXRlZEVudGl0eSA9IGZteERlY29yYXRlZEVudGl0eTtcbiAgICAgICAgaW5pdEZRTihkZWNvcmF0b3IsIGZteERlY29yYXRvcik7XG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGRlY29yYXRvciwgZm14RGVjb3JhdG9yKTtcblxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14RGVjb3JhdG9yKTtcblxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteERlY29yYXRvcixkZWNvcmF0b3IpO1xuXG4gICAgICAgIHJldHVybiBmbXhEZWNvcmF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGNvbW1lbnRcbiAgICAgKiBAcGFyYW0gY29tbWVudCBBIGNvbW1lbnRcbiAgICAgKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb21tZW50J3MgY29udGFpbmVyXG4gICAgICogQHBhcmFtIGlzSlNEb2MgQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNvbW1lbnQgaXMgYSBKU0RvY1xuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29tbWVudFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGYW1peENvbW1lbnQoY29tbWVudDogQ29tbWVudFJhbmdlLCBmbXhTY29wZTogRmFtaXguTmFtZWRFbnRpdHksIGlzSlNEb2M6IGJvb2xlYW4pOiBGYW1peC5Db21tZW50IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGA+IE5PVEU6IGNyZWF0aW5nIGNvbW1lbnQgJHtjb21tZW50LmdldFRleHQoKX0gaW4gc2NvcGUgJHtmbXhTY29wZS5uYW1lfS5gKTtcbiAgICAgICAgY29uc3QgZm14Q29tbWVudCA9IG5ldyBGYW1peC5Db21tZW50KCk7XG4gICAgICAgIGZteENvbW1lbnQuY29udGFpbmVyID0gZm14U2NvcGU7ICAvLyBhZGRzIGNvbW1lbnQgdG8gdGhlIGNvbnRhaW5lcidzIGNvbW1lbnRzIGNvbGxlY3Rpb25cbiAgICAgICAgZm14Q29tbWVudC5pc0pTRG9jID0gaXNKU0RvYztcblxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihjb21tZW50LCBmbXhDb21tZW50KTtcblxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14Q29tbWVudCk7XG5cbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhDb21tZW50LGNvbW1lbnQpO1xuXG4gICAgICAgIHJldHVybiBmbXhDb21tZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IHR5cGVcbiAgICAgKiBAcGFyYW0gdHlwZU5hbWUgQSB0eXBlIG5hbWVcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBBIHRzLW1vcnBoIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHR5cGVcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peFR5cGUodHlwZU5hbWVBcmc6IHN0cmluZywgdHNNb3JwaFR5cGU6IFR5cGUgfCB1bmRlZmluZWQsIGVsZW1lbnQ6IFRTTW9ycGhUeXBlRGVjbGFyYXRpb24pOiBGYW1peC5UeXBlIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyAob3IgZ2V0dGluZykgdHlwZTogJyR7dHNNb3JwaFR5cGU/LmdldFRleHQoKSB8fCBcInVuZGVmaW5lZFwifScgb2YgZWxlbWVudDogJyR7ZWxlbWVudD8uZ2V0VGV4dCgpLnNsaWNlKDAsIDUwKX0uLi4nIG9mIGtpbmQ6ICR7ZWxlbWVudD8uZ2V0S2luZE5hbWUoKX1gKTtcblxuICAgICAgICAvLyBjb252ZXJ0IHR5cGUgdG8gY29ycmVjdCBwcmltaXRpdmUgbmFtZSAod29ya2Fyb3VuZCBmb3IgdW5pcXVlIHN5bWJvbGUgcHJpbWl0aXZlIHR5cGUpXG4gICAgICAgIC8vIGRvbid0IGNvbnZlcnQgdG8gcHJpbWl0aXZlIGlmIGl0J3MgYSBnZW5lcmljIHR5cGVcbiAgICAgICAgY29uc3QgdHlwZU5hbWUgPSAhdHlwZU5hbWVBcmcuaW5jbHVkZXMoXCI8XCIpICYmIHRzTW9ycGhUeXBlICYmIGdldFByaW1pdGl2ZVR5cGVOYW1lKHRzTW9ycGhUeXBlKSB8fCB0eXBlTmFtZUFyZztcblxuICAgICAgICBpZiAoaXNQcmltaXRpdmVUeXBlKHR5cGVOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlT3JHZXRGYW1peFByaW1pdGl2ZVR5cGUodHlwZU5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQuaXNLaW5kKFN5bnRheEtpbmQuTWV0aG9kU2lnbmF0dXJlKSB8fCBlbGVtZW50LmlzS2luZChTeW50YXhLaW5kLk1ldGhvZERlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kRlFOID0gRlFORnVuY3Rpb25zLmdldEZRTihlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblR5cGVGUU4gPSBgJHttZXRob2RGUU4ucmVwbGFjZSgvXFxbTWV0aG9kKFNpZ25hdHVyZXxEZWNsYXJhdGlvbilcXF0kLywgJycpfVtSZXR1cm5UeXBlXWA7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIHJldHVybiB0eXBlIGluIHRoZSByZXBvc2l0b3J5XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ1R5cGUgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWUocmV0dXJuVHlwZUZRTik7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdUeXBlKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYEZvdW5kIGV4aXN0aW5nIHJldHVybiB0eXBlIHdpdGggRlFOOiAke3JldHVyblR5cGVGUU59YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nVHlwZSBhcyBGYW1peC5UeXBlO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYENyZWF0aW5nIHJldHVybiB0eXBlIHdpdGggZGlzdGluY3QgRlFOOiAke3JldHVyblR5cGVGUU59YCk7XG4gICAgICAgICAgICBjb25zdCBmbXhUeXBlID0gbmV3IEZhbWl4LlR5cGUoKTtcbiAgICAgICAgICAgIGZteFR5cGUubmFtZSA9IHR5cGVOYW1lO1xuICAgICAgICAgICAgZm14VHlwZS5mdWxseVF1YWxpZmllZE5hbWUgPSByZXR1cm5UeXBlRlFOO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTZXQgY29udGFpbmVyIChzYW1lIGFzIG1ldGhvZCdzIGNvbnRhaW5lcilcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZEFuY2VzdG9yID0gSGVscGVycy5maW5kVHlwZUFuY2VzdG9yKGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKG1ldGhvZEFuY2VzdG9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JGUU4gPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKG1ldGhvZEFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3RvciA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShhbmNlc3RvckZRTikgYXMgRmFtaXguQ29udGFpbmVyRW50aXR5O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgICAgICAgICBmbXhUeXBlLmNvbnRhaW5lciA9IGFuY2VzdG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhUeXBlKTtcbiAgICAgICAgICAgIHRoaXMuZm14VHlwZU1hcC5zZXQoZWxlbWVudCwgZm14VHlwZSk7XG4gICAgICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteFR5cGUsIGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGZteFR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc1BhcmFtZXRyaWNUeXBlID1cbiAgICAgICAgICAgIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbiAmJiBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgIChlbGVtZW50IGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24gJiYgZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgXG4gICAgICAgIGlmIChpc1BhcmFtZXRyaWNUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVPckdldEZhbWl4UGFyYW1ldHJpY1R5cGUodHlwZU5hbWUsIGVsZW1lbnQgYXMgVFNNb3JwaFBhcmFtZXRyaWNUeXBlKTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBpZiAoIXRoaXMuZm14VHlwZU1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdUeXBlIG5vdCBmb3VuZCBpbiBtYXAsIGNyZWF0aW5nIG5ldycpOyBcbiAgICAgICAgICAgIGxldCBhbmNlc3RvcjogRmFtaXguQ29udGFpbmVyRW50aXR5IHwgdW5kZWZpbmVkOyAgICBcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZUFuY2VzdG9yID0gSGVscGVycy5maW5kVHlwZUFuY2VzdG9yKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBUeXBlIGFuY2VzdG9yIGZvdW5kOiAke3R5cGVBbmNlc3Rvcj8uZ2V0S2luZE5hbWUoKX1gKTtcbiAgICBcbiAgICAgICAgICAgICAgICBpZiAodHlwZUFuY2VzdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTih0eXBlQW5jZXN0b3IpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgQW5jZXN0b3IgRlFOOiAke2FuY2VzdG9yRnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShhbmNlc3RvckZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgRmFtaXguQ29udGFpbmVyRW50aXR5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuY2VzdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUodHlwZUFuY2VzdG9yLmdldFRleHQoKSwgdHlwZUFuY2VzdG9yLmdldFR5cGUoKSwgdHlwZUFuY2VzdG9yIGFzIFRTTW9ycGhUeXBlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0FuY2VzdG9yIG5vdCBmb3VuZCBpbiByZXBvLCBjcmVhdGluZyBpdCcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZvdW5kIGFuY2VzdG9yIGluIGZhbWl4UmVwOiAke2FuY2VzdG9yLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBObyB0eXBlIGFuY2VzdG9yIGZvdW5kIGZvciAke3R5cGVOYW1lfSAtIHByb2NlZWRpbmcgd2l0aG91dCBjb250YWluZXJgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBjb25zdCBmbXhUeXBlID0gbmV3IEZhbWl4LlR5cGUoKTtcbiAgICAgICAgICAgIGZteFR5cGUubmFtZSA9IHR5cGVOYW1lO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYENyZWF0ZWQgbmV3IHR5cGUgd2l0aCBuYW1lOiAke3R5cGVOYW1lfWApOyAgICBcbiAgICAgICAgICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgICAgIGZteFR5cGUuY29udGFpbmVyID0gYW5jZXN0b3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQW5jZXN0b3Igbm90IGZvdW5kIGZvciB0eXBlICR7dHlwZU5hbWV9LmApO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgaW5pdEZRTihlbGVtZW50LCBmbXhUeXBlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBUeXBlIEZRTiBhZnRlciBpbml0OiAke2ZteFR5cGUuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoZWxlbWVudCwgZm14VHlwZSk7XG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14VHlwZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQWRkZWQgdHlwZSB0byByZXBvc2l0b3J5Jyk7XG4gICAgICAgICAgICB0aGlzLmZteFR5cGVNYXAuc2V0KGVsZW1lbnQsIGZteFR5cGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuZm14VHlwZU1hcC5nZXQoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoIWZteFR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhbWl4IHR5cGUgJHt0eXBlTmFtZX0gaXMgbm90IGZvdW5kIGluIHRoZSBUeXBlIG1hcC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbXhUeXBlO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmZteFR5cGVNYXAuZ2V0KGVsZW1lbnQpITtcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhUeXBlLCBlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIGZteFR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggdHlwZSB0aGF0IGlzIHBhcmFtZXRyaWNcbiAgICAgKiBAcGFyYW0gdHlwZU5hbWUgQSB0eXBlIG5hbWVcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBBIHRzLW1vcnBoIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHBhcmFtZXRlciB0eXBlXG4gICAgICovXG4gICAgY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRyaWNUeXBlKHR5cGVOYW1lOiBzdHJpbmcsIGVsZW1lbnQ6IFRTTW9ycGhQYXJhbWV0cmljVHlwZSk6IEZhbWl4LlR5cGUge1xuXG4gICAgICAgIGlmICh0aGlzLmZteFR5cGVNYXAuaGFzKGVsZW1lbnQpID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZteFR5cGVNYXAuZ2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggdHlwZSAke3R5cGVOYW1lfSBpcyBub3QgZm91bmQgKHVuZGVmaW5lZCkgaW4gdGhlIFR5cGUgbWFwLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBwYXJhbWV0cmljIHR5cGUgaXMgYSB0eXBlIHRoYXQgaGFzIHR5cGUgcGFyYW1ldGVycywgZS5nLiwgTGlzdDxUPlxuICAgICAgICAvLyBJbiBUUyBpdCBjYW4gYmUgYSBjbGFzcywgYW4gaW50ZXJmYWNlLCBhIGZ1bmN0aW9uLCBhbiBhcnJvdyBmdW5jdGlvbiwgb3IgYSBtZXRob2RcblxuICAgICAgICAvLyBjcmVhdGUgdGhlIEZhbWl4IFBhcmFtZXRyaWMgVHlwZSAobWF5YmUgaXQncyBqdXN0IGFuIEludGVyZmFjZSwgZXRjLilcbiAgICAgICAgbGV0IGZteFR5cGU6IEZhbWl4LlR5cGU7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNDbGFzcygpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgZm14VHlwZSA9IG5ldyBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZnVuY3Rpb25zIGFuZCBtZXRob2RzIGFyZSBub3QgdHlwZXMgXG4gICAgICAgIC8vIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbkRlY2xhcmF0aW9uKSB7XG4gICAgICAgIC8vICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbigpO1xuICAgICAgICAvLyB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnJvd0Z1bmN0aW9uKSB7XG4gICAgICAgIC8vICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNBcnJvd0Z1bmN0aW9uKCk7XG4gICAgICAgIC8vIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7XG4gICAgICAgIC8vICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNNZXRob2QoKTtcbiAgICAgICAgLy8gfSBcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgaXMgbm90IGEgY2xhc3MsIGludGVyZmFjZSwgZnVuY3Rpb24sIGFycm93IGZ1bmN0aW9uLCBvciBtZXRob2QuYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zdCBwYXJhbWV0ZXJzID0gZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpO1xuXG4gICAgICAgIC8vIC8vIGZvciBlYWNoIHBhcmFtZXRlciwgZ2V0T3JDcmVhdGUgdGhlIEZhbWl4UGFyYW1ldGVyVHlwZVxuICAgICAgICAvLyBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhQYXJhbWV0ZXJUeXBlKHBhcmFtZXRlci5nZXROYW1lKCksIHBhcmFtZXRlcik7XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyAvLyBUT0RPOiB0aGUgZm9sbG93aW5nIGNvZGUgaXMgbm90IGNvcnJlY3QsIGl0IGlzIGp1c3QgYSBwbGFjZWhvbGRlclxuICAgICAgICAvLyBjb25zdCBwYXJhbWV0ZXJUeXBlTmFtZXMgPSB0eXBlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWUuaW5kZXhPZihcIjxcIikgKyAxLCB0eXBlTmFtZS5pbmRleE9mKFwiPlwiKSlcbiAgICAgICAgLy8gICAgIC5zcGxpdChcIixcIikubWFwKHMgPT4gcy50cmltKCkpO1xuICAgICAgICAvLyBjb25zdCBiYXNlVHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUuaW5kZXhPZihcIjxcIikpLnRyaW0oKTtcbiAgICAgICAgLy8gcGFyYW1ldGVyVHlwZU5hbWVzLmZvckVhY2gocGFyYW1ldGVyVHlwZU5hbWUgPT4ge1xuICAgICAgICAvLyAgICAgY29uc3QgZm14UGFyYW1ldGVyVHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRlclR5cGUocGFyYW1ldGVyVHlwZU5hbWUsIGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgKGZteFR5cGUgYXMgRmFtaXguUGFyYW1ldGVyVHlwZSkuYWRkQXJndW1lbnQoZm14UGFyYW1ldGVyVHlwZSk7XG4gICAgICAgIC8vIH0pO1xuICAgICAgICAvLyBjb25zdCBmbXhCYXNlVHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoYmFzZVR5cGVOYW1lLCBlbGVtZW50KTtcblxuICAgICAgICAvLyAoZm14VHlwZSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlKS5iYXNlVHlwZSA9IGZteEJhc2VUeXBlO1xuXG4gICAgICAgIGZteFR5cGUubmFtZSA9IHR5cGVOYW1lO1xuICAgICAgICBpbml0RlFOKGVsZW1lbnQsIGZteFR5cGUpO1xuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14VHlwZSk7XG4gICAgICAgIHRoaXMuZm14VHlwZU1hcC5zZXQoZWxlbWVudCwgZm14VHlwZSk7XG4gICAgICAgIHJldHVybiBmbXhUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0eXBlIGZvciBhIHBhcmFtZXRlciBpbiBhIHBhcmFtZXRyaWMgdHlwZSwgZS5nLiwgVCBpbiBMaXN0PFQ+XG4gICAgICogQHBhcmFtIHBhcmFtZXRlclR5cGVOYW1lIFxuICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBUeXBlU2NyaXB0IGVsZW1lbnQgKFRTTW9ycGhQYXJhbWV0cmljVHlwZSkgdGhhdCB0aGUgdHlwZSBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICAvLyBjcmVhdGVPckdldEZhbWl4UGFyYW1ldGVyVHlwZShwYXJhbWV0ZXJUeXBlTmFtZTogc3RyaW5nLCBlbGVtZW50OiBQYXJhbWV0ZXJEZWNsYXJhdGlvbikge1xuICAgIC8vICAgICBpZiAodGhpcy5mbXhUeXBlTWFwLmhhcyhlbGVtZW50KSkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuZm14VHlwZU1hcC5nZXQoZWxlbWVudCkgYXMgRmFtaXguUGFyYW1ldGVyVHlwZTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIC8vIGRldGVybWluZSBpZiBlbGVtZW50IGlzIGEgXG4gICAgLy8gICAgIGNvbnN0IGZteFR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldGVyVHlwZSgpO1xuICAgIC8vICAgICAvLyBjb25zdCBwYXJhbWV0ZXJUeXBlTmFtZXMgPSB0eXBlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWUuaW5kZXhPZihcIjxcIikgKyAxLCB0eXBlTmFtZS5pbmRleE9mKFwiPlwiKSlcbiAgICAvLyAgICAgLy8gICAgIC5zcGxpdChcIixcIikubWFwKHMgPT4gcy50cmltKCkpO1xuICAgIC8vICAgICAvLyBjb25zdCBiYXNlVHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUuaW5kZXhPZihcIjxcIikpLnRyaW0oKTtcbiAgICAvLyAgICAgLy8gcGFyYW1ldGVyVHlwZU5hbWVzLmZvckVhY2gocGFyYW1ldGVyVHlwZU5hbWUgPT4ge1xuICAgIC8vICAgICAvLyAgICAgY29uc3QgZm14UGFyYW1ldGVyVHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRlclR5cGUocGFyYW1ldGVyVHlwZU5hbWUsIGVsZW1lbnQpO1xuICAgIC8vICAgICAvLyAgICAgKGZteFR5cGUgYXMgRmFtaXguUGFyYW1ldGVyVHlwZSkuYWRkQXJndW1lbnQoZm14UGFyYW1ldGVyVHlwZSk7XG4gICAgLy8gICAgIC8vIH0pO1xuICAgIC8vICAgICBjb25zdCBmbXhCYXNlVHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoYmFzZVR5cGVOYW1lLCBlbGVtZW50KTtcbiAgICAvLyAgICAgKGZteFR5cGUgYXMgRmFtaXguUGFyYW1ldGVyVHlwZSkuYmFzZVR5cGUgPSBmbXhCYXNlVHlwZTtcbiAgICAvLyAgICAgaW5pdEZRTihlbGVtZW50LCBmbXhUeXBlKTtcbiAgICAvLyAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFR5cGUpO1xuICAgIC8vICAgICB0aGlzLmZteFR5cGVNYXAuc2V0KGVsZW1lbnQsIGZteFR5cGUpO1xuICAgIC8vICAgICByZXR1cm4gZm14VHlwZTtcbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBwcmltaXRpdmUgdHlwZVxuICAgICAqIEBwYXJhbSB0eXBlTmFtZSBBIHR5cGUgbmFtZVxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgcHJpbWl0aXZlIHR5cGVcbiAgICAgKi9cbiAgICBjcmVhdGVPckdldEZhbWl4UHJpbWl0aXZlVHlwZSh0eXBlTmFtZTogc3RyaW5nKTogRmFtaXguUHJpbWl0aXZlVHlwZSB7XG4gICAgICAgIGxldCBmbXhUeXBlOiBGYW1peC5QcmltaXRpdmVUeXBlID0gbmV3IEZhbWl4LlByaW1pdGl2ZVR5cGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmZteFByaW1pdGl2ZVR5cGVNYXAuaGFzKHR5cGVOYW1lKSkge1xuICAgICAgICAgICAgZm14VHlwZSA9IG5ldyBGYW1peC5QcmltaXRpdmVUeXBlKCk7XG4gICAgICAgICAgICBmbXhUeXBlLmlzU3R1YiA9IHRydWU7XG4gICAgICAgICAgICBmbXhUeXBlLm5hbWUgPSB0eXBlTmFtZTtcbiAgICAgICAgICAgIGZteFR5cGUuZnVsbHlRdWFsaWZpZWROYW1lID0gdHlwZU5hbWUgKyBcIltQcmltaXRpdmVUeXBlXVwiO1xuICAgICAgICAgICAgdGhpcy5mbXhQcmltaXRpdmVUeXBlTWFwLnNldCh0eXBlTmFtZSwgZm14VHlwZSk7XG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14VHlwZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmbXhUeXBlID0gdGhpcy5mbXhQcmltaXRpdmVUeXBlTWFwLmdldCh0eXBlTmFtZSkgYXMgRmFtaXguUHJpbWl0aXZlVHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm14VHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggYWNjZXNzXG4gICAgICogQHBhcmFtIG5vZGUgQSBub2RlXG4gICAgICogQHBhcmFtIGlkIEFuIGlkIG9mIGEgcGFyYW1ldGVyLCBhIHZhcmlhYmxlLCBhIHByb3BlcnR5IG9yIGFuIGVudW0gbWVtYmVyXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4QWNjZXNzKG5vZGU6IElkZW50aWZpZXIsIGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm14VmFyID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5SWQoaWQpIGFzIEZhbWl4LlN0cnVjdHVyYWxFbnRpdHk7XG4gICAgICAgIGlmICghZm14VmFyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhbWl4IGVudGl0eSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCwgZm9yIG5vZGUgJHtub2RlLmdldFRleHQoKX0gaW4gJHtub2RlLmdldFNvdXJjZUZpbGUoKS5nZXRCYXNlTmFtZSgpfSBhdCBsaW5lICR7bm9kZS5nZXRTdGFydExpbmVOdW1iZXIoKX0uYCk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBGYW1peEFjY2Vzcy4gTm9kZTogWyR7bm9kZS5nZXRLaW5kTmFtZSgpfV0gJyR7bm9kZS5nZXRUZXh0KCl9JyBhdCBsaW5lICR7bm9kZS5nZXRTdGFydExpbmVOdW1iZXIoKX0gaW4gJHtub2RlLmdldFNvdXJjZUZpbGUoKS5nZXRCYXNlTmFtZSgpfSwgaWQ6ICR7aWR9IHJlZmVycyB0byBmbXhWYXIgJyR7Zm14VmFyLmZ1bGx5UXVhbGlmaWVkTmFtZX0nLmApO1xuICAgIFxuICAgICAgICBjb25zdCBub2RlUmVmZXJlbmNlQW5jZXN0b3IgPSBIZWxwZXJzLmZpbmRBbmNlc3Rvcihub2RlKTtcbiAgICAgICAgaWYgKCFub2RlUmVmZXJlbmNlQW5jZXN0b3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm8gYW5jZXN0b3IgZm91bmQgZm9yIG5vZGUgJyR7bm9kZS5nZXRUZXh0KCl9J2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIGNvbnN0IGFuY2VzdG9yRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihub2RlUmVmZXJlbmNlQW5jZXN0b3IpO1xuICAgICAgICBjb25zdCBhY2Nlc3NvciA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShhbmNlc3RvckZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgRmFtaXguQ29udGFpbmVyRW50aXR5O1xuICAgICAgICBpZiAoIWFjY2Vzc29yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEFuY2VzdG9yICR7YW5jZXN0b3JGdWxseVF1YWxpZmllZE5hbWV9IG9mIGtpbmQgJHtub2RlUmVmZXJlbmNlQW5jZXN0b3IuZ2V0S2luZE5hbWUoKX0gbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBCYWlsIG91dCBmb3Igbm93XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kIGFjY2Vzc29yIHRvIGJlICR7YWNjZXNzb3IuZnVsbHlRdWFsaWZpZWROYW1lfS5gKTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICAvLyBFbnN1cmUgYWNjZXNzb3IgaXMgYSBtZXRob2QsIGZ1bmN0aW9uLCBzY3JpcHQsIG9yIG1vZHVsZVxuICAgICAgICBpZiAoIShhY2Nlc3NvciBpbnN0YW5jZW9mIEZhbWl4Lk1ldGhvZCkgJiYgIShhY2Nlc3NvciBpbnN0YW5jZW9mIEZhbWl4LkFycm93RnVuY3Rpb24pICYmICEoYWNjZXNzb3IgaW5zdGFuY2VvZiBGYW1peC5GdW5jdGlvbikgJiYgIShhY2Nlc3NvciBpbnN0YW5jZW9mIEZhbWl4LlNjcmlwdEVudGl0eSkgJiYgIShhY2Nlc3NvciBpbnN0YW5jZW9mIEZhbWl4Lk1vZHVsZSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgQWNjZXNzb3IgJHthY2Nlc3Nvci5mdWxseVF1YWxpZmllZE5hbWV9IGlzIG5vdCBhIG1ldGhvZCwgZnVuY3Rpb24sIGV0Yy5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICAvLyBBdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgIGNvbnN0IGZvdW5kQWNjZXNzID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEFjY2Vzc0J5QWNjZXNzb3JBbmRWYXJpYWJsZShhY2Nlc3NvciwgZm14VmFyKTtcbiAgICAgICAgaWYgKGZvdW5kQWNjZXNzKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZhbWl4QWNjZXNzIGFscmVhZHkgZXhpc3RzIGZvciBhY2Nlc3NvciAke2FjY2Vzc29yLmZ1bGx5UXVhbGlmaWVkTmFtZX0gYW5kIHZhcmlhYmxlICR7Zm14VmFyLmZ1bGx5UXVhbGlmaWVkTmFtZX0uYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgY29uc3QgZm14QWNjZXNzID0gbmV3IEZhbWl4LkFjY2VzcygpO1xuICAgICAgICBmbXhBY2Nlc3MuYWNjZXNzb3IgPSBhY2Nlc3NvcjtcbiAgICAgICAgZm14QWNjZXNzLnZhcmlhYmxlID0gZm14VmFyO1xuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14QWNjZXNzKTtcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhBY2Nlc3MsIG5vZGUpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYENyZWF0ZWQgYWNjZXNzOiAke2FjY2Vzc29yLmZ1bGx5UXVhbGlmaWVkTmFtZX0gLT4gJHtmbXhWYXIuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBpbnZvY2F0aW9uXG4gICAgICogQHBhcmFtIG5vZGVSZWZlcnJpbmdUb0ludm9jYWJsZSBBIG5vZGVcbiAgICAgKiBAcGFyYW0gaW52b2NhYmxlIEEgbWV0aG9kIG9yIGEgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGZ1bmN0aW9uXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4SW52b2NhdGlvbihub2RlUmVmZXJyaW5nVG9JbnZvY2FibGU6IElkZW50aWZpZXIsIGludm9jYWJsZTogSW52b2NhYmxlVHlwZSwgaWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBmbXhJbnZvY2FibGUgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlJZChpZCkgYXMgRmFtaXguQmVoYXZpb3JhbEVudGl0eTtcbiAgICAgICAgLy8gc2luY2UgdGhlIG5vZGUgaXMgaW4gdGhlIEFTVCwgd2UgbmVlZCB0byBmaW5kIHRoZSBhbmNlc3RvciB0aGF0IGlzIGluIHRoZSBGYW1peCBtb2RlbFxuICAgICAgICBjb25zdCBjb250YWluZXJPZk5vZGUgPSBIZWxwZXJzLmZpbmRBbmNlc3Rvcihub2RlUmVmZXJyaW5nVG9JbnZvY2FibGUpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kIGNvbnRhaW5lciAoYW5jZXN0b3IpICR7Y29udGFpbmVyT2ZOb2RlLmdldEtpbmROYW1lKCl9IGZvciBBU1Qgbm9kZSAke25vZGVSZWZlcnJpbmdUb0ludm9jYWJsZS5nZXRUZXh0KCl9LmApO1xuICAgICAgICBjb25zdCBjb250YWluZXJGUU4gPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGNvbnRhaW5lck9mTm9kZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgY29udGFpbmVyRlFOICR7Y29udGFpbmVyRlFOfS5gKTtcbiAgICAgICAgbGV0IHNlbmRlciA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShjb250YWluZXJGUU4pIGFzIEZhbWl4LkNvbnRhaW5lckVudGl0eTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBGb3VuZCBhIHNlbmRlciB0aGF0IG1hdGNoZXMgJHtzZW5kZXIuZnVsbHlRdWFsaWZpZWROYW1lfS5gKTtcbiAgICAgICAgaWYgKHNlbmRlciBpbnN0YW5jZW9mIEZhbWl4LlR5cGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gdGhpcyBtaWdodCBiZSBhbiBlcnJvciBpbiBnZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYE9vcHMhIFNlbmRlciBpcyBhIHR5cGUsIHdoaWNoIGlzIG5vdCB2YWxpZCBmb3IgYW4gSW52b2NhdGlvbi4gVHJ5aW5nIHRvIGZpbmQgYSBjb250YWluZXIgZm9yICR7c2VuZGVyLmZ1bGx5UXVhbGlmaWVkTmFtZX0uYCk7XG4gICAgICAgICAgICBjb25zdCBzZW5kZXJDb250YWluZXIgPSBzZW5kZXIuY29udGFpbmVyO1xuICAgICAgICAgICAgaWYgKHNlbmRlckNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHNlbmRlciA9IHNlbmRlckNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWNlaXZlckZ1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oaW52b2NhYmxlLmdldFBhcmVudCgpKTtcbiAgICAgICAgY29uc3QgcmVjZWl2ZXIgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWUocmVjZWl2ZXJGdWxseVF1YWxpZmllZE5hbWUpIGFzIEZhbWl4Lk5hbWVkRW50aXR5O1xuXG4gICAgICAgIGNvbnN0IGZteEludm9jYXRpb24gPSBuZXcgRmFtaXguSW52b2NhdGlvbigpO1xuICAgICAgICBmbXhJbnZvY2F0aW9uLnNlbmRlciA9IHNlbmRlcjtcbiAgICAgICAgZm14SW52b2NhdGlvbi5yZWNlaXZlciA9IHJlY2VpdmVyO1xuICAgICAgICBmbXhJbnZvY2F0aW9uLmFkZENhbmRpZGF0ZShmbXhJbnZvY2FibGUpO1xuICAgICAgICBmbXhJbnZvY2F0aW9uLnNpZ25hdHVyZSA9IGZteEludm9jYWJsZS5zaWduYXR1cmU7XG5cbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEludm9jYXRpb24pO1xuXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14SW52b2NhdGlvbixub2RlUmVmZXJyaW5nVG9JbnZvY2FibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBpbmhlcml0YW5jZVxuICAgICAqIEBwYXJhbSBiYXNlQ2xhc3NPckludGVyZmFjZSBBIGNsYXNzIG9yIGFuIGludGVyZmFjZSAoc3ViY2xhc3MpXG4gICAgICogQHBhcmFtIGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UgVGhlIGluaGVyaXRlZCBjbGFzcyBvciBpbnRlcmZhY2UgKHN1cGVyY2xhc3MpXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhJbmhlcml0YW5jZShiYXNlQ2xhc3NPckludGVyZmFjZTogQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uLCBpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlOiBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBGYW1peEluaGVyaXRhbmNlIGZvciAke2Jhc2VDbGFzc09ySW50ZXJmYWNlLmdldFRleHQoKX0gYW5kICR7aW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZS5nZXRUZXh0KCl9IFske2luaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UuY29uc3RydWN0b3IubmFtZX1dLmApO1xuICAgICAgICBjb25zdCBmbXhJbmhlcml0YW5jZSA9IG5ldyBGYW1peC5Jbmhlcml0YW5jZSgpO1xuXG4gICAgICAgIGxldCBzdWJDbGFzczogRmFtaXguQ2xhc3MgfCBGYW1peC5JbnRlcmZhY2UgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChiYXNlQ2xhc3NPckludGVyZmFjZSBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIHN1YkNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3MoYmFzZUNsYXNzT3JJbnRlcmZhY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoYmFzZUNsYXNzT3JJbnRlcmZhY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdWJDbGFzcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdWJjbGFzcyAke2Jhc2VDbGFzc09ySW50ZXJmYWNlfSBub3QgZm91bmQgaW4gQ2xhc3Mgb3IgSW50ZXJmYWNlIG1hcHMuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3VwZXJDbGFzczogRmFtaXguQ2xhc3MgfCBGYW1peC5JbnRlcmZhY2UgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3MoaW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlKGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UpO1xuICAgICAgICB9IGVsc2UgIHtcbiAgICAgICAgICAgIC8vIGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UgaW5zdGFuY2VvZiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcbiAgICAgICAgICAgIC8vIG11c3QgZGV0ZXJtaW5lIGlmIGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UgaXMgYSBjbGFzcyBvciBhbiBpbnRlcmZhY2VcbiAgICAgICAgICAgIC8vIHRoZW4gZmluZCB0aGUgZGVjbGFyYXRpb24sIGVsc2UgaXQncyBhIHN0dWJcblxuICAgICAgICAgICAgY29uc3QgaGVyaXRhZ2VDbGF1c2UgPSBpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlLmdldFBhcmVudCgpO1xuICAgICAgICAgICAgaWYgKGhlcml0YWdlQ2xhdXNlIGluc3RhbmNlb2YgSGVyaXRhZ2VDbGF1c2UpIHtcbiAgICAgICAgICAgICAgICAvLyBjYXNlczogMSkgY2xhc3MgZXh0ZW5kcyBjbGFzcywgMikgY2xhc3MgaW1wbGVtZW50cyBpbnRlcmZhY2UsIDMpIGludGVyZmFjZSBleHRlbmRzIGludGVyZmFjZVxuXG4gICAgICAgICAgICAgICAgLy8gY2xhc3MgZXh0ZW5kcyBjbGFzc1xuICAgICAgICAgICAgICAgIGlmIChoZXJpdGFnZUNsYXVzZS5nZXRUZXh0KCkuc3RhcnRzV2l0aChcImV4dGVuZHNcIikgJiYgYmFzZUNsYXNzT3JJbnRlcmZhY2UgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzRGVjbGFyYXRpb24gPSBnZXRJbnRlcmZhY2VPckNsYXNzRGVjbGFyYXRpb25Gcm9tRXhwcmVzc2lvbihpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzRGVjbGFyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBjbGFzc0RlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peENsYXNzKGNsYXNzRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBDbGFzcyBkZWNsYXJhdGlvbiBub3QgZm91bmQgZm9yICR7aW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZS5nZXRUZXh0KCl9LmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peENsYXNzU3R1Yihpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVyaXRhZ2VDbGF1c2UuZ2V0VGV4dCgpLnN0YXJ0c1dpdGgoXCJpbXBsZW1lbnRzXCIpICYmIGJhc2VDbGFzc09ySW50ZXJmYWNlIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbiAvLyBjbGFzcyBpbXBsZW1lbnRzIGludGVyZmFjZVxuICAgICAgICAgICAgICAgICAgICB8fCAoaGVyaXRhZ2VDbGF1c2UuZ2V0VGV4dCgpLnN0YXJ0c1dpdGgoXCJleHRlbmRzXCIpICYmIGJhc2VDbGFzc09ySW50ZXJmYWNlIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pKSB7IC8vIGludGVyZmFjZSBleHRlbmRzIGludGVyZmFjZVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVyZmFjZU9yQ2xhc3NEZWNsYXJhdGlvbiA9IGdldEludGVyZmFjZU9yQ2xhc3NEZWNsYXJhdGlvbkZyb21FeHByZXNzaW9uKGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlT3JDbGFzc0RlY2xhcmF0aW9uICE9PSB1bmRlZmluZWQgJiYgaW50ZXJmYWNlT3JDbGFzc0RlY2xhcmF0aW9uIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoaW50ZXJmYWNlT3JDbGFzc0RlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgSW50ZXJmYWNlIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCBmb3IgJHtpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlLmdldFRleHQoKX0uYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlU3R1Yihpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcihgUGFyZW50IG9mICR7aW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZS5nZXRUZXh0KCl9IGlzIG5vdCBhIGNsYXNzIG9yIGFuIGludGVyZmFjZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBQYXJlbnQgb2YgJHtpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlLmdldFRleHQoKX0gaXMgbm90IGEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlLmApO1xuICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlU3R1Yihpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSGVyaXRhZ2UgY2xhdXNlIG5vdCBmb3VuZCBmb3IgJHtpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlLmdldFRleHQoKX0uYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoc3VwZXJDbGFzcywgaW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSk7XG5cbiAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoaW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSwgc3VwZXJDbGFzcyk7XG5cbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KHN1cGVyQ2xhc3MpO1xuXG4gICAgICAgIGZteEluaGVyaXRhbmNlLnN1YmNsYXNzID0gc3ViQ2xhc3M7XG4gICAgICAgIGZteEluaGVyaXRhbmNlLnN1cGVyY2xhc3MgPSBzdXBlckNsYXNzO1xuXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhJbmhlcml0YW5jZSk7XG4gICAgICAgIC8vIG5vIEZRTiBmb3IgaW5oZXJpdGFuY2VcblxuICAgICAgICAvLyBXZSBkb24ndCBtYXAgaW5oZXJpdGFuY2UgdG8gdGhlIHNvdXJjZSBjb2RlIGVsZW1lbnQgYmVjYXVzZSB0aGVyZSBhcmUgdHdvIGVsZW1lbnRzIChzdXBlciwgc3ViKVxuICAgICAgICAvLyB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEluaGVyaXRhbmNlLCBudWxsKTtcblxuICAgIH1cbiAgICBjcmVhdGVPckdldEZhbWl4Q2xhc3NTdHViKHVucmVzb2x2ZWRJbmhlcml0ZWRDbGFzczogRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKTogRmFtaXguQ2xhc3Mge1xuICAgICAgICAvLyBtYWtlIGEgRlFOIGZvciB0aGUgc3R1YlxuICAgICAgICBjb25zdCBmcW4gPSBGUU5GdW5jdGlvbnMuZ2V0RlFOVW5yZXNvbHZlZEluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UodW5yZXNvbHZlZEluaGVyaXRlZENsYXNzKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBjcmVhdGVPckdldEZhbWl4Q2xhc3NTdHViOiBmcW46ICR7ZnFufWApO1xuICAgICAgICBjb25zdCBmbXhDbGFzcyA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShmcW4pIGFzIEZhbWl4LkNsYXNzO1xuICAgICAgICBpZiAoZm14Q2xhc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBmbXhDbGFzcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0dWIgPSBuZXcgRmFtaXguQ2xhc3MoKTtcbiAgICAgICAgICAgIHN0dWIubmFtZSA9IHVucmVzb2x2ZWRJbmhlcml0ZWRDbGFzcy5nZXRUZXh0KCk7XG4gICAgICAgICAgICBzdHViLmlzU3R1YiA9IHRydWU7XG4gICAgICAgICAgICBzdHViLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZxbjtcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChzdHViKTtcbiAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoc3R1YiwgdW5yZXNvbHZlZEluaGVyaXRlZENsYXNzKTtcbiAgICAgICAgICAgIHJldHVybiBzdHViO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZVN0dWIodW5yZXNvbHZlZEluaGVyaXRlZEludGVyZmFjZTogRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKTogRmFtaXguSW50ZXJmYWNlIHtcbiAgICAgICAgLy8gbWFrZSBhIEZRTiBmb3IgdGhlIHN0dWJcbiAgICAgICAgY29uc3QgZnFuID0gRlFORnVuY3Rpb25zLmdldEZRTlVucmVzb2x2ZWRJbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlKHVucmVzb2x2ZWRJbmhlcml0ZWRJbnRlcmZhY2UpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYGNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2VTdHViOiBmcW46ICR7ZnFufWApO1xuICAgICAgICBjb25zdCBmbXhJbnRlcmZhY2UgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWUoZnFuKSBhcyBGYW1peC5JbnRlcmZhY2U7XG4gICAgICAgIGlmIChmbXhJbnRlcmZhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmbXhJbnRlcmZhY2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdHViID0gbmV3IEZhbWl4LkludGVyZmFjZSgpO1xuICAgICAgICAgICAgc3R1Yi5uYW1lID0gdW5yZXNvbHZlZEluaGVyaXRlZEludGVyZmFjZS5nZXRUZXh0KCk7XG4gICAgICAgICAgICBzdHViLmlzU3R1YiA9IHRydWU7XG4gICAgICAgICAgICBzdHViLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZxbjtcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChzdHViKTtcbiAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoc3R1YiwgdW5yZXNvbHZlZEluaGVyaXRlZEludGVyZmFjZSk7XG4gICAgICAgICAgICByZXR1cm4gc3R1YjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVGYW1peEltcG9ydENsYXVzZShpbXBvcnRlZEVudGl0eTogRmFtaXguTmFtZWRFbnRpdHksIGltcG9ydGluZ0VudGl0eTogRmFtaXguTW9kdWxlKSB7XG4gICAgICAgIGNvbnN0IGZteEltcG9ydENsYXVzZSA9IG5ldyBGYW1peC5JbXBvcnRDbGF1c2UoKTtcbiAgICAgICAgZm14SW1wb3J0Q2xhdXNlLmltcG9ydGVkRW50aXR5ID0gaW1wb3J0ZWRFbnRpdHk7XG4gICAgICAgIGZteEltcG9ydENsYXVzZS5pbXBvcnRpbmdFbnRpdHkgPSBpbXBvcnRpbmdFbnRpdHk7XG4gICAgICAgIGltcG9ydGluZ0VudGl0eS5hZGRPdXRnb2luZ0ltcG9ydChmbXhJbXBvcnRDbGF1c2UpO1xuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14SW1wb3J0Q2xhdXNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggaW1wb3J0IGNsYXVzZVxuICAgICAqIEBwYXJhbSBpbXBvcnRDbGF1c2VJbmZvIFRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY3JlYXRlIGEgRmFtaXggaW1wb3J0IGNsYXVzZVxuICAgICAqIEBwYXJhbSBpbXBvcnREZWNsYXJhdGlvbiBUaGUgaW1wb3J0IGRlY2xhcmF0aW9uXG4gICAgICogQHBhcmFtIGltcG9ydGVyIEEgc291cmNlIGZpbGUgd2hpY2ggaXMgYSBtb2R1bGVcbiAgICAgKiBAcGFyYW0gbW9kdWxlU3BlY2lmaWVyRmlsZVBhdGggVGhlIHBhdGggb2YgdGhlIG1vZHVsZSB3aGVyZSB0aGUgZXhwb3J0IGRlY2xhcmF0aW9uIGlzXG4gICAgICogQHBhcmFtIGltcG9ydEVsZW1lbnQgVGhlIGltcG9ydGVkIGVudGl0eVxuICAgICAqIEBwYXJhbSBpc0luRXhwb3J0cyBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgaW1wb3J0ZWQgZW50aXR5IGlzIGluIHRoZSBleHBvcnRzXG4gICAgICogQHBhcmFtIGlzRGVmYXVsdEV4cG9ydCBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgaW1wb3J0ZWQgZW50aXR5IGlzIGEgZGVmYXVsdCBleHBvcnRcbiAgICAgKi9cbiAgICBwdWJsaWMgb2xkQ3JlYXRlT3JHZXRGYW1peEltcG9ydENsYXVzZShpbXBvcnRDbGF1c2VJbmZvOiB7aW1wb3J0RGVjbGFyYXRpb24/OiBJbXBvcnREZWNsYXJhdGlvbiB8IEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uLCBpbXBvcnRlclNvdXJjZUZpbGU6IFNvdXJjZUZpbGUsIG1vZHVsZVNwZWNpZmllckZpbGVQYXRoOiBzdHJpbmcsIGltcG9ydEVsZW1lbnQ6IEltcG9ydFNwZWNpZmllciB8IElkZW50aWZpZXIsIGlzSW5FeHBvcnRzOiBib29sZWFuLCBpc0RlZmF1bHRFeHBvcnQ6IGJvb2xlYW59KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHtpbXBvcnREZWNsYXJhdGlvbiwgaW1wb3J0ZXJTb3VyY2VGaWxlOiBpbXBvcnRlciwgbW9kdWxlU3BlY2lmaWVyRmlsZVBhdGgsIGltcG9ydEVsZW1lbnQsIGlzSW5FeHBvcnRzLCBpc0RlZmF1bHRFeHBvcnR9ID0gaW1wb3J0Q2xhdXNlSW5mbztcbiAgICAgICAgaWYgKGltcG9ydERlY2xhcmF0aW9uICYmIHRoaXMuZm14SW1wb3J0Q2xhdXNlTWFwLmhhcyhpbXBvcnREZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHJJbXBvcnRDbGF1c2UgPSB0aGlzLmZteEltcG9ydENsYXVzZU1hcC5nZXQoaW1wb3J0RGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgaWYgKHJJbXBvcnRDbGF1c2UpIHsgXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBJbXBvcnQgY2xhdXNlICR7aW1wb3J0RWxlbWVudC5nZXRUZXh0KCl9IGFscmVhZHkgZXhpc3RzIGluIG1hcCwgc2tpcHBpbmcuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydCBjbGF1c2UgJHtpbXBvcnRFbGVtZW50LmdldFRleHQoKX0gaXMgbm90IGZvdW5kIGluIHRoZSBpbXBvcnQgY2xhdXNlIG1hcC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsb2dnZXIuaW5mbyhgY3JlYXRpbmcgYSBuZXcgRmFtaXhJbXBvcnRDbGF1c2UgZm9yICR7aW1wb3J0RGVjbGFyYXRpb24/LmdldFRleHQoKX0gaW4gJHtpbXBvcnRlci5nZXRCYXNlTmFtZSgpfS5gKTtcbiAgICAgICAgY29uc3QgZm14SW1wb3J0Q2xhdXNlID0gbmV3IEZhbWl4LkltcG9ydENsYXVzZSgpO1xuICAgIFxuICAgICAgICBsZXQgaW1wb3J0ZWRFbnRpdHk6IEZhbWl4Lk5hbWVkRW50aXR5IHwgRmFtaXguU3RydWN0dXJhbEVudGl0eSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGltcG9ydGVkRW50aXR5TmFtZTogc3RyaW5nO1xuICAgIFxuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGhQcm9qZWN0ID0gdGhpcy5mYW1peFJlcC5nZXRBYnNvbHV0ZVBhdGgoKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgubm9ybWFsaXplKG1vZHVsZVNwZWNpZmllckZpbGVQYXRoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBjcmVhdGVGYW1peEltcG9ydENsYXVzZTogYWJzb2x1dGVQYXRoOiAke2Fic29sdXRlUGF0aH1gKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBjcmVhdGVGYW1peEltcG9ydENsYXVzZTogY29udmVydFRvUmVsYXRpdmVQYXRoOiAke3RoaXMuY29udmVydFRvUmVsYXRpdmVQYXRoKGFic29sdXRlUGF0aCwgYWJzb2x1dGVQYXRoUHJvamVjdCl9YCk7XG4gICAgICAgIGNvbnN0IHBhdGhJblByb2plY3Q6IHN0cmluZyA9IHRoaXMuY29udmVydFRvUmVsYXRpdmVQYXRoKGFic29sdXRlUGF0aCwgYWJzb2x1dGVQYXRoUHJvamVjdCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2U6IHBhdGhJblByb2plY3Q6ICR7cGF0aEluUHJvamVjdH1gKTtcbiAgICAgICAgbGV0IHBhdGhOYW1lID0gXCJ7XCIgKyBwYXRoSW5Qcm9qZWN0ICsgXCJ9LlwiO1xuICAgICAgICBsb2dnZXIuZGVidWcoYGNyZWF0ZUZhbWl4SW1wb3J0Q2xhdXNlOiBwYXRoTmFtZTogJHtwYXRoTmFtZX1gKTtcbiAgICBcbiAgICAgICAgaWYgKGltcG9ydERlY2xhcmF0aW9uIGluc3RhbmNlb2YgSW1wb3J0RGVjbGFyYXRpb24gXG4gICAgICAgICAgICAmJiBpbXBvcnRFbGVtZW50IGluc3RhbmNlb2YgSW1wb3J0U3BlY2lmaWVyKSB7IFxuICAgICAgICAgICAgICAgIGltcG9ydGVkRW50aXR5TmFtZSA9IGltcG9ydEVsZW1lbnQuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZSArIGltcG9ydGVkRW50aXR5TmFtZTtcbiAgICAgICAgICAgIGlmIChpc0luRXhwb3J0cykge1xuICAgICAgICAgICAgICAgIGltcG9ydGVkRW50aXR5ID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKHBhdGhOYW1lKSBhcyBGYW1peC5OYW1lZEVudGl0eTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kIGV4cG9ydGVkIGVudGl0eTogJHtwYXRoTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbXBvcnRlZEVudGl0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkgPSBuZXcgRmFtaXguTmFtZWRFbnRpdHkoKTtcbiAgICAgICAgICAgICAgICBpbXBvcnRlZEVudGl0eS5uYW1lID0gaW1wb3J0ZWRFbnRpdHlOYW1lO1xuICAgICAgICAgICAgICAgIGlmICghaXNJbkV4cG9ydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkuaXNTdHViID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBuYW1lZCBlbnRpdHkgJHtpbXBvcnRlZEVudGl0eU5hbWV9IGZvciBJbXBvcnRTcGVjaWZpZXIgJHtpbXBvcnRFbGVtZW50LmdldFRleHQoKX1gKTtcbiAgICAgICAgICAgICAgICBpbml0RlFOKGltcG9ydEVsZW1lbnQsIGltcG9ydGVkRW50aXR5KTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEFzc2lnbmVkIEZRTiB0byBlbnRpdHk6ICR7aW1wb3J0ZWRFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgICAgICAgICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGltcG9ydEVsZW1lbnQsIGltcG9ydGVkRW50aXR5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoaW1wb3J0ZWRFbnRpdHkpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQWRkZWQgZW50aXR5IHRvIHJlcG9zaXRvcnk6ICR7aW1wb3J0ZWRFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGltcG9ydERlY2xhcmF0aW9uIGluc3RhbmNlb2YgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGltcG9ydGVkRW50aXR5TmFtZSA9IGltcG9ydERlY2xhcmF0aW9uPy5nZXROYW1lKCk7XG4gICAgICAgICAgICBwYXRoTmFtZSA9IHBhdGhOYW1lICsgaW1wb3J0ZWRFbnRpdHlOYW1lO1xuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkgPSBuZXcgRmFtaXguU3RydWN0dXJhbEVudGl0eSgpO1xuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkubmFtZSA9IGltcG9ydGVkRW50aXR5TmFtZTtcbiAgICAgICAgICAgIGluaXRGUU4oaW1wb3J0RGVjbGFyYXRpb24sIGltcG9ydGVkRW50aXR5KTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQXNzaWduZWQgRlFOIHRvIEltcG9ydEVxdWFscyBlbnRpdHk6ICR7aW1wb3J0ZWRFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoaW1wb3J0RWxlbWVudCwgaW1wb3J0ZWRFbnRpdHkpO1xuICAgICAgICAgICAgY29uc3QgYW55VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoJ2FueScsIHVuZGVmaW5lZCwgaW1wb3J0RGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgKGltcG9ydGVkRW50aXR5IGFzIEZhbWl4LlN0cnVjdHVyYWxFbnRpdHkpLmRlY2xhcmVkVHlwZSA9IGFueVR5cGU7XG4gICAgICAgIH0gZWxzZSB7ICBcbiAgICAgICAgICAgIGltcG9ydGVkRW50aXR5TmFtZSA9IGltcG9ydEVsZW1lbnQuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZSArIChpc0RlZmF1bHRFeHBvcnQgPyBcImRlZmF1bHRFeHBvcnRcIiA6IFwibmFtZXNwYWNlRXhwb3J0XCIpO1xuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkgPSBuZXcgRmFtaXguTmFtZWRFbnRpdHkoKTtcbiAgICAgICAgICAgIGltcG9ydGVkRW50aXR5Lm5hbWUgPSBpbXBvcnRlZEVudGl0eU5hbWU7XG4gICAgICAgICAgICBpbml0RlFOKGltcG9ydEVsZW1lbnQsIGltcG9ydGVkRW50aXR5KTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQXNzaWduZWQgRlFOIHRvIGRlZmF1bHQvbmFtZXNwYWNlIGVudGl0eTogJHtpbXBvcnRlZEVudGl0eS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihpbXBvcnRFbGVtZW50LCBpbXBvcnRlZEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0luRXhwb3J0cykge1xuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGltcG9ydGVkRW50aXR5KTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQWRkZWQgbm9uLWV4cG9ydGVkIGVudGl0eSB0byByZXBvc2l0b3J5OiAke2ltcG9ydGVkRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbXBvcnRlckZ1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oaW1wb3J0ZXIpO1xuICAgICAgICBjb25zdCBmbXhJbXBvcnRlciA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShpbXBvcnRlckZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgRmFtaXguTW9kdWxlO1xuICAgICAgICBmbXhJbXBvcnRDbGF1c2UuaW1wb3J0aW5nRW50aXR5ID0gZm14SW1wb3J0ZXI7XG4gICAgICAgIGZteEltcG9ydENsYXVzZS5pbXBvcnRlZEVudGl0eSA9IGltcG9ydGVkRW50aXR5O1xuICAgICAgICBpZiAoaW1wb3J0RGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgZm14SW1wb3J0Q2xhdXNlLm1vZHVsZVNwZWNpZmllciA9IGltcG9ydERlY2xhcmF0aW9uPy5nZXRNb2R1bGVSZWZlcmVuY2UoKS5nZXRUZXh0KCkgYXMgc3RyaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm14SW1wb3J0Q2xhdXNlLm1vZHVsZVNwZWNpZmllciA9IGltcG9ydERlY2xhcmF0aW9uPy5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsb2dnZXIuZGVidWcoYEltcG9ydENsYXVzZTogJHtmbXhJbXBvcnRDbGF1c2UuaW1wb3J0ZWRFbnRpdHk/Lm5hbWV9ICh0eXBlPSR7SGVscGVycy5nZXRTdWJUeXBlTmFtZShmbXhJbXBvcnRDbGF1c2UuaW1wb3J0ZWRFbnRpdHkpfSkgaW1wb3J0ZWQgYnkgJHtmbXhJbXBvcnRDbGF1c2UuaW1wb3J0aW5nRW50aXR5Py5uYW1lfWApO1xuICAgIFxuICAgICAgICBmbXhJbXBvcnRlci5hZGRPdXRnb2luZ0ltcG9ydChmbXhJbXBvcnRDbGF1c2UpO1xuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14SW1wb3J0Q2xhdXNlKTtcbiAgICBcbiAgICAgICAgaWYgKGltcG9ydERlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEltcG9ydENsYXVzZSwgaW1wb3J0RGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5mbXhJbXBvcnRDbGF1c2VNYXAuc2V0KGltcG9ydERlY2xhcmF0aW9uLCBmbXhJbXBvcnRDbGF1c2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IEFycm93IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIGFycm93RXhwcmVzc2lvbiBBbiBFeHByZXNzaW9uXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSB2YXJpYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4QXJyb3dGdW5jdGlvbihhcnJvd0V4cHJlc3Npb246IEV4cHJlc3Npb24sIGN1cnJlbnRDQzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSApOiBGYW1peC5BcnJvd0Z1bmN0aW9uIHwgRmFtaXguUGFyYW1ldHJpY0Fycm93RnVuY3Rpb24ge1xuICAgICAgICBcbiAgICAgICAgbGV0IGZteEFycm93RnVuY3Rpb246IEZhbWl4LkFycm93RnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljQXJyb3dGdW5jdGlvbjtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGFycm93RXhwcmVzc2lvbik7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmhhcyhmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSkpIHtcblxuICAgICAgICAgICAgY29uc3QgYXJyb3dGdW5jdGlvbiA9IGFycm93RXhwcmVzc2lvbi5hc0tpbmRPclRocm93KFN5bnRheEtpbmQuQXJyb3dGdW5jdGlvbik7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzR2VuZXJpYyA9IGFycm93RnVuY3Rpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xuXG4gICAgICAgICAgICBpZiAoaXNHZW5lcmljKSB7XG4gICAgICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbiA9IG5ldyBGYW1peC5QYXJhbWV0cmljQXJyb3dGdW5jdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbiA9IG5ldyBGYW1peC5BcnJvd0Z1bmN0aW9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyZW50IG9mIHRoZSBhcnJvdyBmdW5jdGlvbiAodGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uKVxuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gYXJyb3dGdW5jdGlvbi5nZXRQYXJlbnRJZktpbmQoU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIGxldCBmdW5jdGlvbk5hbWUgPSAnKE5PX05BTUUpJztcblxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSA9IHBhcmVudC5nZXROYW1lKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmdW5jdGlvbk5hbWUpIHtcbiAgICAgICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uLm5hbWUgPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uLm5hbWUgPSBcImFub255bW91c1wiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTaWduYXR1cmUgb2YgYW4gYXJyb3cgZnVuY3Rpb24gaXMgKHBhcmFtZXRlcnMpID0+IHJldHVybl90eXBlXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzU2lnbmF0dXJlID0gYXJyb3dGdW5jdGlvbi5nZXRQYXJhbWV0ZXJzKCkubWFwKHAgPT4gcC5nZXRUZXh0KCkpLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblR5cGVTaWduYXR1cmUgPSBhcnJvd0Z1bmN0aW9uLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCk7XG4gICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uLnNpZ25hdHVyZSA9IGAoJHtwYXJhbWV0ZXJzU2lnbmF0dXJlfSkgPT4gJHtyZXR1cm5UeXBlU2lnbmF0dXJlfWA7XG4gICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uLmN5Y2xvbWF0aWNDb21wbGV4aXR5ID0gY3VycmVudENDW2ZteEFycm93RnVuY3Rpb24ubmFtZV07XG5cbiAgICAgICAgICAgIGxldCBmdW5jdGlvblR5cGVOYW1lID0gdGhpcy5VTktOT1dOX1ZBTFVFO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvblR5cGVOYW1lID0gYXJyb3dGdW5jdGlvbi5nZXRSZXR1cm5UeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIEZhaWxlZCB0byBnZXQgdXNhYmxlIG5hbWUgZm9yIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uOiAke2Z1bmN0aW9uTmFtZX0uIENvbnRpbnVpbmcuLi5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoZnVuY3Rpb25UeXBlTmFtZSwgYXJyb3dGdW5jdGlvbi5nZXRSZXR1cm5UeXBlKCksIGFycm93RnVuY3Rpb24gYXMgdW5rbm93biBhcyBGdW5jdGlvbkRlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24uZGVjbGFyZWRUeXBlID0gZm14VHlwZTtcbiAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24ubnVtYmVyT2ZMaW5lc09mQ29kZSA9IGFycm93RnVuY3Rpb24uZ2V0RW5kTGluZU51bWJlcigpIC0gYXJyb3dGdW5jdGlvbi5nZXRTdGFydExpbmVOdW1iZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBhcnJvd0Z1bmN0aW9uLmdldFBhcmFtZXRlcnMoKTtcbiAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24ubnVtYmVyT2ZQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5sZW5ndGg7XG4gICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uLm51bWJlck9mU3RhdGVtZW50cyA9IGFycm93RnVuY3Rpb24uZ2V0U3RhdGVtZW50cygpLmxlbmd0aDtcbiAgICAgICAgICAgIGluaXRGUU4oYXJyb3dFeHByZXNzaW9uIGFzIHVua25vd24gYXMgVFNNb3JwaE9iamVjdFR5cGUsIGZteEFycm93RnVuY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoYXJyb3dFeHByZXNzaW9uIGFzIHVua25vd24gYXMgVFNNb3JwaE9iamVjdFR5cGUsIGZteEFycm93RnVuY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEFycm93RnVuY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhBcnJvd0Z1bmN0aW9uLGFycm93RnVuY3Rpb24gYXMgdW5rbm93biBhcyBUU01vcnBoT2JqZWN0VHlwZSk7XG4gICAgICAgICAgICB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLnNldChmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSwgZm14QXJyb3dGdW5jdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uID0gdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5nZXQoZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUpIGFzIEZhbWl4LkFycm93RnVuY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm14QXJyb3dGdW5jdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb25cbiAgICAgKiBAcGFyYW0gY2xzIEEgY2xhc3NcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbmNyZXRpc2F0aW9uXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb24oY29uRW50aXR5IDogRmFtaXguUGFyYW1ldHJpY0NsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSB8IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbiB8IEZhbWl4LlBhcmFtZXRyaWNNZXRob2QgLGdlbkVudGl0eSA6IEZhbWl4LlBhcmFtZXRyaWNDbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljTWV0aG9kKTogRmFtaXguQ29uY3JldGlzYXRpb24ge1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZm14Q29uY3JldGlzYXRpb24gOiBGYW1peC5Db25jcmV0aXNhdGlvbiA9IG5ldyBGYW1peC5Db25jcmV0aXNhdGlvbigpOyAgICAgICAgICAgICAgXG4gICAgICAgIFxuICAgICAgICBmbXhDb25jcmV0aXNhdGlvbi5jb25jcmV0ZUVudGl0eSA9IGNvbkVudGl0eTtcbiAgICAgICAgZm14Q29uY3JldGlzYXRpb24uZ2VuZXJpY0VudGl0eSA9IGdlbkVudGl0eTtcbiAgICAgICAgLy8gdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhDb25jcmV0aXNhdGlvbixudWxsKTtcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteENvbmNyZXRpc2F0aW9uKTtcbiAgICAgICAgLy8gY29uc3QgcGFyYW1ldGVyQ29uY3JldGlzYXRpb24gPSB0aGlzLmNyZWF0ZUZhbWl4UGFyYW1ldGVyQ29uY3JldGlzYXRpb24oZm14Q29uY3JldGlzYXRpb24pO1xuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBmbXhDb25jcmV0aXNhdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb25cbiAgICAgKiBAcGFyYW0gY29uY3JldGlzYXRpb24gQSBGYW1peENvbmNyZXRpc2F0aW9uXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBQYXJhbWV0ZXJDb25jcmVzdGlzYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbihjb25jcmV0aXNhdGlvbjogRmFtaXguQ29uY3JldGlzYXRpb24pOiBGYW1peC5QYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiB8IHVuZGVmaW5lZHtcbiAgICAgICAgY29uc3QgY29uQ2xhc3MgPSBjb25jcmV0aXNhdGlvbi5jb25jcmV0ZUVudGl0eTtcbiAgICAgICAgY29uc3QgZ2VuQ2xhc3MgPSBjb25jcmV0aXNhdGlvbi5nZW5lcmljRW50aXR5O1xuICAgICAgICBsb2dnZXIuZGVidWcoYENyZWF0aW5nIHBhcmFtZXRlciBjb25jcmV0aXNhdGlvbiBiZXR3ZWVuICR7Y29uQ2xhc3MuZnVsbHlRdWFsaWZpZWROYW1lfSBhbmQgJHtnZW5DbGFzcy5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlckNvbmNyZXRpc2F0aW9ucyA9IHRoaXMuZmFtaXhSZXAuX2dldEFsbEVudGl0aWVzV2l0aFR5cGUoXCJQYXJhbWV0ZXJDb25jcmV0aXNhdGlvblwiKSBhcyBTZXQ8RmFtaXguUGFyYW1ldGVyQ29uY3JldGlzYXRpb24+O1xuICAgICAgICBjb25zdCBjb25jcmV0ZVBhcmFtZXRlcnMgPSBjb25DbGFzcy5jb25jcmV0ZVBhcmFtZXRlcnM7XG4gICAgICAgIGNvbnN0IGdlbmVyaWNQYXJhbWV0ZXJzID0gZ2VuQ2xhc3MuZ2VuZXJpY1BhcmFtZXRlcnM7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBjb25DbGFzc1R5cGVQYXJhbWV0ZXJzSXRlcmF0b3IgPSBjb25jcmV0ZVBhcmFtZXRlcnMudmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IGdlbkNsYXNzVHlwZVBhcmFtZXRlcnNJdGVyYXRvciA9IGdlbmVyaWNQYXJhbWV0ZXJzLnZhbHVlcygpO1xuICAgICAgICBsZXQgZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24gOiBGYW1peC5QYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdlbmVyaWNQYXJhbWV0ZXJzLnNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29uQ2xhc3NUeXBlUGFyYW1ldGVyID0gY29uQ2xhc3NUeXBlUGFyYW1ldGVyc0l0ZXJhdG9yLm5leHQoKS52YWx1ZSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlO1xuICAgICAgICAgICAgY29uc3QgZ2VuQ2xhc3NUeXBlUGFyYW1ldGVyID0gZ2VuQ2xhc3NUeXBlUGFyYW1ldGVyc0l0ZXJhdG9yLm5leHQoKS52YWx1ZSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlO1xuICAgICAgICAgICAgbGV0IGNyZWF0ZVBhcmFtZXRlckNvbmNyZXRpc2F0aW9uIDogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBpZihjb25DbGFzc1R5cGVQYXJhbWV0ZXIgJiYgZ2VuQ2xhc3NUeXBlUGFyYW1ldGVyICYmIGNvbkNsYXNzVHlwZVBhcmFtZXRlci5uYW1lICE9IGdlbkNsYXNzVHlwZVBhcmFtZXRlci5uYW1lKXtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJDb25jcmV0aXNhdGlvbnMuZm9yRWFjaCgocGFyYW0gOiBGYW1peC5QYXJhbWV0ZXJDb25jcmV0aXNhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uQ2xhc3NUeXBlUGFyYW1ldGVyLm5hbWUgPT0gcGFyYW0uY29uY3JldGVQYXJhbWV0ZXIubmFtZSAmJiBnZW5DbGFzc1R5cGVQYXJhbWV0ZXIubmFtZSA9PSBwYXJhbS5nZW5lcmljUGFyYW1ldGVyLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVBhcmFtZXRlckNvbmNyZXRpc2F0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiA9IHBhcmFtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNyZWF0ZVBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uID0gbmV3IEZhbWl4LlBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uLmdlbmVyaWNQYXJhbWV0ZXIgPSBnZW5DbGFzc1R5cGVQYXJhbWV0ZXI7XG4gICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uLmNvbmNyZXRlUGFyYW1ldGVyID0gY29uQ2xhc3NUeXBlUGFyYW1ldGVyO1xuICAgICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbi5hZGRDb25jcmV0aXNhdGlvbihjb25jcmV0aXNhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24sbnVsbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiB3YXMgdW5kZWZpbmVkIGZvciBjb25jcmV0aXNhdGlvbiB3aXRoIGdlbmVyaWMgcGFyYW1ldGVyICR7Z2VuQ2xhc3NUeXBlUGFyYW1ldGVyLm5hbWV9IGFuZCBjb25jcmV0ZSBwYXJhbWV0ZXIgJHtjb25DbGFzc1R5cGVQYXJhbWV0ZXIubmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbi5hZGRDb25jcmV0aXNhdGlvbihjb25jcmV0aXNhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiB3YXMgdW5kZWZpbmVkIGZvciBjb25jcmV0aXNhdGlvbiB3aXRoIGNvbmNyZXRlIGVudGl0eSAke2NvbkNsYXNzLmZ1bGx5UXVhbGlmaWVkTmFtZX0gYW5kIGdlbmVyaWMgZW50aXR5ICR7Z2VuQ2xhc3MuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbjtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBjb25jcmV0aXNhdGlvbiBiZXR3ZWVuIHR3byBjbGFzc2VzIG9yIHR3byBpbnRlcmZhY2VzXG4gICAgICogQHBhcmFtIGVsZW1lbnQgQSBjbGFzcyBvciBhbiBJbnRlcmZhY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkNsYXNzT3JJbnRlcmZhY2VTcGVjaWFsaXNhdGlvbihlbGVtZW50OiBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24pe1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc3VwZXJFbnRpdHkgPSBlbGVtZW50LmdldEV4dGVuZHMoKTtcbiAgICAgICAgbGV0IHN1cGVyRW50aXR5QXJyYXk7XG4gICAgICAgIGlmIChzdXBlckVudGl0eSl7XG4gICAgICAgICAgICBzdXBlckVudGl0eUFycmF5ID0gQXJyYXkuaXNBcnJheShzdXBlckVudGl0eSkgPyBzdXBlckVudGl0eSA6IFtzdXBlckVudGl0eV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1cGVyRW50aXR5QXJyYXkgJiYgc3VwZXJFbnRpdHlBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzdXBlckVudGl0eUFycmF5LmZvckVhY2goZW50aXR5ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZW50aXR5SXNHZW5lcmljO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1cGVyRW50aXR5U3ltYm9sID0gZW50aXR5LmdldEV4cHJlc3Npb24oKS5nZXRTeW1ib2xPclRocm93KCk7XG4gICAgICAgICAgICAgICAgbGV0IHN1cGVyRW50aXR5RGVjbGFyYXRpb247XG4gICAgICAgICAgICAgICAgaWYgKHN1cGVyRW50aXR5IGluc3RhbmNlb2YgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyRW50aXR5RGVjbGFyYXRpb24gPSBzdXBlckVudGl0eVN5bWJvbC5nZXREZWNsYXJhdGlvbnMoKVswXS5hc0tpbmQodHMuU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdXBlckVudGl0eURlY2xhcmF0aW9uID0gc3VwZXJFbnRpdHlTeW1ib2wuZ2V0RGVjbGFyYXRpb25zKClbMF0uYXNLaW5kKHRzLlN5bnRheEtpbmQuSW50ZXJmYWNlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3VwZXJFbnRpdHlEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHlJc0dlbmVyaWMgPSBzdXBlckVudGl0eURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVudGl0eUlzR2VuZXJpYykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgRW50aXR5RGVjbGFyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGxldCBnZW5FbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdXBlckVudGl0eSBpbnN0YW5jZW9mIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5RGVjbGFyYXRpb24gPSBlbnRpdHkuZ2V0RXhwcmVzc2lvbigpLmdldFN5bWJvbCgpPy5nZXREZWNsYXJhdGlvbnMoKVswXSBhcyBDbGFzc0RlY2xhcmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuRW50aXR5ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3MoRW50aXR5RGVjbGFyYXRpb24pIGFzIEZhbWl4LlBhcmFtZXRyaWNDbGFzcztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eURlY2xhcmF0aW9uID0gZW50aXR5LmdldEV4cHJlc3Npb24oKS5nZXRTeW1ib2woKT8uZ2V0RGVjbGFyYXRpb25zKClbMF0gYXMgSW50ZXJmYWNlRGVjbGFyYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5FbnRpdHkgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoRW50aXR5RGVjbGFyYXRpb24pIGFzIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VuUGFyYW1zID0gRW50aXR5RGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHBhcmFtKSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gZWxlbWVudC5nZXRIZXJpdGFnZUNsYXVzZXMoKVswXS5nZXRUeXBlTm9kZXMoKVswXS5nZXRUeXBlQXJndW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvblBhcmFtcyA9IGVsZW1lbnQuZ2V0SGVyaXRhZ2VDbGF1c2VzKClbMF0uZ2V0VHlwZU5vZGVzKClbMF0uZ2V0VHlwZUFyZ3VtZW50cygpLm1hcCgocGFyYW0pID0+IHBhcmFtLmdldFRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSGVscGVycy5hcnJheXNBcmVFcXVhbChjb25QYXJhbXMsZ2VuUGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uRW50aXR5ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q29uY3JldGVFbGVtZW50KGdlbkVudGl0eSxFbnRpdHlEZWNsYXJhdGlvbixhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNyZXRpc2F0aW9ucyA9IHRoaXMuZmFtaXhSZXAuX2dldEFsbEVudGl0aWVzV2l0aFR5cGUoXCJDb25jcmV0aXNhdGlvblwiKSBhcyBTZXQ8RmFtaXguQ29uY3JldGlzYXRpb24+O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZUNvbmNyZXRpc2F0aW9uIDogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jcmV0aXNhdGlvbnMuZm9yRWFjaCgoY29uYyA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbkVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uYy5nZW5lcmljRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSAmJiBjb25jLmNvbmNyZXRlRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25FbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29uY3JldGlzYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUNvbmNyZXRpc2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm14Q29uY3JldGlzYXRpb24gOiBGYW1peC5Db25jcmV0aXNhdGlvbiA9IHRoaXMuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbihjb25FbnRpdHksZ2VuRW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2VlbXMgdW5maW5pc2hlZFxuICAgIH0gICAgXG4gICAgXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb24gYmV0d2VlbiBhIGNsYXNzIGFuZCBpdHMgaW5zdGFuY2lhdGlvbnNcbiAgICAgKiBAcGFyYW0gY2xzIEEgY2xhc3NcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkdlbmVyaWNJbnN0YW50aWF0aW9uKGNsczogQ2xhc3NEZWNsYXJhdGlvbil7XG4gICAgICAgXG4gICAgICAgIGNvbnN0IGlzR2VuZXJpYyA9IGNscy5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmIChpc0dlbmVyaWMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlcyA9IGNscy5nZXRTb3VyY2VGaWxlKCkuZ2V0RGVzY2VuZGFudHNPZktpbmQodHMuU3ludGF4S2luZC5OZXdFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIobmV3RXhwciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBuZXdFeHByLmdldEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24uZ2V0VGV4dCgpID09PSBjbHMuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGluc3RhbmNlcy5mb3JFYWNoKGluc3RhbmNlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZUlzR2VuZXJpYyA9IGluc3RhbmNlLmdldFR5cGVBcmd1bWVudHMoKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZUlzR2VuZXJpYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25QYXJhbXMgPSBpbnN0YW5jZS5nZXRUeXBlQXJndW1lbnRzKCkubWFwKChwYXJhbSkgPT4gcGFyYW0uZ2V0VGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VuRW50aXR5ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3MoY2xzKSBhcyBGYW1peC5QYXJhbWV0cmljQ2xhc3M7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdlblBhcmFtcyA9IGNscy5nZXRUeXBlUGFyYW1ldGVycygpLm1hcCgocGFyYW0pID0+IHBhcmFtLmdldFRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSGVscGVycy5hcnJheXNBcmVFcXVhbChjb25QYXJhbXMsZ2VuUGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uRW50aXR5ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q29uY3JldGVFbGVtZW50KGdlbkVudGl0eSxjbHMsaW5zdGFuY2UuZ2V0VHlwZUFyZ3VtZW50cygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNyZXRpc2F0aW9ucyA9IHRoaXMuZmFtaXhSZXAuX2dldEFsbEVudGl0aWVzV2l0aFR5cGUoXCJDb25jcmV0aXNhdGlvblwiKSBhcyBTZXQ8RmFtaXguQ29uY3JldGlzYXRpb24+O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZUNvbmNyZXRpc2F0aW9uIDogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jcmV0aXNhdGlvbnMuZm9yRWFjaCgoY29uYyA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbkVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uYy5nZW5lcmljRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSAmJiBjb25jLmNvbmNyZXRlRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25FbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29uY3JldGlzYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUNvbmNyZXRpc2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm14Q29uY3JldGlzYXRpb24gOiBGYW1peC5Db25jcmV0aXNhdGlvbiA9IHRoaXMuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbihjb25FbnRpdHksZ2VuRW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2VlbXMgdW5maW5pc2hlZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBjb25jcmV0aXNhdGlvbiBiZXR3ZWVuIGEgY2xhc3MgYW5kIGl0cyBpbnN0YW5jaWF0aW9uc1xuICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkZ1bmN0aW9uSW5zdGFudGlhdGlvbihlbGVtZW50OiBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24pe1xuICAgICAgICBjb25zdCBpc0dlbmVyaWMgPSBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKGlzR2VuZXJpYykge1xuICAgICAgICAgICAgY29uc3QgZ2VuUGFyYW1zID0gZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpLm1hcChwYXJhbSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgY29uc3QgdXNlcyA9IGVsZW1lbnQuZmluZFJlZmVyZW5jZXNBc05vZGVzKCk7ICAgIFxuICAgICAgICAgICAgdXNlcy5mb3JFYWNoKHVzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudE5vZGU6IFRzTW9ycGhOb2RlIHwgdW5kZWZpbmVkID0gdXNhZ2U7XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbEV4cHJlc3Npb24gPSBjdXJyZW50Tm9kZS5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbGxFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsRXhwcmVzc2lvbiBub3QgZm91bmQgZm9yICR7Y3VycmVudE5vZGUuZ2V0VGV4dCgpfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VJc0dlbmVyaWMgPSBjYWxsRXhwcmVzc2lvbi5nZXRUeXBlQXJndW1lbnRzKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZUlzR2VuZXJpYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBjYWxsRXhwcmVzc2lvbi5nZXRUeXBlQXJndW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uUGFyYW1zID0gY2FsbEV4cHJlc3Npb24uZ2V0VHlwZUFyZ3VtZW50cygpLm1hcChwYXJhbSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSGVscGVycy5hcnJheXNBcmVFcXVhbChjb25QYXJhbXMsZ2VuUGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ2VuRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uRGVjbGFyYXRpb24pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuRWxlbWVudCA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peEZ1bmN0aW9uKGVsZW1lbnQsIHt9KSBhcyBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5FbGVtZW50ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4TWV0aG9kKGVsZW1lbnQsIHt9KSBhcyBGYW1peC5QYXJhbWV0cmljTWV0aG9kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNFbGVtZW50ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q29uY3JldGVFbGVtZW50KGdlbkVsZW1lbnQsZWxlbWVudCxhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY3JldGlzYXRpb25zID0gdGhpcy5mYW1peFJlcC5fZ2V0QWxsRW50aXRpZXNXaXRoVHlwZShcIkNvbmNyZXRpc2F0aW9uXCIpIGFzIFNldDxGYW1peC5Db25jcmV0aXNhdGlvbj47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjcmVhdGVDb25jcmV0aXNhdGlvbiA6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jcmV0aXNhdGlvbnMuZm9yRWFjaCgoY29uYyA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuRWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uYy5nZW5lcmljRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSAmJiBjb25jLmNvbmNyZXRlRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25jRWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmNyZXRpc2F0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUNvbmNyZXRpc2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbiA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gdGhpcy5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uKGNvbmNFbGVtZW50LGdlbkVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb250ZXIgw6AgbCfDqWzDqW1lbnQgcGFyZW50ICh1dGlsZSBzaSBsZSBuxZN1ZCBkZSByw6lmw6lyZW5jZSBlc3QgdW4gZW5mYW50KVxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGNvbmNyZXRpc2F0aW9uIGJldHdlZW4gYSBjbGFzcyBhbmQgYW4gaW50ZXJmYWNlXG4gICAgICogQHBhcmFtIGNscyBBIGNsYXNzXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25JbnRlcmZhY2VDbGFzcyhjbHM6IENsYXNzRGVjbGFyYXRpb24pe1xuICAgIFxuICAgICAgICBjb25zdCBzdXBlckludGVyZmFjZXMgPSBjbHMuZ2V0SW1wbGVtZW50cygpO1xuICAgICAgICBzdXBlckludGVyZmFjZXMuZm9yRWFjaChpbnRlcmZhY2VUeXBlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyZmFjZUlzR2VuZXJpYyA9IGludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmxlbmd0aD4wO1xuICAgICAgICAgICAgaWYgKGludGVyZmFjZUlzR2VuZXJpYykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVyZmFjZURlY2xhcmF0aW9uID0gaW50ZXJmYWNlVHlwZS5nZXRFeHByZXNzaW9uKCkuZ2V0U3ltYm9sKCk/LmdldERlY2xhcmF0aW9ucygpWzBdIGFzIEludGVyZmFjZURlY2xhcmF0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdlblBhcmFtcyA9IGludGVyZmFjZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKChwYXJhbSkgPT4gcGFyYW0uZ2V0VGV4dCgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25QYXJhbXMgPSBjbHMuZ2V0SGVyaXRhZ2VDbGF1c2VzKClbMF0uZ2V0VHlwZU5vZGVzKClbMF0uZ2V0VHlwZUFyZ3VtZW50cygpLm1hcCgocGFyYW0pID0+IHBhcmFtLmdldFRleHQoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IGNscy5nZXRIZXJpdGFnZUNsYXVzZXMoKVswXS5nZXRUeXBlTm9kZXMoKVswXS5nZXRUeXBlQXJndW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFIZWxwZXJzLmFycmF5c0FyZUVxdWFsKGNvblBhcmFtcyxnZW5QYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdlbkludGVyZmFjZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZShpbnRlcmZhY2VEZWNsYXJhdGlvbikgYXMgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uSW50ZXJmYWNlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q29uY3JldGVFbGVtZW50KGdlbkludGVyZmFjZSxpbnRlcmZhY2VEZWNsYXJhdGlvbixhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY3JldGlzYXRpb25zID0gdGhpcy5mYW1peFJlcC5fZ2V0QWxsRW50aXRpZXNXaXRoVHlwZShcIkNvbmNyZXRpc2F0aW9uXCIpIGFzIFNldDxGYW1peC5Db25jcmV0aXNhdGlvbj47XG4gICAgICAgICAgICAgICAgICAgIGxldCBjcmVhdGVDb25jcmV0aXNhdGlvbiA6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25jcmV0aXNhdGlvbnMuZm9yRWFjaCgoY29uYyA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuSW50ZXJmYWNlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25jLmdlbmVyaWNFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lICYmIGNvbmMuY29uY3JldGVFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbkludGVyZmFjZS5mdWxseVF1YWxpZmllZE5hbWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmNyZXRpc2F0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVDb25jcmV0aXNhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm14Q29uY3JldGlzYXRpb24gOiBGYW1peC5Db25jcmV0aXNhdGlvbiA9IHRoaXMuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbihjb25JbnRlcmZhY2UsZ2VuSW50ZXJmYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGNvbmNyZXRpc2F0aW9uIGJldHdlZW4gYW4gaW50ZXJmYWNlIGFuZCBhIFR5cGVcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBBIHZhcmlhYmxlIG9yIGEgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gaW50ZXIgQW4gaW50ZXJmYWNlXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25UeXBlSW5zdGFuY2lhdGlvbihlbGVtZW50OiBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IENsYXNzRGVjbGFyYXRpb24pIHtcblxuICAgICAgICBjb25zdCBpc0dlbmVyaWMgPSBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKGlzR2VuZXJpYykge1xuICAgICAgICAgICAgY29uc3QgZ2VuUGFyYW1zID0gZWxlbWVudC5nZXRUeXBlUGFyYW1ldGVycygpLm1hcChwYXJhbSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgY29uc3QgdXNlcyA9IGVsZW1lbnQuZmluZFJlZmVyZW5jZXNBc05vZGVzKCk7XG4gICAgICAgICAgICB1c2VzLmZvckVhY2godXNlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHVzZS5nZXRQYXJlbnQoKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuVHlwZVJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZVJlZmVyZW5jZU5vZGUgPSBwYXJlbnROb2RlLmFzS2luZChTeW50YXhLaW5kLlR5cGVSZWZlcmVuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0eXBlUmVmZXJlbmNlTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZVJlZmVyZW5jZU5vZGUgbm90IGZvdW5kIGZvciAke3BhcmVudE5vZGUuZ2V0VGV4dCgpfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZVJlZmVyZW5jZU5vZGVJc0dlbmVyaWMgPSB0eXBlUmVmZXJlbmNlTm9kZS5nZXRUeXBlQXJndW1lbnRzKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlUmVmZXJlbmNlTm9kZUlzR2VuZXJpYykgeyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gdHlwZVJlZmVyZW5jZU5vZGUuZ2V0VHlwZUFyZ3VtZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uUGFyYW1zID0gdHlwZVJlZmVyZW5jZU5vZGUuZ2V0VHlwZUFyZ3VtZW50cygpLm1hcChwYXJhbSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFIZWxwZXJzLmFycmF5c0FyZUVxdWFsKGNvblBhcmFtcywgZ2VuUGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZW5FbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5FbGVtZW50ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3MoZWxlbWVudCkgYXMgRmFtaXguUGFyYW1ldHJpY0NsYXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoZWxlbWVudCkgYXMgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY0VsZW1lbnQgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoZ2VuRWxlbWVudCwgZWxlbWVudCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY3JldGlzYXRpb25zID0gdGhpcy5mYW1peFJlcC5fZ2V0QWxsRW50aXRpZXNXaXRoVHlwZShcIkNvbmNyZXRpc2F0aW9uXCIpIGFzIFNldDxGYW1peC5Db25jcmV0aXNhdGlvbj47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZUNvbmNyZXRpc2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jcmV0aXNhdGlvbnMuZm9yRWFjaCgoY29uYzogRmFtaXguQ29uY3JldGlzYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbkVsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbmMuZ2VuZXJpY0VudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgJiYgY29uYy5jb25jcmV0ZUVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uY0VsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb25jcmV0aXNhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlQ29uY3JldGlzYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm14Q29uY3JldGlzYXRpb246IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gdGhpcy5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uKGNvbmNFbGVtZW50LCBnZW5FbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRQYXJlbnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb252ZXJ0VG9SZWxhdGl2ZVBhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcsIGFic29sdXRlUGF0aFByb2plY3Q6IHN0cmluZykge1xuICAgICAgICBsb2dnZXIuZGVidWcoYGNvbnZlcnRUb1JlbGF0aXZlUGF0aDogYWJzb2x1dGVQYXRoOiAnJHthYnNvbHV0ZVBhdGh9JywgYWJzb2x1dGVQYXRoUHJvamVjdDogJyR7YWJzb2x1dGVQYXRoUHJvamVjdH0nYCk7XG4gICAgICAgIGlmIChhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aChhYnNvbHV0ZVBhdGhQcm9qZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUGF0aC5yZXBsYWNlKGFic29sdXRlUGF0aFByb2plY3QsIFwiXCIpLnNsaWNlKDEpO1xuICAgICAgICB9IGVsc2UgaWYgKGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUGF0aC5zbGljZSgxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhYnNvbHV0ZVBhdGg7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZVR5cGUodHlwZU5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0eXBlTmFtZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgICAgdHlwZU5hbWUgPT09IFwiYmlnaW50XCIgfHxcbiAgICAgICAgdHlwZU5hbWUgPT09IFwic3ltYm9sXCIgfHxcbiAgICAgICAgdHlwZU5hbWUgPT09IFwidW5pcXVlIHN5bWJvbFwiIHx8XG4gICAgICAgIHR5cGVOYW1lID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAgIHR5cGVOYW1lID09PSBcIm51bGxcIiB8fFxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJhbnlcIiB8fFxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJ1bmtub3duXCIgfHxcbiAgICAgICAgdHlwZU5hbWUgPT09IFwibmV2ZXJcIiB8fFxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJ2b2lkXCI7XG59XG5cbmZ1bmN0aW9uIGluaXRGUU4oc291cmNlRWxlbWVudDogVFNNb3JwaE9iamVjdFR5cGUsIGZhbWl4RWxlbWVudDogRmFtaXguU291cmNlZEVudGl0eSkge1xuICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2VzIHdoZXJlIGFuIGVsZW1lbnQgaXMgYSBUeXBlIC0tIG5lZWQgdG8gY2hhbmdlIGl0cyBuYW1lXG4gICAgaWYgKGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlR5cGUgJiYgIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgQ29tbWVudFJhbmdlKSAmJiBpc1R5cGVDb250ZXh0KHNvdXJjZUVsZW1lbnQpKSB7XG4gICAgICAgIGxldCBmcW4gPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKHNvdXJjZUVsZW1lbnQpO1xuICAgICAgICAvLyB1c2luZyByZWdleCwgcmVwbGFjZSBbYmxhaF0gd2l0aCBbYmxhaFR5cGVdXG4gICAgICAgIGZxbiA9IGZxbi5yZXBsYWNlKC9cXFsoW15cXF1dKylcXF0vZywgXCJbJDFUeXBlXVwiKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2V0dGluZyBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgXCIgKyBmYW1peEVsZW1lbnQuZ2V0SlNPTigpICsgXCIgdG8gXCIgKyBmcW4pO1xuICAgICAgICBmYW1peEVsZW1lbnQuZnVsbHlRdWFsaWZpZWROYW1lID0gZnFuO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGNhdGNoIGFsbCAoZXhjZXB0IGNvbW1lbnRzKVxuICAgIGlmICghKHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBDb21tZW50UmFuZ2UpKSB7XG4gICAgICAgIGNvbnN0IGZxbiA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oc291cmNlRWxlbWVudCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIlNldHRpbmcgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIFwiICsgZmFtaXhFbGVtZW50LmdldEpTT04oKSArIFwiIHRvIFwiICsgZnFuKTtcbiAgICAgICAgKGZhbWl4RWxlbWVudCBhcyBGYW1peC5OYW1lZEVudGl0eSkuZnVsbHlRdWFsaWZpZWROYW1lID0gZnFuO1xuICAgIH0gXG59XG5cblxuZnVuY3Rpb24gaXNUeXBlQ29udGV4dChzb3VyY2VFbGVtZW50OiBUU01vcnBoT2JqZWN0VHlwZSk6IGJvb2xlYW4ge1xuICAgIC8vIEp1c3Qga2VlcCB0aGUgZXhpc3RpbmcgU3ludGF4S2luZCBzZXQgYXMgaXQgaXNcbiAgICBjb25zdCB0eXBlQ29udGV4dEtpbmRzID0gbmV3IFNldChbXG4gICAgICAgIFN5bnRheEtpbmQuQ29uc3RydWN0b3IsXG4gICAgICAgIFN5bnRheEtpbmQuTWV0aG9kRGVjbGFyYXRpb24sXG4gICAgICAgIFN5bnRheEtpbmQuRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgICAgICAgU3ludGF4S2luZC5GdW5jdGlvbkV4cHJlc3Npb24sXG4gICAgICAgIFN5bnRheEtpbmQuQXJyb3dGdW5jdGlvbixcbiAgICAgICAgU3ludGF4S2luZC5QYXJhbWV0ZXIsXG4gICAgICAgIFN5bnRheEtpbmQuVmFyaWFibGVEZWNsYXJhdGlvbixcbiAgICAgICAgU3ludGF4S2luZC5Qcm9wZXJ0eURlY2xhcmF0aW9uLFxuICAgICAgICBTeW50YXhLaW5kLlByb3BlcnR5U2lnbmF0dXJlLFxuICAgICAgICBTeW50YXhLaW5kLlR5cGVQYXJhbWV0ZXIsXG4gICAgICAgIFN5bnRheEtpbmQuSWRlbnRpZmllcixcbiAgICAgICAgU3ludGF4S2luZC5EZWNvcmF0b3IsXG4gICAgICAgIFN5bnRheEtpbmQuR2V0QWNjZXNzb3IsXG4gICAgICAgIFN5bnRheEtpbmQuU2V0QWNjZXNzb3IsXG4gICAgICAgIFN5bnRheEtpbmQuSW1wb3J0U3BlY2lmaWVyLFxuICAgICAgICBTeW50YXhLaW5kLkVudW1EZWNsYXJhdGlvbixcbiAgICAgICAgU3ludGF4S2luZC5FbnVtTWVtYmVyLFxuICAgICAgICBTeW50YXhLaW5kLlR5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICAgICAgICBTeW50YXhLaW5kLkltcG9ydERlY2xhcmF0aW9uLFxuICAgICAgICBTeW50YXhLaW5kLkV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1xuICAgIF0pO1xuXG4gICAgcmV0dXJuIHR5cGVDb250ZXh0S2luZHMuaGFzKHNvdXJjZUVsZW1lbnQuZ2V0S2luZCgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJmYWNlT3JDbGFzc0RlY2xhcmF0aW9uRnJvbUV4cHJlc3Npb24oZXhwcmVzc2lvbjogRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKTogSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBDbGFzc0RlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBTdGVwIDE6IEdldCB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvblxuICAgIGNvbnN0IHR5cGUgPSBleHByZXNzaW9uLmdldFR5cGUoKTtcblxuICAgIC8vIFN0ZXAgMjogR2V0IHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlXG4gICAgbGV0IHN5bWJvbCA9IHR5cGUuZ2V0U3ltYm9sKCk7XG5cbiAgICBpZiAoIXN5bWJvbCkge1xuICAgICAgICAvLyBJZiBzeW1ib2wgaXMgbm90IGZvdW5kLCB0cnkgdG8gZ2V0IHRoZSBzeW1ib2wgZnJvbSB0aGUgaWRlbnRpZmllclxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gZXhwcmVzc2lvbi5nZXRGaXJzdERlc2NlbmRhbnRCeUtpbmQoU3ludGF4S2luZC5JZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElkZW50aWZpZXIgbm90IGZvdW5kIGZvciAke2V4cHJlc3Npb24uZ2V0VGV4dCgpfS5gKTtcbiAgICAgICAgfVxuICAgICAgICBzeW1ib2wgPSBpZGVudGlmaWVyLmdldFN5bWJvbCgpO1xuICAgICAgICBpZiAoIXN5bWJvbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW1ib2wgbm90IGZvdW5kIGZvciAke2lkZW50aWZpZXIuZ2V0VGV4dCgpfS5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogUmVzb2x2ZSB0aGUgc3ltYm9sIHRvIGZpbmQgdGhlIGFjdHVhbCBkZWNsYXJhdGlvblxuICAgIGNvbnN0IGludGVyZmFjZURlY2xhcmF0aW9uID0gcmVzb2x2ZVN5bWJvbFRvSW50ZXJmYWNlT3JDbGFzc0RlY2xhcmF0aW9uKHN5bWJvbCk7XG5cbiAgICBpZiAoIWludGVyZmFjZURlY2xhcmF0aW9uKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgSW50ZXJmYWNlIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCBmb3IgJHtleHByZXNzaW9uLmdldFRleHQoKX0uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyZmFjZURlY2xhcmF0aW9uO1xufVxuXG5pbXBvcnQgeyBTeW1ib2wgYXMgVFNNb3JwaFN5bWJvbCwgTm9kZSBhcyBUc01vcnBoTm9kZSB9IGZyb20gXCJ0cy1tb3JwaFwiO1xuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiO1xuXG5mdW5jdGlvbiByZXNvbHZlU3ltYm9sVG9JbnRlcmZhY2VPckNsYXNzRGVjbGFyYXRpb24oc3ltYm9sOiBUU01vcnBoU3ltYm9sKTogSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBDbGFzc0RlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBHZXQgdGhlIGRlY2xhcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbFxuICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IHN5bWJvbC5nZXREZWNsYXJhdGlvbnMoKTtcblxuICAgIC8vIEZpbHRlciBmb3IgSW50ZXJmYWNlRGVjbGFyYXRpb24gb3IgQ2xhc3NEZWNsYXJhdGlvblxuICAgIGNvbnN0IGludGVyZmFjZU9yQ2xhc3NEZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9ucy5maW5kKFxuICAgICAgICBkZWNsYXJhdGlvbiA9PiBcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24gfHwgXG4gICAgICAgICAgICBkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIGFzIEludGVyZmFjZURlY2xhcmF0aW9uIHwgQ2xhc3NEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChpbnRlcmZhY2VPckNsYXNzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGludGVyZmFjZU9yQ2xhc3NEZWNsYXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW1wb3J0czogSWYgdGhlIHN5bWJvbCBpcyBpbXBvcnRlZCwgcmVzb2x2ZSB0aGUgaW1wb3J0IHRvIGZpbmQgdGhlIGFjdHVhbCBkZWNsYXJhdGlvblxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZGVjbGFyYXRpb25zKSB7XG4gICAgICAgIGlmIChkZWNsYXJhdGlvbi5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuSW1wb3J0U3BlY2lmaWVyKSB7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnRTcGVjaWZpZXIgPSBkZWNsYXJhdGlvbiBhcyBJbXBvcnRTcGVjaWZpZXI7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnREZWNsYXJhdGlvbiA9IGltcG9ydFNwZWNpZmllci5nZXRJbXBvcnREZWNsYXJhdGlvbigpO1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gaW1wb3J0RGVjbGFyYXRpb24uZ2V0TW9kdWxlU3BlY2lmaWVyU291cmNlRmlsZSgpO1xuXG4gICAgICAgICAgICBpZiAobW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWRTeW1ib2xzID0gbW9kdWxlU3BlY2lmaWVyLmdldEV4cG9ydFN5bWJvbHMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBvcnRlZFN5bWJvbCA9IGV4cG9ydGVkU3ltYm9scy5maW5kKHN5bWJvbCA9PiBzeW1ib2wuZ2V0TmFtZSgpID09PSBpbXBvcnRTcGVjaWZpZXIuZ2V0TmFtZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhwb3J0ZWRTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVTeW1ib2xUb0ludGVyZmFjZU9yQ2xhc3NEZWNsYXJhdGlvbihleHBvcnRlZFN5bWJvbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByaW1pdGl2ZVR5cGVOYW1lKHR5cGU6IFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBmbGFncyA9IHR5cGUuY29tcGlsZXJUeXBlLmZsYWdzO1xuXG4gIGlmIChmbGFncyAmIHRzLlR5cGVGbGFncy5TdHJpbmcpIHJldHVybiBcInN0cmluZ1wiO1xuICBpZiAoZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuTnVtYmVyKSByZXR1cm4gXCJudW1iZXJcIjtcbiAgaWYgKGZsYWdzICYgdHMuVHlwZUZsYWdzLkJvb2xlYW4pIHJldHVybiBcImJvb2xlYW5cIjtcbiAgaWYgKGZsYWdzICYgdHMuVHlwZUZsYWdzLkJpZ0ludCkgcmV0dXJuIFwiYmlnaW50XCI7XG4gIGlmIChmbGFncyAmIHRzLlR5cGVGbGFncy5VbmlxdWVFU1N5bWJvbCkgcmV0dXJuIFwidW5pcXVlIHN5bWJvbFwiO1xuICBpZiAoZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuRVNTeW1ib2wpIHJldHVybiBcInN5bWJvbFwiO1xuICBpZiAoZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuVW5kZWZpbmVkKSByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKGZsYWdzICYgdHMuVHlwZUZsYWdzLk51bGwpIHJldHVybiBcIm51bGxcIjtcbiAgaWYgKGZsYWdzICYgdHMuVHlwZUZsYWdzLlZvaWQpIHJldHVybiBcInZvaWRcIjtcbiAgaWYgKGZsYWdzICYgdHMuVHlwZUZsYWdzLk5ldmVyKSByZXR1cm4gXCJuZXZlclwiO1xuICBpZiAoZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuQW55KSByZXR1cm4gXCJhbnlcIjtcbiAgaWYgKGZsYWdzICYgdHMuVHlwZUZsYWdzLlVua25vd24pIHJldHVybiBcInVua25vd25cIjtcblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vLyBmdW5jdGlvbiBvbGRHZXRJbnRlcmZhY2VEZWNsYXJhdGlvbkZyb21FeHByZXNzaW9uKGV4cHJlc3Npb246IEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cyk6IEludGVyZmFjZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbi8vICAgICAvLyBUd28gY2FzZXM6XG4vLyAgICAgLy8gY2xhc3MgQSBpbXBsZW1lbnRzIEltcG9ydGVkSW50ZXJmYWNlLCBEZWNsYXJlZEludGVyZmFjZSB7fVxuLy8gICAgIGNvbnN0IHR5cGUgPSBleHByZXNzaW9uLmdldFR5cGUoKTtcblxuLy8gICAgIC8vIEltcG9ydGVkSW50ZXJmYWNlOiB0eXBlIHdpbGwgYSBzeW1ib2wgXG4vLyAgICAgbGV0IHN5bWJvbCA9IHR5cGUuZ2V0QWxpYXNTeW1ib2woKTsgIC8vIHdpbGwgYmUgZGVmaW5lZCBmb3IgaW1wb3J0ZWQgaW50ZXJmYWNlc1xuXG4vLyAgICAgaWYgKCFzeW1ib2wpIHtcbi8vICAgICAgICAgLy8gRGVjbGFyZWRJbnRlcmZhY2U6IHR5cGUgd2lsbCBiZSBhbiBJbnRlcmZhY2VEZWNsYXJhdGlvbiBvbiBJZGVudGlmaWVyIG5vZGUgdGhhdCBpcyB0aGUgY2hpbGQgb2YgdGhlIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1xuLy8gICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gZXhwcmVzc2lvbi5nZXRGaXJzdERlc2NlbmRhbnRCeUtpbmQoU3ludGF4S2luZC5JZGVudGlmaWVyKTtcbi8vICAgICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XG4vLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElkZW50aWZpZXIgbm90IGZvdW5kIGZvciAke2V4cHJlc3Npb24uZ2V0VGV4dCgpfS5gKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICBzeW1ib2wgPSBpZGVudGlmaWVyLmdldFN5bWJvbCgpO1xuLy8gICAgICAgICBpZiAoIXN5bWJvbCkge1xuLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW1ib2wgbm90IGZvdW5kIGZvciAke2lkZW50aWZpZXIuZ2V0VGV4dCgpfS5gKTtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cblxuLy8gICAgIC8vIFN0ZXAgMzogR2V0IHRoZSBkZWNsYXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2xcbi8vICAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBzeW1ib2wuZ2V0RGVjbGFyYXRpb25zKCk7XG5cbi8vICAgICAvLyBTdGVwIDQ6IEZpbHRlciBmb3IgSW50ZXJmYWNlRGVjbGFyYXRpb25cbi8vICAgICBjb25zdCBpbnRlcmZhY2VEZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9ucy5maW5kKGRlY2xhcmF0aW9uID0+IGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pIGFzIEludGVyZmFjZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkO1xuXG4vLyAgICAgaWYgKCFpbnRlcmZhY2VEZWNsYXJhdGlvbikge1xuLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVyZmFjZSBkZWNsYXJhdGlvbiBub3QgZm91bmQgZm9yICR7ZXhwcmVzc2lvbi5nZXRUZXh0KCl9LmApO1xuLy8gICAgIH1cblxuLy8gICAgIHJldHVybiBpbnRlcmZhY2VEZWNsYXJhdGlvbjtcbi8vIH1cbiJdfQ==
|
|
1878
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW50aXR5RGljdGlvbmFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYW1peF9mdW5jdGlvbnMvRW50aXR5RGljdGlvbmFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBczFESCwwQ0FhQztBQW1IRCxvREFpQkM7QUFwK0RELHVDQUF1bUI7QUFDdm1CLDhFQUFnRjtBQUNoRixnRUFBa0Q7QUFDbEQsb0VBQWdFO0FBQ2hFLHdDQUE0QztBQUM1QyxpRUFBaUU7QUFDakUsc0RBQXVEO0FBQ3ZELDREQUE4QztBQUM5QyxxREFBdUM7QUFDdkMsZ0RBQXdCO0FBY3hCLE1BQWEsZ0JBQWdCO0lBcUJ6QjtRQW5CTyxhQUFRLEdBQUcsSUFBSSxrQ0FBZSxFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQyxDQUFDLDRDQUE0QztRQUMxRixnQkFBVyxHQUFHLElBQUksR0FBRyxFQUErQyxDQUFDLENBQUMsNERBQTREO1FBQ2xJLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXVELENBQUMsQ0FBQyxnREFBZ0Q7UUFDbEksaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBbUMsQ0FBQyxDQUFDLGdEQUFnRDtRQUMzRyxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQTZDLENBQUMsQ0FBQyxrREFBa0Q7UUFDckgsZUFBVSxHQUFHLElBQUksR0FBRyxFQUE0RCxDQUFDLENBQUMsbURBQW1EO1FBQ3JJLHdCQUFtQixHQUFHLElBQUksR0FBRyxFQUErQixDQUFDLENBQUMscURBQXFEO1FBQ25ILDRCQUF1QixHQUFHLElBQUksR0FBOEYsQ0FBQyxDQUFDLCtDQUErQztRQUM3Syx3QkFBbUIsR0FBRyxJQUFJLEdBQWdDLENBQUMsQ0FBQywrQ0FBK0M7UUFDM0csb0JBQWUsR0FBRyxJQUFJLEdBQUcsRUFBeUMsQ0FBQyxDQUFDLDJD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QUcsYUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDdkQsSUFBSSxLQUFLLEdBQUcsYUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDN0MsSUFBSSxLQUFLLEdBQUcsYUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDN0MsSUFBSSxLQUFLLEdBQUcsYUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDL0MsSUFBSSxLQUFLLEdBQUcsYUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0MsSUFBSSxLQUFLLEdBQUcsYUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFbkQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELGlJQUFpSTtBQUNqSSxvQkFBb0I7QUFDcEIsb0VBQW9FO0FBQ3BFLHlDQUF5QztBQUV6QyxnREFBZ0Q7QUFDaEQsc0ZBQXNGO0FBRXRGLHFCQUFxQjtBQUNyQiw2SUFBNkk7QUFDN0kseUZBQXlGO0FBQ3pGLDZCQUE2QjtBQUM3QixvRkFBb0Y7QUFDcEYsWUFBWTtBQUNaLDJDQUEyQztBQUMzQyx5QkFBeUI7QUFDekIsZ0ZBQWdGO0FBQ2hGLFlBQVk7QUFDWixRQUFRO0FBRVIsaUVBQWlFO0FBQ2pFLHFEQUFxRDtBQUVyRCxpREFBaUQ7QUFDakQsc0pBQXNKO0FBRXRKLG1DQUFtQztBQUNuQywyRkFBMkY7QUFDM0YsUUFBUTtBQUVSLG1DQUFtQztBQUNuQyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhIGZ1bmN0aW9uIGdldE9yQ3JlYXRlWFR5cGUgdGFrZXMgYXJndW1lbnRzIG5hbWU6IHN0cmluZyBhbmQgZWxlbWVudDogdHMtbW9ycGgtdHlwZSBhbmQgcmV0dXJucyBhIEZhbWl4LlR5cGVcbiAqIFRoZSBnb2FsIGlzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHR5cGVzIChlLmcuLCBhIG1ldGhvZCdzIGRlZmluZWRUeXBlKSwgZm9yIHRoZSBtb2RlbC5cbiAqIFRoZSBuYW1lIGRvZXNuJ3QgbmVlZCB0byBiZSBmdWxseSBxdWFsaWZpZWQgKGl0J3MgdGhlIG5hbWUgdXNlZCBpbiB0aGUgc291cmNlIGNvZGUsIG9yIHRoZSBGYW1peCBtb2RlbCkuXG4gKi9cblxuXG5pbXBvcnQgeyBDbGFzc0RlY2xhcmF0aW9uLCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBGdW5jdGlvbkRlY2xhcmF0aW9uLCBJZGVudGlmaWVyLCBJbnRlcmZhY2VEZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24sIE1ldGhvZFNpZ25hdHVyZSwgTW9kdWxlRGVjbGFyYXRpb24sIFByb3BlcnR5RGVjbGFyYXRpb24sIFByb3BlcnR5U2lnbmF0dXJlLCBTb3VyY2VGaWxlLCBUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb24sIFBhcmFtZXRlckRlY2xhcmF0aW9uLCBEZWNvcmF0b3IsIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sIEltcG9ydFNwZWNpZmllciwgQ29tbWVudFJhbmdlLCBFbnVtRGVjbGFyYXRpb24sIEVudW1NZW1iZXIsIFR5cGVBbGlhc0RlY2xhcmF0aW9uLCBGdW5jdGlvbkV4cHJlc3Npb24sIEltcG9ydERlY2xhcmF0aW9uLCBJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiwgU3ludGF4S2luZCwgRXhwcmVzc2lvbiwgVHlwZU5vZGUsIFNjb3BlLCBBcnJvd0Z1bmN0aW9uLCBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMsIEhlcml0YWdlQ2xhdXNlLCB0cywgVHlwZSB9IGZyb20gXCJ0cy1tb3JwaFwiO1xuaW1wb3J0IHsgaXNBbWJpZW50LCBpc05hbWVzcGFjZSB9IGZyb20gXCIuLi9hbmFseXplX2Z1bmN0aW9ucy9wcm9jZXNzX2Z1bmN0aW9uc1wiO1xuaW1wb3J0ICogYXMgRmFtaXggZnJvbSBcIi4uL2xpYi9mYW1peC9tb2RlbC9mYW1peFwiO1xuaW1wb3J0IHsgRmFtaXhSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2xpYi9mYW1peC9mYW1peF9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBsb2dnZXIsIGNvbmZpZyB9IGZyb20gXCIuLi9hbmFseXplXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuaW1wb3J0IEdyYXBoZW1lU3BsaXR0ZXIgPSByZXF1aXJlKCdncmFwaGVtZS1zcGxpdHRlcicpO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tIFwiLi9oZWxwZXJzX2NyZWF0aW9uXCI7XG5pbXBvcnQgKiBhcyBGUU5GdW5jdGlvbnMgZnJvbSBcIi4uL2ZxblwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuZXhwb3J0IHR5cGUgVFNNb3JwaE9iamVjdFR5cGUgPSBJbXBvcnREZWNsYXJhdGlvbiB8IEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uIHwgU291cmNlRmlsZSB8IE1vZHVsZURlY2xhcmF0aW9uIHwgQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IFBhcmFtZXRlckRlY2xhcmF0aW9uIHwgVmFyaWFibGVEZWNsYXJhdGlvbiB8IFByb3BlcnR5RGVjbGFyYXRpb24gfCBQcm9wZXJ0eVNpZ25hdHVyZSB8IFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IElkZW50aWZpZXIgfCBEZWNvcmF0b3IgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEltcG9ydFNwZWNpZmllciB8IENvbW1lbnRSYW5nZSB8IEVudW1EZWNsYXJhdGlvbiB8IEVudW1NZW1iZXIgfCBUeXBlQWxpYXNEZWNsYXJhdGlvbiB8IEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cyB8IFRTTW9ycGhQYXJhbWV0cmljVHlwZTtcblxuZXhwb3J0IHR5cGUgVFNNb3JwaFR5cGVEZWNsYXJhdGlvbiA9IFR5cGVBbGlhc0RlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IFByb3BlcnR5U2lnbmF0dXJlIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IE1ldGhvZFNpZ25hdHVyZSB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBWYXJpYWJsZURlY2xhcmF0aW9uIHwgRW51bU1lbWJlciB8IEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uIHwgVFNNb3JwaFBhcmFtZXRyaWNUeXBlIHwgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIDtcblxuZXhwb3J0IHR5cGUgVFNNb3JwaFBhcmFtZXRyaWNUeXBlID0gQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgQXJyb3dGdW5jdGlvbjtcblxudHlwZSBQYXJhbWV0cmljVmFyaWFudFR5cGUgPSBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlIHwgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uIHwgRmFtaXguUGFyYW1ldHJpY01ldGhvZDtcblxudHlwZSBDb25jcmV0ZUVsZW1lbnRUU01vcnBoVHlwZSA9IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbjtcblxuZXhwb3J0IHR5cGUgSW52b2NhYmxlVHlwZSA9IE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IEFycm93RnVuY3Rpb247XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHlEaWN0aW9uYXJ5IHtcbiAgICBcbiAgICBwdWJsaWMgZmFtaXhSZXAgPSBuZXcgRmFtaXhSZXBvc2l0b3J5KCk7XG4gICAgcHJpdmF0ZSBmbXhBbGlhc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5BbGlhcz4oKTsgLy8gTWFwcyB0aGUgYWxpYXMgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteENsYXNzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZhbWl4LkNsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0NsYXNzPigpOyAvLyBNYXBzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteEludGVyZmFjZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBGYW1peC5JbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlPigpOyAvLyBNYXBzIHRoZSBpbnRlcmZhY2UgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteE1vZHVsZU1hcCA9IG5ldyBNYXA8TW9kdWxlRGVjbGFyYXRpb24sIEZhbWl4Lk1vZHVsZT4oKTsgLy8gTWFwcyB0aGUgbmFtZXNwYWNlIG5hbWVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXG4gICAgcHJpdmF0ZSBmbXhGaWxlTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZT4oKTsgLy8gTWFwcyB0aGUgc291cmNlIGZpbGUgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteFR5cGVNYXAgPSBuZXcgTWFwPFRTTW9ycGhUeXBlRGVjbGFyYXRpb24sIEZhbWl4LlR5cGUgfCBGYW1peC5QYXJhbWV0ZXJUeXBlPigpOyAvLyBNYXBzIHRoZSB0eXBlcyBkZWNsYXJhdGlvbnMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteFByaW1pdGl2ZVR5cGVNYXAgPSBuZXcgTWFwPHN0cmluZywgRmFtaXguUHJpbWl0aXZlVHlwZT4oKTsgLy8gTWFwcyB0aGUgcHJpbWl0aXZlIHR5cGUgbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZhbWl4LkZ1bmN0aW9uIHwgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uIHwgRmFtaXguTWV0aG9kIHwgRmFtaXguUGFyYW1ldHJpY01ldGhvZD47IC8vIE1hcHMgdGhlIGZ1bmN0aW9uIG5hbWVzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXG4gICAgcHJpdmF0ZSBmbXhBcnJvd0Z1bmN0aW9uTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZhbWl4LkFycm93RnVuY3Rpb24+OyAvLyBNYXBzIHRoZSBmdW5jdGlvbiBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxuICAgIHByaXZhdGUgZm14UGFyYW1ldGVyTWFwID0gbmV3IE1hcDxQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgRmFtaXguUGFyYW1ldGVyPigpOyAvLyBNYXBzIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXG4gICAgcHJpdmF0ZSBmbXhWYXJpYWJsZU1hcCA9IG5ldyBNYXA8VmFyaWFibGVEZWNsYXJhdGlvbiwgRmFtaXguVmFyaWFibGU+KCk7IC8vIE1hcHMgdGhlIHZhcmlhYmxlcyB0byB0aGVpciBGYW1peCBtb2RlbFxuICAgIHByaXZhdGUgZm14SW1wb3J0Q2xhdXNlTWFwID0gbmV3IE1hcDxJbXBvcnREZWNsYXJhdGlvbiB8IEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uLCBGYW1peC5JbXBvcnRDbGF1c2U+KCk7IC8vIE1hcHMgdGhlIGltcG9ydCBjbGF1c2VzIHRvIHRoZWlyIEZhbWl4IG1vZGVsXG4gICAgcHJpdmF0ZSBmbXhFbnVtTWFwID0gbmV3IE1hcDxFbnVtRGVjbGFyYXRpb24sIEZhbWl4LkVudW0+KCk7IC8vIE1hcHMgdGhlIGVudW0gbmFtZXMgdG8gdGhlaXIgRmFtaXggbW9kZWxcbiAgICBwcml2YXRlIGZteEluaGVyaXRhbmNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZhbWl4LkluaGVyaXRhbmNlPigpOyAvLyBNYXBzIHRoZSBpbmhlcml0YW5jZSBuYW1lcyB0byB0aGVpciBGYW1peCBtb2RlbFxuICAgIHByaXZhdGUgVU5LTk9XTl9WQUxVRSA9ICcodW5rbm93biBkdWUgdG8gcGFyc2luZyBlcnJvciknOyAvLyBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gYSBuYW1lIGlzIG5vdCB1c2FibGVcbiAgICBwdWJsaWMgZm14RWxlbWVudE9iamVjdE1hcCA9IG5ldyBNYXA8RmFtaXguRW50aXR5LFRTTW9ycGhPYmplY3RUeXBlPigpO1xuICAgIHB1YmxpYyB0c01vcnBoRWxlbWVudE9iamVjdE1hcCA9IG5ldyBNYXA8VFNNb3JwaE9iamVjdFR5cGUsRmFtaXguRW50aXR5PigpO1xuICAgICAgICAgICAgXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmFtaXhSZXAuc2V0Rm14RWxlbWVudE9iamVjdE1hcCh0aGlzLmZteEVsZW1lbnRPYmplY3RNYXApOyAgICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRTb3VyY2VBbmNob3IoZm14OiBGYW1peC5Tb3VyY2VkRW50aXR5LCBub2RlOiBUU01vcnBoT2JqZWN0VHlwZSk6IEZhbWl4LkluZGV4ZWRGaWxlQW5jaG9yIHtcbiAgICAgICAgY29uc3Qgc291cmNlQW5jaG9yOiBGYW1peC5JbmRleGVkRmlsZUFuY2hvciA9IG5ldyBGYW1peC5JbmRleGVkRmlsZUFuY2hvcigpO1xuICAgICAgICBsZXQgc291cmNlU3RhcnQsIHNvdXJjZUVuZDogbnVtYmVyO1xuICAgICAgICBpZiAoZm14ICYmIG5vZGUpIHtcbiAgICAgICAgICAgIC8vIGZpbmQgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIG9mIHRoZSBzb3VyY2UgZWxlbWVudFxuICAgICAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIENvbW1lbnRSYW5nZSkpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VTdGFydCA9IG5vZGUuZ2V0U3RhcnQoKTtcbiAgICAgICAgICAgICAgICBzb3VyY2VFbmQgPSBub2RlLmdldEVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VTdGFydCA9IG5vZGUuZ2V0UG9zKCk7XG4gICAgICAgICAgICAgICAgc291cmNlRW5kID0gbm9kZS5nZXRFbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIGlmIChjb25maWcuZXhwZWN0R3JhcGhlbWVzKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogVGhlIGZvbGxvd2luZyBsb2dpYyBoYW5kbGVzIHRoZSBjYXNlIG9mIG11bHRpLWNvZGUgcG9pbnQgY2hhcmFjdGVycyAoZS5nLiBlbW9qaSkgaW4gdGhlIHNvdXJjZSB0ZXh0LlxuICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgUGhhcm8vU21hbGx0YWxrIHRyZWF0cyBtdWx0aS1jb2RlIHBvaW50IGNoYXJhY3RlcnMgYXMgYSBzaW5nbGUgY2hhcmFjdGVyLCBcbiAgICAgICAgICAgICAgICAgKiBidXQgSmF2YVNjcmlwdCB0cmVhdHMgdGhlbSBhcyBtdWx0aXBsZSBjaGFyYWN0ZXJzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zXG4gICAgICAgICAgICAgICAgICogb2YgYSBzb3VyY2UgZWxlbWVudCBpbiBQaGFyby9TbWFsbHRhbGsgd2lsbCBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgb2YgdGhlXG4gICAgICAgICAgICAgICAgICogc2FtZSBzb3VyY2UgZWxlbWVudCBpbiBKYXZhU2NyaXB0LiBUaGlzIGxvZ2ljIGZpbmRzIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGUgc291cmNlXG4gICAgICAgICAgICAgICAgICogZWxlbWVudCBpbiBKYXZhU2NyaXB0IGFuZCB0aGVuIHVzZXMgdGhvc2UgcG9zaXRpb25zIHRvIHNldCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgb2YgdGhlXG4gICAgICAgICAgICAgICAgICogRmFtaXggaW5kZXggZmlsZSBhbmNob3IuXG4gICAgICAgICAgICAgICAgICogSXQgZGVwZW5kcyBvbiBjb2RlIGluIHRoZSAnZ3JhcGhlbWUtc3BsaXR0ZXInIHBhY2thZ2UgaW4gbnBtLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0dGVyID0gbmV3IEdyYXBoZW1lU3BsaXR0ZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlVGV4dCA9IG5vZGUuZ2V0U291cmNlRmlsZSgpLmdldEZ1bGxUZXh0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzR3JhcGhlbWVDbHVzdGVycyA9IHNwbGl0dGVyLmNvdW50R3JhcGhlbWVzKHNvdXJjZUZpbGVUZXh0KSA+IDE7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0dyYXBoZW1lQ2x1c3RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudFRleHQgPSBzb3VyY2VGaWxlVGV4dC5zdWJzdHJpbmcoc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzID0gc3BsaXR0ZXIuc3BsaXRHcmFwaGVtZXMoc291cmNlRWxlbWVudFRleHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcyA9IHNwbGl0dGVyLnNwbGl0R3JhcGhlbWVzKHNvdXJjZUZpbGVUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZHcmFwaGVtZUNsdXN0ZXJzQmVmb3JlU3RhcnQgPSBzcGxpdHRlci5jb3VudEdyYXBoZW1lcyhzb3VyY2VGaWxlVGV4dC5zdWJzdHJpbmcoMCwgc291cmNlU3RhcnQpKTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBzb3VyY2VFbGVtZW50VGV4dEdyYXBoZW1lcyBhcnJheSBpbiB0aGUgc291cmNlRmlsZVRleHRHcmFwaGVtZXMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgc291cmNlU3RhcnQgPSBIZWxwZXJzLmluZGV4T2ZTcGxpdEFycmF5KHtzZWFyY2hBcnJheTogc291cmNlRmlsZVRleHRHcmFwaGVtZXMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRBcnJheTogc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogc291cmNlU3RhcnQgLSBudW1iZXJPZkdyYXBoZW1lQ2x1c3RlcnNCZWZvcmVTdGFydH0pO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VFbmQgPSBzb3VyY2VTdGFydCArIHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUaGUgKzEgaXMgYmVjYXVzZSB0aGUgc291cmNlIGFuY2hvciAoUGhhcm8pIGlzIDEtYmFzZWQsIGJ1dCB0cy1tb3JwaCBpcyAwLWJhc2VkXG4gICAgICAgICAgICBzb3VyY2VBbmNob3Iuc3RhcnRQb3MgPSBzb3VyY2VTdGFydCArIDE7XG4gICAgICAgICAgICBzb3VyY2VBbmNob3IuZW5kUG9zID0gc291cmNlRW5kO1xuXG4gICAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBub2RlLmdldFNvdXJjZUZpbGUoKS5nZXRGaWxlUGF0aCgpIGFzIHN0cmluZztcbiAgICAgICAgICAgIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc291cmNlQW5jaG9yLmVsZW1lbnQgPSBmbXg7XG4gICAgICAgICAgICBzb3VyY2VBbmNob3IuZmlsZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgICAgICAgIGZteC5zb3VyY2VBbmNob3IgPSBzb3VyY2VBbmNob3I7XG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoc291cmNlQW5jaG9yKTtcblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2VBbmNob3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBGYW1peCBpbmRleCBmaWxlIGFuY2hvclxuICAgICAqIEBwYXJhbSBzb3VyY2VFbGVtZW50IEEgc291cmNlIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZmFtaXhFbGVtZW50IFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgc291cmNlIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgbWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHNvdXJjZUVsZW1lbnQ6IFRTTW9ycGhPYmplY3RUeXBlLCBmYW1peEVsZW1lbnQ6IEZhbWl4LlNvdXJjZWRFbnRpdHkpOiB2b2lkIHtcbiAgICAgICAgLy8gRmFtaXguQ29tbWVudCBpcyBub3QgYSBuYW1lZCBlbnRpdHkgKGRvZXMgbm90IGhhdmUgYSBmdWxseVF1YWxpZmllZE5hbWUpXG4gICAgICAgIGlmICghKGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LkNvbW1lbnQpKSB7ICAvLyBtdXN0IGJlIGEgbmFtZWQgZW50aXR5XG4gICAgICAgICAgICAvLyBpbnNhbml0eSBjaGVjazogbmFtZWQgZW50aXRpZXMgc2hvdWxkIGhhdmUgZnVsbHlRdWFsaWZpZWROYW1lXG4gICAgICAgICAgICBjb25zdCBmdWxseVF1YWxpZmllZE5hbWUgPSAoZmFtaXhFbGVtZW50IGFzIEZhbWl4Lk5hbWVkRW50aXR5KS5mdWxseVF1YWxpZmllZE5hbWU7XG4gICAgICAgICAgICBpZiAoIWZ1bGx5UXVhbGlmaWVkTmFtZSB8fCBmdWxseVF1YWxpZmllZE5hbWUgPT09IHRoaXMuVU5LTk9XTl9WQUxVRSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggZWxlbWVudCAke2ZhbWl4RWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfSBoYXMgbm8gdmFsaWQgZnVsbHlRdWFsaWZpZWROYW1lLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwibWFraW5nIGluZGV4IGZpbGUgYW5jaG9yIGZvciAnXCIgKyBzb3VyY2VFbGVtZW50Py5nZXRUZXh0KCkgKyBcIicgd2l0aCBmYW1peEVsZW1lbnQgXCIgKyBmYW1peEVsZW1lbnQuZ2V0SlNPTigpKTtcbiAgICAgICAgY29uc3QgZm14SW5kZXhGaWxlQW5jaG9yID0gbmV3IEZhbWl4LkluZGV4ZWRGaWxlQW5jaG9yKCk7XG4gICAgICAgIGZteEluZGV4RmlsZUFuY2hvci5lbGVtZW50ID0gZmFtaXhFbGVtZW50O1xuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZhbWl4RWxlbWVudCwgc291cmNlRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZUVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aFByb2plY3QgPSB0aGlzLmZhbWl4UmVwLmdldEFic29sdXRlUGF0aCgpO1xuICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgubm9ybWFsaXplKHNvdXJjZUVsZW1lbnQuZ2V0U291cmNlRmlsZSgpLmdldEZpbGVQYXRoKCkpO1xuXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbk5vZGVNb2R1bGVzID0gYWJzb2x1dGVQYXRoLmluZGV4T2YoJ25vZGVfbW9kdWxlcycpO1xuXG4gICAgICAgICAgICBsZXQgcGF0aEluUHJvamVjdDogc3RyaW5nID0gXCJcIjtcblxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uTm9kZU1vZHVsZXMgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aEZyb21Ob2RlTW9kdWxlcyA9IGFic29sdXRlUGF0aC5zdWJzdHJpbmcocG9zaXRpb25Ob2RlTW9kdWxlcyk7XG4gICAgICAgICAgICAgICAgcGF0aEluUHJvamVjdCA9IHBhdGhGcm9tTm9kZU1vZHVsZXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhdGhJblByb2plY3QgPSB0aGlzLmNvbnZlcnRUb1JlbGF0aXZlUGF0aChhYnNvbHV0ZVBhdGgsIGFic29sdXRlUGF0aFByb2plY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyByZXZlcnQgYW55IGJhY2tzbGFzaGVzIHRvIGZvcndhcmQgc2xhc2hlcyAocGF0aC5ub3JtYWxpemUgb24gd2luZG93cyBpbnRyb2R1Y2VzIHRoZW0pXG4gICAgICAgICAgICBwYXRoSW5Qcm9qZWN0ID0gcGF0aEluUHJvamVjdC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblxuICAgICAgICAgICAgaWYgKHBhdGhJblByb2plY3Quc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICBwYXRoSW5Qcm9qZWN0ID0gcGF0aEluUHJvamVjdC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZteEluZGV4RmlsZUFuY2hvci5maWxlTmFtZSA9IHBhdGhJblByb2plY3Q7XG4gICAgICAgICAgICBsZXQgc291cmNlU3RhcnQsIHNvdXJjZUVuZFxuICAgICAgICAgICAgLy8gLHNvdXJjZUxpbmVTdGFydCwgc291cmNlTGluZUVuZFxuICAgICAgICAgICAgOiBudW1iZXI7XG4gICAgICAgICAgICBpZiAoIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgQ29tbWVudFJhbmdlKSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gc291cmNlRWxlbWVudC5nZXRTdGFydCgpO1xuICAgICAgICAgICAgICAgIHNvdXJjZUVuZCA9IHNvdXJjZUVsZW1lbnQuZ2V0RW5kKCk7XG4gICAgICAgICAgICAgICAgLy8gc291cmNlTGluZVN0YXJ0ID0gc291cmNlRWxlbWVudC5nZXRTdGFydExpbmVOdW1iZXIoKTtcbiAgICAgICAgICAgICAgICAvLyBzb3VyY2VMaW5lRW5kID0gc291cmNlRWxlbWVudC5nZXRFbmRMaW5lTnVtYmVyKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZVN0YXJ0ID0gc291cmNlRWxlbWVudC5nZXRQb3MoKTtcbiAgICAgICAgICAgICAgICBzb3VyY2VFbmQgPSBzb3VyY2VFbGVtZW50LmdldEVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZy5leHBlY3RHcmFwaGVtZXMpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGxvZ2ljIGhhbmRsZXMgdGhlIGNhc2Ugb2YgbXVsdGktY29kZSBwb2ludCBjaGFyYWN0ZXJzIChlLmcuIGVtb2ppKSBpbiB0aGUgc291cmNlIHRleHQuXG4gICAgICAgICAgICAgICAgICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBQaGFyby9TbWFsbHRhbGsgdHJlYXRzIG11bHRpLWNvZGUgcG9pbnQgY2hhcmFjdGVycyBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIFxuICAgICAgICAgICAgICAgICAqIGJ1dCBKYXZhU2NyaXB0IHRyZWF0cyB0aGVtIGFzIG11bHRpcGxlIGNoYXJhY3RlcnMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnNcbiAgICAgICAgICAgICAgICAgKiBvZiBhIHNvdXJjZSBlbGVtZW50IGluIFBoYXJvL1NtYWxsdGFsayB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGVcbiAgICAgICAgICAgICAgICAgKiBzYW1lIHNvdXJjZSBlbGVtZW50IGluIEphdmFTY3JpcHQuIFRoaXMgbG9naWMgZmluZHMgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIG9mIHRoZSBzb3VyY2VcbiAgICAgICAgICAgICAgICAgKiBlbGVtZW50IGluIEphdmFTY3JpcHQgYW5kIHRoZW4gdXNlcyB0aG9zZSBwb3NpdGlvbnMgdG8gc2V0IHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiB0aGVcbiAgICAgICAgICAgICAgICAgKiBGYW1peCBpbmRleCBmaWxlIGFuY2hvci5cbiAgICAgICAgICAgICAgICAgKiBJdCBkZXBlbmRzIG9uIGNvZGUgaW4gdGhlICdncmFwaGVtZS1zcGxpdHRlcicgcGFja2FnZSBpbiBucG0uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgR3JhcGhlbWVTcGxpdHRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVUZXh0ID0gc291cmNlRWxlbWVudC5nZXRTb3VyY2VGaWxlKCkuZ2V0RnVsbFRleHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNHcmFwaGVtZUNsdXN0ZXJzID0gc3BsaXR0ZXIuY291bnRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQpID4gMTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzR3JhcGhlbWVDbHVzdGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50VGV4dCA9IHNvdXJjZUZpbGVUZXh0LnN1YnN0cmluZyhzb3VyY2VTdGFydCwgc291cmNlRW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMgPSBzcGxpdHRlci5zcGxpdEdyYXBoZW1lcyhzb3VyY2VFbGVtZW50VGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVUZXh0R3JhcGhlbWVzID0gc3BsaXR0ZXIuc3BsaXRHcmFwaGVtZXMoc291cmNlRmlsZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJPZkdyYXBoZW1lQ2x1c3RlcnNCZWZvcmVTdGFydCA9IHNwbGl0dGVyLmNvdW50R3JhcGhlbWVzKHNvdXJjZUZpbGVUZXh0LnN1YnN0cmluZygwLCBzb3VyY2VTdGFydCkpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIHNvdXJjZUVsZW1lbnRUZXh0R3JhcGhlbWVzIGFycmF5IGluIHRoZSBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VTdGFydCA9IEhlbHBlcnMuaW5kZXhPZlNwbGl0QXJyYXkoe3NlYXJjaEFycmF5OiBzb3VyY2VGaWxlVGV4dEdyYXBoZW1lcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEFycmF5OiBzb3VyY2VFbGVtZW50VGV4dEdyYXBoZW1lcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzb3VyY2VTdGFydCAtIG51bWJlck9mR3JhcGhlbWVDbHVzdGVyc0JlZm9yZVN0YXJ0fSk7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUVuZCA9IHNvdXJjZVN0YXJ0ICsgc291cmNlRWxlbWVudFRleHRHcmFwaGVtZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBub3RlOiB0aGUgKzEgaXMgYmVjYXVzZSB0aGUgc291cmNlIGFuY2hvciBpcyAxLWJhc2VkLCBidXQgdHMtbW9ycGggaXMgMC1iYXNlZFxuICAgICAgICAgICAgZm14SW5kZXhGaWxlQW5jaG9yLnN0YXJ0UG9zID0gc291cmNlU3RhcnQgKyAxO1xuICAgICAgICAgICAgZm14SW5kZXhGaWxlQW5jaG9yLmVuZFBvcyA9IHNvdXJjZUVuZDtcblxuICAgICAgICAgICAgLy8gaWYgKCEoZmFtaXhFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguSW1wb3J0Q2xhdXNlIHx8IGZhbWl4RWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LkFjY2VzcyB8fCBmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5SZWZlcmVuY2UgfHwgZmFtaXhFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguSW52b2NhdGlvbiB8fCBmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5Jbmhlcml0YW5jZSkgJiYgIShmYW1peEVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5Db21tZW50KSAmJiAhKHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBDb21tZW50UmFuZ2UpICYmICEoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIElkZW50aWZpZXIpICYmICEoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEltcG9ydFNwZWNpZmllcikgJiYgIShzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKSkge1xuICAgICAgICAgICAgLy8gICAgaW5pdEZRTihzb3VyY2VFbGVtZW50LCBmYW1peEVsZW1lbnQpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc291cmNlRWxlbWVudCBpcyBudWxsXG4gICAgICAgICAgICBsb2dnZXIud2FybihcInNvdXJjZUVsZW1lbnQgaXMgbnVsbCBmb3IgZmFtaXhFbGVtZW50IFwiICsgZmFtaXhFbGVtZW50LmdldEpTT04oKSk7XG4gICAgICAgICAgICBmbXhJbmRleEZpbGVBbmNob3IuZmlsZU5hbWUgPSBcInVua25vd25cIjtcbiAgICAgICAgICAgIGZteEluZGV4RmlsZUFuY2hvci5zdGFydFBvcyA9IDA7XG4gICAgICAgICAgICBmbXhJbmRleEZpbGVBbmNob3IuZW5kUG9zID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhJbmRleEZpbGVBbmNob3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IHNjcmlwdCBlbnRpdHkgb3IgbW9kdWxlXG4gICAgICogQHBhcmFtIGYgQSBzb3VyY2UgZmlsZVxuICAgICAqIEBwYXJhbSBpc01vZHVsZSBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgc291cmNlIGZpbGUgaXMgYSBtb2R1bGVcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHNvdXJjZSBmaWxlXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhGaWxlKGY6IFNvdXJjZUZpbGUsIGlzTW9kdWxlOiBib29sZWFuKTogRmFtaXguU2NyaXB0RW50aXR5IHwgRmFtaXguTW9kdWxlIHtcbiAgICAgICAgbGV0IGZteEZpbGU6IEZhbWl4LlNjcmlwdEVudGl0eTsgLy8gfCBGYW1peC5Nb2R1bGU7XG5cbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmLmdldEJhc2VOYW1lKCk7XG4gICAgICAgIGNvbnN0IGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUgPSBmLmdldEZpbGVQYXRoKCk7XG4gICAgICAgIGNvbnN0IGZvdW5kRmlsZU5hbWUgPSB0aGlzLmZteEZpbGVNYXAuZ2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpO1xuICAgICAgICBpZiAoIWZvdW5kRmlsZU5hbWUpIHtcbiAgICAgICAgICAgIGlmIChpc01vZHVsZSkge1xuICAgICAgICAgICAgICAgIGZteEZpbGUgPSBuZXcgRmFtaXguTW9kdWxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbXhGaWxlID0gbmV3IEZhbWl4LlNjcmlwdEVudGl0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm14RmlsZS5uYW1lID0gZmlsZU5hbWU7XG4gICAgICAgICAgICBmbXhGaWxlLm51bWJlck9mTGluZXNPZlRleHQgPSBmLmdldEVuZExpbmVOdW1iZXIoKSAtIGYuZ2V0U3RhcnRMaW5lTnVtYmVyKCk7XG4gICAgICAgICAgICBmbXhGaWxlLm51bWJlck9mQ2hhcmFjdGVycyA9IGYuZ2V0RnVsbFRleHQoKS5sZW5ndGg7XG5cbiAgICAgICAgICAgIGluaXRGUU4oZiwgZm14RmlsZSk7XG5cbiAgICAgICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGYsIGZteEZpbGUpO1xuXG4gICAgICAgICAgICB0aGlzLmZteEZpbGVNYXAuc2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUsIGZteEZpbGUpO1xuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm14RmlsZSA9IGZvdW5kRmlsZU5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEZpbGUsZik7XG4gICAgICAgIHJldHVybiBmbXhGaWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IE1vZHVsZVxuICAgICAqIEBwYXJhbSBtb2R1bGVEZWNsYXJhdGlvbiBBIG1vZHVsZVxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgbW9kdWxlXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhNb2R1bGUobW9kdWxlRGVjbGFyYXRpb246IE1vZHVsZURlY2xhcmF0aW9uKTogRmFtaXguTW9kdWxlIHtcbiAgICAgICAgaWYgKHRoaXMuZm14TW9kdWxlTWFwLmhhcyhtb2R1bGVEZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHJNb2R1bGUgPSB0aGlzLmZteE1vZHVsZU1hcC5nZXQobW9kdWxlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgaWYgKHJNb2R1bGUpIHsgXG4gICAgICAgICAgICAgICByZXR1cm4gck1vZHVsZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCBtb2R1bGUgJHttb2R1bGVEZWNsYXJhdGlvbi5nZXROYW1lKCl9IGlzIG5vdCBmb3VuZCBpbiB0aGUgbW9kdWxlIG1hcC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZteE1vZHVsZSA9IG5ldyBGYW1peC5Nb2R1bGUoKTtcbiAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IG1vZHVsZURlY2xhcmF0aW9uLmdldE5hbWUoKTtcbiAgICAgICAgZm14TW9kdWxlLm5hbWUgPSBtb2R1bGVOYW1lO1xuICAgICAgICBmbXhNb2R1bGUuaXNBbWJpZW50ID0gaXNBbWJpZW50KG1vZHVsZURlY2xhcmF0aW9uKTtcbiAgICAgICAgZm14TW9kdWxlLmlzTmFtZXNwYWNlID0gaXNOYW1lc3BhY2UobW9kdWxlRGVjbGFyYXRpb24pO1xuICAgICAgICBmbXhNb2R1bGUuaXNNb2R1bGUgPSAhZm14TW9kdWxlLmlzTmFtZXNwYWNlICYmICFmbXhNb2R1bGUuaXNBbWJpZW50O1xuXG4gICAgICAgIGluaXRGUU4obW9kdWxlRGVjbGFyYXRpb24sIGZteE1vZHVsZSk7XG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKG1vZHVsZURlY2xhcmF0aW9uLCBmbXhNb2R1bGUpO1xuXG4gICAgICAgIHRoaXMuZm14TW9kdWxlTWFwLnNldChtb2R1bGVEZWNsYXJhdGlvbiwgZm14TW9kdWxlKTtcblxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14TW9kdWxlKTtcblxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteE1vZHVsZSxtb2R1bGVEZWNsYXJhdGlvbik7XG4gICAgICAgIHJldHVybiBmbXhNb2R1bGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGFsaWFzXG4gICAgICogQHBhcmFtIHR5cGVBbGlhc0RlY2xhcmF0aW9uIEFuIGFsaWFzXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBhbGlhc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGYW1peEFsaWFzKHR5cGVBbGlhc0RlY2xhcmF0aW9uOiBUeXBlQWxpYXNEZWNsYXJhdGlvbik6IEZhbWl4LkFsaWFzIHtcbiAgICAgICAgbGV0IGZteEFsaWFzOiBGYW1peC5BbGlhcztcbiAgICAgICAgY29uc3QgYWxpYXNOYW1lID0gdHlwZUFsaWFzRGVjbGFyYXRpb24uZ2V0TmFtZSgpO1xuICAgICAgICAvL2NvbnN0IGFsaWFzRnVsbHlRdWFsaWZpZWROYW1lID0gYS5nZXRUeXBlKCkuZ2V0VGV4dCgpOyAvLyBGUU5GdW5jdGlvbnMuZ2V0RlFOKGEpO1xuICAgICAgICBjb25zdCBhbGlhc0Z1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4odHlwZUFsaWFzRGVjbGFyYXRpb24pO1xuICAgICAgICBjb25zdCBmb3VuZEFsaWFzID0gdGhpcy5mbXhBbGlhc01hcC5nZXQoYWxpYXNGdWxseVF1YWxpZmllZE5hbWUpO1xuICAgICAgICBpZiAoIWZvdW5kQWxpYXMpIHtcbiAgICAgICAgICAgIGZteEFsaWFzID0gbmV3IEZhbWl4LkFsaWFzKCk7XG4gICAgICAgICAgICBmbXhBbGlhcy5uYW1lID0gdHlwZUFsaWFzRGVjbGFyYXRpb24uZ2V0TmFtZSgpO1xuICAgICAgICAgICAgY29uc3QgYWxpYXNOYW1lV2l0aEdlbmVyaWNzID0gYWxpYXNOYW1lICsgKHR5cGVBbGlhc0RlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID8gKFwiPFwiICsgdHlwZUFsaWFzRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAodHAgPT4gdHAuZ2V0TmFtZSgpKS5qb2luKFwiLCBcIikgKyBcIj5cIikgOiBcIlwiKTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgPiBOT1RFOiBhbGlhcyAke2FsaWFzTmFtZX0gaGFzIGZ1bGx5IHF1YWxpZmllZCBuYW1lICR7YWxpYXNGdWxseVF1YWxpZmllZE5hbWV9IGFuZCBuYW1lIHdpdGggZ2VuZXJpY3MgJHthbGlhc05hbWVXaXRoR2VuZXJpY3N9LmApO1xuXG4gICAgICAgICAgICBjb25zdCBmbXhUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShhbGlhc05hbWVXaXRoR2VuZXJpY3MsIHR5cGVBbGlhc0RlY2xhcmF0aW9uLmdldFR5cGUoKSwgdHlwZUFsaWFzRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgZm14QWxpYXMuYWxpYXNlZEVudGl0eSA9IGZteFR5cGU7XG4gICAgICAgICAgICBpbml0RlFOKHR5cGVBbGlhc0RlY2xhcmF0aW9uLCBmbXhBbGlhcyk7XG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcih0eXBlQWxpYXNEZWNsYXJhdGlvbiwgZm14QWxpYXMpO1xuXG4gICAgICAgICAgICB0aGlzLmZteEFsaWFzTWFwLnNldChhbGlhc0Z1bGx5UXVhbGlmaWVkTmFtZSwgZm14QWxpYXMpO1xuXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14QWxpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm14QWxpYXMgPSBmb3VuZEFsaWFzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14QWxpYXMsdHlwZUFsaWFzRGVjbGFyYXRpb24pO1xuXG4gICAgICAgIHJldHVybiBmbXhBbGlhcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBjbGFzcyBvciBwYXJhbWV0ZXJpemFibGUgY2xhc3NcbiAgICAgKiBAcGFyYW0gY2xzIEEgY2xhc3NcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNsYXNzXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhDbGFzcyhjbHM6IENsYXNzRGVjbGFyYXRpb24pOiBGYW1peC5DbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNDbGFzcyB7XG4gICAgICAgIGxldCBmbXhDbGFzczogRmFtaXguQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljQ2xhc3M7XG4gICAgICAgIGNvbnN0IGlzQWJzdHJhY3QgPSBjbHMuaXNBYnN0cmFjdCgpO1xuICAgICAgICBjb25zdCBjbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oY2xzKTtcbiAgICAgICAgY29uc3QgY2xzTmFtZSA9IGNscy5nZXROYW1lKCkgfHwgdGhpcy5VTktOT1dOX1ZBTFVFO1xuICAgICAgICBjb25zdCBpc0dlbmVyaWMgPSBjbHMuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZvdW5kQ2xhc3MgPSB0aGlzLmZteENsYXNzTWFwLmdldChjbGFzc0Z1bGx5UXVhbGlmaWVkTmFtZSk7XG4gICAgICAgIGlmICghZm91bmRDbGFzcykge1xuICAgICAgICAgICAgaWYgKGlzR2VuZXJpYykge1xuICAgICAgICAgICAgICAgIGZteENsYXNzID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNDbGFzcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm14Q2xhc3MgPSBuZXcgRmFtaXguQ2xhc3MoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm14Q2xhc3MubmFtZSA9IGNsc05hbWU7XG4gICAgICAgICAgICBpbml0RlFOKGNscywgZm14Q2xhc3MpO1xuICAgICAgICAgICAgLy8gZm14Q2xhc3MuZnVsbHlRdWFsaWZpZWROYW1lID0gY2xhc3NGdWxseVF1YWxpZmllZE5hbWU7XG4gICAgICAgICAgICBmbXhDbGFzcy5pc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDtcblxuICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoY2xzLCBmbXhDbGFzcyk7XG5cbiAgICAgICAgICAgIHRoaXMuZm14Q2xhc3NNYXAuc2V0KGNsYXNzRnVsbHlRdWFsaWZpZWROYW1lLCBmbXhDbGFzcyk7XG5cbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhDbGFzcyk7XG5cbiAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14Q2xhc3MsY2xzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZteENsYXNzID0gZm91bmRDbGFzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbXhDbGFzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBpbnRlcmZhY2Ugb3IgcGFyYW1ldGVyaXphYmxlIGludGVyZmFjZVxuICAgICAqIEBwYXJhbSBpbnRlciBBbiBpbnRlcmZhY2VcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGludGVyZmFjZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlKGludGVyOiBJbnRlcmZhY2VEZWNsYXJhdGlvbik6IEZhbWl4LkludGVyZmFjZSB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2Uge1xuXG4gICAgICAgIGxldCBmbXhJbnRlcmZhY2U6IEZhbWl4LkludGVyZmFjZSB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2U7XG4gICAgICAgIGNvbnN0IGludGVyTmFtZSA9IGludGVyLmdldE5hbWUoKTtcbiAgICAgICAgY29uc3QgaW50ZXJGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGludGVyKTtcbiAgICAgICAgY29uc3QgZm91bmRJbnRlcmZhY2UgPSB0aGlzLmZteEludGVyZmFjZU1hcC5nZXQoaW50ZXJGdWxseVF1YWxpZmllZE5hbWUpO1xuICAgICAgICBpZiAoIWZvdW5kSW50ZXJmYWNlKSB7XG4gICAgICAgICAgICBjb25zdCBpc0dlbmVyaWMgPSBpbnRlci5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChpc0dlbmVyaWMpIHtcbiAgICAgICAgICAgICAgICBmbXhJbnRlcmZhY2UgPSBuZXcgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm14SW50ZXJmYWNlID0gbmV3IEZhbWl4LkludGVyZmFjZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbXhJbnRlcmZhY2UubmFtZSA9IGludGVyTmFtZTtcbiAgICAgICAgICAgIGluaXRGUU4oaW50ZXIsIGZteEludGVyZmFjZSk7XG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihpbnRlciwgZm14SW50ZXJmYWNlKTtcblxuICAgICAgICAgICAgdGhpcy5mbXhJbnRlcmZhY2VNYXAuc2V0KGludGVyRnVsbHlRdWFsaWZpZWROYW1lLCBmbXhJbnRlcmZhY2UpO1xuXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14SW50ZXJmYWNlKTtcblxuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhJbnRlcmZhY2UsaW50ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm14SW50ZXJmYWNlID0gZm91bmRJbnRlcmZhY2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZteEludGVyZmFjZTtcbiAgICB9XG5cbiAgICBcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCBjb25jcmV0ZSBlbGVtZW50XG4gICAgICogQHBhcmFtIGNvbmNyZXRlRWxlbWVudCBBIHBhcmFtZXRyaWMgRWxlbWVudCAgIFxuICAgICAqIEBwYXJhbSBjb25jcmV0ZUVsZW1lbnREZWNsYXJhdGlvbiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvblxuICAgICAqIEBwYXJhbSBjb25jcmV0ZUFyZ3VtZW50cyBjb25jcmV0ZSBhcmd1bWVudHNcbiAgICAgKiBAcmV0dXJucyBBIHBhcmFtZXRyaWMgRWxlbWVudCAgXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoY29uY3JldGVFbGVtZW50IDogUGFyYW1ldHJpY1ZhcmlhbnRUeXBlLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jcmV0ZUVsZW1lbnREZWNsYXJhdGlvbiA6IENvbmNyZXRlRWxlbWVudFRTTW9ycGhUeXBlLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jcmV0ZUFyZ3VtZW50czogVHlwZU5vZGVbXSk6IFBhcmFtZXRyaWNWYXJpYW50VHlwZSB7XG4gICAgICAgIFxuICAgICAgICBsZXQgZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSA9IGNvbmNyZXRlRWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWU7XG4gICAgICAgIGxldCBwYXJhbXMgPSBcIlwiO1xuICAgICAgICBcbiAgICAgICAgY29uY3JldGVBcmd1bWVudHMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zK3BhcmFtLmdldFRleHQoKSsnLCc7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnN1YnN0cmluZygwLCBwYXJhbXMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUgPSBIZWxwZXJzLnJlcGxhY2VMYXN0QmV0d2VlblRhZ3MoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSxwYXJhbXMpO1xuXG4gICAgICAgIGxldCBjb25jRWxlbWVudDogUGFyYW1ldHJpY1ZhcmlhbnRUeXBlO1xuXG4gICAgICAgIGlmICghdGhpcy5mbXhJbnRlcmZhY2VNYXAuaGFzKGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpICYmIFxuICAgICAgICAgICAgIXRoaXMuZm14Q2xhc3NNYXAuaGFzKGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpICYmIFxuICAgICAgICAgICAgIXRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuaGFzKGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpKXtcbiAgICAgICAgICAgIGNvbmNFbGVtZW50ID0gXy5jbG9uZURlZXAoY29uY3JldGVFbGVtZW50KTsgXG4gICAgICAgICAgICBjb25jRWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUgPSBmdWxseVF1YWxpZmllZEZpbGVuYW1lO1xuICAgICAgICAgICAgY29uY0VsZW1lbnQuY2xlYXJHZW5lcmljUGFyYW1ldGVycygpO1xuICAgICAgICAgICAgY29uY3JldGVBcmd1bWVudHMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKHBhcmFtLmdldFRleHQoKSxwYXJhbS5nZXRUeXBlKCksIHBhcmFtKTtcbiAgICAgICAgICAgICAgICAgICAgY29uY0VsZW1lbnQuYWRkQ29uY3JldGVQYXJhbWV0ZXIocGFyYW1ldGVyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgPiBXQVJOSU5HOiBjb25jcmV0ZSBhcmd1bWVudCAke3BhcmFtLmdldFRleHQoKX0gaXMgbm90IGEgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLiBJdCBpcyBhICR7cGFyYW0uZ2V0S2luZE5hbWUoKX0uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZteENsYXNzTWFwLnNldChmdWxseVF1YWxpZmllZEZpbGVuYW1lLCBjb25jRWxlbWVudCBhcyBGYW1peC5QYXJhbWV0cmljQ2xhc3MpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mbXhJbnRlcmZhY2VNYXAuc2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUsIGNvbmNFbGVtZW50IGFzIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLnNldChmdWxseVF1YWxpZmllZEZpbGVuYW1lLCBjb25jRWxlbWVudCBhcyBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24pO1xuICAgICAgICAgICAgfSBlbHNlIHsgLy8gaWYgKGNvbmNyZXRlRWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRyaWNNZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLnNldChmdWxseVF1YWxpZmllZEZpbGVuYW1lLCBjb25jRWxlbWVudCBhcyBGYW1peC5QYXJhbWV0cmljTWV0aG9kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChjb25jRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGNvbmNFbGVtZW50LGNvbmNyZXRlRWxlbWVudERlY2xhcmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICBjb25jRWxlbWVudCA9IHRoaXMuZm14Q2xhc3NNYXAuZ2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpIGFzIEZhbWl4LlBhcmFtZXRyaWNDbGFzcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uY3JldGVFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSkge1xuICAgICAgICAgICAgICAgIGNvbmNFbGVtZW50ID0gdGhpcy5mbXhJbnRlcmZhY2VNYXAuZ2V0KGZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUpIGFzIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmNyZXRlRWxlbWVudCBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbmNFbGVtZW50ID0gdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5nZXQoZnVsbHlRdWFsaWZpZWRGaWxlbmFtZSkgYXMgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHsgIC8vIGlmIChjb25jcmV0ZUVsZW1lbnQgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljTWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgY29uY0VsZW1lbnQgPSB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmdldChmdWxseVF1YWxpZmllZEZpbGVuYW1lKSBhcyBGYW1peC5QYXJhbWV0cmljTWV0aG9kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggcHJvcGVydHlcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgQSBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgcHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhQcm9wZXJ0eShwcm9wZXJ0eTogUHJvcGVydHlEZWNsYXJhdGlvbiB8IFByb3BlcnR5U2lnbmF0dXJlKTogRmFtaXguUHJvcGVydHkge1xuICAgICAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IG5ldyBGYW1peC5Qcm9wZXJ0eSgpO1xuICAgICAgICBjb25zdCBpc1NpZ25hdHVyZSA9IHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlTaWduYXR1cmU7XG4gICAgICAgIGZteFByb3BlcnR5Lm5hbWUgPSBwcm9wZXJ0eS5nZXROYW1lKCk7XG5cbiAgICAgICAgbGV0IHByb3BUeXBlTmFtZSA9IHRoaXMuVU5LTk9XTl9WQUxVRTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb3BUeXBlTmFtZSA9IHByb3BlcnR5LmdldFR5cGUoKS5nZXRUZXh0KCkudHJpbSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIEZhaWxlZCB0byBnZXQgdXNhYmxlIG5hbWUgZm9yIHByb3BlcnR5OiAke3Byb3BlcnR5LmdldE5hbWUoKX0uIENvbnRpbnVpbmcuLi5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKHByb3BUeXBlTmFtZSwgcHJvcGVydHkuZ2V0VHlwZSgpLCBwcm9wZXJ0eSk7XG4gICAgICAgIGZteFByb3BlcnR5LmRlY2xhcmVkVHlwZSA9IGZteFR5cGU7XG5cbiAgICAgICAgLy8gYWRkIHRoZSB2aXNpYmlsaXR5IChwdWJsaWMsIHByaXZhdGUsIGV0Yy4pIHRvIHRoZSBmbXhQcm9wZXJ0eVxuICAgICAgICBmbXhQcm9wZXJ0eS52aXNpYmlsaXR5ID0gXCJcIjtcblxuICAgICAgICBwcm9wZXJ0eS5nZXRNb2RpZmllcnMoKS5mb3JFYWNoKG0gPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChtLmdldFRleHQoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgU2NvcGUuUHVibGljOlxuICAgICAgICAgICAgICAgICAgICBmbXhQcm9wZXJ0eS52aXNpYmlsaXR5ID0gXCJwdWJsaWNcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBTY29wZS5Qcm90ZWN0ZWQ6XG4gICAgICAgICAgICAgICAgICAgIGZteFByb3BlcnR5LnZpc2liaWxpdHkgPSBcInByb3RlY3RlZFwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFNjb3BlLlByaXZhdGU6XG4gICAgICAgICAgICAgICAgICAgIGZteFByb3BlcnR5LnZpc2liaWxpdHkgPSBcInByaXZhdGVcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0YXRpY1wiOlxuICAgICAgICAgICAgICAgICAgICBmbXhQcm9wZXJ0eS5pc0NsYXNzU2lkZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyZWFkb25seVwiOlxuICAgICAgICAgICAgICAgICAgICBmbXhQcm9wZXJ0eS5yZWFkT25seSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWlzU2lnbmF0dXJlICYmIHByb3BlcnR5LmdldEV4Y2xhbWF0aW9uVG9rZW5Ob2RlKCkpIHtcbiAgICAgICAgICAgIGZteFByb3BlcnR5LmlzRGVmaW5pdGVseUFzc2lnbmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHkuZ2V0UXVlc3Rpb25Ub2tlbk5vZGUoKSkge1xuICAgICAgICAgICAgZm14UHJvcGVydHkuaXNPcHRpb25hbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5LmdldE5hbWUoKS5zdWJzdHJpbmcoMCwgMSkgPT09IFwiI1wiKSB7XG4gICAgICAgICAgICBmbXhQcm9wZXJ0eS5pc0phdmFTY3JpcHRQcml2YXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXRGUU4ocHJvcGVydHksIGZteFByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IocHJvcGVydHksIGZteFByb3BlcnR5KTtcblxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14UHJvcGVydHkpO1xuXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14UHJvcGVydHkscHJvcGVydHkpO1xuXG4gICAgICAgIHJldHVybiBmbXhQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggbWV0aG9kIG9yIGFjY2Vzc29yXG4gICAgICogQHBhcmFtIG1ldGhvZCBBIG1ldGhvZCBvciBhbiBhY2Nlc3NvclxuICAgICAqIEBwYXJhbSBjdXJyZW50Q0MgVGhlIGN5Y2xvbWF0aWMgY29tcGxleGl0eSBtZXRyaWNzIG9mIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGFjY2Vzc29yXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhNZXRob2QoXG4gICAgICAgIG1ldGhvZDogTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gICAgICAgIGN1cnJlbnRDQzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfVxuICAgICk6IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHwgRmFtaXguUGFyYW1ldHJpY01ldGhvZCB7IFxuICAgICAgICAvLyBjb25zb2xlLmxvZyhgXFxuPT09IENyZWF0aW5nL0dldHRpbmcgTWV0aG9kID09PWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgTWV0aG9kIGtpbmQ6ICR7bWV0aG9kLmdldEtpbmROYW1lKCl9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBNZXRob2QgdGV4dDogJHttZXRob2QuZ2V0VGV4dCgpLnNsaWNlKDAsIDUwKX0uLi5gKTtcbiAgICAgICAgY29uc3QgZnFuID0gRlFORnVuY3Rpb25zLmdldEZRTihtZXRob2QpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgTWV0aG9kIEZRTjogJHtmcW59YCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgUHJvY2Vzc2luZyBtZXRob2QgJHtmcW59YCk7XG4gICAgICAgXG4gICAgXG4gICAgICAgIGxldCBmbXhNZXRob2QgPSB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmdldChmcW4pIGFzIEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHwgRmFtaXguUGFyYW1ldHJpY01ldGhvZDtcbiAgICAgICAgaWYgKCFmbXhNZXRob2QpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdNZXRob2Qgbm90IGZvdW5kIGluIG1hcCwgY3JlYXRpbmcgbmV3Jyk7XG4gICAgICAgICAgICBjb25zdCBpc0dlbmVyaWMgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgaWYgKG1ldGhvZCBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfHwgbWV0aG9kIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGZteE1ldGhvZCA9IG5ldyBGYW1peC5BY2Nlc3NvcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzR2V0dGVyID0gbWV0aG9kIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1NldHRlciA9IG1ldGhvZCBpbnN0YW5jZW9mIFNldEFjY2Vzc29yRGVjbGFyYXRpb247XG4gICAgICAgICAgICAgICAgaWYgKGlzR2V0dGVyKSB7IChmbXhNZXRob2QgYXMgRmFtaXguQWNjZXNzb3IpLmtpbmQgPSBcImdldHRlclwiOyB9XG4gICAgICAgICAgICAgICAgaWYgKGlzU2V0dGVyKSB7IChmbXhNZXRob2QgYXMgRmFtaXguQWNjZXNzb3IpLmtpbmQgPSBcInNldHRlclwiOyB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZteE1ldGhvZCA9IGlzR2VuZXJpYyA/IG5ldyBGYW1peC5QYXJhbWV0cmljTWV0aG9kKCkgOiBuZXcgRmFtaXguTWV0aG9kKCk7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gbWV0aG9kIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGlzU2lnbmF0dXJlID0gbWV0aG9kIGluc3RhbmNlb2YgTWV0aG9kU2lnbmF0dXJlO1xuICAgICAgICAgICAgbGV0IGlzQWJzdHJhY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBpc1N0YXRpYyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKG1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uIHx8IG1ldGhvZCBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfHwgbWV0aG9kIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGlzQWJzdHJhY3QgPSBtZXRob2QuaXNBYnN0cmFjdCgpO1xuICAgICAgICAgICAgICAgIGlzU3RhdGljID0gbWV0aG9kLmlzU3RhdGljKCk7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvcikgeyAoZm14TWV0aG9kIGFzIEZhbWl4LkFjY2Vzc29yKS5raW5kID0gXCJjb25zdHJ1Y3RvclwiOyB9XG4gICAgICAgICAgICBmbXhNZXRob2QuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7XG4gICAgICAgICAgICBmbXhNZXRob2QuaXNDbGFzc1NpZGUgPSBpc1N0YXRpYztcbiAgICAgICAgICAgIGZteE1ldGhvZC5pc1ByaXZhdGUgPSAobWV0aG9kIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gfHwgbWV0aG9kIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fCBtZXRob2QgaW5zdGFuY2VvZiBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKVxuICAgICAgICAgICAgICAgID8gISFtZXRob2QuZ2V0TW9kaWZpZXJzKCkuZmluZCh4ID0+IHguZ2V0VGV4dCgpID09PSAncHJpdmF0ZScpIDogZmFsc2U7XG4gICAgICAgICAgICBmbXhNZXRob2QuaXNQcm90ZWN0ZWQgPSAobWV0aG9kIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gfHwgbWV0aG9kIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fCBtZXRob2QgaW5zdGFuY2VvZiBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKVxuICAgICAgICAgICAgICAgID8gISFtZXRob2QuZ2V0TW9kaWZpZXJzKCkuZmluZCh4ID0+IHguZ2V0VGV4dCgpID09PSAncHJvdGVjdGVkJykgOiBmYWxzZTtcbiAgICAgICAgICAgIGZteE1ldGhvZC5zaWduYXR1cmUgPSBIZWxwZXJzLmNvbXB1dGVTaWduYXR1cmUobWV0aG9kLmdldFRleHQoKSk7XG4gICAgXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gaXNDb25zdHJ1Y3RvciA/IFwiY29uc3RydWN0b3JcIiA6IG1ldGhvZC5nZXROYW1lKCk7XG4gICAgICAgICAgICBmbXhNZXRob2QubmFtZSA9IG1ldGhvZE5hbWU7XG4gICAgXG4gICAgICAgICAgICBpZiAoIWlzQ29uc3RydWN0b3IgJiYgbWV0aG9kTmFtZS5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgICAgICAgICAgIGZteE1ldGhvZC5pc1ByaXZhdGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm14TWV0aG9kLmlzUHVibGljID0gIWZteE1ldGhvZC5pc1ByaXZhdGUgJiYgIWZteE1ldGhvZC5pc1Byb3RlY3RlZDtcbiAgICBcbiAgICAgICAgICAgIGZteE1ldGhvZC5jeWNsb21hdGljQ29tcGxleGl0eSA9IGlzU2lnbmF0dXJlID8gMCA6IChjdXJyZW50Q0NbbWV0aG9kTmFtZV0gfHwgMCk7XG4gICAgICAgICAgICBsZXQgbWV0aG9kVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG1ldGhvZFR5cGVOYW1lID0gbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgTWV0aG9kIHJldHVybiB0eXBlOiAke21ldGhvZFR5cGVOYW1lfWApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBnZXQgcmV0dXJuIHR5cGUgZm9yICR7ZnFufTogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKG1ldGhvZFR5cGVOYW1lLCBtZXRob2QuZ2V0VHlwZSgpLCBtZXRob2QpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYENyZWF0ZWQvcmV0cmlldmVkIHJldHVybiB0eXBlIHdpdGggRlFOOiAke2ZteFR5cGUuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgICAgICAgICAgZm14TWV0aG9kLmRlY2xhcmVkVHlwZSA9IGZteFR5cGU7XG4gICAgICAgICAgICBmbXhNZXRob2QubnVtYmVyT2ZMaW5lc09mQ29kZSA9IG1ldGhvZC5nZXRFbmRMaW5lTnVtYmVyKCkgLSBtZXRob2QuZ2V0U3RhcnRMaW5lTnVtYmVyKCk7XG4gICAgICAgICAgICBmbXhNZXRob2QubnVtYmVyT2ZQYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKS5sZW5ndGg7XG4gICAgICAgICAgICBmbXhNZXRob2QubnVtYmVyT2ZTdGF0ZW1lbnRzID0gaXNTaWduYXR1cmUgPyAwIDogbWV0aG9kLmdldFN0YXRlbWVudHMoKS5sZW5ndGg7XG4gICAgXG4gICAgICAgICAgICAvLyBBZGQgdG8gZmFtaXhSZXBcbiAgICAgICAgICAgIGluaXRGUU4obWV0aG9kLCBmbXhNZXRob2QpO1xuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteE1ldGhvZCk7XG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihtZXRob2QsIGZteE1ldGhvZCk7XG4gICAgICAgICAgICB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLnNldChmcW4sIGZteE1ldGhvZCk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEFkZGVkIG1ldGhvZCAke2Zxbn0gdG8gZmFtaXhSZXBgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgTWV0aG9kICR7ZnFufSBhbHJlYWR5IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14TWV0aG9kLCBtZXRob2QpO1xuICAgICAgICByZXR1cm4gZm14TWV0aG9kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBmdW5jdGlvblxuICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gY3VycmVudENDIFRoZSBjeWNsb21hdGljIGNvbXBsZXhpdHkgbWV0cmljcyBvZiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZVxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peEZ1bmN0aW9uKGZ1bmM6IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24sIGN1cnJlbnRDQzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSk6IEZhbWl4LkZ1bmN0aW9uIHwgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uIHtcbiAgICAgICAgbGV0IGZteEZ1bmN0aW9uOiBGYW1peC5GdW5jdGlvbiB8IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbjtcbiAgICAgICAgY29uc3QgaXNHZW5lcmljID0gZnVuYy5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihmdW5jKTtcbiAgICAgICAgaWYgKCF0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmhhcyhmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSkpIHtcbiAgICAgICAgICAgIGlmIChpc0dlbmVyaWMpIHtcbiAgICAgICAgICAgICAgICBmbXhGdW5jdGlvbiA9IG5ldyBGYW1peC5QYXJhbWV0cmljRnVuY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZteEZ1bmN0aW9uID0gbmV3IEZhbWl4LkZ1bmN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gZnVuYy5nZXROYW1lKCk7XG4gICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICAgIGZteEZ1bmN0aW9uLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm14RnVuY3Rpb24ubmFtZSA9IFwiYW5vbnltb3VzXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZteEZ1bmN0aW9uLnNpZ25hdHVyZSA9IEhlbHBlcnMuY29tcHV0ZVNpZ25hdHVyZShmdW5jLmdldFRleHQoKSk7XG4gICAgICAgICAgICBmbXhGdW5jdGlvbi5jeWNsb21hdGljQ29tcGxleGl0eSA9IGN1cnJlbnRDQ1tmbXhGdW5jdGlvbi5uYW1lXTtcbiAgICAgICAgICAgIGluaXRGUU4oZnVuYywgZm14RnVuY3Rpb24pO1xuICAgICAgICAgICAgLy8gZm14RnVuY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lID0gZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWU7XG4gICAgXG4gICAgICAgICAgICBsZXQgZnVuY3Rpb25UeXBlTmFtZSA9IHRoaXMuVU5LTk9XTl9WQUxVRTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25UeXBlTmFtZSA9IGZ1bmMuZ2V0UmV0dXJuVHlwZSgpLmdldFRleHQoKS50cmltKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbjogJHtmdW5jLmdldE5hbWUoKX0uIENvbnRpbnVpbmcuLi5gKTtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIGNvbnN0IGZteFR5cGUgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhUeXBlKGZ1bmN0aW9uVHlwZU5hbWUsIGZ1bmMuZ2V0VHlwZSgpLCBmdW5jKTtcbiAgICAgICAgICAgIGZteEZ1bmN0aW9uLmRlY2xhcmVkVHlwZSA9IGZteFR5cGU7XG4gICAgICAgICAgICBmbXhGdW5jdGlvbi5udW1iZXJPZkxpbmVzT2ZDb2RlID0gZnVuYy5nZXRFbmRMaW5lTnVtYmVyKCkgLSBmdW5jLmdldFN0YXJ0TGluZU51bWJlcigpO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IGZ1bmMuZ2V0UGFyYW1ldGVycygpO1xuICAgICAgICAgICAgZm14RnVuY3Rpb24ubnVtYmVyT2ZQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5sZW5ndGg7XG4gICAgICAgICAgICBmbXhGdW5jdGlvbi5udW1iZXJPZlN0YXRlbWVudHMgPSBmdW5jLmdldFN0YXRlbWVudHMoKS5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihmdW5jLCBmbXhGdW5jdGlvbik7XG4gICAgXG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14RnVuY3Rpb24pO1xuICAgIFxuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhGdW5jdGlvbixmdW5jKTtcblxuICAgICAgICAgICAgdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5zZXQoZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUsIGZteEZ1bmN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZteEZ1bmN0aW9uID0gdGhpcy5mbXhGdW5jdGlvbkFuZE1ldGhvZE1hcC5nZXQoZnVuY3Rpb25GdWxseVF1YWxpZmllZE5hbWUpIGFzIChGYW1peC5GdW5jdGlvbiB8IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm14RnVuY3Rpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IHBhcmFtZXRlclxuICAgICAqIEBwYXJhbSBwYXJhbSBBIHBhcmFtZXRlclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgcGFyYW1ldGVyXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhQYXJhbWV0ZXIocGFyYW06IFBhcmFtZXRlckRlY2xhcmF0aW9uKTogRmFtaXguUGFyYW1ldGVyIHtcbiAgICAgICAgaWYgKHRoaXMuZm14UGFyYW1ldGVyTWFwLmhhcyhwYXJhbSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJQYXJhbWV0ZXIgPSB0aGlzLmZteFBhcmFtZXRlck1hcC5nZXQocGFyYW0pO1xuICAgICAgICAgICAgaWYgKHJQYXJhbWV0ZXIpIHsgXG4gICAgICAgICAgICAgICByZXR1cm4gclBhcmFtZXRlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCBwYXJhbWV0ZXIgJHtwYXJhbS5nZXROYW1lKCl9IGlzIG5vdCBmb3VuZCBpbiB0aGUgcGFyYW1ldGVyIG1hcC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZteFBhcmFtID0gbmV3IEZhbWl4LlBhcmFtZXRlcigpO1xuXG4gICAgICAgIGxldCBwYXJhbVR5cGVOYW1lID0gdGhpcy5VTktOT1dOX1ZBTFVFO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyYW1UeXBlTmFtZSA9IHBhcmFtLmdldFR5cGUoKS5nZXRUZXh0KCkudHJpbSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIEZhaWxlZCB0byBnZXQgdXNhYmxlIG5hbWUgZm9yIHBhcmFtZXRlcjogJHtwYXJhbS5nZXROYW1lKCl9LiBDb250aW51aW5nLi4uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmbXhUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShwYXJhbVR5cGVOYW1lLCBwYXJhbS5nZXRUeXBlKCksIHBhcmFtKTtcbiAgICAgICAgZm14UGFyYW0uZGVjbGFyZWRUeXBlID0gZm14VHlwZTtcbiAgICAgICAgZm14UGFyYW0ubmFtZSA9IHBhcmFtLmdldE5hbWUoKTtcblxuICAgICAgICBpbml0RlFOKHBhcmFtLCBmbXhQYXJhbSk7XG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHBhcmFtLCBmbXhQYXJhbSk7XG5cbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFBhcmFtKTtcblxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteFBhcmFtLCBwYXJhbSk7XG4gICAgICAgIHRoaXMuZm14UGFyYW1ldGVyTWFwLnNldChwYXJhbSwgZm14UGFyYW0pO1xuXG4gICAgICAgIHJldHVybiBmbXhQYXJhbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggdHlwZSBwYXJhbWV0ZXJcbiAgICAgKiBAcGFyYW0gdHAgQSB0eXBlIHBhcmFtZXRlclxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgdHlwZSBwYXJhbWV0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhQYXJhbWV0ZXJUeXBlKHRwOiBUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pOiBGYW1peC5QYXJhbWV0ZXJUeXBlIHtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZteFBhcmFtZXRlclR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldGVyVHlwZSgpO1xuICAgXG4gICAgICAgIGZteFBhcmFtZXRlclR5cGUubmFtZSA9IHRwLmdldE5hbWUoKTsgICAgICBcbiAgICAgICAgaW5pdEZRTih0cCwgZm14UGFyYW1ldGVyVHlwZSk7XG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKHRwLCBmbXhQYXJhbWV0ZXJUeXBlKTtcblxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14UGFyYW1ldGVyVHlwZSk7XG5cbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhQYXJhbWV0ZXJUeXBlLHRwKTtcblxuICAgICAgICByZXR1cm4gZm14UGFyYW1ldGVyVHlwZTtcbiAgICB9XG5cblxuICAgIC8vIC8qKlxuICAgIC8vICAqIENyZWF0ZXMgYSBGYW1peCB0eXBlIGluIHRoZSBjb250ZXh0IG9mIGNvbmNyZXRpemF0aW9uc1xuICAgIC8vICAqIEBwYXJhbSB0eXBlTmFtZSBBIHR5cGUgbmFtZVxuICAgIC8vICAqIEBwYXJhbSBlbGVtZW50IEFuIGVsZW1lbnRcbiAgICAvLyAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHR5cGVcbiAgICAvLyAgKi9cbiAgICAvLyBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peENvbmNyZXRlVHlwZShlbGVtZW50OiBUeXBlTm9kZSk6IFxuICAgIC8vICAgICBGYW1peC5QYXJhbWV0ZXJUeXBlIHwgRmFtaXguUHJpbWl0aXZlVHlwZSB8IEZhbWl4LkNsYXNzIHwgRmFtaXguSW50ZXJmYWNlIHtcbiAgICAvLyAgICAgICAgIGlmICh0aGlzLmZteFR5cGVNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgLy8gICAgICAgICAgICAgY29uc3QgclR5cGUgPSB0aGlzLmZteFR5cGVNYXAuZ2V0KGVsZW1lbnQpO1xuICAgIC8vICAgICAgICAgICAgIGlmIChyVHlwZSkgeyBcbiAgICAvLyAgICAgICAgICAgICAgICByZXR1cm4gclR5cGU7XG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCB0eXBlICR7ZWxlbWVudC5nZXRUZXh0KCl9IGlzIG5vdCBmb3VuZCBpbiB0aGUgdHlwZSBtYXAuYCk7XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfVxuXG4gICAgLy8gICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9IGVsZW1lbnQuZ2V0U3ltYm9sKCk/LmdldERlY2xhcmF0aW9ucygpWzBdIGFzIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjtcbiAgICAvLyAgICAgLy8gY29uc3QgcGFyYW1ldGVyVHlwZU5hbWUgOiBzdHJpbmcgPSBlbGVtZW50LmdldFRleHQoKTtcbiAgICAvLyAgICAgY29uc3QgcGFyYW1ldGVyVHlwZU5hbWUgPSBnZXRQcmltaXRpdmVUeXBlTmFtZShlbGVtZW50LmdldFR5cGUoKSkgfHwgZWxlbWVudC5nZXRUZXh0KCk7XG4gICAgLy8gICAgIGxldCBmbXhQYXJhbWV0ZXJUeXBlOiBGYW1peC5UeXBlIHwgRmFtaXguQ2xhc3MgfCBGYW1peC5JbnRlcmZhY2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyAgICAgLy8gZ2V0IGEgVHlwZVJlZmVyZW5jZSBmcm9tIGEgVHlwZU5vZGVcbiAgICAvLyAgICAgY29uc3QgdHlwZVJlZmVyZW5jZSA9IGVsZW1lbnQuZ2V0VHlwZSgpO1xuICAgIC8vICAgICAvLyBnZXQgYSBUeXBlRGVjbGFyYXRpb24gZnJvbSBhIFR5cGVSZWZlcmVuY2VcbiAgICAvLyAgICAgY29uc3QgdHlwZURlY2xhcmF0aW9uID0gdHlwZVJlZmVyZW5jZS5nZXRTeW1ib2woKT8uZ2V0RGVjbGFyYXRpb25zKClbMF0gYXMgVFNNb3JwaFR5cGVEZWNsYXJhdGlvbjtcblxuICAgIC8vICAgICBsZXQgaXNDbGFzc09ySW50ZXJmYWNlID0gZmFsc2U7XG4gICAgLy8gICAgIGlmICh0aGlzLmZteENsYXNzTWFwLmhhcyhwYXJhbWV0ZXJUeXBlTmFtZSkpe1xuICAgIC8vICAgICAgICAgdGhpcy5mbXhDbGFzc01hcC5mb3JFYWNoKChvYmosIG5hbWUpID0+IHtcbiAgICAvLyAgICAgICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljQ2xhc3Mpe1xuICAgIC8vICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZWxlbWVudC5nZXRUZXh0KCkgJiYgb2JqLmdlbmVyaWNQYXJhbWV0ZXJzLnNpemU+MCkge1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG9iajtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlzQ2xhc3NPckludGVyZmFjZSA9IHRydWU7XG4gICAgLy8gICAgICAgICAgICAgICAgIH0gXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGVsZW1lbnQuZ2V0VGV4dCgpKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJUeXBlID0gb2JqO1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaXNDbGFzc09ySW50ZXJmYWNlID0gdHJ1ZTtcbiAgICAvLyAgICAgICAgICAgICAgICAgfSBcbiAgICAvLyAgICAgICAgICAgICB9ICAgXG4gICAgLy8gICAgICAgICB9KTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIGlmICh0aGlzLmZteEludGVyZmFjZU1hcC5oYXMocGFyYW1ldGVyVHlwZU5hbWUpKXtcbiAgICAvLyAgICAgICAgIHRoaXMuZm14SW50ZXJmYWNlTWFwLmZvckVhY2goKG9iaiwgbmFtZSkgPT4ge1xuICAgIC8vICAgICAgICAgICAgIGlmKG9iaiBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2Upe1xuICAgIC8vICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZWxlbWVudC5nZXRUZXh0KCkgJiYgb2JqLmdlbmVyaWNQYXJhbWV0ZXJzLnNpemU+MCkge1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG9iajtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlzQ2xhc3NPckludGVyZmFjZSA9IHRydWU7XG4gICAgLy8gICAgICAgICAgICAgICAgIH0gXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGVsZW1lbnQuZ2V0VGV4dCgpKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJUeXBlID0gb2JqO1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaXNDbGFzc09ySW50ZXJmYWNlID0gdHJ1ZTtcbiAgICAvLyAgICAgICAgICAgICAgICAgfSBcbiAgICAvLyAgICAgICAgICAgICB9ICAgXG4gICAgLy8gICAgICAgICB9KTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIGlmKCFpc0NsYXNzT3JJbnRlcmZhY2Upe1xuICAgIC8vICAgICAgICAgaWYgKCF0aGlzLmZteFR5cGVNYXAuaGFzKHR5cGVEZWNsYXJhdGlvbikpIHsgICAgXG4gICAgLy8gICAgICAgICAgICAgLy8gVE9ETyByZWZhY3RvciBcbiAgICAvLyAgICAgICAgICAgICBpZiAoaXNQcmltaXRpdmVUeXBlKHBhcmFtZXRlclR5cGVOYW1lKSkge1xuICAgIC8vICAgICAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4UHJpbWl0aXZlVHlwZShwYXJhbWV0ZXJUeXBlTmFtZSk7XG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IG5ldyBGYW1peC5QYXJhbWV0ZXJUeXBlKCk7XG4gICAgLy8gICAgICAgICAgICAgfSBcbiAgICBcbiAgICAvLyAgICAgICAgICAgICBmbXhQYXJhbWV0ZXJUeXBlLm5hbWUgPSBwYXJhbWV0ZXJUeXBlTmFtZTtcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14UGFyYW1ldGVyVHlwZSk7XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5mbXhUeXBlTWFwLnNldCh0eXBlRGVjbGFyYXRpb24sIGZteFBhcmFtZXRlclR5cGUpO1xuICAgIC8vICAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14UGFyYW1ldGVyVHlwZSx0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgZWxzZSB7XG4gICAgLy8gICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mbXhUeXBlTWFwLmdldCh0eXBlRGVjbGFyYXRpb24pO1xuICAgIC8vICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyVHlwZSA9IHJlc3VsdDtcbiAgICAvLyAgICAgICAgICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhbWl4IHR5cGUgJHt0eXBlRGVjbGFyYXRpb259IGlzIG5vdCBmb3VuZCBpbiB0aGUgVHlwZSBtYXAuYCk7XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGlmICghZm14UGFyYW1ldGVyVHlwZSkge1xuICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmbXhQYXJhbWV0ZXJUeXBlIHdhcyB1bmRlZmluZWQgZm9yIHBhcmFtZXRlclR5cGVOYW1lICR7cGFyYW1ldGVyVHlwZU5hbWV9YCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIGZteFBhcmFtZXRlclR5cGU7XG4gICAgLy8gfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IHZhcmlhYmxlXG4gICAgICogQHBhcmFtIHZhcmlhYmxlIEEgdmFyaWFibGVcbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHZhcmlhYmxlXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhWYXJpYWJsZSh2YXJpYWJsZTogVmFyaWFibGVEZWNsYXJhdGlvbik6IEZhbWl4LlZhcmlhYmxlIHtcbiAgICAgICAgaWYgKHRoaXMuZm14VmFyaWFibGVNYXAuaGFzKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgY29uc3QgclZhcmlhYmxlID0gdGhpcy5mbXhWYXJpYWJsZU1hcC5nZXQodmFyaWFibGUpO1xuICAgICAgICAgICAgaWYgKHJWYXJpYWJsZSkgeyBcbiAgICAgICAgICAgICAgIHJldHVybiByVmFyaWFibGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggcGFyYW1ldGVyICR7dmFyaWFibGUuZ2V0TmFtZSgpfSBpcyBub3QgZm91bmQgaW4gdGhlIHZhcmlhYmxlIG1hcC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmbXhWYXJpYWJsZSA9IG5ldyBGYW1peC5WYXJpYWJsZSgpO1xuICAgIFxuICAgICAgICBsZXQgdmFyaWFibGVUeXBlTmFtZSA9IHRoaXMuVU5LTk9XTl9WQUxVRTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhcmlhYmxlVHlwZU5hbWUgPSB2YXJpYWJsZS5nZXRUeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciB2YXJpYWJsZTogJHt2YXJpYWJsZS5nZXROYW1lKCl9LiBDb250aW51aW5nLi4uYCk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUodmFyaWFibGVUeXBlTmFtZSwgdmFyaWFibGUuZ2V0VHlwZSgpLCB2YXJpYWJsZSk7XG4gICAgICAgIGZteFZhcmlhYmxlLmRlY2xhcmVkVHlwZSA9IGZteFR5cGU7XG4gICAgICAgIGZteFZhcmlhYmxlLm5hbWUgPSB2YXJpYWJsZS5nZXROYW1lKCk7XG4gICAgICAgIGluaXRGUU4odmFyaWFibGUsIGZteFZhcmlhYmxlKTtcbiAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IodmFyaWFibGUsIGZteFZhcmlhYmxlKTtcbiAgICBcbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFZhcmlhYmxlKTtcbiAgICBcbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhWYXJpYWJsZSx2YXJpYWJsZSk7XG4gICAgICAgIHRoaXMuZm14VmFyaWFibGVNYXAuc2V0KHZhcmlhYmxlLCBmbXhWYXJpYWJsZSk7XG4gICAgXG4gICAgICAgIHJldHVybiBmbXhWYXJpYWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggZW51bVxuICAgICAqIEBwYXJhbSBlbnVtRW50aXR5IEFuIGVudW1cbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGVudW1cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peEVudW0oZW51bUVudGl0eTogRW51bURlY2xhcmF0aW9uKTogRmFtaXguRW51bSB7XG4gICAgICAgIGlmICh0aGlzLmZteEVudW1NYXAuaGFzKGVudW1FbnRpdHkpKSB7XG4gICAgICAgICAgICBjb25zdCByRW51bSA9IHRoaXMuZm14RW51bU1hcC5nZXQoZW51bUVudGl0eSk7XG4gICAgICAgICAgICBpZiAockVudW0pIHsgXG4gICAgICAgICAgICAgICByZXR1cm4gckVudW07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggZW51bSAke2VudW1FbnRpdHkuZ2V0TmFtZSgpfSBpcyBub3QgZm91bmQgaW4gdGhlIGVudW0gbWFwLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZteEVudW0gPSBuZXcgRmFtaXguRW51bSgpO1xuICAgICAgICBmbXhFbnVtLm5hbWUgPSBlbnVtRW50aXR5LmdldE5hbWUoKTtcbiAgICAgICAgaW5pdEZRTihlbnVtRW50aXR5LCBmbXhFbnVtKTtcbiAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoZW51bUVudGl0eSwgZm14RW51bSk7XG5cbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEVudW0pO1xuXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14RW51bSxlbnVtRW50aXR5KTtcbiAgICAgICAgdGhpcy5mbXhFbnVtTWFwLnNldChlbnVtRW50aXR5LCBmbXhFbnVtKTtcblxuICAgICAgICByZXR1cm4gZm14RW51bTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSBlbnVtTWVtYmVyIEFuIGVudW0gbWVtYmVyXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBlbnVtIG1lbWJlclxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGYW1peEVudW1WYWx1ZShlbnVtTWVtYmVyOiBFbnVtTWVtYmVyKTogRmFtaXguRW51bVZhbHVlIHtcbiAgICAgICAgY29uc3QgZm14RW51bVZhbHVlID0gbmV3IEZhbWl4LkVudW1WYWx1ZSgpO1xuXG4gICAgICAgIGxldCBlbnVtVmFsdWVUeXBlTmFtZSA9IHRoaXMuVU5LTk9XTl9WQUxVRTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudW1WYWx1ZVR5cGVOYW1lID0gZW51bU1lbWJlci5nZXRUeXBlKCkuZ2V0VGV4dCgpLnRyaW0oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBGYWlsZWQgdG8gZ2V0IHVzYWJsZSBuYW1lIGZvciBlbnVtIHZhbHVlOiAke2VudW1NZW1iZXIuZ2V0TmFtZSgpfS4gQ29udGludWluZy4uLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peFR5cGUoZW51bVZhbHVlVHlwZU5hbWUsIGVudW1NZW1iZXIuZ2V0VHlwZSgpLCBlbnVtTWVtYmVyKTtcbiAgICAgICAgZm14RW51bVZhbHVlLmRlY2xhcmVkVHlwZSA9IGZteFR5cGU7XG4gICAgICAgIGZteEVudW1WYWx1ZS5uYW1lID0gZW51bU1lbWJlci5nZXROYW1lKCk7XG4gICAgICAgIGluaXRGUU4oZW51bU1lbWJlciwgZm14RW51bVZhbHVlKTtcbiAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoZW51bU1lbWJlciwgZm14RW51bVZhbHVlKTtcblxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14RW51bVZhbHVlKTtcblxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEVudW1WYWx1ZSxlbnVtTWVtYmVyKTtcblxuICAgICAgICByZXR1cm4gZm14RW51bVZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IGRlY29yYXRvclxuICAgICAqIEBwYXJhbSBkZWNvcmF0b3IgQSBkZWNvcmF0b3JcbiAgICAgKiBAcGFyYW0gZGVjb3JhdGVkRW50aXR5IEEgY2xhc3MsIGEgbWV0aG9kLCBhIHBhcmFtZXRlciBvciBhIHByb3BlcnR5XG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBkZWNvcmF0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peERlY29yYXRvcihkZWNvcmF0b3I6IERlY29yYXRvciwgZGVjb3JhdGVkRW50aXR5OiBDbGFzc0RlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFBhcmFtZXRlckRlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbik6IEZhbWl4LkRlY29yYXRvciB7XG4gICAgICAgIGNvbnN0IGZteERlY29yYXRvciA9IG5ldyBGYW1peC5EZWNvcmF0b3IoKTtcbiAgICAgICAgY29uc3QgZGVjb3JhdG9yTmFtZSA9IFwiQFwiICsgZGVjb3JhdG9yLmdldE5hbWUoKTtcbiAgICAgICAgY29uc3QgZGVjb3JhdG9yRXhwcmVzc2lvbiA9IGRlY29yYXRvci5nZXRUZXh0KCkuc3Vic3RyaW5nKDEpO1xuXG4gICAgICAgIGZteERlY29yYXRvci5uYW1lID0gZGVjb3JhdG9yTmFtZTtcbiAgICAgICAgZm14RGVjb3JhdG9yLmRlY29yYXRvckV4cHJlc3Npb24gPSBkZWNvcmF0b3JFeHByZXNzaW9uO1xuICAgICAgICBjb25zdCBkZWNvcmF0ZWRFbnRpdHlGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGRlY29yYXRlZEVudGl0eSk7XG4gICAgICAgIGNvbnN0IGZteERlY29yYXRlZEVudGl0eSA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShkZWNvcmF0ZWRFbnRpdHlGdWxseVF1YWxpZmllZE5hbWUpIGFzIEZhbWl4Lk5hbWVkRW50aXR5O1xuICAgICAgICBmbXhEZWNvcmF0b3IuZGVjb3JhdGVkRW50aXR5ID0gZm14RGVjb3JhdGVkRW50aXR5O1xuICAgICAgICBpbml0RlFOKGRlY29yYXRvciwgZm14RGVjb3JhdG9yKTtcbiAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoZGVjb3JhdG9yLCBmbXhEZWNvcmF0b3IpO1xuXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhEZWNvcmF0b3IpO1xuXG4gICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14RGVjb3JhdG9yLGRlY29yYXRvcik7XG5cbiAgICAgICAgcmV0dXJuIGZteERlY29yYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29tbWVudFxuICAgICAqIEBwYXJhbSBjb21tZW50IEEgY29tbWVudFxuICAgICAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbW1lbnQncyBjb250YWluZXJcbiAgICAgKiBAcGFyYW0gaXNKU0RvYyBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY29tbWVudCBpcyBhIEpTRG9jXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb21tZW50XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4Q29tbWVudChjb21tZW50OiBDb21tZW50UmFuZ2UsIGZteFNjb3BlOiBGYW1peC5OYW1lZEVudGl0eSwgaXNKU0RvYzogYm9vbGVhbik6IEZhbWl4LkNvbW1lbnQge1xuICAgICAgICBsb2dnZXIuZGVidWcoYD4gTk9URTogY3JlYXRpbmcgY29tbWVudCAke2NvbW1lbnQuZ2V0VGV4dCgpfSBpbiBzY29wZSAke2ZteFNjb3BlLm5hbWV9LmApO1xuICAgICAgICBjb25zdCBmbXhDb21tZW50ID0gbmV3IEZhbWl4LkNvbW1lbnQoKTtcbiAgICAgICAgZm14Q29tbWVudC5jb250YWluZXIgPSBmbXhTY29wZTsgIC8vIGFkZHMgY29tbWVudCB0byB0aGUgY29udGFpbmVyJ3MgY29tbWVudHMgY29sbGVjdGlvblxuICAgICAgICBmbXhDb21tZW50LmlzSlNEb2MgPSBpc0pTRG9jO1xuXG4gICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGNvbW1lbnQsIGZteENvbW1lbnQpO1xuXG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhDb21tZW50KTtcblxuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteENvbW1lbnQsY29tbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGZteENvbW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIGEgRmFtaXggdHlwZVxuICAgICAqIEBwYXJhbSB0eXBlTmFtZSBBIHR5cGUgbmFtZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IEEgdHMtbW9ycGggZWxlbWVudFxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgdHlwZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPckdldEZhbWl4VHlwZSh0eXBlTmFtZUFyZzogc3RyaW5nLCB0c01vcnBoVHlwZTogVHlwZSB8IHVuZGVmaW5lZCwgZWxlbWVudDogVFNNb3JwaFR5cGVEZWNsYXJhdGlvbik6IEZhbWl4LlR5cGUge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENyZWF0aW5nIChvciBnZXR0aW5nKSB0eXBlOiAnJHt0c01vcnBoVHlwZT8uZ2V0VGV4dCgpIHx8IFwidW5kZWZpbmVkXCJ9JyBvZiBlbGVtZW50OiAnJHtlbGVtZW50Py5nZXRUZXh0KCkuc2xpY2UoMCwgNTApfS4uLicgb2Yga2luZDogJHtlbGVtZW50Py5nZXRLaW5kTmFtZSgpfWApO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgdHlwZSB0byBjb3JyZWN0IHByaW1pdGl2ZSBuYW1lICh3b3JrYXJvdW5kIGZvciB1bmlxdWUgc3ltYm9sZSBwcmltaXRpdmUgdHlwZSlcbiAgICAgICAgLy8gZG9uJ3QgY29udmVydCB0byBwcmltaXRpdmUgaWYgaXQncyBhIGdlbmVyaWMgdHlwZVxuICAgICAgICBjb25zdCB0eXBlTmFtZSA9ICF0eXBlTmFtZUFyZy5pbmNsdWRlcyhcIjxcIikgJiYgdHNNb3JwaFR5cGUgJiYgZ2V0UHJpbWl0aXZlVHlwZU5hbWUodHNNb3JwaFR5cGUpIHx8IHR5cGVOYW1lQXJnO1xuXG4gICAgICAgIGlmIChpc1ByaW1pdGl2ZVR5cGUodHlwZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVPckdldEZhbWl4UHJpbWl0aXZlVHlwZSh0eXBlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWxlbWVudC5pc0tpbmQoU3ludGF4S2luZC5NZXRob2RTaWduYXR1cmUpIHx8IGVsZW1lbnQuaXNLaW5kKFN5bnRheEtpbmQuTWV0aG9kRGVjbGFyYXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRob2RGUU4gPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgcmV0dXJuVHlwZUZRTiA9IGAke21ldGhvZEZRTi5yZXBsYWNlKC9cXFtNZXRob2QoU2lnbmF0dXJlfERlY2xhcmF0aW9uKVxcXSQvLCAnJyl9W1JldHVyblR5cGVdYDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgcmV0dXJuIHR5cGUgaW4gdGhlIHJlcG9zaXRvcnlcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZSA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShyZXR1cm5UeXBlRlFOKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZ1R5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgRm91bmQgZXhpc3RpbmcgcmV0dXJuIHR5cGUgd2l0aCBGUU46ICR7cmV0dXJuVHlwZUZRTn1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdUeXBlIGFzIEZhbWl4LlR5cGU7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgQ3JlYXRpbmcgcmV0dXJuIHR5cGUgd2l0aCBkaXN0aW5jdCBGUU46ICR7cmV0dXJuVHlwZUZRTn1gKTtcbiAgICAgICAgICAgIGNvbnN0IGZteFR5cGUgPSBuZXcgRmFtaXguVHlwZSgpO1xuICAgICAgICAgICAgZm14VHlwZS5uYW1lID0gdHlwZU5hbWU7XG4gICAgICAgICAgICBmbXhUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IHJldHVyblR5cGVGUU47XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNldCBjb250YWluZXIgKHNhbWUgYXMgbWV0aG9kJ3MgY29udGFpbmVyKVxuICAgICAgICAgICAgY29uc3QgbWV0aG9kQW5jZXN0b3IgPSBIZWxwZXJzLmZpbmRUeXBlQW5jZXN0b3IoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAobWV0aG9kQW5jZXN0b3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3RvckZRTiA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4obWV0aG9kQW5jZXN0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKGFuY2VzdG9yRlFOKSBhcyBGYW1peC5Db250YWluZXJFbnRpdHk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGZteFR5cGUuY29udGFpbmVyID0gYW5jZXN0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFR5cGUpO1xuICAgICAgICAgICAgdGhpcy5mbXhUeXBlTWFwLnNldChlbGVtZW50LCBmbXhUeXBlKTtcbiAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14VHlwZSwgZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gZm14VHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUGFyYW1ldHJpY1R5cGUgPVxuICAgICAgICAgICAgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uICYmIGVsZW1lbnQuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICBcbiAgICAgICAgaWYgKGlzUGFyYW1ldHJpY1R5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhQYXJhbWV0cmljVHlwZSh0eXBlTmFtZSwgZWxlbWVudCBhcyBUU01vcnBoUGFyYW1ldHJpY1R5cGUpO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIGlmICghdGhpcy5mbXhUeXBlTWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ1R5cGUgbm90IGZvdW5kIGluIG1hcCwgY3JlYXRpbmcgbmV3Jyk7IFxuICAgICAgICAgICAgbGV0IGFuY2VzdG9yOiBGYW1peC5Db250YWluZXJFbnRpdHkgfCB1bmRlZmluZWQ7ICAgIFxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlQW5jZXN0b3IgPSBIZWxwZXJzLmZpbmRUeXBlQW5jZXN0b3IoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYFR5cGUgYW5jZXN0b3IgZm91bmQ6ICR7dHlwZUFuY2VzdG9yPy5nZXRLaW5kTmFtZSgpfWApO1xuICAgIFxuICAgICAgICAgICAgICAgIGlmICh0eXBlQW5jZXN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKHR5cGVBbmNlc3Rvcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBBbmNlc3RvciBGUU46ICR7YW5jZXN0b3JGdWxseVF1YWxpZmllZE5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKGFuY2VzdG9yRnVsbHlRdWFsaWZpZWROYW1lKSBhcyBGYW1peC5Db250YWluZXJFbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYW5jZXN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZSh0eXBlQW5jZXN0b3IuZ2V0VGV4dCgpLCB0eXBlQW5jZXN0b3IuZ2V0VHlwZSgpLCB0eXBlQW5jZXN0b3IgYXMgVFNNb3JwaFR5cGVEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQW5jZXN0b3Igbm90IGZvdW5kIGluIHJlcG8sIGNyZWF0aW5nIGl0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRm91bmQgYW5jZXN0b3IgaW4gZmFtaXhSZXA6ICR7YW5jZXN0b3IuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYE5vIHR5cGUgYW5jZXN0b3IgZm91bmQgZm9yICR7dHlwZU5hbWV9IC0gcHJvY2VlZGluZyB3aXRob3V0IGNvbnRhaW5lcmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIGNvbnN0IGZteFR5cGUgPSBuZXcgRmFtaXguVHlwZSgpO1xuICAgICAgICAgICAgZm14VHlwZS5uYW1lID0gdHlwZU5hbWU7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgQ3JlYXRlZCBuZXcgdHlwZSB3aXRoIG5hbWU6ICR7dHlwZU5hbWV9YCk7ICAgIFxuICAgICAgICAgICAgaWYgKGFuY2VzdG9yKSB7XG4gICAgICAgICAgICAgICAgZm14VHlwZS5jb250YWluZXIgPSBhbmNlc3RvcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbmNlc3RvciBub3QgZm91bmQgZm9yIHR5cGUgJHt0eXBlTmFtZX0uYCk7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpbml0RlFOKGVsZW1lbnQsIGZteFR5cGUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYFR5cGUgRlFOIGFmdGVyIGluaXQ6ICR7Zm14VHlwZS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihlbGVtZW50LCBmbXhUeXBlKTtcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhUeXBlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdBZGRlZCB0eXBlIHRvIHJlcG9zaXRvcnknKTtcbiAgICAgICAgICAgIHRoaXMuZm14VHlwZU1hcC5zZXQoZWxlbWVudCwgZm14VHlwZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbXhUeXBlID0gdGhpcy5mbXhUeXBlTWFwLmdldChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICghZm14VHlwZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggdHlwZSAke3R5cGVOYW1lfSBpcyBub3QgZm91bmQgaW4gdGhlIFR5cGUgbWFwLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZteFR5cGU7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgY29uc3QgZm14VHlwZSA9IHRoaXMuZm14VHlwZU1hcC5nZXQoZWxlbWVudCkhO1xuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteFR5cGUsIGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gZm14VHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgYSBGYW1peCB0eXBlIHRoYXQgaXMgcGFyYW1ldHJpY1xuICAgICAqIEBwYXJhbSB0eXBlTmFtZSBBIHR5cGUgbmFtZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IEEgdHMtbW9ycGggZWxlbWVudFxuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgcGFyYW1ldGVyIHR5cGVcbiAgICAgKi9cbiAgICBjcmVhdGVPckdldEZhbWl4UGFyYW1ldHJpY1R5cGUodHlwZU5hbWU6IHN0cmluZywgZWxlbWVudDogVFNNb3JwaFBhcmFtZXRyaWNUeXBlKTogRmFtaXguVHlwZSB7XG5cbiAgICAgICAgaWYgKHRoaXMuZm14VHlwZU1hcC5oYXMoZWxlbWVudCkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZm14VHlwZU1hcC5nZXQoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYW1peCB0eXBlICR7dHlwZU5hbWV9IGlzIG5vdCBmb3VuZCAodW5kZWZpbmVkKSBpbiB0aGUgVHlwZSBtYXAuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBIHBhcmFtZXRyaWMgdHlwZSBpcyBhIHR5cGUgdGhhdCBoYXMgdHlwZSBwYXJhbWV0ZXJzLCBlLmcuLCBMaXN0PFQ+XG4gICAgICAgIC8vIEluIFRTIGl0IGNhbiBiZSBhIGNsYXNzLCBhbiBpbnRlcmZhY2UsIGEgZnVuY3Rpb24sIGFuIGFycm93IGZ1bmN0aW9uLCBvciBhIG1ldGhvZFxuXG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgRmFtaXggUGFyYW1ldHJpYyBUeXBlIChtYXliZSBpdCdzIGp1c3QgYW4gSW50ZXJmYWNlLCBldGMuKVxuICAgICAgICBsZXQgZm14VHlwZTogRmFtaXguVHlwZTtcblxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGZteFR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldHJpY0NsYXNzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgYXJlIG5vdCB0eXBlcyBcbiAgICAgICAgLy8gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uRGVjbGFyYXRpb24pIHtcbiAgICAgICAgLy8gICAgIGZteFR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uKCk7XG4gICAgICAgIC8vIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFycm93RnVuY3Rpb24pIHtcbiAgICAgICAgLy8gICAgIGZteFR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldHJpY0Fycm93RnVuY3Rpb24oKTtcbiAgICAgICAgLy8gfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHtcbiAgICAgICAgLy8gICAgIGZteFR5cGUgPSBuZXcgRmFtaXguUGFyYW1ldHJpY01ldGhvZCgpO1xuICAgICAgICAvLyB9IFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBpcyBub3QgYSBjbGFzcywgaW50ZXJmYWNlLCBmdW5jdGlvbiwgYXJyb3cgZnVuY3Rpb24sIG9yIG1ldGhvZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnN0IHBhcmFtZXRlcnMgPSBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCk7XG5cbiAgICAgICAgLy8gLy8gZm9yIGVhY2ggcGFyYW1ldGVyLCBnZXRPckNyZWF0ZSB0aGUgRmFtaXhQYXJhbWV0ZXJUeXBlXG4gICAgICAgIC8vIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRlclR5cGUocGFyYW1ldGVyLmdldE5hbWUoKSwgcGFyYW1ldGVyKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIC8vIFRPRE86IHRoZSBmb2xsb3dpbmcgY29kZSBpcyBub3QgY29ycmVjdCwgaXQgaXMganVzdCBhIHBsYWNlaG9sZGVyXG4gICAgICAgIC8vIGNvbnN0IHBhcmFtZXRlclR5cGVOYW1lcyA9IHR5cGVOYW1lLnN1YnN0cmluZyh0eXBlTmFtZS5pbmRleE9mKFwiPFwiKSArIDEsIHR5cGVOYW1lLmluZGV4T2YoXCI+XCIpKVxuICAgICAgICAvLyAgICAgLnNwbGl0KFwiLFwiKS5tYXAocyA9PiBzLnRyaW0oKSk7XG4gICAgICAgIC8vIGNvbnN0IGJhc2VUeXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCB0eXBlTmFtZS5pbmRleE9mKFwiPFwiKSkudHJpbSgpO1xuICAgICAgICAvLyBwYXJhbWV0ZXJUeXBlTmFtZXMuZm9yRWFjaChwYXJhbWV0ZXJUeXBlTmFtZSA9PiB7XG4gICAgICAgIC8vICAgICBjb25zdCBmbXhQYXJhbWV0ZXJUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4UGFyYW1ldGVyVHlwZShwYXJhbWV0ZXJUeXBlTmFtZSwgZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAoZm14VHlwZSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlKS5hZGRBcmd1bWVudChmbXhQYXJhbWV0ZXJUeXBlKTtcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIGNvbnN0IGZteEJhc2VUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShiYXNlVHlwZU5hbWUsIGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIChmbXhUeXBlIGFzIEZhbWl4LlBhcmFtZXRlclR5cGUpLmJhc2VUeXBlID0gZm14QmFzZVR5cGU7XG5cbiAgICAgICAgZm14VHlwZS5uYW1lID0gdHlwZU5hbWU7XG4gICAgICAgIGluaXRGUU4oZWxlbWVudCwgZm14VHlwZSk7XG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhUeXBlKTtcbiAgICAgICAgdGhpcy5mbXhUeXBlTWFwLnNldChlbGVtZW50LCBmbXhUeXBlKTtcbiAgICAgICAgcmV0dXJuIGZteFR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHR5cGUgZm9yIGEgcGFyYW1ldGVyIGluIGEgcGFyYW1ldHJpYyB0eXBlLCBlLmcuLCBUIGluIExpc3Q8VD5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZU5hbWUgXG4gICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIFR5cGVTY3JpcHQgZWxlbWVudCAoVFNNb3JwaFBhcmFtZXRyaWNUeXBlKSB0aGF0IHRoZSB0eXBlIGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIC8vIGNyZWF0ZU9yR2V0RmFtaXhQYXJhbWV0ZXJUeXBlKHBhcmFtZXRlclR5cGVOYW1lOiBzdHJpbmcsIGVsZW1lbnQ6IFBhcmFtZXRlckRlY2xhcmF0aW9uKSB7XG4gICAgLy8gICAgIGlmICh0aGlzLmZteFR5cGVNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5mbXhUeXBlTWFwLmdldChlbGVtZW50KSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgLy8gZGV0ZXJtaW5lIGlmIGVsZW1lbnQgaXMgYSBcbiAgICAvLyAgICAgY29uc3QgZm14VHlwZSA9IG5ldyBGYW1peC5QYXJhbWV0ZXJUeXBlKCk7XG4gICAgLy8gICAgIC8vIGNvbnN0IHBhcmFtZXRlclR5cGVOYW1lcyA9IHR5cGVOYW1lLnN1YnN0cmluZyh0eXBlTmFtZS5pbmRleE9mKFwiPFwiKSArIDEsIHR5cGVOYW1lLmluZGV4T2YoXCI+XCIpKVxuICAgIC8vICAgICAvLyAgICAgLnNwbGl0KFwiLFwiKS5tYXAocyA9PiBzLnRyaW0oKSk7XG4gICAgLy8gICAgIC8vIGNvbnN0IGJhc2VUeXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCB0eXBlTmFtZS5pbmRleE9mKFwiPFwiKSkudHJpbSgpO1xuICAgIC8vICAgICAvLyBwYXJhbWV0ZXJUeXBlTmFtZXMuZm9yRWFjaChwYXJhbWV0ZXJUeXBlTmFtZSA9PiB7XG4gICAgLy8gICAgIC8vICAgICBjb25zdCBmbXhQYXJhbWV0ZXJUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4UGFyYW1ldGVyVHlwZShwYXJhbWV0ZXJUeXBlTmFtZSwgZWxlbWVudCk7XG4gICAgLy8gICAgIC8vICAgICAoZm14VHlwZSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlKS5hZGRBcmd1bWVudChmbXhQYXJhbWV0ZXJUeXBlKTtcbiAgICAvLyAgICAgLy8gfSk7XG4gICAgLy8gICAgIGNvbnN0IGZteEJhc2VUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShiYXNlVHlwZU5hbWUsIGVsZW1lbnQpO1xuICAgIC8vICAgICAoZm14VHlwZSBhcyBGYW1peC5QYXJhbWV0ZXJUeXBlKS5iYXNlVHlwZSA9IGZteEJhc2VUeXBlO1xuICAgIC8vICAgICBpbml0RlFOKGVsZW1lbnQsIGZteFR5cGUpO1xuICAgIC8vICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14VHlwZSk7XG4gICAgLy8gICAgIHRoaXMuZm14VHlwZU1hcC5zZXQoZWxlbWVudCwgZm14VHlwZSk7XG4gICAgLy8gICAgIHJldHVybiBmbXhUeXBlO1xuICAgIC8vIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb3IgZ2V0cyBhIEZhbWl4IHByaW1pdGl2ZSB0eXBlXG4gICAgICogQHBhcmFtIHR5cGVOYW1lIEEgdHlwZSBuYW1lXG4gICAgICogQHJldHVybnMgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBwcmltaXRpdmUgdHlwZVxuICAgICAqL1xuICAgIGNyZWF0ZU9yR2V0RmFtaXhQcmltaXRpdmVUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBGYW1peC5QcmltaXRpdmVUeXBlIHtcbiAgICAgICAgbGV0IGZteFR5cGU6IEZhbWl4LlByaW1pdGl2ZVR5cGUgPSBuZXcgRmFtaXguUHJpbWl0aXZlVHlwZSgpO1xuICAgICAgICBpZiAoIXRoaXMuZm14UHJpbWl0aXZlVHlwZU1hcC5oYXModHlwZU5hbWUpKSB7XG4gICAgICAgICAgICBmbXhUeXBlID0gbmV3IEZhbWl4LlByaW1pdGl2ZVR5cGUoKTtcbiAgICAgICAgICAgIGZteFR5cGUuaXNTdHViID0gdHJ1ZTtcbiAgICAgICAgICAgIGZteFR5cGUubmFtZSA9IHR5cGVOYW1lO1xuICAgICAgICAgICAgZm14VHlwZS5mdWxseVF1YWxpZmllZE5hbWUgPSB0eXBlTmFtZSArIFwiW1ByaW1pdGl2ZVR5cGVdXCI7XG4gICAgICAgICAgICB0aGlzLmZteFByaW1pdGl2ZVR5cGVNYXAuc2V0KHR5cGVOYW1lLCBmbXhUeXBlKTtcbiAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhUeXBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZteFR5cGUgPSB0aGlzLmZteFByaW1pdGl2ZVR5cGVNYXAuZ2V0KHR5cGVOYW1lKSBhcyBGYW1peC5QcmltaXRpdmVUeXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbXhUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBhY2Nlc3NcbiAgICAgKiBAcGFyYW0gbm9kZSBBIG5vZGVcbiAgICAgKiBAcGFyYW0gaWQgQW4gaWQgb2YgYSBwYXJhbWV0ZXIsIGEgdmFyaWFibGUsIGEgcHJvcGVydHkgb3IgYW4gZW51bSBtZW1iZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhBY2Nlc3Mobm9kZTogSWRlbnRpZmllciwgaWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBmbXhWYXIgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlJZChpZCkgYXMgRmFtaXguU3RydWN0dXJhbEVudGl0eTtcbiAgICAgICAgaWYgKCFmbXhWYXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFtaXggZW50aXR5IHdpdGggaWQgJHtpZH0gbm90IGZvdW5kLCBmb3Igbm9kZSAke25vZGUuZ2V0VGV4dCgpfSBpbiAke25vZGUuZ2V0U291cmNlRmlsZSgpLmdldEJhc2VOYW1lKCl9IGF0IGxpbmUgJHtub2RlLmdldFN0YXJ0TGluZU51bWJlcigpfS5gKTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsb2dnZXIuZGVidWcoYENyZWF0aW5nIEZhbWl4QWNjZXNzLiBOb2RlOiBbJHtub2RlLmdldEtpbmROYW1lKCl9XSAnJHtub2RlLmdldFRleHQoKX0nIGF0IGxpbmUgJHtub2RlLmdldFN0YXJ0TGluZU51bWJlcigpfSBpbiAke25vZGUuZ2V0U291cmNlRmlsZSgpLmdldEJhc2VOYW1lKCl9LCBpZDogJHtpZH0gcmVmZXJzIHRvIGZteFZhciAnJHtmbXhWYXIuZnVsbHlRdWFsaWZpZWROYW1lfScuYCk7XG4gICAgXG4gICAgICAgIGNvbnN0IG5vZGVSZWZlcmVuY2VBbmNlc3RvciA9IEhlbHBlcnMuZmluZEFuY2VzdG9yKG5vZGUpO1xuICAgICAgICBpZiAoIW5vZGVSZWZlcmVuY2VBbmNlc3Rvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBObyBhbmNlc3RvciBmb3VuZCBmb3Igbm9kZSAnJHtub2RlLmdldFRleHQoKX0nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgY29uc3QgYW5jZXN0b3JGdWxseVF1YWxpZmllZE5hbWUgPSBGUU5GdW5jdGlvbnMuZ2V0RlFOKG5vZGVSZWZlcmVuY2VBbmNlc3Rvcik7XG4gICAgICAgIGNvbnN0IGFjY2Vzc29yID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKGFuY2VzdG9yRnVsbHlRdWFsaWZpZWROYW1lKSBhcyBGYW1peC5Db250YWluZXJFbnRpdHk7XG4gICAgICAgIGlmICghYWNjZXNzb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgQW5jZXN0b3IgJHthbmNlc3RvckZ1bGx5UXVhbGlmaWVkTmFtZX0gb2Yga2luZCAke25vZGVSZWZlcmVuY2VBbmNlc3Rvci5nZXRLaW5kTmFtZSgpfSBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICByZXR1cm47IC8vIEJhaWwgb3V0IGZvciBub3dcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgYWNjZXNzb3IgdG8gYmUgJHthY2Nlc3Nvci5mdWxseVF1YWxpZmllZE5hbWV9LmApO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIC8vIEVuc3VyZSBhY2Nlc3NvciBpcyBhIG1ldGhvZCwgZnVuY3Rpb24sIHNjcmlwdCwgb3IgbW9kdWxlXG4gICAgICAgIGlmICghKGFjY2Vzc29yIGluc3RhbmNlb2YgRmFtaXguTWV0aG9kKSAmJiAhKGFjY2Vzc29yIGluc3RhbmNlb2YgRmFtaXguQXJyb3dGdW5jdGlvbikgJiYgIShhY2Nlc3NvciBpbnN0YW5jZW9mIEZhbWl4LkZ1bmN0aW9uKSAmJiAhKGFjY2Vzc29yIGluc3RhbmNlb2YgRmFtaXguU2NyaXB0RW50aXR5KSAmJiAhKGFjY2Vzc29yIGluc3RhbmNlb2YgRmFtaXguTW9kdWxlKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBBY2Nlc3NvciAke2FjY2Vzc29yLmZ1bGx5UXVhbGlmaWVkTmFtZX0gaXMgbm90IGEgbWV0aG9kLCBmdW5jdGlvbiwgZXRjLmApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIC8vIEF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgY29uc3QgZm91bmRBY2Nlc3MgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4QWNjZXNzQnlBY2Nlc3NvckFuZFZhcmlhYmxlKGFjY2Vzc29yLCBmbXhWYXIpO1xuICAgICAgICBpZiAoZm91bmRBY2Nlc3MpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFtaXhBY2Nlc3MgYWxyZWFkeSBleGlzdHMgZm9yIGFjY2Vzc29yICR7YWNjZXNzb3IuZnVsbHlRdWFsaWZpZWROYW1lfSBhbmQgdmFyaWFibGUgJHtmbXhWYXIuZnVsbHlRdWFsaWZpZWROYW1lfS5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBjb25zdCBmbXhBY2Nlc3MgPSBuZXcgRmFtaXguQWNjZXNzKCk7XG4gICAgICAgIGZteEFjY2Vzcy5hY2Nlc3NvciA9IGFjY2Vzc29yO1xuICAgICAgICBmbXhBY2Nlc3MudmFyaWFibGUgPSBmbXhWYXI7XG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhBY2Nlc3MpO1xuICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEFjY2Vzcywgbm9kZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRlZCBhY2Nlc3M6ICR7YWNjZXNzb3IuZnVsbHlRdWFsaWZpZWROYW1lfSAtPiAke2ZteFZhci5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGludm9jYXRpb25cbiAgICAgKiBAcGFyYW0gbm9kZVJlZmVycmluZ1RvSW52b2NhYmxlIEEgbm9kZVxuICAgICAqIEBwYXJhbSBpbnZvY2FibGUgQSBtZXRob2Qgb3IgYSBmdW5jdGlvblxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIG1ldGhvZCBvciB0aGUgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhJbnZvY2F0aW9uKG5vZGVSZWZlcnJpbmdUb0ludm9jYWJsZTogSWRlbnRpZmllciwgaW52b2NhYmxlOiBJbnZvY2FibGVUeXBlLCBpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZteEludm9jYWJsZSA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUlkKGlkKSBhcyBGYW1peC5CZWhhdmlvcmFsRW50aXR5O1xuICAgICAgICAvLyBzaW5jZSB0aGUgbm9kZSBpcyBpbiB0aGUgQVNULCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGFuY2VzdG9yIHRoYXQgaXMgaW4gdGhlIEZhbWl4IG1vZGVsXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lck9mTm9kZSA9IEhlbHBlcnMuZmluZEFuY2VzdG9yKG5vZGVSZWZlcnJpbmdUb0ludm9jYWJsZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgY29udGFpbmVyIChhbmNlc3RvcikgJHtjb250YWluZXJPZk5vZGUuZ2V0S2luZE5hbWUoKX0gZm9yIEFTVCBub2RlICR7bm9kZVJlZmVycmluZ1RvSW52b2NhYmxlLmdldFRleHQoKX0uYCk7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckZRTiA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oY29udGFpbmVyT2ZOb2RlKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBGb3VuZCBjb250YWluZXJGUU4gJHtjb250YWluZXJGUU59LmApO1xuICAgICAgICBsZXQgc2VuZGVyID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKGNvbnRhaW5lckZRTikgYXMgRmFtaXguQ29udGFpbmVyRW50aXR5O1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kIGEgc2VuZGVyIHRoYXQgbWF0Y2hlcyAke3NlbmRlci5mdWxseVF1YWxpZmllZE5hbWV9LmApO1xuICAgICAgICBpZiAoc2VuZGVyIGluc3RhbmNlb2YgRmFtaXguVHlwZSkge1xuICAgICAgICAgICAgLy8gVE9ETyB0aGlzIG1pZ2h0IGJlIGFuIGVycm9yIGluIGdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWVcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgT29wcyEgU2VuZGVyIGlzIGEgdHlwZSwgd2hpY2ggaXMgbm90IHZhbGlkIGZvciBhbiBJbnZvY2F0aW9uLiBUcnlpbmcgdG8gZmluZCBhIGNvbnRhaW5lciBmb3IgJHtzZW5kZXIuZnVsbHlRdWFsaWZpZWROYW1lfS5gKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbmRlckNvbnRhaW5lciA9IHNlbmRlci5jb250YWluZXI7XG4gICAgICAgICAgICBpZiAoc2VuZGVyQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgc2VuZGVyID0gc2VuZGVyQ29udGFpbmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihpbnZvY2FibGUuZ2V0UGFyZW50KCkpO1xuICAgICAgICBjb25zdCByZWNlaXZlciA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShyZWNlaXZlckZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgRmFtaXguTmFtZWRFbnRpdHk7XG5cbiAgICAgICAgY29uc3QgZm14SW52b2NhdGlvbiA9IG5ldyBGYW1peC5JbnZvY2F0aW9uKCk7XG4gICAgICAgIGZteEludm9jYXRpb24uc2VuZGVyID0gc2VuZGVyO1xuICAgICAgICBmbXhJbnZvY2F0aW9uLnJlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgICAgIGZteEludm9jYXRpb24uYWRkQ2FuZGlkYXRlKGZteEludm9jYWJsZSk7XG4gICAgICAgIGZteEludm9jYXRpb24uc2lnbmF0dXJlID0gZm14SW52b2NhYmxlLnNpZ25hdHVyZTtcblxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14SW52b2NhdGlvbik7XG5cbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhJbnZvY2F0aW9uLG5vZGVSZWZlcnJpbmdUb0ludm9jYWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGluaGVyaXRhbmNlXG4gICAgICogQHBhcmFtIGJhc2VDbGFzc09ySW50ZXJmYWNlIEEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlIChzdWJjbGFzcylcbiAgICAgKiBAcGFyYW0gaW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSBUaGUgaW5oZXJpdGVkIGNsYXNzIG9yIGludGVyZmFjZSAoc3VwZXJjbGFzcylcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlT3JHZXRGYW1peEluaGVyaXRhbmNlKGJhc2VDbGFzc09ySW50ZXJmYWNlOiBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24sIGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2U6IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cyk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENyZWF0aW5nIEZhbWl4SW5oZXJpdGFuY2UgZm9yICR7YmFzZUNsYXNzT3JJbnRlcmZhY2UuZ2V0VGV4dCgpfSBhbmQgJHtpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlLmdldFRleHQoKX0gWyR7aW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZS5jb25zdHJ1Y3Rvci5uYW1lfV0uYCk7XG4gICAgICAgIGNvbnN0IGZteEluaGVyaXRhbmNlID0gbmV3IEZhbWl4LkluaGVyaXRhbmNlKCk7XG5cbiAgICAgICAgbGV0IHN1YkNsYXNzOiBGYW1peC5DbGFzcyB8IEZhbWl4LkludGVyZmFjZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGJhc2VDbGFzc09ySW50ZXJmYWNlIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgc3ViQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDbGFzcyhiYXNlQ2xhc3NPckludGVyZmFjZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJDbGFzcyA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZShiYXNlQ2xhc3NPckludGVyZmFjZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN1YkNsYXNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN1YmNsYXNzICR7YmFzZUNsYXNzT3JJbnRlcmZhY2V9IG5vdCBmb3VuZCBpbiBDbGFzcyBvciBJbnRlcmZhY2UgbWFwcy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdXBlckNsYXNzOiBGYW1peC5DbGFzcyB8IEZhbWl4LkludGVyZmFjZSB8IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoaW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDbGFzcyhpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoaW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSk7XG4gICAgICAgIH0gZWxzZSAge1xuICAgICAgICAgICAgLy8gaW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1xuICAgICAgICAgICAgLy8gbXVzdCBkZXRlcm1pbmUgaWYgaW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSBpcyBhIGNsYXNzIG9yIGFuIGludGVyZmFjZVxuICAgICAgICAgICAgLy8gdGhlbiBmaW5kIHRoZSBkZWNsYXJhdGlvbiwgZWxzZSBpdCdzIGEgc3R1YlxuXG4gICAgICAgICAgICBjb25zdCBoZXJpdGFnZUNsYXVzZSA9IGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UuZ2V0UGFyZW50KCk7XG4gICAgICAgICAgICBpZiAoaGVyaXRhZ2VDbGF1c2UgaW5zdGFuY2VvZiBIZXJpdGFnZUNsYXVzZSkge1xuICAgICAgICAgICAgICAgIC8vIGNhc2VzOiAxKSBjbGFzcyBleHRlbmRzIGNsYXNzLCAyKSBjbGFzcyBpbXBsZW1lbnRzIGludGVyZmFjZSwgMykgaW50ZXJmYWNlIGV4dGVuZHMgaW50ZXJmYWNlXG5cbiAgICAgICAgICAgICAgICAvLyBjbGFzcyBleHRlbmRzIGNsYXNzXG4gICAgICAgICAgICAgICAgaWYgKGhlcml0YWdlQ2xhdXNlLmdldFRleHQoKS5zdGFydHNXaXRoKFwiZXh0ZW5kc1wiKSAmJiBiYXNlQ2xhc3NPckludGVyZmFjZSBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhc3NEZWNsYXJhdGlvbiA9IGdldEludGVyZmFjZU9yQ2xhc3NEZWNsYXJhdGlvbkZyb21FeHByZXNzaW9uKGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NEZWNsYXJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIGNsYXNzRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3MoY2xhc3NEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYENsYXNzIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCBmb3IgJHtpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlLmdldFRleHQoKX0uYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5jcmVhdGVPckdldEZhbWl4Q2xhc3NTdHViKGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChoZXJpdGFnZUNsYXVzZS5nZXRUZXh0KCkuc3RhcnRzV2l0aChcImltcGxlbWVudHNcIikgJiYgYmFzZUNsYXNzT3JJbnRlcmZhY2UgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uIC8vIGNsYXNzIGltcGxlbWVudHMgaW50ZXJmYWNlXG4gICAgICAgICAgICAgICAgICAgIHx8IChoZXJpdGFnZUNsYXVzZS5nZXRUZXh0KCkuc3RhcnRzV2l0aChcImV4dGVuZHNcIikgJiYgYmFzZUNsYXNzT3JJbnRlcmZhY2UgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikpIHsgLy8gaW50ZXJmYWNlIGV4dGVuZHMgaW50ZXJmYWNlXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJmYWNlT3JDbGFzc0RlY2xhcmF0aW9uID0gZ2V0SW50ZXJmYWNlT3JDbGFzc0RlY2xhcmF0aW9uRnJvbUV4cHJlc3Npb24oaW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VPckNsYXNzRGVjbGFyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBpbnRlcmZhY2VPckNsYXNzRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZShpbnRlcmZhY2VPckNsYXNzRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBJbnRlcmZhY2UgZGVjbGFyYXRpb24gbm90IGZvdW5kIGZvciAke2luaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UuZ2V0VGV4dCgpfS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2VTdHViKGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKGBQYXJlbnQgb2YgJHtpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlLmdldFRleHQoKX0gaXMgbm90IGEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlLmApO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFBhcmVudCBvZiAke2luaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UuZ2V0VGV4dCgpfSBpcyBub3QgYSBjbGFzcyBvciBhbiBpbnRlcmZhY2UuYCk7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2VTdHViKGluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIZXJpdGFnZSBjbGF1c2Ugbm90IGZvdW5kIGZvciAke2luaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UuZ2V0VGV4dCgpfS5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChzdXBlckNsYXNzLCBpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlKTtcblxuICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihpbmhlcml0ZWRDbGFzc09ySW50ZXJmYWNlLCBzdXBlckNsYXNzKTtcblxuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoc3VwZXJDbGFzcyk7XG5cbiAgICAgICAgZm14SW5oZXJpdGFuY2Uuc3ViY2xhc3MgPSBzdWJDbGFzcztcbiAgICAgICAgZm14SW5oZXJpdGFuY2Uuc3VwZXJjbGFzcyA9IHN1cGVyQ2xhc3M7XG5cbiAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteEluaGVyaXRhbmNlKTtcbiAgICAgICAgLy8gbm8gRlFOIGZvciBpbmhlcml0YW5jZVxuXG4gICAgICAgIC8vIFdlIGRvbid0IG1hcCBpbmhlcml0YW5jZSB0byB0aGUgc291cmNlIGNvZGUgZWxlbWVudCBiZWNhdXNlIHRoZXJlIGFyZSB0d28gZWxlbWVudHMgKHN1cGVyLCBzdWIpXG4gICAgICAgIC8vIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14SW5oZXJpdGFuY2UsIG51bGwpO1xuXG4gICAgfVxuICAgIGNyZWF0ZU9yR2V0RmFtaXhDbGFzc1N0dWIodW5yZXNvbHZlZEluaGVyaXRlZENsYXNzOiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpOiBGYW1peC5DbGFzcyB7XG4gICAgICAgIC8vIG1ha2UgYSBGUU4gZm9yIHRoZSBzdHViXG4gICAgICAgIGNvbnN0IGZxbiA9IEZRTkZ1bmN0aW9ucy5nZXRGUU5VbnJlc29sdmVkSW5oZXJpdGVkQ2xhc3NPckludGVyZmFjZSh1bnJlc29sdmVkSW5oZXJpdGVkQ2xhc3MpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYGNyZWF0ZU9yR2V0RmFtaXhDbGFzc1N0dWI6IGZxbjogJHtmcW59YCk7XG4gICAgICAgIGNvbnN0IGZteENsYXNzID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKGZxbikgYXMgRmFtaXguQ2xhc3M7XG4gICAgICAgIGlmIChmbXhDbGFzcykge1xuICAgICAgICAgICAgcmV0dXJuIGZteENsYXNzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3R1YiA9IG5ldyBGYW1peC5DbGFzcygpO1xuICAgICAgICAgICAgc3R1Yi5uYW1lID0gdW5yZXNvbHZlZEluaGVyaXRlZENsYXNzLmdldFRleHQoKTtcbiAgICAgICAgICAgIHN0dWIuaXNTdHViID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0dWIuZnVsbHlRdWFsaWZpZWROYW1lID0gZnFuO1xuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KHN0dWIpO1xuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChzdHViLCB1bnJlc29sdmVkSW5oZXJpdGVkQ2xhc3MpO1xuICAgICAgICAgICAgcmV0dXJuIHN0dWI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlU3R1Yih1bnJlc29sdmVkSW5oZXJpdGVkSW50ZXJmYWNlOiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpOiBGYW1peC5JbnRlcmZhY2Uge1xuICAgICAgICAvLyBtYWtlIGEgRlFOIGZvciB0aGUgc3R1YlxuICAgICAgICBjb25zdCBmcW4gPSBGUU5GdW5jdGlvbnMuZ2V0RlFOVW5yZXNvbHZlZEluaGVyaXRlZENsYXNzT3JJbnRlcmZhY2UodW5yZXNvbHZlZEluaGVyaXRlZEludGVyZmFjZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZVN0dWI6IGZxbjogJHtmcW59YCk7XG4gICAgICAgIGNvbnN0IGZteEludGVyZmFjZSA9IHRoaXMuZmFtaXhSZXAuZ2V0RmFtaXhFbnRpdHlCeUZ1bGx5UXVhbGlmaWVkTmFtZShmcW4pIGFzIEZhbWl4LkludGVyZmFjZTtcbiAgICAgICAgaWYgKGZteEludGVyZmFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZteEludGVyZmFjZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0dWIgPSBuZXcgRmFtaXguSW50ZXJmYWNlKCk7XG4gICAgICAgICAgICBzdHViLm5hbWUgPSB1bnJlc29sdmVkSW5oZXJpdGVkSW50ZXJmYWNlLmdldFRleHQoKTtcbiAgICAgICAgICAgIHN0dWIuaXNTdHViID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0dWIuZnVsbHlRdWFsaWZpZWROYW1lID0gZnFuO1xuICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KHN0dWIpO1xuICAgICAgICAgICAgdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChzdHViLCB1bnJlc29sdmVkSW5oZXJpdGVkSW50ZXJmYWNlKTtcbiAgICAgICAgICAgIHJldHVybiBzdHViO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZhbWl4SW1wb3J0Q2xhdXNlKGltcG9ydGVkRW50aXR5OiBGYW1peC5OYW1lZEVudGl0eSwgaW1wb3J0aW5nRW50aXR5OiBGYW1peC5Nb2R1bGUpIHtcbiAgICAgICAgY29uc3QgZm14SW1wb3J0Q2xhdXNlID0gbmV3IEZhbWl4LkltcG9ydENsYXVzZSgpO1xuICAgICAgICBmbXhJbXBvcnRDbGF1c2UuaW1wb3J0ZWRFbnRpdHkgPSBpbXBvcnRlZEVudGl0eTtcbiAgICAgICAgZm14SW1wb3J0Q2xhdXNlLmltcG9ydGluZ0VudGl0eSA9IGltcG9ydGluZ0VudGl0eTtcbiAgICAgICAgaW1wb3J0aW5nRW50aXR5LmFkZE91dGdvaW5nSW1wb3J0KGZteEltcG9ydENsYXVzZSk7XG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhJbXBvcnRDbGF1c2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBpbXBvcnQgY2xhdXNlXG4gICAgICogQHBhcmFtIGltcG9ydENsYXVzZUluZm8gVGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjcmVhdGUgYSBGYW1peCBpbXBvcnQgY2xhdXNlXG4gICAgICogQHBhcmFtIGltcG9ydERlY2xhcmF0aW9uIFRoZSBpbXBvcnQgZGVjbGFyYXRpb25cbiAgICAgKiBAcGFyYW0gaW1wb3J0ZXIgQSBzb3VyY2UgZmlsZSB3aGljaCBpcyBhIG1vZHVsZVxuICAgICAqIEBwYXJhbSBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aCBUaGUgcGF0aCBvZiB0aGUgbW9kdWxlIHdoZXJlIHRoZSBleHBvcnQgZGVjbGFyYXRpb24gaXNcbiAgICAgKiBAcGFyYW0gaW1wb3J0RWxlbWVudCBUaGUgaW1wb3J0ZWQgZW50aXR5XG4gICAgICogQHBhcmFtIGlzSW5FeHBvcnRzIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBpbXBvcnRlZCBlbnRpdHkgaXMgaW4gdGhlIGV4cG9ydHNcbiAgICAgKiBAcGFyYW0gaXNEZWZhdWx0RXhwb3J0IEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBpbXBvcnRlZCBlbnRpdHkgaXMgYSBkZWZhdWx0IGV4cG9ydFxuICAgICAqL1xuICAgIHB1YmxpYyBvbGRDcmVhdGVPckdldEZhbWl4SW1wb3J0Q2xhdXNlKGltcG9ydENsYXVzZUluZm86IHtpbXBvcnREZWNsYXJhdGlvbj86IEltcG9ydERlY2xhcmF0aW9uIHwgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24sIGltcG9ydGVyU291cmNlRmlsZTogU291cmNlRmlsZSwgbW9kdWxlU3BlY2lmaWVyRmlsZVBhdGg6IHN0cmluZywgaW1wb3J0RWxlbWVudDogSW1wb3J0U3BlY2lmaWVyIHwgSWRlbnRpZmllciwgaXNJbkV4cG9ydHM6IGJvb2xlYW4sIGlzRGVmYXVsdEV4cG9ydDogYm9vbGVhbn0pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qge2ltcG9ydERlY2xhcmF0aW9uLCBpbXBvcnRlclNvdXJjZUZpbGU6IGltcG9ydGVyLCBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aCwgaW1wb3J0RWxlbWVudCwgaXNJbkV4cG9ydHMsIGlzRGVmYXVsdEV4cG9ydH0gPSBpbXBvcnRDbGF1c2VJbmZvO1xuICAgICAgICBpZiAoaW1wb3J0RGVjbGFyYXRpb24gJiYgdGhpcy5mbXhJbXBvcnRDbGF1c2VNYXAuaGFzKGltcG9ydERlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgckltcG9ydENsYXVzZSA9IHRoaXMuZm14SW1wb3J0Q2xhdXNlTWFwLmdldChpbXBvcnREZWNsYXJhdGlvbik7XG4gICAgICAgICAgICBpZiAockltcG9ydENsYXVzZSkgeyBcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEltcG9ydCBjbGF1c2UgJHtpbXBvcnRFbGVtZW50LmdldFRleHQoKX0gYWxyZWFkeSBleGlzdHMgaW4gbWFwLCBza2lwcGluZy5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW1wb3J0IGNsYXVzZSAke2ltcG9ydEVsZW1lbnQuZ2V0VGV4dCgpfSBpcyBub3QgZm91bmQgaW4gdGhlIGltcG9ydCBjbGF1c2UgbWFwLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIGxvZ2dlci5pbmZvKGBjcmVhdGluZyBhIG5ldyBGYW1peEltcG9ydENsYXVzZSBmb3IgJHtpbXBvcnREZWNsYXJhdGlvbj8uZ2V0VGV4dCgpfSBpbiAke2ltcG9ydGVyLmdldEJhc2VOYW1lKCl9LmApO1xuICAgICAgICBjb25zdCBmbXhJbXBvcnRDbGF1c2UgPSBuZXcgRmFtaXguSW1wb3J0Q2xhdXNlKCk7XG4gICAgXG4gICAgICAgIGxldCBpbXBvcnRlZEVudGl0eTogRmFtaXguTmFtZWRFbnRpdHkgfCBGYW1peC5TdHJ1Y3R1cmFsRW50aXR5IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaW1wb3J0ZWRFbnRpdHlOYW1lOiBzdHJpbmc7XG4gICAgXG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aFByb2plY3QgPSB0aGlzLmZhbWl4UmVwLmdldEFic29sdXRlUGF0aCgpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5ub3JtYWxpemUobW9kdWxlU3BlY2lmaWVyRmlsZVBhdGgpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYGNyZWF0ZUZhbWl4SW1wb3J0Q2xhdXNlOiBhYnNvbHV0ZVBhdGg6ICR7YWJzb2x1dGVQYXRofWApO1xuICAgICAgICBsb2dnZXIuZGVidWcoYGNyZWF0ZUZhbWl4SW1wb3J0Q2xhdXNlOiBjb252ZXJ0VG9SZWxhdGl2ZVBhdGg6ICR7dGhpcy5jb252ZXJ0VG9SZWxhdGl2ZVBhdGgoYWJzb2x1dGVQYXRoLCBhYnNvbHV0ZVBhdGhQcm9qZWN0KX1gKTtcbiAgICAgICAgY29uc3QgcGF0aEluUHJvamVjdDogc3RyaW5nID0gdGhpcy5jb252ZXJ0VG9SZWxhdGl2ZVBhdGgoYWJzb2x1dGVQYXRoLCBhYnNvbHV0ZVBhdGhQcm9qZWN0KS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBjcmVhdGVGYW1peEltcG9ydENsYXVzZTogcGF0aEluUHJvamVjdDogJHtwYXRoSW5Qcm9qZWN0fWApO1xuICAgICAgICBsZXQgcGF0aE5hbWUgPSBcIntcIiArIHBhdGhJblByb2plY3QgKyBcIn0uXCI7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2U6IHBhdGhOYW1lOiAke3BhdGhOYW1lfWApO1xuICAgIFxuICAgICAgICBpZiAoaW1wb3J0RGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbXBvcnREZWNsYXJhdGlvbiBcbiAgICAgICAgICAgICYmIGltcG9ydEVsZW1lbnQgaW5zdGFuY2VvZiBJbXBvcnRTcGVjaWZpZXIpIHsgXG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHlOYW1lID0gaW1wb3J0RWxlbWVudC5nZXROYW1lKCk7XG4gICAgICAgICAgICBwYXRoTmFtZSA9IHBhdGhOYW1lICsgaW1wb3J0ZWRFbnRpdHlOYW1lO1xuICAgICAgICAgICAgaWYgKGlzSW5FeHBvcnRzKSB7XG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkgPSB0aGlzLmZhbWl4UmVwLmdldEZhbWl4RW50aXR5QnlGdWxseVF1YWxpZmllZE5hbWUocGF0aE5hbWUpIGFzIEZhbWl4Lk5hbWVkRW50aXR5O1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgZXhwb3J0ZWQgZW50aXR5OiAke3BhdGhOYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGltcG9ydGVkRW50aXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpbXBvcnRlZEVudGl0eSA9IG5ldyBGYW1peC5OYW1lZEVudGl0eSgpO1xuICAgICAgICAgICAgICAgIGltcG9ydGVkRW50aXR5Lm5hbWUgPSBpbXBvcnRlZEVudGl0eU5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0luRXhwb3J0cykge1xuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZEVudGl0eS5pc1N0dWIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYENyZWF0aW5nIG5hbWVkIGVudGl0eSAke2ltcG9ydGVkRW50aXR5TmFtZX0gZm9yIEltcG9ydFNwZWNpZmllciAke2ltcG9ydEVsZW1lbnQuZ2V0VGV4dCgpfWApO1xuICAgICAgICAgICAgICAgIGluaXRGUU4oaW1wb3J0RWxlbWVudCwgaW1wb3J0ZWRFbnRpdHkpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQXNzaWduZWQgRlFOIHRvIGVudGl0eTogJHtpbXBvcnRlZEVudGl0eS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlRmFtaXhJbmRleEZpbGVBbmNob3IoaW1wb3J0RWxlbWVudCwgaW1wb3J0ZWRFbnRpdHkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChpbXBvcnRlZEVudGl0eSk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBBZGRlZCBlbnRpdHkgdG8gcmVwb3NpdG9yeTogJHtpbXBvcnRlZEVudGl0eS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW1wb3J0RGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHlOYW1lID0gaW1wb3J0RGVjbGFyYXRpb24/LmdldE5hbWUoKTtcbiAgICAgICAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUgKyBpbXBvcnRlZEVudGl0eU5hbWU7XG4gICAgICAgICAgICBpbXBvcnRlZEVudGl0eSA9IG5ldyBGYW1peC5TdHJ1Y3R1cmFsRW50aXR5KCk7XG4gICAgICAgICAgICBpbXBvcnRlZEVudGl0eS5uYW1lID0gaW1wb3J0ZWRFbnRpdHlOYW1lO1xuICAgICAgICAgICAgaW5pdEZRTihpbXBvcnREZWNsYXJhdGlvbiwgaW1wb3J0ZWRFbnRpdHkpO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBBc3NpZ25lZCBGUU4gdG8gSW1wb3J0RXF1YWxzIGVudGl0eTogJHtpbXBvcnRlZEVudGl0eS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihpbXBvcnRFbGVtZW50LCBpbXBvcnRlZEVudGl0eSk7XG4gICAgICAgICAgICBjb25zdCBhbnlUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZSgnYW55JywgdW5kZWZpbmVkLCBpbXBvcnREZWNsYXJhdGlvbik7XG4gICAgICAgICAgICAoaW1wb3J0ZWRFbnRpdHkgYXMgRmFtaXguU3RydWN0dXJhbEVudGl0eSkuZGVjbGFyZWRUeXBlID0gYW55VHlwZTtcbiAgICAgICAgfSBlbHNlIHsgIFxuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHlOYW1lID0gaW1wb3J0RWxlbWVudC5nZXRUZXh0KCk7XG4gICAgICAgICAgICBwYXRoTmFtZSA9IHBhdGhOYW1lICsgKGlzRGVmYXVsdEV4cG9ydCA/IFwiZGVmYXVsdEV4cG9ydFwiIDogXCJuYW1lc3BhY2VFeHBvcnRcIik7XG4gICAgICAgICAgICBpbXBvcnRlZEVudGl0eSA9IG5ldyBGYW1peC5OYW1lZEVudGl0eSgpO1xuICAgICAgICAgICAgaW1wb3J0ZWRFbnRpdHkubmFtZSA9IGltcG9ydGVkRW50aXR5TmFtZTtcbiAgICAgICAgICAgIGluaXRGUU4oaW1wb3J0RWxlbWVudCwgaW1wb3J0ZWRFbnRpdHkpO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBBc3NpZ25lZCBGUU4gdG8gZGVmYXVsdC9uYW1lc3BhY2UgZW50aXR5OiAke2ltcG9ydGVkRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcbiAgICAgICAgICAgIHRoaXMubWFrZUZhbWl4SW5kZXhGaWxlQW5jaG9yKGltcG9ydEVsZW1lbnQsIGltcG9ydGVkRW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzSW5FeHBvcnRzKSB7XG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoaW1wb3J0ZWRFbnRpdHkpO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBBZGRlZCBub24tZXhwb3J0ZWQgZW50aXR5IHRvIHJlcG9zaXRvcnk6ICR7aW1wb3J0ZWRFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGltcG9ydGVyRnVsbHlRdWFsaWZpZWROYW1lID0gRlFORnVuY3Rpb25zLmdldEZRTihpbXBvcnRlcik7XG4gICAgICAgIGNvbnN0IGZteEltcG9ydGVyID0gdGhpcy5mYW1peFJlcC5nZXRGYW1peEVudGl0eUJ5RnVsbHlRdWFsaWZpZWROYW1lKGltcG9ydGVyRnVsbHlRdWFsaWZpZWROYW1lKSBhcyBGYW1peC5Nb2R1bGU7XG4gICAgICAgIGZteEltcG9ydENsYXVzZS5pbXBvcnRpbmdFbnRpdHkgPSBmbXhJbXBvcnRlcjtcbiAgICAgICAgZm14SW1wb3J0Q2xhdXNlLmltcG9ydGVkRW50aXR5ID0gaW1wb3J0ZWRFbnRpdHk7XG4gICAgICAgIGlmIChpbXBvcnREZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBmbXhJbXBvcnRDbGF1c2UubW9kdWxlU3BlY2lmaWVyID0gaW1wb3J0RGVjbGFyYXRpb24/LmdldE1vZHVsZVJlZmVyZW5jZSgpLmdldFRleHQoKSBhcyBzdHJpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmbXhJbXBvcnRDbGF1c2UubW9kdWxlU3BlY2lmaWVyID0gaW1wb3J0RGVjbGFyYXRpb24/LmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCkgYXMgc3RyaW5nO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgSW1wb3J0Q2xhdXNlOiAke2ZteEltcG9ydENsYXVzZS5pbXBvcnRlZEVudGl0eT8ubmFtZX0gKHR5cGU9JHtIZWxwZXJzLmdldFN1YlR5cGVOYW1lKGZteEltcG9ydENsYXVzZS5pbXBvcnRlZEVudGl0eSl9KSBpbXBvcnRlZCBieSAke2ZteEltcG9ydENsYXVzZS5pbXBvcnRpbmdFbnRpdHk/Lm5hbWV9YCk7XG4gICAgXG4gICAgICAgIGZteEltcG9ydGVyLmFkZE91dGdvaW5nSW1wb3J0KGZteEltcG9ydENsYXVzZSk7XG4gICAgICAgIHRoaXMuZmFtaXhSZXAuYWRkRWxlbWVudChmbXhJbXBvcnRDbGF1c2UpO1xuICAgIFxuICAgICAgICBpZiAoaW1wb3J0RGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZm14RWxlbWVudE9iamVjdE1hcC5zZXQoZm14SW1wb3J0Q2xhdXNlLCBpbXBvcnREZWNsYXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLmZteEltcG9ydENsYXVzZU1hcC5zZXQoaW1wb3J0RGVjbGFyYXRpb24sIGZteEltcG9ydENsYXVzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggQXJyb3cgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gYXJyb3dFeHByZXNzaW9uIEFuIEV4cHJlc3Npb25cbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHZhcmlhYmxlXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR2V0RmFtaXhBcnJvd0Z1bmN0aW9uKGFycm93RXhwcmVzc2lvbjogRXhwcmVzc2lvbiwgY3VycmVudENDOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ICk6IEZhbWl4LkFycm93RnVuY3Rpb24gfCBGYW1peC5QYXJhbWV0cmljQXJyb3dGdW5jdGlvbiB7XG4gICAgICAgIFxuICAgICAgICBsZXQgZm14QXJyb3dGdW5jdGlvbjogRmFtaXguQXJyb3dGdW5jdGlvbiB8IEZhbWl4LlBhcmFtZXRyaWNBcnJvd0Z1bmN0aW9uO1xuICAgICAgICBjb25zdCBmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oYXJyb3dFeHByZXNzaW9uKTtcblxuICAgICAgICBpZiAoIXRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuaGFzKGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lKSkge1xuXG4gICAgICAgICAgICBjb25zdCBhcnJvd0Z1bmN0aW9uID0gYXJyb3dFeHByZXNzaW9uLmFzS2luZE9yVGhyb3coU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uKTtcblxuICAgICAgICAgICAgY29uc3QgaXNHZW5lcmljID0gYXJyb3dGdW5jdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgICAgIGlmIChpc0dlbmVyaWMpIHtcbiAgICAgICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uID0gbmV3IEZhbWl4LlBhcmFtZXRyaWNBcnJvd0Z1bmN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbXhBcnJvd0Z1bmN0aW9uID0gbmV3IEZhbWl4LkFycm93RnVuY3Rpb24oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgb2YgdGhlIGFycm93IGZ1bmN0aW9uICh0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24pXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBhcnJvd0Z1bmN0aW9uLmdldFBhcmVudElmS2luZChTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uTmFtZSA9ICcoTk9fTkFNRSknO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudCBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lID0gcGFyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZ1bmN0aW9uTmFtZSkge1xuICAgICAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24ubmFtZSA9IGZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24ubmFtZSA9IFwiYW5vbnltb3VzXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNpZ25hdHVyZSBvZiBhbiBhcnJvdyBmdW5jdGlvbiBpcyAocGFyYW1ldGVycykgPT4gcmV0dXJuX3R5cGVcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnNTaWduYXR1cmUgPSBhcnJvd0Z1bmN0aW9uLmdldFBhcmFtZXRlcnMoKS5tYXAocCA9PiBwLmdldFRleHQoKSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgY29uc3QgcmV0dXJuVHlwZVNpZ25hdHVyZSA9IGFycm93RnVuY3Rpb24uZ2V0UmV0dXJuVHlwZSgpLmdldFRleHQoKTtcbiAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24uc2lnbmF0dXJlID0gYCgke3BhcmFtZXRlcnNTaWduYXR1cmV9KSA9PiAke3JldHVyblR5cGVTaWduYXR1cmV9YDtcbiAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24uY3ljbG9tYXRpY0NvbXBsZXhpdHkgPSBjdXJyZW50Q0NbZm14QXJyb3dGdW5jdGlvbi5uYW1lXTtcblxuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uVHlwZU5hbWUgPSB0aGlzLlVOS05PV05fVkFMVUU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZU5hbWUgPSBhcnJvd0Z1bmN0aW9uLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiAke2Vycm9yfS4gRmFpbGVkIHRvIGdldCB1c2FibGUgbmFtZSBmb3IgcmV0dXJuIHR5cGUgb2YgZnVuY3Rpb246ICR7ZnVuY3Rpb25OYW1lfS4gQ29udGludWluZy4uLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmbXhUeXBlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4VHlwZShmdW5jdGlvblR5cGVOYW1lLCBhcnJvd0Z1bmN0aW9uLmdldFJldHVyblR5cGUoKSwgYXJyb3dGdW5jdGlvbiBhcyB1bmtub3duIGFzIEZ1bmN0aW9uRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbi5kZWNsYXJlZFR5cGUgPSBmbXhUeXBlO1xuICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbi5udW1iZXJPZkxpbmVzT2ZDb2RlID0gYXJyb3dGdW5jdGlvbi5nZXRFbmRMaW5lTnVtYmVyKCkgLSBhcnJvd0Z1bmN0aW9uLmdldFN0YXJ0TGluZU51bWJlcigpO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IGFycm93RnVuY3Rpb24uZ2V0UGFyYW1ldGVycygpO1xuICAgICAgICAgICAgZm14QXJyb3dGdW5jdGlvbi5udW1iZXJPZlBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24ubnVtYmVyT2ZTdGF0ZW1lbnRzID0gYXJyb3dGdW5jdGlvbi5nZXRTdGF0ZW1lbnRzKCkubGVuZ3RoO1xuICAgICAgICAgICAgaW5pdEZRTihhcnJvd0V4cHJlc3Npb24gYXMgdW5rbm93biBhcyBUU01vcnBoT2JqZWN0VHlwZSwgZm14QXJyb3dGdW5jdGlvbik7XG4gICAgICAgICAgICB0aGlzLm1ha2VGYW1peEluZGV4RmlsZUFuY2hvcihhcnJvd0V4cHJlc3Npb24gYXMgdW5rbm93biBhcyBUU01vcnBoT2JqZWN0VHlwZSwgZm14QXJyb3dGdW5jdGlvbik7XG4gICAgICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14QXJyb3dGdW5jdGlvbik7XG4gICAgICAgICAgICB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteEFycm93RnVuY3Rpb24sYXJyb3dGdW5jdGlvbiBhcyB1bmtub3duIGFzIFRTTW9ycGhPYmplY3RUeXBlKTtcbiAgICAgICAgICAgIHRoaXMuZm14RnVuY3Rpb25BbmRNZXRob2RNYXAuc2V0KGZ1bmN0aW9uRnVsbHlRdWFsaWZpZWROYW1lLCBmbXhBcnJvd0Z1bmN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZteEFycm93RnVuY3Rpb24gPSB0aGlzLmZteEZ1bmN0aW9uQW5kTWV0aG9kTWFwLmdldChmdW5jdGlvbkZ1bGx5UXVhbGlmaWVkTmFtZSkgYXMgRmFtaXguQXJyb3dGdW5jdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbXhBcnJvd0Z1bmN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBjb25jcmV0aXNhdGlvblxuICAgICAqIEBwYXJhbSBjbHMgQSBjbGFzc1xuICAgICAqIEByZXR1cm5zIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29uY3JldGlzYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbihjb25FbnRpdHkgOiBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlIHwgRmFtaXguUGFyYW1ldHJpY0Z1bmN0aW9uIHwgRmFtaXguUGFyYW1ldHJpY01ldGhvZCAsZ2VuRW50aXR5IDogRmFtaXguUGFyYW1ldHJpY0NsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSB8IEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbiB8IEZhbWl4LlBhcmFtZXRyaWNNZXRob2QpOiBGYW1peC5Db25jcmV0aXNhdGlvbiB7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbiA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gbmV3IEZhbWl4LkNvbmNyZXRpc2F0aW9uKCk7ICAgICAgICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIGZteENvbmNyZXRpc2F0aW9uLmNvbmNyZXRlRW50aXR5ID0gY29uRW50aXR5O1xuICAgICAgICBmbXhDb25jcmV0aXNhdGlvbi5nZW5lcmljRW50aXR5ID0gZ2VuRW50aXR5O1xuICAgICAgICAvLyB0aGlzLmZteEVsZW1lbnRPYmplY3RNYXAuc2V0KGZteENvbmNyZXRpc2F0aW9uLG51bGwpO1xuICAgICAgICB0aGlzLmZhbWl4UmVwLmFkZEVsZW1lbnQoZm14Q29uY3JldGlzYXRpb24pO1xuICAgICAgICAvLyBjb25zdCBwYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiA9IHRoaXMuY3JlYXRlRmFtaXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbihmbXhDb25jcmV0aXNhdGlvbik7XG4gICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIGZteENvbmNyZXRpc2F0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBjb25jcmV0aXNhdGlvblxuICAgICAqIEBwYXJhbSBjb25jcmV0aXNhdGlvbiBBIEZhbWl4Q29uY3JldGlzYXRpb25cbiAgICAgKiBAcmV0dXJucyBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIFBhcmFtZXRlckNvbmNyZXN0aXNhdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGYW1peFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKGNvbmNyZXRpc2F0aW9uOiBGYW1peC5Db25jcmV0aXNhdGlvbik6IEZhbWl4LlBhcmFtZXRlckNvbmNyZXRpc2F0aW9uIHwgdW5kZWZpbmVke1xuICAgICAgICBjb25zdCBjb25DbGFzcyA9IGNvbmNyZXRpc2F0aW9uLmNvbmNyZXRlRW50aXR5O1xuICAgICAgICBjb25zdCBnZW5DbGFzcyA9IGNvbmNyZXRpc2F0aW9uLmdlbmVyaWNFbnRpdHk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgcGFyYW1ldGVyIGNvbmNyZXRpc2F0aW9uIGJldHdlZW4gJHtjb25DbGFzcy5mdWxseVF1YWxpZmllZE5hbWV9IGFuZCAke2dlbkNsYXNzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyQ29uY3JldGlzYXRpb25zID0gdGhpcy5mYW1peFJlcC5fZ2V0QWxsRW50aXRpZXNXaXRoVHlwZShcIlBhcmFtZXRlckNvbmNyZXRpc2F0aW9uXCIpIGFzIFNldDxGYW1peC5QYXJhbWV0ZXJDb25jcmV0aXNhdGlvbj47XG4gICAgICAgIGNvbnN0IGNvbmNyZXRlUGFyYW1ldGVycyA9IGNvbkNsYXNzLmNvbmNyZXRlUGFyYW1ldGVycztcbiAgICAgICAgY29uc3QgZ2VuZXJpY1BhcmFtZXRlcnMgPSBnZW5DbGFzcy5nZW5lcmljUGFyYW1ldGVycztcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGNvbkNsYXNzVHlwZVBhcmFtZXRlcnNJdGVyYXRvciA9IGNvbmNyZXRlUGFyYW1ldGVycy52YWx1ZXMoKTtcbiAgICAgICAgY29uc3QgZ2VuQ2xhc3NUeXBlUGFyYW1ldGVyc0l0ZXJhdG9yID0gZ2VuZXJpY1BhcmFtZXRlcnMudmFsdWVzKCk7XG4gICAgICAgIGxldCBmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbiA6IEZhbWl4LlBhcmFtZXRlckNvbmNyZXRpc2F0aW9uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2VuZXJpY1BhcmFtZXRlcnMuc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb25DbGFzc1R5cGVQYXJhbWV0ZXIgPSBjb25DbGFzc1R5cGVQYXJhbWV0ZXJzSXRlcmF0b3IubmV4dCgpLnZhbHVlIGFzIEZhbWl4LlBhcmFtZXRlclR5cGU7XG4gICAgICAgICAgICBjb25zdCBnZW5DbGFzc1R5cGVQYXJhbWV0ZXIgPSBnZW5DbGFzc1R5cGVQYXJhbWV0ZXJzSXRlcmF0b3IubmV4dCgpLnZhbHVlIGFzIEZhbWl4LlBhcmFtZXRlclR5cGU7XG4gICAgICAgICAgICBsZXQgY3JlYXRlUGFyYW1ldGVyQ29uY3JldGlzYXRpb24gOiBib29sZWFuID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmKGNvbkNsYXNzVHlwZVBhcmFtZXRlciAmJiBnZW5DbGFzc1R5cGVQYXJhbWV0ZXIgJiYgY29uQ2xhc3NUeXBlUGFyYW1ldGVyLm5hbWUgIT0gZ2VuQ2xhc3NUeXBlUGFyYW1ldGVyLm5hbWUpe1xuICAgICAgICAgICAgICAgIHBhcmFtZXRlckNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChwYXJhbSA6IEZhbWl4LlBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25DbGFzc1R5cGVQYXJhbWV0ZXIubmFtZSA9PSBwYXJhbS5jb25jcmV0ZVBhcmFtZXRlci5uYW1lICYmIGdlbkNsYXNzVHlwZVBhcmFtZXRlci5uYW1lID09IHBhcmFtLmdlbmVyaWNQYXJhbWV0ZXIubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUGFyYW1ldGVyQ29uY3JldGlzYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uID0gcGFyYW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoY3JlYXRlUGFyYW1ldGVyQ29uY3JldGlzYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24gPSBuZXcgRmFtaXguUGFyYW1ldGVyQ29uY3JldGlzYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24uZ2VuZXJpY1BhcmFtZXRlciA9IGdlbkNsYXNzVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgICAgICAgICAgICAgZm14UGFyYW1ldGVyQ29uY3JldGlzYXRpb24uY29uY3JldGVQYXJhbWV0ZXIgPSBjb25DbGFzc1R5cGVQYXJhbWV0ZXI7XG4gICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uLmFkZENvbmNyZXRpc2F0aW9uKGNvbmNyZXRpc2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5mbXhFbGVtZW50T2JqZWN0TWFwLnNldChmbXhQYXJhbWV0ZXJDb25jcmV0aXNhdGlvbixudWxsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uIHdhcyB1bmRlZmluZWQgZm9yIGNvbmNyZXRpc2F0aW9uIHdpdGggZ2VuZXJpYyBwYXJhbWV0ZXIgJHtnZW5DbGFzc1R5cGVQYXJhbWV0ZXIubmFtZX0gYW5kIGNvbmNyZXRlIHBhcmFtZXRlciAke2NvbkNsYXNzVHlwZVBhcmFtZXRlci5uYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uLmFkZENvbmNyZXRpc2F0aW9uKGNvbmNyZXRpc2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mYW1peFJlcC5hZGRFbGVtZW50KGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uIHdhcyB1bmRlZmluZWQgZm9yIGNvbmNyZXRpc2F0aW9uIHdpdGggY29uY3JldGUgZW50aXR5ICR7Y29uQ2xhc3MuZnVsbHlRdWFsaWZpZWROYW1lfSBhbmQgZ2VuZXJpYyBlbnRpdHkgJHtnZW5DbGFzcy5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZteFBhcmFtZXRlckNvbmNyZXRpc2F0aW9uO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGNvbmNyZXRpc2F0aW9uIGJldHdlZW4gdHdvIGNsYXNzZXMgb3IgdHdvIGludGVyZmFjZXNcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBBIGNsYXNzIG9yIGFuIEludGVyZmFjZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uQ2xhc3NPckludGVyZmFjZVNwZWNpYWxpc2F0aW9uKGVsZW1lbnQ6IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbil7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBzdXBlckVudGl0eSA9IGVsZW1lbnQuZ2V0RXh0ZW5kcygpO1xuICAgICAgICBsZXQgc3VwZXJFbnRpdHlBcnJheTtcbiAgICAgICAgaWYgKHN1cGVyRW50aXR5KXtcbiAgICAgICAgICAgIHN1cGVyRW50aXR5QXJyYXkgPSBBcnJheS5pc0FycmF5KHN1cGVyRW50aXR5KSA/IHN1cGVyRW50aXR5IDogW3N1cGVyRW50aXR5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VwZXJFbnRpdHlBcnJheSAmJiBzdXBlckVudGl0eUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN1cGVyRW50aXR5QXJyYXkuZm9yRWFjaChlbnRpdHkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBlbnRpdHlJc0dlbmVyaWM7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VwZXJFbnRpdHlTeW1ib2wgPSBlbnRpdHkuZ2V0RXhwcmVzc2lvbigpLmdldFN5bWJvbE9yVGhyb3coKTtcbiAgICAgICAgICAgICAgICBsZXQgc3VwZXJFbnRpdHlEZWNsYXJhdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAoc3VwZXJFbnRpdHkgaW5zdGFuY2VvZiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXJFbnRpdHlEZWNsYXJhdGlvbiA9IHN1cGVyRW50aXR5U3ltYm9sLmdldERlY2xhcmF0aW9ucygpWzBdLmFzS2luZCh0cy5TeW50YXhLaW5kLkNsYXNzRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyRW50aXR5RGVjbGFyYXRpb24gPSBzdXBlckVudGl0eVN5bWJvbC5nZXREZWNsYXJhdGlvbnMoKVswXS5hc0tpbmQodHMuU3ludGF4S2luZC5JbnRlcmZhY2VEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdXBlckVudGl0eURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0eUlzR2VuZXJpYyA9IHN1cGVyRW50aXR5RGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZW50aXR5SXNHZW5lcmljKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBFbnRpdHlEZWNsYXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdlbkVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1cGVyRW50aXR5IGluc3RhbmNlb2YgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlEZWNsYXJhdGlvbiA9IGVudGl0eS5nZXRFeHByZXNzaW9uKCkuZ2V0U3ltYm9sKCk/LmdldERlY2xhcmF0aW9ucygpWzBdIGFzIENsYXNzRGVjbGFyYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5FbnRpdHkgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDbGFzcyhFbnRpdHlEZWNsYXJhdGlvbikgYXMgRmFtaXguUGFyYW1ldHJpY0NsYXNzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5RGVjbGFyYXRpb24gPSBlbnRpdHkuZ2V0RXhwcmVzc2lvbigpLmdldFN5bWJvbCgpPy5nZXREZWNsYXJhdGlvbnMoKVswXSBhcyBJbnRlcmZhY2VEZWNsYXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbkVudGl0eSA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZShFbnRpdHlEZWNsYXJhdGlvbikgYXMgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZW5QYXJhbXMgPSBFbnRpdHlEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLm1hcCgocGFyYW0pID0+IHBhcmFtLmdldFRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBlbGVtZW50LmdldEhlcml0YWdlQ2xhdXNlcygpWzBdLmdldFR5cGVOb2RlcygpWzBdLmdldFR5cGVBcmd1bWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uUGFyYW1zID0gZWxlbWVudC5nZXRIZXJpdGFnZUNsYXVzZXMoKVswXS5nZXRUeXBlTm9kZXMoKVswXS5nZXRUeXBlQXJndW1lbnRzKCkubWFwKChwYXJhbSkgPT4gcGFyYW0uZ2V0VGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFIZWxwZXJzLmFycmF5c0FyZUVxdWFsKGNvblBhcmFtcyxnZW5QYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25FbnRpdHkgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoZ2VuRW50aXR5LEVudGl0eURlY2xhcmF0aW9uLGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY3JldGlzYXRpb25zID0gdGhpcy5mYW1peFJlcC5fZ2V0QWxsRW50aXRpZXNXaXRoVHlwZShcIkNvbmNyZXRpc2F0aW9uXCIpIGFzIFNldDxGYW1peC5Db25jcmV0aXNhdGlvbj47XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3JlYXRlQ29uY3JldGlzYXRpb24gOiBib29sZWFuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChjb25jIDogRmFtaXguQ29uY3JldGlzYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25jLmdlbmVyaWNFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lICYmIGNvbmMuY29uY3JldGVFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbkVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb25jcmV0aXNhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlQ29uY3JldGlzYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbiA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gdGhpcy5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uKGNvbkVudGl0eSxnZW5FbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzZWVtcyB1bmZpbmlzaGVkXG4gICAgfSAgICBcbiAgICBcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBGYW1peCBjb25jcmV0aXNhdGlvbiBiZXR3ZWVuIGEgY2xhc3MgYW5kIGl0cyBpbnN0YW5jaWF0aW9uc1xuICAgICAqIEBwYXJhbSBjbHMgQSBjbGFzc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uR2VuZXJpY0luc3RhbnRpYXRpb24oY2xzOiBDbGFzc0RlY2xhcmF0aW9uKXtcbiAgICAgICBcbiAgICAgICAgY29uc3QgaXNHZW5lcmljID0gY2xzLmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKGlzR2VuZXJpYykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VzID0gY2xzLmdldFNvdXJjZUZpbGUoKS5nZXREZXNjZW5kYW50c09mS2luZCh0cy5TeW50YXhLaW5kLk5ld0V4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihuZXdFeHByID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IG5ld0V4cHIuZ2V0RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5nZXRUZXh0KCkgPT09IGNscy5nZXROYW1lKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaW5zdGFuY2VzLmZvckVhY2goaW5zdGFuY2UgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlSXNHZW5lcmljID0gaW5zdGFuY2UuZ2V0VHlwZUFyZ3VtZW50cygpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlSXNHZW5lcmljKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvblBhcmFtcyA9IGluc3RhbmNlLmdldFR5cGVBcmd1bWVudHMoKS5tYXAoKHBhcmFtKSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZW5FbnRpdHkgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDbGFzcyhjbHMpIGFzIEZhbWl4LlBhcmFtZXRyaWNDbGFzcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VuUGFyYW1zID0gY2xzLmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKChwYXJhbSkgPT4gcGFyYW0uZ2V0VGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFIZWxwZXJzLmFycmF5c0FyZUVxdWFsKGNvblBhcmFtcyxnZW5QYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25FbnRpdHkgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoZ2VuRW50aXR5LGNscyxpbnN0YW5jZS5nZXRUeXBlQXJndW1lbnRzKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY3JldGlzYXRpb25zID0gdGhpcy5mYW1peFJlcC5fZ2V0QWxsRW50aXRpZXNXaXRoVHlwZShcIkNvbmNyZXRpc2F0aW9uXCIpIGFzIFNldDxGYW1peC5Db25jcmV0aXNhdGlvbj47XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3JlYXRlQ29uY3JldGlzYXRpb24gOiBib29sZWFuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChjb25jIDogRmFtaXguQ29uY3JldGlzYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25jLmdlbmVyaWNFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lICYmIGNvbmMuY29uY3JldGVFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbkVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb25jcmV0aXNhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlQ29uY3JldGlzYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbiA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gdGhpcy5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uKGNvbkVudGl0eSxnZW5FbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzZWVtcyB1bmZpbmlzaGVkXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEZhbWl4IGNvbmNyZXRpc2F0aW9uIGJldHdlZW4gYSBjbGFzcyBhbmQgaXRzIGluc3RhbmNpYXRpb25zXG4gICAgICogQHBhcmFtIGZ1bmMgQSBmdW5jdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uRnVuY3Rpb25JbnN0YW50aWF0aW9uKGVsZW1lbnQ6IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbil7XG4gICAgICAgIGNvbnN0IGlzR2VuZXJpYyA9IGVsZW1lbnQuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoaXNHZW5lcmljKSB7XG4gICAgICAgICAgICBjb25zdCBnZW5QYXJhbXMgPSBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKHBhcmFtID0+IHBhcmFtLmdldFRleHQoKSk7XG4gICAgICAgICAgICBjb25zdCB1c2VzID0gZWxlbWVudC5maW5kUmVmZXJlbmNlc0FzTm9kZXMoKTsgICAgXG4gICAgICAgICAgICB1c2VzLmZvckVhY2godXNhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50Tm9kZTogVHNNb3JwaE5vZGUgfCB1bmRlZmluZWQgPSB1c2FnZTtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsRXhwcmVzc2lvbiA9IGN1cnJlbnROb2RlLmFzS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FsbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbGxFeHByZXNzaW9uIG5vdCBmb3VuZCBmb3IgJHtjdXJyZW50Tm9kZS5nZXRUZXh0KCl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZUlzR2VuZXJpYyA9IGNhbGxFeHByZXNzaW9uLmdldFR5cGVBcmd1bWVudHMoKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlSXNHZW5lcmljKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IGNhbGxFeHByZXNzaW9uLmdldFR5cGVBcmd1bWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25QYXJhbXMgPSBjYWxsRXhwcmVzc2lvbi5nZXRUeXBlQXJndW1lbnRzKCkubWFwKHBhcmFtID0+IHBhcmFtLmdldFRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFIZWxwZXJzLmFycmF5c0FyZUVxdWFsKGNvblBhcmFtcyxnZW5QYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZW5FbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbGVtZW50IGluc3RhbmNlb2YgRnVuY3Rpb25EZWNsYXJhdGlvbil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5FbGVtZW50ID0gdGhpcy5jcmVhdGVPckdldEZhbWl4RnVuY3Rpb24oZWxlbWVudCwge30pIGFzIEZhbWl4LlBhcmFtZXRyaWNGdW5jdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhNZXRob2QoZWxlbWVudCwge30pIGFzIEZhbWl4LlBhcmFtZXRyaWNNZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY0VsZW1lbnQgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoZ2VuRWxlbWVudCxlbGVtZW50LGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25jcmV0aXNhdGlvbnMgPSB0aGlzLmZhbWl4UmVwLl9nZXRBbGxFbnRpdGllc1dpdGhUeXBlKFwiQ29uY3JldGlzYXRpb25cIikgYXMgU2V0PEZhbWl4LkNvbmNyZXRpc2F0aW9uPjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZUNvbmNyZXRpc2F0aW9uIDogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChjb25jIDogRmFtaXguQ29uY3JldGlzYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5FbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25jLmdlbmVyaWNFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lICYmIGNvbmMuY29uY3JldGVFbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbmNFbGVtZW50LmZ1bGx5UXVhbGlmaWVkTmFtZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29uY3JldGlzYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlQ29uY3JldGlzYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZteENvbmNyZXRpc2F0aW9uIDogRmFtaXguQ29uY3JldGlzYXRpb24gPSB0aGlzLmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb24oY29uY0VsZW1lbnQsZ2VuRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vbnRlciDDoCBsJ8OpbMOpbWVudCBwYXJlbnQgKHV0aWxlIHNpIGxlIG7Fk3VkIGRlIHLDqWbDqXJlbmNlIGVzdCB1biBlbmZhbnQpXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb24gYmV0d2VlbiBhIGNsYXNzIGFuZCBhbiBpbnRlcmZhY2VcbiAgICAgKiBAcGFyYW0gY2xzIEEgY2xhc3NcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkludGVyZmFjZUNsYXNzKGNsczogQ2xhc3NEZWNsYXJhdGlvbil7XG4gICAgXG4gICAgICAgIGNvbnN0IHN1cGVySW50ZXJmYWNlcyA9IGNscy5nZXRJbXBsZW1lbnRzKCk7XG4gICAgICAgIHN1cGVySW50ZXJmYWNlcy5mb3JFYWNoKGludGVyZmFjZVR5cGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJmYWNlSXNHZW5lcmljID0gaW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkubGVuZ3RoPjA7XG4gICAgICAgICAgICBpZiAoaW50ZXJmYWNlSXNHZW5lcmljKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJmYWNlRGVjbGFyYXRpb24gPSBpbnRlcmZhY2VUeXBlLmdldEV4cHJlc3Npb24oKS5nZXRTeW1ib2woKT8uZ2V0RGVjbGFyYXRpb25zKClbMF0gYXMgSW50ZXJmYWNlRGVjbGFyYXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgZ2VuUGFyYW1zID0gaW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHBhcmFtKSA9PiBwYXJhbS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvblBhcmFtcyA9IGNscy5nZXRIZXJpdGFnZUNsYXVzZXMoKVswXS5nZXRUeXBlTm9kZXMoKVswXS5nZXRUeXBlQXJndW1lbnRzKCkubWFwKChwYXJhbSkgPT4gcGFyYW0uZ2V0VGV4dCgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gY2xzLmdldEhlcml0YWdlQ2xhdXNlcygpWzBdLmdldFR5cGVOb2RlcygpWzBdLmdldFR5cGVBcmd1bWVudHMoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUhlbHBlcnMuYXJyYXlzQXJlRXF1YWwoY29uUGFyYW1zLGdlblBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VuSW50ZXJmYWNlID0gdGhpcy5jcmVhdGVPckdldEZhbWl4SW50ZXJmYWNlKGludGVyZmFjZURlY2xhcmF0aW9uKSBhcyBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25JbnRlcmZhY2UgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDb25jcmV0ZUVsZW1lbnQoZ2VuSW50ZXJmYWNlLGludGVyZmFjZURlY2xhcmF0aW9uLGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25jcmV0aXNhdGlvbnMgPSB0aGlzLmZhbWl4UmVwLl9nZXRBbGxFbnRpdGllc1dpdGhUeXBlKFwiQ29uY3JldGlzYXRpb25cIikgYXMgU2V0PEZhbWl4LkNvbmNyZXRpc2F0aW9uPjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZUNvbmNyZXRpc2F0aW9uIDogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChjb25jIDogRmFtaXguQ29uY3JldGlzYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5JbnRlcmZhY2UuZnVsbHlRdWFsaWZpZWROYW1lID09IGNvbmMuZ2VuZXJpY0VudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgJiYgY29uYy5jb25jcmV0ZUVudGl0eS5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uSW50ZXJmYWNlLmZ1bGx5UXVhbGlmaWVkTmFtZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29uY3JldGlzYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUNvbmNyZXRpc2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbiA6IEZhbWl4LkNvbmNyZXRpc2F0aW9uID0gdGhpcy5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uKGNvbkludGVyZmFjZSxnZW5JbnRlcmZhY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgRmFtaXggY29uY3JldGlzYXRpb24gYmV0d2VlbiBhbiBpbnRlcmZhY2UgYW5kIGEgVHlwZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IEEgdmFyaWFibGUgb3IgYSBmdW5jdGlvblxuICAgICAqIEBwYXJhbSBpbnRlciBBbiBpbnRlcmZhY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvblR5cGVJbnN0YW5jaWF0aW9uKGVsZW1lbnQ6IEludGVyZmFjZURlY2xhcmF0aW9uIHwgQ2xhc3NEZWNsYXJhdGlvbikge1xuXG4gICAgICAgIGNvbnN0IGlzR2VuZXJpYyA9IGVsZW1lbnQuZ2V0VHlwZVBhcmFtZXRlcnMoKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoaXNHZW5lcmljKSB7XG4gICAgICAgICAgICBjb25zdCBnZW5QYXJhbXMgPSBlbGVtZW50LmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKHBhcmFtID0+IHBhcmFtLmdldFRleHQoKSk7XG4gICAgICAgICAgICBjb25zdCB1c2VzID0gZWxlbWVudC5maW5kUmVmZXJlbmNlc0FzTm9kZXMoKTtcbiAgICAgICAgICAgIHVzZXMuZm9yRWFjaCh1c2UgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnROb2RlID0gdXNlLmdldFBhcmVudCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlUmVmZXJlbmNlTm9kZSA9IHBhcmVudE5vZGUuYXNLaW5kKFN5bnRheEtpbmQuVHlwZVJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXR5cGVSZWZlcmVuY2VOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlUmVmZXJlbmNlTm9kZSBub3QgZm91bmQgZm9yICR7cGFyZW50Tm9kZS5nZXRUZXh0KCl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlUmVmZXJlbmNlTm9kZUlzR2VuZXJpYyA9IHR5cGVSZWZlcmVuY2VOb2RlLmdldFR5cGVBcmd1bWVudHMoKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVSZWZlcmVuY2VOb2RlSXNHZW5lcmljKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB0eXBlUmVmZXJlbmNlTm9kZS5nZXRUeXBlQXJndW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25QYXJhbXMgPSB0eXBlUmVmZXJlbmNlTm9kZS5nZXRUeXBlQXJndW1lbnRzKCkubWFwKHBhcmFtID0+IHBhcmFtLmdldFRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUhlbHBlcnMuYXJyYXlzQXJlRXF1YWwoY29uUGFyYW1zLCBnZW5QYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdlbkVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZU9yR2V0RmFtaXhDbGFzcyhlbGVtZW50KSBhcyBGYW1peC5QYXJhbWV0cmljQ2xhc3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuRWxlbWVudCA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peEludGVyZmFjZShlbGVtZW50KSBhcyBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25jRWxlbWVudCA9IHRoaXMuY3JlYXRlT3JHZXRGYW1peENvbmNyZXRlRWxlbWVudChnZW5FbGVtZW50LCBlbGVtZW50LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25jcmV0aXNhdGlvbnMgPSB0aGlzLmZhbWl4UmVwLl9nZXRBbGxFbnRpdGllc1dpdGhUeXBlKFwiQ29uY3JldGlzYXRpb25cIikgYXMgU2V0PEZhbWl4LkNvbmNyZXRpc2F0aW9uPjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3JlYXRlQ29uY3JldGlzYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNyZXRpc2F0aW9ucy5mb3JFYWNoKChjb25jOiBGYW1peC5Db25jcmV0aXNhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuRWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUgPT0gY29uYy5nZW5lcmljRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSAmJiBjb25jLmNvbmNyZXRlRW50aXR5LmZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBjb25jRWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmNyZXRpc2F0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVDb25jcmV0aXNhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbXhDb25jcmV0aXNhdGlvbjogRmFtaXguQ29uY3JldGlzYXRpb24gPSB0aGlzLmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb24oY29uY0VsZW1lbnQsIGdlbkVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLmdldFBhcmVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnZlcnRUb1JlbGF0aXZlUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZywgYWJzb2x1dGVQYXRoUHJvamVjdDogc3RyaW5nKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY29udmVydFRvUmVsYXRpdmVQYXRoOiBhYnNvbHV0ZVBhdGg6ICcke2Fic29sdXRlUGF0aH0nLCBhYnNvbHV0ZVBhdGhQcm9qZWN0OiAnJHthYnNvbHV0ZVBhdGhQcm9qZWN0fSdgKTtcbiAgICAgICAgaWYgKGFic29sdXRlUGF0aC5zdGFydHNXaXRoKGFic29sdXRlUGF0aFByb2plY3QpKSB7XG4gICAgICAgICAgICByZXR1cm4gYWJzb2x1dGVQYXRoLnJlcGxhY2UoYWJzb2x1dGVQYXRoUHJvamVjdCwgXCJcIikuc2xpY2UoMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoYWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gYWJzb2x1dGVQYXRoLnNsaWNlKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUGF0aDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlVHlwZSh0eXBlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVOYW1lID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgIHR5cGVOYW1lID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgIHR5cGVOYW1lID09PSBcImJvb2xlYW5cIiB8fFxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJiaWdpbnRcIiB8fFxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJzeW1ib2xcIiB8fFxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJ1bmlxdWUgc3ltYm9sXCIgfHxcbiAgICAgICAgdHlwZU5hbWUgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgdHlwZU5hbWUgPT09IFwibnVsbFwiIHx8XG4gICAgICAgIHR5cGVOYW1lID09PSBcImFueVwiIHx8XG4gICAgICAgIHR5cGVOYW1lID09PSBcInVua25vd25cIiB8fFxuICAgICAgICB0eXBlTmFtZSA9PT0gXCJuZXZlclwiIHx8XG4gICAgICAgIHR5cGVOYW1lID09PSBcInZvaWRcIjtcbn1cblxuZnVuY3Rpb24gaW5pdEZRTihzb3VyY2VFbGVtZW50OiBUU01vcnBoT2JqZWN0VHlwZSwgZmFtaXhFbGVtZW50OiBGYW1peC5Tb3VyY2VkRW50aXR5KSB7XG4gICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgd2hlcmUgYW4gZWxlbWVudCBpcyBhIFR5cGUgLS0gbmVlZCB0byBjaGFuZ2UgaXRzIG5hbWVcbiAgICBpZiAoZmFtaXhFbGVtZW50IGluc3RhbmNlb2YgRmFtaXguVHlwZSAmJiAhKHNvdXJjZUVsZW1lbnQgaW5zdGFuY2VvZiBDb21tZW50UmFuZ2UpICYmIGlzVHlwZUNvbnRleHQoc291cmNlRWxlbWVudCkpIHtcbiAgICAgICAgbGV0IGZxbiA9IEZRTkZ1bmN0aW9ucy5nZXRGUU4oc291cmNlRWxlbWVudCk7XG4gICAgICAgIC8vIHVzaW5nIHJlZ2V4LCByZXBsYWNlIFtibGFoXSB3aXRoIFtibGFoVHlwZV1cbiAgICAgICAgZnFuID0gZnFuLnJlcGxhY2UoL1xcWyhbXlxcXV0rKVxcXS9nLCBcIlskMVR5cGVdXCIpO1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJTZXR0aW5nIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciBcIiArIGZhbWl4RWxlbWVudC5nZXRKU09OKCkgKyBcIiB0byBcIiArIGZxbik7XG4gICAgICAgIGZhbWl4RWxlbWVudC5mdWxseVF1YWxpZmllZE5hbWUgPSBmcW47XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gY2F0Y2ggYWxsIChleGNlcHQgY29tbWVudHMpXG4gICAgaWYgKCEoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIENvbW1lbnRSYW5nZSkpIHtcbiAgICAgICAgY29uc3QgZnFuID0gRlFORnVuY3Rpb25zLmdldEZRTihzb3VyY2VFbGVtZW50KTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2V0dGluZyBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgXCIgKyBmYW1peEVsZW1lbnQuZ2V0SlNPTigpICsgXCIgdG8gXCIgKyBmcW4pO1xuICAgICAgICAoZmFtaXhFbGVtZW50IGFzIEZhbWl4Lk5hbWVkRW50aXR5KS5mdWxseVF1YWxpZmllZE5hbWUgPSBmcW47XG4gICAgfSBcbn1cblxuXG5mdW5jdGlvbiBpc1R5cGVDb250ZXh0KHNvdXJjZUVsZW1lbnQ6IFRTTW9ycGhPYmplY3RUeXBlKTogYm9vbGVhbiB7XG4gICAgLy8gSnVzdCBrZWVwIHRoZSBleGlzdGluZyBTeW50YXhLaW5kIHNldCBhcyBpdCBpc1xuICAgIGNvbnN0IHR5cGVDb250ZXh0S2luZHMgPSBuZXcgU2V0KFtcbiAgICAgICAgU3ludGF4S2luZC5Db25zdHJ1Y3RvcixcbiAgICAgICAgU3ludGF4S2luZC5NZXRob2REZWNsYXJhdGlvbixcbiAgICAgICAgU3ludGF4S2luZC5GdW5jdGlvbkRlY2xhcmF0aW9uLFxuICAgICAgICBTeW50YXhLaW5kLkZ1bmN0aW9uRXhwcmVzc2lvbixcbiAgICAgICAgU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uLFxuICAgICAgICBTeW50YXhLaW5kLlBhcmFtZXRlcixcbiAgICAgICAgU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uLFxuICAgICAgICBTeW50YXhLaW5kLlByb3BlcnR5RGVjbGFyYXRpb24sXG4gICAgICAgIFN5bnRheEtpbmQuUHJvcGVydHlTaWduYXR1cmUsXG4gICAgICAgIFN5bnRheEtpbmQuVHlwZVBhcmFtZXRlcixcbiAgICAgICAgU3ludGF4S2luZC5JZGVudGlmaWVyLFxuICAgICAgICBTeW50YXhLaW5kLkRlY29yYXRvcixcbiAgICAgICAgU3ludGF4S2luZC5HZXRBY2Nlc3NvcixcbiAgICAgICAgU3ludGF4S2luZC5TZXRBY2Nlc3NvcixcbiAgICAgICAgU3ludGF4S2luZC5JbXBvcnRTcGVjaWZpZXIsXG4gICAgICAgIFN5bnRheEtpbmQuRW51bURlY2xhcmF0aW9uLFxuICAgICAgICBTeW50YXhLaW5kLkVudW1NZW1iZXIsXG4gICAgICAgIFN5bnRheEtpbmQuVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gICAgICAgIFN5bnRheEtpbmQuSW1wb3J0RGVjbGFyYXRpb24sXG4gICAgICAgIFN5bnRheEtpbmQuRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdHlwZUNvbnRleHRLaW5kcy5oYXMoc291cmNlRWxlbWVudC5nZXRLaW5kKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRJbnRlcmZhY2VPckNsYXNzRGVjbGFyYXRpb25Gcm9tRXhwcmVzc2lvbihleHByZXNzaW9uOiBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMpOiBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IENsYXNzRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICAgIC8vIFN0ZXAgMTogR2V0IHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uXG4gICAgY29uc3QgdHlwZSA9IGV4cHJlc3Npb24uZ2V0VHlwZSgpO1xuXG4gICAgLy8gU3RlcCAyOiBHZXQgdGhlIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGVcbiAgICBsZXQgc3ltYm9sID0gdHlwZS5nZXRTeW1ib2woKTtcblxuICAgIGlmICghc3ltYm9sKSB7XG4gICAgICAgIC8vIElmIHN5bWJvbCBpcyBub3QgZm91bmQsIHRyeSB0byBnZXQgdGhlIHN5bWJvbCBmcm9tIHRoZSBpZGVudGlmaWVyXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBleHByZXNzaW9uLmdldEZpcnN0RGVzY2VuZGFudEJ5S2luZChTeW50YXhLaW5kLklkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIWlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWRlbnRpZmllciBub3QgZm91bmQgZm9yICR7ZXhwcmVzc2lvbi5nZXRUZXh0KCl9LmApO1xuICAgICAgICB9XG4gICAgICAgIHN5bWJvbCA9IGlkZW50aWZpZXIuZ2V0U3ltYm9sKCk7XG4gICAgICAgIGlmICghc3ltYm9sKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bWJvbCBub3QgZm91bmQgZm9yICR7aWRlbnRpZmllci5nZXRUZXh0KCl9LmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RlcCAzOiBSZXNvbHZlIHRoZSBzeW1ib2wgdG8gZmluZCB0aGUgYWN0dWFsIGRlY2xhcmF0aW9uXG4gICAgY29uc3QgaW50ZXJmYWNlRGVjbGFyYXRpb24gPSByZXNvbHZlU3ltYm9sVG9JbnRlcmZhY2VPckNsYXNzRGVjbGFyYXRpb24oc3ltYm9sKTtcblxuICAgIGlmICghaW50ZXJmYWNlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBJbnRlcmZhY2UgZGVjbGFyYXRpb24gbm90IGZvdW5kIGZvciAke2V4cHJlc3Npb24uZ2V0VGV4dCgpfS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJmYWNlRGVjbGFyYXRpb247XG59XG5cbmltcG9ydCB7IFN5bWJvbCBhcyBUU01vcnBoU3ltYm9sLCBOb2RlIGFzIFRzTW9ycGhOb2RlIH0gZnJvbSBcInRzLW1vcnBoXCI7XG5pbXBvcnQgXyBmcm9tIFwibG9kYXNoXCI7XG5cbmZ1bmN0aW9uIHJlc29sdmVTeW1ib2xUb0ludGVyZmFjZU9yQ2xhc3NEZWNsYXJhdGlvbihzeW1ib2w6IFRTTW9ycGhTeW1ib2wpOiBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IENsYXNzRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICAgIC8vIEdldCB0aGUgZGVjbGFyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sXG4gICAgY29uc3QgZGVjbGFyYXRpb25zID0gc3ltYm9sLmdldERlY2xhcmF0aW9ucygpO1xuXG4gICAgLy8gRmlsdGVyIGZvciBJbnRlcmZhY2VEZWNsYXJhdGlvbiBvciBDbGFzc0RlY2xhcmF0aW9uXG4gICAgY29uc3QgaW50ZXJmYWNlT3JDbGFzc0RlY2xhcmF0aW9uID0gZGVjbGFyYXRpb25zLmZpbmQoXG4gICAgICAgIGRlY2xhcmF0aW9uID0+IFxuICAgICAgICAgICAgZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8fCBcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgYXMgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBDbGFzc0RlY2xhcmF0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGludGVyZmFjZU9yQ2xhc3NEZWNsYXJhdGlvbikge1xuICAgICAgICByZXR1cm4gaW50ZXJmYWNlT3JDbGFzc0RlY2xhcmF0aW9uO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbXBvcnRzOiBJZiB0aGUgc3ltYm9sIGlzIGltcG9ydGVkLCByZXNvbHZlIHRoZSBpbXBvcnQgdG8gZmluZCB0aGUgYWN0dWFsIGRlY2xhcmF0aW9uXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBkZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5JbXBvcnRTcGVjaWZpZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydFNwZWNpZmllciA9IGRlY2xhcmF0aW9uIGFzIEltcG9ydFNwZWNpZmllcjtcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydERlY2xhcmF0aW9uID0gaW1wb3J0U3BlY2lmaWVyLmdldEltcG9ydERlY2xhcmF0aW9uKCk7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBpbXBvcnREZWNsYXJhdGlvbi5nZXRNb2R1bGVTcGVjaWZpZXJTb3VyY2VGaWxlKCk7XG5cbiAgICAgICAgICAgIGlmIChtb2R1bGVTcGVjaWZpZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBvcnRlZFN5bWJvbHMgPSBtb2R1bGVTcGVjaWZpZXIuZ2V0RXhwb3J0U3ltYm9scygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9ydGVkU3ltYm9sID0gZXhwb3J0ZWRTeW1ib2xzLmZpbmQoc3ltYm9sID0+IHN5bWJvbC5nZXROYW1lKCkgPT09IGltcG9ydFNwZWNpZmllci5nZXROYW1lKCkpO1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRlZFN5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVN5bWJvbFRvSW50ZXJmYWNlT3JDbGFzc0RlY2xhcmF0aW9uKGV4cG9ydGVkU3ltYm9sKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJpbWl0aXZlVHlwZU5hbWUodHlwZTogVHlwZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZsYWdzID0gdHlwZS5jb21waWxlclR5cGUuZmxhZ3M7XG5cbiAgaWYgKGZsYWdzICYgdHMuVHlwZUZsYWdzLlN0cmluZykgcmV0dXJuIFwic3RyaW5nXCI7XG4gIGlmIChmbGFncyAmIHRzLlR5cGVGbGFncy5OdW1iZXIpIHJldHVybiBcIm51bWJlclwiO1xuICBpZiAoZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuQm9vbGVhbikgcmV0dXJuIFwiYm9vbGVhblwiO1xuICBpZiAoZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuQmlnSW50KSByZXR1cm4gXCJiaWdpbnRcIjtcbiAgaWYgKGZsYWdzICYgdHMuVHlwZUZsYWdzLlVuaXF1ZUVTU3ltYm9sKSByZXR1cm4gXCJ1bmlxdWUgc3ltYm9sXCI7XG4gIGlmIChmbGFncyAmIHRzLlR5cGVGbGFncy5FU1N5bWJvbCkgcmV0dXJuIFwic3ltYm9sXCI7XG4gIGlmIChmbGFncyAmIHRzLlR5cGVGbGFncy5VbmRlZmluZWQpIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICBpZiAoZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuTnVsbCkgcmV0dXJuIFwibnVsbFwiO1xuICBpZiAoZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuVm9pZCkgcmV0dXJuIFwidm9pZFwiO1xuICBpZiAoZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuTmV2ZXIpIHJldHVybiBcIm5ldmVyXCI7XG4gIGlmIChmbGFncyAmIHRzLlR5cGVGbGFncy5BbnkpIHJldHVybiBcImFueVwiO1xuICBpZiAoZmxhZ3MgJiB0cy5UeXBlRmxhZ3MuVW5rbm93bikgcmV0dXJuIFwidW5rbm93blwiO1xuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIGZ1bmN0aW9uIG9sZEdldEludGVyZmFjZURlY2xhcmF0aW9uRnJvbUV4cHJlc3Npb24oZXhwcmVzc2lvbjogRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKTogSW50ZXJmYWNlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuLy8gICAgIC8vIFR3byBjYXNlczpcbi8vICAgICAvLyBjbGFzcyBBIGltcGxlbWVudHMgSW1wb3J0ZWRJbnRlcmZhY2UsIERlY2xhcmVkSW50ZXJmYWNlIHt9XG4vLyAgICAgY29uc3QgdHlwZSA9IGV4cHJlc3Npb24uZ2V0VHlwZSgpO1xuXG4vLyAgICAgLy8gSW1wb3J0ZWRJbnRlcmZhY2U6IHR5cGUgd2lsbCBhIHN5bWJvbCBcbi8vICAgICBsZXQgc3ltYm9sID0gdHlwZS5nZXRBbGlhc1N5bWJvbCgpOyAgLy8gd2lsbCBiZSBkZWZpbmVkIGZvciBpbXBvcnRlZCBpbnRlcmZhY2VzXG5cbi8vICAgICBpZiAoIXN5bWJvbCkge1xuLy8gICAgICAgICAvLyBEZWNsYXJlZEludGVyZmFjZTogdHlwZSB3aWxsIGJlIGFuIEludGVyZmFjZURlY2xhcmF0aW9uIG9uIElkZW50aWZpZXIgbm9kZSB0aGF0IGlzIHRoZSBjaGlsZCBvZiB0aGUgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXG4vLyAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBleHByZXNzaW9uLmdldEZpcnN0RGVzY2VuZGFudEJ5S2luZChTeW50YXhLaW5kLklkZW50aWZpZXIpO1xuLy8gICAgICAgICBpZiAoIWlkZW50aWZpZXIpIHtcbi8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWRlbnRpZmllciBub3QgZm91bmQgZm9yICR7ZXhwcmVzc2lvbi5nZXRUZXh0KCl9LmApO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHN5bWJvbCA9IGlkZW50aWZpZXIuZ2V0U3ltYm9sKCk7XG4vLyAgICAgICAgIGlmICghc3ltYm9sKSB7XG4vLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bWJvbCBub3QgZm91bmQgZm9yICR7aWRlbnRpZmllci5nZXRUZXh0KCl9LmApO1xuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgLy8gU3RlcCAzOiBHZXQgdGhlIGRlY2xhcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbFxuLy8gICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IHN5bWJvbC5nZXREZWNsYXJhdGlvbnMoKTtcblxuLy8gICAgIC8vIFN0ZXAgNDogRmlsdGVyIGZvciBJbnRlcmZhY2VEZWNsYXJhdGlvblxuLy8gICAgIGNvbnN0IGludGVyZmFjZURlY2xhcmF0aW9uID0gZGVjbGFyYXRpb25zLmZpbmQoZGVjbGFyYXRpb24gPT4gZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgYXMgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQ7XG5cbi8vICAgICBpZiAoIWludGVyZmFjZURlY2xhcmF0aW9uKSB7XG4vLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJmYWNlIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCBmb3IgJHtleHByZXNzaW9uLmdldFRleHQoKX0uYCk7XG4vLyAgICAgfVxuXG4vLyAgICAgcmV0dXJuIGludGVyZmFjZURlY2xhcmF0aW9uO1xuLy8gfVxuIl19
|
package/dist/ts2famix-cli.js
CHANGED
|
@@ -45,6 +45,8 @@ const analyze_2 = require("./analyze");
|
|
|
45
45
|
const argv = yargs_1.default
|
|
46
46
|
.example(`ts2famix -i "path/to/project/**/*.ts" -o JSONModels/projectName.json`, 'Creates a JSON-format Famix model of typescript files.')
|
|
47
47
|
.example(`ts2famix -i path/to/tsconfig.json -o JSONModels/projectName.json`, 'Creates a JSON-format model of a typescript project.')
|
|
48
|
+
.version()
|
|
49
|
+
.alias('v', 'version')
|
|
48
50
|
.alias('i', 'input')
|
|
49
51
|
.nargs('i', 1)
|
|
50
52
|
.alias('o', 'output')
|
|
@@ -90,4 +92,4 @@ fs.writeFile(jsonFilePath, jsonOutput, (err) => {
|
|
|
90
92
|
}
|
|
91
93
|
});
|
|
92
94
|
analyze_3.logger.info(`Created: ${jsonFilePath}`);
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHMyZmFtaXgtY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RzMmZhbWl4LWNsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx1Q0FBeUI7QUFDekIsa0RBQTBCO0FBQzFCLHVDQUFxQztBQUVyQyx1Q0FBbUM7QUFDbkMsdUNBQW1DO0FBRW5DLE1BQU0sSUFBSSxHQUFHLGVBQUs7S0FDYixPQUFPLENBQUMsc0VBQXNFLEVBQUUsd0RBQXdELENBQUM7S0FDekksT0FBTyxDQUFDLGtFQUFrRSxFQUFFLHNEQUFzRCxDQUFDO0tBQ25JLE9BQU8sRUFBRTtLQUNULEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDO0tBQ3JCLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO0tBQ25CLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQ2IsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7S0FDcEIsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7S0FDYixLQUFLLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQztLQUN0QixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUNiLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQ2YsUUFBUSxDQUFDLEdBQUcsRUFBRSw4RkFBOEYsQ0FBQztLQUM3RyxPQUFPLENBQUMsV0FBVyxDQUFDO0tBQ3BCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDO0tBQzNCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsc0lBQXNJLENBQUM7S0FDN0osWUFBWSxDQUFDLE9BQU8sQ0FBQztLQUNyQixZQUFZLENBQUMsUUFBUSxDQUFDO0tBQ3RCLFNBQVMsRUFBRSxDQUFDO0FBRWpCLHVDQUFtQztBQUNuQyxnQkFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQVcsQ0FBQztBQUMzRCxnQkFBTSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBb0IsQ0FBQztBQUVuRCxNQUFNLFFBQVEsR0FBRyxJQUFJLGtCQUFRLEVBQUUsQ0FBQztBQUNoQyxJQUFJLFFBQXlCLENBQUM7QUFFOUIsSUFBSyxJQUFJLENBQUMsS0FBZ0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztJQUNuRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFlLENBQUM7SUFDOUMseUNBQXlDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakYsZ0JBQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQU8sQ0FBQztRQUN4QixnQkFBZ0I7UUFDaEIsZUFBZSxFQUFFO1lBQ2IsT0FBTyxFQUFFLE9BQU87U0FDbkI7S0FDRixDQUFDLENBQUM7SUFDTCxRQUFRLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRXJELENBQUM7S0FBTSxDQUFDO0lBQ0osTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFlLENBQUMsQ0FBQztJQUNqQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7QUFDckQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQWdCLENBQUM7QUFFM0MsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7SUFDM0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUFDLE1BQU0sR0FBRyxDQUFDO0lBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMsQ0FBQztBQUVILGdCQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksWUFBWSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHlhcmdzIGZyb20gXCJ5YXJnc1wiO1xuaW1wb3J0IHsgSW1wb3J0ZXIgfSBmcm9tICcuL2FuYWx5emUnO1xuaW1wb3J0IHsgRmFtaXhSZXBvc2l0b3J5IH0gZnJvbSBcIi4vbGliL2ZhbWl4L2ZhbWl4X3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tIFwidHMtbW9ycGhcIjtcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCIuL2FuYWx5emVcIjtcblxuY29uc3QgYXJndiA9IHlhcmdzXG4gICAgLmV4YW1wbGUoYHRzMmZhbWl4IC1pIFwicGF0aC90by9wcm9qZWN0LyoqLyoudHNcIiAtbyBKU09OTW9kZWxzL3Byb2plY3ROYW1lLmpzb25gLCAnQ3JlYXRlcyBhIEpTT04tZm9ybWF0IEZhbWl4IG1vZGVsIG9mIHR5cGVzY3JpcHQgZmlsZXMuJylcbiAgICAuZXhhbXBsZShgdHMyZmFtaXggLWkgcGF0aC90by90c2NvbmZpZy5qc29uIC1vIEpTT05Nb2RlbHMvcHJvamVjdE5hbWUuanNvbmAsICdDcmVhdGVzIGEgSlNPTi1mb3JtYXQgbW9kZWwgb2YgYSB0eXBlc2NyaXB0IHByb2plY3QuJylcbiAgICAudmVyc2lvbigpXG4gICAgLmFsaWFzKCd2JywgJ3ZlcnNpb24nKVxuICAgIC5hbGlhcygnaScsICdpbnB1dCcpXG4gICAgLm5hcmdzKCdpJywgMSlcbiAgICAuYWxpYXMoJ28nLCAnb3V0cHV0JylcbiAgICAubmFyZ3MoJ28nLCAxKVxuICAgIC5hbGlhcygnbCcsICdsb2dsZXZlbCcpXG4gICAgLm5hcmdzKCdsJywgMSlcbiAgICAuZGVmYXVsdCgnbCcsIDMpXG4gICAgLmRlc2NyaWJlKCdsJywgJ1NldCBtaW5pbXVtIGxvZ2dpbmcgbGV2ZWwgMDogc2lsbHksIDE6IHRyYWNlLCAyOiBkZWJ1ZywgMzogaW5mbywgNDogd2FybiwgNTogZXJyb3IsIDY6IGZhdGFsJylcbiAgICAuYm9vbGVhbignZ3JhcGhlbWVzJylcbiAgICAuZGVmYXVsdCgnZ3JhcGhlbWVzJywgZmFsc2UpXG4gICAgLmRlc2NyaWJlKCdncmFwaGVtZXMnLCAnUHJvY2VzcyBncmFwaGVtZXMgKG91dHNpZGUgb2YgdGhlIEJNUCkgdG8gYXZvaWQgc291cmNlIGFuY2hvciBvZmZzZXQgZXJyb3JzIChkdWUgdG8gcGVyZm9ybWFuY2UgaXNzdWVzLCB0aGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQpJylcbiAgICAuZGVtYW5kT3B0aW9uKCdpbnB1dCcpXG4gICAgLmRlbWFuZE9wdGlvbignb3V0cHV0JylcbiAgICAucGFyc2VTeW5jKCk7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vYW5hbHl6ZSc7XG5sb2dnZXIuc2V0dGluZ3MubWluTGV2ZWwgPSBOdW1iZXIoYXJndi5sb2dsZXZlbCkgYXMgbnVtYmVyO1xuY29uZmlnLmV4cGVjdEdyYXBoZW1lcyA9IGFyZ3YuZ3JhcGhlbWVzIGFzIGJvb2xlYW47XG5cbmNvbnN0IGltcG9ydGVyID0gbmV3IEltcG9ydGVyKCk7XG5sZXQgZmFtaXhSZXA6IEZhbWl4UmVwb3NpdG9yeTtcblxuaWYgKChhcmd2LmlucHV0IGFzIHN0cmluZykuZW5kc1dpdGgoJ3RzY29uZmlnLmpzb24nKSkge1xuICAgIGNvbnN0IHRzQ29uZmlnRmlsZVBhdGggPSBhcmd2LmlucHV0IGFzIHN0cmluZztcbiAgICAvLyBnZXQgdGhlIGJhc2VVcmwgZnJvbSB0aGUgdHNjb25maWcgZmlsZVxuICAgIGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZ0ZpbGVQYXRoLnN1YnN0cmluZygwLCB0c0NvbmZpZ0ZpbGVQYXRoLmxhc3RJbmRleE9mKCcvJykpO1xuICAgIGxvZ2dlci5pbmZvKGBiYXNlVXJsOiAke2Jhc2VVcmx9YCk7XG4gICAgY29uc3QgcHJvamVjdCA9IG5ldyBQcm9qZWN0KHtcbiAgICAgICAgdHNDb25maWdGaWxlUGF0aCxcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgICBiYXNlVXJsOiBiYXNlVXJsLFxuICAgICAgICB9XG4gICAgICB9KTsgXG4gICAgZmFtaXhSZXAgPSBpbXBvcnRlci5mYW1peFJlcEZyb21Qcm9qZWN0KHByb2plY3QpO1xuXG59IGVsc2Uge1xuICAgIGNvbnN0IHBhdGhzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBwYXRocy5wdXNoKGFyZ3YuaW5wdXQgYXMgc3RyaW5nKTtcbiAgICBmYW1peFJlcCA9IGltcG9ydGVyLmZhbWl4UmVwRnJvbVBhdGhzKHBhdGhzKTtcbn1cblxuY29uc3QganNvbk91dHB1dCA9IGZhbWl4UmVwLmV4cG9ydCh7Zm9ybWF0OiBcImpzb25cIn0pO1xuY29uc3QganNvbkZpbGVQYXRoID0gYXJndi5vdXRwdXQgYXMgc3RyaW5nO1xuXG5mcy53cml0ZUZpbGUoanNvbkZpbGVQYXRoLCBqc29uT3V0cHV0LCAoZXJyKSA9PiB7XG4gICAgaWYgKGVycikgeyB0aHJvdyBlcnI7IH1cbn0pO1xuXG5sb2dnZXIuaW5mbyhgQ3JlYXRlZDogJHtqc29uRmlsZVBhdGh9YCk7IFxuIl19
|
package/package.json
CHANGED
|
@@ -96,7 +96,7 @@ export class EntityDictionary {
|
|
|
96
96
|
|
|
97
97
|
// The +1 is because the source anchor (Pharo) is 1-based, but ts-morph is 0-based
|
|
98
98
|
sourceAnchor.startPos = sourceStart + 1;
|
|
99
|
-
sourceAnchor.endPos = sourceEnd
|
|
99
|
+
sourceAnchor.endPos = sourceEnd;
|
|
100
100
|
|
|
101
101
|
let fileName = node.getSourceFile().getFilePath() as string;
|
|
102
102
|
if (fileName.startsWith("/")) {
|
|
@@ -196,7 +196,7 @@ export class EntityDictionary {
|
|
|
196
196
|
}
|
|
197
197
|
// note: the +1 is because the source anchor is 1-based, but ts-morph is 0-based
|
|
198
198
|
fmxIndexFileAnchor.startPos = sourceStart + 1;
|
|
199
|
-
fmxIndexFileAnchor.endPos = sourceEnd
|
|
199
|
+
fmxIndexFileAnchor.endPos = sourceEnd;
|
|
200
200
|
|
|
201
201
|
// if (!(famixElement instanceof Famix.ImportClause || famixElement instanceof Famix.Access || famixElement instanceof Famix.Reference || famixElement instanceof Famix.Invocation || famixElement instanceof Famix.Inheritance) && !(famixElement instanceof Famix.Comment) && !(sourceElement instanceof CommentRange) && !(sourceElement instanceof Identifier) && !(sourceElement instanceof ImportSpecifier) && !(sourceElement instanceof ExpressionWithTypeArguments)) {
|
|
202
202
|
// initFQN(sourceElement, famixElement);
|
package/src/ts2famix-cli.ts
CHANGED
|
@@ -9,6 +9,8 @@ import { config } from "./analyze";
|
|
|
9
9
|
const argv = yargs
|
|
10
10
|
.example(`ts2famix -i "path/to/project/**/*.ts" -o JSONModels/projectName.json`, 'Creates a JSON-format Famix model of typescript files.')
|
|
11
11
|
.example(`ts2famix -i path/to/tsconfig.json -o JSONModels/projectName.json`, 'Creates a JSON-format model of a typescript project.')
|
|
12
|
+
.version()
|
|
13
|
+
.alias('v', 'version')
|
|
12
14
|
.alias('i', 'input')
|
|
13
15
|
.nargs('i', 1)
|
|
14
16
|
.alias('o', 'output')
|