babylonjs-serializers 8.7.0 → 8.7.1
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.
|
@@ -556,7 +556,7 @@ function BuildAdditionalAttributes(geometry, options) {
|
|
|
556
556
|
var string = "";
|
|
557
557
|
for (var i = 0; i < 4; i++) {
|
|
558
558
|
var id = i > 0 ? i : "";
|
|
559
|
-
var uvAttribute = geometry.getVerticesData(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer.UVKind + (id ? id : ""));
|
|
559
|
+
var uvAttribute = geometry.getVerticesData(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer.UVKind + (id ? id + 1 : "")); // UV names go like "uv", "uv2", "uv3", etc.
|
|
560
560
|
if (uvAttribute) {
|
|
561
561
|
string += "\n\t\ttexCoord2f[] primvars:st".concat(id, " = [").concat(BuildVector2Array(uvAttribute, options), "] (\n\t\t\tinterpolation = \"vertex\"\n\t\t)");
|
|
562
562
|
}
|
|
@@ -571,7 +571,7 @@ function BuildAdditionalAttributes(geometry, options) {
|
|
|
571
571
|
function BuildMesh(geometry, options) {
|
|
572
572
|
var name = "Geometry";
|
|
573
573
|
var position = geometry.getVerticesData(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer.PositionKind);
|
|
574
|
-
var normal = geometry.getVerticesData(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer.
|
|
574
|
+
var normal = geometry.getVerticesData(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.VertexBuffer.NormalKind);
|
|
575
575
|
if (!position || !normal) {
|
|
576
576
|
return;
|
|
577
577
|
}
|
|
@@ -597,7 +597,7 @@ function BuildXform(mesh) {
|
|
|
597
597
|
var name = "Object_" + mesh.uniqueId;
|
|
598
598
|
var matrix = mesh.getWorldMatrix().clone();
|
|
599
599
|
if (matrix.determinant() < 0) {
|
|
600
|
-
|
|
600
|
+
babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Tools.Warn("Exporting mesh ".concat(mesh.name, " with negative scale. Result may look incorrect in destination engine."));
|
|
601
601
|
}
|
|
602
602
|
var transform = BuildMatrix(matrix);
|
|
603
603
|
return "def Xform \"".concat(name, "\" (\n\tprepend references = @./geometries/Geometry_").concat(mesh.geometry.uniqueId, ".usda@</Geometry>\n\tprepend apiSchemas = [\"MaterialBindingAPI\"]\n)\n{\n\tmatrix4d xformOp:transform = ").concat(transform, "\n\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\t\n\n rel material:binding = </Materials/Material_").concat(mesh.material.uniqueId, ">\n}\n\n");
|
|
@@ -665,6 +665,10 @@ function ExtractTextureInformations(material) {
|
|
|
665
665
|
aoMapIntensity: 0,
|
|
666
666
|
alphaMap: material.opacityTexture,
|
|
667
667
|
ior: 1,
|
|
668
|
+
clearCoat: 0,
|
|
669
|
+
clearCoatMap: null,
|
|
670
|
+
clearCoatRoughness: 0,
|
|
671
|
+
clearCoatRoughnessMap: null,
|
|
668
672
|
};
|
|
669
673
|
case "PBRMaterial":
|
|
670
674
|
return {
|
|
@@ -685,6 +689,12 @@ function ExtractTextureInformations(material) {
|
|
|
685
689
|
aoMapIntensity: material.ambientTextureStrength,
|
|
686
690
|
alphaMap: material.opacityTexture,
|
|
687
691
|
ior: material.indexOfRefraction,
|
|
692
|
+
clearCoat: material.clearCoat.intensity,
|
|
693
|
+
clearCoatMap: material.clearCoat.texture,
|
|
694
|
+
clearCoatRoughness: material.clearCoat.roughness,
|
|
695
|
+
clearCoatRoughnessMap: material.clearCoat.useRoughnessFromMainTexture
|
|
696
|
+
? material.clearCoat.texture
|
|
697
|
+
: material.clearCoat.textureRoughness,
|
|
688
698
|
};
|
|
689
699
|
case "PBRMetallicRoughnessMaterial":
|
|
690
700
|
return {
|
|
@@ -705,6 +715,12 @@ function ExtractTextureInformations(material) {
|
|
|
705
715
|
aoMapIntensity: material.ambientTextureStrength,
|
|
706
716
|
alphaMap: material.opacityTexture,
|
|
707
717
|
ior: material.indexOfRefraction,
|
|
718
|
+
clearCoat: material.clearCoat.intensity,
|
|
719
|
+
clearCoatMap: material.clearCoat.texture,
|
|
720
|
+
clearCoatRoughness: material.clearCoat.roughness,
|
|
721
|
+
clearCoatRoughnessMap: material.clearCoat.useRoughnessFromMainTexture
|
|
722
|
+
? material.clearCoat.texture
|
|
723
|
+
: material.clearCoat.textureRoughness,
|
|
708
724
|
};
|
|
709
725
|
default:
|
|
710
726
|
return {
|
|
@@ -722,6 +738,10 @@ function ExtractTextureInformations(material) {
|
|
|
722
738
|
aoMapIntensity: 0,
|
|
723
739
|
alphaMap: null,
|
|
724
740
|
ior: 1,
|
|
741
|
+
clearCoat: 0,
|
|
742
|
+
clearCoatMap: null,
|
|
743
|
+
clearCoatRoughness: 0,
|
|
744
|
+
clearCoatRoughnessMap: null,
|
|
725
745
|
};
|
|
726
746
|
}
|
|
727
747
|
}
|
|
@@ -730,7 +750,7 @@ function BuildMaterial(material, textureToExports, options) {
|
|
|
730
750
|
var pad = " ";
|
|
731
751
|
var inputs = [];
|
|
732
752
|
var samplers = [];
|
|
733
|
-
var _a = ExtractTextureInformations(material), diffuseMap = _a.diffuseMap, diffuse = _a.diffuse, alphaCutOff = _a.alphaCutOff, emissiveMap = _a.emissiveMap, emissive = _a.emissive, normalMap = _a.normalMap, roughnessMap = _a.roughnessMap, roughnessChannel = _a.roughnessChannel, roughness = _a.roughness, metalnessMap = _a.metalnessMap, metalnessChannel = _a.metalnessChannel, metalness = _a.metalness, aoMap = _a.aoMap, aoMapChannel = _a.aoMapChannel, aoMapIntensity = _a.aoMapIntensity, alphaMap = _a.alphaMap, ior = _a.ior;
|
|
753
|
+
var _a = ExtractTextureInformations(material), diffuseMap = _a.diffuseMap, diffuse = _a.diffuse, alphaCutOff = _a.alphaCutOff, emissiveMap = _a.emissiveMap, emissive = _a.emissive, normalMap = _a.normalMap, roughnessMap = _a.roughnessMap, roughnessChannel = _a.roughnessChannel, roughness = _a.roughness, metalnessMap = _a.metalnessMap, metalnessChannel = _a.metalnessChannel, metalness = _a.metalness, aoMap = _a.aoMap, aoMapChannel = _a.aoMapChannel, aoMapIntensity = _a.aoMapIntensity, alphaMap = _a.alphaMap, ior = _a.ior, clearCoat = _a.clearCoat, clearCoatMap = _a.clearCoatMap, clearCoatRoughness = _a.clearCoatRoughness, clearCoatRoughnessMap = _a.clearCoatRoughnessMap;
|
|
734
754
|
if (diffuseMap !== null) {
|
|
735
755
|
inputs.push("".concat(pad, "color3f inputs:diffuseColor.connect = </Materials/Material_").concat(material.uniqueId, "/Texture_").concat(diffuseMap.uniqueId, "_diffuse.outputs:rgb>"));
|
|
736
756
|
if (material.needAlphaBlending()) {
|
|
@@ -782,6 +802,20 @@ function BuildMaterial(material, textureToExports, options) {
|
|
|
782
802
|
else {
|
|
783
803
|
inputs.push("".concat(pad, "float inputs:opacity = ").concat(material.alpha));
|
|
784
804
|
}
|
|
805
|
+
if (clearCoatMap !== null) {
|
|
806
|
+
inputs.push("".concat(pad, "float inputs:clearcoat.connect = </Materials/Material_").concat(material.uniqueId, "/Texture_").concat(clearCoatMap.uniqueId, "_clearcoat.outputs:r>"));
|
|
807
|
+
samplers.push(BuildTexture(clearCoatMap, material, "clearcoat", new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Color3(clearCoat, clearCoat, clearCoat), textureToExports, options));
|
|
808
|
+
}
|
|
809
|
+
else {
|
|
810
|
+
inputs.push("".concat(pad, "float inputs:clearcoat = ").concat(clearCoat));
|
|
811
|
+
}
|
|
812
|
+
if (clearCoatRoughnessMap !== null) {
|
|
813
|
+
inputs.push("".concat(pad, "float inputs:clearcoatRoughness.connect = </Materials/Material_").concat(material.uniqueId, "/Texture_").concat(clearCoatRoughnessMap.uniqueId, "_clearcoatRoughness.outputs:g>"));
|
|
814
|
+
samplers.push(BuildTexture(clearCoatRoughnessMap, material, "clearcoatRoughness", new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Color3(clearCoatRoughness, clearCoatRoughness, clearCoatRoughness), textureToExports, options));
|
|
815
|
+
}
|
|
816
|
+
else {
|
|
817
|
+
inputs.push("".concat(pad, "float inputs:clearcoatRoughness = ").concat(clearCoatRoughness));
|
|
818
|
+
}
|
|
785
819
|
inputs.push("".concat(pad, "float inputs:ior = ").concat(ior));
|
|
786
820
|
return "\n\tdef Material \"Material_".concat(material.uniqueId, "\"\n\t{\n\t\tdef Shader \"PreviewSurface\"\n\t\t{\n\t\t\tuniform token info:id = \"UsdPreviewSurface\"\n").concat(inputs.join("\n"), "\n\t\t\tint inputs:useSpecularWorkflow = 0\n\t\t\ttoken outputs:surface\n\t\t}\n\n\t\ttoken outputs:surface.connect = </Materials/Material_").concat(material.uniqueId, "/PreviewSurface.outputs:surface>\n\n").concat(samplers.join("\n"), "\n\n\t}\n");
|
|
787
821
|
}
|
|
@@ -1060,4 +1094,4 @@ __webpack_exports__ = __webpack_exports__["default"];
|
|
|
1060
1094
|
/******/ })()
|
|
1061
1095
|
;
|
|
1062
1096
|
});
|
|
1063
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi51c2R6U2VyaWFsaXplci5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2haQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDREE7QUFDQTtBQUVBO0FBT0E7QUFDQTtBQUdBO0FBQ0E7QUFrREE7QUFDQTtBQVNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQWVBO0FBRUE7QUFDQTtBQUlBO0FBRUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQWFBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBWUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQU9BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBUUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQWtDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBb0JBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFpQkE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFZQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBYUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFTQTtBQUNBOzs7Ozs7QUFDQTtBQWFBO0FBQ0E7O0FBQUE7OztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTs7Ozs7Ozs7Ozs7QUFDQTtBQUVBO0FBQ0E7O0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7QUFBQTtBQUVBOzs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3h0QkE7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQ2RBOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TRVJJQUxJWkVSUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvLi4vLi4vLi4vZGV2L3NlcmlhbGl6ZXJzL3NyYy9VU0RaL2luZGV4LnRzIiwid2VicGFjazovL1NFUklBTElaRVJTLy4uLy4uLy4uL2Rldi9zZXJpYWxpemVycy9zcmMvVVNEWi91c2R6RXhwb3J0ZXIudHMiLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvLi4vLi4vLi4vbHRzL3NlcmlhbGl6ZXJzL3NyYy9sZWdhY3kvbGVnYWN5LXVzZHpTZXJpYWxpemVyLnRzIiwid2VicGFjazovL1NFUklBTElaRVJTL2V4dGVybmFsIHVtZCB7XCJyb290XCI6XCJCQUJZTE9OXCIsXCJjb21tb25qc1wiOlwiYmFieWxvbmpzXCIsXCJjb21tb25qczJcIjpcImJhYnlsb25qc1wiLFwiYW1kXCI6XCJiYWJ5bG9uanNcIn0iLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1NFUklBTElaRVJTL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9TRVJJQUxJWkVSUy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL1NFUklBTElaRVJTLy4vc3JjL1VTRFoudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiYmFieWxvbmpzLXNlcmlhbGl6ZXJzXCIsIFtcImJhYnlsb25qc1wiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJiYWJ5bG9uanMtc2VyaWFsaXplcnNcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlNFUklBTElaRVJTXCJdID0gZmFjdG9yeShyb290W1wiQkFCWUxPTlwiXSk7XG59KSgodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHRoaXMpLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9iYWJ5bG9uanNfTWlzY19maWxlVG9vbHNfXykgPT4ge1xucmV0dXJuICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cbiAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcbiAgdmFyIGksIHA7XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gIHJldHVybiBjb29rZWQ7XG59O1xuXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59O1xuXG52YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcbiAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gICAgdmFyIGFyID0gW107XG4gICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICByZXR1cm4gYXI7XG4gIH07XG4gIHJldHVybiBvd25LZXlzKG8pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XG4gICAgaWYgKGFzeW5jKSB7XG4gICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xuICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gIH1cbiAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xuICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgfVxuICB2YXIgciwgcyA9IDA7XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xuICAgICAgICBpZiAoci5kaXNwb3NlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xuICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBzIHw9IDE7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XG4gICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19lc0RlY29yYXRlLFxuICBfX3J1bkluaXRpYWxpemVycyxcbiAgX19wcm9wS2V5LFxuICBfX3NldEZ1bmN0aW9uTmFtZSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG4gIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxufTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmV4cG9ydCAqIGZyb20gXCIuL3VzZHpFeHBvcnRlclwiO1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cclxuaW1wb3J0IHsgVmVydGV4QnVmZmVyIH0gZnJvbSBcImNvcmUvQnVmZmVycy9idWZmZXJcIjtcclxuaW1wb3J0IHR5cGUgeyBDYW1lcmEgfSBmcm9tIFwiY29yZS9DYW1lcmFzL2NhbWVyYVwiO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiY29yZS9FbmdpbmVzL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IE1hdGVyaWFsIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL21hdGVyaWFsXCI7XHJcbmltcG9ydCB0eXBlIHsgUEJSTWF0ZXJpYWwgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvUEJSL3Bick1hdGVyaWFsXCI7XHJcbmltcG9ydCB0eXBlIHsgUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9QQlIvcGJyTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbFwiO1xyXG5pbXBvcnQgdHlwZSB7IFN0YW5kYXJkTWF0ZXJpYWwgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvc3RhbmRhcmRNYXRlcmlhbFwiO1xyXG5pbXBvcnQgdHlwZSB7IEJhc2VUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2Jhc2VUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHsgTWF0cml4LCBWZWN0b3IyIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC52ZWN0b3JcIjtcclxuaW1wb3J0IHR5cGUgeyBHZW9tZXRyeSB9IGZyb20gXCJjb3JlL01lc2hlcy9nZW9tZXRyeVwiO1xyXG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvbWVzaFwiO1xyXG5pbXBvcnQgeyBEdW1wVG9vbHMgfSBmcm9tIFwiY29yZS9NaXNjL2R1bXBUb29sc1wiO1xyXG5pbXBvcnQgeyBUb29scyB9IGZyb20gXCJjb3JlL01pc2MvdG9vbHNcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB0eXBlIHsgRmxvYXRBcnJheSwgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5cclxuLyoqXHJcbiAqIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvYmxvYi9tYXN0ZXIvZXhhbXBsZXMvanNtL2V4cG9ydGVycy9VU0RaRXhwb3J0ZXIuanNcclxuICogVGhhbmtzIGEgbG90IHRvIHRoZSB0aHJlZS5qcyB0ZWFtIGZvciB0aGVpciBhbWF6aW5nIHdvcmshXHJcbiAqL1xyXG5cclxuLy8gRkZsYXRlIGFjY2Vzc1xyXG5kZWNsYXJlIGNvbnN0IGZmbGF0ZTogYW55O1xyXG5cclxuLyoqXHJcbiAqIE9wdGlvbnMgZm9yIHRoZSBVU0RaIGV4cG9ydFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJVVNEWkV4cG9ydE9wdGlvbnMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBVUkwgdG8gbG9hZCB0aGUgZmZsYXRlIGxpYnJhcnkgZnJvbVxyXG4gICAgICovXHJcbiAgICBmZmxhdGVVcmw/OiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIEluY2x1ZGUgYW5jaG9yaW5nIHByb3BlcnRpZXMgaW4gdGhlIFVTRFogZmlsZVxyXG4gICAgICovXHJcbiAgICBpbmNsdWRlQW5jaG9yaW5nUHJvcGVydGllcz86IGJvb2xlYW47XHJcbiAgICAvKipcclxuICAgICAqIEFuY2hvcmluZyB0eXBlIChwbGFuZSBieSBkZWZhdWx0KVxyXG4gICAgICovXHJcbiAgICBhbmNob3JpbmdUeXBlPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBQbGFuZSBhbmNob3JpbmcgYWxpZ25tZW50IChob3Jpem9udGFsIGJ5IGRlZmF1bHQpXHJcbiAgICAgKi9cclxuICAgIHBsYW5lQW5jaG9yaW5nQWxpZ25tZW50Pzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNb2RlbCBmaWxlIG5hbWUgKG1vZGVsLnVzZGEgYnkgZGVmYXVsdClcclxuICAgICAqL1xyXG4gICAgbW9kZWxGaWxlTmFtZT86IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogUHJlY2lzaW9uIHRvIHVzZSBmb3IgbnVtYmVyICg1IGJ5IGRlZmF1bHQpXHJcbiAgICAgKi9cclxuICAgIHByZWNpc2lvbj86IG51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICogRXhwb3J0IHRoZSBjYW1lcmEgKGZhbHNlIGJ5IGRlZmF1bHQpXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydENhbWVyYT86IGJvb2xlYW47XHJcbiAgICAvKipcclxuICAgICAqIENhbWVyYSBzZW5zb3Igd2lkdGggKDM1IGJ5IGRlZmF1bHQpXHJcbiAgICAgKi9cclxuICAgIGNhbWVyYVNlbnNvcldpZHRoPzogbnVtYmVyO1xyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZEhlYWRlcigpIHtcclxuICAgIHJldHVybiBgI3VzZGEgMS4wXHJcbiAgICAoXHJcbiAgICAgICAgY3VzdG9tTGF5ZXJEYXRhID0ge1xyXG4gICAgICAgICAgICBzdHJpbmcgY3JlYXRvciA9IFwiQmFieWxvbi5qcyBVU0RaRXhwb3J0QXN5bmNcIlxyXG4gICAgICAgIH1cclxuICAgICAgICBkZWZhdWx0UHJpbSA9IFwiUm9vdFwiXHJcbiAgICAgICAgbWV0ZXJzUGVyVW5pdCA9IDFcclxuICAgICAgICB1cEF4aXMgPSBcIllcIlxyXG4gICAgKWA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkU2NlbmVTdGFydChvcHRpb25zOiBJVVNEWkV4cG9ydE9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGFsaWdubWVudCA9XHJcbiAgICAgICAgb3B0aW9ucy5pbmNsdWRlQW5jaG9yaW5nUHJvcGVydGllcyA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICA/IGBcclxuXHRcdHRva2VuIHByZWxpbWluYXJ5OmFuY2hvcmluZzp0eXBlID0gXCIke29wdGlvbnMuYW5jaG9yaW5nVHlwZX1cIlxyXG5cdFx0dG9rZW4gcHJlbGltaW5hcnk6cGxhbmVBbmNob3Jpbmc6YWxpZ25tZW50ID0gXCIke29wdGlvbnMucGxhbmVBbmNob3JpbmdBbGlnbm1lbnR9XCJgXHJcbiAgICAgICAgICAgIDogXCJcIjtcclxuICAgIHJldHVybiBgZGVmIFhmb3JtIFwiUm9vdFwiXHJcbiAgICB7XHJcbiAgICAgICAgZGVmIFNjb3BlIFwiU2NlbmVzXCIgKFxyXG4gICAgICAgICAgICBraW5kID0gXCJzY2VuZUxpYnJhcnlcIlxyXG4gICAgICAgIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlZiBYZm9ybSBcIlNjZW5lXCIgKFxyXG4gICAgICAgICAgICAgICAgY3VzdG9tRGF0YSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBib29sIHByZWxpbWluYXJ5X2NvbGxpZGVzV2l0aEVudmlyb25tZW50ID0gMFxyXG4gICAgICAgICAgICAgICAgICAgIHN0cmluZyBzY2VuZU5hbWUgPSBcIlNjZW5lXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNjZW5lTmFtZSA9IFwiU2NlbmVcIlxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHske2FsaWdubWVudH1cclxuICAgICAgICAgICAgYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRTY2VuZUVuZCgpIHtcclxuICAgIHJldHVybiBgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9YDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRNZXNoVmVydGV4Q291bnQoZ2VvbWV0cnk6IEdlb21ldHJ5KSB7XHJcbiAgICBjb25zdCBjb3VudCA9IGdlb21ldHJ5LmdldEluZGljZXMoKT8ubGVuZ3RoID8gZ2VvbWV0cnkuZ2V0VG90YWxJbmRpY2VzKCkgOiBnZW9tZXRyeS5nZXRUb3RhbFZlcnRpY2VzKCk7XHJcblxyXG4gICAgcmV0dXJuIEFycmF5KGNvdW50IC8gMylcclxuICAgICAgICAuZmlsbCgzKVxyXG4gICAgICAgIC5qb2luKFwiLCBcIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkTWVzaFZlcnRleEluZGljZXMoZ2VvbWV0cnk6IEdlb21ldHJ5KSB7XHJcbiAgICBjb25zdCBpbmRleCA9IGdlb21ldHJ5LmdldEluZGljZXMoKTtcclxuICAgIGNvbnN0IGFycmF5ID0gW107XHJcblxyXG4gICAgaWYgKGluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKGluZGV4W2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGdlb21ldHJ5LmdldFRvdGFsVmVydGljZXMoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKGkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXJyYXkuam9pbihcIiwgXCIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZFZlY3RvcjNBcnJheShhdHRyaWJ1dGU6IEZsb2F0QXJyYXksIG9wdGlvbnM6IElVU0RaRXhwb3J0T3B0aW9ucywgc3RyaWRlID0gMykge1xyXG4gICAgY29uc3QgYXJyYXkgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZS5sZW5ndGggLyBzdHJpZGU7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHggPSBhdHRyaWJ1dGVbaSAqIHN0cmlkZV07XHJcbiAgICAgICAgY29uc3QgeSA9IGF0dHJpYnV0ZVtpICogc3RyaWRlICsgMV07XHJcbiAgICAgICAgY29uc3QgeiA9IGF0dHJpYnV0ZVtpICogc3RyaWRlICsgMl07XHJcblxyXG4gICAgICAgIGFycmF5LnB1c2goYCgke3gudG9QcmVjaXNpb24ob3B0aW9ucy5wcmVjaXNpb24pfSwgJHt5LnRvUHJlY2lzaW9uKG9wdGlvbnMucHJlY2lzaW9uKX0sICR7ei50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9KWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcnJheS5qb2luKFwiLCBcIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkVmVjdG9yMkFycmF5KGF0dHJpYnV0ZTogRmxvYXRBcnJheSwgb3B0aW9uczogSVVTRFpFeHBvcnRPcHRpb25zKSB7XHJcbiAgICBjb25zdCBhcnJheSA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlLmxlbmd0aCAvIDI7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHggPSBhdHRyaWJ1dGVbaSAqIDJdO1xyXG4gICAgICAgIGNvbnN0IHkgPSBhdHRyaWJ1dGVbaSAqIDIgKyAxXTtcclxuXHJcbiAgICAgICAgYXJyYXkucHVzaChgKCR7eC50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9LCAkeygxIC0geSkudG9QcmVjaXNpb24ob3B0aW9ucy5wcmVjaXNpb24pfSlgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXJyYXkuam9pbihcIiwgXCIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZEFkZGl0aW9uYWxBdHRyaWJ1dGVzKGdlb21ldHJ5OiBHZW9tZXRyeSwgb3B0aW9uczogSVVTRFpFeHBvcnRPcHRpb25zKSB7XHJcbiAgICBsZXQgc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGlkID0gaSA+IDAgPyBpIDogXCJcIjtcclxuICAgICAgICBjb25zdCB1dkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldFZlcnRpY2VzRGF0YShWZXJ0ZXhCdWZmZXIuVVZLaW5kICsgKGlkID8gaWQgOiBcIlwiKSk7XHJcblxyXG4gICAgICAgIGlmICh1dkF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYFxyXG5cdFx0dGV4Q29vcmQyZltdIHByaW12YXJzOnN0JHtpZH0gPSBbJHtCdWlsZFZlY3RvcjJBcnJheSh1dkF0dHJpYnV0ZSwgb3B0aW9ucyl9XSAoXHJcblx0XHRcdGludGVycG9sYXRpb24gPSBcInZlcnRleFwiXHJcblx0XHQpYDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdmVydGV4IGNvbG9yc1xyXG5cclxuICAgIGNvbnN0IGNvbG9yQXR0cmlidXRlID0gZ2VvbWV0cnkuZ2V0VmVydGljZXNEYXRhKFZlcnRleEJ1ZmZlci5Db2xvcktpbmQpO1xyXG5cclxuICAgIGlmIChjb2xvckF0dHJpYnV0ZSkge1xyXG4gICAgICAgIHN0cmluZyArPSBgXHJcblx0Y29sb3IzZltdIHByaW12YXJzOmRpc3BsYXlDb2xvciA9IFske0J1aWxkVmVjdG9yM0FycmF5KGNvbG9yQXR0cmlidXRlLCBvcHRpb25zLCBjb2xvckF0dHJpYnV0ZS5sZW5ndGggLyBnZW9tZXRyeS5nZXRUb3RhbFZlcnRpY2VzKCkpfV0gKFxyXG5cdFx0aW50ZXJwb2xhdGlvbiA9IFwidmVydGV4XCJcclxuXHRcdClgO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdHJpbmc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkTWVzaChnZW9tZXRyeTogR2VvbWV0cnksIG9wdGlvbnM6IElVU0RaRXhwb3J0T3B0aW9ucykge1xyXG4gICAgY29uc3QgbmFtZSA9IFwiR2VvbWV0cnlcIjtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0VmVydGljZXNEYXRhKFZlcnRleEJ1ZmZlci5Qb3NpdGlvbktpbmQpO1xyXG4gICAgY29uc3Qgbm9ybWFsID0gZ2VvbWV0cnkuZ2V0VmVydGljZXNEYXRhKFZlcnRleEJ1ZmZlci5Qb3NpdGlvbktpbmQpO1xyXG5cclxuICAgIGlmICghcG9zaXRpb24gfHwgIW5vcm1hbCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYFxyXG5cdGRlZiBNZXNoIFwiJHtuYW1lfVwiXHJcblx0e1xyXG5cdFx0aW50W10gZmFjZVZlcnRleENvdW50cyA9IFske0J1aWxkTWVzaFZlcnRleENvdW50KGdlb21ldHJ5KX1dXHJcblx0XHRpbnRbXSBmYWNlVmVydGV4SW5kaWNlcyA9IFske0J1aWxkTWVzaFZlcnRleEluZGljZXMoZ2VvbWV0cnkpfV1cclxuXHRcdG5vcm1hbDNmW10gbm9ybWFscyA9IFske0J1aWxkVmVjdG9yM0FycmF5KG5vcm1hbCwgb3B0aW9ucyl9XSAoXHJcblx0XHRcdGludGVycG9sYXRpb24gPSBcInZlcnRleFwiXHJcblx0XHQpXHJcblx0XHRwb2ludDNmW10gcG9pbnRzID0gWyR7QnVpbGRWZWN0b3IzQXJyYXkocG9zaXRpb24sIG9wdGlvbnMpfV1cclxuICAgICAgICAke0J1aWxkQWRkaXRpb25hbEF0dHJpYnV0ZXMoZ2VvbWV0cnksIG9wdGlvbnMpfVxyXG5cdFx0dW5pZm9ybSB0b2tlbiBzdWJkaXZpc2lvblNjaGVtZSA9IFwibm9uZVwiXHJcblx0fVxyXG5gO1xyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZE1lc2hPYmplY3QoZ2VvbWV0cnk6IEdlb21ldHJ5LCBvcHRpb25zOiBJVVNEWkV4cG9ydE9wdGlvbnMpIHtcclxuICAgIGNvbnN0IG1lc2ggPSBCdWlsZE1lc2goZ2VvbWV0cnksIG9wdGlvbnMpO1xyXG4gICAgcmV0dXJuIGBcclxuICAgICAgICBkZWYgXCJHZW9tZXRyeVwiXHJcbiAgICAgICAge1xyXG4gICAgICAgICR7bWVzaH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRVU0RGaWxlQXNTdHJpbmcoZGF0YVRvSW5zZXJ0OiBzdHJpbmcpIHtcclxuICAgIGxldCBvdXRwdXQgPSBCdWlsZEhlYWRlcigpO1xyXG4gICAgb3V0cHV0ICs9IGRhdGFUb0luc2VydDtcclxuICAgIHJldHVybiBmZmxhdGUuc3RyVG9VOChvdXRwdXQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZE1hdHJpeChtYXRyaXg6IE1hdHJpeCkge1xyXG4gICAgY29uc3QgYXJyYXkgPSBtYXRyaXgubSBhcyBudW1iZXJbXTtcclxuXHJcbiAgICByZXR1cm4gYCggJHtCdWlsZE1hdHJpeFJvdyhhcnJheSwgMCl9LCAke0J1aWxkTWF0cml4Um93KGFycmF5LCA0KX0sICR7QnVpbGRNYXRyaXhSb3coYXJyYXksIDgpfSwgJHtCdWlsZE1hdHJpeFJvdyhhcnJheSwgMTIpfSApYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRNYXRyaXhSb3coYXJyYXk6IG51bWJlcltdLCBvZmZzZXQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIGAoJHthcnJheVtvZmZzZXQgKyAwXX0sICR7YXJyYXlbb2Zmc2V0ICsgMV19LCAke2FycmF5W29mZnNldCArIDJdfSwgJHthcnJheVtvZmZzZXQgKyAzXX0pYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRYZm9ybShtZXNoOiBNZXNoKSB7XHJcbiAgICBjb25zdCBuYW1lID0gXCJPYmplY3RfXCIgKyBtZXNoLnVuaXF1ZUlkO1xyXG4gICAgY29uc3QgbWF0cml4ID0gbWVzaC5nZXRXb3JsZE1hdHJpeCgpLmNsb25lKCk7XHJcblxyXG4gICAgaWYgKG1hdHJpeC5kZXRlcm1pbmFudCgpIDwgMCkge1xyXG4gICAgICAgIG1hdHJpeC5tdWx0aXBseVRvUmVmKE1hdHJpeC5TY2FsaW5nKC0xLCAxLCAxKSwgbWF0cml4KTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRyYW5zZm9ybSA9IEJ1aWxkTWF0cml4KG1hdHJpeCk7XHJcblxyXG4gICAgcmV0dXJuIGBkZWYgWGZvcm0gXCIke25hbWV9XCIgKFxyXG5cdHByZXBlbmQgcmVmZXJlbmNlcyA9IEAuL2dlb21ldHJpZXMvR2VvbWV0cnlfJHttZXNoLmdlb21ldHJ5IS51bmlxdWVJZH0udXNkYUA8L0dlb21ldHJ5PlxyXG5cdHByZXBlbmQgYXBpU2NoZW1hcyA9IFtcIk1hdGVyaWFsQmluZGluZ0FQSVwiXVxyXG4pXHJcbntcclxuXHRtYXRyaXg0ZCB4Zm9ybU9wOnRyYW5zZm9ybSA9ICR7dHJhbnNmb3JtfVxyXG5cdHVuaWZvcm0gdG9rZW5bXSB4Zm9ybU9wT3JkZXIgPSBbXCJ4Zm9ybU9wOnRyYW5zZm9ybVwiXVx0XHJcblxyXG4gICAgcmVsIG1hdGVyaWFsOmJpbmRpbmcgPSA8L01hdGVyaWFscy9NYXRlcmlhbF8ke21lc2gubWF0ZXJpYWwhLnVuaXF1ZUlkfT5cclxufVxyXG5cclxuYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRNYXRlcmlhbHMobWF0ZXJpYWxzOiB7IFtrZXk6IHN0cmluZ106IE1hdGVyaWFsIH0sIHRleHR1cmVUb0V4cG9ydHM6IHsgW2tleTogc3RyaW5nXTogQmFzZVRleHR1cmUgfSwgb3B0aW9uczogSVVTRFpFeHBvcnRPcHRpb25zKSB7XHJcbiAgICBjb25zdCBhcnJheSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgdXVpZCBpbiBtYXRlcmlhbHMpIHtcclxuICAgICAgICBjb25zdCBtYXRlcmlhbCA9IG1hdGVyaWFsc1t1dWlkXTtcclxuXHJcbiAgICAgICAgYXJyYXkucHVzaChCdWlsZE1hdGVyaWFsKG1hdGVyaWFsLCB0ZXh0dXJlVG9FeHBvcnRzLCBvcHRpb25zKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGBcclxuICAgIGRlZiBcIk1hdGVyaWFsc1wiXHJcbntcclxuJHthcnJheS5qb2luKFwiXCIpfVxyXG59XHJcblxyXG5gO1xyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZFdyYXBwaW5nKHdyYXBwaW5nOiBudW1iZXIpIHtcclxuICAgIHN3aXRjaCAod3JhcHBpbmcpIHtcclxuICAgICAgICBjYXNlIENvbnN0YW50cy5URVhUVVJFX0NMQU1QX0FERFJFU1NNT0RFOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJjbGFtcFwiO1xyXG4gICAgICAgIGNhc2UgQ29uc3RhbnRzLlRFWFRVUkVfTUlSUk9SX0FERFJFU1NNT0RFOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJtaXJyb3JcIjtcclxuICAgICAgICBjYXNlIENvbnN0YW50cy5URVhUVVJFX1dSQVBfQUREUkVTU01PREU6XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIFwicmVwZWF0XCI7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkQ29sb3I0KGNvbG9yOiBDb2xvcjMpIHtcclxuICAgIHJldHVybiBgKCR7Y29sb3Iucn0sICR7Y29sb3IuZ30sICR7Y29sb3IuYn0sIDEuMClgO1xyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZFZlY3RvcjIodmVjdG9yOiBWZWN0b3IyKSB7XHJcbiAgICByZXR1cm4gYCgke3ZlY3Rvci54fSwgJHt2ZWN0b3IueX0pYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRDb2xvcihjb2xvcjogQ29sb3IzKSB7XHJcbiAgICByZXR1cm4gYCgke2NvbG9yLnJ9LCAke2NvbG9yLmd9LCAke2NvbG9yLmJ9KWA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkVGV4dHVyZShcclxuICAgIHRleHR1cmU6IFRleHR1cmUsXHJcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWwsXHJcbiAgICBtYXBUeXBlOiBzdHJpbmcsXHJcbiAgICBjb2xvcjogTnVsbGFibGU8Q29sb3IzPixcclxuICAgIHRleHR1cmVUb0V4cG9ydHM6IHsgW2tleTogc3RyaW5nXTogQmFzZVRleHR1cmUgfSxcclxuICAgIG9wdGlvbnM6IElVU0RaRXhwb3J0T3B0aW9uc1xyXG4pIHtcclxuICAgIGNvbnN0IGlkID0gdGV4dHVyZS5nZXRJbnRlcm5hbFRleHR1cmUoKSEudW5pcXVlSWQgKyBcIl9cIiArIHRleHR1cmUuaW52ZXJ0WTtcclxuXHJcbiAgICB0ZXh0dXJlVG9FeHBvcnRzW2lkXSA9IHRleHR1cmU7XHJcblxyXG4gICAgY29uc3QgdXYgPSB0ZXh0dXJlLmNvb3JkaW5hdGVzSW5kZXggPiAwID8gXCJzdFwiICsgdGV4dHVyZS5jb29yZGluYXRlc0luZGV4IDogXCJzdFwiO1xyXG4gICAgY29uc3QgcmVwZWF0ID0gbmV3IFZlY3RvcjIodGV4dHVyZS51U2NhbGUsIHRleHR1cmUudlNjYWxlKTtcclxuICAgIGNvbnN0IG9mZnNldCA9IG5ldyBWZWN0b3IyKHRleHR1cmUudU9mZnNldCwgdGV4dHVyZS52T2Zmc2V0KTtcclxuICAgIGNvbnN0IHJvdGF0aW9uID0gdGV4dHVyZS53QW5nO1xyXG5cclxuICAgIC8vIHJvdGF0aW9uIGlzIGFyb3VuZCB0aGUgd3JvbmcgcG9pbnQuIGFmdGVyIHJvdGF0aW9uIHdlIG5lZWQgdG8gc2hpZnQgb2Zmc2V0IGFnYWluIHNvIHRoYXQgd2UncmUgcm90YXRpbmcgYXJvdW5kIHRoZSByaWdodCBzcG90XHJcbiAgICBjb25zdCB4Um90YXRpb25PZmZzZXQgPSBNYXRoLnNpbihyb3RhdGlvbik7XHJcbiAgICBjb25zdCB5Um90YXRpb25PZmZzZXQgPSBNYXRoLmNvcyhyb3RhdGlvbik7XHJcblxyXG4gICAgLy8gdGV4dHVyZSBjb29yZGluYXRlcyBzdGFydCBpbiB0aGUgb3Bwb3NpdGUgY29ybmVyLCBuZWVkIHRvIGNvcnJlY3RcclxuICAgIG9mZnNldC55ID0gMSAtIG9mZnNldC55IC0gcmVwZWF0Lnk7XHJcblxyXG4gICAgb2Zmc2V0LnggKz0geFJvdGF0aW9uT2Zmc2V0ICogcmVwZWF0Lng7XHJcbiAgICBvZmZzZXQueSArPSAoMSAtIHlSb3RhdGlvbk9mZnNldCkgKiByZXBlYXQueTtcclxuXHJcbiAgICByZXR1cm4gYFxyXG4gICAgZGVmIFNoYWRlciBcIlByaW12YXJSZWFkZXJfJHttYXBUeXBlfVwiXHJcbiAgICB7XHJcbiAgICAgICAgdW5pZm9ybSB0b2tlbiBpbmZvOmlkID0gXCJVc2RQcmltdmFyUmVhZGVyX2Zsb2F0MlwiXHJcbiAgICAgICAgZmxvYXQyIGlucHV0czpmYWxsYmFjayA9ICgwLjAsIDAuMClcclxuICAgICAgICB0b2tlbiBpbnB1dHM6dmFybmFtZSA9IFwiJHt1dn1cIlxyXG4gICAgICAgIGZsb2F0MiBvdXRwdXRzOnJlc3VsdFxyXG4gICAgfVxyXG5cclxuICAgIGRlZiBTaGFkZXIgXCJUcmFuc2Zvcm0yZF8ke21hcFR5cGV9XCJcclxuICAgIHtcclxuICAgICAgICB1bmlmb3JtIHRva2VuIGluZm86aWQgPSBcIlVzZFRyYW5zZm9ybTJkXCJcclxuICAgICAgICB0b2tlbiBpbnB1dHM6aW4uY29ubmVjdCA9IDwvTWF0ZXJpYWxzL01hdGVyaWFsXyR7bWF0ZXJpYWwudW5pcXVlSWR9L1ByaW12YXJSZWFkZXJfJHttYXBUeXBlfS5vdXRwdXRzOnJlc3VsdD5cclxuICAgICAgICBmbG9hdCBpbnB1dHM6cm90YXRpb24gPSAkeyhyb3RhdGlvbiAqICgxODAgLyBNYXRoLlBJKSkudG9GaXhlZChvcHRpb25zLnByZWNpc2lvbil9XHJcbiAgICAgICAgZmxvYXQyIGlucHV0czpzY2FsZSA9ICR7QnVpbGRWZWN0b3IyKHJlcGVhdCl9XHJcbiAgICAgICAgZmxvYXQyIGlucHV0czp0cmFuc2xhdGlvbiA9ICR7QnVpbGRWZWN0b3IyKG9mZnNldCl9XHJcbiAgICAgICAgZmxvYXQyIG91dHB1dHM6cmVzdWx0XHJcbiAgICB9XHJcblxyXG4gICAgZGVmIFNoYWRlciBcIlRleHR1cmVfJHt0ZXh0dXJlLnVuaXF1ZUlkfV8ke21hcFR5cGV9XCJcclxuICAgIHtcclxuICAgICAgICB1bmlmb3JtIHRva2VuIGluZm86aWQgPSBcIlVzZFVWVGV4dHVyZVwiXHJcbiAgICAgICAgYXNzZXQgaW5wdXRzOmZpbGUgPSBAdGV4dHVyZXMvVGV4dHVyZV8ke2lkfS5wbmdAXHJcbiAgICAgICAgZmxvYXQyIGlucHV0czpzdC5jb25uZWN0ID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH0vVHJhbnNmb3JtMmRfJHttYXBUeXBlfS5vdXRwdXRzOnJlc3VsdD5cclxuICAgICAgICAke2NvbG9yID8gXCJmbG9hdDQgaW5wdXRzOnNjYWxlID0gXCIgKyBCdWlsZENvbG9yNChjb2xvcikgOiBcIlwifVxyXG4gICAgICAgIHRva2VuIGlucHV0czpzb3VyY2VDb2xvclNwYWNlID0gXCIke3RleHR1cmUuZ2FtbWFTcGFjZSA/IFwicmF3XCIgOiBcInNSR0JcIn1cIlxyXG4gICAgICAgIHRva2VuIGlucHV0czp3cmFwUyA9IFwiJHtCdWlsZFdyYXBwaW5nKHRleHR1cmUud3JhcFUpfVwiXHJcbiAgICAgICAgdG9rZW4gaW5wdXRzOndyYXBUID0gXCIke0J1aWxkV3JhcHBpbmcodGV4dHVyZS53cmFwVil9XCJcclxuICAgICAgICBmbG9hdCBvdXRwdXRzOnJcclxuICAgICAgICBmbG9hdCBvdXRwdXRzOmdcclxuICAgICAgICBmbG9hdCBvdXRwdXRzOmJcclxuICAgICAgICBmbG9hdDMgb3V0cHV0czpyZ2JcclxuICAgICAgICAke21hdGVyaWFsLm5lZWRBbHBoYUJsZW5kaW5nKCkgPyBcImZsb2F0IG91dHB1dHM6YVwiIDogXCJcIn1cclxuICAgIH1gO1xyXG59XHJcblxyXG5mdW5jdGlvbiBFeHRyYWN0VGV4dHVyZUluZm9ybWF0aW9ucyhtYXRlcmlhbDogTWF0ZXJpYWwpIHtcclxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IG1hdGVyaWFsLmdldENsYXNzTmFtZSgpO1xyXG5cclxuICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgY2FzZSBcIlN0YW5kYXJkTWF0ZXJpYWxcIjpcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRpZmZ1c2VNYXA6IChtYXRlcmlhbCBhcyBTdGFuZGFyZE1hdGVyaWFsKS5kaWZmdXNlVGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIGRpZmZ1c2U6IChtYXRlcmlhbCBhcyBTdGFuZGFyZE1hdGVyaWFsKS5kaWZmdXNlQ29sb3IsXHJcbiAgICAgICAgICAgICAgICBhbHBoYUN1dE9mZjogKG1hdGVyaWFsIGFzIFN0YW5kYXJkTWF0ZXJpYWwpLmFscGhhQ3V0T2ZmLFxyXG4gICAgICAgICAgICAgICAgZW1pc3NpdmVNYXA6IChtYXRlcmlhbCBhcyBTdGFuZGFyZE1hdGVyaWFsKS5lbWlzc2l2ZVRleHR1cmUsXHJcbiAgICAgICAgICAgICAgICBlbWlzc2l2ZTogKG1hdGVyaWFsIGFzIFN0YW5kYXJkTWF0ZXJpYWwpLmVtaXNzaXZlQ29sb3IsXHJcbiAgICAgICAgICAgICAgICByb3VnaG5lc3NNYXA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBub3JtYWxNYXA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBtZXRhbG5lc3NNYXA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICByb3VnaG5lc3M6IDEsXHJcbiAgICAgICAgICAgICAgICBtZXRhbG5lc3M6IDAsXHJcbiAgICAgICAgICAgICAgICBhb01hcDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGFvTWFwSW50ZW5zaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgYWxwaGFNYXA6IChtYXRlcmlhbCBhcyBTdGFuZGFyZE1hdGVyaWFsKS5vcGFjaXR5VGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIGlvcjogMSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICBjYXNlIFwiUEJSTWF0ZXJpYWxcIjpcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRpZmZ1c2VNYXA6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkuYWxiZWRvVGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIGRpZmZ1c2U6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkuYWxiZWRvQ29sb3IsXHJcbiAgICAgICAgICAgICAgICBhbHBoYUN1dE9mZjogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5hbHBoYUN1dE9mZixcclxuICAgICAgICAgICAgICAgIGVtaXNzaXZlTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmVtaXNzaXZlVGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIGVtaXNzaXZlOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmVtaXNzaXZlQ29sb3IsXHJcbiAgICAgICAgICAgICAgICBub3JtYWxNYXA6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkuYnVtcFRleHR1cmUsXHJcbiAgICAgICAgICAgICAgICByb3VnaG5lc3NNYXA6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkubWV0YWxsaWNUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzQ2hhbm5lbDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS51c2VSb3VnaG5lc3NGcm9tTWV0YWxsaWNUZXh0dXJlQWxwaGEgPyBcImFcIiA6IFwiZ1wiLFxyXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLnJvdWdobmVzcyB8fCAxLFxyXG4gICAgICAgICAgICAgICAgbWV0YWxuZXNzTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLm1ldGFsbGljVGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIG1ldGFsbmVzc0NoYW5uZWw6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkudXNlTWV0YWxsbmVzc0Zyb21NZXRhbGxpY1RleHR1cmVCbHVlID8gXCJiXCIgOiBcInJcIixcclxuICAgICAgICAgICAgICAgIG1ldGFsbmVzczogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5tZXRhbGxpYyB8fCAwLFxyXG4gICAgICAgICAgICAgICAgYW9NYXA6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkuYW1iaWVudFRleHR1cmUsXHJcbiAgICAgICAgICAgICAgICBhb01hcENoYW5uZWw6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkudXNlQW1iaWVudEluR3JheVNjYWxlID8gXCJyXCIgOiBcInJnYlwiLFxyXG4gICAgICAgICAgICAgICAgYW9NYXBJbnRlbnNpdHk6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkuYW1iaWVudFRleHR1cmVTdHJlbmd0aCxcclxuICAgICAgICAgICAgICAgIGFscGhhTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLm9wYWNpdHlUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgaW9yOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmluZGV4T2ZSZWZyYWN0aW9uLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIGNhc2UgXCJQQlJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsXCI6XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkaWZmdXNlTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbCkuYmFzZVRleHR1cmUsXHJcbiAgICAgICAgICAgICAgICBkaWZmdXNlOiAobWF0ZXJpYWwgYXMgUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbCkuYmFzZUNvbG9yLFxyXG4gICAgICAgICAgICAgICAgYWxwaGFDdXRPZmY6IChtYXRlcmlhbCBhcyBQQlJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsKS5hbHBoYUN1dE9mZixcclxuICAgICAgICAgICAgICAgIGVtaXNzaXZlTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbCkuZW1pc3NpdmVUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgZW1pc3NpdmU6IChtYXRlcmlhbCBhcyBQQlJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsKS5lbWlzc2l2ZUNvbG9yLFxyXG4gICAgICAgICAgICAgICAgbm9ybWFsTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbCkubm9ybWFsVGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIHJvdWdobmVzc01hcDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5tZXRhbGxpY1RleHR1cmUsXHJcbiAgICAgICAgICAgICAgICByb3VnaG5lc3NDaGFubmVsOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLnVzZVJvdWdobmVzc0Zyb21NZXRhbGxpY1RleHR1cmVBbHBoYSA/IFwiYVwiIDogXCJnXCIsXHJcbiAgICAgICAgICAgICAgICByb3VnaG5lc3M6IChtYXRlcmlhbCBhcyBQQlJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsKS5yb3VnaG5lc3MgfHwgMSxcclxuICAgICAgICAgICAgICAgIG1ldGFsbmVzc01hcDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5tZXRhbGxpY1RleHR1cmUsXHJcbiAgICAgICAgICAgICAgICBtZXRhbG5lc3NDaGFubmVsOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLnVzZU1ldGFsbG5lc3NGcm9tTWV0YWxsaWNUZXh0dXJlQmx1ZSA/IFwiYlwiIDogXCJyXCIsXHJcbiAgICAgICAgICAgICAgICBtZXRhbG5lc3M6IChtYXRlcmlhbCBhcyBQQlJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsKS5tZXRhbGxpYyB8fCAwLFxyXG4gICAgICAgICAgICAgICAgYW9NYXA6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkuYW1iaWVudFRleHR1cmUsXHJcbiAgICAgICAgICAgICAgICBhb01hcENoYW5uZWw6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkudXNlQW1iaWVudEluR3JheVNjYWxlID8gXCJyXCIgOiBcInJnYlwiLFxyXG4gICAgICAgICAgICAgICAgYW9NYXBJbnRlbnNpdHk6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkuYW1iaWVudFRleHR1cmVTdHJlbmd0aCxcclxuICAgICAgICAgICAgICAgIGFscGhhTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLm9wYWNpdHlUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgaW9yOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmluZGV4T2ZSZWZyYWN0aW9uLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkaWZmdXNlTWFwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgZGlmZnVzZTogbnVsbCxcclxuICAgICAgICAgICAgICAgIGVtaXNzaXZlTWFwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgZW1pc3NlbWlzc2l2ZWl2ZUNvbG9yOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgbm9ybWFsTWFwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzTWFwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgbWV0YWxuZXNzTWFwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgYWxwaGFDdXRPZmY6IDAsXHJcbiAgICAgICAgICAgICAgICByb3VnaG5lc3M6IDAsXHJcbiAgICAgICAgICAgICAgICBtZXRhbG5lc3M6IDAsXHJcbiAgICAgICAgICAgICAgICBhb01hcDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGFvTWFwSW50ZW5zaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgYWxwaGFNYXA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBpb3I6IDEsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkTWF0ZXJpYWwobWF0ZXJpYWw6IE1hdGVyaWFsLCB0ZXh0dXJlVG9FeHBvcnRzOiB7IFtrZXk6IHN0cmluZ106IEJhc2VUZXh0dXJlIH0sIG9wdGlvbnM6IElVU0RaRXhwb3J0T3B0aW9ucykge1xyXG4gICAgLy8gaHR0cHM6Ly9ncmFwaGljcy5waXhhci5jb20vdXNkL2RvY3MvVXNkUHJldmlld1N1cmZhY2UtUHJvcG9zYWwuaHRtbFxyXG5cclxuICAgIGNvbnN0IHBhZCA9IFwiXHRcdFx0XCI7XHJcbiAgICBjb25zdCBpbnB1dHMgPSBbXTtcclxuICAgIGNvbnN0IHNhbXBsZXJzID0gW107XHJcblxyXG4gICAgY29uc3Qge1xyXG4gICAgICAgIGRpZmZ1c2VNYXAsXHJcbiAgICAgICAgZGlmZnVzZSxcclxuICAgICAgICBhbHBoYUN1dE9mZixcclxuICAgICAgICBlbWlzc2l2ZU1hcCxcclxuICAgICAgICBlbWlzc2l2ZSxcclxuICAgICAgICBub3JtYWxNYXAsXHJcbiAgICAgICAgcm91Z2huZXNzTWFwLFxyXG4gICAgICAgIHJvdWdobmVzc0NoYW5uZWwsXHJcbiAgICAgICAgcm91Z2huZXNzLFxyXG4gICAgICAgIG1ldGFsbmVzc01hcCxcclxuICAgICAgICBtZXRhbG5lc3NDaGFubmVsLFxyXG4gICAgICAgIG1ldGFsbmVzcyxcclxuICAgICAgICBhb01hcCxcclxuICAgICAgICBhb01hcENoYW5uZWwsXHJcbiAgICAgICAgYW9NYXBJbnRlbnNpdHksXHJcbiAgICAgICAgYWxwaGFNYXAsXHJcbiAgICAgICAgaW9yLFxyXG4gICAgfSA9IEV4dHJhY3RUZXh0dXJlSW5mb3JtYXRpb25zKG1hdGVyaWFsKTtcclxuXHJcbiAgICBpZiAoZGlmZnVzZU1hcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlucHV0cy5wdXNoKGAke3BhZH1jb2xvcjNmIGlucHV0czpkaWZmdXNlQ29sb3IuY29ubmVjdCA9IDwvTWF0ZXJpYWxzL01hdGVyaWFsXyR7bWF0ZXJpYWwudW5pcXVlSWR9L1RleHR1cmVfJHtkaWZmdXNlTWFwLnVuaXF1ZUlkfV9kaWZmdXNlLm91dHB1dHM6cmdiPmApO1xyXG5cclxuICAgICAgICBpZiAobWF0ZXJpYWwubmVlZEFscGhhQmxlbmRpbmcoKSkge1xyXG4gICAgICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOm9wYWNpdHkuY29ubmVjdCA9IDwvTWF0ZXJpYWxzL01hdGVyaWFsXyR7bWF0ZXJpYWwudW5pcXVlSWR9L1RleHR1cmVfJHtkaWZmdXNlTWFwLnVuaXF1ZUlkfV9kaWZmdXNlLm91dHB1dHM6YT5gKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG1hdGVyaWFsLm5lZWRBbHBoYVRlc3RpbmcoKSkge1xyXG4gICAgICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOm9wYWNpdHkuY29ubmVjdCA9IDwvTWF0ZXJpYWxzL01hdGVyaWFsXyR7bWF0ZXJpYWwudW5pcXVlSWR9L1RleHR1cmVfJHtkaWZmdXNlTWFwLnVuaXF1ZUlkfV9kaWZmdXNlLm91dHB1dHM6YT5gKTtcclxuICAgICAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWZsb2F0IGlucHV0czpvcGFjaXR5VGhyZXNob2xkID0gJHthbHBoYUN1dE9mZn1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNhbXBsZXJzLnB1c2goQnVpbGRUZXh0dXJlKGRpZmZ1c2VNYXAgYXMgVGV4dHVyZSwgbWF0ZXJpYWwsIFwiZGlmZnVzZVwiLCBkaWZmdXNlLCB0ZXh0dXJlVG9FeHBvcnRzLCBvcHRpb25zKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlucHV0cy5wdXNoKGAke3BhZH1jb2xvcjNmIGlucHV0czpkaWZmdXNlQ29sb3IgPSAke0J1aWxkQ29sb3IoZGlmZnVzZSB8fCBDb2xvcjMuV2hpdGUoKSl9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVtaXNzaXZlTWFwICE9PSBudWxsKSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWNvbG9yM2YgaW5wdXRzOmVtaXNzaXZlQ29sb3IuY29ubmVjdCA9IDwvTWF0ZXJpYWxzL01hdGVyaWFsXyR7bWF0ZXJpYWwudW5pcXVlSWR9L1RleHR1cmVfJHtlbWlzc2l2ZU1hcC51bmlxdWVJZH1fZW1pc3NpdmUub3V0cHV0czpyZ2I+YCk7XHJcblxyXG4gICAgICAgIHNhbXBsZXJzLnB1c2goQnVpbGRUZXh0dXJlKGVtaXNzaXZlTWFwIGFzIFRleHR1cmUsIG1hdGVyaWFsLCBcImVtaXNzaXZlXCIsIGVtaXNzaXZlLCB0ZXh0dXJlVG9FeHBvcnRzLCBvcHRpb25zKSk7XHJcbiAgICB9IGVsc2UgaWYgKGVtaXNzaXZlICYmIGVtaXNzaXZlLnRvTHVtaW5hbmNlKCkgPiAwKSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWNvbG9yM2YgaW5wdXRzOmVtaXNzaXZlQ29sb3IgPSAke0J1aWxkQ29sb3IoZW1pc3NpdmUpfWApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChub3JtYWxNYXAgIT09IG51bGwpIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9bm9ybWFsM2YgaW5wdXRzOm5vcm1hbC5jb25uZWN0ID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH0vVGV4dHVyZV8ke25vcm1hbE1hcC51bmlxdWVJZH1fbm9ybWFsLm91dHB1dHM6cmdiPmApO1xyXG5cclxuICAgICAgICBzYW1wbGVycy5wdXNoKEJ1aWxkVGV4dHVyZShub3JtYWxNYXAgYXMgVGV4dHVyZSwgbWF0ZXJpYWwsIFwibm9ybWFsXCIsIG51bGwsIHRleHR1cmVUb0V4cG9ydHMsIG9wdGlvbnMpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYW9NYXAgIT09IG51bGwpIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOm9jY2x1c2lvbi5jb25uZWN0ID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH0vVGV4dHVyZV8ke2FvTWFwLnVuaXF1ZUlkfV9vY2NsdXNpb24ub3V0cHV0czoke2FvTWFwQ2hhbm5lbH0+YCk7XHJcblxyXG4gICAgICAgIHNhbXBsZXJzLnB1c2goQnVpbGRUZXh0dXJlKGFvTWFwIGFzIFRleHR1cmUsIG1hdGVyaWFsLCBcIm9jY2x1c2lvblwiLCBuZXcgQ29sb3IzKGFvTWFwSW50ZW5zaXR5LCBhb01hcEludGVuc2l0eSwgYW9NYXBJbnRlbnNpdHkpLCB0ZXh0dXJlVG9FeHBvcnRzLCBvcHRpb25zKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvdWdobmVzc01hcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlucHV0cy5wdXNoKGAke3BhZH1mbG9hdCBpbnB1dHM6cm91Z2huZXNzLmNvbm5lY3QgPSA8L01hdGVyaWFscy9NYXRlcmlhbF8ke21hdGVyaWFsLnVuaXF1ZUlkfS9UZXh0dXJlXyR7cm91Z2huZXNzTWFwLnVuaXF1ZUlkfV9yb3VnaG5lc3Mub3V0cHV0czoke3JvdWdobmVzc0NoYW5uZWx9PmApO1xyXG5cclxuICAgICAgICBzYW1wbGVycy5wdXNoKEJ1aWxkVGV4dHVyZShyb3VnaG5lc3NNYXAgYXMgVGV4dHVyZSwgbWF0ZXJpYWwsIFwicm91Z2huZXNzXCIsIG5ldyBDb2xvcjMocm91Z2huZXNzLCByb3VnaG5lc3MsIHJvdWdobmVzcyksIHRleHR1cmVUb0V4cG9ydHMsIG9wdGlvbnMpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWZsb2F0IGlucHV0czpyb3VnaG5lc3MgPSAke3JvdWdobmVzc31gKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWV0YWxuZXNzTWFwICE9PSBudWxsKSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWZsb2F0IGlucHV0czptZXRhbGxpYy5jb25uZWN0ID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH0vVGV4dHVyZV8ke21ldGFsbmVzc01hcC51bmlxdWVJZH1fbWV0YWxsaWMub3V0cHV0czoke21ldGFsbmVzc0NoYW5uZWx9PmApO1xyXG5cclxuICAgICAgICBzYW1wbGVycy5wdXNoKEJ1aWxkVGV4dHVyZShtZXRhbG5lc3NNYXAgYXMgVGV4dHVyZSwgbWF0ZXJpYWwsIFwibWV0YWxsaWNcIiwgbmV3IENvbG9yMyhtZXRhbG5lc3MsIG1ldGFsbmVzcywgbWV0YWxuZXNzKSwgdGV4dHVyZVRvRXhwb3J0cywgb3B0aW9ucykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOm1ldGFsbGljID0gJHttZXRhbG5lc3N9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFscGhhTWFwICE9PSBudWxsKSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWZsb2F0IGlucHV0czpvcGFjaXR5LmNvbm5lY3QgPSA8L01hdGVyaWFscy9NYXRlcmlhbF8ke21hdGVyaWFsLnVuaXF1ZUlkfS9UZXh0dXJlXyR7YWxwaGFNYXAudW5pcXVlSWR9X29wYWNpdHkub3V0cHV0czpyPmApO1xyXG4gICAgICAgIGlucHV0cy5wdXNoKGAke3BhZH1mbG9hdCBpbnB1dHM6b3BhY2l0eVRocmVzaG9sZCA9IDAuMDAwMWApO1xyXG5cclxuICAgICAgICBzYW1wbGVycy5wdXNoKEJ1aWxkVGV4dHVyZShhbHBoYU1hcCBhcyBUZXh0dXJlLCBtYXRlcmlhbCwgXCJvcGFjaXR5XCIsIG51bGwsIHRleHR1cmVUb0V4cG9ydHMsIG9wdGlvbnMpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWZsb2F0IGlucHV0czpvcGFjaXR5ID0gJHttYXRlcmlhbC5hbHBoYX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOmlvciA9ICR7aW9yfWApO1xyXG5cclxuICAgIHJldHVybiBgXHJcblx0ZGVmIE1hdGVyaWFsIFwiTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH1cIlxyXG5cdHtcclxuXHRcdGRlZiBTaGFkZXIgXCJQcmV2aWV3U3VyZmFjZVwiXHJcblx0XHR7XHJcblx0XHRcdHVuaWZvcm0gdG9rZW4gaW5mbzppZCA9IFwiVXNkUHJldmlld1N1cmZhY2VcIlxyXG4ke2lucHV0cy5qb2luKFwiXFxuXCIpfVxyXG5cdFx0XHRpbnQgaW5wdXRzOnVzZVNwZWN1bGFyV29ya2Zsb3cgPSAwXHJcblx0XHRcdHRva2VuIG91dHB1dHM6c3VyZmFjZVxyXG5cdFx0fVxyXG5cclxuXHRcdHRva2VuIG91dHB1dHM6c3VyZmFjZS5jb25uZWN0ID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH0vUHJldmlld1N1cmZhY2Uub3V0cHV0czpzdXJmYWNlPlxyXG5cclxuJHtzYW1wbGVycy5qb2luKFwiXFxuXCIpfVxyXG5cclxuXHR9XHJcbmA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkQ2FtZXJhKGNhbWVyYTogQ2FtZXJhLCBvcHRpb25zOiBJVVNEWkV4cG9ydE9wdGlvbnMpIHtcclxuICAgIGNvbnN0IG5hbWUgPSBcIkNhbWVyYV9cIiArIGNhbWVyYS51bmlxdWVJZDtcclxuICAgIGNvbnN0IG1hdHJpeCA9IE1hdHJpeC5Sb3RhdGlvblkoTWF0aC5QSSkubXVsdGlwbHkoY2FtZXJhLmdldFdvcmxkTWF0cml4KCkpOyAvLyB3b3JrIHRvd2FyZHMgcG9zaXRpdmUgelxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybSA9IEJ1aWxkTWF0cml4KG1hdHJpeCk7XHJcblxyXG4gICAgaWYgKGNhbWVyYS5tb2RlID09PSBDb25zdGFudHMuT1JUSE9HUkFQSElDX0NBTUVSQSkge1xyXG4gICAgICAgIHJldHVybiBgZGVmIENhbWVyYSBcIiR7bmFtZX1cIlxyXG5cdFx0e1xyXG5cdFx0XHRtYXRyaXg0ZCB4Zm9ybU9wOnRyYW5zZm9ybSA9ICR7dHJhbnNmb3JtfVxyXG5cdFx0XHR1bmlmb3JtIHRva2VuW10geGZvcm1PcE9yZGVyID0gW1wieGZvcm1PcDp0cmFuc2Zvcm1cIl1cclxuXHJcblx0XHRcdGZsb2F0MiBjbGlwcGluZ1JhbmdlID0gKCR7Y2FtZXJhLm1pbloudG9QcmVjaXNpb24ob3B0aW9ucy5wcmVjaXNpb24pfSwgJHtjYW1lcmEubWF4Wi50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9KVxyXG5cdFx0XHRmbG9hdCBob3Jpem9udGFsQXBlcnR1cmUgPSAkeygoTWF0aC5hYnMoY2FtZXJhLm9ydGhvTGVmdCB8fCAxKSArIE1hdGguYWJzKGNhbWVyYS5vcnRob1JpZ2h0IHx8IDEpKSAqIDEwKS50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9XHJcblx0XHRcdGZsb2F0IHZlcnRpY2FsQXBlcnR1cmUgPSAkeygoTWF0aC5hYnMoY2FtZXJhLm9ydGhvVG9wIHx8IDEpICsgTWF0aC5hYnMoY2FtZXJhLm9ydGhvQm90dG9tIHx8IDEpKSAqIDEwKS50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9XHJcblx0XHRcdHRva2VuIHByb2plY3Rpb24gPSBcIm9ydGhvZ3JhcGhpY1wiXHJcblx0XHR9XHJcblx0XHJcblx0YDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgYXNwZWN0ID0gY2FtZXJhLmdldEVuZ2luZSgpLmdldEFzcGVjdFJhdGlvKGNhbWVyYSk7XHJcbiAgICAgICAgY29uc3Qgc2Vuc29yd2lkdGggPSBvcHRpb25zLmNhbWVyYVNlbnNvcldpZHRoIHx8IDM1O1xyXG5cclxuICAgICAgICByZXR1cm4gYGRlZiBDYW1lcmEgXCIke25hbWV9XCJcclxuXHRcdHtcclxuXHRcdFx0bWF0cml4NGQgeGZvcm1PcDp0cmFuc2Zvcm0gPSAke3RyYW5zZm9ybX1cclxuXHRcdFx0dW5pZm9ybSB0b2tlbltdIHhmb3JtT3BPcmRlciA9IFtcInhmb3JtT3A6dHJhbnNmb3JtXCJdXHJcblxyXG5cdFx0XHRmbG9hdDIgY2xpcHBpbmdSYW5nZSA9ICgke2NhbWVyYS5taW5aLnRvUHJlY2lzaW9uKG9wdGlvbnMucHJlY2lzaW9uKX0sICR7Y2FtZXJhLm1heFoudG9QcmVjaXNpb24ob3B0aW9ucy5wcmVjaXNpb24pfSlcclxuXHRcdFx0ZmxvYXQgZm9jYWxMZW5ndGggPSAkeyhzZW5zb3J3aWR0aCAvICgyICogTWF0aC50YW4oY2FtZXJhLmZvdiAqIDAuNSkpKS50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9XHJcbiAgICAgICAgICAgIHRva2VuIHByb2plY3Rpb24gPSBcInBlcnNwZWN0aXZlXCJcclxuXHRcdFx0ZmxvYXQgaG9yaXpvbnRhbEFwZXJ0dXJlID0gJHsoc2Vuc29yd2lkdGggKiBhc3BlY3QpLnRvUHJlY2lzaW9uKG9wdGlvbnMucHJlY2lzaW9uKX1cclxuXHRcdFx0ZmxvYXQgdmVydGljYWxBcGVydHVyZSA9ICR7KHNlbnNvcndpZHRoIC8gYXNwZWN0KS50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9ICAgICAgICAgICAgXHJcblx0XHR9XHJcblx0XHJcblx0YDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBzY2VuZSBzY2VuZSB0byBleHBvcnRcclxuICogQHBhcmFtIG9wdGlvbnMgb3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGV4cG9ydFxyXG4gKiBAcGFyYW0gbWVzaFByZWRpY2F0ZSBwcmVkaWNhdGUgdG8gZmlsdGVyIHRoZSBtZXNoZXMgdG8gZXhwb3J0XHJcbiAqIEByZXR1cm5zIGEgdWludDggYXJyYXkgY29udGFpbmluZyB0aGUgVVNEWiBmaWxlXHJcbiAqIEBzZWUgW1NpbXBsZSBzcGhlcmVdKGh0dHBzOi8vcGxheWdyb3VuZC5iYWJ5bG9uanMuY29tLyNIMkc1WFcjNilcclxuICogQHNlZSBbUmVkIHNwaGVyZV0oaHR0cHM6Ly9wbGF5Z3JvdW5kLmJhYnlsb25qcy5jb20vI0gyRzVYVyM3KVxyXG4gKiBAc2VlIFtCb29tYm94XShodHRwczovL3BsYXlncm91bmQuYmFieWxvbmpzLmNvbS8jNU4zUldLIzUpXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gVVNEWkV4cG9ydEFzeW5jKHNjZW5lOiBTY2VuZSwgb3B0aW9uczogUGFydGlhbDxJVVNEWkV4cG9ydE9wdGlvbnM+LCBtZXNoUHJlZGljYXRlPzogKG06IE1lc2gpID0+IGJvb2xlYW4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcclxuICAgIGNvbnN0IGxvY2FsT3B0aW9ucyA9IHtcclxuICAgICAgICBmZmxhdGVVcmw6IFwiaHR0cHM6Ly91bnBrZy5jb20vZmZsYXRlQDAuOC4yXCIsXHJcbiAgICAgICAgaW5jbHVkZUFuY2hvcmluZ1Byb3BlcnRpZXM6IHRydWUsXHJcbiAgICAgICAgYW5jaG9yaW5nVHlwZTogXCJwbGFuZVwiLFxyXG4gICAgICAgIHBsYW5lQW5jaG9yaW5nQWxpZ25tZW50OiBcImhvcml6b250YWxcIixcclxuICAgICAgICBtb2RlbEZpbGVOYW1lOiBcIm1vZGVsLnVzZGFcIixcclxuICAgICAgICBwcmVjaXNpb246IDUsXHJcbiAgICAgICAgZXhwb3J0Q2FtZXJhOiBmYWxzZSxcclxuICAgICAgICBjYW1lcmFTZW5zb3JXaWR0aDogMzUsXHJcbiAgICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgLy8gR2V0IHRoZSBmZmxhdGUgbGlicmFyeVxyXG4gICAgaWYgKHR5cGVvZiBmZmxhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICBhd2FpdCBUb29scy5Mb2FkU2NyaXB0QXN5bmMobG9jYWxPcHRpb25zLmZmbGF0ZVVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU3RhcnQgdGhlIGV4cG9ydFxyXG4gICAgY29uc3QgZmlsZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuXHJcbiAgICAvLyBtb2RlbCBmaWxlIHNob3VsZCBiZSBmaXJzdCBpbiBVU0RaIGFyY2hpdmUgc28gd2UgaW5pdCBpdCBoZXJlXHJcbiAgICBmaWxlc1tsb2NhbE9wdGlvbnMubW9kZWxGaWxlTmFtZV0gPSBudWxsO1xyXG5cclxuICAgIGxldCBvdXRwdXQgPSBCdWlsZEhlYWRlcigpO1xyXG4gICAgb3V0cHV0ICs9IEJ1aWxkU2NlbmVTdGFydChsb2NhbE9wdGlvbnMpO1xyXG5cclxuICAgIGNvbnN0IG1hdGVyaWFsVG9FeHBvcnRzOiB7IFtrZXk6IHN0cmluZ106IE1hdGVyaWFsIH0gPSB7fTtcclxuXHJcbiAgICAvLyBNZXNoZXNcclxuICAgIGZvciAoY29uc3QgYWJzdHJhY3RNZXNoIG9mIHNjZW5lLm1lc2hlcykge1xyXG4gICAgICAgIGlmIChhYnN0cmFjdE1lc2guZ2V0VG90YWxWZXJ0aWNlcygpID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtZXNoID0gYWJzdHJhY3RNZXNoIGFzIE1lc2g7XHJcbiAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBtZXNoLmdlb21ldHJ5O1xyXG4gICAgICAgIGNvbnN0IG1hdGVyaWFsID0gbWVzaC5tYXRlcmlhbDtcclxuXHJcbiAgICAgICAgaWYgKCFtYXRlcmlhbCB8fCAhZ2VvbWV0cnkgfHwgKG1lc2hQcmVkaWNhdGUgJiYgIW1lc2hQcmVkaWNhdGUobWVzaCkpKSB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkTWF0ZXJpYWxzID0gW1wiU3RhbmRhcmRNYXRlcmlhbFwiLCBcIlBCUk1hdGVyaWFsXCIsIFwiUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbFwiXTtcclxuXHJcbiAgICAgICAgaWYgKHN1cHBvcnRlZE1hdGVyaWFscy5pbmRleE9mKG1hdGVyaWFsLmdldENsYXNzTmFtZSgpKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnlGaWxlTmFtZSA9IFwiZ2VvbWV0cmllcy9HZW9tZXRyeV9cIiArIGdlb21ldHJ5LnVuaXF1ZUlkICsgXCIudXNkYVwiO1xyXG5cclxuICAgICAgICAgICAgaWYgKCEoZ2VvbWV0cnlGaWxlTmFtZSBpbiBmaWxlcykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lc2hPYmplY3QgPSBCdWlsZE1lc2hPYmplY3QoZ2VvbWV0cnksIGxvY2FsT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBmaWxlc1tnZW9tZXRyeUZpbGVOYW1lXSA9IEJ1aWxkVVNERmlsZUFzU3RyaW5nKG1lc2hPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIShtYXRlcmlhbC51bmlxdWVJZCBpbiBtYXRlcmlhbFRvRXhwb3J0cykpIHtcclxuICAgICAgICAgICAgICAgIG1hdGVyaWFsVG9FeHBvcnRzW21hdGVyaWFsLnVuaXF1ZUlkXSA9IG1hdGVyaWFsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvdXRwdXQgKz0gQnVpbGRYZm9ybShtZXNoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBUb29scy5XYXJuKFwiVVNEWkV4cG9ydEFzeW5jIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBtYXRlcmlhbCB0eXBlOiBcIiArIG1hdGVyaWFsLmdldENsYXNzTmFtZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FtZXJhXHJcbiAgICBpZiAoc2NlbmUuYWN0aXZlQ2FtZXJhICYmIGxvY2FsT3B0aW9ucy5leHBvcnRDYW1lcmEpIHtcclxuICAgICAgICBvdXRwdXQgKz0gQnVpbGRDYW1lcmEoc2NlbmUuYWN0aXZlQ2FtZXJhLCBsb2NhbE9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsb3NlIHNjZW5lXHJcbiAgICBvdXRwdXQgKz0gQnVpbGRTY2VuZUVuZCgpO1xyXG5cclxuICAgIC8vIE1hdGVyaWFsc1xyXG4gICAgY29uc3QgdGV4dHVyZVRvRXhwb3J0czogeyBba2V5OiBzdHJpbmddOiBCYXNlVGV4dHVyZSB9ID0ge307XHJcbiAgICBvdXRwdXQgKz0gQnVpbGRNYXRlcmlhbHMobWF0ZXJpYWxUb0V4cG9ydHMsIHRleHR1cmVUb0V4cG9ydHMsIGxvY2FsT3B0aW9ucyk7XHJcblxyXG4gICAgLy8gQ29tcHJlc3NcclxuICAgIGZpbGVzW2xvY2FsT3B0aW9ucy5tb2RlbEZpbGVOYW1lXSA9IGZmbGF0ZS5zdHJUb1U4KG91dHB1dCk7XHJcblxyXG4gICAgLy8gVGV4dHVyZXNcclxuICAgIGZvciAoY29uc3QgaWQgaW4gdGV4dHVyZVRvRXhwb3J0cykge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSB0ZXh0dXJlVG9FeHBvcnRzW2lkXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRleHR1cmUuZ2V0U2l6ZSgpO1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmVEYXRhID0gYXdhaXQgdGV4dHVyZS5yZWFkUGl4ZWxzKCk7XHJcblxyXG4gICAgICAgIGlmICghdGV4dHVyZURhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGV4dHVyZSBkYXRhIGlzIG5vdCBhdmFpbGFibGVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IER1bXBUb29scy5EdW1wRGF0YUFzeW5jKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0LCB0ZXh0dXJlRGF0YSwgXCJpbWFnZS9wbmdcIiwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGZpbGVzW2B0ZXh0dXJlcy9UZXh0dXJlXyR7aWR9LnBuZ2BdID0gbmV3IFVpbnQ4QXJyYXkoZmlsZUNvbnRlbnQgYXMgQXJyYXlCdWZmZXIpLnNsaWNlKCk7IC8vIFRoaXMgaXMgdG8gYXZvaWQgZ2V0dGluZyBhIGxpbmsgYW5kIG5vdCBhIGNvcHlcclxuICAgIH1cclxuXHJcbiAgICAvLyA2NCBieXRlIGFsaWdubWVudFxyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tLzEwMWFycm93ei9mZmxhdGUvaXNzdWVzLzM5I2lzc3VlY29tbWVudC03NzcyNjMxMDlcclxuXHJcbiAgICBsZXQgb2Zmc2V0ID0gMDtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIGluIGZpbGVzKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZSA9IGZpbGVzW2ZpbGVuYW1lXTtcclxuICAgICAgICBpZiAoIWZpbGUpIHtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGhlYWRlclNpemUgPSAzNCArIGZpbGVuYW1lLmxlbmd0aDtcclxuXHJcbiAgICAgICAgb2Zmc2V0ICs9IGhlYWRlclNpemU7XHJcblxyXG4gICAgICAgIGNvbnN0IG9mZnNldE1vZDY0ID0gb2Zmc2V0ICYgNjM7XHJcblxyXG4gICAgICAgIGlmIChvZmZzZXRNb2Q2NCAhPT0gNCkge1xyXG4gICAgICAgICAgICBjb25zdCBwYWRMZW5ndGggPSA2NCAtIG9mZnNldE1vZDY0O1xyXG4gICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gbmV3IFVpbnQ4QXJyYXkocGFkTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuICAgICAgICAgICAgZmlsZXNbZmlsZW5hbWVdID0gW2ZpbGUsIHsgZXh0cmE6IHsgMTIzNDU6IHBhZGRpbmcgfSB9XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9mZnNldCA9IGZpbGUubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmZmxhdGUuemlwU3luYyhmaWxlcywgeyBsZXZlbDogMCB9KTtcclxufVxyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlcyAqL1xyXG5pbXBvcnQgKiBhcyBTZXJpYWxpemVycyBmcm9tIFwic2VyaWFsaXplcnMvVVNEWi9pbmRleFwiO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgVU1EIG1vZHVsZS5cclxuICogVGhlIGVudHJ5IHBvaW50IGZvciBhIGZ1dHVyZSBFU00gcGFja2FnZSBzaG91bGQgYmUgaW5kZXgudHNcclxuICovXHJcbmNvbnN0IGdsb2JhbE9iamVjdCA9IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdW5kZWZpbmVkO1xyXG5pZiAodHlwZW9mIGdsb2JhbE9iamVjdCAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgZm9yIChjb25zdCBzZXJpYWxpemVyIGluIFNlcmlhbGl6ZXJzKSB7XHJcbiAgICAgICAgKDxhbnk+Z2xvYmFsT2JqZWN0KS5CQUJZTE9OW3NlcmlhbGl6ZXJdID0gKDxhbnk+U2VyaWFsaXplcnMpW3NlcmlhbGl6ZXJdO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgKiBmcm9tIFwic2VyaWFsaXplcnMvVVNEWi9pbmRleFwiO1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01pc2NfZmlsZVRvb2xzX187IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0ICogYXMgc2VyaWFsaXplcnMgZnJvbSBcIkBsdHMvc2VyaWFsaXplcnMvbGVnYWN5L2xlZ2FjeS11c2R6U2VyaWFsaXplclwiO1xuZXhwb3J0IHsgc2VyaWFsaXplcnMgfTtcbmV4cG9ydCBkZWZhdWx0IHNlcmlhbGl6ZXJzO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|
|
1097
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi51c2R6U2VyaWFsaXplci5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2haQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDREE7QUFDQTtBQUVBO0FBT0E7QUFDQTtBQUdBO0FBQ0E7QUFrREE7QUFDQTtBQVNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQWVBO0FBRUE7QUFDQTtBQUlBO0FBRUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQWFBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBWUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQU9BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBUUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQWtDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQXdCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQVVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQWlCQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQVlBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFhQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQVNBO0FBQ0E7Ozs7OztBQUNBO0FBYUE7QUFDQTs7QUFBQTs7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUdBOzs7Ozs7Ozs7OztBQUNBO0FBRUE7QUFDQTs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQUFBO0FBRUE7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDendCQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FDZEE7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL1NFUklBTElaRVJTL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9TRVJJQUxJWkVSUy8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcyIsIndlYnBhY2s6Ly9TRVJJQUxJWkVSUy8uLi8uLi8uLi9kZXYvc2VyaWFsaXplcnMvc3JjL1VTRFovaW5kZXgudHMiLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvLi4vLi4vLi4vZGV2L3NlcmlhbGl6ZXJzL3NyYy9VU0RaL3VzZHpFeHBvcnRlci50cyIsIndlYnBhY2s6Ly9TRVJJQUxJWkVSUy8uLi8uLi8uLi9sdHMvc2VyaWFsaXplcnMvc3JjL2xlZ2FjeS9sZWdhY3ktdXNkelNlcmlhbGl6ZXIudHMiLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvZXh0ZXJuYWwgdW1kIHtcInJvb3RcIjpcIkJBQllMT05cIixcImNvbW1vbmpzXCI6XCJiYWJ5bG9uanNcIixcImNvbW1vbmpzMlwiOlwiYmFieWxvbmpzXCIsXCJhbWRcIjpcImJhYnlsb25qc1wifSIsIndlYnBhY2s6Ly9TRVJJQUxJWkVSUy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9TRVJJQUxJWkVSUy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9TRVJJQUxJWkVSUy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9TRVJJQUxJWkVSUy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL1NFUklBTElaRVJTL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vU0VSSUFMSVpFUlMvLi9zcmMvVVNEWi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJiYWJ5bG9uanMtc2VyaWFsaXplcnNcIiwgW1wiYmFieWxvbmpzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImJhYnlsb25qcy1zZXJpYWxpemVyc1wiXSA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU0VSSUFMSVpFUlNcIl0gPSBmYWN0b3J5KHJvb3RbXCJCQUJZTE9OXCJdKTtcbn0pKCh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdGhpcyksIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NaXNjX2ZpbGVUb29sc19fKSA9PiB7XG5yZXR1cm4gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQ7XG4gIH1cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgIH1cbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICB9XG4gIH1cbiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICBkb25lID0gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICB9XG4gIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICB2YXIgYXIgPSBbXTtcbiAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xuICAgIHJldHVybiBhcjtcbiAgfTtcbiAgcmV0dXJuIG93bktleXMobyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcbiAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgX19leHRlbmRzLFxuICBfX2Fzc2lnbixcbiAgX19yZXN0LFxuICBfX2RlY29yYXRlLFxuICBfX3BhcmFtLFxuICBfX2VzRGVjb3JhdGUsXG4gIF9fcnVuSW5pdGlhbGl6ZXJzLFxuICBfX3Byb3BLZXksXG4gIF9fc2V0RnVuY3Rpb25OYW1lLFxuICBfX21ldGFkYXRhLFxuICBfX2F3YWl0ZXIsXG4gIF9fZ2VuZXJhdG9yLFxuICBfX2NyZWF0ZUJpbmRpbmcsXG4gIF9fZXhwb3J0U3RhcixcbiAgX192YWx1ZXMsXG4gIF9fcmVhZCxcbiAgX19zcHJlYWQsXG4gIF9fc3ByZWFkQXJyYXlzLFxuICBfX3NwcmVhZEFycmF5LFxuICBfX2F3YWl0LFxuICBfX2FzeW5jR2VuZXJhdG9yLFxuICBfX2FzeW5jRGVsZWdhdG9yLFxuICBfX2FzeW5jVmFsdWVzLFxuICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcbiAgX19pbXBvcnRTdGFyLFxuICBfX2ltcG9ydERlZmF1bHQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRJbixcbiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXG4gIF9fZGlzcG9zZVJlc291cmNlcyxcbiAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXG59O1xuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgKi9cclxuZXhwb3J0ICogZnJvbSBcIi4vdXNkekV4cG9ydGVyXCI7XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xyXG5pbXBvcnQgeyBWZXJ0ZXhCdWZmZXIgfSBmcm9tIFwiY29yZS9CdWZmZXJzL2J1ZmZlclwiO1xyXG5pbXBvcnQgdHlwZSB7IENhbWVyYSB9IGZyb20gXCJjb3JlL0NhbWVyYXMvY2FtZXJhXCI7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCJjb3JlL0VuZ2luZXMvY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgTWF0ZXJpYWwgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvbWF0ZXJpYWxcIjtcclxuaW1wb3J0IHR5cGUgeyBQQlJNYXRlcmlhbCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9QQlIvcGJyTWF0ZXJpYWxcIjtcclxuaW1wb3J0IHR5cGUgeyBQQlJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1BCUi9wYnJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsXCI7XHJcbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRNYXRlcmlhbCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9zdGFuZGFyZE1hdGVyaWFsXCI7XHJcbmltcG9ydCB0eXBlIHsgQmFzZVRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvYmFzZVRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgeyBNYXRyaXgsIFZlY3RvcjIgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLnZlY3RvclwiO1xyXG5pbXBvcnQgdHlwZSB7IEdlb21ldHJ5IH0gZnJvbSBcImNvcmUvTWVzaGVzL2dlb21ldHJ5XCI7XHJcbmltcG9ydCB0eXBlIHsgTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9tZXNoXCI7XHJcbmltcG9ydCB7IER1bXBUb29scyB9IGZyb20gXCJjb3JlL01pc2MvZHVtcFRvb2xzXCI7XHJcbmltcG9ydCB7IFRvb2xzIH0gZnJvbSBcImNvcmUvTWlzYy90b29sc1wiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHR5cGUgeyBGbG9hdEFycmF5LCBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcblxyXG4vKipcclxuICogUG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9ibG9iL21hc3Rlci9leGFtcGxlcy9qc20vZXhwb3J0ZXJzL1VTRFpFeHBvcnRlci5qc1xyXG4gKiBUaGFua3MgYSBsb3QgdG8gdGhlIHRocmVlLmpzIHRlYW0gZm9yIHRoZWlyIGFtYXppbmcgd29yayFcclxuICovXHJcblxyXG4vLyBGRmxhdGUgYWNjZXNzXHJcbmRlY2xhcmUgY29uc3QgZmZsYXRlOiBhbnk7XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgdGhlIFVTRFogZXhwb3J0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElVU0RaRXhwb3J0T3B0aW9ucyB7XHJcbiAgICAvKipcclxuICAgICAqIFVSTCB0byBsb2FkIHRoZSBmZmxhdGUgbGlicmFyeSBmcm9tXHJcbiAgICAgKi9cclxuICAgIGZmbGF0ZVVybD86IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogSW5jbHVkZSBhbmNob3JpbmcgcHJvcGVydGllcyBpbiB0aGUgVVNEWiBmaWxlXHJcbiAgICAgKi9cclxuICAgIGluY2x1ZGVBbmNob3JpbmdQcm9wZXJ0aWVzPzogYm9vbGVhbjtcclxuICAgIC8qKlxyXG4gICAgICogQW5jaG9yaW5nIHR5cGUgKHBsYW5lIGJ5IGRlZmF1bHQpXHJcbiAgICAgKi9cclxuICAgIGFuY2hvcmluZ1R5cGU/OiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFBsYW5lIGFuY2hvcmluZyBhbGlnbm1lbnQgKGhvcml6b250YWwgYnkgZGVmYXVsdClcclxuICAgICAqL1xyXG4gICAgcGxhbmVBbmNob3JpbmdBbGlnbm1lbnQ/OiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIE1vZGVsIGZpbGUgbmFtZSAobW9kZWwudXNkYSBieSBkZWZhdWx0KVxyXG4gICAgICovXHJcbiAgICBtb2RlbEZpbGVOYW1lPzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVjaXNpb24gdG8gdXNlIGZvciBudW1iZXIgKDUgYnkgZGVmYXVsdClcclxuICAgICAqL1xyXG4gICAgcHJlY2lzaW9uPzogbnVtYmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBFeHBvcnQgdGhlIGNhbWVyYSAoZmFsc2UgYnkgZGVmYXVsdClcclxuICAgICAqL1xyXG4gICAgZXhwb3J0Q2FtZXJhPzogYm9vbGVhbjtcclxuICAgIC8qKlxyXG4gICAgICogQ2FtZXJhIHNlbnNvciB3aWR0aCAoMzUgYnkgZGVmYXVsdClcclxuICAgICAqL1xyXG4gICAgY2FtZXJhU2Vuc29yV2lkdGg/OiBudW1iZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkSGVhZGVyKCkge1xyXG4gICAgcmV0dXJuIGAjdXNkYSAxLjBcclxuICAgIChcclxuICAgICAgICBjdXN0b21MYXllckRhdGEgPSB7XHJcbiAgICAgICAgICAgIHN0cmluZyBjcmVhdG9yID0gXCJCYWJ5bG9uLmpzIFVTRFpFeHBvcnRBc3luY1wiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmF1bHRQcmltID0gXCJSb290XCJcclxuICAgICAgICBtZXRlcnNQZXJVbml0ID0gMVxyXG4gICAgICAgIHVwQXhpcyA9IFwiWVwiXHJcbiAgICApYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRTY2VuZVN0YXJ0KG9wdGlvbnM6IElVU0RaRXhwb3J0T3B0aW9ucykge1xyXG4gICAgY29uc3QgYWxpZ25tZW50ID1cclxuICAgICAgICBvcHRpb25zLmluY2x1ZGVBbmNob3JpbmdQcm9wZXJ0aWVzID09PSB0cnVlXHJcbiAgICAgICAgICAgID8gYFxyXG5cdFx0dG9rZW4gcHJlbGltaW5hcnk6YW5jaG9yaW5nOnR5cGUgPSBcIiR7b3B0aW9ucy5hbmNob3JpbmdUeXBlfVwiXHJcblx0XHR0b2tlbiBwcmVsaW1pbmFyeTpwbGFuZUFuY2hvcmluZzphbGlnbm1lbnQgPSBcIiR7b3B0aW9ucy5wbGFuZUFuY2hvcmluZ0FsaWdubWVudH1cImBcclxuICAgICAgICAgICAgOiBcIlwiO1xyXG4gICAgcmV0dXJuIGBkZWYgWGZvcm0gXCJSb290XCJcclxuICAgIHtcclxuICAgICAgICBkZWYgU2NvcGUgXCJTY2VuZXNcIiAoXHJcbiAgICAgICAgICAgIGtpbmQgPSBcInNjZW5lTGlicmFyeVwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVmIFhmb3JtIFwiU2NlbmVcIiAoXHJcbiAgICAgICAgICAgICAgICBjdXN0b21EYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlbGltaW5hcnlfY29sbGlkZXNXaXRoRW52aXJvbm1lbnQgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHNjZW5lTmFtZSA9IFwiU2NlbmVcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2NlbmVOYW1lID0gXCJTY2VuZVwiXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgeyR7YWxpZ25tZW50fVxyXG4gICAgICAgICAgICBgO1xyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZFNjZW5lRW5kKCkge1xyXG4gICAgcmV0dXJuIGBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1gO1xyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZE1lc2hWZXJ0ZXhDb3VudChnZW9tZXRyeTogR2VvbWV0cnkpIHtcclxuICAgIGNvbnN0IGNvdW50ID0gZ2VvbWV0cnkuZ2V0SW5kaWNlcygpPy5sZW5ndGggPyBnZW9tZXRyeS5nZXRUb3RhbEluZGljZXMoKSA6IGdlb21ldHJ5LmdldFRvdGFsVmVydGljZXMoKTtcclxuXHJcbiAgICByZXR1cm4gQXJyYXkoY291bnQgLyAzKVxyXG4gICAgICAgIC5maWxsKDMpXHJcbiAgICAgICAgLmpvaW4oXCIsIFwiKTtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRNZXNoVmVydGV4SW5kaWNlcyhnZW9tZXRyeTogR2VvbWV0cnkpIHtcclxuICAgIGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuZ2V0SW5kaWNlcygpO1xyXG4gICAgY29uc3QgYXJyYXkgPSBbXTtcclxuXHJcbiAgICBpZiAoaW5kZXggIT09IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2goaW5kZXhbaV0pO1xyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gZ2VvbWV0cnkuZ2V0VG90YWxWZXJ0aWNlcygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2goaSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcnJheS5qb2luKFwiLCBcIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkVmVjdG9yM0FycmF5KGF0dHJpYnV0ZTogRmxvYXRBcnJheSwgb3B0aW9uczogSVVTRFpFeHBvcnRPcHRpb25zLCBzdHJpZGUgPSAzKSB7XHJcbiAgICBjb25zdCBhcnJheSA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlLmxlbmd0aCAvIHN0cmlkZTsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgeCA9IGF0dHJpYnV0ZVtpICogc3RyaWRlXTtcclxuICAgICAgICBjb25zdCB5ID0gYXR0cmlidXRlW2kgKiBzdHJpZGUgKyAxXTtcclxuICAgICAgICBjb25zdCB6ID0gYXR0cmlidXRlW2kgKiBzdHJpZGUgKyAyXTtcclxuXHJcbiAgICAgICAgYXJyYXkucHVzaChgKCR7eC50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9LCAke3kudG9QcmVjaXNpb24ob3B0aW9ucy5wcmVjaXNpb24pfSwgJHt6LnRvUHJlY2lzaW9uKG9wdGlvbnMucHJlY2lzaW9uKX0pYCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFycmF5LmpvaW4oXCIsIFwiKTtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRWZWN0b3IyQXJyYXkoYXR0cmlidXRlOiBGbG9hdEFycmF5LCBvcHRpb25zOiBJVVNEWkV4cG9ydE9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGFycmF5ID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGUubGVuZ3RoIC8gMjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgeCA9IGF0dHJpYnV0ZVtpICogMl07XHJcbiAgICAgICAgY29uc3QgeSA9IGF0dHJpYnV0ZVtpICogMiArIDFdO1xyXG5cclxuICAgICAgICBhcnJheS5wdXNoKGAoJHt4LnRvUHJlY2lzaW9uKG9wdGlvbnMucHJlY2lzaW9uKX0sICR7KDEgLSB5KS50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9KWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcnJheS5qb2luKFwiLCBcIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkQWRkaXRpb25hbEF0dHJpYnV0ZXMoZ2VvbWV0cnk6IEdlb21ldHJ5LCBvcHRpb25zOiBJVVNEWkV4cG9ydE9wdGlvbnMpIHtcclxuICAgIGxldCBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgaWQgPSBpID4gMCA/IGkgOiBcIlwiO1xyXG4gICAgICAgIGNvbnN0IHV2QXR0cmlidXRlID0gZ2VvbWV0cnkuZ2V0VmVydGljZXNEYXRhKFZlcnRleEJ1ZmZlci5VVktpbmQgKyAoaWQgPyBpZCArIDEgOiBcIlwiKSk7IC8vIFVWIG5hbWVzIGdvIGxpa2UgXCJ1dlwiLCBcInV2MlwiLCBcInV2M1wiLCBldGMuXHJcblxyXG4gICAgICAgIGlmICh1dkF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYFxyXG5cdFx0dGV4Q29vcmQyZltdIHByaW12YXJzOnN0JHtpZH0gPSBbJHtCdWlsZFZlY3RvcjJBcnJheSh1dkF0dHJpYnV0ZSwgb3B0aW9ucyl9XSAoXHJcblx0XHRcdGludGVycG9sYXRpb24gPSBcInZlcnRleFwiXHJcblx0XHQpYDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdmVydGV4IGNvbG9yc1xyXG5cclxuICAgIGNvbnN0IGNvbG9yQXR0cmlidXRlID0gZ2VvbWV0cnkuZ2V0VmVydGljZXNEYXRhKFZlcnRleEJ1ZmZlci5Db2xvcktpbmQpO1xyXG5cclxuICAgIGlmIChjb2xvckF0dHJpYnV0ZSkge1xyXG4gICAgICAgIHN0cmluZyArPSBgXHJcblx0Y29sb3IzZltdIHByaW12YXJzOmRpc3BsYXlDb2xvciA9IFske0J1aWxkVmVjdG9yM0FycmF5KGNvbG9yQXR0cmlidXRlLCBvcHRpb25zLCBjb2xvckF0dHJpYnV0ZS5sZW5ndGggLyBnZW9tZXRyeS5nZXRUb3RhbFZlcnRpY2VzKCkpfV0gKFxyXG5cdFx0aW50ZXJwb2xhdGlvbiA9IFwidmVydGV4XCJcclxuXHRcdClgO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdHJpbmc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkTWVzaChnZW9tZXRyeTogR2VvbWV0cnksIG9wdGlvbnM6IElVU0RaRXhwb3J0T3B0aW9ucykge1xyXG4gICAgY29uc3QgbmFtZSA9IFwiR2VvbWV0cnlcIjtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0VmVydGljZXNEYXRhKFZlcnRleEJ1ZmZlci5Qb3NpdGlvbktpbmQpO1xyXG4gICAgY29uc3Qgbm9ybWFsID0gZ2VvbWV0cnkuZ2V0VmVydGljZXNEYXRhKFZlcnRleEJ1ZmZlci5Ob3JtYWxLaW5kKTtcclxuXHJcbiAgICBpZiAoIXBvc2l0aW9uIHx8ICFub3JtYWwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGBcclxuXHRkZWYgTWVzaCBcIiR7bmFtZX1cIlxyXG5cdHtcclxuXHRcdGludFtdIGZhY2VWZXJ0ZXhDb3VudHMgPSBbJHtCdWlsZE1lc2hWZXJ0ZXhDb3VudChnZW9tZXRyeSl9XVxyXG5cdFx0aW50W10gZmFjZVZlcnRleEluZGljZXMgPSBbJHtCdWlsZE1lc2hWZXJ0ZXhJbmRpY2VzKGdlb21ldHJ5KX1dXHJcblx0XHRub3JtYWwzZltdIG5vcm1hbHMgPSBbJHtCdWlsZFZlY3RvcjNBcnJheShub3JtYWwsIG9wdGlvbnMpfV0gKFxyXG5cdFx0XHRpbnRlcnBvbGF0aW9uID0gXCJ2ZXJ0ZXhcIlxyXG5cdFx0KVxyXG5cdFx0cG9pbnQzZltdIHBvaW50cyA9IFske0J1aWxkVmVjdG9yM0FycmF5KHBvc2l0aW9uLCBvcHRpb25zKX1dXHJcbiAgICAgICAgJHtCdWlsZEFkZGl0aW9uYWxBdHRyaWJ1dGVzKGdlb21ldHJ5LCBvcHRpb25zKX1cclxuXHRcdHVuaWZvcm0gdG9rZW4gc3ViZGl2aXNpb25TY2hlbWUgPSBcIm5vbmVcIlxyXG5cdH1cclxuYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRNZXNoT2JqZWN0KGdlb21ldHJ5OiBHZW9tZXRyeSwgb3B0aW9uczogSVVTRFpFeHBvcnRPcHRpb25zKSB7XHJcbiAgICBjb25zdCBtZXNoID0gQnVpbGRNZXNoKGdlb21ldHJ5LCBvcHRpb25zKTtcclxuICAgIHJldHVybiBgXHJcbiAgICAgICAgZGVmIFwiR2VvbWV0cnlcIlxyXG4gICAgICAgIHtcclxuICAgICAgICAke21lc2h9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkVVNERmlsZUFzU3RyaW5nKGRhdGFUb0luc2VydDogc3RyaW5nKSB7XHJcbiAgICBsZXQgb3V0cHV0ID0gQnVpbGRIZWFkZXIoKTtcclxuICAgIG91dHB1dCArPSBkYXRhVG9JbnNlcnQ7XHJcbiAgICByZXR1cm4gZmZsYXRlLnN0clRvVTgob3V0cHV0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRNYXRyaXgobWF0cml4OiBNYXRyaXgpIHtcclxuICAgIGNvbnN0IGFycmF5ID0gbWF0cml4Lm0gYXMgbnVtYmVyW107XHJcblxyXG4gICAgcmV0dXJuIGAoICR7QnVpbGRNYXRyaXhSb3coYXJyYXksIDApfSwgJHtCdWlsZE1hdHJpeFJvdyhhcnJheSwgNCl9LCAke0J1aWxkTWF0cml4Um93KGFycmF5LCA4KX0sICR7QnVpbGRNYXRyaXhSb3coYXJyYXksIDEyKX0gKWA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkTWF0cml4Um93KGFycmF5OiBudW1iZXJbXSwgb2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHJldHVybiBgKCR7YXJyYXlbb2Zmc2V0ICsgMF19LCAke2FycmF5W29mZnNldCArIDFdfSwgJHthcnJheVtvZmZzZXQgKyAyXX0sICR7YXJyYXlbb2Zmc2V0ICsgM119KWA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkWGZvcm0obWVzaDogTWVzaCkge1xyXG4gICAgY29uc3QgbmFtZSA9IFwiT2JqZWN0X1wiICsgbWVzaC51bmlxdWVJZDtcclxuICAgIGNvbnN0IG1hdHJpeCA9IG1lc2guZ2V0V29ybGRNYXRyaXgoKS5jbG9uZSgpO1xyXG5cclxuICAgIGlmIChtYXRyaXguZGV0ZXJtaW5hbnQoKSA8IDApIHtcclxuICAgICAgICBUb29scy5XYXJuKGBFeHBvcnRpbmcgbWVzaCAke21lc2gubmFtZX0gd2l0aCBuZWdhdGl2ZSBzY2FsZS4gUmVzdWx0IG1heSBsb29rIGluY29ycmVjdCBpbiBkZXN0aW5hdGlvbiBlbmdpbmUuYCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBCdWlsZE1hdHJpeChtYXRyaXgpO1xyXG5cclxuICAgIHJldHVybiBgZGVmIFhmb3JtIFwiJHtuYW1lfVwiIChcclxuXHRwcmVwZW5kIHJlZmVyZW5jZXMgPSBALi9nZW9tZXRyaWVzL0dlb21ldHJ5XyR7bWVzaC5nZW9tZXRyeSEudW5pcXVlSWR9LnVzZGFAPC9HZW9tZXRyeT5cclxuXHRwcmVwZW5kIGFwaVNjaGVtYXMgPSBbXCJNYXRlcmlhbEJpbmRpbmdBUElcIl1cclxuKVxyXG57XHJcblx0bWF0cml4NGQgeGZvcm1PcDp0cmFuc2Zvcm0gPSAke3RyYW5zZm9ybX1cclxuXHR1bmlmb3JtIHRva2VuW10geGZvcm1PcE9yZGVyID0gW1wieGZvcm1PcDp0cmFuc2Zvcm1cIl1cdFxyXG5cclxuICAgIHJlbCBtYXRlcmlhbDpiaW5kaW5nID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttZXNoLm1hdGVyaWFsIS51bmlxdWVJZH0+XHJcbn1cclxuXHJcbmA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkTWF0ZXJpYWxzKG1hdGVyaWFsczogeyBba2V5OiBzdHJpbmddOiBNYXRlcmlhbCB9LCB0ZXh0dXJlVG9FeHBvcnRzOiB7IFtrZXk6IHN0cmluZ106IEJhc2VUZXh0dXJlIH0sIG9wdGlvbnM6IElVU0RaRXhwb3J0T3B0aW9ucykge1xyXG4gICAgY29uc3QgYXJyYXkgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHV1aWQgaW4gbWF0ZXJpYWxzKSB7XHJcbiAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSBtYXRlcmlhbHNbdXVpZF07XHJcblxyXG4gICAgICAgIGFycmF5LnB1c2goQnVpbGRNYXRlcmlhbChtYXRlcmlhbCwgdGV4dHVyZVRvRXhwb3J0cywgb3B0aW9ucykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBgXHJcbiAgICBkZWYgXCJNYXRlcmlhbHNcIlxyXG57XHJcbiR7YXJyYXkuam9pbihcIlwiKX1cclxufVxyXG5cclxuYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRXcmFwcGluZyh3cmFwcGluZzogbnVtYmVyKSB7XHJcbiAgICBzd2l0Y2ggKHdyYXBwaW5nKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdGFudHMuVEVYVFVSRV9DTEFNUF9BRERSRVNTTU9ERTpcclxuICAgICAgICAgICAgcmV0dXJuIFwiY2xhbXBcIjtcclxuICAgICAgICBjYXNlIENvbnN0YW50cy5URVhUVVJFX01JUlJPUl9BRERSRVNTTU9ERTpcclxuICAgICAgICAgICAgcmV0dXJuIFwibWlycm9yXCI7XHJcbiAgICAgICAgY2FzZSBDb25zdGFudHMuVEVYVFVSRV9XUkFQX0FERFJFU1NNT0RFOlxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBcInJlcGVhdFwiO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZENvbG9yNChjb2xvcjogQ29sb3IzKSB7XHJcbiAgICByZXR1cm4gYCgke2NvbG9yLnJ9LCAke2NvbG9yLmd9LCAke2NvbG9yLmJ9LCAxLjApYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRWZWN0b3IyKHZlY3RvcjogVmVjdG9yMikge1xyXG4gICAgcmV0dXJuIGAoJHt2ZWN0b3IueH0sICR7dmVjdG9yLnl9KWA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1aWxkQ29sb3IoY29sb3I6IENvbG9yMykge1xyXG4gICAgcmV0dXJuIGAoJHtjb2xvci5yfSwgJHtjb2xvci5nfSwgJHtjb2xvci5ifSlgO1xyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZFRleHR1cmUoXHJcbiAgICB0ZXh0dXJlOiBUZXh0dXJlLFxyXG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsLFxyXG4gICAgbWFwVHlwZTogc3RyaW5nLFxyXG4gICAgY29sb3I6IE51bGxhYmxlPENvbG9yMz4sXHJcbiAgICB0ZXh0dXJlVG9FeHBvcnRzOiB7IFtrZXk6IHN0cmluZ106IEJhc2VUZXh0dXJlIH0sXHJcbiAgICBvcHRpb25zOiBJVVNEWkV4cG9ydE9wdGlvbnNcclxuKSB7XHJcbiAgICBjb25zdCBpZCA9IHRleHR1cmUuZ2V0SW50ZXJuYWxUZXh0dXJlKCkhLnVuaXF1ZUlkICsgXCJfXCIgKyB0ZXh0dXJlLmludmVydFk7XHJcblxyXG4gICAgdGV4dHVyZVRvRXhwb3J0c1tpZF0gPSB0ZXh0dXJlO1xyXG5cclxuICAgIGNvbnN0IHV2ID0gdGV4dHVyZS5jb29yZGluYXRlc0luZGV4ID4gMCA/IFwic3RcIiArIHRleHR1cmUuY29vcmRpbmF0ZXNJbmRleCA6IFwic3RcIjtcclxuICAgIGNvbnN0IHJlcGVhdCA9IG5ldyBWZWN0b3IyKHRleHR1cmUudVNjYWxlLCB0ZXh0dXJlLnZTY2FsZSk7XHJcbiAgICBjb25zdCBvZmZzZXQgPSBuZXcgVmVjdG9yMih0ZXh0dXJlLnVPZmZzZXQsIHRleHR1cmUudk9mZnNldCk7XHJcbiAgICBjb25zdCByb3RhdGlvbiA9IHRleHR1cmUud0FuZztcclxuXHJcbiAgICAvLyByb3RhdGlvbiBpcyBhcm91bmQgdGhlIHdyb25nIHBvaW50LiBhZnRlciByb3RhdGlvbiB3ZSBuZWVkIHRvIHNoaWZ0IG9mZnNldCBhZ2FpbiBzbyB0aGF0IHdlJ3JlIHJvdGF0aW5nIGFyb3VuZCB0aGUgcmlnaHQgc3BvdFxyXG4gICAgY29uc3QgeFJvdGF0aW9uT2Zmc2V0ID0gTWF0aC5zaW4ocm90YXRpb24pO1xyXG4gICAgY29uc3QgeVJvdGF0aW9uT2Zmc2V0ID0gTWF0aC5jb3Mocm90YXRpb24pO1xyXG5cclxuICAgIC8vIHRleHR1cmUgY29vcmRpbmF0ZXMgc3RhcnQgaW4gdGhlIG9wcG9zaXRlIGNvcm5lciwgbmVlZCB0byBjb3JyZWN0XHJcbiAgICBvZmZzZXQueSA9IDEgLSBvZmZzZXQueSAtIHJlcGVhdC55O1xyXG5cclxuICAgIG9mZnNldC54ICs9IHhSb3RhdGlvbk9mZnNldCAqIHJlcGVhdC54O1xyXG4gICAgb2Zmc2V0LnkgKz0gKDEgLSB5Um90YXRpb25PZmZzZXQpICogcmVwZWF0Lnk7XHJcblxyXG4gICAgcmV0dXJuIGBcclxuICAgIGRlZiBTaGFkZXIgXCJQcmltdmFyUmVhZGVyXyR7bWFwVHlwZX1cIlxyXG4gICAge1xyXG4gICAgICAgIHVuaWZvcm0gdG9rZW4gaW5mbzppZCA9IFwiVXNkUHJpbXZhclJlYWRlcl9mbG9hdDJcIlxyXG4gICAgICAgIGZsb2F0MiBpbnB1dHM6ZmFsbGJhY2sgPSAoMC4wLCAwLjApXHJcbiAgICAgICAgdG9rZW4gaW5wdXRzOnZhcm5hbWUgPSBcIiR7dXZ9XCJcclxuICAgICAgICBmbG9hdDIgb3V0cHV0czpyZXN1bHRcclxuICAgIH1cclxuXHJcbiAgICBkZWYgU2hhZGVyIFwiVHJhbnNmb3JtMmRfJHttYXBUeXBlfVwiXHJcbiAgICB7XHJcbiAgICAgICAgdW5pZm9ybSB0b2tlbiBpbmZvOmlkID0gXCJVc2RUcmFuc2Zvcm0yZFwiXHJcbiAgICAgICAgdG9rZW4gaW5wdXRzOmluLmNvbm5lY3QgPSA8L01hdGVyaWFscy9NYXRlcmlhbF8ke21hdGVyaWFsLnVuaXF1ZUlkfS9QcmltdmFyUmVhZGVyXyR7bWFwVHlwZX0ub3V0cHV0czpyZXN1bHQ+XHJcbiAgICAgICAgZmxvYXQgaW5wdXRzOnJvdGF0aW9uID0gJHsocm90YXRpb24gKiAoMTgwIC8gTWF0aC5QSSkpLnRvRml4ZWQob3B0aW9ucy5wcmVjaXNpb24pfVxyXG4gICAgICAgIGZsb2F0MiBpbnB1dHM6c2NhbGUgPSAke0J1aWxkVmVjdG9yMihyZXBlYXQpfVxyXG4gICAgICAgIGZsb2F0MiBpbnB1dHM6dHJhbnNsYXRpb24gPSAke0J1aWxkVmVjdG9yMihvZmZzZXQpfVxyXG4gICAgICAgIGZsb2F0MiBvdXRwdXRzOnJlc3VsdFxyXG4gICAgfVxyXG5cclxuICAgIGRlZiBTaGFkZXIgXCJUZXh0dXJlXyR7dGV4dHVyZS51bmlxdWVJZH1fJHttYXBUeXBlfVwiXHJcbiAgICB7XHJcbiAgICAgICAgdW5pZm9ybSB0b2tlbiBpbmZvOmlkID0gXCJVc2RVVlRleHR1cmVcIlxyXG4gICAgICAgIGFzc2V0IGlucHV0czpmaWxlID0gQHRleHR1cmVzL1RleHR1cmVfJHtpZH0ucG5nQFxyXG4gICAgICAgIGZsb2F0MiBpbnB1dHM6c3QuY29ubmVjdCA9IDwvTWF0ZXJpYWxzL01hdGVyaWFsXyR7bWF0ZXJpYWwudW5pcXVlSWR9L1RyYW5zZm9ybTJkXyR7bWFwVHlwZX0ub3V0cHV0czpyZXN1bHQ+XHJcbiAgICAgICAgJHtjb2xvciA/IFwiZmxvYXQ0IGlucHV0czpzY2FsZSA9IFwiICsgQnVpbGRDb2xvcjQoY29sb3IpIDogXCJcIn1cclxuICAgICAgICB0b2tlbiBpbnB1dHM6c291cmNlQ29sb3JTcGFjZSA9IFwiJHt0ZXh0dXJlLmdhbW1hU3BhY2UgPyBcInJhd1wiIDogXCJzUkdCXCJ9XCJcclxuICAgICAgICB0b2tlbiBpbnB1dHM6d3JhcFMgPSBcIiR7QnVpbGRXcmFwcGluZyh0ZXh0dXJlLndyYXBVKX1cIlxyXG4gICAgICAgIHRva2VuIGlucHV0czp3cmFwVCA9IFwiJHtCdWlsZFdyYXBwaW5nKHRleHR1cmUud3JhcFYpfVwiXHJcbiAgICAgICAgZmxvYXQgb3V0cHV0czpyXHJcbiAgICAgICAgZmxvYXQgb3V0cHV0czpnXHJcbiAgICAgICAgZmxvYXQgb3V0cHV0czpiXHJcbiAgICAgICAgZmxvYXQzIG91dHB1dHM6cmdiXHJcbiAgICAgICAgJHttYXRlcmlhbC5uZWVkQWxwaGFCbGVuZGluZygpID8gXCJmbG9hdCBvdXRwdXRzOmFcIiA6IFwiXCJ9XHJcbiAgICB9YDtcclxufVxyXG5cclxuZnVuY3Rpb24gRXh0cmFjdFRleHR1cmVJbmZvcm1hdGlvbnMobWF0ZXJpYWw6IE1hdGVyaWFsKSB7XHJcbiAgICBjb25zdCBjbGFzc05hbWUgPSBtYXRlcmlhbC5nZXRDbGFzc05hbWUoKTtcclxuXHJcbiAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xyXG4gICAgICAgIGNhc2UgXCJTdGFuZGFyZE1hdGVyaWFsXCI6XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkaWZmdXNlTWFwOiAobWF0ZXJpYWwgYXMgU3RhbmRhcmRNYXRlcmlhbCkuZGlmZnVzZVRleHR1cmUsXHJcbiAgICAgICAgICAgICAgICBkaWZmdXNlOiAobWF0ZXJpYWwgYXMgU3RhbmRhcmRNYXRlcmlhbCkuZGlmZnVzZUNvbG9yLFxyXG4gICAgICAgICAgICAgICAgYWxwaGFDdXRPZmY6IChtYXRlcmlhbCBhcyBTdGFuZGFyZE1hdGVyaWFsKS5hbHBoYUN1dE9mZixcclxuICAgICAgICAgICAgICAgIGVtaXNzaXZlTWFwOiAobWF0ZXJpYWwgYXMgU3RhbmRhcmRNYXRlcmlhbCkuZW1pc3NpdmVUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgZW1pc3NpdmU6IChtYXRlcmlhbCBhcyBTdGFuZGFyZE1hdGVyaWFsKS5lbWlzc2l2ZUNvbG9yLFxyXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzTWFwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgbm9ybWFsTWFwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgbWV0YWxuZXNzTWFwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzOiAxLFxyXG4gICAgICAgICAgICAgICAgbWV0YWxuZXNzOiAwLFxyXG4gICAgICAgICAgICAgICAgYW9NYXA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBhb01hcEludGVuc2l0eTogMCxcclxuICAgICAgICAgICAgICAgIGFscGhhTWFwOiAobWF0ZXJpYWwgYXMgU3RhbmRhcmRNYXRlcmlhbCkub3BhY2l0eVRleHR1cmUsXHJcbiAgICAgICAgICAgICAgICBpb3I6IDEsXHJcbiAgICAgICAgICAgICAgICBjbGVhckNvYXQ6IDAsXHJcbiAgICAgICAgICAgICAgICBjbGVhckNvYXRNYXA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBjbGVhckNvYXRSb3VnaG5lc3M6IDAsXHJcbiAgICAgICAgICAgICAgICBjbGVhckNvYXRSb3VnaG5lc3NNYXA6IG51bGwsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgY2FzZSBcIlBCUk1hdGVyaWFsXCI6XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkaWZmdXNlTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmFsYmVkb1RleHR1cmUsXHJcbiAgICAgICAgICAgICAgICBkaWZmdXNlOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmFsYmVkb0NvbG9yLFxyXG4gICAgICAgICAgICAgICAgYWxwaGFDdXRPZmY6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkuYWxwaGFDdXRPZmYsXHJcbiAgICAgICAgICAgICAgICBlbWlzc2l2ZU1hcDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5lbWlzc2l2ZVRleHR1cmUsXHJcbiAgICAgICAgICAgICAgICBlbWlzc2l2ZTogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5lbWlzc2l2ZUNvbG9yLFxyXG4gICAgICAgICAgICAgICAgbm9ybWFsTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmJ1bXBUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLm1ldGFsbGljVGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIHJvdWdobmVzc0NoYW5uZWw6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkudXNlUm91Z2huZXNzRnJvbU1ldGFsbGljVGV4dHVyZUFscGhhID8gXCJhXCIgOiBcImdcIixcclxuICAgICAgICAgICAgICAgIHJvdWdobmVzczogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5yb3VnaG5lc3MgfHwgMSxcclxuICAgICAgICAgICAgICAgIG1ldGFsbmVzc01hcDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5tZXRhbGxpY1RleHR1cmUsXHJcbiAgICAgICAgICAgICAgICBtZXRhbG5lc3NDaGFubmVsOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLnVzZU1ldGFsbG5lc3NGcm9tTWV0YWxsaWNUZXh0dXJlQmx1ZSA/IFwiYlwiIDogXCJyXCIsXHJcbiAgICAgICAgICAgICAgICBtZXRhbG5lc3M6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkubWV0YWxsaWMgfHwgMCxcclxuICAgICAgICAgICAgICAgIGFvTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmFtYmllbnRUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgYW9NYXBDaGFubmVsOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLnVzZUFtYmllbnRJbkdyYXlTY2FsZSA/IFwiclwiIDogXCJyZ2JcIixcclxuICAgICAgICAgICAgICAgIGFvTWFwSW50ZW5zaXR5OiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmFtYmllbnRUZXh0dXJlU3RyZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBhbHBoYU1hcDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5vcGFjaXR5VGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIGlvcjogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5pbmRleE9mUmVmcmFjdGlvbixcclxuICAgICAgICAgICAgICAgIGNsZWFyQ29hdDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5jbGVhckNvYXQuaW50ZW5zaXR5LFxyXG4gICAgICAgICAgICAgICAgY2xlYXJDb2F0TWFwOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmNsZWFyQ29hdC50ZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgY2xlYXJDb2F0Um91Z2huZXNzOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmNsZWFyQ29hdC5yb3VnaG5lc3MsXHJcbiAgICAgICAgICAgICAgICBjbGVhckNvYXRSb3VnaG5lc3NNYXA6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkuY2xlYXJDb2F0LnVzZVJvdWdobmVzc0Zyb21NYWluVGV4dHVyZVxyXG4gICAgICAgICAgICAgICAgICAgID8gKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5jbGVhckNvYXQudGV4dHVyZVxyXG4gICAgICAgICAgICAgICAgICAgIDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5jbGVhckNvYXQudGV4dHVyZVJvdWdobmVzcyxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICBjYXNlIFwiUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbFwiOlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZGlmZnVzZU1hcDogKG1hdGVyaWFsIGFzIFBCUk1ldGFsbGljUm91Z2huZXNzTWF0ZXJpYWwpLmJhc2VUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgZGlmZnVzZTogKG1hdGVyaWFsIGFzIFBCUk1ldGFsbGljUm91Z2huZXNzTWF0ZXJpYWwpLmJhc2VDb2xvcixcclxuICAgICAgICAgICAgICAgIGFscGhhQ3V0T2ZmOiAobWF0ZXJpYWwgYXMgUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbCkuYWxwaGFDdXRPZmYsXHJcbiAgICAgICAgICAgICAgICBlbWlzc2l2ZU1hcDogKG1hdGVyaWFsIGFzIFBCUk1ldGFsbGljUm91Z2huZXNzTWF0ZXJpYWwpLmVtaXNzaXZlVGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIGVtaXNzaXZlOiAobWF0ZXJpYWwgYXMgUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbCkuZW1pc3NpdmVDb2xvcixcclxuICAgICAgICAgICAgICAgIG5vcm1hbE1hcDogKG1hdGVyaWFsIGFzIFBCUk1ldGFsbGljUm91Z2huZXNzTWF0ZXJpYWwpLm5vcm1hbFRleHR1cmUsXHJcbiAgICAgICAgICAgICAgICByb3VnaG5lc3NNYXA6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkubWV0YWxsaWNUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzQ2hhbm5lbDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS51c2VSb3VnaG5lc3NGcm9tTWV0YWxsaWNUZXh0dXJlQWxwaGEgPyBcImFcIiA6IFwiZ1wiLFxyXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzOiAobWF0ZXJpYWwgYXMgUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbCkucm91Z2huZXNzIHx8IDEsXHJcbiAgICAgICAgICAgICAgICBtZXRhbG5lc3NNYXA6IChtYXRlcmlhbCBhcyBQQlJNYXRlcmlhbCkubWV0YWxsaWNUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgbWV0YWxuZXNzQ2hhbm5lbDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS51c2VNZXRhbGxuZXNzRnJvbU1ldGFsbGljVGV4dHVyZUJsdWUgPyBcImJcIiA6IFwiclwiLFxyXG4gICAgICAgICAgICAgICAgbWV0YWxuZXNzOiAobWF0ZXJpYWwgYXMgUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbCkubWV0YWxsaWMgfHwgMCxcclxuICAgICAgICAgICAgICAgIGFvTWFwOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmFtYmllbnRUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgYW9NYXBDaGFubmVsOiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLnVzZUFtYmllbnRJbkdyYXlTY2FsZSA/IFwiclwiIDogXCJyZ2JcIixcclxuICAgICAgICAgICAgICAgIGFvTWFwSW50ZW5zaXR5OiAobWF0ZXJpYWwgYXMgUEJSTWF0ZXJpYWwpLmFtYmllbnRUZXh0dXJlU3RyZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBhbHBoYU1hcDogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5vcGFjaXR5VGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIGlvcjogKG1hdGVyaWFsIGFzIFBCUk1hdGVyaWFsKS5pbmRleE9mUmVmcmFjdGlvbixcclxuICAgICAgICAgICAgICAgIGNsZWFyQ29hdDogKG1hdGVyaWFsIGFzIFBCUk1ldGFsbGljUm91Z2huZXNzTWF0ZXJpYWwpLmNsZWFyQ29hdC5pbnRlbnNpdHksXHJcbiAgICAgICAgICAgICAgICBjbGVhckNvYXRNYXA6IChtYXRlcmlhbCBhcyBQQlJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsKS5jbGVhckNvYXQudGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIGNsZWFyQ29hdFJvdWdobmVzczogKG1hdGVyaWFsIGFzIFBCUk1ldGFsbGljUm91Z2huZXNzTWF0ZXJpYWwpLmNsZWFyQ29hdC5yb3VnaG5lc3MsXHJcbiAgICAgICAgICAgICAgICBjbGVhckNvYXRSb3VnaG5lc3NNYXA6IChtYXRlcmlhbCBhcyBQQlJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsKS5jbGVhckNvYXQudXNlUm91Z2huZXNzRnJvbU1haW5UZXh0dXJlXHJcbiAgICAgICAgICAgICAgICAgICAgPyAobWF0ZXJpYWwgYXMgUEJSTWV0YWxsaWNSb3VnaG5lc3NNYXRlcmlhbCkuY2xlYXJDb2F0LnRleHR1cmVcclxuICAgICAgICAgICAgICAgICAgICA6IChtYXRlcmlhbCBhcyBQQlJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsKS5jbGVhckNvYXQudGV4dHVyZVJvdWdobmVzcyxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZGlmZnVzZU1hcDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGRpZmZ1c2U6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBlbWlzc2l2ZU1hcDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGVtaXNzZW1pc3NpdmVpdmVDb2xvcjogbnVsbCxcclxuICAgICAgICAgICAgICAgIG5vcm1hbE1hcDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHJvdWdobmVzc01hcDogbnVsbCxcclxuICAgICAgICAgICAgICAgIG1ldGFsbmVzc01hcDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGFscGhhQ3V0T2ZmOiAwLFxyXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzOiAwLFxyXG4gICAgICAgICAgICAgICAgbWV0YWxuZXNzOiAwLFxyXG4gICAgICAgICAgICAgICAgYW9NYXA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBhb01hcEludGVuc2l0eTogMCxcclxuICAgICAgICAgICAgICAgIGFscGhhTWFwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgaW9yOiAxLFxyXG4gICAgICAgICAgICAgICAgY2xlYXJDb2F0OiAwLFxyXG4gICAgICAgICAgICAgICAgY2xlYXJDb2F0TWFwOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgY2xlYXJDb2F0Um91Z2huZXNzOiAwLFxyXG4gICAgICAgICAgICAgICAgY2xlYXJDb2F0Um91Z2huZXNzTWFwOiBudWxsLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBCdWlsZE1hdGVyaWFsKG1hdGVyaWFsOiBNYXRlcmlhbCwgdGV4dHVyZVRvRXhwb3J0czogeyBba2V5OiBzdHJpbmddOiBCYXNlVGV4dHVyZSB9LCBvcHRpb25zOiBJVVNEWkV4cG9ydE9wdGlvbnMpIHtcclxuICAgIC8vIGh0dHBzOi8vZ3JhcGhpY3MucGl4YXIuY29tL3VzZC9kb2NzL1VzZFByZXZpZXdTdXJmYWNlLVByb3Bvc2FsLmh0bWxcclxuXHJcbiAgICBjb25zdCBwYWQgPSBcIlx0XHRcdFwiO1xyXG4gICAgY29uc3QgaW5wdXRzID0gW107XHJcbiAgICBjb25zdCBzYW1wbGVycyA9IFtdO1xyXG5cclxuICAgIGNvbnN0IHtcclxuICAgICAgICBkaWZmdXNlTWFwLFxyXG4gICAgICAgIGRpZmZ1c2UsXHJcbiAgICAgICAgYWxwaGFDdXRPZmYsXHJcbiAgICAgICAgZW1pc3NpdmVNYXAsXHJcbiAgICAgICAgZW1pc3NpdmUsXHJcbiAgICAgICAgbm9ybWFsTWFwLFxyXG4gICAgICAgIHJvdWdobmVzc01hcCxcclxuICAgICAgICByb3VnaG5lc3NDaGFubmVsLFxyXG4gICAgICAgIHJvdWdobmVzcyxcclxuICAgICAgICBtZXRhbG5lc3NNYXAsXHJcbiAgICAgICAgbWV0YWxuZXNzQ2hhbm5lbCxcclxuICAgICAgICBtZXRhbG5lc3MsXHJcbiAgICAgICAgYW9NYXAsXHJcbiAgICAgICAgYW9NYXBDaGFubmVsLFxyXG4gICAgICAgIGFvTWFwSW50ZW5zaXR5LFxyXG4gICAgICAgIGFscGhhTWFwLFxyXG4gICAgICAgIGlvcixcclxuICAgICAgICBjbGVhckNvYXQsXHJcbiAgICAgICAgY2xlYXJDb2F0TWFwLFxyXG4gICAgICAgIGNsZWFyQ29hdFJvdWdobmVzcyxcclxuICAgICAgICBjbGVhckNvYXRSb3VnaG5lc3NNYXAsXHJcbiAgICB9ID0gRXh0cmFjdFRleHR1cmVJbmZvcm1hdGlvbnMobWF0ZXJpYWwpO1xyXG5cclxuICAgIGlmIChkaWZmdXNlTWFwICE9PSBudWxsKSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWNvbG9yM2YgaW5wdXRzOmRpZmZ1c2VDb2xvci5jb25uZWN0ID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH0vVGV4dHVyZV8ke2RpZmZ1c2VNYXAudW5pcXVlSWR9X2RpZmZ1c2Uub3V0cHV0czpyZ2I+YCk7XHJcblxyXG4gICAgICAgIGlmIChtYXRlcmlhbC5uZWVkQWxwaGFCbGVuZGluZygpKSB7XHJcbiAgICAgICAgICAgIGlucHV0cy5wdXNoKGAke3BhZH1mbG9hdCBpbnB1dHM6b3BhY2l0eS5jb25uZWN0ID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH0vVGV4dHVyZV8ke2RpZmZ1c2VNYXAudW5pcXVlSWR9X2RpZmZ1c2Uub3V0cHV0czphPmApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWF0ZXJpYWwubmVlZEFscGhhVGVzdGluZygpKSB7XHJcbiAgICAgICAgICAgIGlucHV0cy5wdXNoKGAke3BhZH1mbG9hdCBpbnB1dHM6b3BhY2l0eS5jb25uZWN0ID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH0vVGV4dHVyZV8ke2RpZmZ1c2VNYXAudW5pcXVlSWR9X2RpZmZ1c2Uub3V0cHV0czphPmApO1xyXG4gICAgICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOm9wYWNpdHlUaHJlc2hvbGQgPSAke2FscGhhQ3V0T2ZmfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2FtcGxlcnMucHVzaChCdWlsZFRleHR1cmUoZGlmZnVzZU1hcCBhcyBUZXh0dXJlLCBtYXRlcmlhbCwgXCJkaWZmdXNlXCIsIGRpZmZ1c2UsIHRleHR1cmVUb0V4cG9ydHMsIG9wdGlvbnMpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWNvbG9yM2YgaW5wdXRzOmRpZmZ1c2VDb2xvciA9ICR7QnVpbGRDb2xvcihkaWZmdXNlIHx8IENvbG9yMy5XaGl0ZSgpKX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW1pc3NpdmVNYXAgIT09IG51bGwpIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9Y29sb3IzZiBpbnB1dHM6ZW1pc3NpdmVDb2xvci5jb25uZWN0ID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH0vVGV4dHVyZV8ke2VtaXNzaXZlTWFwLnVuaXF1ZUlkfV9lbWlzc2l2ZS5vdXRwdXRzOnJnYj5gKTtcclxuXHJcbiAgICAgICAgc2FtcGxlcnMucHVzaChCdWlsZFRleHR1cmUoZW1pc3NpdmVNYXAgYXMgVGV4dHVyZSwgbWF0ZXJpYWwsIFwiZW1pc3NpdmVcIiwgZW1pc3NpdmUsIHRleHR1cmVUb0V4cG9ydHMsIG9wdGlvbnMpKTtcclxuICAgIH0gZWxzZSBpZiAoZW1pc3NpdmUgJiYgZW1pc3NpdmUudG9MdW1pbmFuY2UoKSA+IDApIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9Y29sb3IzZiBpbnB1dHM6ZW1pc3NpdmVDb2xvciA9ICR7QnVpbGRDb2xvcihlbWlzc2l2ZSl9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5vcm1hbE1hcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlucHV0cy5wdXNoKGAke3BhZH1ub3JtYWwzZiBpbnB1dHM6bm9ybWFsLmNvbm5lY3QgPSA8L01hdGVyaWFscy9NYXRlcmlhbF8ke21hdGVyaWFsLnVuaXF1ZUlkfS9UZXh0dXJlXyR7bm9ybWFsTWFwLnVuaXF1ZUlkfV9ub3JtYWwub3V0cHV0czpyZ2I+YCk7XHJcblxyXG4gICAgICAgIHNhbXBsZXJzLnB1c2goQnVpbGRUZXh0dXJlKG5vcm1hbE1hcCBhcyBUZXh0dXJlLCBtYXRlcmlhbCwgXCJub3JtYWxcIiwgbnVsbCwgdGV4dHVyZVRvRXhwb3J0cywgb3B0aW9ucykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhb01hcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlucHV0cy5wdXNoKGAke3BhZH1mbG9hdCBpbnB1dHM6b2NjbHVzaW9uLmNvbm5lY3QgPSA8L01hdGVyaWFscy9NYXRlcmlhbF8ke21hdGVyaWFsLnVuaXF1ZUlkfS9UZXh0dXJlXyR7YW9NYXAudW5pcXVlSWR9X29jY2x1c2lvbi5vdXRwdXRzOiR7YW9NYXBDaGFubmVsfT5gKTtcclxuXHJcbiAgICAgICAgc2FtcGxlcnMucHVzaChCdWlsZFRleHR1cmUoYW9NYXAgYXMgVGV4dHVyZSwgbWF0ZXJpYWwsIFwib2NjbHVzaW9uXCIsIG5ldyBDb2xvcjMoYW9NYXBJbnRlbnNpdHksIGFvTWFwSW50ZW5zaXR5LCBhb01hcEludGVuc2l0eSksIHRleHR1cmVUb0V4cG9ydHMsIG9wdGlvbnMpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm91Z2huZXNzTWFwICE9PSBudWxsKSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWZsb2F0IGlucHV0czpyb3VnaG5lc3MuY29ubmVjdCA9IDwvTWF0ZXJpYWxzL01hdGVyaWFsXyR7bWF0ZXJpYWwudW5pcXVlSWR9L1RleHR1cmVfJHtyb3VnaG5lc3NNYXAudW5pcXVlSWR9X3JvdWdobmVzcy5vdXRwdXRzOiR7cm91Z2huZXNzQ2hhbm5lbH0+YCk7XHJcblxyXG4gICAgICAgIHNhbXBsZXJzLnB1c2goQnVpbGRUZXh0dXJlKHJvdWdobmVzc01hcCBhcyBUZXh0dXJlLCBtYXRlcmlhbCwgXCJyb3VnaG5lc3NcIiwgbmV3IENvbG9yMyhyb3VnaG5lc3MsIHJvdWdobmVzcywgcm91Z2huZXNzKSwgdGV4dHVyZVRvRXhwb3J0cywgb3B0aW9ucykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOnJvdWdobmVzcyA9ICR7cm91Z2huZXNzfWApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtZXRhbG5lc3NNYXAgIT09IG51bGwpIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOm1ldGFsbGljLmNvbm5lY3QgPSA8L01hdGVyaWFscy9NYXRlcmlhbF8ke21hdGVyaWFsLnVuaXF1ZUlkfS9UZXh0dXJlXyR7bWV0YWxuZXNzTWFwLnVuaXF1ZUlkfV9tZXRhbGxpYy5vdXRwdXRzOiR7bWV0YWxuZXNzQ2hhbm5lbH0+YCk7XHJcblxyXG4gICAgICAgIHNhbXBsZXJzLnB1c2goQnVpbGRUZXh0dXJlKG1ldGFsbmVzc01hcCBhcyBUZXh0dXJlLCBtYXRlcmlhbCwgXCJtZXRhbGxpY1wiLCBuZXcgQ29sb3IzKG1ldGFsbmVzcywgbWV0YWxuZXNzLCBtZXRhbG5lc3MpLCB0ZXh0dXJlVG9FeHBvcnRzLCBvcHRpb25zKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlucHV0cy5wdXNoKGAke3BhZH1mbG9hdCBpbnB1dHM6bWV0YWxsaWMgPSAke21ldGFsbmVzc31gKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWxwaGFNYXAgIT09IG51bGwpIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOm9wYWNpdHkuY29ubmVjdCA9IDwvTWF0ZXJpYWxzL01hdGVyaWFsXyR7bWF0ZXJpYWwudW5pcXVlSWR9L1RleHR1cmVfJHthbHBoYU1hcC51bmlxdWVJZH1fb3BhY2l0eS5vdXRwdXRzOnI+YCk7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWZsb2F0IGlucHV0czpvcGFjaXR5VGhyZXNob2xkID0gMC4wMDAxYCk7XHJcblxyXG4gICAgICAgIHNhbXBsZXJzLnB1c2goQnVpbGRUZXh0dXJlKGFscGhhTWFwIGFzIFRleHR1cmUsIG1hdGVyaWFsLCBcIm9wYWNpdHlcIiwgbnVsbCwgdGV4dHVyZVRvRXhwb3J0cywgb3B0aW9ucykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOm9wYWNpdHkgPSAke21hdGVyaWFsLmFscGhhfWApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjbGVhckNvYXRNYXAgIT09IG51bGwpIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOmNsZWFyY29hdC5jb25uZWN0ID0gPC9NYXRlcmlhbHMvTWF0ZXJpYWxfJHttYXRlcmlhbC51bmlxdWVJZH0vVGV4dHVyZV8ke2NsZWFyQ29hdE1hcC51bmlxdWVJZH1fY2xlYXJjb2F0Lm91dHB1dHM6cj5gKTtcclxuICAgICAgICBzYW1wbGVycy5wdXNoKEJ1aWxkVGV4dHVyZShjbGVhckNvYXRNYXAgYXMgVGV4dHVyZSwgbWF0ZXJpYWwsIFwiY2xlYXJjb2F0XCIsIG5ldyBDb2xvcjMoY2xlYXJDb2F0LCBjbGVhckNvYXQsIGNsZWFyQ29hdCksIHRleHR1cmVUb0V4cG9ydHMsIG9wdGlvbnMpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goYCR7cGFkfWZsb2F0IGlucHV0czpjbGVhcmNvYXQgPSAke2NsZWFyQ29hdH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2xlYXJDb2F0Um91Z2huZXNzTWFwICE9PSBudWxsKSB7XHJcbiAgICAgICAgaW5wdXRzLnB1c2goXHJcbiAgICAgICAgICAgIGAke3BhZH1mbG9hdCBpbnB1dHM6Y2xlYXJjb2F0Um91Z2huZXNzLmNvbm5lY3QgPSA8L01hdGVyaWFscy9NYXRlcmlhbF8ke21hdGVyaWFsLnVuaXF1ZUlkfS9UZXh0dXJlXyR7Y2xlYXJDb2F0Um91Z2huZXNzTWFwLnVuaXF1ZUlkfV9jbGVhcmNvYXRSb3VnaG5lc3Mub3V0cHV0czpnPmBcclxuICAgICAgICApO1xyXG4gICAgICAgIHNhbXBsZXJzLnB1c2goXHJcbiAgICAgICAgICAgIEJ1aWxkVGV4dHVyZShcclxuICAgICAgICAgICAgICAgIGNsZWFyQ29hdFJvdWdobmVzc01hcCBhcyBUZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwsXHJcbiAgICAgICAgICAgICAgICBcImNsZWFyY29hdFJvdWdobmVzc1wiLFxyXG4gICAgICAgICAgICAgICAgbmV3IENvbG9yMyhjbGVhckNvYXRSb3VnaG5lc3MsIGNsZWFyQ29hdFJvdWdobmVzcywgY2xlYXJDb2F0Um91Z2huZXNzKSxcclxuICAgICAgICAgICAgICAgIHRleHR1cmVUb0V4cG9ydHMsXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpbnB1dHMucHVzaChgJHtwYWR9ZmxvYXQgaW5wdXRzOmNsZWFyY29hdFJvdWdobmVzcyA9ICR7Y2xlYXJDb2F0Um91Z2huZXNzfWApO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0cy5wdXNoKGAke3BhZH1mbG9hdCBpbnB1dHM6aW9yID0gJHtpb3J9YCk7XHJcblxyXG4gICAgcmV0dXJuIGBcclxuXHRkZWYgTWF0ZXJpYWwgXCJNYXRlcmlhbF8ke21hdGVyaWFsLnVuaXF1ZUlkfVwiXHJcblx0e1xyXG5cdFx0ZGVmIFNoYWRlciBcIlByZXZpZXdTdXJmYWNlXCJcclxuXHRcdHtcclxuXHRcdFx0dW5pZm9ybSB0b2tlbiBpbmZvOmlkID0gXCJVc2RQcmV2aWV3U3VyZmFjZVwiXHJcbiR7aW5wdXRzLmpvaW4oXCJcXG5cIil9XHJcblx0XHRcdGludCBpbnB1dHM6dXNlU3BlY3VsYXJXb3JrZmxvdyA9IDBcclxuXHRcdFx0dG9rZW4gb3V0cHV0czpzdXJmYWNlXHJcblx0XHR9XHJcblxyXG5cdFx0dG9rZW4gb3V0cHV0czpzdXJmYWNlLmNvbm5lY3QgPSA8L01hdGVyaWFscy9NYXRlcmlhbF8ke21hdGVyaWFsLnVuaXF1ZUlkfS9QcmV2aWV3U3VyZmFjZS5vdXRwdXRzOnN1cmZhY2U+XHJcblxyXG4ke3NhbXBsZXJzLmpvaW4oXCJcXG5cIil9XHJcblxyXG5cdH1cclxuYDtcclxufVxyXG5cclxuZnVuY3Rpb24gQnVpbGRDYW1lcmEoY2FtZXJhOiBDYW1lcmEsIG9wdGlvbnM6IElVU0RaRXhwb3J0T3B0aW9ucykge1xyXG4gICAgY29uc3QgbmFtZSA9IFwiQ2FtZXJhX1wiICsgY2FtZXJhLnVuaXF1ZUlkO1xyXG4gICAgY29uc3QgbWF0cml4ID0gTWF0cml4LlJvdGF0aW9uWShNYXRoLlBJKS5tdWx0aXBseShjYW1lcmEuZ2V0V29ybGRNYXRyaXgoKSk7IC8vIHdvcmsgdG93YXJkcyBwb3NpdGl2ZSB6XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtID0gQnVpbGRNYXRyaXgobWF0cml4KTtcclxuXHJcbiAgICBpZiAoY2FtZXJhLm1vZGUgPT09IENvbnN0YW50cy5PUlRIT0dSQVBISUNfQ0FNRVJBKSB7XHJcbiAgICAgICAgcmV0dXJuIGBkZWYgQ2FtZXJhIFwiJHtuYW1lfVwiXHJcblx0XHR7XHJcblx0XHRcdG1hdHJpeDRkIHhmb3JtT3A6dHJhbnNmb3JtID0gJHt0cmFuc2Zvcm19XHJcblx0XHRcdHVuaWZvcm0gdG9rZW5bXSB4Zm9ybU9wT3JkZXIgPSBbXCJ4Zm9ybU9wOnRyYW5zZm9ybVwiXVxyXG5cclxuXHRcdFx0ZmxvYXQyIGNsaXBwaW5nUmFuZ2UgPSAoJHtjYW1lcmEubWluWi50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9LCAke2NhbWVyYS5tYXhaLnRvUHJlY2lzaW9uKG9wdGlvbnMucHJlY2lzaW9uKX0pXHJcblx0XHRcdGZsb2F0IGhvcml6b250YWxBcGVydHVyZSA9ICR7KChNYXRoLmFicyhjYW1lcmEub3J0aG9MZWZ0IHx8IDEpICsgTWF0aC5hYnMoY2FtZXJhLm9ydGhvUmlnaHQgfHwgMSkpICogMTApLnRvUHJlY2lzaW9uKG9wdGlvbnMucHJlY2lzaW9uKX1cclxuXHRcdFx0ZmxvYXQgdmVydGljYWxBcGVydHVyZSA9ICR7KChNYXRoLmFicyhjYW1lcmEub3J0aG9Ub3AgfHwgMSkgKyBNYXRoLmFicyhjYW1lcmEub3J0aG9Cb3R0b20gfHwgMSkpICogMTApLnRvUHJlY2lzaW9uKG9wdGlvbnMucHJlY2lzaW9uKX1cclxuXHRcdFx0dG9rZW4gcHJvamVjdGlvbiA9IFwib3J0aG9ncmFwaGljXCJcclxuXHRcdH1cclxuXHRcclxuXHRgO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBhc3BlY3QgPSBjYW1lcmEuZ2V0RW5naW5lKCkuZ2V0QXNwZWN0UmF0aW8oY2FtZXJhKTtcclxuICAgICAgICBjb25zdCBzZW5zb3J3aWR0aCA9IG9wdGlvbnMuY2FtZXJhU2Vuc29yV2lkdGggfHwgMzU7XHJcblxyXG4gICAgICAgIHJldHVybiBgZGVmIENhbWVyYSBcIiR7bmFtZX1cIlxyXG5cdFx0e1xyXG5cdFx0XHRtYXRyaXg0ZCB4Zm9ybU9wOnRyYW5zZm9ybSA9ICR7dHJhbnNmb3JtfVxyXG5cdFx0XHR1bmlmb3JtIHRva2VuW10geGZvcm1PcE9yZGVyID0gW1wieGZvcm1PcDp0cmFuc2Zvcm1cIl1cclxuXHJcblx0XHRcdGZsb2F0MiBjbGlwcGluZ1JhbmdlID0gKCR7Y2FtZXJhLm1pbloudG9QcmVjaXNpb24ob3B0aW9ucy5wcmVjaXNpb24pfSwgJHtjYW1lcmEubWF4Wi50b1ByZWNpc2lvbihvcHRpb25zLnByZWNpc2lvbil9KVxyXG5cdFx0XHRmbG9hdCBmb2NhbExlbmd0aCA9ICR7KHNlbnNvcndpZHRoIC8gKDIgKiBNYXRoLnRhbihjYW1lcmEuZm92ICogMC41KSkpLnRvUHJlY2lzaW9uKG9wdGlvbnMucHJlY2lzaW9uKX1cclxuICAgICAgICAgICAgdG9rZW4gcHJvamVjdGlvbiA9IFwicGVyc3BlY3RpdmVcIlxyXG5cdFx0XHRmbG9hdCBob3Jpem9udGFsQXBlcnR1cmUgPSAkeyhzZW5zb3J3aWR0aCAqIGFzcGVjdCkudG9QcmVjaXNpb24ob3B0aW9ucy5wcmVjaXNpb24pfVxyXG5cdFx0XHRmbG9hdCB2ZXJ0aWNhbEFwZXJ0dXJlID0gJHsoc2Vuc29yd2lkdGggLyBhc3BlY3QpLnRvUHJlY2lzaW9uKG9wdGlvbnMucHJlY2lzaW9uKX0gICAgICAgICAgICBcclxuXHRcdH1cclxuXHRcclxuXHRgO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICpcclxuICogQHBhcmFtIHNjZW5lIHNjZW5lIHRvIGV4cG9ydFxyXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgZXhwb3J0XHJcbiAqIEBwYXJhbSBtZXNoUHJlZGljYXRlIHByZWRpY2F0ZSB0byBmaWx0ZXIgdGhlIG1lc2hlcyB0byBleHBvcnRcclxuICogQHJldHVybnMgYSB1aW50OCBhcnJheSBjb250YWluaW5nIHRoZSBVU0RaIGZpbGVcclxuICogQHNlZSBbU2ltcGxlIHNwaGVyZV0oaHR0cHM6Ly9wbGF5Z3JvdW5kLmJhYnlsb25qcy5jb20vI0gyRzVYVyM2KVxyXG4gKiBAc2VlIFtSZWQgc3BoZXJlXShodHRwczovL3BsYXlncm91bmQuYmFieWxvbmpzLmNvbS8jSDJHNVhXIzcpXHJcbiAqIEBzZWUgW0Jvb21ib3hdKGh0dHBzOi8vcGxheWdyb3VuZC5iYWJ5bG9uanMuY29tLyM1TjNSV0sjNSlcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBVU0RaRXhwb3J0QXN5bmMoc2NlbmU6IFNjZW5lLCBvcHRpb25zOiBQYXJ0aWFsPElVU0RaRXhwb3J0T3B0aW9ucz4sIG1lc2hQcmVkaWNhdGU/OiAobTogTWVzaCkgPT4gYm9vbGVhbik6IFByb21pc2U8VWludDhBcnJheT4ge1xyXG4gICAgY29uc3QgbG9jYWxPcHRpb25zID0ge1xyXG4gICAgICAgIGZmbGF0ZVVybDogXCJodHRwczovL3VucGtnLmNvbS9mZmxhdGVAMC44LjJcIixcclxuICAgICAgICBpbmNsdWRlQW5jaG9yaW5nUHJvcGVydGllczogdHJ1ZSxcclxuICAgICAgICBhbmNob3JpbmdUeXBlOiBcInBsYW5lXCIsXHJcbiAgICAgICAgcGxhbmVBbmNob3JpbmdBbGlnbm1lbnQ6IFwiaG9yaXpvbnRhbFwiLFxyXG4gICAgICAgIG1vZGVsRmlsZU5hbWU6IFwibW9kZWwudXNkYVwiLFxyXG4gICAgICAgIHByZWNpc2lvbjogNSxcclxuICAgICAgICBleHBvcnRDYW1lcmE6IGZhbHNlLFxyXG4gICAgICAgIGNhbWVyYVNlbnNvcldpZHRoOiAzNSxcclxuICAgICAgICAuLi5vcHRpb25zLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIGZmbGF0ZSBsaWJyYXJ5XHJcbiAgICBpZiAodHlwZW9mIGZmbGF0ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIGF3YWl0IFRvb2xzLkxvYWRTY3JpcHRBc3luYyhsb2NhbE9wdGlvbnMuZmZsYXRlVXJsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTdGFydCB0aGUgZXhwb3J0XHJcbiAgICBjb25zdCBmaWxlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICAgIC8vIG1vZGVsIGZpbGUgc2hvdWxkIGJlIGZpcnN0IGluIFVTRFogYXJjaGl2ZSBzbyB3ZSBpbml0IGl0IGhlcmVcclxuICAgIGZpbGVzW2xvY2FsT3B0aW9ucy5tb2RlbEZpbGVOYW1lXSA9IG51bGw7XHJcblxyXG4gICAgbGV0IG91dHB1dCA9IEJ1aWxkSGVhZGVyKCk7XHJcbiAgICBvdXRwdXQgKz0gQnVpbGRTY2VuZVN0YXJ0KGxvY2FsT3B0aW9ucyk7XHJcblxyXG4gICAgY29uc3QgbWF0ZXJpYWxUb0V4cG9ydHM6IHsgW2tleTogc3RyaW5nXTogTWF0ZXJpYWwgfSA9IHt9O1xyXG5cclxuICAgIC8vIE1lc2hlc1xyXG4gICAgZm9yIChjb25zdCBhYnN0cmFjdE1lc2ggb2Ygc2NlbmUubWVzaGVzKSB7XHJcbiAgICAgICAgaWYgKGFic3RyYWN0TWVzaC5nZXRUb3RhbFZlcnRpY2VzKCkgPT09IDApIHtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1lc2ggPSBhYnN0cmFjdE1lc2ggYXMgTWVzaDtcclxuICAgICAgICBjb25zdCBnZW9tZXRyeSA9IG1lc2guZ2VvbWV0cnk7XHJcbiAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSBtZXNoLm1hdGVyaWFsO1xyXG5cclxuICAgICAgICBpZiAoIW1hdGVyaWFsIHx8ICFnZW9tZXRyeSB8fCAobWVzaFByZWRpY2F0ZSAmJiAhbWVzaFByZWRpY2F0ZShtZXNoKSkpIHtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdXBwb3J0ZWRNYXRlcmlhbHMgPSBbXCJTdGFuZGFyZE1hdGVyaWFsXCIsIFwiUEJSTWF0ZXJpYWxcIiwgXCJQQlJNZXRhbGxpY1JvdWdobmVzc01hdGVyaWFsXCJdO1xyXG5cclxuICAgICAgICBpZiAoc3VwcG9ydGVkTWF0ZXJpYWxzLmluZGV4T2YobWF0ZXJpYWwuZ2V0Q2xhc3NOYW1lKCkpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCBnZW9tZXRyeUZpbGVOYW1lID0gXCJnZW9tZXRyaWVzL0dlb21ldHJ5X1wiICsgZ2VvbWV0cnkudW5pcXVlSWQgKyBcIi51c2RhXCI7XHJcblxyXG4gICAgICAgICAgICBpZiAoIShnZW9tZXRyeUZpbGVOYW1lIGluIGZpbGVzKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzaE9iamVjdCA9IEJ1aWxkTWVzaE9iamVjdChnZW9tZXRyeSwgbG9jYWxPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGZpbGVzW2dlb21ldHJ5RmlsZU5hbWVdID0gQnVpbGRVU0RGaWxlQXNTdHJpbmcobWVzaE9iamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghKG1hdGVyaWFsLnVuaXF1ZUlkIGluIG1hdGVyaWFsVG9FeHBvcnRzKSkge1xyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxUb0V4cG9ydHNbbWF0ZXJpYWwudW5pcXVlSWRdID0gbWF0ZXJpYWw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG91dHB1dCArPSBCdWlsZFhmb3JtKG1lc2gpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFRvb2xzLldhcm4oXCJVU0RaRXhwb3J0QXN5bmMgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG1hdGVyaWFsIHR5cGU6IFwiICsgbWF0ZXJpYWwuZ2V0Q2xhc3NOYW1lKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDYW1lcmFcclxuICAgIGlmIChzY2VuZS5hY3RpdmVDYW1lcmEgJiYgbG9jYWxPcHRpb25zLmV4cG9ydENhbWVyYSkge1xyXG4gICAgICAgIG91dHB1dCArPSBCdWlsZENhbWVyYShzY2VuZS5hY3RpdmVDYW1lcmEsIGxvY2FsT3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xvc2Ugc2NlbmVcclxuICAgIG91dHB1dCArPSBCdWlsZFNjZW5lRW5kKCk7XHJcblxyXG4gICAgLy8gTWF0ZXJpYWxzXHJcbiAgICBjb25zdCB0ZXh0dXJlVG9FeHBvcnRzOiB7IFtrZXk6IHN0cmluZ106IEJhc2VUZXh0dXJlIH0gPSB7fTtcclxuICAgIG91dHB1dCArPSBCdWlsZE1hdGVyaWFscyhtYXRlcmlhbFRvRXhwb3J0cywgdGV4dHVyZVRvRXhwb3J0cywgbG9jYWxPcHRpb25zKTtcclxuXHJcbiAgICAvLyBDb21wcmVzc1xyXG4gICAgZmlsZXNbbG9jYWxPcHRpb25zLm1vZGVsRmlsZU5hbWVdID0gZmZsYXRlLnN0clRvVTgob3V0cHV0KTtcclxuXHJcbiAgICAvLyBUZXh0dXJlc1xyXG4gICAgZm9yIChjb25zdCBpZCBpbiB0ZXh0dXJlVG9FeHBvcnRzKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IHRleHR1cmVUb0V4cG9ydHNbaWRdO1xyXG5cclxuICAgICAgICBjb25zdCBzaXplID0gdGV4dHVyZS5nZXRTaXplKCk7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZURhdGEgPSBhd2FpdCB0ZXh0dXJlLnJlYWRQaXhlbHMoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0ZXh0dXJlRGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUZXh0dXJlIGRhdGEgaXMgbm90IGF2YWlsYWJsZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgRHVtcFRvb2xzLkR1bXBEYXRhQXN5bmMoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIHRleHR1cmVEYXRhLCBcImltYWdlL3BuZ1wiLCB1bmRlZmluZWQsIGZhbHNlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgZmlsZXNbYHRleHR1cmVzL1RleHR1cmVfJHtpZH0ucG5nYF0gPSBuZXcgVWludDhBcnJheShmaWxlQ29udGVudCBhcyBBcnJheUJ1ZmZlcikuc2xpY2UoKTsgLy8gVGhpcyBpcyB0byBhdm9pZCBnZXR0aW5nIGEgbGluayBhbmQgbm90IGEgY29weVxyXG4gICAgfVxyXG5cclxuICAgIC8vIDY0IGJ5dGUgYWxpZ25tZW50XHJcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vMTAxYXJyb3d6L2ZmbGF0ZS9pc3N1ZXMvMzkjaXNzdWVjb21tZW50LTc3NzI2MzEwOVxyXG5cclxuICAgIGxldCBvZmZzZXQgPSAwO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgaW4gZmlsZXMpIHtcclxuICAgICAgICBjb25zdCBmaWxlID0gZmlsZXNbZmlsZW5hbWVdO1xyXG4gICAgICAgIGlmICghZmlsZSkge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaGVhZGVyU2l6ZSA9IDM0ICsgZmlsZW5hbWUubGVuZ3RoO1xyXG5cclxuICAgICAgICBvZmZzZXQgKz0gaGVhZGVyU2l6ZTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0TW9kNjQgPSBvZmZzZXQgJiA2MztcclxuXHJcbiAgICAgICAgaWYgKG9mZnNldE1vZDY0ICE9PSA0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhZExlbmd0aCA9IDY0IC0gb2Zmc2V0TW9kNjQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSBuZXcgVWludDhBcnJheShwYWRMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG4gICAgICAgICAgICBmaWxlc1tmaWxlbmFtZV0gPSBbZmlsZSwgeyBleHRyYTogeyAxMjM0NTogcGFkZGluZyB9IH1dO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb2Zmc2V0ID0gZmlsZS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZmbGF0ZS56aXBTeW5jKGZpbGVzLCB7IGxldmVsOiAwIH0pO1xyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmltcG9ydCAqIGFzIFNlcmlhbGl6ZXJzIGZyb20gXCJzZXJpYWxpemVycy9VU0RaL2luZGV4XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBVTUQgbW9kdWxlLlxyXG4gKiBUaGUgZW50cnkgcG9pbnQgZm9yIGEgZnV0dXJlIEVTTSBwYWNrYWdlIHNob3VsZCBiZSBpbmRleC50c1xyXG4gKi9cclxuY29uc3QgZ2xvYmFsT2JqZWN0ID0gdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XHJcbmlmICh0eXBlb2YgZ2xvYmFsT2JqZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICBmb3IgKGNvbnN0IHNlcmlhbGl6ZXIgaW4gU2VyaWFsaXplcnMpIHtcclxuICAgICAgICAoPGFueT5nbG9iYWxPYmplY3QpLkJBQllMT05bc2VyaWFsaXplcl0gPSAoPGFueT5TZXJpYWxpemVycylbc2VyaWFsaXplcl07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCAqIGZyb20gXCJzZXJpYWxpemVycy9VU0RaL2luZGV4XCI7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9iYWJ5bG9uanNfTWlzY19maWxlVG9vbHNfXzsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgKiBhcyBzZXJpYWxpemVycyBmcm9tIFwiQGx0cy9zZXJpYWxpemVycy9sZWdhY3kvbGVnYWN5LXVzZHpTZXJpYWxpemVyXCI7XG5leHBvcnQgeyBzZXJpYWxpemVycyB9O1xuZXhwb3J0IGRlZmF1bHQgc2VyaWFsaXplcnM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("babylonjs")):"function"==typeof define&&define.amd?define("babylonjs-serializers",["babylonjs"],e):"object"==typeof exports?exports["babylonjs-serializers"]=e(require("babylonjs")):t.SERIALIZERS=e(t.BABYLON)}("undefined"!=typeof self?self:"undefined"!=typeof global?global:this,(t=>(()=>{"use strict";var e={597:e=>{e.exports=t}},n={};function a(t){var o=n[t];if(void 0!==o)return o.exports;var r=n[t]={exports:{}};return e[t](r,r.exports,a),r.exports}a.d=(t,e)=>{for(var n in e)a.o(e,n)&&!a.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),a.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),a.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var o={};a.d(o,{default:()=>C});var r={};a.r(r),a.d(r,{USDZExportAsync:()=>b});var i={};a.r(i),a.d(i,{USDZExportAsync:()=>b});var c=function(){return c=Object.assign||function(t){for(var e,n=1,a=arguments.length;n<a;n++)for(var o in e=arguments[n])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},c.apply(this,arguments)};Object.create,Object.create,"function"==typeof SuppressedError&&SuppressedError;var s=a(597);function u(t,e,n){void 0===n&&(n=3);for(var a=[],o=0;o<t.length/n;o++){var r=t[o*n],i=t[o*n+1],c=t[o*n+2];a.push("(".concat(r.toPrecision(e.precision),", ").concat(i.toPrecision(e.precision),", ").concat(c.toPrecision(e.precision),")"))}return a.join(", ")}function l(t,e){for(var n=[],a=0;a<t.length/2;a++){var o=t[2*a],r=t[2*a+1];n.push("(".concat(o.toPrecision(e.precision),", ").concat((1-r).toPrecision(e.precision),")"))}return n.join(", ")}function p(t,e){var n=function(t,e){var n=t.getVerticesData(s.VertexBuffer.PositionKind),a=t.getVerticesData(s.VertexBuffer.PositionKind);if(n&&a)return'\n\tdef Mesh "'.concat("Geometry",'"\n\t{\n\t\tint[] faceVertexCounts = [').concat(function(t){var e,n=(null===(e=t.getIndices())||void 0===e?void 0:e.length)?t.getTotalIndices():t.getTotalVertices();return Array(n/3).fill(3).join(", ")}(t),"]\n\t\tint[] faceVertexIndices = [").concat(function(t){var e=t.getIndices(),n=[];if(null!==e)for(var a=0;a<e.length;a++)n.push(e[a]);else{var o=t.getTotalVertices();for(a=0;a<o;a++)n.push(a)}return n.join(", ")}(t),"]\n\t\tnormal3f[] normals = [").concat(u(a,e),'] (\n\t\t\tinterpolation = "vertex"\n\t\t)\n\t\tpoint3f[] points = [').concat(u(n,e),"]\n ").concat(function(t,e){for(var n="",a=0;a<4;a++){var o=a>0?a:"",r=t.getVerticesData(s.VertexBuffer.UVKind+(o||""));r&&(n+="\n\t\ttexCoord2f[] primvars:st".concat(o," = [").concat(l(r,e),'] (\n\t\t\tinterpolation = "vertex"\n\t\t)'))}var i=t.getVerticesData(s.VertexBuffer.ColorKind);return i&&(n+="\n\tcolor3f[] primvars:displayColor = [".concat(u(i,e,i.length/t.getTotalVertices()),'] (\n\t\tinterpolation = "vertex"\n\t\t)')),n}(t,e),'\n\t\tuniform token subdivisionScheme = "none"\n\t}\n')}(t,e);return'\n def "Geometry"\n {\n '.concat(n,"\n }\n ")}function f(t){var e='#usda 1.0\n (\n customLayerData = {\n string creator = "Babylon.js USDZExportAsync"\n }\n defaultPrim = "Root"\n metersPerUnit = 1\n upAxis = "Y"\n )';return e+=t,fflate.strToU8(e)}function d(t){var e=t.m;return"( ".concat(m(e,0),", ").concat(m(e,4),", ").concat(m(e,8),", ").concat(m(e,12)," )")}function m(t,e){return"(".concat(t[e+0],", ").concat(t[e+1],", ").concat(t[e+2],", ").concat(t[e+3],")")}function h(t){var e="Object_"+t.uniqueId,n=t.getWorldMatrix().clone();n.determinant()<0&&n.multiplyToRef(s.Matrix.Scaling(-1,1,1),n);var a=d(n);return'def Xform "'.concat(e,'" (\n\tprepend references = @./geometries/Geometry_').concat(t.geometry.uniqueId,'.usda@</Geometry>\n\tprepend apiSchemas = ["MaterialBindingAPI"]\n)\n{\n\tmatrix4d xformOp:transform = ').concat(a,'\n\tuniform token[] xformOpOrder = ["xformOp:transform"]\t\n\n rel material:binding = </Materials/Material_').concat(t.material.uniqueId,">\n}\n\n")}function g(t){switch(t){case s.Constants.TEXTURE_CLAMP_ADDRESSMODE:return"clamp";case s.Constants.TEXTURE_MIRROR_ADDRESSMODE:return"mirror";case s.Constants.TEXTURE_WRAP_ADDRESSMODE:default:return"repeat"}}function M(t){return"(".concat(t.x,", ").concat(t.y,")")}function v(t){return"(".concat(t.r,", ").concat(t.g,", ").concat(t.b,")")}function x(t,e,n,a,o,r){var i=t.getInternalTexture().uniqueId+"_"+t.invertY;o[i]=t;var c=t.coordinatesIndex>0?"st"+t.coordinatesIndex:"st",u=new s.Vector2(t.uScale,t.vScale),l=new s.Vector2(t.uOffset,t.vOffset),p=t.wAng,f=Math.sin(p),d=Math.cos(p);return l.y=1-l.y-u.y,l.x+=f*u.x,l.y+=(1-d)*u.y,'\n def Shader "PrimvarReader_'.concat(n,'"\n {\n uniform token info:id = "UsdPrimvarReader_float2"\n float2 inputs:fallback = (0.0, 0.0)\n token inputs:varname = "').concat(c,'"\n float2 outputs:result\n }\n\n def Shader "Transform2d_').concat(n,'"\n {\n uniform token info:id = "UsdTransform2d"\n token inputs:in.connect = </Materials/Material_').concat(e.uniqueId,"/PrimvarReader_").concat(n,".outputs:result>\n float inputs:rotation = ").concat((p*(180/Math.PI)).toFixed(r.precision),"\n float2 inputs:scale = ").concat(M(u),"\n float2 inputs:translation = ").concat(M(l),'\n float2 outputs:result\n }\n\n def Shader "Texture_').concat(t.uniqueId,"_").concat(n,'"\n {\n uniform token info:id = "UsdUVTexture"\n asset inputs:file = @textures/Texture_').concat(i,".png@\n float2 inputs:st.connect = </Materials/Material_").concat(e.uniqueId,"/Transform2d_").concat(n,".outputs:result>\n ").concat(a?"float4 inputs:scale = "+function(t){return"(".concat(t.r,", ").concat(t.g,", ").concat(t.b,", 1.0)")}(a):"",'\n token inputs:sourceColorSpace = "').concat(t.gammaSpace?"raw":"sRGB",'"\n token inputs:wrapS = "').concat(g(t.wrapU),'"\n token inputs:wrapT = "').concat(g(t.wrapV),'"\n float outputs:r\n float outputs:g\n float outputs:b\n float3 outputs:rgb\n ').concat(e.needAlphaBlending()?"float outputs:a":"","\n }")}function y(t,e,n){var a="\t\t\t",o=[],r=[],i=function(t){switch(t.getClassName()){case"StandardMaterial":return{diffuseMap:t.diffuseTexture,diffuse:t.diffuseColor,alphaCutOff:t.alphaCutOff,emissiveMap:t.emissiveTexture,emissive:t.emissiveColor,roughnessMap:null,normalMap:null,metalnessMap:null,roughness:1,metalness:0,aoMap:null,aoMapIntensity:0,alphaMap:t.opacityTexture,ior:1};case"PBRMaterial":return{diffuseMap:t.albedoTexture,diffuse:t.albedoColor,alphaCutOff:t.alphaCutOff,emissiveMap:t.emissiveTexture,emissive:t.emissiveColor,normalMap:t.bumpTexture,roughnessMap:t.metallicTexture,roughnessChannel:t.useRoughnessFromMetallicTextureAlpha?"a":"g",roughness:t.roughness||1,metalnessMap:t.metallicTexture,metalnessChannel:t.useMetallnessFromMetallicTextureBlue?"b":"r",metalness:t.metallic||0,aoMap:t.ambientTexture,aoMapChannel:t.useAmbientInGrayScale?"r":"rgb",aoMapIntensity:t.ambientTextureStrength,alphaMap:t.opacityTexture,ior:t.indexOfRefraction};case"PBRMetallicRoughnessMaterial":return{diffuseMap:t.baseTexture,diffuse:t.baseColor,alphaCutOff:t.alphaCutOff,emissiveMap:t.emissiveTexture,emissive:t.emissiveColor,normalMap:t.normalTexture,roughnessMap:t.metallicTexture,roughnessChannel:t.useRoughnessFromMetallicTextureAlpha?"a":"g",roughness:t.roughness||1,metalnessMap:t.metallicTexture,metalnessChannel:t.useMetallnessFromMetallicTextureBlue?"b":"r",metalness:t.metallic||0,aoMap:t.ambientTexture,aoMapChannel:t.useAmbientInGrayScale?"r":"rgb",aoMapIntensity:t.ambientTextureStrength,alphaMap:t.opacityTexture,ior:t.indexOfRefraction};default:return{diffuseMap:null,diffuse:null,emissiveMap:null,emissemissiveiveColor:null,normalMap:null,roughnessMap:null,metalnessMap:null,alphaCutOff:0,roughness:0,metalness:0,aoMap:null,aoMapIntensity:0,alphaMap:null,ior:1}}}(t),c=i.diffuseMap,u=i.diffuse,l=i.alphaCutOff,p=i.emissiveMap,f=i.emissive,d=i.normalMap,m=i.roughnessMap,h=i.roughnessChannel,g=i.roughness,M=i.metalnessMap,y=i.metalnessChannel,b=i.metalness,T=i.aoMap,_=i.aoMapChannel,C=i.aoMapIntensity,I=i.alphaMap,S=i.ior;return null!==c?(o.push("".concat(a,"color3f inputs:diffuseColor.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(c.uniqueId,"_diffuse.outputs:rgb>")),t.needAlphaBlending()?o.push("".concat(a,"float inputs:opacity.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(c.uniqueId,"_diffuse.outputs:a>")):t.needAlphaTesting()&&(o.push("".concat(a,"float inputs:opacity.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(c.uniqueId,"_diffuse.outputs:a>")),o.push("".concat(a,"float inputs:opacityThreshold = ").concat(l))),r.push(x(c,t,"diffuse",u,e,n))):o.push("".concat(a,"color3f inputs:diffuseColor = ").concat(v(u||s.Color3.White()))),null!==p?(o.push("".concat(a,"color3f inputs:emissiveColor.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(p.uniqueId,"_emissive.outputs:rgb>")),r.push(x(p,t,"emissive",f,e,n))):f&&f.toLuminance()>0&&o.push("".concat(a,"color3f inputs:emissiveColor = ").concat(v(f))),null!==d&&(o.push("".concat(a,"normal3f inputs:normal.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(d.uniqueId,"_normal.outputs:rgb>")),r.push(x(d,t,"normal",null,e,n))),null!==T&&(o.push("".concat(a,"float inputs:occlusion.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(T.uniqueId,"_occlusion.outputs:").concat(_,">")),r.push(x(T,t,"occlusion",new s.Color3(C,C,C),e,n))),null!==m?(o.push("".concat(a,"float inputs:roughness.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(m.uniqueId,"_roughness.outputs:").concat(h,">")),r.push(x(m,t,"roughness",new s.Color3(g,g,g),e,n))):o.push("".concat(a,"float inputs:roughness = ").concat(g)),null!==M?(o.push("".concat(a,"float inputs:metallic.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(M.uniqueId,"_metallic.outputs:").concat(y,">")),r.push(x(M,t,"metallic",new s.Color3(b,b,b),e,n))):o.push("".concat(a,"float inputs:metallic = ").concat(b)),null!==I?(o.push("".concat(a,"float inputs:opacity.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(I.uniqueId,"_opacity.outputs:r>")),o.push("".concat(a,"float inputs:opacityThreshold = 0.0001")),r.push(x(I,t,"opacity",null,e,n))):o.push("".concat(a,"float inputs:opacity = ").concat(t.alpha)),o.push("".concat(a,"float inputs:ior = ").concat(S)),'\n\tdef Material "Material_'.concat(t.uniqueId,'"\n\t{\n\t\tdef Shader "PreviewSurface"\n\t\t{\n\t\t\tuniform token info:id = "UsdPreviewSurface"\n').concat(o.join("\n"),"\n\t\t\tint inputs:useSpecularWorkflow = 0\n\t\t\ttoken outputs:surface\n\t\t}\n\n\t\ttoken outputs:surface.connect = </Materials/Material_").concat(t.uniqueId,"/PreviewSurface.outputs:surface>\n\n").concat(r.join("\n"),"\n\n\t}\n")}function b(t,e,n){return a=this,o=void 0,i=function(){var a,o,r,i,u,l,m,g,M,v,x,b,T,_,C,I,S,O,P,w,A,R,q,j,k,E,D,U;return function(t,e){var n,a,o,r={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},i=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return i.next=c(0),i.throw=c(1),i.return=c(2),"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(c){return function(s){return function(c){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,c[0]&&(r=0)),r;)try{if(n=1,a&&(o=2&c[0]?a.return:c[0]?a.throw||((o=a.return)&&o.call(a),0):a.next)&&!(o=o.call(a,c[1])).done)return o;switch(a=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return r.label++,{value:c[1],done:!1};case 5:r.label++,a=c[1],c=[0];continue;case 7:c=r.ops.pop(),r.trys.pop();continue;default:if(!((o=(o=r.trys).length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){r=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){r.label=c[1];break}if(6===c[0]&&r.label<o[1]){r.label=o[1],o=c;break}if(o&&r.label<o[2]){r.label=o[2],r.ops.push(c);break}o[2]&&r.ops.pop(),r.trys.pop();continue}c=e.call(t,r)}catch(t){c=[6,t],a=0}finally{n=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,s])}}}(this,(function(B){switch(B.label){case 0:return a=c({fflateUrl:"https://unpkg.com/fflate@0.8.2",includeAnchoringProperties:!0,anchoringType:"plane",planeAnchoringAlignment:"horizontal",modelFileName:"model.usda",precision:5,exportCamera:!1,cameraSensorWidth:35},e),"undefined"!=typeof fflate?[3,2]:[4,s.Tools.LoadScriptAsync(a.fflateUrl)];case 1:B.sent(),B.label=2;case 2:for((o={})[a.modelFileName]=null,r='#usda 1.0\n (\n customLayerData = {\n string creator = "Babylon.js USDZExportAsync"\n }\n defaultPrim = "Root"\n metersPerUnit = 1\n upAxis = "Y"\n )',r+=function(t){var e=!0===t.includeAnchoringProperties?'\n\t\ttoken preliminary:anchoring:type = "'.concat(t.anchoringType,'"\n\t\ttoken preliminary:planeAnchoring:alignment = "').concat(t.planeAnchoringAlignment,'"'):"";return'def Xform "Root"\n {\n def Scope "Scenes" (\n kind = "sceneLibrary"\n )\n {\n def Xform "Scene" (\n customData = {\n bool preliminary_collidesWithEnvironment = 0\n string sceneName = "Scene"\n }\n sceneName = "Scene"\n )\n {'.concat(e,"\n ")}(a),i={},u=0,l=t.meshes;u<l.length;u++)0!==(m=l[u]).getTotalVertices()&&(M=(g=m).geometry,(v=g.material)&&M&&(!n||n(g))&&(-1!==["StandardMaterial","PBRMaterial","PBRMetallicRoughnessMaterial"].indexOf(v.getClassName())?((x="geometries/Geometry_"+M.uniqueId+".usda")in o||(b=p(M,a),o[x]=f(b)),v.uniqueId in i||(i[v.uniqueId]=v),r+=h(g)):s.Tools.Warn("USDZExportAsync does not support this material type: "+v.getClassName())));for(I in t.activeCamera&&a.exportCamera&&(r+=function(t,e){var n="Camera_"+t.uniqueId,a=d(s.Matrix.RotationY(Math.PI).multiply(t.getWorldMatrix()));if(t.mode===s.Constants.ORTHOGRAPHIC_CAMERA)return'def Camera "'.concat(n,'"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ').concat(a,'\n\t\t\tuniform token[] xformOpOrder = ["xformOp:transform"]\n\n\t\t\tfloat2 clippingRange = (').concat(t.minZ.toPrecision(e.precision),", ").concat(t.maxZ.toPrecision(e.precision),")\n\t\t\tfloat horizontalAperture = ").concat((10*(Math.abs(t.orthoLeft||1)+Math.abs(t.orthoRight||1))).toPrecision(e.precision),"\n\t\t\tfloat verticalAperture = ").concat((10*(Math.abs(t.orthoTop||1)+Math.abs(t.orthoBottom||1))).toPrecision(e.precision),'\n\t\t\ttoken projection = "orthographic"\n\t\t}\n\t\n\t');var o=t.getEngine().getAspectRatio(t),r=e.cameraSensorWidth||35;return'def Camera "'.concat(n,'"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ').concat(a,'\n\t\t\tuniform token[] xformOpOrder = ["xformOp:transform"]\n\n\t\t\tfloat2 clippingRange = (').concat(t.minZ.toPrecision(e.precision),", ").concat(t.maxZ.toPrecision(e.precision),")\n\t\t\tfloat focalLength = ").concat((r/(2*Math.tan(.5*t.fov))).toPrecision(e.precision),'\n token projection = "perspective"\n\t\t\tfloat horizontalAperture = ').concat((r*o).toPrecision(e.precision),"\n\t\t\tfloat verticalAperture = ").concat((r/o).toPrecision(e.precision)," \n\t\t}\n\t\n\t")}(t.activeCamera,a)),r+="\n }\n }\n }",r+=function(t,e,n){var a=[];for(var o in t){var r=t[o];a.push(y(r,e,n))}return'\n def "Materials"\n{\n'.concat(a.join(""),"\n}\n\n")}(i,T={},a),o[a.modelFileName]=fflate.strToU8(r),C=[],_=T)C.push(I);S=0,B.label=3;case 3:return S<C.length?(I=C[S])in _?(P=T[O=I],w=P.getSize(),[4,P.readPixels()]):[3,6]:[3,7];case 4:if(!(A=B.sent()))throw new Error("Texture data is not available");return[4,s.DumpTools.DumpDataAsync(w.width,w.height,A,"image/png",void 0,!1,!0)];case 5:R=B.sent(),o["textures/Texture_".concat(O,".png")]=new Uint8Array(R).slice(),B.label=6;case 6:return S++,[3,3];case 7:for(j in q=0,o)(k=o[j])&&(E=34+j.length,4!=(D=63&(q+=E))&&(U=new Uint8Array(64-D),o[j]=[k,{extra:{12345:U}}]),q=k.length);return[2,fflate.zipSync(o,{level:0})]}}))},new((r=void 0)||(r=Promise))((function(t,e){function n(t){try{s(i.next(t))}catch(t){e(t)}}function c(t){try{s(i.throw(t))}catch(t){e(t)}}function s(e){var a;e.done?t(e.value):(a=e.value,a instanceof r?a:new r((function(t){t(a)}))).then(n,c)}s((i=i.apply(a,o||[])).next())}));var a,o,r,i}var T=void 0!==a.g?a.g:"undefined"!=typeof window?window:void 0;if(void 0!==T)for(var _ in r)T.BABYLON[_]=r[_];const C=i;return o.default})()));
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("babylonjs")):"function"==typeof define&&define.amd?define("babylonjs-serializers",["babylonjs"],e):"object"==typeof exports?exports["babylonjs-serializers"]=e(require("babylonjs")):t.SERIALIZERS=e(t.BABYLON)}("undefined"!=typeof self?self:"undefined"!=typeof global?global:this,(t=>(()=>{"use strict";var e={597:e=>{e.exports=t}},n={};function a(t){var o=n[t];if(void 0!==o)return o.exports;var r=n[t]={exports:{}};return e[t](r,r.exports,a),r.exports}a.d=(t,e)=>{for(var n in e)a.o(e,n)&&!a.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),a.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),a.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var o={};a.d(o,{default:()=>_});var r={};a.r(r),a.d(r,{USDZExportAsync:()=>C});var c={};a.r(c),a.d(c,{USDZExportAsync:()=>C});var i=function(){return i=Object.assign||function(t){for(var e,n=1,a=arguments.length;n<a;n++)for(var o in e=arguments[n])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},i.apply(this,arguments)};Object.create,Object.create,"function"==typeof SuppressedError&&SuppressedError;var s=a(597);function u(t,e,n){void 0===n&&(n=3);for(var a=[],o=0;o<t.length/n;o++){var r=t[o*n],c=t[o*n+1],i=t[o*n+2];a.push("(".concat(r.toPrecision(e.precision),", ").concat(c.toPrecision(e.precision),", ").concat(i.toPrecision(e.precision),")"))}return a.join(", ")}function l(t,e){for(var n=[],a=0;a<t.length/2;a++){var o=t[2*a],r=t[2*a+1];n.push("(".concat(o.toPrecision(e.precision),", ").concat((1-r).toPrecision(e.precision),")"))}return n.join(", ")}function p(t,e){var n=function(t,e){var n=t.getVerticesData(s.VertexBuffer.PositionKind),a=t.getVerticesData(s.VertexBuffer.NormalKind);if(n&&a)return'\n\tdef Mesh "'.concat("Geometry",'"\n\t{\n\t\tint[] faceVertexCounts = [').concat(function(t){var e,n=(null===(e=t.getIndices())||void 0===e?void 0:e.length)?t.getTotalIndices():t.getTotalVertices();return Array(n/3).fill(3).join(", ")}(t),"]\n\t\tint[] faceVertexIndices = [").concat(function(t){var e=t.getIndices(),n=[];if(null!==e)for(var a=0;a<e.length;a++)n.push(e[a]);else{var o=t.getTotalVertices();for(a=0;a<o;a++)n.push(a)}return n.join(", ")}(t),"]\n\t\tnormal3f[] normals = [").concat(u(a,e),'] (\n\t\t\tinterpolation = "vertex"\n\t\t)\n\t\tpoint3f[] points = [').concat(u(n,e),"]\n ").concat(function(t,e){for(var n="",a=0;a<4;a++){var o=a>0?a:"",r=t.getVerticesData(s.VertexBuffer.UVKind+(o?o+1:""));r&&(n+="\n\t\ttexCoord2f[] primvars:st".concat(o," = [").concat(l(r,e),'] (\n\t\t\tinterpolation = "vertex"\n\t\t)'))}var c=t.getVerticesData(s.VertexBuffer.ColorKind);return c&&(n+="\n\tcolor3f[] primvars:displayColor = [".concat(u(c,e,c.length/t.getTotalVertices()),'] (\n\t\tinterpolation = "vertex"\n\t\t)')),n}(t,e),'\n\t\tuniform token subdivisionScheme = "none"\n\t}\n')}(t,e);return'\n def "Geometry"\n {\n '.concat(n,"\n }\n ")}function f(t){var e='#usda 1.0\n (\n customLayerData = {\n string creator = "Babylon.js USDZExportAsync"\n }\n defaultPrim = "Root"\n metersPerUnit = 1\n upAxis = "Y"\n )';return e+=t,fflate.strToU8(e)}function d(t){var e=t.m;return"( ".concat(h(e,0),", ").concat(h(e,4),", ").concat(h(e,8),", ").concat(h(e,12)," )")}function h(t,e){return"(".concat(t[e+0],", ").concat(t[e+1],", ").concat(t[e+2],", ").concat(t[e+3],")")}function m(t){var e="Object_"+t.uniqueId,n=t.getWorldMatrix().clone();n.determinant()<0&&s.Tools.Warn("Exporting mesh ".concat(t.name," with negative scale. Result may look incorrect in destination engine."));var a=d(n);return'def Xform "'.concat(e,'" (\n\tprepend references = @./geometries/Geometry_').concat(t.geometry.uniqueId,'.usda@</Geometry>\n\tprepend apiSchemas = ["MaterialBindingAPI"]\n)\n{\n\tmatrix4d xformOp:transform = ').concat(a,'\n\tuniform token[] xformOpOrder = ["xformOp:transform"]\t\n\n rel material:binding = </Materials/Material_').concat(t.material.uniqueId,">\n}\n\n")}function g(t){switch(t){case s.Constants.TEXTURE_CLAMP_ADDRESSMODE:return"clamp";case s.Constants.TEXTURE_MIRROR_ADDRESSMODE:return"mirror";case s.Constants.TEXTURE_WRAP_ADDRESSMODE:default:return"repeat"}}function M(t){return"(".concat(t.x,", ").concat(t.y,")")}function x(t){return"(".concat(t.r,", ").concat(t.g,", ").concat(t.b,")")}function v(t,e,n,a,o,r){var c=t.getInternalTexture().uniqueId+"_"+t.invertY;o[c]=t;var i=t.coordinatesIndex>0?"st"+t.coordinatesIndex:"st",u=new s.Vector2(t.uScale,t.vScale),l=new s.Vector2(t.uOffset,t.vOffset),p=t.wAng,f=Math.sin(p),d=Math.cos(p);return l.y=1-l.y-u.y,l.x+=f*u.x,l.y+=(1-d)*u.y,'\n def Shader "PrimvarReader_'.concat(n,'"\n {\n uniform token info:id = "UsdPrimvarReader_float2"\n float2 inputs:fallback = (0.0, 0.0)\n token inputs:varname = "').concat(i,'"\n float2 outputs:result\n }\n\n def Shader "Transform2d_').concat(n,'"\n {\n uniform token info:id = "UsdTransform2d"\n token inputs:in.connect = </Materials/Material_').concat(e.uniqueId,"/PrimvarReader_").concat(n,".outputs:result>\n float inputs:rotation = ").concat((p*(180/Math.PI)).toFixed(r.precision),"\n float2 inputs:scale = ").concat(M(u),"\n float2 inputs:translation = ").concat(M(l),'\n float2 outputs:result\n }\n\n def Shader "Texture_').concat(t.uniqueId,"_").concat(n,'"\n {\n uniform token info:id = "UsdUVTexture"\n asset inputs:file = @textures/Texture_').concat(c,".png@\n float2 inputs:st.connect = </Materials/Material_").concat(e.uniqueId,"/Transform2d_").concat(n,".outputs:result>\n ").concat(a?"float4 inputs:scale = "+function(t){return"(".concat(t.r,", ").concat(t.g,", ").concat(t.b,", 1.0)")}(a):"",'\n token inputs:sourceColorSpace = "').concat(t.gammaSpace?"raw":"sRGB",'"\n token inputs:wrapS = "').concat(g(t.wrapU),'"\n token inputs:wrapT = "').concat(g(t.wrapV),'"\n float outputs:r\n float outputs:g\n float outputs:b\n float3 outputs:rgb\n ').concat(e.needAlphaBlending()?"float outputs:a":"","\n }")}function y(t,e,n){var a="\t\t\t",o=[],r=[],c=function(t){switch(t.getClassName()){case"StandardMaterial":return{diffuseMap:t.diffuseTexture,diffuse:t.diffuseColor,alphaCutOff:t.alphaCutOff,emissiveMap:t.emissiveTexture,emissive:t.emissiveColor,roughnessMap:null,normalMap:null,metalnessMap:null,roughness:1,metalness:0,aoMap:null,aoMapIntensity:0,alphaMap:t.opacityTexture,ior:1,clearCoat:0,clearCoatMap:null,clearCoatRoughness:0,clearCoatRoughnessMap:null};case"PBRMaterial":return{diffuseMap:t.albedoTexture,diffuse:t.albedoColor,alphaCutOff:t.alphaCutOff,emissiveMap:t.emissiveTexture,emissive:t.emissiveColor,normalMap:t.bumpTexture,roughnessMap:t.metallicTexture,roughnessChannel:t.useRoughnessFromMetallicTextureAlpha?"a":"g",roughness:t.roughness||1,metalnessMap:t.metallicTexture,metalnessChannel:t.useMetallnessFromMetallicTextureBlue?"b":"r",metalness:t.metallic||0,aoMap:t.ambientTexture,aoMapChannel:t.useAmbientInGrayScale?"r":"rgb",aoMapIntensity:t.ambientTextureStrength,alphaMap:t.opacityTexture,ior:t.indexOfRefraction,clearCoat:t.clearCoat.intensity,clearCoatMap:t.clearCoat.texture,clearCoatRoughness:t.clearCoat.roughness,clearCoatRoughnessMap:t.clearCoat.useRoughnessFromMainTexture?t.clearCoat.texture:t.clearCoat.textureRoughness};case"PBRMetallicRoughnessMaterial":return{diffuseMap:t.baseTexture,diffuse:t.baseColor,alphaCutOff:t.alphaCutOff,emissiveMap:t.emissiveTexture,emissive:t.emissiveColor,normalMap:t.normalTexture,roughnessMap:t.metallicTexture,roughnessChannel:t.useRoughnessFromMetallicTextureAlpha?"a":"g",roughness:t.roughness||1,metalnessMap:t.metallicTexture,metalnessChannel:t.useMetallnessFromMetallicTextureBlue?"b":"r",metalness:t.metallic||0,aoMap:t.ambientTexture,aoMapChannel:t.useAmbientInGrayScale?"r":"rgb",aoMapIntensity:t.ambientTextureStrength,alphaMap:t.opacityTexture,ior:t.indexOfRefraction,clearCoat:t.clearCoat.intensity,clearCoatMap:t.clearCoat.texture,clearCoatRoughness:t.clearCoat.roughness,clearCoatRoughnessMap:t.clearCoat.useRoughnessFromMainTexture?t.clearCoat.texture:t.clearCoat.textureRoughness};default:return{diffuseMap:null,diffuse:null,emissiveMap:null,emissemissiveiveColor:null,normalMap:null,roughnessMap:null,metalnessMap:null,alphaCutOff:0,roughness:0,metalness:0,aoMap:null,aoMapIntensity:0,alphaMap:null,ior:1,clearCoat:0,clearCoatMap:null,clearCoatRoughness:0,clearCoatRoughnessMap:null}}}(t),i=c.diffuseMap,u=c.diffuse,l=c.alphaCutOff,p=c.emissiveMap,f=c.emissive,d=c.normalMap,h=c.roughnessMap,m=c.roughnessChannel,g=c.roughness,M=c.metalnessMap,y=c.metalnessChannel,C=c.metalness,b=c.aoMap,T=c.aoMapChannel,_=c.aoMapIntensity,I=c.alphaMap,R=c.ior,S=c.clearCoat,w=c.clearCoatMap,O=c.clearCoatRoughness,A=c.clearCoatRoughnessMap;return null!==i?(o.push("".concat(a,"color3f inputs:diffuseColor.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(i.uniqueId,"_diffuse.outputs:rgb>")),t.needAlphaBlending()?o.push("".concat(a,"float inputs:opacity.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(i.uniqueId,"_diffuse.outputs:a>")):t.needAlphaTesting()&&(o.push("".concat(a,"float inputs:opacity.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(i.uniqueId,"_diffuse.outputs:a>")),o.push("".concat(a,"float inputs:opacityThreshold = ").concat(l))),r.push(v(i,t,"diffuse",u,e,n))):o.push("".concat(a,"color3f inputs:diffuseColor = ").concat(x(u||s.Color3.White()))),null!==p?(o.push("".concat(a,"color3f inputs:emissiveColor.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(p.uniqueId,"_emissive.outputs:rgb>")),r.push(v(p,t,"emissive",f,e,n))):f&&f.toLuminance()>0&&o.push("".concat(a,"color3f inputs:emissiveColor = ").concat(x(f))),null!==d&&(o.push("".concat(a,"normal3f inputs:normal.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(d.uniqueId,"_normal.outputs:rgb>")),r.push(v(d,t,"normal",null,e,n))),null!==b&&(o.push("".concat(a,"float inputs:occlusion.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(b.uniqueId,"_occlusion.outputs:").concat(T,">")),r.push(v(b,t,"occlusion",new s.Color3(_,_,_),e,n))),null!==h?(o.push("".concat(a,"float inputs:roughness.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(h.uniqueId,"_roughness.outputs:").concat(m,">")),r.push(v(h,t,"roughness",new s.Color3(g,g,g),e,n))):o.push("".concat(a,"float inputs:roughness = ").concat(g)),null!==M?(o.push("".concat(a,"float inputs:metallic.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(M.uniqueId,"_metallic.outputs:").concat(y,">")),r.push(v(M,t,"metallic",new s.Color3(C,C,C),e,n))):o.push("".concat(a,"float inputs:metallic = ").concat(C)),null!==I?(o.push("".concat(a,"float inputs:opacity.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(I.uniqueId,"_opacity.outputs:r>")),o.push("".concat(a,"float inputs:opacityThreshold = 0.0001")),r.push(v(I,t,"opacity",null,e,n))):o.push("".concat(a,"float inputs:opacity = ").concat(t.alpha)),null!==w?(o.push("".concat(a,"float inputs:clearcoat.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(w.uniqueId,"_clearcoat.outputs:r>")),r.push(v(w,t,"clearcoat",new s.Color3(S,S,S),e,n))):o.push("".concat(a,"float inputs:clearcoat = ").concat(S)),null!==A?(o.push("".concat(a,"float inputs:clearcoatRoughness.connect = </Materials/Material_").concat(t.uniqueId,"/Texture_").concat(A.uniqueId,"_clearcoatRoughness.outputs:g>")),r.push(v(A,t,"clearcoatRoughness",new s.Color3(O,O,O),e,n))):o.push("".concat(a,"float inputs:clearcoatRoughness = ").concat(O)),o.push("".concat(a,"float inputs:ior = ").concat(R)),'\n\tdef Material "Material_'.concat(t.uniqueId,'"\n\t{\n\t\tdef Shader "PreviewSurface"\n\t\t{\n\t\t\tuniform token info:id = "UsdPreviewSurface"\n').concat(o.join("\n"),"\n\t\t\tint inputs:useSpecularWorkflow = 0\n\t\t\ttoken outputs:surface\n\t\t}\n\n\t\ttoken outputs:surface.connect = </Materials/Material_").concat(t.uniqueId,"/PreviewSurface.outputs:surface>\n\n").concat(r.join("\n"),"\n\n\t}\n")}function C(t,e,n){return a=this,o=void 0,c=function(){var a,o,r,c,u,l,h,g,M,x,v,C,b,T,_,I,R,S,w,O,A,P,q,j,k,E,D,U;return function(t,e){var n,a,o,r={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},c=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return c.next=i(0),c.throw=i(1),c.return=i(2),"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function i(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;c&&(c=0,i[0]&&(r=0)),r;)try{if(n=1,a&&(o=2&i[0]?a.return:i[0]?a.throw||((o=a.return)&&o.call(a),0):a.next)&&!(o=o.call(a,i[1])).done)return o;switch(a=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return r.label++,{value:i[1],done:!1};case 5:r.label++,a=i[1],i=[0];continue;case 7:i=r.ops.pop(),r.trys.pop();continue;default:if(!((o=(o=r.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){r=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){r.label=i[1];break}if(6===i[0]&&r.label<o[1]){r.label=o[1],o=i;break}if(o&&r.label<o[2]){r.label=o[2],r.ops.push(i);break}o[2]&&r.ops.pop(),r.trys.pop();continue}i=e.call(t,r)}catch(t){i=[6,t],a=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}}(this,(function(B){switch(B.label){case 0:return a=i({fflateUrl:"https://unpkg.com/fflate@0.8.2",includeAnchoringProperties:!0,anchoringType:"plane",planeAnchoringAlignment:"horizontal",modelFileName:"model.usda",precision:5,exportCamera:!1,cameraSensorWidth:35},e),"undefined"!=typeof fflate?[3,2]:[4,s.Tools.LoadScriptAsync(a.fflateUrl)];case 1:B.sent(),B.label=2;case 2:for((o={})[a.modelFileName]=null,r='#usda 1.0\n (\n customLayerData = {\n string creator = "Babylon.js USDZExportAsync"\n }\n defaultPrim = "Root"\n metersPerUnit = 1\n upAxis = "Y"\n )',r+=function(t){var e=!0===t.includeAnchoringProperties?'\n\t\ttoken preliminary:anchoring:type = "'.concat(t.anchoringType,'"\n\t\ttoken preliminary:planeAnchoring:alignment = "').concat(t.planeAnchoringAlignment,'"'):"";return'def Xform "Root"\n {\n def Scope "Scenes" (\n kind = "sceneLibrary"\n )\n {\n def Xform "Scene" (\n customData = {\n bool preliminary_collidesWithEnvironment = 0\n string sceneName = "Scene"\n }\n sceneName = "Scene"\n )\n {'.concat(e,"\n ")}(a),c={},u=0,l=t.meshes;u<l.length;u++)0!==(h=l[u]).getTotalVertices()&&(M=(g=h).geometry,(x=g.material)&&M&&(!n||n(g))&&(-1!==["StandardMaterial","PBRMaterial","PBRMetallicRoughnessMaterial"].indexOf(x.getClassName())?((v="geometries/Geometry_"+M.uniqueId+".usda")in o||(C=p(M,a),o[v]=f(C)),x.uniqueId in c||(c[x.uniqueId]=x),r+=m(g)):s.Tools.Warn("USDZExportAsync does not support this material type: "+x.getClassName())));for(I in t.activeCamera&&a.exportCamera&&(r+=function(t,e){var n="Camera_"+t.uniqueId,a=d(s.Matrix.RotationY(Math.PI).multiply(t.getWorldMatrix()));if(t.mode===s.Constants.ORTHOGRAPHIC_CAMERA)return'def Camera "'.concat(n,'"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ').concat(a,'\n\t\t\tuniform token[] xformOpOrder = ["xformOp:transform"]\n\n\t\t\tfloat2 clippingRange = (').concat(t.minZ.toPrecision(e.precision),", ").concat(t.maxZ.toPrecision(e.precision),")\n\t\t\tfloat horizontalAperture = ").concat((10*(Math.abs(t.orthoLeft||1)+Math.abs(t.orthoRight||1))).toPrecision(e.precision),"\n\t\t\tfloat verticalAperture = ").concat((10*(Math.abs(t.orthoTop||1)+Math.abs(t.orthoBottom||1))).toPrecision(e.precision),'\n\t\t\ttoken projection = "orthographic"\n\t\t}\n\t\n\t');var o=t.getEngine().getAspectRatio(t),r=e.cameraSensorWidth||35;return'def Camera "'.concat(n,'"\n\t\t{\n\t\t\tmatrix4d xformOp:transform = ').concat(a,'\n\t\t\tuniform token[] xformOpOrder = ["xformOp:transform"]\n\n\t\t\tfloat2 clippingRange = (').concat(t.minZ.toPrecision(e.precision),", ").concat(t.maxZ.toPrecision(e.precision),")\n\t\t\tfloat focalLength = ").concat((r/(2*Math.tan(.5*t.fov))).toPrecision(e.precision),'\n token projection = "perspective"\n\t\t\tfloat horizontalAperture = ').concat((r*o).toPrecision(e.precision),"\n\t\t\tfloat verticalAperture = ").concat((r/o).toPrecision(e.precision)," \n\t\t}\n\t\n\t")}(t.activeCamera,a)),r+="\n }\n }\n }",r+=function(t,e,n){var a=[];for(var o in t){var r=t[o];a.push(y(r,e,n))}return'\n def "Materials"\n{\n'.concat(a.join(""),"\n}\n\n")}(c,b={},a),o[a.modelFileName]=fflate.strToU8(r),_=[],T=b)_.push(I);R=0,B.label=3;case 3:return R<_.length?(I=_[R])in T?(w=b[S=I],O=w.getSize(),[4,w.readPixels()]):[3,6]:[3,7];case 4:if(!(A=B.sent()))throw new Error("Texture data is not available");return[4,s.DumpTools.DumpDataAsync(O.width,O.height,A,"image/png",void 0,!1,!0)];case 5:P=B.sent(),o["textures/Texture_".concat(S,".png")]=new Uint8Array(P).slice(),B.label=6;case 6:return R++,[3,3];case 7:for(j in q=0,o)(k=o[j])&&(E=34+j.length,4!=(D=63&(q+=E))&&(U=new Uint8Array(64-D),o[j]=[k,{extra:{12345:U}}]),q=k.length);return[2,fflate.zipSync(o,{level:0})]}}))},new((r=void 0)||(r=Promise))((function(t,e){function n(t){try{s(c.next(t))}catch(t){e(t)}}function i(t){try{s(c.throw(t))}catch(t){e(t)}}function s(e){var a;e.done?t(e.value):(a=e.value,a instanceof r?a:new r((function(t){t(a)}))).then(n,i)}s((c=c.apply(a,o||[])).next())}));var a,o,r,c}var b=void 0!==a.g?a.g:"undefined"!=typeof window?window:void 0;if(void 0!==b)for(var T in r)b.BABYLON[T]=r[T];const _=c;return o.default})()));
|
|
2
2
|
//# sourceMappingURL=babylon.usdzSerializer.min.js.map
|