gs-bim-air 2.0.0-beta.17 → 2.0.0-beta.18

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.
@@ -5624,7 +5624,7 @@ eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;__webpack_
5624
5624
  \*************************************************/
5625
5625
  /***/ (function(module, exports, __webpack_require__) {
5626
5626
 
5627
- eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;__webpack_require__(/*! core-js/modules/es.array.iterator.js */ \"./node_modules/core-js/modules/es.array.iterator.js\");\n__webpack_require__(/*! core-js/modules/es.array-buffer.slice.js */ \"./node_modules/core-js/modules/es.array-buffer.slice.js\");\n__webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.int32-array.js */ \"./node_modules/core-js/modules/es.typed-array.int32-array.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.at.js */ \"./node_modules/core-js/modules/es.typed-array.at.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.copy-within.js */ \"./node_modules/core-js/modules/es.typed-array.copy-within.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.every.js */ \"./node_modules/core-js/modules/es.typed-array.every.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.fill.js */ \"./node_modules/core-js/modules/es.typed-array.fill.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.filter.js */ \"./node_modules/core-js/modules/es.typed-array.filter.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.find.js */ \"./node_modules/core-js/modules/es.typed-array.find.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.find-index.js */ \"./node_modules/core-js/modules/es.typed-array.find-index.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.find-last.js */ \"./node_modules/core-js/modules/es.typed-array.find-last.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.find-last-index.js */ \"./node_modules/core-js/modules/es.typed-array.find-last-index.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.for-each.js */ \"./node_modules/core-js/modules/es.typed-array.for-each.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.includes.js */ \"./node_modules/core-js/modules/es.typed-array.includes.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.index-of.js */ \"./node_modules/core-js/modules/es.typed-array.index-of.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.iterator.js */ \"./node_modules/core-js/modules/es.typed-array.iterator.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.join.js */ \"./node_modules/core-js/modules/es.typed-array.join.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.last-index-of.js */ \"./node_modules/core-js/modules/es.typed-array.last-index-of.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.map.js */ \"./node_modules/core-js/modules/es.typed-array.map.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.reduce.js */ \"./node_modules/core-js/modules/es.typed-array.reduce.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.reduce-right.js */ \"./node_modules/core-js/modules/es.typed-array.reduce-right.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.reverse.js */ \"./node_modules/core-js/modules/es.typed-array.reverse.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.set.js */ \"./node_modules/core-js/modules/es.typed-array.set.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.slice.js */ \"./node_modules/core-js/modules/es.typed-array.slice.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.some.js */ \"./node_modules/core-js/modules/es.typed-array.some.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.sort.js */ \"./node_modules/core-js/modules/es.typed-array.sort.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.subarray.js */ \"./node_modules/core-js/modules/es.typed-array.subarray.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.to-locale-string.js */ \"./node_modules/core-js/modules/es.typed-array.to-locale-string.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.to-string.js */ \"./node_modules/core-js/modules/es.typed-array.to-string.js\");\n__webpack_require__(/*! core-js/modules/esnext.typed-array.to-reversed.js */ \"./node_modules/core-js/modules/esnext.typed-array.to-reversed.js\");\n__webpack_require__(/*! core-js/modules/esnext.typed-array.to-sorted.js */ \"./node_modules/core-js/modules/esnext.typed-array.to-sorted.js\");\n__webpack_require__(/*! core-js/modules/esnext.typed-array.with.js */ \"./node_modules/core-js/modules/esnext.typed-array.with.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.float32-array.js */ \"./node_modules/core-js/modules/es.typed-array.float32-array.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.float64-array.js */ \"./node_modules/core-js/modules/es.typed-array.float64-array.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.int8-array.js */ \"./node_modules/core-js/modules/es.typed-array.int8-array.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.uint8-array.js */ \"./node_modules/core-js/modules/es.typed-array.uint8-array.js\");\n__webpack_require__(/*! core-js/modules/es.array-buffer.constructor.js */ \"./node_modules/core-js/modules/es.array-buffer.constructor.js\");\n__webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");\n__webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n__webpack_require__(/*! core-js/modules/es.number.constructor.js */ \"./node_modules/core-js/modules/es.number.constructor.js\");\n__webpack_require__(/*! core-js/modules/es.json.stringify.js */ \"./node_modules/core-js/modules/es.json.stringify.js\");\n__webpack_require__(/*! core-js/modules/es.array.slice.js */ \"./node_modules/core-js/modules/es.array.slice.js\");\n__webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ \"./node_modules/core-js/modules/es.regexp.to-string.js\");\n__webpack_require__(/*! core-js/modules/es.number.to-fixed.js */ \"./node_modules/core-js/modules/es.number.to-fixed.js\");\n__webpack_require__(/*! core-js/modules/es.promise.js */ \"./node_modules/core-js/modules/es.promise.js\");\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! tslib */ \"./node_modules/tslib/tslib.es6.js\"), __webpack_require__(/*! ../process */ \"./packages/longan/src/process.ts\"), __webpack_require__(/*! ../utils/cookie */ \"./packages/longan/src/utils/cookie.ts\"), __webpack_require__(/*! ./gs.collections */ \"./packages/longan/src/longan/gs.collections.ts\"), __webpack_require__(/*! ./gs.math */ \"./packages/longan/src/longan/gs.math.ts\"), __webpack_require__(/*! ./idb */ \"./packages/longan/src/longan/idb.ts\"), __webpack_require__(/*! ./segment */ \"./packages/longan/src/longan/segment.ts\"), __webpack_require__(/*! ./utility */ \"./packages/longan/src/longan/utility.ts\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, tslib_1, process_1, cookie_1, gs_collections_1, gs_math_1, idb_1, segment_1, utility_1) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", ({\n value: true\n }));\n exports.JS_Planar_Polyline_Offset = exports.JS_Feature_Extrude = exports.JS_Boolean_Subtract = exports.JS_Boolean_Cut_Polygon_Polygon_Xy = exports.JS_Boolean_Subtract_Polygon_Polygon_Xy = exports.JS_Boolean_Intersect_Graph_Polygon_Xy = exports.JS_Boolean_Intersect_Polygon_Polygon_Xy = exports.JS_Boolean_Intersect_Polyline_Polygon_Xy = exports.JS_Boolean_Intersection_Graph = exports.JS_Create_Texture = exports.JS_Execute_Task_Post_Processing = exports.JS_Show_Allocated_Memory_Size = exports.JS_Show_Database_Info = exports.JS_Copy_Segment_By_Key = exports.JS_Stream_To_Geometry_Data_With_Compression = exports.JS_Stream_To_Geometry_Data_By_Keys_Tt = exports.JS_Stream_To_Geometry_Data_By_Keys = exports.JS_Stream_To_Geometry_Data_By_Key = exports.JS_Stream_To_Geometry_Data = exports.JS_Geometry_Data_To_Stream = exports.JS_Stream_To_Segment_Data = exports.JS_Segment_Data_To_Stream = exports.JS_Stream_With_Compression_To_Segment_By_Key = exports.JS_Stream_To_Segment_By_Key_Tt = exports.JS_Stream_To_Segment_By_Key = exports.JS_Stream_To_Segment = exports.JS_Segment_To_Stream_With_Compression_By_Key = exports.JS_Segment_To_Stream_With_Compression = exports.JS_Segment_To_Stream_By_Key = exports.JS_Segment_To_Stream = exports.JS_Compute_Geometry_Distance = exports.JS_Is_Solid_Geometry = exports.JS_Compute_Volume = exports.JS_Compute_Area = exports.JS_Compute_Polygon_Area = exports.JS_Compute_Box_Test = exports.JS_Compute_Geometry_Ray_Test = exports.JS_Compute_Ray_Test = exports.JS_DRotate_By_Shell = exports.JS_Rotate_By_Shell = exports.JS_DExtrude_By_Shell = exports.JS_DSweep_By_Shell = exports.JS_Sweep_By_Shell = exports.JS_Extrude_By_Shell = exports.JS_Merge_Shell = exports.JS_Compute_Geometry_Data = exports.JS_Compute_Geometry_Tessellate_Data = exports.JS_UnSet_Geometry_Normals = exports.JS_Show_Geometry_Normals = exports.JS_Set_Geometry_Normals = exports.JS_Compute_Geometry_Texture_Coords = exports.JS_UnSet_Geometry_Texture_Coords = exports.JS_Show_Geometry_Texture_Coords = exports.JS_Show_Geometry_Texture_Dimension = exports.JS_Set_Geometry_Texture_Coords = exports.JS_Show_Geometry_Element_Type = exports.JS_Show_Geometry_Vertices_Position_By_Indexes = exports.JS_Show_Cutting_Planes = exports.JS_Edit_Cutting_Planes = exports.JS_Insert_Cutting_Planes = exports.JS_Show_Image = exports.JS_Show_One_Image_Option = exports.JS_Show_Image_Options = exports.JS_Show_Image_Data = exports.JS_Show_Image_Size = exports.JS_Show_Image_Position = exports.JS_UnSet_One_Image_Option = exports.JS_Set_Image_Options = exports.JS_Insert_Image = exports.JS_Show_Light = exports.JS_Edit_Light = exports.JS_Insert_Light = exports.JS_Insert_Parametric_Geometries = exports.JS_Show_Parametric_Geometry = exports.JS_Edit_Parametric_Geometry = exports.JS_Insert_Parametric_Geometry = exports.JS_Insert_Vector_Text = exports.JS_Show_Mesh = exports.JS_Show_Mesh_Size = exports.JS_Edit_Mesh_Points = exports.JS_Insert_Mesh = exports.JS_Insert_Triangular_Shell = exports.JS_Show_Shell = exports.JS_Show_Shell_Size = exports.JS_Edit_Shell = exports.JS_Insert_Shell = exports.JS_Edit_PolyCylinder = exports.JS_Insert_PolyCylinder = exports.JS_Show_Cylinder = exports.JS_Insert_Cylinder = exports.JS_Show_Circle = exports.JS_Insert_Circle = exports.JS_Show_Polyline = exports.JS_Show_Polyline_Count = exports.JS_Insert_Polyline = exports.JS_Show_Line = exports.JS_Edit_Line = exports.JS_Insert_Line = exports.JS_Show_Point_Cloud = exports.JS_Edit_Point_Cloud = exports.JS_Insert_Point_Cloud = exports.JS_Show_Marker = exports.JS_Edit_Marker = exports.JS_Insert_Marker = exports.JS_Resize_By_Key = exports.JS_Image_Exists = exports.JS_Attribute_Exists = exports.JS_Show_One_Text_Font = exports.JS_Show_Text_Font = exports.JS_UnSet_One_Text_Font = exports.JS_UnSet_Text_Font = exports.JS_Set_Text_Font = exports.JS_UnSet_Condition = exports.JS_Show_Condition = exports.JS_Set_Condition = exports.JS_Show_One_Heuristic_Option = exports.JS_Show_Heuristic_Options = exports.JS_UnSet_One_Heuristic_Option = exports.JS_UnSet_Heuristic_Options = exports.JS_Set_One_Heuristic_Option = exports.JS_Set_Heuristic_Options = exports.JS_Show_One_Path_Rendering_Option = exports.JS_Show_One_Default_Rendering_Option = exports.JS_Show_One_Rendering_Option = exports.JS_Show_Rendering_Options = exports.JS_UnSet_One_Rendering_Option = exports.JS_UnSet_Rendering_Options = exports.JS_Set_Rendering_Options = exports.JS_UnSet_ModellingMatrix = exports.JS_Show_Path_ModellingMatrix = exports.JS_Show_ModellingMatrix = exports.JS_Append_ModellingMatrix = exports.JS_Set_ModellingMatrix = exports.JS_Show_One_Selectability = exports.JS_Show_Selectability = exports.JS_UnSet_One_Selectability = exports.JS_UnSet_Selectability = exports.JS_Set_Selectability = exports.JS_Show_One_Visibility = exports.JS_Show_Visibility = exports.JS_UnSet_One_Visibility = exports.JS_UnSet_Visibility = exports.JS_Set_Visibility = exports.JS_UnSet_Geometry_Color = exports.JS_Show_Geometry_Color_By_Value = exports.JS_Set_Geometry_Color_By_Value = exports.JS_Set_Geometry_Color = exports.JS_Show_Color_By_Value = exports.JS_Show_One_Color = exports.JS_Show_Color = exports.JS_UnSet_One_Color = exports.JS_UnSet_Color = exports.JS_Set_Color = exports.JS_UnSet_Camera = exports.JS_Zoom_Camera = exports.JS_Roll_Camera = exports.JS_Dolly_Camera = exports.JS_Show_Path_Camera_Target = exports.JS_Show_Path_Camera_Position = exports.JS_Show_Camera_View_Matrix = exports.JS_Show_Camera_Projection_Matrix = exports.JS_Show_Camera_Projection = exports.JS_Show_Camera_Extent = exports.JS_Show_Camera_Field = exports.JS_Show_Camera_Up = exports.JS_Show_Camera_Target = exports.JS_Show_Camera_Position = exports.JS_Show_Camera = exports.JS_Keep_Camera_Ratio = exports.JS_Set_Camera_Projection = exports.JS_Set_Camera_Extent = exports.JS_Set_Camera_Field = exports.JS_Set_Camera_Up = exports.JS_Set_Camera_Target = exports.JS_Set_Camera_Position = exports.JS_Set_Camera = exports.JS_Set_Viewport = exports.JS_Show_One_Shader = exports.JS_Show_Shader = exports.JS_UnSet_Shader = exports.JS_Set_Shader = exports.JS_Show_One_Driver_Option = exports.JS_Show_Driver_Options = exports.JS_Set_Driver_Options = exports.JS_Set_Driver_Configs = exports.JS_Clear_Font_Library = exports.JS_Remove_Font_Library = exports.JS_Font_Library_Exists = exports.JS_Add_Font_Library = exports.JS_Show_Collision_Type = exports.JS_Show_Collision_Position = exports.JS_Show_Collision_Path_By_Keys = exports.JS_Show_Collision_Paths = exports.JS_Show_Collision_Elements = exports.JS_Show_Collision_Count = exports.JS_Show_Collision_Status = exports.JS_Compute_Collision_By_Key_Tt = exports.JS_Compute_Collision_By_Keys_Tt = exports.JS_Compute_Collision_By_Key = exports.JS_Compute_Collision_By_Keys = exports.JS_Show_Selection_Test_Info = exports.JS_Show_Selection_Indexes = exports.JS_Show_Selection_Param = exports.JS_Show_Selection_Position = exports.JS_Show_Selection_Path_By_Keys = exports.JS_Show_Selection_Path = exports.JS_Show_Selection_Element = exports.JS_Show_Selection_Count = exports.JS_Compute_Selection_By_Area = exports.JS_Compute_Selection_By_Key = exports.JS_Show_Key_Index = exports.JS_Set_Key_Index = exports.JS_Show_Key_By_Id = exports.JS_Show_Properties = exports.JS_Clear_Properties = exports.JS_Remove_Property = exports.JS_Property_Exists = exports.JS_Show_Property_String = exports.JS_Show_Property_Double = exports.JS_Show_Property_Integer = exports.JS_Show_Property_Boolean = exports.JS_Show_Property_Type = exports.JS_Add_Property_Json = exports.JS_Add_Property_String = exports.JS_Add_Property_Double = exports.JS_Add_Property_Integer = exports.JS_Add_Property_Boolean = exports.JS_Rename_Segment = exports.JS_Move_Key_By_Key = exports.JS_Move_Key = exports.JS_Segment_Exists = exports.JS_Show_Segment_Path = exports.JS_Show_Segment_Name = exports.JS_Show_Style_Segment = exports.JS_Show_Style = exports.JS_Show_Style_List = exports.JS_Show_Style_Count = exports.JS_Show_Include_Segment = exports.JS_Show_Include = exports.JS_Show_Include_List = exports.JS_Show_Include_Count = exports.JS_Show_All_Subsegment_List = exports.JS_Show_All_Subsegment_Count = exports.JS_Show_Subsegment_List = exports.JS_Show_Subsegment_Count = exports.JS_Show_Geometry_List = exports.JS_Show_Geometry_Count = exports.JS_Show_Attribute_List = exports.JS_Show_Attribute_Count = exports.JS_Compute_Visible_By_Key = exports.JS_Clear_Segment_Boundingbox_By_Key = exports.JS_Compute_Segment_Boundingbox_By_Key = exports.JS_Compute_View_Boundingboxes_By_Keys = exports.JS_Compute_View_Boundingbox_By_Keys = exports.JS_Compute_View_Boundingbox_By_Key = exports.JS_Compute_Boundingbox_With_Visibility_By_Key = exports.JS_Compute_Boundingbox_By_Key = exports.JS_Show_BoundingBox_By_Key = exports.JS_Compute_Coordinates_By_Path = exports.JS_Compute_Coordinates_By_Key = exports.JS_Compute_Path = exports.JS_Show_Owner_By_Key = exports.JS_Show_Key_Tag = exports.JS_Show_Key_Type = exports.JS_Asyn_Buffer_Geometry_By_Key_Tt = exports.JS_Asyn_Buffer_Geometry_By_Key = exports.JS_Show_Asyn_Buffer_Geometry_Keys = exports.JS_Show_Asyn_Remove_Geometry_Data_Keys = exports.JS_Show_Asyn_Geometry_Data_Keys = exports.JS_Asyn_Render_View_With_Time_By_Key = exports.JS_Asyn_Render_View_By_Key = exports.JS_Asyn_Update_View_By_Key_Tt = exports.JS_Asyn_Update_View_By_Key = exports.JS_Asyn_Update_Camera_By_Key = exports.JS_Asyn_Need_Update_View_By_Key = exports.JS_Asyn_Update_Geometry_Data_By_Key_Tt = exports.JS_Asyn_Update_Geometry_Data_By_Key = exports.JS_Update_View_Display_With_Time_By_Key = exports.JS_Update_View_Display_With_Framerate_By_Key = exports.JS_Update_View_Display_By_Key = exports.JS_Update_Display = exports.JS_Make_Context_Current = exports.JS_Conditional_Style_By_Key = exports.JS_Style_Segment_By_Key = exports.JS_Conditional_Include_By_Key = exports.JS_Include_Segment_By_Key = exports.JS_Clear_All_By_Key = exports.JS_Clear_All = exports.JS_Clear_Subsegments_By_Key = exports.JS_Clear_Subsegments = exports.JS_Clear_Styles_By_Key = exports.JS_Clear_Styles = exports.JS_Clear_Includes_By_Key = exports.JS_Clear_Includes = exports.JS_Clear_Attributes_By_Key = exports.JS_Clear_Attributes = exports.JS_Clear_Geometry_By_Key = exports.JS_Clear_Geometry = exports.JS_Delete_By_Key = exports.JS_Delete_Segment_By_Key = exports.JS_Delete_Segment = exports.JS_Close_Segment = exports.JS_Open_Segment_By_Key = exports.JS_Open_Segment = exports.JS_Fina_Multithreading_Services = exports.JS_Init_Multithreading_Services = exports.JS_Fina_Database = exports.JS_Init_Database = exports.JS_Init_Apis = exports.GsWebGLUtility = exports.ViewerEvent = exports.UpdateInfo = exports.UpdateDisplayType = exports.ThreadPromise = exports.Viewer = exports.GLTypes = exports.CollisionType = exports.LightingMode = exports.TextAlignment = exports.FontUnitsType = exports.AreaSelectionType = exports.UpdateType = exports.CoordinateSystem = exports.ViewMode = exports.EdgeType = exports.VertexType = exports.ElementType = exports.ObjectType = exports.CameraChangeType = void 0;\n idb_1 = tslib_1.__importDefault(idb_1);\n var JS_Init_Database = window.JS_Init_Database;\n exports.JS_Init_Database = JS_Init_Database;\n var JS_Fina_Database = window.JS_Fina_Database;\n exports.JS_Fina_Database = JS_Fina_Database;\n var JS_Init_Multithreading_Services = window.JS_Init_Multithreading_Services;\n exports.JS_Init_Multithreading_Services = JS_Init_Multithreading_Services;\n var JS_Fina_Multithreading_Services = window.JS_Fina_Multithreading_Services;\n exports.JS_Fina_Multithreading_Services = JS_Fina_Multithreading_Services;\n var JS_Open_Segment = window.JS_Open_Segment;\n exports.JS_Open_Segment = JS_Open_Segment;\n var JS_Open_Segment_By_Key = window.JS_Open_Segment_By_Key;\n exports.JS_Open_Segment_By_Key = JS_Open_Segment_By_Key;\n var JS_Close_Segment = window.JS_Close_Segment;\n exports.JS_Close_Segment = JS_Close_Segment;\n var JS_Delete_Segment = window.JS_Delete_Segment;\n exports.JS_Delete_Segment = JS_Delete_Segment;\n var JS_Delete_Segment_By_Key = window.JS_Delete_Segment_By_Key;\n exports.JS_Delete_Segment_By_Key = JS_Delete_Segment_By_Key;\n var JS_Delete_By_Key = window.JS_Delete_By_Key;\n exports.JS_Delete_By_Key = JS_Delete_By_Key;\n var JS_Clear_Geometry = window.JS_Clear_Geometry;\n exports.JS_Clear_Geometry = JS_Clear_Geometry;\n var JS_Clear_Geometry_By_Key = window.JS_Clear_Geometry_By_Key;\n exports.JS_Clear_Geometry_By_Key = JS_Clear_Geometry_By_Key;\n var JS_Clear_Attributes = window.JS_Clear_Attributes;\n exports.JS_Clear_Attributes = JS_Clear_Attributes;\n var JS_Clear_Attributes_By_Key = window.JS_Clear_Attributes_By_Key;\n exports.JS_Clear_Attributes_By_Key = JS_Clear_Attributes_By_Key;\n var JS_Clear_Includes = window.JS_Clear_Includes;\n exports.JS_Clear_Includes = JS_Clear_Includes;\n var JS_Clear_Includes_By_Key = window.JS_Clear_Includes_By_Key;\n exports.JS_Clear_Includes_By_Key = JS_Clear_Includes_By_Key;\n var JS_Clear_Styles = window.JS_Clear_Styles;\n exports.JS_Clear_Styles = JS_Clear_Styles;\n var JS_Clear_Styles_By_Key = window.JS_Clear_Styles_By_Key;\n exports.JS_Clear_Styles_By_Key = JS_Clear_Styles_By_Key;\n var JS_Clear_Subsegments = window.JS_Clear_Subsegments;\n exports.JS_Clear_Subsegments = JS_Clear_Subsegments;\n var JS_Clear_Subsegments_By_Key = window.JS_Clear_Subsegments_By_Key;\n exports.JS_Clear_Subsegments_By_Key = JS_Clear_Subsegments_By_Key;\n var JS_Clear_All = window.JS_Clear_All;\n exports.JS_Clear_All = JS_Clear_All;\n var JS_Clear_All_By_Key = window.JS_Clear_All_By_Key;\n exports.JS_Clear_All_By_Key = JS_Clear_All_By_Key;\n var JS_Include_Segment_By_Key = window.JS_Include_Segment_By_Key;\n exports.JS_Include_Segment_By_Key = JS_Include_Segment_By_Key;\n var JS_Conditional_Include_By_Key = window.JS_Conditional_Include_By_Key;\n exports.JS_Conditional_Include_By_Key = JS_Conditional_Include_By_Key;\n var JS_Style_Segment_By_Key = window.JS_Style_Segment_By_Key;\n exports.JS_Style_Segment_By_Key = JS_Style_Segment_By_Key;\n var JS_Conditional_Style_By_Key = window.JS_Conditional_Style_By_Key;\n exports.JS_Conditional_Style_By_Key = JS_Conditional_Style_By_Key;\n var JS_Make_Context_Current = window.JS_Make_Context_Current;\n exports.JS_Make_Context_Current = JS_Make_Context_Current;\n var JS_Update_Display = window.JS_Update_Display;\n exports.JS_Update_Display = JS_Update_Display;\n var JS_Update_View_Display_By_Key = window.JS_Update_View_Display_By_Key;\n exports.JS_Update_View_Display_By_Key = JS_Update_View_Display_By_Key;\n var JS_Update_View_Display_With_Framerate_By_Key = window.JS_Update_View_Display_With_Framerate_By_Key;\n exports.JS_Update_View_Display_With_Framerate_By_Key = JS_Update_View_Display_With_Framerate_By_Key;\n var JS_Update_View_Display_With_Time_By_Key = window.JS_Update_View_Display_With_Time_By_Key;\n exports.JS_Update_View_Display_With_Time_By_Key = JS_Update_View_Display_With_Time_By_Key;\n var JS_Asyn_Update_Geometry_Data_By_Key = window.JS_Asyn_Update_Geometry_Data_By_Key;\n exports.JS_Asyn_Update_Geometry_Data_By_Key = JS_Asyn_Update_Geometry_Data_By_Key;\n var JS_Asyn_Update_Geometry_Data_By_Key_Tt = window.JS_Asyn_Update_Geometry_Data_By_Key_Tt;\n exports.JS_Asyn_Update_Geometry_Data_By_Key_Tt = JS_Asyn_Update_Geometry_Data_By_Key_Tt;\n var JS_Asyn_Need_Update_View_By_Key = window.JS_Asyn_Need_Update_View_By_Key;\n exports.JS_Asyn_Need_Update_View_By_Key = JS_Asyn_Need_Update_View_By_Key;\n var JS_Asyn_Update_Camera_By_Key = window.JS_Asyn_Update_Camera_By_Key;\n exports.JS_Asyn_Update_Camera_By_Key = JS_Asyn_Update_Camera_By_Key;\n var JS_Asyn_Update_View_By_Key = window.JS_Asyn_Update_View_By_Key;\n exports.JS_Asyn_Update_View_By_Key = JS_Asyn_Update_View_By_Key;\n var JS_Asyn_Update_View_By_Key_Tt = window.JS_Asyn_Update_View_By_Key_Tt;\n exports.JS_Asyn_Update_View_By_Key_Tt = JS_Asyn_Update_View_By_Key_Tt;\n var JS_Asyn_Render_View_By_Key = window.JS_Asyn_Render_View_By_Key;\n exports.JS_Asyn_Render_View_By_Key = JS_Asyn_Render_View_By_Key;\n var JS_Asyn_Render_View_With_Time_By_Key = window.JS_Asyn_Render_View_With_Time_By_Key;\n exports.JS_Asyn_Render_View_With_Time_By_Key = JS_Asyn_Render_View_With_Time_By_Key;\n var JS_Show_Asyn_Geometry_Data_Keys = window.JS_Show_Asyn_Geometry_Data_Keys;\n exports.JS_Show_Asyn_Geometry_Data_Keys = JS_Show_Asyn_Geometry_Data_Keys;\n var JS_Show_Asyn_Remove_Geometry_Data_Keys = window.JS_Show_Asyn_Remove_Geometry_Data_Keys;\n exports.JS_Show_Asyn_Remove_Geometry_Data_Keys = JS_Show_Asyn_Remove_Geometry_Data_Keys;\n var JS_Show_Asyn_Buffer_Geometry_Keys = window.JS_Show_Asyn_Buffer_Geometry_Keys;\n exports.JS_Show_Asyn_Buffer_Geometry_Keys = JS_Show_Asyn_Buffer_Geometry_Keys;\n var JS_Asyn_Buffer_Geometry_By_Key = window.JS_Asyn_Buffer_Geometry_By_Key;\n exports.JS_Asyn_Buffer_Geometry_By_Key = JS_Asyn_Buffer_Geometry_By_Key;\n var JS_Asyn_Buffer_Geometry_By_Key_Tt = window.JS_Asyn_Buffer_Geometry_By_Key_Tt;\n exports.JS_Asyn_Buffer_Geometry_By_Key_Tt = JS_Asyn_Buffer_Geometry_By_Key_Tt;\n var JS_Show_Asyn_Unbuffer_Geometry_Keys = window.JS_Show_Asyn_Unbuffer_Geometry_Keys;\n var JS_Asyn_Unbuffer_Geometry_By_Key = window.JS_Asyn_Unbuffer_Geometry_By_Key;\n var JS_Show_Key_Type = window.JS_Show_Key_Type;\n exports.JS_Show_Key_Type = JS_Show_Key_Type;\n var JS_Show_Owner_By_Key = window.JS_Show_Owner_By_Key;\n exports.JS_Show_Owner_By_Key = JS_Show_Owner_By_Key;\n var JS_Compute_Path = window.JS_Compute_Path;\n exports.JS_Compute_Path = JS_Compute_Path;\n var JS_Compute_Coordinates_By_Key = null;\n exports.JS_Compute_Coordinates_By_Key = JS_Compute_Coordinates_By_Key;\n var JS_Compute_Coordinates_By_Path = window.JS_Compute_Coordinates_By_Path;\n exports.JS_Compute_Coordinates_By_Path = JS_Compute_Coordinates_By_Path;\n var JS_DCompute_Coordinates_By_Key = window.JS_DCompute_Coordinates_By_Key;\n var JS_Compute_Boundingbox_By_Key = window.JS_Compute_Boundingbox_By_Key;\n exports.JS_Compute_Boundingbox_By_Key = JS_Compute_Boundingbox_By_Key;\n var JS_Compute_Boundingbox_With_Visibility_By_Key = null;\n exports.JS_Compute_Boundingbox_With_Visibility_By_Key = JS_Compute_Boundingbox_With_Visibility_By_Key;\n var JS_Compute_View_Boundingbox_By_Key = null;\n exports.JS_Compute_View_Boundingbox_By_Key = JS_Compute_View_Boundingbox_By_Key;\n var JS_Compute_View_Boundingbox_By_Keys = window.JS_Compute_View_Boundingbox_By_Keys;\n exports.JS_Compute_View_Boundingbox_By_Keys = JS_Compute_View_Boundingbox_By_Keys;\n var JS_Compute_View_Boundingboxes_By_Keys = window.JS_Compute_View_Boundingboxes_By_Keys;\n exports.JS_Compute_View_Boundingboxes_By_Keys = JS_Compute_View_Boundingboxes_By_Keys;\n var JS_Compute_Segment_Boundingbox_By_Key = window.JS_Compute_Segment_Boundingbox_By_Key;\n exports.JS_Compute_Segment_Boundingbox_By_Key = JS_Compute_Segment_Boundingbox_By_Key;\n var JS_Clear_Segment_Boundingbox_By_Key = window.JS_Clear_Segment_Boundingbox_By_Key;\n exports.JS_Clear_Segment_Boundingbox_By_Key = JS_Clear_Segment_Boundingbox_By_Key;\n var JS_Show_BoundingBox_By_Key = window.JS_Show_BoundingBox_By_Key;\n exports.JS_Show_BoundingBox_By_Key = JS_Show_BoundingBox_By_Key;\n var JS_Compute_Visible_By_Key = window.JS_Compute_Visible_By_Key;\n exports.JS_Compute_Visible_By_Key = JS_Compute_Visible_By_Key;\n var JS_Show_Attribute_Count = window.JS_Show_Attribute_Count;\n exports.JS_Show_Attribute_Count = JS_Show_Attribute_Count;\n var JS_Show_Attribute_List = window.JS_Show_Attribute_List;\n exports.JS_Show_Attribute_List = JS_Show_Attribute_List;\n var JS_Show_Geometry_Count = window.JS_Show_Geometry_Count;\n exports.JS_Show_Geometry_Count = JS_Show_Geometry_Count;\n var JS_Show_Geometry_List = window.JS_Show_Geometry_List;\n exports.JS_Show_Geometry_List = JS_Show_Geometry_List;\n var JS_Show_Subsegment_Count = window.JS_Show_Subsegment_Count;\n exports.JS_Show_Subsegment_Count = JS_Show_Subsegment_Count;\n var JS_Show_Subsegment_List = window.JS_Show_Subsegment_List;\n exports.JS_Show_Subsegment_List = JS_Show_Subsegment_List;\n var JS_Show_All_Subsegment_Count = window.JS_Show_All_Subsegment_Count;\n exports.JS_Show_All_Subsegment_Count = JS_Show_All_Subsegment_Count;\n var JS_Show_All_Subsegment_List = window.JS_Show_All_Subsegment_List;\n exports.JS_Show_All_Subsegment_List = JS_Show_All_Subsegment_List;\n var JS_Show_Include_Count = window.JS_Show_Include_Count;\n exports.JS_Show_Include_Count = JS_Show_Include_Count;\n var JS_Show_Include_List = window.JS_Show_Include_List;\n exports.JS_Show_Include_List = JS_Show_Include_List;\n var JS_Show_Include = window.JS_Show_Include;\n exports.JS_Show_Include = JS_Show_Include;\n var JS_Show_Include_Segment = window.JS_Show_Include_Segment;\n exports.JS_Show_Include_Segment = JS_Show_Include_Segment;\n var JS_Show_Style_Count = window.JS_Show_Style_Count;\n exports.JS_Show_Style_Count = JS_Show_Style_Count;\n var JS_Show_Style_List = window.JS_Show_Style_List;\n exports.JS_Show_Style_List = JS_Show_Style_List;\n var JS_Show_Style = window.JS_Show_Style;\n exports.JS_Show_Style = JS_Show_Style;\n var JS_Show_Style_Segment = window.JS_Show_Style_Segment;\n exports.JS_Show_Style_Segment = JS_Show_Style_Segment;\n var JS_Show_Segment_Name = window.JS_Show_Segment_Name;\n exports.JS_Show_Segment_Name = JS_Show_Segment_Name;\n var JS_Show_Segment_Path = window.JS_Show_Segment_Path;\n exports.JS_Show_Segment_Path = JS_Show_Segment_Path;\n var JS_Segment_Exists = window.JS_Segment_Exists;\n exports.JS_Segment_Exists = JS_Segment_Exists;\n var JS_Move_Key = window.JS_Move_Key;\n exports.JS_Move_Key = JS_Move_Key;\n var JS_Move_Key_By_Key = window.JS_Move_Key_By_Key;\n exports.JS_Move_Key_By_Key = JS_Move_Key_By_Key;\n var JS_Rename_Segment = window.JS_Rename_Segment;\n exports.JS_Rename_Segment = JS_Rename_Segment;\n var JS_Add_Property_Boolean = window.JS_Add_Property_Boolean;\n exports.JS_Add_Property_Boolean = JS_Add_Property_Boolean;\n var JS_Add_Property_Integer = window.JS_Add_Property_Integer;\n exports.JS_Add_Property_Integer = JS_Add_Property_Integer;\n var JS_Add_Property_Double = window.JS_Add_Property_Double;\n exports.JS_Add_Property_Double = JS_Add_Property_Double;\n var JS_Add_Property_String = window.JS_Add_Property_String;\n exports.JS_Add_Property_String = JS_Add_Property_String;\n var JS_Add_Property_Json = window.JS_Add_Property_Json;\n exports.JS_Add_Property_Json = JS_Add_Property_Json;\n var JS_Show_Property_Type = window.JS_Show_Property_Type;\n exports.JS_Show_Property_Type = JS_Show_Property_Type;\n var JS_Show_Property_Boolean = window.JS_Show_Property_Boolean;\n exports.JS_Show_Property_Boolean = JS_Show_Property_Boolean;\n var JS_Show_Property_Integer = window.JS_Show_Property_Integer;\n exports.JS_Show_Property_Integer = JS_Show_Property_Integer;\n var JS_Show_Property_Double = window.JS_Show_Property_Double;\n exports.JS_Show_Property_Double = JS_Show_Property_Double;\n var JS_Show_Property_String = window.JS_Show_Property_String;\n exports.JS_Show_Property_String = JS_Show_Property_String;\n var JS_Property_Exists = window.JS_Property_Exists;\n exports.JS_Property_Exists = JS_Property_Exists;\n var _JS_Remove_Property = window.JS_Remove_Property;\n exports.JS_Remove_Property = _JS_Remove_Property;\n var JS_Clear_Properties = window.JS_Clear_Properties;\n exports.JS_Clear_Properties = JS_Clear_Properties;\n var JS_Show_Properties = window.JS_Show_Properties;\n exports.JS_Show_Properties = JS_Show_Properties;\n var JS_Show_Key_By_Id = window.JS_Show_Key_By_Id;\n exports.JS_Show_Key_By_Id = JS_Show_Key_By_Id;\n var JS_Set_Key_Index = window.JS_Set_Key_Index;\n exports.JS_Set_Key_Index = JS_Set_Key_Index;\n var JS_Show_Key_Index = window.JS_Show_Key_Index;\n exports.JS_Show_Key_Index = JS_Show_Key_Index;\n var JS_Show_Key_Tag = window.JS_Show_Key_Tag;\n exports.JS_Show_Key_Tag = JS_Show_Key_Tag;\n var JS_Compute_Selection_By_Key = window.JS_Compute_Selection_By_Key;\n exports.JS_Compute_Selection_By_Key = JS_Compute_Selection_By_Key;\n var JS_Compute_Selection_By_Area = window.JS_Compute_Selection_By_Area;\n exports.JS_Compute_Selection_By_Area = JS_Compute_Selection_By_Area;\n var JS_Show_Selection_Count = window.JS_Show_Selection_Count;\n exports.JS_Show_Selection_Count = JS_Show_Selection_Count;\n var JS_Show_Selection_Element = window.JS_Show_Selection_Element;\n exports.JS_Show_Selection_Element = JS_Show_Selection_Element;\n var JS_Show_Selection_Path = window.JS_Show_Selection_Path;\n exports.JS_Show_Selection_Path = JS_Show_Selection_Path;\n var JS_Show_Selection_Path_By_Keys = window.JS_Show_Selection_Path_By_Keys;\n exports.JS_Show_Selection_Path_By_Keys = JS_Show_Selection_Path_By_Keys;\n var JS_Show_Selection_Position = window.JS_Show_Selection_Position;\n exports.JS_Show_Selection_Position = JS_Show_Selection_Position;\n var JS_Show_Selection_Param = window.JS_Show_Selection_Param;\n exports.JS_Show_Selection_Param = JS_Show_Selection_Param;\n var JS_Show_Selection_Indexes = window.JS_Show_Selection_Indexes;\n exports.JS_Show_Selection_Indexes = JS_Show_Selection_Indexes;\n var JS_Show_Selection_Test_Info = window.JS_Show_Selection_Test_Info;\n exports.JS_Show_Selection_Test_Info = JS_Show_Selection_Test_Info;\n var JS_Compute_Collision_By_Keys = window.JS_Compute_Collision_By_Keys;\n exports.JS_Compute_Collision_By_Keys = JS_Compute_Collision_By_Keys;\n var JS_Compute_Collision_By_Key = window.JS_Compute_Collision_By_Key;\n exports.JS_Compute_Collision_By_Key = JS_Compute_Collision_By_Key;\n var JS_Compute_Collision_By_Key_Tt = window.JS_Compute_Collision_By_Key_Tt;\n exports.JS_Compute_Collision_By_Key_Tt = JS_Compute_Collision_By_Key_Tt;\n var JS_Compute_Collision_By_Keys_Tt = window.JS_Compute_Collision_By_Keys_Tt;\n exports.JS_Compute_Collision_By_Keys_Tt = JS_Compute_Collision_By_Keys_Tt;\n var JS_Show_Collision_Status = window.JS_Show_Collision_Status;\n exports.JS_Show_Collision_Status = JS_Show_Collision_Status;\n var JS_Show_Collision_Count = window.JS_Show_Collision_Count;\n exports.JS_Show_Collision_Count = JS_Show_Collision_Count;\n var JS_Show_Collision_Elements = window.JS_Show_Collision_Elements;\n exports.JS_Show_Collision_Elements = JS_Show_Collision_Elements;\n var JS_Show_Collision_Paths = window.JS_Show_Collision_Paths;\n exports.JS_Show_Collision_Paths = JS_Show_Collision_Paths;\n var JS_Show_Collision_Path_By_Keys = window.JS_Show_Collision_Path_By_Keys;\n exports.JS_Show_Collision_Path_By_Keys = JS_Show_Collision_Path_By_Keys;\n var JS_Show_Collision_Position = window.JS_Show_Collision_Position;\n exports.JS_Show_Collision_Position = JS_Show_Collision_Position;\n var JS_Show_Collision_Type = window.JS_Show_Collision_Type;\n exports.JS_Show_Collision_Type = JS_Show_Collision_Type;\n var JS_Add_Font_Library = window.JS_Add_Font_Library;\n exports.JS_Add_Font_Library = JS_Add_Font_Library;\n var JS_Font_Library_Exists = window.JS_Font_Library_Exists;\n exports.JS_Font_Library_Exists = JS_Font_Library_Exists;\n var JS_Remove_Font_Library = window.JS_Remove_Font_Library;\n exports.JS_Remove_Font_Library = JS_Remove_Font_Library;\n var JS_Clear_Font_Library = window.JS_Clear_Font_Library;\n exports.JS_Clear_Font_Library = JS_Clear_Font_Library;\n var JS_Set_Driver_Configs = window.JS_Set_Driver_Configs;\n exports.JS_Set_Driver_Configs = JS_Set_Driver_Configs;\n var JS_Set_Driver_Options = window.JS_Set_Driver_Options;\n exports.JS_Set_Driver_Options = JS_Set_Driver_Options;\n var JS_Show_Driver_Options = window.JS_Show_Driver_Options;\n exports.JS_Show_Driver_Options = JS_Show_Driver_Options;\n var JS_Show_One_Driver_Option = window.JS_Show_One_Driver_Option;\n exports.JS_Show_One_Driver_Option = JS_Show_One_Driver_Option;\n var JS_Set_Shader = window.JS_Set_Shader;\n exports.JS_Set_Shader = JS_Set_Shader;\n var JS_Show_Shader = window.JS_Show_Shader;\n exports.JS_Show_Shader = JS_Show_Shader;\n var JS_Show_One_Shader = window.JS_Show_One_Shader;\n exports.JS_Show_One_Shader = JS_Show_One_Shader;\n var JS_UnSet_Shader = window.JS_UnSet_Shader;\n exports.JS_UnSet_Shader = JS_UnSet_Shader;\n var JS_Set_Viewport = window.JS_Set_Viewport;\n exports.JS_Set_Viewport = JS_Set_Viewport;\n var JS_Set_Camera = window.JS_Set_Camera;\n exports.JS_Set_Camera = JS_Set_Camera;\n var JS_Set_Camera_Position = window.JS_Set_Camera_Position;\n exports.JS_Set_Camera_Position = JS_Set_Camera_Position;\n var JS_Set_Camera_Target = window.JS_Set_Camera_Target;\n exports.JS_Set_Camera_Target = JS_Set_Camera_Target;\n var JS_Set_Camera_Up = window.JS_Set_Camera_Up;\n exports.JS_Set_Camera_Up = JS_Set_Camera_Up;\n var JS_Set_Camera_Field = window.JS_Set_Camera_Field;\n exports.JS_Set_Camera_Field = JS_Set_Camera_Field;\n var JS_Set_Camera_Extent = window.JS_Set_Camera_Extent;\n exports.JS_Set_Camera_Extent = JS_Set_Camera_Extent;\n var JS_Set_Camera_Projection = window.JS_Set_Camera_Projection;\n exports.JS_Set_Camera_Projection = JS_Set_Camera_Projection;\n var JS_Keep_Camera_Ratio = window.JS_Keep_Camera_Ratio;\n exports.JS_Keep_Camera_Ratio = JS_Keep_Camera_Ratio;\n var JS_Show_Camera = window.JS_Show_Camera;\n exports.JS_Show_Camera = JS_Show_Camera;\n var JS_Show_Camera_Position = window.JS_Show_Camera_Position;\n exports.JS_Show_Camera_Position = JS_Show_Camera_Position;\n var JS_Show_Camera_Target = window.JS_Show_Camera_Target;\n exports.JS_Show_Camera_Target = JS_Show_Camera_Target;\n var JS_Show_Camera_Up = window.JS_Show_Camera_Up;\n exports.JS_Show_Camera_Up = JS_Show_Camera_Up;\n var JS_Show_Camera_Field = window.JS_Show_Camera_Field;\n exports.JS_Show_Camera_Field = JS_Show_Camera_Field;\n var JS_Show_Camera_Extent = window.JS_Show_Camera_Extent;\n exports.JS_Show_Camera_Extent = JS_Show_Camera_Extent;\n var JS_Show_Camera_Projection = window.JS_Show_Camera_Projection;\n exports.JS_Show_Camera_Projection = JS_Show_Camera_Projection;\n var JS_Show_Camera_Projection_Matrix = window.JS_Show_Camera_Projection_Matrix;\n exports.JS_Show_Camera_Projection_Matrix = JS_Show_Camera_Projection_Matrix;\n var JS_Show_Camera_View_Matrix = window.JS_Show_Camera_View_Matrix;\n exports.JS_Show_Camera_View_Matrix = JS_Show_Camera_View_Matrix;\n var JS_Show_Path_Camera_Position = window.JS_Show_Path_Camera_Position;\n exports.JS_Show_Path_Camera_Position = JS_Show_Path_Camera_Position;\n var JS_Show_Path_Camera_Target = window.JS_Show_Path_Camera_Target;\n exports.JS_Show_Path_Camera_Target = JS_Show_Path_Camera_Target;\n var JS_Dolly_Camera = window.JS_Dolly_Camera;\n exports.JS_Dolly_Camera = JS_Dolly_Camera;\n var JS_Roll_Camera = window.JS_Roll_Camera;\n exports.JS_Roll_Camera = JS_Roll_Camera;\n var JS_Zoom_Camera = window.JS_Zoom_Camera;\n exports.JS_Zoom_Camera = JS_Zoom_Camera;\n var JS_UnSet_Camera = window.JS_UnSet_Camera;\n exports.JS_UnSet_Camera = JS_UnSet_Camera;\n var JS_Set_Color = window.JS_Set_Color;\n exports.JS_Set_Color = JS_Set_Color;\n var JS_UnSet_Color = window.JS_UnSet_Color;\n exports.JS_UnSet_Color = JS_UnSet_Color;\n var JS_UnSet_One_Color = window.JS_UnSet_One_Color;\n exports.JS_UnSet_One_Color = JS_UnSet_One_Color;\n var JS_Show_Color = window.JS_Show_Color;\n exports.JS_Show_Color = JS_Show_Color;\n var JS_Show_One_Color = window.JS_Show_One_Color;\n exports.JS_Show_One_Color = JS_Show_One_Color;\n var JS_Show_Color_By_Value = window.JS_Show_Color_By_Value;\n exports.JS_Show_Color_By_Value = JS_Show_Color_By_Value;\n var JS_Set_Geometry_Color = window.JS_Set_Geometry_Color;\n exports.JS_Set_Geometry_Color = JS_Set_Geometry_Color;\n var JS_Set_Geometry_Color_By_Value = window.JS_Set_Geometry_Color_By_Value;\n exports.JS_Set_Geometry_Color_By_Value = JS_Set_Geometry_Color_By_Value;\n var JS_Show_Geometry_Color_By_Value = window.JS_Show_Geometry_Color_By_Value;\n exports.JS_Show_Geometry_Color_By_Value = JS_Show_Geometry_Color_By_Value;\n var JS_UnSet_Geometry_Color = window.JS_UnSet_Geometry_Color;\n exports.JS_UnSet_Geometry_Color = JS_UnSet_Geometry_Color;\n var JS_Set_Visibility = window.JS_Set_Visibility;\n exports.JS_Set_Visibility = JS_Set_Visibility;\n var JS_UnSet_Visibility = window.JS_UnSet_Visibility;\n exports.JS_UnSet_Visibility = JS_UnSet_Visibility;\n var JS_UnSet_One_Visibility = window.JS_UnSet_One_Visibility;\n exports.JS_UnSet_One_Visibility = JS_UnSet_One_Visibility;\n var JS_Show_Visibility = window.JS_Show_Visibility;\n exports.JS_Show_Visibility = JS_Show_Visibility;\n var JS_Show_One_Visibility = window.JS_Show_One_Visibility;\n exports.JS_Show_One_Visibility = JS_Show_One_Visibility;\n var JS_Set_Selectability = window.JS_Set_Selectability;\n exports.JS_Set_Selectability = JS_Set_Selectability;\n var JS_UnSet_Selectability = window.JS_UnSet_Selectability;\n exports.JS_UnSet_Selectability = JS_UnSet_Selectability;\n var JS_UnSet_One_Selectability = window.JS_UnSet_One_Selectability;\n exports.JS_UnSet_One_Selectability = JS_UnSet_One_Selectability;\n var JS_Show_Selectability = window.JS_Show_Selectability;\n exports.JS_Show_Selectability = JS_Show_Selectability;\n var JS_Show_One_Selectability = window.JS_Show_One_Selectability;\n exports.JS_Show_One_Selectability = JS_Show_One_Selectability;\n var JS_Set_ModellingMatrix = window.JS_Set_ModellingMatrix;\n exports.JS_Set_ModellingMatrix = JS_Set_ModellingMatrix;\n var JS_Append_ModellingMatrix = window.JS_Append_ModellingMatrix;\n exports.JS_Append_ModellingMatrix = JS_Append_ModellingMatrix;\n var JS_Show_ModellingMatrix = window.JS_Show_ModellingMatrix;\n exports.JS_Show_ModellingMatrix = JS_Show_ModellingMatrix;\n var JS_Show_Path_ModellingMatrix = window.JS_Show_Path_ModellingMatrix;\n exports.JS_Show_Path_ModellingMatrix = JS_Show_Path_ModellingMatrix;\n var JS_UnSet_ModellingMatrix = window.JS_UnSet_ModellingMatrix;\n exports.JS_UnSet_ModellingMatrix = JS_UnSet_ModellingMatrix;\n var JS_Set_Rendering_Options = window.JS_Set_Rendering_Options;\n exports.JS_Set_Rendering_Options = JS_Set_Rendering_Options;\n var JS_UnSet_Rendering_Options = window.JS_UnSet_Rendering_Options;\n exports.JS_UnSet_Rendering_Options = JS_UnSet_Rendering_Options;\n var JS_UnSet_One_Rendering_Option = window.JS_UnSet_One_Rendering_Option;\n exports.JS_UnSet_One_Rendering_Option = JS_UnSet_One_Rendering_Option;\n var JS_Show_Rendering_Options = window.JS_Show_Rendering_Options;\n exports.JS_Show_Rendering_Options = JS_Show_Rendering_Options;\n var JS_Show_One_Rendering_Option = window.JS_Show_One_Rendering_Option;\n exports.JS_Show_One_Rendering_Option = JS_Show_One_Rendering_Option;\n var JS_Show_One_Default_Rendering_Option = window.JS_Show_One_Default_Rendering_Option;\n exports.JS_Show_One_Default_Rendering_Option = JS_Show_One_Default_Rendering_Option;\n var JS_Show_One_Path_Rendering_Option = window.JS_Show_One_Path_Rendering_Option;\n exports.JS_Show_One_Path_Rendering_Option = JS_Show_One_Path_Rendering_Option;\n var JS_Set_Heuristic_Options = window.JS_Set_Heuristic_Options;\n exports.JS_Set_Heuristic_Options = JS_Set_Heuristic_Options;\n var JS_Set_One_Heuristic_Option = window.JS_Set_One_Heuristic_Option;\n exports.JS_Set_One_Heuristic_Option = JS_Set_One_Heuristic_Option;\n var JS_UnSet_Heuristic_Options = window.JS_UnSet_Heuristic_Options;\n exports.JS_UnSet_Heuristic_Options = JS_UnSet_Heuristic_Options;\n var JS_UnSet_One_Heuristic_Option = window.JS_UnSet_One_Heuristic_Option;\n exports.JS_UnSet_One_Heuristic_Option = JS_UnSet_One_Heuristic_Option;\n var JS_Show_Heuristic_Options = window.JS_Show_Heuristic_Options;\n exports.JS_Show_Heuristic_Options = JS_Show_Heuristic_Options;\n var JS_Show_One_Heuristic_Option = window.JS_Show_One_Heuristic_Option;\n exports.JS_Show_One_Heuristic_Option = JS_Show_One_Heuristic_Option;\n var JS_Set_Condition = window.JS_Set_Condition;\n exports.JS_Set_Condition = JS_Set_Condition;\n var JS_Show_Condition = window.JS_Show_Condition;\n exports.JS_Show_Condition = JS_Show_Condition;\n var JS_UnSet_Condition = window.JS_UnSet_Condition;\n exports.JS_UnSet_Condition = JS_UnSet_Condition;\n var JS_Set_Text_Font = window.JS_Set_Text_Font;\n exports.JS_Set_Text_Font = JS_Set_Text_Font;\n var JS_UnSet_Text_Font = window.JS_UnSet_Text_Font;\n exports.JS_UnSet_Text_Font = JS_UnSet_Text_Font;\n var JS_UnSet_One_Text_Font = window.JS_UnSet_One_Text_Font;\n exports.JS_UnSet_One_Text_Font = JS_UnSet_One_Text_Font;\n var JS_Show_Text_Font = window.JS_Show_Text_Font;\n exports.JS_Show_Text_Font = JS_Show_Text_Font;\n var JS_Show_One_Text_Font = window.JS_Show_One_Text_Font;\n exports.JS_Show_One_Text_Font = JS_Show_One_Text_Font;\n var JS_Attribute_Exists = window.JS_Attribute_Exists;\n exports.JS_Attribute_Exists = JS_Attribute_Exists;\n var JS_Image_Exists = window.JS_Image_Exists;\n exports.JS_Image_Exists = JS_Image_Exists;\n var JS_Resize_By_Key = window.JS_Resize_By_Key;\n exports.JS_Resize_By_Key = JS_Resize_By_Key;\n var JS_Insert_Marker = window.JS_Insert_Marker;\n exports.JS_Insert_Marker = JS_Insert_Marker;\n var JS_Edit_Marker = window.JS_Edit_Marker;\n exports.JS_Edit_Marker = JS_Edit_Marker;\n var JS_Show_Marker = window.JS_Show_Marker;\n exports.JS_Show_Marker = JS_Show_Marker;\n var JS_Insert_Point_Cloud = window.JS_Insert_Point_Cloud;\n exports.JS_Insert_Point_Cloud = JS_Insert_Point_Cloud;\n var JS_Edit_Point_Cloud = window.JS_Edit_Point_Cloud;\n exports.JS_Edit_Point_Cloud = JS_Edit_Point_Cloud;\n var JS_Show_Point_Cloud = window.JS_Show_Point_Cloud;\n exports.JS_Show_Point_Cloud = JS_Show_Point_Cloud;\n var JS_Insert_Line = window.JS_Insert_Line;\n exports.JS_Insert_Line = JS_Insert_Line;\n var JS_Show_Line = window.JS_Show_Line;\n exports.JS_Show_Line = JS_Show_Line;\n var JS_Edit_Line = window.JS_Edit_Line;\n exports.JS_Edit_Line = JS_Edit_Line;\n var JS_Insert_Polyline = window.JS_Insert_Polyline;\n exports.JS_Insert_Polyline = JS_Insert_Polyline;\n var JS_Show_Polyline_Count = window.JS_Show_Polyline_Count;\n exports.JS_Show_Polyline_Count = JS_Show_Polyline_Count;\n var JS_Show_Polyline = window.JS_Show_Polyline;\n exports.JS_Show_Polyline = JS_Show_Polyline;\n var JS_Insert_Circle = window.JS_Insert_Circle;\n exports.JS_Insert_Circle = JS_Insert_Circle;\n var JS_Show_Circle = window.JS_Show_Circle;\n exports.JS_Show_Circle = JS_Show_Circle;\n var JS_Insert_Cylinder = window.JS_Insert_Cylinder;\n exports.JS_Insert_Cylinder = JS_Insert_Cylinder;\n var JS_Show_Cylinder = window.JS_Show_Cylinder;\n exports.JS_Show_Cylinder = JS_Show_Cylinder;\n var JS_Insert_PolyCylinder = window.JS_Insert_PolyCylinder;\n exports.JS_Insert_PolyCylinder = JS_Insert_PolyCylinder;\n var JS_Edit_PolyCylinder = window.JS_Edit_PolyCylinder;\n exports.JS_Edit_PolyCylinder = JS_Edit_PolyCylinder;\n var JS_Insert_Shell = window.JS_Insert_Shell;\n exports.JS_Insert_Shell = JS_Insert_Shell;\n var JS_Edit_Shell = window.JS_Edit_Shell;\n exports.JS_Edit_Shell = JS_Edit_Shell;\n var JS_Show_Shell_Size = window.JS_Show_Shell_Size;\n exports.JS_Show_Shell_Size = JS_Show_Shell_Size;\n var JS_Show_Shell = window.JS_Show_Shell;\n exports.JS_Show_Shell = JS_Show_Shell;\n var JS_Insert_Triangular_Shell = window.JS_Insert_Triangular_Shell;\n exports.JS_Insert_Triangular_Shell = JS_Insert_Triangular_Shell;\n var JS_Insert_Mesh = window.JS_Insert_Mesh;\n exports.JS_Insert_Mesh = JS_Insert_Mesh;\n var JS_Edit_Mesh_Points = window.JS_Edit_Mesh_Points;\n exports.JS_Edit_Mesh_Points = JS_Edit_Mesh_Points;\n var JS_Show_Mesh_Size = window.JS_Show_Mesh_Size;\n exports.JS_Show_Mesh_Size = JS_Show_Mesh_Size;\n var JS_Show_Mesh = window.JS_Show_Mesh;\n exports.JS_Show_Mesh = JS_Show_Mesh;\n var JS_Insert_Vector_Text = window.JS_Insert_Vector_Text;\n exports.JS_Insert_Vector_Text = JS_Insert_Vector_Text;\n var JS_Insert_Parametric_Geometry = window.JS_Insert_Parametric_Geometry;\n exports.JS_Insert_Parametric_Geometry = JS_Insert_Parametric_Geometry;\n var JS_Insert_Parametric_Geometries = window.JS_Insert_Parametric_Geometries;\n exports.JS_Insert_Parametric_Geometries = JS_Insert_Parametric_Geometries;\n var JS_Edit_Parametric_Geometry = null;\n exports.JS_Edit_Parametric_Geometry = JS_Edit_Parametric_Geometry;\n var JS_Show_Parametric_Geometry = null;\n exports.JS_Show_Parametric_Geometry = JS_Show_Parametric_Geometry;\n var JS_Insert_Light = window.JS_Insert_Light;\n exports.JS_Insert_Light = JS_Insert_Light;\n var JS_Edit_Light = window.JS_Edit_Light;\n exports.JS_Edit_Light = JS_Edit_Light;\n var JS_Show_Light = window.JS_Show_Light;\n exports.JS_Show_Light = JS_Show_Light;\n var JS_Insert_Image = window.JS_Insert_Image;\n exports.JS_Insert_Image = JS_Insert_Image;\n var JS_Set_Image_Options = window.JS_Set_Image_Options;\n exports.JS_Set_Image_Options = JS_Set_Image_Options;\n var JS_UnSet_One_Image_Option = window.JS_UnSet_One_Image_Option;\n exports.JS_UnSet_One_Image_Option = JS_UnSet_One_Image_Option;\n var JS_Show_Image_Position = window.JS_Show_Image_Position;\n exports.JS_Show_Image_Position = JS_Show_Image_Position;\n var JS_Show_Image_Size = window.JS_Show_Image_Size;\n exports.JS_Show_Image_Size = JS_Show_Image_Size;\n var JS_Show_Image_Data = window.JS_Show_Image_Data;\n exports.JS_Show_Image_Data = JS_Show_Image_Data;\n var JS_Show_Image_Options = window.JS_Show_Image_Options;\n exports.JS_Show_Image_Options = JS_Show_Image_Options;\n var JS_Show_One_Image_Option = window.JS_Show_One_Image_Option;\n exports.JS_Show_One_Image_Option = JS_Show_One_Image_Option;\n var JS_Show_Image = window.JS_Show_Image;\n exports.JS_Show_Image = JS_Show_Image;\n var JS_Insert_Cutting_Planes = window.JS_Insert_Cutting_Planes;\n exports.JS_Insert_Cutting_Planes = JS_Insert_Cutting_Planes;\n var JS_Edit_Cutting_Planes = window.JS_Edit_Cutting_Planes;\n exports.JS_Edit_Cutting_Planes = JS_Edit_Cutting_Planes;\n var JS_Show_Cutting_Planes = window.JS_Show_Cutting_Planes;\n exports.JS_Show_Cutting_Planes = JS_Show_Cutting_Planes;\n var JS_Show_Geometry_Vertices_Position_By_Indexes = window.JS_Show_Geometry_Vertices_Position_By_Indexes;\n exports.JS_Show_Geometry_Vertices_Position_By_Indexes = JS_Show_Geometry_Vertices_Position_By_Indexes;\n var JS_Show_Geometry_Element_Type = window.JS_Show_Geometry_Element_Type;\n exports.JS_Show_Geometry_Element_Type = JS_Show_Geometry_Element_Type;\n var JS_Set_Geometry_Texture_Coords = window.JS_Set_Geometry_Texture_Coords;\n exports.JS_Set_Geometry_Texture_Coords = JS_Set_Geometry_Texture_Coords;\n var JS_Show_Geometry_Texture_Dimension = window.JS_Show_Geometry_Texture_Dimension;\n exports.JS_Show_Geometry_Texture_Dimension = JS_Show_Geometry_Texture_Dimension;\n var JS_Show_Geometry_Texture_Coords = window.JS_Show_Geometry_Texture_Coords;\n exports.JS_Show_Geometry_Texture_Coords = JS_Show_Geometry_Texture_Coords;\n var JS_UnSet_Geometry_Texture_Coords = window.JS_UnSet_Geometry_Texture_Coords;\n exports.JS_UnSet_Geometry_Texture_Coords = JS_UnSet_Geometry_Texture_Coords;\n var JS_Compute_Geometry_Texture_Coords = window.JS_Compute_Geometry_Texture_Coords;\n exports.JS_Compute_Geometry_Texture_Coords = JS_Compute_Geometry_Texture_Coords;\n var JS_Set_Geometry_Normals = window.JS_Set_Geometry_Normals;\n exports.JS_Set_Geometry_Normals = JS_Set_Geometry_Normals;\n var JS_Show_Geometry_Normals = window.JS_Show_Geometry_Normals;\n exports.JS_Show_Geometry_Normals = JS_Show_Geometry_Normals;\n var JS_UnSet_Geometry_Normals = window.JS_UnSet_Geometry_Normals;\n exports.JS_UnSet_Geometry_Normals = JS_UnSet_Geometry_Normals;\n var JS_Compute_Geometry_Tessellate_Data = window.JS_Compute_Geometry_Tessellate_Data;\n exports.JS_Compute_Geometry_Tessellate_Data = JS_Compute_Geometry_Tessellate_Data;\n var JS_Compute_Geometry_Data = window.JS_Compute_Geometry_Data;\n exports.JS_Compute_Geometry_Data = JS_Compute_Geometry_Data;\n var JS_Merge_Shell = window.JS_Merge_Shell;\n exports.JS_Merge_Shell = JS_Merge_Shell;\n var JS_Extrude_By_Shell = window.JS_Extrude_By_Shell;\n exports.JS_Extrude_By_Shell = JS_Extrude_By_Shell;\n var JS_Sweep_By_Shell = window.JS_Sweep_By_Shell;\n exports.JS_Sweep_By_Shell = JS_Sweep_By_Shell;\n var JS_DSweep_By_Shell = window.JS_DSweep_By_Shell;\n exports.JS_DSweep_By_Shell = JS_DSweep_By_Shell;\n var JS_DExtrude_By_Shell = window.JS_DExtrude_By_Shell;\n exports.JS_DExtrude_By_Shell = JS_DExtrude_By_Shell;\n var JS_Rotate_By_Shell = window.JS_Rotate_By_Shell;\n exports.JS_Rotate_By_Shell = JS_Rotate_By_Shell;\n var JS_DRotate_By_Shell = window.JS_DRotate_By_Shell;\n exports.JS_DRotate_By_Shell = JS_DRotate_By_Shell;\n var JS_Compute_Ray_Test = window.JS_Compute_Ray_Test;\n exports.JS_Compute_Ray_Test = JS_Compute_Ray_Test;\n var JS_Compute_Geometry_Ray_Test = window.JS_Compute_Geometry_Ray_Test;\n exports.JS_Compute_Geometry_Ray_Test = JS_Compute_Geometry_Ray_Test;\n var JS_Compute_Box_Test = window.JS_Compute_Box_Test;\n exports.JS_Compute_Box_Test = JS_Compute_Box_Test;\n var JS_Compute_Polygon_Area = window.JS_Compute_Polygon_Area;\n exports.JS_Compute_Polygon_Area = JS_Compute_Polygon_Area;\n var JS_Compute_Area = window.JS_Compute_Area;\n exports.JS_Compute_Area = JS_Compute_Area;\n var JS_Compute_Volume = window.JS_Compute_Volume;\n exports.JS_Compute_Volume = JS_Compute_Volume;\n var JS_Is_Solid_Geometry = window.JS_Is_Solid_Geometry;\n exports.JS_Is_Solid_Geometry = JS_Is_Solid_Geometry;\n var JS_Compute_Geometry_Distance = window.JS_Compute_Geometry_Distance;\n exports.JS_Compute_Geometry_Distance = JS_Compute_Geometry_Distance;\n var JS_Segment_To_Stream = window.JS_Segment_To_Stream;\n exports.JS_Segment_To_Stream = JS_Segment_To_Stream;\n var JS_Segment_To_Stream_By_Key = window.JS_Segment_To_Stream_By_Key;\n exports.JS_Segment_To_Stream_By_Key = JS_Segment_To_Stream_By_Key;\n var JS_Segment_To_Stream_With_Compression = window.JS_Segment_To_Stream_With_Compression;\n exports.JS_Segment_To_Stream_With_Compression = JS_Segment_To_Stream_With_Compression;\n var JS_Segment_To_Stream_With_Compression_By_Key = window.JS_Segment_To_Stream_With_Compression_By_Key;\n exports.JS_Segment_To_Stream_With_Compression_By_Key = JS_Segment_To_Stream_With_Compression_By_Key;\n var JS_Stream_To_Segment = window.JS_Stream_To_Segment;\n exports.JS_Stream_To_Segment = JS_Stream_To_Segment;\n var JS_Stream_To_Segment_By_Key = window.JS_Stream_To_Segment_By_Key;\n exports.JS_Stream_To_Segment_By_Key = JS_Stream_To_Segment_By_Key;\n var JS_Stream_To_Segment_By_Key_Tt = window.JS_Stream_To_Segment_By_Key_Tt;\n exports.JS_Stream_To_Segment_By_Key_Tt = JS_Stream_To_Segment_By_Key_Tt;\n var JS_Stream_With_Compression_To_Segment_By_Key = window.JS_Stream_With_Compression_To_Segment_By_Key;\n exports.JS_Stream_With_Compression_To_Segment_By_Key = JS_Stream_With_Compression_To_Segment_By_Key;\n var JS_Segment_Data_To_Stream = window.JS_Segment_Data_To_Stream;\n exports.JS_Segment_Data_To_Stream = JS_Segment_Data_To_Stream;\n var JS_Stream_To_Segment_Data = window.JS_Stream_To_Segment_Data;\n exports.JS_Stream_To_Segment_Data = JS_Stream_To_Segment_Data;\n var JS_Geometry_Data_To_Stream = window.JS_Geometry_Data_To_Stream;\n exports.JS_Geometry_Data_To_Stream = JS_Geometry_Data_To_Stream;\n var JS_Geometry_Data_To_Stream_With_Compression = window.JS_Geometry_Data_To_Stream_With_Compression;\n var JS_Stream_To_Geometry_Data = window.JS_Stream_To_Geometry_Data;\n exports.JS_Stream_To_Geometry_Data = JS_Stream_To_Geometry_Data;\n var JS_Stream_To_Geometry_Data_By_Key = window.JS_Stream_To_Geometry_Data_By_Key;\n exports.JS_Stream_To_Geometry_Data_By_Key = JS_Stream_To_Geometry_Data_By_Key;\n var JS_Stream_To_Geometry_Data_By_Keys = window.JS_Stream_To_Geometry_Data_By_Keys;\n exports.JS_Stream_To_Geometry_Data_By_Keys = JS_Stream_To_Geometry_Data_By_Keys;\n var JS_Stream_To_Geometry_Data_By_Keys_Tt = window.JS_Stream_To_Geometry_Data_By_Keys_Tt;\n exports.JS_Stream_To_Geometry_Data_By_Keys_Tt = JS_Stream_To_Geometry_Data_By_Keys_Tt;\n var JS_Stream_To_Geometry_Data_With_Compression = window.JS_Stream_To_Geometry_Data_With_Compression;\n exports.JS_Stream_To_Geometry_Data_With_Compression = JS_Stream_To_Geometry_Data_With_Compression;\n var JS_Copy_Segment_By_Key = window.JS_Copy_Segment_By_Key;\n exports.JS_Copy_Segment_By_Key = JS_Copy_Segment_By_Key;\n var JS_Show_Database_Info = window.JS_Show_Database_Info;\n exports.JS_Show_Database_Info = JS_Show_Database_Info;\n var JS_Show_Allocated_Memory_Size = window.JS_Show_Allocated_Memory_Size;\n exports.JS_Show_Allocated_Memory_Size = JS_Show_Allocated_Memory_Size;\n var JS_Execute_Task_Post_Processing = window.JS_Execute_Task_Post_Processing;\n exports.JS_Execute_Task_Post_Processing = JS_Execute_Task_Post_Processing;\n var JS_Create_Texture = window.JS_Create_Texture;\n exports.JS_Create_Texture = JS_Create_Texture;\n var JS_Boolean_Intersection_Graph = window.JS_Boolean_Intersection_Graph;\n exports.JS_Boolean_Intersection_Graph = JS_Boolean_Intersection_Graph;\n var JS_Boolean_Intersect_Polyline_Polygon_Xy = window.JS_Boolean_Intersect_Polyline_Polygon_Xy;\n exports.JS_Boolean_Intersect_Polyline_Polygon_Xy = JS_Boolean_Intersect_Polyline_Polygon_Xy;\n var JS_Boolean_Intersect_Polygon_Polygon_Xy = window.JS_Boolean_Intersect_Polygon_Polygon_Xy;\n exports.JS_Boolean_Intersect_Polygon_Polygon_Xy = JS_Boolean_Intersect_Polygon_Polygon_Xy;\n var JS_Boolean_Intersect_Graph_Polygon_Xy = window.JS_Boolean_Intersect_Graph_Polygon_Xy;\n exports.JS_Boolean_Intersect_Graph_Polygon_Xy = JS_Boolean_Intersect_Graph_Polygon_Xy;\n var JS_Boolean_Subtract_Polygon_Polygon_Xy = window.JS_Boolean_Subtract_Polygon_Polygon_Xy;\n exports.JS_Boolean_Subtract_Polygon_Polygon_Xy = JS_Boolean_Subtract_Polygon_Polygon_Xy;\n var JS_Boolean_Cut_Polygon_Polygon_Xy = window.JS_Boolean_Cut_Polygon_Polygon_Xy;\n exports.JS_Boolean_Cut_Polygon_Polygon_Xy = JS_Boolean_Cut_Polygon_Polygon_Xy;\n var JS_Boolean_Subtract = window.JS_Boolean_Subtract;\n exports.JS_Boolean_Subtract = JS_Boolean_Subtract;\n var JS_Feature_Extrude = window.JS_Feature_Extrude;\n exports.JS_Feature_Extrude = JS_Feature_Extrude;\n var JS_Planar_Polyline_Offset = window.JS_Planar_Polyline_Offset;\n exports.JS_Planar_Polyline_Offset = JS_Planar_Polyline_Offset;\n var JS_Init_Apis = function JS_Init_Apis() {\n if (!JS_Init_Database) {\n window.JS_Init_Database = exports.JS_Init_Database = JS_Init_Database = _GS_Init_Database;\n window.JS_Fina_Database = exports.JS_Fina_Database = JS_Fina_Database = _GS_Fina_Database;\n window.JS_Init_Multithreading_Services = exports.JS_Init_Multithreading_Services = JS_Init_Multithreading_Services = _GS_Init_Multithreading_Services;\n window.JS_Fina_Multithreading_Services = exports.JS_Fina_Multithreading_Services = JS_Fina_Multithreading_Services = _GS_Fina_Multithreading_Services;\n window.JS_Open_Segment = exports.JS_Open_Segment = JS_Open_Segment = function JS_Open_Segment(name) {\n var ptr_name = allocateUTF8(name);\n var key = _GS_Open_Segment(ptr_name);\n _free(ptr_name);\n return key;\n };\n window.JS_Open_Segment_By_Key = exports.JS_Open_Segment_By_Key = JS_Open_Segment_By_Key = _GS_Open_Segment_By_Key;\n window.JS_Close_Segment = exports.JS_Close_Segment = JS_Close_Segment = _GS_Close_Segment;\n window.JS_Delete_Segment = exports.JS_Delete_Segment = JS_Delete_Segment = function JS_Delete_Segment(name) {\n var ptr_name = allocateUTF8(name);\n _GS_Delete_Segment(ptr_name);\n _free(ptr_name);\n };\n window.JS_Delete_By_Key = exports.JS_Delete_By_Key = JS_Delete_By_Key = _GS_Delete_By_Key;\n window.JS_Clear_Geometry = exports.JS_Clear_Geometry = JS_Clear_Geometry = _GS_Clear_Geometry;\n window.JS_Clear_Geometry_By_Key = exports.JS_Clear_Geometry_By_Key = JS_Clear_Geometry_By_Key = _GS_Clear_Geometry_By_Key;\n window.JS_Clear_Attributes = exports.JS_Clear_Attributes = JS_Clear_Attributes = _GS_Clear_Attributes;\n window.JS_Clear_Attributes_By_Key = exports.JS_Clear_Attributes_By_Key = JS_Clear_Attributes_By_Key = _GS_Clear_Attributes_By_Key;\n window.JS_Clear_Includes = exports.JS_Clear_Includes = JS_Clear_Includes = _GS_Clear_Includes;\n window.JS_Clear_Includes_By_Key = exports.JS_Clear_Includes_By_Key = JS_Clear_Includes_By_Key = _GS_Clear_Includes_By_Key;\n window.JS_Clear_Styles = exports.JS_Clear_Styles = JS_Clear_Styles = _GS_Clear_Styles;\n window.JS_Clear_Styles_By_Key = exports.JS_Clear_Styles_By_Key = JS_Clear_Styles_By_Key = _GS_Clear_Styles_By_Key;\n window.JS_Clear_Subsegments = exports.JS_Clear_Subsegments = JS_Clear_Subsegments = _GS_Clear_Subsegments;\n window.JS_Clear_Subsegments_By_Key = exports.JS_Clear_Subsegments_By_Key = JS_Clear_Subsegments_By_Key = _GS_Clear_Subsegments_By_Key;\n window.JS_Clear_All = exports.JS_Clear_All = JS_Clear_All = _GS_Clear_All;\n window.JS_Clear_All_By_Key = exports.JS_Clear_All_By_Key = JS_Clear_All_By_Key = _GS_Clear_All_By_Key;\n window.JS_Include_Segment_By_Key = exports.JS_Include_Segment_By_Key = JS_Include_Segment_By_Key = _GS_Include_Segment_By_Key;\n window.JS_Conditional_Include_By_Key = exports.JS_Conditional_Include_By_Key = JS_Conditional_Include_By_Key = function JS_Conditional_Include_By_Key(key, conditions) {\n var ptr = allocateUTF8(conditions);\n _GS_Conditional_Include_By_Key(key, ptr);\n _free(ptr);\n };\n window.JS_Style_Segment_By_Key = exports.JS_Style_Segment_By_Key = JS_Style_Segment_By_Key = _GS_Style_Segment_By_Key;\n window.JS_Conditional_Style_By_Key = exports.JS_Conditional_Style_By_Key = JS_Conditional_Style_By_Key = function JS_Conditional_Style_By_Key(key, conditions) {\n var ptr = allocateUTF8(conditions);\n _GS_Conditional_Style_By_Key(key, ptr);\n _free(ptr);\n };\n window.JS_Show_Key_Type = exports.JS_Show_Key_Type = JS_Show_Key_Type = function JS_Show_Key_Type(key) {\n var ptr = Module._malloc(4);\n _GS_Show_Key_Type(key, ptr);\n var type = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return type;\n };\n window.JS_Make_Context_Current = exports.JS_Make_Context_Current = JS_Make_Context_Current = _GS_Make_Context_Current;\n window.JS_Update_Display = exports.JS_Update_Display = JS_Update_Display = _GS_Update_Display;\n window.JS_Update_View_Display_By_Key = exports.JS_Update_View_Display_By_Key = JS_Update_View_Display_By_Key = _GS_Update_View_Display_By_Key;\n window.JS_Update_View_Display_With_Framerate_By_Key = exports.JS_Update_View_Display_With_Framerate_By_Key = JS_Update_View_Display_With_Framerate_By_Key = _GS_Update_View_Display_With_Framerate_By_Key;\n window.JS_Update_View_Display_With_Time_By_Key = exports.JS_Update_View_Display_With_Time_By_Key = JS_Update_View_Display_With_Time_By_Key = _GS_Update_View_Display_With_Time_By_Key;\n window.JS_Asyn_Update_Geometry_Data_By_Key = exports.JS_Asyn_Update_Geometry_Data_By_Key = JS_Asyn_Update_Geometry_Data_By_Key = _GS_Asyn_Update_Geometry_Data_By_Key;\n window.JS_Asyn_Update_Geometry_Data_By_Key_Tt = exports.JS_Asyn_Update_Geometry_Data_By_Key_Tt = JS_Asyn_Update_Geometry_Data_By_Key_Tt = _GS_Asyn_Update_Geometry_Data_By_Key_Tt;\n window.JS_Asyn_Need_Update_View_By_Key = exports.JS_Asyn_Need_Update_View_By_Key = JS_Asyn_Need_Update_View_By_Key = _GS_Asyn_Need_Update_View_By_Key;\n window.JS_Asyn_Update_Camera_By_Key = exports.JS_Asyn_Update_Camera_By_Key = JS_Asyn_Update_Camera_By_Key = _GS_Asyn_Update_Camera_By_Key;\n window.JS_Asyn_Update_View_By_Key = exports.JS_Asyn_Update_View_By_Key = JS_Asyn_Update_View_By_Key = _GS_Asyn_Update_View_By_Key;\n window.JS_Asyn_Update_View_By_Key_Tt = exports.JS_Asyn_Update_View_By_Key_Tt = JS_Asyn_Update_View_By_Key_Tt = function JS_Asyn_Update_View_By_Key_Tt(view_key) {\n var result = _GS_Asyn_Update_View_By_Key_Tt(view_key);\n if (result) {\n return true;\n } else {\n return false;\n }\n };\n window.JS_Asyn_Render_View_By_Key = exports.JS_Asyn_Render_View_By_Key = JS_Asyn_Render_View_By_Key = _GS_Asyn_Render_View_By_Key;\n window.JS_Asyn_Render_View_With_Time_By_Key = exports.JS_Asyn_Render_View_With_Time_By_Key = JS_Asyn_Render_View_With_Time_By_Key = _GS_Asyn_Render_View_With_Time_By_Key;\n window.JS_Show_Asyn_Geometry_Data_Keys = exports.JS_Show_Asyn_Geometry_Data_Keys = JS_Show_Asyn_Geometry_Data_Keys = function JS_Show_Asyn_Geometry_Data_Keys(view_key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Asyn_Geometry_Data_Count(view_key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Asyn_Geometry_Data_Keys(view_key, ptr_list);\n result = new Int32Array(count);\n result.set(Module.HEAP32.subarray(ptr_list / 4, ptr_list / 4 + count));\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n Module._free(ptr_count);\n return result;\n };\n window.JS_Show_Asyn_Remove_Geometry_Data_Keys = exports.JS_Show_Asyn_Remove_Geometry_Data_Keys = JS_Show_Asyn_Remove_Geometry_Data_Keys = function JS_Show_Asyn_Remove_Geometry_Data_Keys(view_key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Asyn_Geometry_Data_Count(view_key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Asyn_Remove_Geometry_Data_Keys(view_key, ptr_list);\n result = new Int32Array(count);\n result.set(Module.HEAP32.subarray(ptr_list / 4, ptr_list / 4 + count));\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n Module._free(ptr_count);\n return result;\n };\n window.JS_Show_Asyn_Buffer_Geometry_Keys = exports.JS_Show_Asyn_Buffer_Geometry_Keys = JS_Show_Asyn_Buffer_Geometry_Keys = function JS_Show_Asyn_Buffer_Geometry_Keys(view_key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Asyn_Buffer_Geometry_Count(view_key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Asyn_Buffer_Geometry_Keys(view_key, ptr_list);\n result = new Int32Array(count);\n result.set(Module.HEAP32.subarray(ptr_list / 4, ptr_list / 4 + count));\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n Module._free(ptr_count);\n return result;\n };\n window.JS_Asyn_Buffer_Geometry_By_Key = exports.JS_Asyn_Buffer_Geometry_By_Key = JS_Asyn_Buffer_Geometry_By_Key = function JS_Asyn_Buffer_Geometry_By_Key(view_key, geom_keys) {\n if (geom_keys && geom_keys.length > 0) {\n var ptr_keys = Module._malloc(4 * geom_keys.length);\n Module.HEAP32.set(geom_keys, ptr_keys / 4);\n _GS_Asyn_Buffer_Geometry_By_Key(view_key, ptr_keys, geom_keys.length);\n Module._free(ptr_keys);\n }\n };\n exports.JS_Asyn_Buffer_Geometry_By_Key_Tt = JS_Asyn_Buffer_Geometry_By_Key_Tt = function JS_Asyn_Buffer_Geometry_By_Key_Tt(view_key, geom_keys, no) {\n if (geom_keys && geom_keys.length > 0) {\n var ptr_keys = Module._malloc(4 * geom_keys.length);\n Module.HEAP32.set(geom_keys, ptr_keys / 4);\n _GS_Asyn_Buffer_Geometry_By_Key_Tt(view_key, ptr_keys, geom_keys.length, no);\n Module._free(ptr_keys);\n }\n };\n window.JS_Asyn_Buffer_Geometry_By_Key_Tt = exports.JS_Asyn_Buffer_Geometry_By_Key_Tt = JS_Asyn_Buffer_Geometry_By_Key_Tt = function JS_Asyn_Buffer_Geometry_By_Key_Tt(view_key, geom_keys, no) {\n if (geom_keys && geom_keys.length > 0) {\n var ptr_keys = Module._malloc(4 * geom_keys.length);\n Module.HEAP32.set(geom_keys, ptr_keys / 4);\n _GS_Asyn_Buffer_Geometry_By_Key_Tt(view_key, ptr_keys, geom_keys.length, no);\n Module._free(ptr_keys);\n }\n };\n window.JS_Show_Asyn_Unbuffer_Geometry_Keys = JS_Show_Asyn_Unbuffer_Geometry_Keys = function JS_Show_Asyn_Unbuffer_Geometry_Keys(view_key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Asyn_Unbuffer_Geometry_Count(view_key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Asyn_Unbuffer_Geometry_Keys(view_key, ptr_list);\n result = new Int32Array(count);\n result.set(Module.HEAP32.subarray(ptr_list / 4, ptr_list / 4 + count));\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n Module._free(ptr_count);\n return result;\n };\n window.JS_Asyn_Unbuffer_Geometry_By_Key = JS_Asyn_Unbuffer_Geometry_By_Key = function JS_Asyn_Unbuffer_Geometry_By_Key(view_key, geom_keys) {\n if (geom_keys && geom_keys.length > 0) {\n var ptr_keys = Module._malloc(4 * geom_keys.length);\n Module.HEAP32.set(geom_keys, ptr_keys / 4);\n _GS_Asyn_Unbuffer_Geometry_By_Key(view_key, ptr_keys, geom_keys.length);\n Module._free(ptr_keys);\n }\n };\n window.JS_Show_Owner_By_Key = exports.JS_Show_Owner_By_Key = JS_Show_Owner_By_Key = _GS_Show_Owner_By_Key;\n window.JS_Compute_Path = exports.JS_Compute_Path = JS_Compute_Path = function JS_Compute_Path(start_key, end_key, count, path) {\n var ptr_count = Module._malloc(4);\n var ptr_path = Module._malloc(4 * 512);\n _GS_Compute_Path(start_key, end_key, ptr_count, ptr_path);\n var co = Module.HEAP32[ptr_count / 4];\n var pa = new Float32Array(co);\n for (var i = 0; i < co; i++) {\n pa[i] = Module.HEAP32[ptr_count / 4 + i];\n }\n Module._free(ptr_count);\n Module._free(ptr_path);\n return pa;\n };\n window.JS_Compute_Coordinates_By_Key = exports.JS_Compute_Coordinates_By_Key = JS_Compute_Coordinates_By_Key = function JS_Compute_Coordinates_By_Key(key, in_coordinate, in_position, out_coordinate) {\n var ptr_ic = allocateUTF8(in_coordinate);\n var ptr_oc = allocateUTF8(out_coordinate);\n var ptr_ip = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_ip / 4] = in_position[0];\n Module.HEAPF32[ptr_ip / 4 + 1] = in_position[1];\n Module.HEAPF32[ptr_ip / 4 + 2] = in_position[2];\n var ptr_op = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_op / 4] = 0;\n Module.HEAPF32[ptr_op / 4 + 1] = 0;\n Module.HEAPF32[ptr_op / 4 + 2] = 0;\n _GS_Compute_Coordinates_By_Key(key, ptr_ic, ptr_ip, ptr_oc, ptr_op);\n var out_position = new Float32Array(3);\n out_position[0] = Module.HEAPF32[ptr_op / 4];\n out_position[1] = Module.HEAPF32[ptr_op / 4 + 1];\n out_position[2] = Module.HEAPF32[ptr_op / 4 + 2];\n _free(ptr_ic);\n _free(ptr_oc);\n Module._free(ptr_ip);\n Module._free(ptr_op);\n return out_position;\n };\n window.JS_Compute_Coordinates_By_Path = exports.JS_Compute_Coordinates_By_Path = JS_Compute_Coordinates_By_Path = function JS_Compute_Coordinates_By_Path(path, in_coordinate, in_position, out_coordinate) {\n var pcount = path.length;\n var ptr_path = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAP32[ptr_path / 4 + i] = path[i];\n }\n var ptr_ic = allocateUTF8(in_coordinate);\n var ptr_oc = allocateUTF8(out_coordinate);\n var ptr_ip = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_ip / 4] = in_position[0];\n Module.HEAPF32[ptr_ip / 4 + 1] = in_position[1];\n Module.HEAPF32[ptr_ip / 4 + 2] = in_position[2];\n var ptr_op = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_op / 4] = 0;\n Module.HEAPF32[ptr_op / 4 + 1] = 0;\n Module.HEAPF32[ptr_op / 4 + 2] = 0;\n _GS_Compute_Coordinates_By_Path(ptr_path, pcount, ptr_ic, ptr_ip, ptr_oc, ptr_op);\n var out_position = new Float32Array(3);\n out_position[0] = Module.HEAPF32[ptr_op / 4];\n out_position[1] = Module.HEAPF32[ptr_op / 4 + 1];\n out_position[2] = Module.HEAPF32[ptr_op / 4 + 2];\n _free(ptr_ic);\n _free(ptr_oc);\n Module._free(ptr_ip);\n Module._free(ptr_op);\n Module._free(ptr_path);\n return out_position;\n };\n window.JS_DCompute_Coordinates_By_Key = JS_DCompute_Coordinates_By_Key = function JS_DCompute_Coordinates_By_Key(key, in_coordinate, in_positions, out_coordinate) {\n var count = in_positions.length / 3;\n var ptr_ic = allocateUTF8(in_coordinate);\n var ptr_oc = allocateUTF8(out_coordinate);\n var ptr_ip = Module._malloc(8 * 3 * count);\n Module.HEAPF64.set(new Float64Array(in_positions), ptr_ip / 8);\n var ptr_op = Module._malloc(8 * 3 * count);\n _GS_DCompute_Coordinates_By_Key(key, ptr_ic, ptr_ip, ptr_oc, ptr_op, count);\n var out_positions = new Float64Array(3 * count);\n out_positions.set(Module.HEAPF64.subarray(ptr_op / 8, ptr_op / 8 + 3 * count));\n _free(ptr_ic);\n _free(ptr_oc);\n Module._free(ptr_ip);\n Module._free(ptr_op);\n return out_positions;\n };\n window.JS_Compute_Boundingbox_By_Key = exports.JS_Compute_Boundingbox_By_Key = JS_Compute_Boundingbox_By_Key = function JS_Compute_Boundingbox_By_Key(key) {\n var ptr_min = Module._malloc(4 * 3);\n var ptr_max = Module._malloc(4 * 3);\n _GS_Compute_Boundingbox_By_Key(key, ptr_min, ptr_max);\n var bb = new Float32Array(6);\n bb[0] = Module.HEAPF32[ptr_min / 4];\n bb[1] = Module.HEAPF32[ptr_min / 4 + 1];\n bb[2] = Module.HEAPF32[ptr_min / 4 + 2];\n bb[3] = Module.HEAPF32[ptr_max / 4];\n bb[4] = Module.HEAPF32[ptr_max / 4 + 1];\n bb[5] = Module.HEAPF32[ptr_max / 4 + 2];\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n window.JS_Compute_Boundingbox_With_Visibility_By_Key = exports.JS_Compute_Boundingbox_With_Visibility_By_Key = JS_Compute_Boundingbox_With_Visibility_By_Key = function JS_Compute_Boundingbox_With_Visibility_By_Key(key, element_types) {\n var ptr_min = Module._malloc(4 * 3);\n var ptr_max = Module._malloc(4 * 3);\n _GS_Compute_Boundingbox_With_Visibility_By_Key(key, element_types, ptr_min, ptr_max);\n var bb = new Float32Array(6);\n bb[0] = Module.HEAPF32[ptr_min / 4];\n bb[1] = Module.HEAPF32[ptr_min / 4 + 1];\n bb[2] = Module.HEAPF32[ptr_min / 4 + 2];\n bb[3] = Module.HEAPF32[ptr_max / 4];\n bb[4] = Module.HEAPF32[ptr_max / 4 + 1];\n bb[5] = Module.HEAPF32[ptr_max / 4 + 2];\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n window.JS_Compute_View_Boundingbox_By_Key = exports.JS_Compute_View_Boundingbox_By_Key = JS_Compute_View_Boundingbox_By_Key = function JS_Compute_View_Boundingbox_By_Key(seg_key, key) {\n var ptr_min = Module._malloc(4 * 3);\n var ptr_max = Module._malloc(4 * 3);\n _GS_Compute_View_Boundingbox_By_Key(seg_key, key, ptr_min, ptr_max);\n var bb = new Float32Array(6);\n bb[0] = Module.HEAPF32[ptr_min / 4];\n bb[1] = Module.HEAPF32[ptr_min / 4 + 1];\n bb[2] = Module.HEAPF32[ptr_min / 4 + 2];\n bb[3] = Module.HEAPF32[ptr_max / 4];\n bb[4] = Module.HEAPF32[ptr_max / 4 + 1];\n bb[5] = Module.HEAPF32[ptr_max / 4 + 2];\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n window.JS_Compute_View_Boundingbox_By_Keys = exports.JS_Compute_View_Boundingbox_By_Keys = JS_Compute_View_Boundingbox_By_Keys = function JS_Compute_View_Boundingbox_By_Keys(seg_key, keys) {\n var ptr_min = Module._malloc(4 * 3);\n var ptr_max = Module._malloc(4 * 3);\n var ptr_keys = Module._malloc(4 * keys.length);\n Module.HEAP32.set(keys, ptr_keys / 4);\n _GS_Compute_View_Boundingbox_By_Keys(seg_key, ptr_keys, keys.length, ptr_min, ptr_max);\n var bb = new Float32Array(6);\n bb[0] = Module.HEAPF32[ptr_min / 4];\n bb[1] = Module.HEAPF32[ptr_min / 4 + 1];\n bb[2] = Module.HEAPF32[ptr_min / 4 + 2];\n bb[3] = Module.HEAPF32[ptr_max / 4];\n bb[4] = Module.HEAPF32[ptr_max / 4 + 1];\n bb[5] = Module.HEAPF32[ptr_max / 4 + 2];\n Module._free(ptr_keys);\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n window.JS_Compute_View_Boundingboxes_By_Keys = exports.JS_Compute_View_Boundingboxes_By_Keys = JS_Compute_View_Boundingboxes_By_Keys = function JS_Compute_View_Boundingboxes_By_Keys(seg_key, keys) {\n var ptr_min = Module._malloc(4 * 3 * keys.length);\n var ptr_max = Module._malloc(4 * 3 * keys.length);\n var ptr_keys = Module._malloc(4 * keys.length);\n Module.HEAP32.set(keys, ptr_keys / 4);\n _GS_Compute_View_Boundingboxes_By_Keys(seg_key, ptr_keys, keys.length, ptr_min, ptr_max);\n var bb = new Float32Array(6 * keys.length);\n for (var i = 0; i < keys.length; i++) {\n bb[i * 6] = Module.HEAPF32[ptr_min / 4 + i * 3];\n bb[i * 6 + 1] = Module.HEAPF32[ptr_min / 4 + i * 3 + 1];\n bb[i * 6 + 2] = Module.HEAPF32[ptr_min / 4 + i * 3 + 2];\n bb[i * 6 + 3] = Module.HEAPF32[ptr_max / 4 + i * 3];\n bb[i * 6 + 4] = Module.HEAPF32[ptr_max / 4 + i * 3 + 1];\n bb[i * 6 + 5] = Module.HEAPF32[ptr_max / 4 + i * 3 + 2];\n }\n Module._free(ptr_keys);\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n exports.JS_Compute_Segment_Boundingbox_By_Key = JS_Compute_Segment_Boundingbox_By_Key = _GS_Compute_Segment_Boundingbox_By_Key;\n window.JS_Clear_Segment_Boundingbox_By_Key = exports.JS_Clear_Segment_Boundingbox_By_Key = JS_Clear_Segment_Boundingbox_By_Key = _GS_Clear_Segment_Boundingbox_By_Key;\n window.JS_Show_BoundingBox_By_Key = exports.JS_Show_BoundingBox_By_Key = JS_Show_BoundingBox_By_Key = function JS_Show_BoundingBox_By_Key(key) {\n var ptr_min = Module._malloc(4 * 3);\n var ptr_max = Module._malloc(4 * 3);\n _GS_Show_BoundingBox_By_Key(key, ptr_min, ptr_max);\n var bb = new Float32Array(6);\n bb[0] = Module.HEAPF32[ptr_min / 4];\n bb[1] = Module.HEAPF32[ptr_min / 4 + 1];\n bb[2] = Module.HEAPF32[ptr_min / 4 + 2];\n bb[3] = Module.HEAPF32[ptr_max / 4];\n bb[4] = Module.HEAPF32[ptr_max / 4 + 1];\n bb[5] = Module.HEAPF32[ptr_max / 4 + 2];\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n window.JS_Compute_Visible_By_Key = exports.JS_Compute_Visible_By_Key = JS_Compute_Visible_By_Key = function JS_Compute_Visible_By_Key(display_key, start_key, num) {\n var ptr_count = Module._malloc(4);\n var ptr_keys = null;\n if (num) {\n ptr_keys = Module._malloc(4 * num);\n } else {\n ptr_keys = Module._malloc(4 * 1024);\n }\n _GS_Compute_Visible_By_Key(display_key, start_key, ptr_count, ptr_keys);\n var count = Module.HEAP32[ptr_count / 4];\n var keys = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n keys[i] = Module.HEAP32[ptr_keys / 4 + i];\n }\n Module._free(ptr_count);\n Module._free(ptr_keys);\n return keys;\n };\n window.JS_Show_Attribute_Count = exports.JS_Show_Attribute_Count = JS_Show_Attribute_Count = function JS_Show_Attribute_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Attribute_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Attribute_List = exports.JS_Show_Attribute_List = JS_Show_Attribute_List = function JS_Show_Attribute_List() {\n var ptr = Module._malloc(4);\n _GS_Show_Attribute_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Attribute_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_Geometry_Count = exports.JS_Show_Geometry_Count = JS_Show_Geometry_Count = function JS_Show_Geometry_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Geometry_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Geometry_List = exports.JS_Show_Geometry_List = JS_Show_Geometry_List = function JS_Show_Geometry_List() {\n var ptr = Module._malloc(4);\n _GS_Show_Geometry_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Geometry_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_Subsegment_Count = exports.JS_Show_Subsegment_Count = JS_Show_Subsegment_Count = function JS_Show_Subsegment_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Subsegment_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Subsegment_List = exports.JS_Show_Subsegment_List = JS_Show_Subsegment_List = function JS_Show_Subsegment_List() {\n var ptr = Module._malloc(4);\n _GS_Show_Subsegment_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Subsegment_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_All_Subsegment_Count = exports.JS_Show_All_Subsegment_Count = JS_Show_All_Subsegment_Count = function JS_Show_All_Subsegment_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_All_Subsegment_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_All_Subsegment_List = exports.JS_Show_All_Subsegment_List = JS_Show_All_Subsegment_List = function JS_Show_All_Subsegment_List() {\n var ptr = Module._malloc(4);\n _GS_Show_All_Subsegment_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_All_Subsegment_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_Include_Count = exports.JS_Show_Include_Count = JS_Show_Include_Count = function JS_Show_Include_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Include_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Include_List = exports.JS_Show_Include_List = JS_Show_Include_List = function JS_Show_Include_List() {\n var ptr = Module._malloc(4);\n _GS_Show_Include_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Include_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_Include = exports.JS_Show_Include = JS_Show_Include = function JS_Show_Include(index) {\n var ptr = Module._malloc(4);\n _GS_Show_Include(index, ptr);\n var key = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return key;\n };\n window.JS_Show_Include_Segment = exports.JS_Show_Include_Segment = JS_Show_Include_Segment = function JS_Show_Include_Segment(key) {\n var ptr = Module._malloc(4);\n var ptr_cd = Module._malloc(256);\n _GS_Show_Include_Segment(key, ptr, ptr_cd);\n var include_key = Module.HEAP32[ptr / 4];\n var condition = UTF8ToString(ptr_cd);\n Module._free(ptr);\n Module._free(ptr_cd);\n return {\n key: include_key,\n condition: condition\n };\n };\n window.JS_Show_Style_Count = exports.JS_Show_Style_Count = JS_Show_Style_Count = function JS_Show_Style_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Style_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Style_List = exports.JS_Show_Style_List = JS_Show_Style_List = function JS_Show_Style_List() {\n var ptr = Module._malloc(4);\n _GS_Show_Style_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Style_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_Style = exports.JS_Show_Style = JS_Show_Style = function JS_Show_Style(index) {\n var ptr = Module._malloc(4);\n _GS_Show_Style(index, ptr);\n var key = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return key;\n };\n window.JS_Show_Style_Segment = exports.JS_Show_Style_Segment = JS_Show_Style_Segment = function JS_Show_Style_Segment(key) {\n var ptr = Module._malloc(4);\n var ptr_cd = Module._malloc(256);\n _GS_Show_Style_Segment(key, ptr, ptr_cd);\n var style_key = Module.HEAP32[ptr / 4];\n var condition = UTF8ToString(ptr_cd);\n Module._free(ptr);\n Module._free(ptr_cd);\n return {\n key: style_key,\n condition: condition\n };\n };\n window.JS_Compute_Selection_By_Key = exports.JS_Compute_Selection_By_Key = JS_Compute_Selection_By_Key = _GS_Compute_Selection_By_Key;\n window.JS_Compute_Selection_By_Area = exports.JS_Compute_Selection_By_Area = JS_Compute_Selection_By_Area = _GS_Compute_Selection_By_Area;\n window.JS_Show_Selection_Count = exports.JS_Show_Selection_Count = JS_Show_Selection_Count = function JS_Show_Selection_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Selection_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Selection_Element = exports.JS_Show_Selection_Element = JS_Show_Selection_Element = function JS_Show_Selection_Element(index) {\n var ptr = Module._malloc(4);\n _GS_Show_Selection_Element(index, ptr);\n var key = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return key;\n };\n window.JS_Show_Selection_Path = exports.JS_Show_Selection_Path = JS_Show_Selection_Path = function JS_Show_Selection_Path(index) {\n var ptr_path = Module._malloc(4096);\n _GS_Show_Selection_Path(index, ptr_path);\n var path = UTF8ToString(ptr_path);\n Module._free(ptr_path);\n return path;\n };\n window.JS_Show_Selection_Path_By_Keys = exports.JS_Show_Selection_Path_By_Keys = JS_Show_Selection_Path_By_Keys = function JS_Show_Selection_Path_By_Keys(index) {\n var ptr_count = Module._malloc(4);\n var ptr_keys = Module._malloc(4 * 512);\n _GS_Show_Selection_Path_By_Keys(index, ptr_count, ptr_keys);\n var count = Module.HEAP32[ptr_count / 4];\n var result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_keys / 4 + i];\n }\n Module._free(ptr_count);\n Module._free(ptr_keys);\n return result;\n };\n window.JS_Show_Selection_Position = exports.JS_Show_Selection_Position = JS_Show_Selection_Position = function JS_Show_Selection_Position(index) {\n var ptr_value = Module._malloc(4 * 6);\n _GS_Show_Selection_Position_By_Value(index, ptr_value);\n var pos = new Float32Array(6);\n pos[0] = Module.HEAPF32[ptr_value / 4];\n pos[1] = Module.HEAPF32[ptr_value / 4 + 1];\n pos[2] = Module.HEAPF32[ptr_value / 4 + 2];\n pos[3] = Module.HEAPF32[ptr_value / 4 + 3];\n pos[4] = Module.HEAPF32[ptr_value / 4 + 4];\n pos[5] = Module.HEAPF32[ptr_value / 4 + 5];\n Module._free(ptr_value);\n return pos;\n };\n window.JS_Show_Selection_Param = exports.JS_Show_Selection_Param = JS_Show_Selection_Param = function JS_Show_Selection_Param(index) {\n var ptr_value = Module._malloc(4);\n _GS_Show_Selection_Param(index, ptr_value);\n var param = Module.HEAPF32[ptr_value / 4];\n Module._free(ptr_value);\n return param;\n };\n window.JS_Show_Selection_Indexes = exports.JS_Show_Selection_Indexes = JS_Show_Selection_Indexes = function JS_Show_Selection_Indexes(index) {\n var ptr_value = Module._malloc(4 * 6);\n _GS_Show_Selection_Indexes(index, ptr_value);\n var idx = new Int32Array(6);\n idx[0] = Module.HEAP32[ptr_value / 4];\n idx[1] = Module.HEAP32[ptr_value / 4 + 1];\n idx[2] = Module.HEAP32[ptr_value / 4 + 2];\n idx[3] = Module.HEAP32[ptr_value / 4 + 3];\n idx[4] = Module.HEAP32[ptr_value / 4 + 4];\n idx[5] = Module.HEAP32[ptr_value / 4 + 5];\n Module._free(ptr_value);\n return idx;\n };\n window.JS_Show_Selection_Test_Info = exports.JS_Show_Selection_Test_Info = JS_Show_Selection_Test_Info = function JS_Show_Selection_Test_Info(index) {\n var ptr_value = Module._malloc(4 * 15);\n _GS_Show_Selection_Test_Info(index, ptr_value);\n var pos = new Float32Array(15);\n pos[0] = Module.HEAPF32[ptr_value / 4];\n pos[1] = Module.HEAPF32[ptr_value / 4 + 1];\n pos[2] = Module.HEAPF32[ptr_value / 4 + 2];\n pos[3] = Module.HEAPF32[ptr_value / 4 + 3];\n pos[4] = Module.HEAPF32[ptr_value / 4 + 4];\n pos[5] = Module.HEAPF32[ptr_value / 4 + 5];\n pos[6] = Module.HEAPF32[ptr_value / 4 + 6];\n pos[7] = Module.HEAPF32[ptr_value / 4 + 7];\n pos[8] = Module.HEAPF32[ptr_value / 4 + 8];\n pos[9] = Module.HEAPF32[ptr_value / 4 + 9];\n pos[10] = Module.HEAPF32[ptr_value / 4 + 10];\n pos[11] = Module.HEAPF32[ptr_value / 4 + 11];\n pos[12] = Module.HEAPF32[ptr_value / 4 + 12];\n pos[13] = Module.HEAPF32[ptr_value / 4 + 13];\n pos[14] = Module.HEAPF32[ptr_value / 4 + 14];\n Module._free(ptr_value);\n return pos;\n };\n window.JS_Compute_Collision_By_Key = exports.JS_Compute_Collision_By_Key = JS_Compute_Collision_By_Key = function JS_Compute_Collision_By_Key(viewKey, oneKey, twoKey, type, options) {\n var ptr_options = null;\n if (options) {\n ptr_options = allocateUTF8(options);\n }\n var count = _GS_Compute_Collision_By_Key(viewKey, oneKey, twoKey, type, ptr_options);\n if (ptr_options) {\n _free(ptr_options);\n }\n return count;\n };\n window.JS_Compute_Collision_By_Keys = exports.JS_Compute_Collision_By_Keys = JS_Compute_Collision_By_Keys = function JS_Compute_Collision_By_Keys(view_key, oneKeys, twoKeys, type) {\n if (oneKeys.length > 0 && twoKeys.length > 0) {\n var ptr_one_keys = Module._malloc(4 * oneKeys.length);\n Module.HEAP32.set(oneKeys, ptr_one_keys / 4);\n var ptr_two_keys = Module._malloc(4 * twoKeys.length);\n Module.HEAP32.set(twoKeys, ptr_two_keys / 4);\n var count = _GS_Compute_Collision_By_Keys(view_key, ptr_one_keys, oneKeys.length, ptr_two_keys, twoKeys.length, type);\n Module._free(ptr_one_keys);\n Module._free(ptr_two_keys);\n return count;\n } else {\n return -1;\n }\n };\n window.JS_Compute_Collision_By_Keys_Tt = exports.JS_Compute_Collision_By_Keys_Tt = JS_Compute_Collision_By_Keys_Tt = function JS_Compute_Collision_By_Keys_Tt(view_key, oneKeys, twoKeys, type) {\n if (oneKeys.length > 0 && twoKeys.length > 0) {\n var ptr_one_keys = Module._malloc(4 * oneKeys.length);\n for (var i = 0; i < oneKeys.length; i++) {\n Module.HEAP32[ptr_one_keys / 4 + i] = oneKeys[i];\n }\n var ptr_two_keys = Module._malloc(4 * twoKeys.length);\n for (var i = 0; i < twoKeys.length; i++) {\n Module.HEAP32[ptr_two_keys / 4 + i] = twoKeys[i];\n }\n var count = _GS_Compute_Collision_By_Keys_Tt(view_key, ptr_one_keys, oneKeys.length, ptr_two_keys, twoKeys.length, type);\n Module._free(ptr_one_keys);\n Module._free(ptr_two_keys);\n return count;\n } else {\n return -1;\n }\n };\n window.JS_Compute_Collision_By_Key_Tt = exports.JS_Compute_Collision_By_Key_Tt = JS_Compute_Collision_By_Key_Tt = function JS_Compute_Collision_By_Key_Tt(viewkey, oneKey, twoKey, type, no, options) {\n var ptr_options = null;\n if (options) {\n ptr_options = allocateUTF8(options);\n }\n var count = _GS_Compute_Collision_By_Key_Tt(viewkey, oneKey, twoKey, type, no, ptr_options);\n if (ptr_options) {\n _free(ptr_options);\n }\n return count;\n };\n window.JS_Show_Collision_Status = exports.JS_Show_Collision_Status = JS_Show_Collision_Status = function JS_Show_Collision_Status() {\n var ptrTotal = Module._malloc(4);\n var ptrCurrent = Module._malloc(4);\n _GS_Show_Collision_Status(ptrTotal, ptrCurrent);\n var total = Module.HEAP32[ptrTotal / 4];\n var current = Module.HEAP32[ptrCurrent / 4];\n Module._free(ptrTotal);\n Module._free(ptrCurrent);\n return [total, current];\n };\n window.JS_Show_Collision_Count = exports.JS_Show_Collision_Count = JS_Show_Collision_Count = function JS_Show_Collision_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Collision_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Collision_Elements = exports.JS_Show_Collision_Elements = JS_Show_Collision_Elements = function JS_Show_Collision_Elements(index) {\n var ptr_seg_one = Module._malloc(4);\n var ptr_seg_two = Module._malloc(4);\n var ptr_geom_one = Module._malloc(4);\n var ptr_geom_two = Module._malloc(4);\n _GS_Show_Collision_Elements(index, ptr_seg_one, ptr_seg_two, ptr_geom_one, ptr_geom_two);\n var key_seg_one = Module.HEAP32[ptr_seg_one / 4];\n var key_seg_two = Module.HEAP32[ptr_seg_two / 4];\n var key_geom_one = Module.HEAP32[ptr_geom_one / 4];\n var key_geom_two = Module.HEAP32[ptr_geom_two / 4];\n Module._free(ptr_seg_one);\n Module._free(ptr_seg_two);\n Module._free(ptr_geom_one);\n Module._free(ptr_geom_two);\n return new Int32Array([key_seg_one, key_seg_two, key_geom_one, key_geom_two]);\n };\n window.JS_Show_Collision_Paths = exports.JS_Show_Collision_Paths = JS_Show_Collision_Paths = function JS_Show_Collision_Paths(index) {\n var ptr_path_one = Module._malloc(1024);\n var ptr_path_two = Module._malloc(1024);\n _GS_Show_Collision_Paths(index, ptr_path_one, ptr_path_two);\n var path_one = UTF8ToString(ptr_path_one);\n var path_two = UTF8ToString(ptr_path_two);\n Module._free(ptr_path_one);\n Module._free(ptr_path_two);\n return [path_one, path_two];\n };\n window.JS_Show_Collision_Path_By_Keys = exports.JS_Show_Collision_Path_By_Keys = JS_Show_Collision_Path_By_Keys = function JS_Show_Collision_Path_By_Keys(index) {\n var ptr_count_one = Module._malloc(4);\n var ptr_keys_one = Module._malloc(4 * 512);\n var ptr_count_two = Module._malloc(4);\n var ptr_keys_two = Module._malloc(4 * 512);\n _GS_Show_Collision_Path_By_Keys(index, ptr_count_one, ptr_keys_one, ptr_count_two, ptr_keys_two);\n var count_one = Module.HEAP32[ptr_count_one / 4];\n var result_one = new Int32Array(count_one);\n var count_two = Module.HEAP32[ptr_count_two / 4];\n var result_two = new Int32Array(count_two);\n for (var i = 0; i < count_one; i++) {\n result_one[i] = Module.HEAP32[ptr_keys_one / 4 + i];\n }\n for (var i = 0; i < count_two; i++) {\n result_two[i] = Module.HEAP32[ptr_keys_two / 4 + i];\n }\n Module._free(ptr_count_one);\n Module._free(ptr_keys_one);\n Module._free(ptr_count_two);\n Module._free(ptr_keys_two);\n return [result_one, result_two];\n };\n window.JS_Show_Collision_Position = exports.JS_Show_Collision_Position = JS_Show_Collision_Position = function JS_Show_Collision_Position(index) {\n var ptr_value = Module._malloc(4 * 6);\n _GS_Show_Collision_Position(index, ptr_value);\n var pos = new Float32Array(3);\n pos[0] = Module.HEAPF32[ptr_value / 4];\n pos[1] = Module.HEAPF32[ptr_value / 4 + 1];\n pos[2] = Module.HEAPF32[ptr_value / 4 + 2];\n Module._free(ptr_value);\n return pos;\n };\n window.JS_Show_Collision_Type = exports.JS_Show_Collision_Type = JS_Show_Collision_Type = function JS_Show_Collision_Type(index) {\n var ptr = Module._malloc(4);\n _GS_Show_Collision_Type(index, ptr);\n var type = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return type;\n };\n window.JS_Show_Segment_Name = exports.JS_Show_Segment_Name = JS_Show_Segment_Name = function JS_Show_Segment_Name(key) {\n var ptr_name = Module._malloc(256);\n _GS_Show_Segment_Name(key, ptr_name);\n var name = UTF8ToString(ptr_name);\n Module._free(ptr_name);\n return name;\n };\n window.JS_Show_Segment_Path = exports.JS_Show_Segment_Path = JS_Show_Segment_Path = function JS_Show_Segment_Path(key) {\n var ptr_path = Module._malloc(1024);\n _GS_Show_Segment_Path(key, ptr_path);\n var path = UTF8ToString(ptr_path);\n Module._free(ptr_path);\n return path;\n };\n window.JS_Segment_Exists = exports.JS_Segment_Exists = JS_Segment_Exists = function JS_Segment_Exists(name) {\n var ptr = allocateUTF8(name);\n var result = _GS_Segment_Exists(ptr);\n _free(ptr);\n return result;\n };\n window.JS_Move_Key = exports.JS_Move_Key = JS_Move_Key = function JS_Move_Key(key, new_owner_path) {\n var ptr = allocateUTF8(new_owner_path);\n _GS_Move_Key(key, ptr);\n _free(ptr);\n };\n window.JS_Rename_Segment = exports.JS_Rename_Segment = JS_Rename_Segment = function JS_Rename_Segment(name) {\n var ptr = allocateUTF8(name);\n var result = _GS_Rename_Segment(ptr);\n _free(ptr);\n return result;\n };\n window.JS_Move_Key_By_Key = exports.JS_Move_Key_By_Key = JS_Move_Key_By_Key = _GS_Move_Key_By_Key;\n window.JS_Add_Font_Library = exports.JS_Add_Font_Library = JS_Add_Font_Library = function JS_Add_Font_Library(name, data) {\n var ptr_name = allocateUTF8(name);\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Add_Font_Library(ptr_name, ptr_data, data.byteLength);\n Module._free(ptr_data);\n _free(ptr_name);\n array = null;\n };\n window.JS_Font_Library_Exists = exports.JS_Font_Library_Exists = JS_Font_Library_Exists = function JS_Font_Library_Exists(name) {\n var result = false;\n var ptr_name = allocateUTF8(name);\n result = _GS_Font_Library_Exists(ptr_name);\n _free(ptr_name);\n return result;\n };\n window.JS_Remove_Font_Library = exports.JS_Remove_Font_Library = JS_Remove_Font_Library = function JS_Remove_Font_Library(name) {\n var result = false;\n var ptr_name = allocateUTF8(name);\n result = _GS_Remove_Font_Library(ptr_name);\n _free(ptr_name);\n return result;\n };\n window.JS_Clear_Font_Library = _GS_Clear_Font_Library;\n window.JS_Set_Driver_Configs = exports.JS_Set_Driver_Configs = JS_Set_Driver_Configs = function JS_Set_Driver_Configs(configs) {\n var ptr_configs = allocateUTF8(configs);\n _GS_Set_Driver_Configs(ptr_configs);\n _free(ptr_configs);\n };\n window.JS_Add_Property_Boolean = exports.JS_Add_Property_Boolean = JS_Add_Property_Boolean = function JS_Add_Property_Boolean(key, name, value) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(4);\n if (value) {\n Module.HEAP32[ptr_value / 4] = 1;\n } else {\n Module.HEAP32[ptr_value / 4] = 0;\n }\n _GS_Add_Property_Boolean(key, ptr, ptr_value);\n _free(ptr);\n Module._free(ptr_value);\n };\n window.JS_Add_Property_Integer = exports.JS_Add_Property_Integer = JS_Add_Property_Integer = function JS_Add_Property_Integer(key, name, value) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(4);\n Module.HEAP32[ptr_value / 4] = value;\n _GS_Add_Property_Integer(key, ptr, ptr_value);\n _free(ptr);\n Module._free(ptr_value);\n };\n window.JS_Add_Property_Double = exports.JS_Add_Property_Double = JS_Add_Property_Double = function JS_Add_Property_Double(key, name, value) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(8);\n Module.HEAPF64[ptr_value / 8] = value;\n _GS_Add_Property_Double_By_Pointer(key, ptr, ptr_value);\n _free(ptr);\n Module._free(ptr_value);\n };\n window.JS_Add_Property_String = exports.JS_Add_Property_String = JS_Add_Property_String = function JS_Add_Property_String(key, name, value) {\n var ptr = allocateUTF8(name);\n var ptr_value = allocateUTF8(value);\n _GS_Add_Property_String(key, ptr, ptr_value);\n _free(ptr);\n _free(ptr_value);\n };\n window.JS_Add_Property_Json = exports.JS_Add_Property_Json = JS_Add_Property_Json = function JS_Add_Property_Json(key, name, value) {\n var ptr = allocateUTF8(name);\n var ptr_value = allocateUTF8(value);\n _GS_Add_Property_Json(key, ptr, ptr_value);\n _free(ptr);\n _free(ptr_value);\n };\n window.JS_Show_Property_Type = exports.JS_Show_Property_Type = JS_Show_Property_Type = function JS_Show_Property_Type(key, name) {\n var ptr = allocateUTF8(name);\n var ptr_type = Module._malloc(4);\n _GS_Show_Property_Type(key, ptr, ptr_type);\n var type = Module.HEAP32[ptr_type / 4];\n _free(ptr);\n _free(ptr_type);\n return type;\n };\n window.JS_Show_Property_Boolean = exports.JS_Show_Property_Boolean = JS_Show_Property_Boolean = function JS_Show_Property_Boolean(key, name) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(4);\n _GS_Show_Property_Boolean(key, ptr, ptr_value);\n var value = Module.HEAP32[ptr_value / 4];\n _free(ptr);\n _free(ptr_value);\n if (value == 1) {\n return true;\n } else {\n return false;\n }\n };\n window.JS_Show_Property_Integer = exports.JS_Show_Property_Integer = JS_Show_Property_Integer = function JS_Show_Property_Integer(key, name) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(4);\n _GS_Show_Property_Integer(key, ptr, ptr_value);\n var value = Module.HEAP32[ptr_value / 4];\n _free(ptr);\n _free(ptr_value);\n return value;\n };\n window.JS_Show_Property_Double = exports.JS_Show_Property_Double = JS_Show_Property_Double = function JS_Show_Property_Double(key, name) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(8);\n _GS_Show_Property_Double(key, ptr, ptr_value);\n var value = Module.HEAPF64[ptr_value / 8];\n _free(ptr);\n _free(ptr_value);\n return value;\n };\n window.JS_Show_Property_String = exports.JS_Show_Property_String = JS_Show_Property_String = function JS_Show_Property_String(key, name) {\n var result = null;\n var ptr = allocateUTF8(name);\n var ptr_len = Module._malloc(4);\n _GS_Show_Property_String_Length(key, ptr, ptr_len);\n var len = Module.HEAP32[ptr_len / 4];\n if (len > 0) {\n var ptr_value = Module._malloc(len + 1);\n _GS_Show_Property_String(key, ptr, ptr_value);\n result = UTF8ToString(ptr_value);\n Module._free(ptr_value);\n }\n _free(ptr);\n Module._free(ptr_len);\n return result;\n };\n window.JS_Property_Exists = exports.JS_Property_Exists = JS_Property_Exists = function JS_Property_Exists(key, name) {\n var ptr = allocateUTF8(name);\n var result = _GS_Property_Exists(key, ptr);\n _free(ptr);\n return result;\n };\n window.JS_Remove_Property = exports.JS_Remove_Property = _JS_Remove_Property = function JS_Remove_Property(key, name) {\n var ptr = allocateUTF8(name);\n _JS_Remove_Property(key, ptr);\n _free(ptr);\n };\n window.JS_Clear_Properties = exports.JS_Clear_Properties = JS_Clear_Properties = _GS_Clear_Properties;\n window.JS_Show_Properties = exports.JS_Show_Properties = JS_Show_Properties = function JS_Show_Properties(key) {\n var result = new gs_collections_1.StringKeyList();\n var ptr_count = Module._malloc(4);\n _GS_Show_Property_Count(key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n for (var i = 0; i < count; i++) {\n var ptr_type = Module._malloc(4);\n var ptr_name_len = Module._malloc(4);\n var ptr_value_len = Module._malloc(4);\n _GS_Show_Property_Type_By_Index(key, i, ptr_type);\n _GS_Show_Property_Length_By_Index(key, i, ptr_name_len, ptr_value_len);\n var type = Module.HEAP32[ptr_type / 4];\n var name_len = Module.HEAP32[ptr_name_len / 4];\n var value_len = Module.HEAP32[ptr_value_len / 4];\n if (type == 1) {\n var ptr_name = Module._malloc(name_len + 1);\n var ptr_value = Module._malloc(4);\n _GS_Show_Property_By_Index(key, i, ptr_name, ptr_value);\n var name = UTF8ToString(ptr_name);\n var value = Module.HEAP32[ptr_value / 4];\n result.add(name, value);\n Module._free(ptr_name);\n Module._free(ptr_value);\n } else if (type == 2) {\n var ptr_name = Module._malloc(name_len + 1);\n var ptr_value = Module._malloc(4);\n _GS_Show_Property_By_Index(key, i, ptr_name, ptr_value);\n var name = UTF8ToString(ptr_name);\n var value = Module.HEAP32[ptr_value / 4];\n result.add(name, value);\n Module._free(ptr_name);\n Module._free(ptr_value);\n } else if (type == 3) {\n var ptr_name = Module._malloc(name_len + 1);\n var ptr_value = Module._malloc(8);\n _GS_Show_Property_By_Index(key, i, ptr_name, ptr_value);\n var name = UTF8ToString(ptr_name);\n var value = Module.HEAPF64[ptr_value / 8];\n result.add(name, value);\n Module._free(ptr_name);\n Module._free(ptr_value);\n } else if (type == 4 || type == 5) {\n var ptr_name = Module._malloc(name_len + 1);\n var ptr_value = Module._malloc(value_len + 1);\n _GS_Show_Property_By_Index(key, i, ptr_name, ptr_value);\n var name = UTF8ToString(ptr_name);\n var value = UTF8ToString(ptr_value);\n result.add(name, value);\n Module._free(ptr_name);\n Module._free(ptr_value);\n }\n Module._free(ptr_type);\n Module._free(ptr_name_len);\n Module._free(ptr_value_len);\n }\n Module._free(ptr_count);\n return result;\n };\n window.JS_Show_Key_By_Id = exports.JS_Show_Key_By_Id = JS_Show_Key_By_Id = function JS_Show_Key_By_Id(id) {\n var ptr = allocateUTF8(id);\n var key = _GS_Show_Key_By_Id(ptr);\n _free(ptr);\n return key;\n };\n window.JS_Set_Key_Index = exports.JS_Set_Key_Index = JS_Set_Key_Index = _GS_Set_Key_Index;\n window.JS_Show_Key_Index = exports.JS_Show_Key_Index = JS_Show_Key_Index = function JS_Show_Key_Index(key) {\n var ptr_index = Module._malloc(4);\n _GS_Show_Key_Index(key, ptr_index);\n var index = Module.HEAP32[ptr_index / 4];\n Module._free(ptr_index);\n return index;\n };\n window.JS_Show_Key_Tag = exports.JS_Show_Key_Tag = JS_Show_Key_Tag = function JS_Show_Key_Tag(key) {\n var result = null;\n var ptr_tag = Module._malloc(512);\n if (_GS_Show_Key_Tag(key, ptr_tag)) {\n result = UTF8ToString(ptr_tag);\n }\n Module._free(ptr_tag);\n return result;\n };\n window.JS_Set_Driver_Options = exports.JS_Set_Driver_Options = JS_Set_Driver_Options = function JS_Set_Driver_Options(options) {\n var ptr_options = allocateUTF8(options);\n _GS_Set_Driver_Options(ptr_options);\n _free(ptr_options);\n };\n window.JS_Show_Driver_Options = exports.JS_Show_Driver_Options = JS_Show_Driver_Options = function JS_Show_Driver_Options() {\n var ptr_ro = Module._malloc(512);\n _GS_Show_Driver_Options(ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_ro);\n return ro;\n };\n window.JS_Show_One_Driver_Option = exports.JS_Show_One_Driver_Option = JS_Show_One_Driver_Option = function JS_Show_One_Driver_Option(name) {\n var ptr = allocateUTF8(name);\n var ptr_ro = Module._malloc(512);\n _GS_Show_One_Driver_Option(ptr, ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_ro);\n _free(ptr);\n return ro;\n };\n window.JS_Set_Shader = exports.JS_Set_Shader = JS_Set_Shader = function JS_Set_Shader(shader) {\n var ptr_shader = allocateUTF8(shader);\n _GS_Set_Shader(ptr_shader);\n _free(ptr_shader);\n };\n window.JS_Show_Shader = exports.JS_Show_Shader = JS_Show_Shader = function JS_Show_Shader() {\n var ptr_sh = Module._malloc(20400);\n _GS_Show_Shader(ptr_sh);\n var sh = UTF8ToString(ptr_sh);\n Module._free(ptr_sh);\n return sh;\n };\n window.JS_Show_One_Shader = exports.JS_Show_One_Shader = JS_Show_One_Shader = function JS_Show_One_Shader(name) {\n var ptr = allocateUTF8(name);\n var ptr_sh = Module._malloc(20400);\n var succeed = _GS_Show_One_Shader(ptr, ptr_sh);\n var sh = null;\n if (succeed) {\n var sh_1 = UTF8ToString(ptr_sh);\n }\n Module._free(ptr_sh);\n _free(ptr);\n return sh;\n };\n window.JS_UnSet_Shader = exports.JS_UnSet_Shader = JS_UnSet_Shader = _GS_UnSet_Shader;\n window.JS_Set_Viewport = exports.JS_Set_Viewport = JS_Set_Viewport = function JS_Set_Viewport(x, y, width, height, type) {\n var ptr_type = allocateUTF8(type);\n _GS_Set_Viewport(x, y, width, height, ptr_type);\n _free(ptr_type);\n };\n window.JS_Set_Camera = exports.JS_Set_Camera = JS_Set_Camera = function JS_Set_Camera(pos, tar, up, width, height, projection) {\n var ptr_pos = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_pos / 8] = pos[0];\n Module.HEAPF64[ptr_pos / 8 + 1] = pos[1];\n Module.HEAPF64[ptr_pos / 8 + 2] = pos[2];\n var ptr_tar = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_tar / 8] = tar[0];\n Module.HEAPF64[ptr_tar / 8 + 1] = tar[1];\n Module.HEAPF64[ptr_tar / 8 + 2] = tar[2];\n var ptr_up = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_up / 8] = up[0];\n Module.HEAPF64[ptr_up / 8 + 1] = up[1];\n Module.HEAPF64[ptr_up / 8 + 2] = up[2];\n var ptr_proj = allocateUTF8(projection);\n _GS_Set_Camera(ptr_pos, ptr_tar, ptr_up, width, height, ptr_proj);\n Module._free(ptr_pos);\n Module._free(ptr_tar);\n Module._free(ptr_up);\n _free(ptr_proj);\n };\n window.JS_Set_Camera_Position = exports.JS_Set_Camera_Position = JS_Set_Camera_Position = function JS_Set_Camera_Position(pos) {\n var ptr_pos = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_pos / 8] = pos[0];\n Module.HEAPF64[ptr_pos / 8 + 1] = pos[1];\n Module.HEAPF64[ptr_pos / 8 + 2] = pos[2];\n _GS_Set_Camera_Position(ptr_pos);\n Module._free(ptr_pos);\n };\n window.JS_Set_Camera_Target = exports.JS_Set_Camera_Target = JS_Set_Camera_Target = function JS_Set_Camera_Target(tar) {\n var ptr_tar = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_tar / 8] = tar[0];\n Module.HEAPF64[ptr_tar / 8 + 1] = tar[1];\n Module.HEAPF64[ptr_tar / 8 + 2] = tar[2];\n _GS_Set_Camera_Target(ptr_tar);\n Module._free(ptr_tar);\n };\n window.JS_Set_Camera_Up = exports.JS_Set_Camera_Up = JS_Set_Camera_Up = function JS_Set_Camera_Up(up) {\n var ptr_up = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_up / 8] = up[0];\n Module.HEAPF64[ptr_up / 8 + 1] = up[1];\n Module.HEAPF64[ptr_up / 8 + 2] = up[2];\n _GS_Set_Camera_Up(ptr_up);\n Module._free(ptr_up);\n };\n window.JS_Set_Camera_Field = exports.JS_Set_Camera_Field = JS_Set_Camera_Field = _GS_Set_Camera_Field;\n window.JS_Set_Camera_Extent = exports.JS_Set_Camera_Extent = JS_Set_Camera_Extent = _GS_Set_Camera_Extent;\n window.JS_Set_Camera_Projection = exports.JS_Set_Camera_Projection = JS_Set_Camera_Projection = function JS_Set_Camera_Projection(projection) {\n var ptr_proj = allocateUTF8(projection);\n _GS_Set_Camera_Projection(ptr_proj);\n _free(ptr_proj);\n };\n window.JS_Keep_Camera_Ratio = exports.JS_Keep_Camera_Ratio = JS_Keep_Camera_Ratio = _GS_Keep_Camera_Ratio;\n window.JS_Show_Camera = exports.JS_Show_Camera = JS_Show_Camera = function JS_Show_Camera() {\n var ptr_pos = Module._malloc(8 * 3);\n var ptr_tar = Module._malloc(8 * 3);\n var ptr_up = Module._malloc(8 * 3);\n var ptr_width = Module._malloc(8);\n var ptr_height = Module._malloc(8);\n var ptr_proj = Module._malloc(64);\n _GS_Show_Camera(ptr_pos, ptr_tar, ptr_up, ptr_width, ptr_height, ptr_proj);\n var camera = {};\n var pos = new Float64Array(3);\n pos[0] = Module.HEAPF64[ptr_pos / 8];\n pos[1] = Module.HEAPF64[ptr_pos / 8 + 1];\n pos[2] = Module.HEAPF64[ptr_pos / 8 + 2];\n camera.position = pos;\n var tar = new Float64Array(3);\n tar[0] = Module.HEAPF64[ptr_tar / 8];\n tar[1] = Module.HEAPF64[ptr_tar / 8 + 1];\n tar[2] = Module.HEAPF64[ptr_tar / 8 + 2];\n camera.target = tar;\n var up = new Float64Array(3);\n up[0] = Module.HEAPF64[ptr_up / 8];\n up[1] = Module.HEAPF64[ptr_up / 8 + 1];\n up[2] = Module.HEAPF64[ptr_up / 8 + 2];\n camera.up = up;\n camera.width = Module.HEAPF64[ptr_width / 8];\n camera.height = Module.HEAPF64[ptr_height / 8];\n camera.projection = UTF8ToString(ptr_proj);\n Module._free(ptr_pos);\n Module._free(ptr_tar);\n Module._free(ptr_up);\n Module._free(ptr_width);\n Module._free(ptr_height);\n Module._free(ptr_proj);\n return camera;\n };\n window.JS_Show_Camera_Position = exports.JS_Show_Camera_Position = JS_Show_Camera_Position = function JS_Show_Camera_Position() {\n var ptr_pos = Module._malloc(8 * 3);\n _GS_Show_Camera_Position(ptr_pos);\n var pos = new Float64Array(3);\n pos[0] = Module.HEAPF64[ptr_pos / 8];\n pos[1] = Module.HEAPF64[ptr_pos / 8 + 1];\n pos[2] = Module.HEAPF64[ptr_pos / 8 + 2];\n Module._free(ptr_pos);\n return pos;\n };\n window.JS_Show_Camera_Target = exports.JS_Show_Camera_Target = JS_Show_Camera_Target = function JS_Show_Camera_Target() {\n var ptr_tar = Module._malloc(8 * 3);\n _GS_Show_Camera_Target(ptr_tar);\n var tar = new Float64Array(3);\n tar[0] = Module.HEAPF64[ptr_tar / 8];\n tar[1] = Module.HEAPF64[ptr_tar / 8 + 1];\n tar[2] = Module.HEAPF64[ptr_tar / 8 + 2];\n Module._free(ptr_tar);\n return tar;\n };\n window.JS_Show_Camera_Up = exports.JS_Show_Camera_Up = JS_Show_Camera_Up = function JS_Show_Camera_Up() {\n var ptr_up = Module._malloc(8 * 3);\n _GS_Show_Camera_Up(ptr_up);\n var up = new Float64Array(3);\n up[0] = Module.HEAPF64[ptr_up / 8];\n up[1] = Module.HEAPF64[ptr_up / 8 + 1];\n up[2] = Module.HEAPF64[ptr_up / 8 + 2];\n Module._free(ptr_up);\n return up;\n };\n window.JS_Show_Camera_Field = exports.JS_Show_Camera_Field = JS_Show_Camera_Field = function JS_Show_Camera_Field() {\n var ptr_width = Module._malloc(8);\n var ptr_height = Module._malloc(8);\n var field = new Float64Array(2);\n _GS_Show_Camera_Field(ptr_width, ptr_height);\n field[0] = Module.HEAPF64[ptr_width / 8];\n field[1] = Module.HEAPF64[ptr_height / 8];\n Module._free(ptr_width);\n Module._free(ptr_height);\n return field;\n };\n window.JS_Show_Camera_Extent = exports.JS_Show_Camera_Extent = JS_Show_Camera_Extent = function JS_Show_Camera_Extent() {\n var ptr_near = Module._malloc(8);\n var ptr_far = Module._malloc(8);\n var extent = new Float64Array(2);\n _GS_Show_Camera_Extent(ptr_near, ptr_far);\n extent[0] = Module.HEAPF64[ptr_near / 8];\n extent[1] = Module.HEAPF64[ptr_far / 8];\n Module._free(ptr_near);\n Module._free(ptr_far);\n return extent;\n };\n window.JS_Show_Camera_Projection = exports.JS_Show_Camera_Projection = JS_Show_Camera_Projection = function JS_Show_Camera_Projection() {\n var ptr_proj = Module._malloc(64);\n _GS_Show_Camera_Projection(ptr_proj);\n var projection = UTF8ToString(ptr_proj);\n Module._free(ptr_proj);\n return projection;\n };\n window.JS_Show_Camera_Projection_Matrix = exports.JS_Show_Camera_Projection_Matrix = JS_Show_Camera_Projection_Matrix = function JS_Show_Camera_Projection_Matrix() {\n var ptr_mat = Module._malloc(4 * 16);\n _GS_Show_Camera_Projection_Matrix(ptr_mat);\n var mat = new Float32Array(16);\n for (var i = 0; i < 16; i++) {\n mat[i] = Module.HEAPF32[ptr_mat / 4 + i];\n }\n Module._free(ptr_mat);\n return mat;\n };\n window.JS_Show_Camera_View_Matrix = exports.JS_Show_Camera_View_Matrix = JS_Show_Camera_View_Matrix = function JS_Show_Camera_View_Matrix() {\n var ptr_mat = Module._malloc(4 * 16);\n _GS_Show_Camera_View_Matrix(ptr_mat);\n var mat = new Float32Array(16);\n for (var i = 0; i < 16; i++) {\n mat[i] = Module.HEAPF32[ptr_mat / 4 + i];\n }\n Module._free(ptr_mat);\n return mat;\n };\n window.JS_Show_Path_Camera_Position = exports.JS_Show_Path_Camera_Position = JS_Show_Path_Camera_Position = function JS_Show_Path_Camera_Position(path) {\n var pcount = path.length;\n var ptr_path = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAP32[ptr_path / 4 + i] = path[i];\n }\n var ptr_pos = Module._malloc(8 * 3);\n _GS_Show_Path_Camera_Position(ptr_path, pcount, ptr_pos);\n var pos = new Float64Array(3);\n pos[0] = Module.HEAPF64[ptr_pos / 8];\n pos[1] = Module.HEAPF64[ptr_pos / 8 + 1];\n pos[2] = Module.HEAPF64[ptr_pos / 8 + 2];\n Module._free(ptr_pos);\n Module._free(ptr_path);\n return pos;\n };\n window.JS_Show_Path_Camera_Target = exports.JS_Show_Path_Camera_Target = JS_Show_Path_Camera_Target = function JS_Show_Path_Camera_Target(path) {\n var pcount = path.length;\n var ptr_path = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAP32[ptr_path / 4 + i] = path[i];\n }\n var ptr_pos = Module._malloc(8 * 3);\n _GS_Show_Path_Camera_Target(ptr_path, pcount, ptr_pos);\n var pos = new Float64Array(3);\n pos[0] = Module.HEAPF64[ptr_pos / 8];\n pos[1] = Module.HEAPF64[ptr_pos / 8 + 1];\n pos[2] = Module.HEAPF64[ptr_pos / 8 + 2];\n Module._free(ptr_pos);\n Module._free(ptr_path);\n return pos;\n };\n window.JS_Dolly_Camera = exports.JS_Dolly_Camera = JS_Dolly_Camera = _GS_Dolly_Camera;\n window.JS_Roll_Camera = exports.JS_Roll_Camera = JS_Roll_Camera = function JS_Roll_Camera(start, end) {\n var ptr_start = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_start / 8] = start[0];\n Module.HEAPF64[ptr_start / 8 + 1] = start[1];\n Module.HEAPF64[ptr_start / 8 + 2] = start[2];\n var ptr_end = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_end / 8] = end[0];\n Module.HEAPF64[ptr_end / 8 + 1] = end[1];\n Module.HEAPF64[ptr_end / 8 + 2] = end[2];\n _GS_Roll_Camera(ptr_start, ptr_end);\n Module._free(ptr_start);\n Module._free(ptr_end);\n };\n window.JS_Zoom_Camera = exports.JS_Zoom_Camera = JS_Zoom_Camera = _GS_Zoom_Camera;\n window.JS_UnSet_Camera = exports.JS_UnSet_Camera = JS_UnSet_Camera = _GS_UnSet_Camera;\n window.JS_Set_Color = exports.JS_Set_Color = JS_Set_Color = function JS_Set_Color(options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Color(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Color = exports.JS_UnSet_Color = JS_UnSet_Color = _GS_UnSet_Color;\n window.JS_UnSet_One_Color = exports.JS_UnSet_One_Color = JS_UnSet_One_Color = function JS_UnSet_One_Color(name) {\n var ptr_name = allocateUTF8(name);\n _GS_UnSet_One_Color(ptr_name);\n _free(ptr_name);\n };\n window.JS_Show_Color = exports.JS_Show_Color = JS_Show_Color = function JS_Show_Color() {\n var ptr_colors = Module._malloc(512);\n _GS_Show_Color(ptr_colors);\n var color = UTF8ToString(ptr_colors);\n Module._free(ptr_colors);\n return color;\n };\n window.JS_Show_One_Color = exports.JS_Show_One_Color = JS_Show_One_Color = function JS_Show_One_Color(name) {\n var ptr_name = allocateUTF8(name);\n var ptr_colors = Module._malloc(512);\n var color = null;\n if (_GS_Show_One_Color(ptr_name, ptr_colors)) {\n color = UTF8ToString(ptr_colors);\n }\n Module._free(ptr_colors);\n _free(ptr_name);\n return color;\n };\n window.JS_Show_Color_By_Value = exports.JS_Show_Color_By_Value = JS_Show_Color_By_Value = function JS_Show_Color_By_Value(name) {\n var ptr_name = allocateUTF8(name);\n var ptr_values = Module._malloc(4 * 4);\n if (_GS_Show_Color_By_Value(ptr_name, ptr_values)) {\n var values = new Float32Array(4);\n values[0] = Module.HEAPF32[ptr_values / 4];\n values[1] = Module.HEAPF32[ptr_values / 4 + 1];\n values[2] = Module.HEAPF32[ptr_values / 4 + 2];\n values[3] = Module.HEAPF32[ptr_values / 4 + 3];\n Module._free(ptr_values);\n _free(ptr_name);\n return values;\n }\n return null;\n };\n window.JS_Set_Geometry_Color = exports.JS_Set_Geometry_Color = JS_Set_Geometry_Color = function JS_Set_Geometry_Color(key, options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Geometry_Color(key, ptr);\n _free(ptr);\n };\n window.JS_Set_Geometry_Color_By_Value = exports.JS_Set_Geometry_Color_By_Value = JS_Set_Geometry_Color_By_Value = function JS_Set_Geometry_Color_By_Value(key, type, offset, value) {\n var ptr_type = allocateUTF8(type);\n var ptr_value = Module._malloc(value.length * 4);\n var len = value.length;\n for (var i = 0; i < len; i++) {\n Module.HEAPF32[ptr_value / 4 + i] = value[i];\n }\n _GS_Set_Geometry_Color_By_Value(key, ptr_type, offset, value.length / 4, ptr_value);\n Module._free(ptr_value);\n _free(ptr_type);\n };\n window.JS_Show_Geometry_Color_By_Value = exports.JS_Show_Geometry_Color_By_Value = JS_Show_Geometry_Color_By_Value = function JS_Show_Geometry_Color_By_Value(key, type, offset) {\n var value = null;\n var pcount = 0;\n var key_type = JS_Show_Key_Type(key);\n if (key_type == 103 || key_type == 107) {\n var shell_size = JS_Show_Shell_Size(key);\n pcount = shell_size.pos;\n } else if (key_type == 104) {\n var mesh_size = JS_Show_Mesh_Size(key);\n pcount = mesh_size.row * mesh_size.col;\n }\n var ptr_type = allocateUTF8(type);\n var ptr_color_type = Module._malloc(4);\n _GS_Show_Geometry_Color_Type(key, ptr_type, ptr_color_type);\n var color_type = Module.HEAP32[ptr_color_type / 4];\n if (pcount > 0 && color_type > 0) {\n if (color_type == 1) {\n pcount = 1;\n }\n var ptr_value = Module._malloc(pcount * 4);\n if (_GS_Show_Geometry_Color_By_Value(key, ptr_type, offset, pcount, ptr_value)) {\n var len = pcount * 4;\n value = new Float32Array(len);\n for (var i = 0; i < len; i++) {\n value[i] = Module.HEAPF32[ptr_value / 4 + i];\n }\n }\n Module._free(ptr_value);\n }\n Module._free(ptr_color_type);\n _free(ptr_type);\n return value;\n };\n window.JS_UnSet_Geometry_Color = exports.JS_UnSet_Geometry_Color = JS_UnSet_Geometry_Color = function JS_UnSet_Geometry_Color(key, type) {\n var ptr_type = allocateUTF8(type);\n _GS_UnSet_Geometry_Color(key, ptr_type);\n _free(ptr_type);\n };\n window.JS_Set_Visibility = exports.JS_Set_Visibility = JS_Set_Visibility = function JS_Set_Visibility(options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Visibility(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Visibility = exports.JS_UnSet_Visibility = JS_UnSet_Visibility = _GS_UnSet_Visibility;\n window.JS_UnSet_One_Visibility = exports.JS_UnSet_One_Visibility = JS_UnSet_One_Visibility = function JS_UnSet_One_Visibility(name) {\n var ptr = allocateUTF8(name);\n _GS_UnSet_One_Visibility(ptr);\n _free(ptr);\n };\n window.JS_Show_Visibility = exports.JS_Show_Visibility = JS_Show_Visibility = function JS_Show_Visibility() {\n var ptr_vi = Module._malloc(512);\n _GS_Show_Visibility(ptr_vi);\n var vi = UTF8ToString(ptr_vi);\n Module._free(ptr_vi);\n return vi;\n };\n window.JS_Show_One_Visibility = exports.JS_Show_One_Visibility = JS_Show_One_Visibility = function JS_Show_One_Visibility(name) {\n var ptr_name = allocateUTF8(name);\n var ptr_vi = Module._malloc(64);\n var result = _GS_Show_One_Visibility(ptr_name, ptr_vi);\n var vi = null;\n if (result) {\n vi = UTF8ToString(ptr_vi);\n }\n _free(ptr_name);\n Module._free(ptr_vi);\n return vi;\n };\n window.JS_Set_Selectability = exports.JS_Set_Selectability = JS_Set_Selectability = function JS_Set_Selectability(options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Selectability(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Selectability = exports.JS_UnSet_Selectability = JS_UnSet_Selectability = _GS_UnSet_Selectability;\n window.JS_UnSet_One_Selectability = exports.JS_UnSet_One_Selectability = JS_UnSet_One_Selectability = function JS_UnSet_One_Selectability(name) {\n var ptr = allocateUTF8(name);\n _GS_UnSet_One_Selectability(ptr);\n _free(ptr);\n };\n window.JS_Show_Selectability = exports.JS_Show_Selectability = JS_Show_Selectability = function JS_Show_Selectability() {\n var ptr_se = Module._malloc(512);\n _GS_Show_Selectability(ptr_se);\n var se = UTF8ToString(ptr_se);\n Module._free(ptr_se);\n return se;\n };\n window.JS_Show_One_Selectability = exports.JS_Show_One_Selectability = JS_Show_One_Selectability = function JS_Show_One_Selectability(name) {\n var ptr_name = allocateUTF8(name);\n var ptr_se = Module._malloc(64);\n var result = _GS_Show_One_Selectability(ptr_name, ptr_se);\n var se = null;\n if (result) {\n se = UTF8ToString(ptr_se);\n }\n _free(ptr_name);\n Module._free(ptr_se);\n return se;\n };\n window.JS_Set_ModellingMatrix = exports.JS_Set_ModellingMatrix = JS_Set_ModellingMatrix = function JS_Set_ModellingMatrix(mm) {\n var ptr_mm = Module._malloc(4 * 16);\n for (var i = 0; i < 16; i++) {\n Module.HEAPF32[ptr_mm / 4 + i] = mm[i];\n }\n _GS_Set_ModellingMatrix(ptr_mm);\n Module._free(ptr_mm);\n };\n window.JS_Append_ModellingMatrix = exports.JS_Append_ModellingMatrix = JS_Append_ModellingMatrix = function JS_Append_ModellingMatrix(mm) {\n var ptr_mm = Module._malloc(4 * 16);\n for (var i = 0; i < 16; i++) {\n Module.HEAPF32[ptr_mm / 4 + i] = mm[i];\n }\n _GS_Append_ModellingMatrix(ptr_mm);\n Module._free(ptr_mm);\n };\n window.JS_Show_ModellingMatrix = exports.JS_Show_ModellingMatrix = JS_Show_ModellingMatrix = function JS_Show_ModellingMatrix() {\n var ptr_mm = Module._malloc(4 * 16);\n _GS_Show_ModellingMatrix(ptr_mm);\n var mm = new Float32Array(16);\n for (var i = 0; i < 16; i++) {\n mm[i] = Module.HEAPF32[ptr_mm / 4 + i];\n }\n Module._free(ptr_mm);\n return mm;\n };\n window.JS_Show_Path_ModellingMatrix = exports.JS_Show_Path_ModellingMatrix = JS_Show_Path_ModellingMatrix = function JS_Show_Path_ModellingMatrix(path) {\n var pcount = path.length;\n var ptr_path = Module._malloc(4 * pcount);\n Module.HEAP32.set(path, ptr_path / 4);\n var ptr_mm = Module._malloc(4 * 16);\n _GS_Show_Path_ModellingMatrix(ptr_path, pcount, ptr_mm);\n var mm = new Float32Array(16);\n for (var i = 0; i < 16; i++) {\n mm[i] = Module.HEAPF32[ptr_mm / 4 + i];\n }\n Module._free(ptr_path);\n Module._free(ptr_mm);\n return mm;\n };\n window.JS_UnSet_ModellingMatrix = exports.JS_UnSet_ModellingMatrix = JS_UnSet_ModellingMatrix = _GS_UnSet_ModellingMatrix;\n window.JS_Set_Rendering_Options = exports.JS_Set_Rendering_Options = JS_Set_Rendering_Options = function JS_Set_Rendering_Options(options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Rendering_Options(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Rendering_Options = exports.JS_UnSet_Rendering_Options = JS_UnSet_Rendering_Options = _GS_UnSet_Rendering_Options;\n window.JS_UnSet_One_Rendering_Option = exports.JS_UnSet_One_Rendering_Option = JS_UnSet_One_Rendering_Option = function JS_UnSet_One_Rendering_Option(option) {\n var ptr = allocateUTF8(option);\n _GS_UnSet_One_Rendering_Option(ptr);\n _free(ptr);\n };\n window.JS_Show_Rendering_Options = exports.JS_Show_Rendering_Options = JS_Show_Rendering_Options = function JS_Show_Rendering_Options() {\n var ptr_ro = Module._malloc(512);\n _GS_Show_Rendering_Options(ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_ro);\n return ro;\n };\n window.JS_Show_One_Rendering_Option = exports.JS_Show_One_Rendering_Option = JS_Show_One_Rendering_Option = function JS_Show_One_Rendering_Option(name) {\n var ptr = allocateUTF8(name);\n var ptr_ro = Module._malloc(512);\n _GS_Show_One_Rendering_Option(ptr, ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_ro);\n _free(ptr);\n return ro;\n };\n window.JS_Show_One_Default_Rendering_Option = exports.JS_Show_One_Default_Rendering_Option = JS_Show_One_Default_Rendering_Option = function JS_Show_One_Default_Rendering_Option(name) {\n var ptr = allocateUTF8(name);\n var ptr_ro = Module._malloc(512);\n _GS_Show_One_Default_Rendering_Option(ptr, ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_ro);\n _free(ptr);\n return ro;\n };\n window.JS_Show_One_Path_Rendering_Option = exports.JS_Show_One_Path_Rendering_Option = JS_Show_One_Path_Rendering_Option = function JS_Show_One_Path_Rendering_Option(path, name) {\n var pcount = path.length;\n var ptr_path = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAP32[ptr_path / 4 + i] = path[i];\n }\n var ptr = allocateUTF8(name);\n var ptr_ro = Module._malloc(512);\n _GS_Show_One_Path_Rendering_Option(ptr_path, pcount, ptr, ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_path);\n Module._free(ptr_ro);\n _free(ptr);\n return ro;\n };\n window.JS_Set_Heuristic_Options = exports.JS_Set_Heuristic_Options = JS_Set_Heuristic_Options = function JS_Set_Heuristic_Options(options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Heuristic_Options(ptr);\n _free(ptr);\n };\n window.JS_Set_One_Heuristic_Option = exports.JS_Set_One_Heuristic_Option = JS_Set_One_Heuristic_Option = function JS_Set_One_Heuristic_Option(name, value) {\n var ptr_name = allocateUTF8(name);\n var ptr_value = allocateUTF8(value);\n _GS_Set_One_Heuristic_Option(ptr_name, ptr_value);\n _free(ptr_name);\n _free(ptr_value);\n };\n window.JS_UnSet_One_Heuristic_Option = exports.JS_UnSet_One_Heuristic_Option = JS_UnSet_One_Heuristic_Option = function JS_UnSet_One_Heuristic_Option(option) {\n var ptr = allocateUTF8(option);\n _GS_UnSet_One_Heuristic_Option(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Heuristic_Options = exports.JS_UnSet_Heuristic_Options = JS_UnSet_Heuristic_Options = _GS_UnSet_Heuristic_Options;\n window.JS_Show_Heuristic_Options = exports.JS_Show_Heuristic_Options = JS_Show_Heuristic_Options = function JS_Show_Heuristic_Options(options) {\n var ptr_ho = Module._malloc(512);\n _GS_Show_Heuristic_Options(ptr_ho);\n var ho = UTF8ToString(ptr_ho);\n Module._free(ptr_ho);\n return ho;\n };\n window.JS_Show_One_Heuristic_Option = exports.JS_Show_One_Heuristic_Option = JS_Show_One_Heuristic_Option = function JS_Show_One_Heuristic_Option(name) {\n var ptr = allocateUTF8(name);\n var ptr_ho = Module._malloc(512);\n _GS_Show_One_Heuristic_Option(ptr, ptr_ho);\n var ho = UTF8ToString(ptr_ho);\n Module._free(ptr_ho);\n _free(ptr);\n return ho;\n };\n window.JS_Set_Condition = exports.JS_Set_Condition = JS_Set_Condition = function JS_Set_Condition(condition) {\n var ptr = allocateUTF8(condition);\n _GS_Set_Condition(ptr);\n _free(ptr);\n };\n window.JS_Show_Condition = exports.JS_Show_Condition = JS_Show_Condition = function JS_Show_Condition() {\n var condition = null;\n if (_GS_Attribute_Exists(ObjectType.TYPE_Condition)) {\n var ptr_condition = Module._malloc(512);\n _GS_Show_Condition(ptr_condition);\n condition = UTF8ToString(ptr_condition);\n Module._free(ptr_condition);\n }\n return condition;\n };\n window.JS_UnSet_Condition = exports.JS_UnSet_Condition = JS_UnSet_Condition = _GS_UnSet_Condition;\n window.JS_Set_Text_Font = exports.JS_Set_Text_Font = JS_Set_Text_Font = function JS_Set_Text_Font(fonts) {\n var ptr = allocateUTF8(fonts);\n _GS_Set_Text_Font(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Text_Font = exports.JS_UnSet_Text_Font = JS_UnSet_Text_Font = _GS_UnSet_Text_Font;\n window.JS_UnSet_One_Text_Font = exports.JS_UnSet_One_Text_Font = JS_UnSet_One_Text_Font = function JS_UnSet_One_Text_Font(name) {\n var ptr = allocateUTF8(name);\n _GS_UnSet_One_Text_Font(ptr);\n _free(ptr);\n };\n window.JS_Show_Text_Font = exports.JS_Show_Text_Font = JS_Show_Text_Font = function JS_Show_Text_Font() {\n var ptr_fonts = Module._malloc(512);\n _GS_Show_Text_Font(ptr_fonts);\n var fonts = UTF8ToString(ptr_fonts);\n Module._free(ptr_fonts);\n return fonts;\n };\n window.JS_Show_One_Text_Font = exports.JS_Show_One_Text_Font = JS_Show_One_Text_Font = function JS_Show_One_Text_Font(name) {\n var ptr_name = allocateUTF8(name);\n var ptr_fonts = Module._malloc(512);\n _GS_Show_One_Text_Font(ptr_name, ptr_fonts);\n var fonts = UTF8ToString(ptr_fonts);\n Module._free(ptr_fonts);\n _free(ptr_name);\n return fonts;\n };\n window.JS_Attribute_Exists = exports.JS_Attribute_Exists = JS_Attribute_Exists = function JS_Attribute_Exists(type) {\n return _GS_Attribute_Exists(type);\n };\n window.JS_Image_Exists = exports.JS_Image_Exists = JS_Image_Exists = function JS_Image_Exists(name) {\n var ptr = allocateUTF8(name);\n var result = _GS_Image_Exists(ptr);\n _free(ptr);\n return result;\n };\n window.JS_Resize_By_Key = exports.JS_Resize_By_Key = JS_Resize_By_Key = _GS_Resize_By_Key;\n window.JS_Insert_Marker = exports.JS_Insert_Marker = JS_Insert_Marker = _GS_Insert_Marker;\n window.JS_Edit_Marker = exports.JS_Edit_Marker = JS_Edit_Marker = _GS_Edit_Marker;\n window.JS_Show_Marker = exports.JS_Show_Marker = JS_Show_Marker = function JS_Show_Marker(key) {\n var ptr_x = Module._malloc(4);\n var ptr_y = Module._malloc(4);\n var ptr_z = Module._malloc(4);\n _GS_Show_Marker(key, ptr_x, ptr_y, ptr_z);\n var pos = new Float32Array(3);\n pos[0] = Module.HEAPF32[ptr_x / 4];\n pos[1] = Module.HEAPF32[ptr_y / 4];\n pos[2] = Module.HEAPF32[ptr_z / 4];\n Module._free(ptr_x);\n Module._free(ptr_y);\n Module._free(ptr_z);\n return pos;\n };\n window.JS_Insert_Point_Cloud = exports.JS_Insert_Point_Cloud = JS_Insert_Point_Cloud = function JS_Insert_Point_Cloud(points) {\n var ptr_points = Module._malloc(4 * points.length);\n Module.HEAPF32.set(points, ptr_points / 4);\n var key = _GS_Insert_Point_Cloud(ptr_points, points.length / 3);\n Module._free(ptr_points);\n return key;\n };\n window.JS_Edit_Point_Cloud = exports.JS_Edit_Point_Cloud = JS_Edit_Point_Cloud = function JS_Edit_Point_Cloud(key, points) {\n var ptr_points = Module._malloc(4 * points.length);\n Module.HEAPF32.set(points, ptr_points / 4);\n _GS_Edit_Point_Cloud(key, ptr_points, points.length / 3);\n Module._free(ptr_points);\n return key;\n };\n window.JS_Show_Point_Cloud = exports.JS_Show_Point_Cloud = JS_Show_Point_Cloud = function JS_Show_Point_Cloud(key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Point_Cloud_Count(key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var ptr_points = Module._malloc(4 * count * 3);\n _GS_Show_Point_Cloud(key, ptr_points, ptr_count);\n var result = new Float32Array(count * 3);\n result.set(Module.HEAPF32.subarray(ptr_points / 4, ptr_points / 4 + count * 3));\n Module._free(ptr_points);\n Module._free(ptr_count);\n return result;\n };\n window.JS_Insert_Line = exports.JS_Insert_Line = JS_Insert_Line = _GS_Insert_Line;\n window.JS_Edit_Line = exports.JS_Edit_Line = JS_Edit_Line = _GS_Edit_Line;\n window.JS_Show_Line = exports.JS_Show_Line = JS_Show_Line = function JS_Show_Line(key) {\n var ptr_x1 = Module._malloc(4);\n var ptr_y1 = Module._malloc(4);\n var ptr_z1 = Module._malloc(4);\n var ptr_x2 = Module._malloc(4);\n var ptr_y2 = Module._malloc(4);\n var ptr_z2 = Module._malloc(4);\n _GS_Show_Line(key, ptr_x1, ptr_y1, ptr_z1, ptr_x2, ptr_y2, ptr_z2);\n var pos = new Float32Array(6);\n pos[0] = Module.HEAPF32[ptr_x1 / 4];\n pos[1] = Module.HEAPF32[ptr_y1 / 4];\n pos[2] = Module.HEAPF32[ptr_z1 / 4];\n pos[3] = Module.HEAPF32[ptr_x2 / 4];\n pos[4] = Module.HEAPF32[ptr_y2 / 4];\n pos[5] = Module.HEAPF32[ptr_z2 / 4];\n Module._free(ptr_x1);\n Module._free(ptr_y1);\n Module._free(ptr_z1);\n Module._free(ptr_x2);\n Module._free(ptr_y2);\n Module._free(ptr_z2);\n return pos;\n };\n window.JS_Insert_Polyline = exports.JS_Insert_Polyline = JS_Insert_Polyline = function JS_Insert_Polyline(points) {\n var num = points.length;\n var ptr_pos = Module._malloc(4 * num);\n for (var i = 0; i < num; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var key = _GS_Insert_Polyline(ptr_pos, num / 3);\n Module._free(ptr_pos);\n return key;\n };\n window.JS_Show_Polyline_Count = exports.JS_Show_Polyline_Count = JS_Show_Polyline_Count = function JS_Show_Polyline_Count(key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Polyline_Count(key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n Module._free(ptr_count);\n return count;\n };\n window.JS_Show_Polyline = exports.JS_Show_Polyline = JS_Show_Polyline = function JS_Show_Polyline(key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Polyline_Count(key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n Module._free(ptr_count);\n var len = count * 3;\n var ptr_pos = Module._malloc(4 * len);\n _GS_Show_Polyline(key, count, ptr_pos);\n var pos = new Float32Array(len);\n for (var i = 0; i < len; i++) {\n pos[i] = Module.HEAPF32[ptr_pos / 4 + i];\n }\n Module._free(ptr_pos);\n return pos;\n };\n window.JS_Insert_Circle = exports.JS_Insert_Circle = JS_Insert_Circle = function JS_Insert_Circle(center, radius, normal) {\n var ptr_center = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_center / 4] = center[0];\n Module.HEAPF32[ptr_center / 4 + 1] = center[1];\n Module.HEAPF32[ptr_center / 4 + 2] = center[2];\n var ptr_normal = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_normal / 4] = normal[0];\n Module.HEAPF32[ptr_normal / 4 + 1] = normal[1];\n Module.HEAPF32[ptr_normal / 4 + 2] = normal[2];\n var key = _GS_Insert_Circle(ptr_center, radius, ptr_normal);\n Module._free(ptr_center);\n Module._free(ptr_normal);\n return key;\n };\n window.JS_Show_Circle = exports.JS_Show_Circle = JS_Show_Circle = function JS_Show_Circle(key) {\n var ptr_center = Module._malloc(4 * 3);\n var ptr_normal = Module._malloc(4 * 3);\n var ptr_radius = Module._malloc(4);\n _GS_Show_Circle(key, ptr_center, ptr_radius, ptr_normal);\n var center = new Float32Array(3);\n center[0] = Module.HEAPF32[ptr_center / 4];\n center[1] = Module.HEAPF32[ptr_center / 4 + 1];\n center[2] = Module.HEAPF32[ptr_center / 4 + 2];\n var normal = new Float32Array(3);\n normal[0] = Module.HEAPF32[ptr_normal / 4];\n normal[1] = Module.HEAPF32[ptr_normal / 4 + 1];\n normal[2] = Module.HEAPF32[ptr_normal / 4 + 2];\n var radius = Module.HEAPF32[ptr_radius / 4];\n Module._free(ptr_center);\n Module._free(ptr_normal);\n Module._free(ptr_radius);\n return {\n center: center,\n radius: radius,\n normal: normal\n };\n };\n window.JS_Insert_Cylinder = exports.JS_Insert_Cylinder = JS_Insert_Cylinder = function JS_Insert_Cylinder(start, end, radius, cap) {\n var ptr_start = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_start / 4] = start[0];\n Module.HEAPF32[ptr_start / 4 + 1] = start[1];\n Module.HEAPF32[ptr_start / 4 + 2] = start[2];\n var ptr_end = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_end / 4] = end[0];\n Module.HEAPF32[ptr_end / 4 + 1] = end[1];\n Module.HEAPF32[ptr_end / 4 + 2] = end[2];\n var ptr_cap = allocateUTF8(cap);\n var key = _GS_Insert_Cylinder(ptr_start, ptr_end, radius, ptr_cap);\n Module._free(ptr_start);\n Module._free(ptr_end);\n _free(ptr_cap);\n return key;\n };\n window.JS_Show_Cylinder = exports.JS_Show_Cylinder = JS_Show_Cylinder = function JS_Show_Cylinder(key) {\n var ptr_start = Module._malloc(4 * 3);\n var ptr_end = Module._malloc(4 * 3);\n var ptr_radius = Module._malloc(4);\n var ptr_cap = Module._malloc(16);\n _GS_Show_Cylinder(key, ptr_start, ptr_end, ptr_radius, ptr_cap);\n var start = new Float32Array(3);\n start[0] = Module.HEAPF32[ptr_start / 4];\n start[1] = Module.HEAPF32[ptr_start / 4 + 1];\n start[2] = Module.HEAPF32[ptr_start / 4 + 2];\n var end = new Float32Array(3);\n end[0] = Module.HEAPF32[ptr_end / 4];\n end[1] = Module.HEAPF32[ptr_end / 4 + 1];\n end[2] = Module.HEAPF32[ptr_end / 4 + 2];\n var radius = Module.HEAPF32[ptr_radius / 4];\n var cap = UTF8ToString(ptr_cap);\n Module._free(ptr_start);\n Module._free(ptr_end);\n Module._free(ptr_radius);\n Module._free(ptr_cap);\n return {\n start: start,\n end: end,\n radius: radius,\n cap: cap\n };\n };\n window.JS_Insert_PolyCylinder = exports.JS_Insert_PolyCylinder = JS_Insert_PolyCylinder = function JS_Insert_PolyCylinder(points, radii, cap) {\n var ptr_pos = Module._malloc(4 * points.length);\n for (var i = 0; i < points.length; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var ptr_rad = Module._malloc(4 * radii.length);\n for (var i = 0; i < radii.length; i++) {\n Module.HEAPF32[ptr_rad / 4 + i] = radii[i];\n }\n var ptr_cap = allocateUTF8(cap);\n var key = _GS_Insert_PolyCylinder(ptr_pos, ptr_rad, radii.length, ptr_cap);\n Module._free(ptr_pos);\n Module._free(ptr_rad);\n _free(ptr_cap);\n return key;\n };\n window.JS_Edit_PolyCylinder = exports.JS_Edit_PolyCylinder = JS_Edit_PolyCylinder = function JS_Edit_PolyCylinder(key, points, radii, cap) {\n var ptr_pos = Module._malloc(4 * points.length);\n for (var i = 0; i < points.length; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var ptr_rad = Module._malloc(4 * radii.length);\n for (var i = 0; i < radii.length; i++) {\n Module.HEAPF32[ptr_rad / 4 + i] = radii[i];\n }\n var ptr_cap = allocateUTF8(cap);\n _GS_Edit_PolyCylinder(key, ptr_pos, ptr_rad, radii.length, ptr_cap);\n Module._free(ptr_pos);\n Module._free(ptr_rad);\n _free(ptr_cap);\n return key;\n };\n window.JS_Insert_Shell = exports.JS_Insert_Shell = JS_Insert_Shell = function JS_Insert_Shell(points, indexes) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var key = _GS_Insert_Shell(ptr_pos, pcount / 3, ptr_ind, icount);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n return key;\n };\n window.JS_Edit_Shell = exports.JS_Edit_Shell = JS_Edit_Shell = function JS_Edit_Shell(key, points, indexes) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n _GS_Edit_Shell(key, ptr_pos, pcount / 3, ptr_ind, icount);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n };\n window.JS_Insert_Triangular_Shell = exports.JS_Insert_Triangular_Shell = JS_Insert_Triangular_Shell = function JS_Insert_Triangular_Shell(points, indexes) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var key = _GS_Insert_Triangular_Shell(ptr_pos, pcount / 3, ptr_ind, icount);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n return key;\n };\n window.JS_Show_Shell_Size = exports.JS_Show_Shell_Size = JS_Show_Shell_Size = function JS_Show_Shell_Size(key) {\n var ptr_pos_count = Module._malloc(4);\n var ptr_face_count = Module._malloc(4);\n _GS_Show_Shell_Size(key, ptr_pos_count, ptr_face_count);\n var pos_count = Module.HEAP32[ptr_pos_count / 4];\n var face_count = Module.HEAP32[ptr_face_count / 4];\n Module._free(ptr_pos_count);\n Module._free(ptr_face_count);\n return {\n pos: pos_count,\n face: face_count\n };\n };\n window.JS_Show_Shell = exports.JS_Show_Shell = JS_Show_Shell = function JS_Show_Shell(key) {\n var ptr_pos_count = Module._malloc(4);\n var ptr_face_count = Module._malloc(4);\n _GS_Show_Shell_Size(key, ptr_pos_count, ptr_face_count);\n var pos_count = Module.HEAP32[ptr_pos_count / 4];\n var face_count = Module.HEAP32[ptr_face_count / 4];\n var ptr_pos = Module._malloc(4 * pos_count * 3);\n var ptr_face = Module._malloc(4 * face_count);\n _GS_Show_Shell(key, ptr_pos_count, ptr_pos, ptr_face_count, ptr_face);\n var pos = new Float32Array(pos_count * 3);\n var face = new Int32Array(face_count);\n for (var i = 0; i < pos_count; i++) {\n pos[i * 3] = Module.HEAPF32[ptr_pos / 4 + i * 3];\n pos[i * 3 + 1] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 1];\n pos[i * 3 + 2] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 2];\n }\n for (var i = 0; i < face_count; i++) {\n face[i] = Module.HEAP32[ptr_face / 4 + i];\n }\n Module._free(ptr_pos_count);\n Module._free(ptr_face_count);\n Module._free(ptr_pos);\n Module._free(ptr_face);\n return {\n pos: pos,\n face: face\n };\n };\n window.JS_Insert_Mesh = exports.JS_Insert_Mesh = JS_Insert_Mesh = function JS_Insert_Mesh(row, col, points) {\n var pcount = row * col * 3;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var key = _GS_Insert_Mesh(row, col, ptr_pos);\n Module._free(ptr_pos);\n return key;\n };\n window.JS_Edit_Mesh_Points = exports.JS_Edit_Mesh_Points = JS_Edit_Mesh_Points = function JS_Edit_Mesh_Points(key, points) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n _GS_Edit_Mesh_Points(key, ptr_pos);\n Module._free(ptr_pos);\n return key;\n };\n window.JS_Show_Mesh_Size = exports.JS_Show_Mesh_Size = JS_Show_Mesh_Size = function JS_Show_Mesh_Size(key) {\n var ptr_row_count = Module._malloc(4);\n var ptr_col_count = Module._malloc(4);\n _GS_Show_Mesh_Size(key, ptr_row_count, ptr_col_count);\n var row_count = Module.HEAP32[ptr_row_count / 4];\n var col_count = Module.HEAP32[ptr_col_count / 4];\n Module._free(ptr_row_count);\n Module._free(ptr_col_count);\n return {\n row: row_count,\n col: col_count\n };\n };\n window.JS_Show_Mesh = exports.JS_Show_Mesh = JS_Show_Mesh = function JS_Show_Mesh(key) {\n var ptr_row_count = Module._malloc(4);\n var ptr_col_count = Module._malloc(4);\n _GS_Show_Mesh_Size(key, ptr_row_count, ptr_col_count);\n var row = Module.HEAP32[ptr_row_count / 4];\n var col = Module.HEAP32[ptr_col_count / 4];\n var count = row * col * 3;\n var ptr_pos = Module._malloc(4 * row * col * 3);\n _GS_Show_Mesh(key, ptr_row_count, ptr_col_count, ptr_pos);\n var pos = new Float32Array(row * col * 3);\n for (var i = 0; i < count; i++) {\n pos[i] = Module.HEAPF32[ptr_pos / 4 + i];\n }\n Module._free(ptr_row_count);\n Module._free(ptr_col_count);\n Module._free(ptr_pos);\n return pos;\n };\n window.JS_Insert_Vector_Text = exports.JS_Insert_Vector_Text = JS_Insert_Vector_Text = function JS_Insert_Vector_Text(text, position, x_axis, y_axis, fonts) {\n var ptr_text = allocateUTF8(text);\n var ptr_fonts = null;\n if (fonts) {\n ptr_fonts = allocateUTF8(fonts);\n }\n var ptr_pos = Module._malloc(4 * 3);\n Module.HEAPF32.set(position, ptr_pos / 4);\n var ptr_x = Module._malloc(4 * 3);\n Module.HEAPF32.set(x_axis, ptr_x / 4);\n var ptr_y = Module._malloc(4 * 3);\n Module.HEAPF32.set(y_axis, ptr_y / 4);\n var key = _GS_Insert_Vector_Text(ptr_text, ptr_pos, ptr_x, ptr_y, ptr_fonts);\n Module._free(ptr_pos);\n Module._free(ptr_x);\n Module._free(ptr_y);\n _free(ptr_text);\n if (fonts) {\n _free(ptr_fonts);\n }\n return key;\n };\n window.JS_Insert_Parametric_Geometry = exports.JS_Insert_Parametric_Geometry = JS_Insert_Parametric_Geometry = function JS_Insert_Parametric_Geometry(type, params) {\n var ptr_type = allocateUTF8(type);\n var ptr_params = Module._malloc(8 * params.length);\n Module.HEAPF64.set(params, ptr_params / 8);\n var key = _GS_Insert_Parametric_Geometry(ptr_type, ptr_params, params.length);\n Module._free(ptr_params);\n _free(ptr_type);\n return key;\n };\n window.JS_Edit_Parametric_Geometry = exports.JS_Edit_Parametric_Geometry = JS_Edit_Parametric_Geometry = function JS_Edit_Parametric_Geometry(key, type, params) {\n var ptr_type = allocateUTF8(type);\n var ptr_params = Module._malloc(8 * params.length);\n Module.HEAPF64.set(params, ptr_params / 8);\n _GS_Edit_Parametric_Geometry(key, ptr_type, ptr_params, params.length);\n Module._free(ptr_params);\n _free(ptr_type);\n return key;\n };\n window.JS_Show_Parametric_Geometry = exports.JS_Show_Parametric_Geometry = JS_Show_Parametric_Geometry = function JS_Show_Parametric_Geometry(key) {\n var ptr_type = Module._malloc(8);\n var ptr_params = Module._malloc(8 * 1024);\n var ptr_count = Module._malloc(4);\n _GS_Show_Parametric_Geometry(key, ptr_type, ptr_params, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var type = UTF8ToString(ptr_type);\n var params = new Float64Array(count);\n params.set(Module.HEAPF64.subarray(ptr_params / 8, ptr_params / 8 + count));\n Module._free(ptr_count);\n Module._free(ptr_params);\n Module._free(ptr_type);\n return {\n type: type,\n params: params\n };\n };\n window.JS_Insert_Parametric_Geometries = exports.JS_Insert_Parametric_Geometries = JS_Insert_Parametric_Geometries = function JS_Insert_Parametric_Geometries(type, params, geoCount) {\n var ptr_type = allocateUTF8(type);\n var ptr_params = Module._malloc(8 * params.length);\n Module.HEAPF64.set(params, ptr_params / 8);\n var key = _GS_Insert_Parametric_Geometries(ptr_type, ptr_params, params.length, geoCount);\n Module._free(ptr_params);\n _free(ptr_type);\n return key;\n };\n window.JS_Insert_Light = exports.JS_Insert_Light = JS_Insert_Light = _GS_Insert_Light;\n window.JS_Edit_Light = exports.JS_Edit_Light = JS_Edit_Light = _GS_Edit_Light;\n window.JS_Show_Light = exports.JS_Show_Light = JS_Show_Light = function JS_Show_Light(key) {\n var ptr_x = Module._malloc(4);\n var ptr_y = Module._malloc(4);\n var ptr_z = Module._malloc(4);\n var ptr_b = Module._malloc(4);\n _GS_Show_Light(key, ptr_x, ptr_y, ptr_z, ptr_b);\n var pos = new Float32Array(3);\n pos[0] = Module.HEAPF32[ptr_x / 4];\n pos[1] = Module.HEAPF32[ptr_y / 4];\n pos[2] = Module.HEAPF32[ptr_z / 4];\n var camera_relative = Module.HEAP32[ptr_b / 4];\n Module._free(ptr_x);\n Module._free(ptr_y);\n Module._free(ptr_z);\n Module._free(ptr_b);\n return {\n pos: pos,\n camera_relative: camera_relative == 0 ? false : true\n };\n };\n window.JS_Insert_Image = exports.JS_Insert_Image = JS_Insert_Image = function JS_Insert_Image(x, y, z, width, height, data, options) {\n var ptr_data = null;\n if (data) {\n ptr_data = Module._malloc(data.byteLength);\n var array = new Uint8Array(data);\n Module.HEAP8.set(array, ptr_data);\n } else {\n ptr_data = Module._malloc(4);\n Module.HEAP32[ptr_data / 4] = 0;\n }\n var ptr_options = allocateUTF8(options);\n var key = _GS_Insert_Image(x, y, z, width, height, ptr_data, ptr_options);\n Module._free(ptr_data);\n _free(ptr_options);\n return key;\n };\n window.JS_Set_Image_Options = exports.JS_Set_Image_Options = JS_Set_Image_Options = function JS_Set_Image_Options(key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Set_Image_Options(key, ptr_options);\n _free(ptr_options);\n };\n window.JS_UnSet_One_Image_Option = exports.JS_UnSet_One_Image_Option = JS_UnSet_One_Image_Option = function JS_UnSet_One_Image_Option(key, name) {\n var ptr_name = allocateUTF8(name);\n _GS_UnSet_One_Image_Option(key, ptr_name);\n _free(ptr_name);\n };\n window.JS_Show_Image_Position = exports.JS_Show_Image_Position = JS_Show_Image_Position = function JS_Show_Image_Position(key) {\n var ptr_x = Module._malloc(4);\n var ptr_y = Module._malloc(4);\n var ptr_z = Module._malloc(4);\n _GS_Show_Image_Position(key, ptr_x, ptr_y, ptr_z);\n var pos = new Float32Array(3);\n pos[0] = Module.HEAPF32[ptr_x / 4];\n pos[1] = Module.HEAPF32[ptr_y / 4];\n pos[2] = Module.HEAPF32[ptr_z / 4];\n Module._free(ptr_x);\n Module._free(ptr_y);\n Module._free(ptr_z);\n return pos;\n };\n window.JS_Show_Image_Size = exports.JS_Show_Image_Size = JS_Show_Image_Size = function JS_Show_Image_Size(key) {\n var ptr_width = Module._malloc(4);\n var ptr_height = Module._malloc(4);\n _GS_Show_Image_Size(key, ptr_width, ptr_height);\n var width = Module.HEAP32[ptr_width / 4];\n var height = Module.HEAP32[ptr_height / 4];\n Module._free(ptr_width);\n Module._free(ptr_height);\n return {\n width: width,\n height: height\n };\n };\n window.JS_Show_Image_Data = exports.JS_Show_Image_Data = JS_Show_Image_Data = function JS_Show_Image_Data(key) {\n var ptr_size = Module._malloc(4);\n _GS_Show_Image_Data_Size(key, ptr_size);\n var size = Module.HEAP32[ptr_size / 4];\n Module._free(ptr_size);\n var ptr_data = Module._malloc(size);\n _GS_Show_Image_Data(key, ptr_data);\n var buffer = new ArrayBuffer(size);\n var data = new Uint8Array(buffer);\n data.set(Module.HEAP8.subarray(ptr_data, ptr_data + size));\n Module._free(ptr_data);\n return data;\n };\n window.JS_Show_Image_Options = exports.JS_Show_Image_Options = JS_Show_Image_Options = function JS_Show_Image_Options(key) {\n var ptr_options = Module._malloc(512);\n _GS_Show_Image_Options(key, ptr_options);\n var options = UTF8ToString(ptr_options);\n Module._free(ptr_options);\n return options;\n };\n window.JS_Show_One_Image_Option = exports.JS_Show_One_Image_Option = JS_Show_One_Image_Option = function JS_Show_One_Image_Option(key, name) {\n var ptr_name = allocateUTF8(name);\n var ptr_option = Module._malloc(512);\n _GS_Show_One_Image_Option(key, ptr_name, ptr_option);\n var option = UTF8ToString(ptr_option);\n _free(ptr_name);\n Module._free(ptr_option);\n return option;\n };\n window.JS_Insert_Cutting_Planes = exports.JS_Insert_Cutting_Planes = JS_Insert_Cutting_Planes = function JS_Insert_Cutting_Planes(planes) {\n var ptr_planes = Module._malloc(4 * planes.length * 3);\n for (var i = 0; i < planes.length; i++) {\n Module.HEAPF32[ptr_planes / 4 + i] = planes[i];\n }\n var key = _GS_Insert_Cutting_Planes(ptr_planes, planes.length / 12);\n Module._free(ptr_planes);\n return key;\n };\n window.JS_Edit_Cutting_Planes = exports.JS_Edit_Cutting_Planes = JS_Edit_Cutting_Planes = function JS_Edit_Cutting_Planes(key, planes) {\n var ptr_planes = Module._malloc(4 * planes.length * 3);\n for (var i = 0; i < planes.length; i++) {\n Module.HEAPF32[ptr_planes / 4 + i] = planes[i];\n }\n _GS_Edit_Cutting_Planes(key, ptr_planes, planes.length / 12);\n Module._free(ptr_planes);\n };\n window.JS_Show_Cutting_Planes = exports.JS_Show_Cutting_Planes = JS_Show_Cutting_Planes = function JS_Show_Cutting_Planes(key) {\n var ptr_planes = Module._malloc(4 * 6 * 3 * 4);\n var ptr_count = Module._malloc(4);\n _GS_Show_Cutting_Planes(key, ptr_planes, ptr_count);\n var count = Module.HEAP32[ptr_count / 4] * 4 * 3;\n var planes = new Float32Array(count);\n for (var i = 0; i < count; i++) {\n planes[i] = Module.HEAPF32[ptr_planes / 4 + i];\n }\n Module._free(ptr_count);\n Module._free(ptr_planes);\n return planes;\n };\n window.JS_Show_Geometry_Vertices_Position_By_Indexes = exports.JS_Show_Geometry_Vertices_Position_By_Indexes = JS_Show_Geometry_Vertices_Position_By_Indexes = function JS_Show_Geometry_Vertices_Position_By_Indexes(key, indexes) {\n var icount = indexes.length;\n var ptr_idx = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_idx / 4 + i] = indexes[i];\n }\n var pcount = icount * 3;\n var ptr_pos = Module._malloc(4 * pcount);\n _GS_Show_Geometry_Vertices_Position_By_Indexes(key, ptr_idx, icount, ptr_pos);\n var positions = new Float32Array(pcount);\n for (var i = 0; i < pcount; i++) {\n positions[i] = Module.HEAPF32[ptr_pos / 4 + i];\n }\n Module._free(ptr_idx);\n Module._free(ptr_pos);\n return positions;\n };\n window.JS_Show_Geometry_Element_Type = exports.JS_Show_Geometry_Element_Type = JS_Show_Geometry_Element_Type = function JS_Show_Geometry_Element_Type(key, element_type, indexes) {\n if (element_type == ElementType.ELEMENT_TYPE_Vertex) {\n var ptr_idx = Module._malloc(4);\n Module.HEAP32[ptr_idx / 4] = indexes[0];\n var ptr_type = Module._malloc(4);\n _GS_Show_Geometry_Element_Type(key, element_type, ptr_idx, ptr_type);\n var type = Module.HEAP32[ptr_type / 4];\n Module._free(ptr_idx);\n Module._free(ptr_type);\n return type;\n } else if (element_type == ElementType.ELEMENT_TYPE_Edge) {\n var ptr_idx = Module._malloc(4 * 2);\n Module.HEAP32[ptr_idx / 4] = indexes[0];\n Module.HEAP32[ptr_idx / 4 + 1] = indexes[1];\n var ptr_type = Module._malloc(4);\n _GS_Show_Geometry_Element_Type(key, element_type, ptr_idx, ptr_type);\n var type = Module.HEAP32[ptr_type / 4];\n Module._free(ptr_idx);\n Module._free(ptr_type);\n return type;\n }\n };\n window.JS_Set_Geometry_Texture_Coords = exports.JS_Set_Geometry_Texture_Coords = JS_Set_Geometry_Texture_Coords = function JS_Set_Geometry_Texture_Coords(key, offset, count, value) {\n var pcount = value.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = value[i];\n }\n _GS_Set_Geometry_Texture_Coords(key, offset, count, ptr_pos);\n Module._free(ptr_pos);\n };\n window.JS_Show_Geometry_Texture_Dimension = exports.JS_Show_Geometry_Texture_Dimension = JS_Show_Geometry_Texture_Dimension = function JS_Show_Geometry_Texture_Dimension(key) {\n var ptr_dim = Module._malloc(4);\n _GS_Show_Geometry_Texture_Dimension(key, ptr_dim);\n var dim = Module.HEAP32[ptr_dim / 4];\n Module._free(ptr_dim);\n return dim;\n };\n window.JS_Show_Geometry_Texture_Coords = exports.JS_Show_Geometry_Texture_Coords = JS_Show_Geometry_Texture_Coords = function JS_Show_Geometry_Texture_Coords(key, offset, count) {\n var len = count * 2;\n var ptr_coords = Module._malloc(4 * len);\n _GS_Show_Geometry_Texture_Coords(key, offset, count, ptr_coords);\n var coords = new Float32Array(len);\n for (var i = 0; i < len; i++) {\n coords[i] = Module.HEAPF32[ptr_coords / 4 + i];\n }\n Module._free(ptr_coords);\n return coords;\n };\n window.JS_UnSet_Geometry_Texture_Coords = exports.JS_UnSet_Geometry_Texture_Coords = JS_UnSet_Geometry_Texture_Coords = _GS_UnSet_Geometry_Texture_Coords;\n window.JS_Compute_Geometry_Texture_Coords = exports.JS_Compute_Geometry_Texture_Coords = JS_Compute_Geometry_Texture_Coords = function JS_Compute_Geometry_Texture_Coords(key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Compute_Geometry_Texture_Coords(key, ptr_options);\n _free(ptr_options);\n };\n window.JS_Set_Geometry_Normals = exports.JS_Set_Geometry_Normals = JS_Set_Geometry_Normals = function JS_Set_Geometry_Normals(key, offset, count, value) {\n var pcount = value.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = value[i];\n }\n _GS_Set_Geometry_Normals(key, offset, count, ptr_pos);\n Module._free(ptr_pos);\n };\n window.JS_Show_Geometry_Normals = exports.JS_Show_Geometry_Normals = JS_Show_Geometry_Normals = function JS_Show_Geometry_Normals(key, offset, count) {\n var ptr_normals = Module._malloc(4 * count * 3);\n _GS_Show_Geometry_Normals(key, offset, count, ptr_normals);\n var normals = new Float32Array(count * 3);\n for (var i = 0; i < count; i++) {\n normals[i * 3] = Module.HEAPF32[ptr_normals / 4 + i * 3];\n normals[i * 3 + 1] = Module.HEAPF32[ptr_normals / 4 + i * 3 + 1];\n normals[i * 3 + 2] = Module.HEAPF32[ptr_normals / 4 + i * 3 + 2];\n }\n Module._free(ptr_normals);\n return normals;\n };\n window.JS_UnSet_Geometry_Normals = exports.JS_UnSet_Geometry_Normals = JS_UnSet_Geometry_Normals = _GS_UnSet_Geometry_Normals;\n window.JS_Compute_Geometry_Data = exports.JS_Compute_Geometry_Data = JS_Compute_Geometry_Data = function JS_Compute_Geometry_Data(key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Compute_Geometry_Tessellate_Data(key, ptr_options);\n _free(ptr_options);\n };\n window.JS_Compute_Geometry_Tessellate_Data = exports.JS_Compute_Geometry_Tessellate_Data = JS_Compute_Geometry_Tessellate_Data = function JS_Compute_Geometry_Tessellate_Data(key, image_key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Compute_Geometry_Tessellate_Data(key, ptr_options);\n var ptr_pos_count = Module._malloc(4);\n var ptr_idx_count = Module._malloc(4);\n _GS_Show_Geometry_Tessellate_Data_Count(key, ptr_pos_count, ptr_idx_count);\n var pos_count = Module.HEAP32[ptr_pos_count / 4];\n var idx_count = Module.HEAP32[ptr_idx_count / 4];\n var ptr_pos = Module._malloc(4 * pos_count * 3);\n var ptr_idx = Module._malloc(4 * idx_count);\n var ptr_nor = Module._malloc(4 * pos_count * 3);\n var ptr_tex = Module._malloc(4 * pos_count * 2);\n _GS_Show_Geometry_Tessellate_Data(key, image_key, ptr_pos, ptr_idx, ptr_nor, ptr_tex);\n var pos = new Float32Array(pos_count * 3);\n var idx = new Int32Array(idx_count);\n var nor = new Float32Array(pos_count * 3);\n var tex = new Float32Array(pos_count * 2);\n for (var i = 0; i < pos_count; i++) {\n pos[i * 3] = Module.HEAPF32[ptr_pos / 4 + i * 3];\n pos[i * 3 + 1] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 1];\n pos[i * 3 + 2] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 2];\n }\n for (var i = 0; i < idx_count; i++) {\n idx[i] = Module.HEAP32[ptr_idx / 4 + i];\n }\n for (var i = 0; i < pos_count; i++) {\n nor[i * 3] = Module.HEAPF32[ptr_nor / 4 + i * 3];\n nor[i * 3 + 1] = Module.HEAPF32[ptr_nor / 4 + i * 3 + 1];\n nor[i * 3 + 2] = Module.HEAPF32[ptr_nor / 4 + i * 3 + 2];\n }\n for (var i = 0; i < pos_count; i++) {\n tex[i * 2] = Module.HEAPF32[ptr_tex / 4 + i * 2];\n tex[i * 2 + 1] = Module.HEAPF32[ptr_tex / 4 + i * 2 + 1];\n }\n Module._free(ptr_pos_count);\n Module._free(ptr_idx_count);\n Module._free(ptr_pos);\n Module._free(ptr_idx);\n Module._free(ptr_nor);\n Module._free(ptr_tex);\n _free(ptr_options);\n _GS_Clear_Geometry_Tessellate_Data(key);\n return {\n positions: pos,\n indexes: idx,\n normals: nor,\n texcoords: tex\n };\n };\n window.JS_Merge_Shell = exports.JS_Merge_Shell = JS_Merge_Shell = function JS_Merge_Shell(key, from_key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Compute_Geometry_Texture_Coords(key, ptr_options);\n _free(ptr_options);\n };\n exports.JS_Set_Geometry_Normals = JS_Set_Geometry_Normals = function JS_Set_Geometry_Normals(key, offset, count, value) {\n var pcount = value.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = value[i];\n }\n _GS_Set_Geometry_Normals(key, offset, count, ptr_pos);\n Module._free(ptr_pos);\n };\n exports.JS_Show_Geometry_Normals = JS_Show_Geometry_Normals = function JS_Show_Geometry_Normals(key, offset, count) {\n var ptr_normals = Module._malloc(4 * count * 3);\n _GS_Show_Geometry_Normals(key, offset, count, ptr_normals);\n var normals = new Float32Array(count * 3);\n for (var i = 0; i < count; i++) {\n normals[i * 3] = Module.HEAPF32[ptr_normals / 4 + i * 3];\n normals[i * 3 + 1] = Module.HEAPF32[ptr_normals / 4 + i * 3 + 1];\n normals[i * 3 + 2] = Module.HEAPF32[ptr_normals / 4 + i * 3 + 2];\n }\n Module._free(ptr_normals);\n return normals;\n };\n exports.JS_UnSet_Geometry_Normals = JS_UnSet_Geometry_Normals = _GS_UnSet_Geometry_Normals;\n exports.JS_Compute_Geometry_Tessellate_Data = JS_Compute_Geometry_Tessellate_Data = function JS_Compute_Geometry_Tessellate_Data(key, image_key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Compute_Geometry_Tessellate_Data(key, ptr_options);\n var ptr_pos_count = Module._malloc(4);\n var ptr_idx_count = Module._malloc(4);\n _GS_Show_Geometry_Tessellate_Data_Count(key, ptr_pos_count, ptr_idx_count);\n var pos_count = Module.HEAP32[ptr_pos_count / 4];\n var idx_count = Module.HEAP32[ptr_idx_count / 4];\n var ptr_pos = Module._malloc(4 * pos_count * 3);\n var ptr_idx = Module._malloc(4 * idx_count);\n var ptr_nor = Module._malloc(4 * pos_count * 3);\n var ptr_tex = Module._malloc(4 * pos_count * 2);\n _GS_Show_Geometry_Tessellate_Data(key, image_key, ptr_pos, ptr_idx, ptr_nor, ptr_tex);\n var pos = new Float32Array(pos_count * 3);\n var idx = new Int32Array(idx_count);\n var nor = new Float32Array(pos_count * 3);\n var tex = new Float32Array(pos_count * 2);\n for (var i = 0; i < pos_count; i++) {\n pos[i * 3] = Module.HEAPF32[ptr_pos / 4 + i * 3];\n pos[i * 3 + 1] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 1];\n pos[i * 3 + 2] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 2];\n }\n for (var i = 0; i < idx_count; i++) {\n idx[i] = Module.HEAP32[ptr_idx / 4 + i];\n }\n for (var i = 0; i < pos_count; i++) {\n nor[i * 3] = Module.HEAPF32[ptr_nor / 4 + i * 3];\n nor[i * 3 + 1] = Module.HEAPF32[ptr_nor / 4 + i * 3 + 1];\n nor[i * 3 + 2] = Module.HEAPF32[ptr_nor / 4 + i * 3 + 2];\n }\n for (var i = 0; i < pos_count; i++) {\n tex[i * 2] = Module.HEAPF32[ptr_tex / 4 + i * 2];\n tex[i * 2 + 1] = Module.HEAPF32[ptr_tex / 4 + i * 2 + 1];\n }\n Module._free(ptr_pos_count);\n Module._free(ptr_idx_count);\n Module._free(ptr_pos);\n Module._free(ptr_idx);\n Module._free(ptr_nor);\n Module._free(ptr_tex);\n _free(ptr_options);\n _GS_Clear_Geometry_Tessellate_Data(key);\n return {\n positions: pos,\n indexes: idx,\n normals: nor,\n texcoords: tex\n };\n };\n exports.JS_Merge_Shell = JS_Merge_Shell = function JS_Merge_Shell(key, from_key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Merge_Shell(key, from_key, ptr_options);\n _free(ptr_options);\n };\n window.JS_Extrude_By_Shell = exports.JS_Extrude_By_Shell = JS_Extrude_By_Shell = function JS_Extrude_By_Shell(points, indexes, normal, options) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var ptr_normal = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_normal / 4] = normal[0];\n Module.HEAPF32[ptr_normal / 4 + 1] = normal[1];\n Module.HEAPF32[ptr_normal / 4 + 2] = normal[2];\n var ptr_options = allocateUTF8(options);\n var key = _GS_Extrude_By_Shell(ptr_pos, pcount / 3, ptr_ind, icount, ptr_normal, ptr_options);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n Module._free(ptr_normal);\n _free(ptr_options);\n return key;\n };\n window.JS_DExtrude_By_Shell = exports.JS_DExtrude_By_Shell = JS_DExtrude_By_Shell = function JS_DExtrude_By_Shell(points, indexes, normal, options) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(8 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF64[ptr_pos / 8 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var ptr_normal = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_normal / 8] = normal[0];\n Module.HEAPF64[ptr_normal / 8 + 1] = normal[1];\n Module.HEAPF64[ptr_normal / 8 + 2] = normal[2];\n var ptr_options = allocateUTF8(options);\n var key = _GS_DExtrude_By_Shell(ptr_pos, pcount / 3, ptr_ind, icount, ptr_normal, ptr_options);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n Module._free(ptr_normal);\n _free(ptr_options);\n return key;\n };\n window.JS_Rotate_By_Shell = exports.JS_Rotate_By_Shell = JS_Rotate_By_Shell = function JS_Rotate_By_Shell(points, indexes, origin, normal, options) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var ptr_origin = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_origin / 4] = origin[0];\n Module.HEAPF32[ptr_origin / 4 + 1] = origin[1];\n Module.HEAPF32[ptr_origin / 4 + 2] = origin[2];\n var ptr_normal = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_normal / 4] = normal[0];\n Module.HEAPF32[ptr_normal / 4 + 1] = normal[1];\n Module.HEAPF32[ptr_normal / 4 + 2] = normal[2];\n var ptr_options = allocateUTF8(options);\n var key = _GS_Rotate_By_Shell(ptr_pos, pcount / 3, ptr_ind, icount, ptr_origin, ptr_normal, ptr_options);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n Module._free(ptr_origin);\n Module._free(ptr_normal);\n _free(ptr_options);\n return key;\n };\n window.JS_DRotate_By_Shell = exports.JS_DRotate_By_Shell = JS_DRotate_By_Shell = function JS_DRotate_By_Shell(points, indexes, origin, normal, options) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(8 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 8 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var ptr_origin = Module._malloc(8 * 3);\n Module.HEAPF32[ptr_origin / 8] = origin[0];\n Module.HEAPF32[ptr_origin / 8 + 1] = origin[1];\n Module.HEAPF32[ptr_origin / 8 + 2] = origin[2];\n var ptr_normal = Module._malloc(8 * 3);\n Module.HEAPF32[ptr_normal / 8] = normal[0];\n Module.HEAPF32[ptr_normal / 8 + 1] = normal[1];\n Module.HEAPF32[ptr_normal / 8 + 2] = normal[2];\n var ptr_options = allocateUTF8(options);\n var key = _GS_DRotate_By_Shell(ptr_pos, pcount / 3, ptr_ind, icount, ptr_origin, ptr_normal, ptr_options);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n Module._free(ptr_origin);\n Module._free(ptr_normal);\n _free(ptr_options);\n return key;\n };\n window.JS_Sweep_By_Shell = exports.JS_Sweep_By_Shell = JS_Sweep_By_Shell = function JS_Sweep_By_Shell(points, indexes, path, options) {\n var ptr_points = Module._malloc(4 * points.length);\n Module.HEAPF32.set(points, ptr_points / 4);\n var ptr_indexes = Module._malloc(4 * indexes.length);\n Module.HEAP32.set(indexes, ptr_indexes / 4);\n var ptr_path = Module._malloc(4 * path.length);\n Module.HEAPF32.set(path, ptr_path / 4);\n var ptr_options = allocateUTF8(options);\n var key = _GS_Sweep_By_Shell(ptr_points, points.length / 3, ptr_indexes, indexes.length, ptr_path, path.length / 3, ptr_options);\n Module._free(ptr_points);\n Module._free(ptr_indexes);\n Module._free(ptr_path);\n _free(ptr_options);\n return key;\n };\n window.JS_DSweep_By_Shell = exports.JS_DSweep_By_Shell = JS_DSweep_By_Shell = function JS_DSweep_By_Shell(points, indexes, path, options) {\n var ptr_points = Module._malloc(8 * points.length);\n Module.HEAPF64.set(points, ptr_points / 8);\n var ptr_indexes = Module._malloc(4 * indexes.length);\n Module.HEAP32.set(indexes, ptr_indexes / 4);\n var ptr_path = Module._malloc(8 * path.length);\n Module.HEAPF64.set(path, ptr_path / 8);\n var ptr_options = allocateUTF8(options);\n var key = _GS_DSweep_By_Shell(ptr_points, points.length / 3, ptr_indexes, indexes.length, ptr_path, path.length / 3, ptr_options);\n Module._free(ptr_points);\n Module._free(ptr_indexes);\n Module._free(ptr_path);\n _free(ptr_options);\n return key;\n };\n window.JS_Compute_Ray_Test = exports.JS_Compute_Ray_Test = JS_Compute_Ray_Test = function JS_Compute_Ray_Test(view_key, origin, direct) {\n var ptr_origin = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_origin / 4] = origin[0];\n Module.HEAPF32[ptr_origin / 4 + 1] = origin[1];\n Module.HEAPF32[ptr_origin / 4 + 2] = origin[2];\n var ptr_direct = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_direct / 4] = direct[0];\n Module.HEAPF32[ptr_direct / 4 + 1] = direct[1];\n Module.HEAPF32[ptr_direct / 4 + 2] = direct[2];\n var ptr_position = Module._malloc(4 * 3);\n var position = null;\n if (_GS_Compute_Ray_Test(view_key, ptr_origin, ptr_direct, ptr_position)) {\n position = new Float32Array(3);\n position[0] = Module.HEAPF32[ptr_position / 4];\n position[1] = Module.HEAPF32[ptr_position / 4 + 1];\n position[2] = Module.HEAPF32[ptr_position / 4 + 2];\n }\n Module._free(ptr_origin);\n Module._free(ptr_direct);\n Module._free(ptr_position);\n return position;\n };\n window.JS_Compute_Geometry_Ray_Test = exports.JS_Compute_Geometry_Ray_Test = JS_Compute_Geometry_Ray_Test = function JS_Compute_Geometry_Ray_Test(view_key, geom_key, origin, direct) {\n var ptr_origin = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_origin / 4] = origin[0];\n Module.HEAPF32[ptr_origin / 4 + 1] = origin[1];\n Module.HEAPF32[ptr_origin / 4 + 2] = origin[2];\n var ptr_direct = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_direct / 4] = direct[0];\n Module.HEAPF32[ptr_direct / 4 + 1] = direct[1];\n Module.HEAPF32[ptr_direct / 4 + 2] = direct[2];\n var ptr_position = Module._malloc(4 * 3);\n var position = null;\n if (_GS_Compute_Geometry_Ray_Test(view_key, geom_key, ptr_origin, ptr_direct, ptr_position)) {\n position = new Float32Array(3);\n position[0] = Module.HEAPF32[ptr_position / 4];\n position[1] = Module.HEAPF32[ptr_position / 4 + 1];\n position[2] = Module.HEAPF32[ptr_position / 4 + 2];\n }\n Module._free(ptr_origin);\n Module._free(ptr_direct);\n Module._free(ptr_position);\n return position;\n };\n window.JS_Compute_Box_Test = exports.JS_Compute_Box_Test = JS_Compute_Box_Test = function JS_Compute_Box_Test(view_key, bb) {\n var ptr_bb = Module._malloc(4 * 6);\n Module.HEAPF32.set(bb, ptr_bb / 4);\n var ptr_result = Module._malloc(4 * 6);\n var result = null;\n if (_GS_Compute_Box_Test(view_key, ptr_bb, ptr_result)) {\n result = new Float32Array(6);\n result.set(Module.HEAPF32.subarray(ptr_result / 4, ptr_result / 4 + 6));\n }\n Module._free(ptr_bb);\n Module._free(ptr_result);\n return result;\n };\n window.JS_Compute_Polygon_Area = exports.JS_Compute_Polygon_Area = JS_Compute_Polygon_Area = function JS_Compute_Polygon_Area(points) {\n var ptr_points = Module._malloc(8 * points.length);\n Module.HEAPF64.set(points, ptr_points / 8);\n var ptr_area = Module._malloc(8);\n _GS_Compute_Polygon_Area(ptr_points, points.length / 3, ptr_area);\n var area = Module.HEAPF64[ptr_area / 8];\n Module._free(ptr_points);\n Module._free(ptr_area);\n return area;\n };\n window.JS_Compute_Area = exports.JS_Compute_Area = JS_Compute_Area = function JS_Compute_Area(key) {\n var ptr_area = Module._malloc(8);\n _GS_Compute_Area(key, ptr_area);\n var area = Module.HEAPF64[ptr_area / 8];\n Module._free(ptr_area);\n return area;\n };\n window.JS_Compute_Volume = exports.JS_Compute_Volume = JS_Compute_Volume = function JS_Compute_Volume(key) {\n var ptr_volume = Module._malloc(8);\n _GS_Compute_Volume(key, ptr_volume);\n var volume = Module.HEAPF64[ptr_volume / 8];\n Module._free(ptr_volume);\n return volume;\n };\n window.JS_Is_Solid_Geometry = exports.JS_Is_Solid_Geometry = JS_Is_Solid_Geometry = _GS_Is_Solid_Geometry;\n window.JS_Compute_Geometry_Distance = exports.JS_Compute_Geometry_Distance = JS_Compute_Geometry_Distance = function JS_Compute_Geometry_Distance(geomKey1, geomKey2, path1, path2) {\n var ptr_dist = Module._malloc(4 * 7);\n var ptr_path1 = null;\n var path1_len = 0;\n if (path1) {\n ptr_path1 = Module._malloc(4 * path1.length);\n Module.HEAP32.set(path1, ptr_path1 / 4);\n path1_len = path1.length;\n }\n var ptr_path2 = null;\n var path2_len = 0;\n if (path2) {\n ptr_path2 = Module._malloc(4 * path2.length);\n Module.HEAP32.set(path2, ptr_path2 / 4);\n path2_len = path2.length;\n }\n _GS_Compute_Geometry_Distance(geomKey1, geomKey2, ptr_path1, path1_len, ptr_path2, path2_len, ptr_dist);\n var result = new Float32Array(7);\n result[0] = Module.HEAPF32[ptr_dist / 4];\n result[1] = Module.HEAPF32[ptr_dist / 4 + 1];\n result[2] = Module.HEAPF32[ptr_dist / 4 + 2];\n result[3] = Module.HEAPF32[ptr_dist / 4 + 3];\n result[4] = Module.HEAPF32[ptr_dist / 4 + 4];\n result[5] = Module.HEAPF32[ptr_dist / 4 + 5];\n result[6] = Module.HEAPF32[ptr_dist / 4 + 6];\n Module._free(ptr_dist);\n Module._free(ptr_path1);\n Module._free(ptr_path2);\n return result;\n };\n window.JS_Segment_To_Stream = exports.JS_Segment_To_Stream = JS_Segment_To_Stream = function JS_Segment_To_Stream() {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Segment_To_Stream(ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n Module._free(loca);\n Module._free(ptr_data);\n Module._free(ptr_size);\n return buffer;\n };\n window.JS_Segment_To_Stream_By_Key = exports.JS_Segment_To_Stream_By_Key = JS_Segment_To_Stream_By_Key = function JS_Segment_To_Stream_By_Key(key) {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Segment_To_Stream_By_Key(key, ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n return buffer;\n };\n window.JS_Segment_To_Stream_With_Compression = exports.JS_Segment_To_Stream_With_Compression = JS_Segment_To_Stream_With_Compression = function JS_Segment_To_Stream_With_Compression() {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Segment_To_Stream_With_Compression(ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n Module._free(loca);\n Module._free(ptr_data);\n Module._free(ptr_size);\n return buffer;\n };\n window.JS_Segment_To_Stream_With_Compression_By_Key = exports.JS_Segment_To_Stream_With_Compression_By_Key = JS_Segment_To_Stream_With_Compression_By_Key = function JS_Segment_To_Stream_With_Compression_By_Key(key) {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Segment_To_Stream_With_Compression_By_Key(key, ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n return buffer;\n };\n window.JS_Stream_To_Segment_By_Key = exports.JS_Stream_To_Segment_By_Key = JS_Stream_To_Segment_By_Key = function JS_Stream_To_Segment_By_Key(data, owner_key) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n var key = _GS_Stream_To_Segment_By_Key(ptr_data, data.byteLength, owner_key);\n Module._free(ptr_data);\n array = null;\n return key;\n };\n window.JS_Stream_To_Segment_By_Key_Tt = exports.JS_Stream_To_Segment_By_Key_Tt = JS_Stream_To_Segment_By_Key_Tt = function JS_Stream_To_Segment_By_Key_Tt(data, owner_key, no, view_key) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n var key = _GS_Stream_To_Segment_By_Key_Tt(ptr_data, data.byteLength, owner_key, no, view_key);\n Module._free(ptr_data);\n array = null;\n return key;\n };\n window.JS_Stream_With_Compression_To_Segment_By_Key = exports.JS_Stream_With_Compression_To_Segment_By_Key = JS_Stream_With_Compression_To_Segment_By_Key = function JS_Stream_With_Compression_To_Segment_By_Key(data, owner_key, options) {\n var ptr_data = Module._malloc(data.byteLength);\n var ptr_options = allocateUTF8(options);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n var key = _GS_Stream_With_Compression_To_Segment_By_Key(ptr_data, data.byteLength, owner_key, ptr_options);\n Module._free(ptr_data);\n _free(ptr_options);\n array = null;\n return key;\n };\n window.JS_Segment_Data_To_Stream = exports.JS_Segment_Data_To_Stream = JS_Segment_Data_To_Stream = function JS_Segment_Data_To_Stream() {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Segment_Data_To_Stream(ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n Module._free(loca);\n Module._free(ptr_data);\n Module._free(ptr_size);\n return buffer;\n };\n window.JS_Stream_To_Segment_Data = exports.JS_Stream_To_Segment_Data = JS_Stream_To_Segment_Data = function JS_Stream_To_Segment_Data(data) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n var key = _GS_Stream_To_Segment_Data(ptr_data, data.byteLength);\n Module._free(ptr_data);\n array = null;\n return key;\n };\n window.JS_Geometry_Data_To_Stream = exports.JS_Geometry_Data_To_Stream = JS_Geometry_Data_To_Stream = function JS_Geometry_Data_To_Stream() {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Geometry_Data_To_Stream(ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n Module._free(loca);\n Module._free(ptr_data);\n Module._free(ptr_size);\n return buffer;\n };\n window.JS_Geometry_Data_To_Stream_With_Compression = JS_Geometry_Data_To_Stream_With_Compression = function JS_Geometry_Data_To_Stream_With_Compression() {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Geometry_Data_To_Stream_With_Compression(ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n Module._free(loca);\n Module._free(ptr_data);\n Module._free(ptr_size);\n return buffer;\n };\n window.JS_Stream_To_Geometry_Data = exports.JS_Stream_To_Geometry_Data = JS_Stream_To_Geometry_Data = function JS_Stream_To_Geometry_Data(data) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Stream_To_Geometry_Data(ptr_data, data.byteLength);\n Module._free(ptr_data);\n array = null;\n };\n window.JS_Stream_To_Geometry_Data_By_Key = exports.JS_Stream_To_Geometry_Data_By_Key = JS_Stream_To_Geometry_Data_By_Key = function JS_Stream_To_Geometry_Data_By_Key(key, data) {\n if (data instanceof ArrayBuffer) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Key(key, ptr_data, data.byteLength);\n Module._free(ptr_data);\n array = null;\n } else if (data instanceof Uint8Array) {\n var ptr_data = Module._malloc(data.length);\n Module.HEAP8.set(data, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Key(key, ptr_data, data.length);\n Module._free(ptr_data);\n }\n };\n window.JS_Stream_To_Geometry_Data_By_Keys = exports.JS_Stream_To_Geometry_Data_By_Keys = JS_Stream_To_Geometry_Data_By_Keys = function JS_Stream_To_Geometry_Data_By_Keys(keys, data) {\n if (data instanceof ArrayBuffer) {\n var ptr_keys = Module._malloc(4 * keys.length);\n var ptr_data = Module._malloc(data.byteLength);\n Module.HEAP32.set(keys, ptr_keys / 4);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Keys(ptr_keys, keys.length, ptr_data, data.byteLength);\n Module._free(ptr_keys);\n Module._free(ptr_data);\n array = null;\n } else if (data instanceof Uint8Array) {\n var ptr_keys = Module._malloc(4 * keys.length);\n var ptr_data = Module._malloc(data.length);\n Module.HEAP32.set(keys, ptr_keys / 4);\n Module.HEAP8.set(data, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Keys(ptr_keys, keys.length, ptr_data, data.length);\n Module._free(ptr_keys);\n Module._free(ptr_data);\n }\n };\n window.JS_Stream_To_Geometry_Data_By_Keys_Tt = exports.JS_Stream_To_Geometry_Data_By_Keys_Tt = JS_Stream_To_Geometry_Data_By_Keys_Tt = function JS_Stream_To_Geometry_Data_By_Keys_Tt(keys, data, view_key) {\n if (data instanceof ArrayBuffer) {\n var ptr_keys = Module._malloc(4 * keys.length);\n var ptr_data = Module._malloc(data.byteLength);\n Module.HEAP32.set(keys, ptr_keys / 4);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Keys_Tt(ptr_keys, keys.length, ptr_data, data.byteLength, view_key);\n Module._free(ptr_keys);\n Module._free(ptr_data);\n array = null;\n } else if (data instanceof Uint8Array) {\n var ptr_keys = Module._malloc(4 * keys.length);\n var ptr_data = Module._malloc(data.length);\n Module.HEAP32.set(keys, ptr_keys / 4);\n Module.HEAP8.set(data, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Keys_Tt(ptr_keys, keys.length, ptr_data, data.length, view_key);\n Module._free(ptr_keys);\n Module._free(ptr_data);\n }\n };\n window.JS_Stream_To_Geometry_Data_With_Compression = exports.JS_Stream_To_Geometry_Data_With_Compression = JS_Stream_To_Geometry_Data_With_Compression = function JS_Stream_To_Geometry_Data_With_Compression(data) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Stream_To_Geometry_Data_With_Compression(ptr_data, data.byteLength);\n Module._free(ptr_data);\n array = null;\n };\n window.JS_Copy_Segment_By_Key = exports.JS_Copy_Segment_By_Key = JS_Copy_Segment_By_Key = _GS_Copy_Segment_By_Key;\n window.JS_Show_Database_Info = exports.JS_Show_Database_Info = JS_Show_Database_Info = function JS_Show_Database_Info(key) {\n var ptr_info = Module._malloc(512);\n _GS_Show_Database_Info(key, ptr_info);\n var info = UTF8ToString(ptr_info);\n Module._free(ptr_info);\n return info;\n };\n window.JS_Show_Allocated_Memory_Size = exports.JS_Show_Allocated_Memory_Size = JS_Show_Allocated_Memory_Size = _GS_Show_Allocated_Memory_Size;\n window.JS_Execute_Task_Post_Processing = exports.JS_Execute_Task_Post_Processing = JS_Execute_Task_Post_Processing = _GS_Execute_Task_Post_Processing;\n window.JS_Create_Texture = exports.JS_Create_Texture = JS_Create_Texture = function JS_Create_Texture(buffer) {\n _glGenTextures(1, buffer);\n if (window.GROWABLE_HEAP_I32) {\n return GL.textures[GROWABLE_HEAP_I32()[buffer >> 2]];\n } else {\n return GL.textures[HEAP32[buffer >> 2]];\n }\n };\n window.JS_Boolean_Intersection_Graph = exports.JS_Boolean_Intersection_Graph = JS_Boolean_Intersection_Graph = function JS_Boolean_Intersection_Graph(points, indexes, root, normal) {\n var result = null;\n var ptr_points = Module._malloc(8 * points.length);\n var ptr_indexes = Module._malloc(4 * indexes.length);\n var ptr_root = Module._malloc(8 * 3);\n var ptr_normal = Module._malloc(8 * 3);\n Module.HEAPF64.set(points, ptr_points / 8);\n Module.HEAP32.set(indexes, ptr_indexes / 4);\n Module.HEAPF64.set(root, ptr_root / 8);\n Module.HEAPF64.set(normal, ptr_normal / 8);\n var ptr_inter_points = Module._malloc(4);\n var ptr_inter_pos_count = Module._malloc(4);\n var ptr_inter_indexes = Module._malloc(4);\n var ptr_inter_idx_count = Module._malloc(4);\n if (_GS_Boolean_Intersection_Graph(ptr_points, ptr_indexes, indexes.length, ptr_root, ptr_normal, ptr_inter_points, ptr_inter_pos_count, ptr_inter_indexes, ptr_inter_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_inter_points / 4];\n var pos_size = Module.HEAP32[ptr_inter_pos_count / 4] * 3;\n var inter_points = new Float64Array(pos_size);\n inter_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_inter_indexes / 4];\n var idx_size = Module.HEAP32[ptr_inter_idx_count / 4];\n var inter_indexes = new Int32Array(idx_size);\n inter_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: inter_points,\n indexes: inter_indexes\n };\n }\n Module._free(ptr_inter_points);\n Module._free(ptr_inter_pos_count);\n Module._free(ptr_inter_indexes);\n Module._free(ptr_inter_idx_count);\n Module._free(ptr_points);\n Module._free(ptr_indexes);\n Module._free(ptr_root);\n Module._free(ptr_normal);\n return result;\n };\n window.JS_Boolean_Intersect_Polyline_Polygon_Xy = exports.JS_Boolean_Intersect_Polyline_Polygon_Xy = JS_Boolean_Intersect_Polyline_Polygon_Xy = function JS_Boolean_Intersect_Polyline_Polygon_Xy(polyline_points, polyline_indexes, tool_points, tool_indexes, result_points) {\n var result = null;\n var ptr_polyline_points = Module._malloc(8 * polyline_points.length);\n var ptr_polyline_indexes = Module._malloc(4 * polyline_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(polyline_points, ptr_polyline_points / 8);\n Module.HEAP32.set(polyline_indexes, ptr_polyline_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Intersect_Polyline_Polygon_Xy(ptr_polyline_points, ptr_polyline_indexes, polyline_indexes.length, ptr_tool_points, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_polyline_points);\n Module._free(ptr_polyline_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n window.JS_Boolean_Intersect_Polygon_Polygon_Xy = exports.JS_Boolean_Intersect_Polygon_Polygon_Xy = JS_Boolean_Intersect_Polygon_Polygon_Xy = function JS_Boolean_Intersect_Polygon_Polygon_Xy(polygon_points, polygon_indexes, tool_points, tool_indexes) {\n var result = null;\n var ptr_polygon_points = Module._malloc(8 * polygon_points.length);\n var ptr_polygon_indexes = Module._malloc(4 * polygon_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(polygon_points, ptr_polygon_points / 8);\n Module.HEAP32.set(polygon_indexes, ptr_polygon_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Intersect_Polygon_Polygon_Xy(ptr_polygon_points, ptr_polygon_indexes, polygon_indexes.length, ptr_tool_points, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_polygon_points);\n Module._free(ptr_polygon_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n window.JS_Boolean_Intersect_Graph_Polygon_Xy = exports.JS_Boolean_Intersect_Graph_Polygon_Xy = JS_Boolean_Intersect_Graph_Polygon_Xy = function JS_Boolean_Intersect_Graph_Polygon_Xy(graph_points, graph_indexes, tool_points, tool_indexes) {\n var result = null;\n var ptr_graph_points = Module._malloc(8 * graph_points.length);\n var ptr_graph_indexes = Module._malloc(4 * graph_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(graph_points, ptr_graph_points / 8);\n Module.HEAP32.set(graph_indexes, ptr_graph_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Intersect_Graph_Polygon_Xy(ptr_graph_points, ptr_graph_indexes, graph_indexes.length, ptr_tool_points, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_graph_points);\n Module._free(ptr_graph_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n window.JS_Boolean_Subtract_Polygon_Polygon_Xy = exports.JS_Boolean_Subtract_Polygon_Polygon_Xy = JS_Boolean_Subtract_Polygon_Polygon_Xy = function JS_Boolean_Subtract_Polygon_Polygon_Xy(polygon_points, polygon_indexes, tool_points, tool_indexes) {\n var result = null;\n var ptr_polygon_points = Module._malloc(8 * polygon_points.length);\n var ptr_polygon_indexes = Module._malloc(4 * polygon_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(polygon_points, ptr_polygon_points / 8);\n Module.HEAP32.set(polygon_indexes, ptr_polygon_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Subtract_Polygon_Polygon_Xy(ptr_polygon_points, ptr_polygon_indexes, polygon_indexes.length, ptr_tool_points, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_polygon_points);\n Module._free(ptr_polygon_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n window.JS_Boolean_Cut_Polygon_Polygon_Xy = exports.JS_Boolean_Cut_Polygon_Polygon_Xy = JS_Boolean_Cut_Polygon_Polygon_Xy = function JS_Boolean_Cut_Polygon_Polygon_Xy(polygon_points, polygon_indexes, tool_points, tool_indexes) {\n var result = null;\n var ptr_polygon_points = Module._malloc(8 * polygon_points.length);\n var ptr_polygon_indexes = Module._malloc(4 * polygon_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(polygon_points, ptr_polygon_points / 8);\n Module.HEAP32.set(polygon_indexes, ptr_polygon_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Cut_Polygon_Polygon_Xy(ptr_polygon_points, ptr_polygon_indexes, polygon_indexes.length, ptr_tool_points, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_polygon_points);\n Module._free(ptr_polygon_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n window.JS_Boolean_Subtract = exports.JS_Boolean_Subtract = JS_Boolean_Subtract = function JS_Boolean_Subtract(blank_points, blank_indexes, tool_points, tool_indexes) {\n var result = null;\n var ptr_blank_points = Module._malloc(8 * blank_points.length);\n var ptr_blank_indexes = Module._malloc(4 * blank_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(blank_points, ptr_blank_points / 8);\n Module.HEAP32.set(blank_indexes, ptr_blank_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Subtract(ptr_blank_points, blank_points.length / 3, ptr_blank_indexes, blank_indexes.length, ptr_tool_points, tool_points.length / 3, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_blank_points);\n Module._free(ptr_blank_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n }\n };\n exports.JS_Init_Apis = JS_Init_Apis;\n window.JS_Feature_Extrude = exports.JS_Feature_Extrude = JS_Feature_Extrude = function JS_Feature_Extrude(points, indexes, normal, options) {\n var result = null;\n var ptr_points = Module._malloc(8 * points.length);\n var ptr_indexes = Module._malloc(4 * indexes.length);\n var ptr_normal = Module._malloc(8 * 3);\n Module.HEAPF64.set(points, ptr_points / 8);\n Module.HEAP32.set(indexes, ptr_indexes / 4);\n Module.HEAPF64.set(normal, ptr_normal / 8);\n var ptr_options = null;\n if (options) {\n ptr_options = allocateUTF8(options);\n }\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Feature_Extrude(ptr_points, points.length / 3, ptr_indexes, indexes.length, ptr_normal, ptr_options, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_points);\n Module._free(ptr_indexes);\n Module._free(ptr_normal);\n if (ptr_options) {\n _free(ptr_options);\n }\n return result;\n };\n window.JS_Planar_Polyline_Offset = exports.JS_Planar_Polyline_Offset = JS_Planar_Polyline_Offset = function JS_Planar_Polyline_Offset(points, offset_value) {\n var result = new gs_collections_1.List();\n var ptr_points = Module._malloc(8 * points.length);\n Module.HEAPF64.set(points, ptr_points / 8);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n if (_GS_Planar_Polyline_Offset(ptr_points, points.length / 3, offset_value, ptr_res_points, ptr_res_pos_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n result = gs_math_1.DGeometryOperators.createPolylinesBySegments(res_points);\n Module._free(pos_loca);\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_points);\n return result;\n };\n var CameraChangeType;\n (function (CameraChangeType) {\n CameraChangeType[CameraChangeType[\"Translate\"] = 1] = \"Translate\";\n CameraChangeType[CameraChangeType[\"Rotate\"] = 2] = \"Rotate\";\n CameraChangeType[CameraChangeType[\"Scale\"] = 4] = \"Scale\";\n })(CameraChangeType = exports.CameraChangeType || (exports.CameraChangeType = {}));\n var ObjectType;\n (function (ObjectType) {\n ObjectType[ObjectType[\"TYPE_Unknown\"] = 0] = \"TYPE_Unknown\";\n ObjectType[ObjectType[\"TYPE_Segment\"] = 1] = \"TYPE_Segment\";\n ObjectType[ObjectType[\"TYPE_Include\"] = 2] = \"TYPE_Include\";\n ObjectType[ObjectType[\"TYPE_Style\"] = 3] = \"TYPE_Style\";\n ObjectType[ObjectType[\"TYPE_Driver\"] = 10] = \"TYPE_Driver\";\n ObjectType[ObjectType[\"TYPE_RenderContext\"] = 11] = \"TYPE_RenderContext\";\n ObjectType[ObjectType[\"TYPE_Color\"] = 12] = \"TYPE_Color\";\n ObjectType[ObjectType[\"TYPE_Shader\"] = 13] = \"TYPE_Shader\";\n ObjectType[ObjectType[\"TYPE_Viewport\"] = 14] = \"TYPE_Viewport\";\n ObjectType[ObjectType[\"TYPE_Camera\"] = 15] = \"TYPE_Camera\";\n ObjectType[ObjectType[\"TYPE_Visibility\"] = 16] = \"TYPE_Visibility\";\n ObjectType[ObjectType[\"TYPE_ModellingMatrix\"] = 17] = \"TYPE_ModellingMatrix\";\n ObjectType[ObjectType[\"TYPE_RenderingOptions\"] = 18] = \"TYPE_RenderingOptions\";\n ObjectType[ObjectType[\"TYPE_Condition\"] = 19] = \"TYPE_Condition\";\n ObjectType[ObjectType[\"TYPE_Selectability\"] = 20] = \"TYPE_Selectability\";\n ObjectType[ObjectType[\"TYPE_Font\"] = 21] = \"TYPE_Font\";\n ObjectType[ObjectType[\"TYPE_HeuristicOptions\"] = 22] = \"TYPE_HeuristicOptions\";\n ObjectType[ObjectType[\"TYPE_Marker\"] = 100] = \"TYPE_Marker\";\n ObjectType[ObjectType[\"TYPE_Line\"] = 101] = \"TYPE_Line\";\n ObjectType[ObjectType[\"TYPE_Polyline\"] = 102] = \"TYPE_Polyline\";\n ObjectType[ObjectType[\"TYPE_Circle\"] = 106] = \"TYPE_Circle\";\n ObjectType[ObjectType[\"TYPE_Shell\"] = 103] = \"TYPE_Shell\";\n ObjectType[ObjectType[\"TYPE_Mesh\"] = 104] = \"TYPE_Mesh\";\n ObjectType[ObjectType[\"TYPE_Cylinder\"] = 105] = \"TYPE_Cylinder\";\n ObjectType[ObjectType[\"TYPE_TriangularShell\"] = 107] = \"TYPE_TriangularShell\";\n ObjectType[ObjectType[\"TYPE_CuttingPlanes\"] = 109] = \"TYPE_CuttingPlanes\";\n ObjectType[ObjectType[\"TYPE_CircularArc\"] = 110] = \"TYPE_CircularArc\";\n ObjectType[ObjectType[\"TYPE_Ellipse\"] = 111] = \"TYPE_Ellipse\";\n ObjectType[ObjectType[\"TYPE_EllipseArc\"] = 112] = \"TYPE_EllipseArc\";\n ObjectType[ObjectType[\"TYPE_PolyCylinder\"] = 113] = \"TYPE_PolyCylinder\";\n ObjectType[ObjectType[\"TYPE_Light\"] = 120] = \"TYPE_Light\";\n ObjectType[ObjectType[\"TYPE_Image\"] = 121] = \"TYPE_Image\";\n ObjectType[ObjectType[\"TYPE_VectorText\"] = 122] = \"TYPE_VectorText\";\n ObjectType[ObjectType[\"TYPE_ParametricGeometry\"] = 123] = \"TYPE_ParametricGeometry\";\n ObjectType[ObjectType[\"TYPE_PointCloud\"] = 124] = \"TYPE_PointCloud\";\n })(ObjectType = exports.ObjectType || (exports.ObjectType = {}));\n var ElementType;\n (function (ElementType) {\n ElementType[ElementType[\"ELEMENT_TYPE_Unknown\"] = 0] = \"ELEMENT_TYPE_Unknown\";\n ElementType[ElementType[\"ELEMENT_TYPE_Vertex\"] = 1] = \"ELEMENT_TYPE_Vertex\";\n ElementType[ElementType[\"ELEMENT_TYPE_Edge\"] = 2] = \"ELEMENT_TYPE_Edge\";\n ElementType[ElementType[\"ELEMENT_TYPE_Marker\"] = 4] = \"ELEMENT_TYPE_Marker\";\n ElementType[ElementType[\"ELEMENT_TYPE_Line\"] = 8] = \"ELEMENT_TYPE_Line\";\n ElementType[ElementType[\"ELEMENT_TYPE_Face\"] = 16] = \"ELEMENT_TYPE_Face\";\n })(ElementType = exports.ElementType || (exports.ElementType = {}));\n var VertexType;\n (function (VertexType) {\n VertexType[VertexType[\"VERTEX_TYPE_None\"] = 0] = \"VERTEX_TYPE_None\";\n VertexType[VertexType[\"VERTEX_TYPE_Inner\"] = 1] = \"VERTEX_TYPE_Inner\";\n VertexType[VertexType[\"VERTEX_TYPE_Border\"] = 2] = \"VERTEX_TYPE_Border\";\n })(VertexType = exports.VertexType || (exports.VertexType = {}));\n var EdgeType;\n (function (EdgeType) {\n EdgeType[EdgeType[\"EDGE_TYPE_None\"] = 0] = \"EDGE_TYPE_None\";\n EdgeType[EdgeType[\"EDGE_TYPE_Inner\"] = 1] = \"EDGE_TYPE_Inner\";\n EdgeType[EdgeType[\"EDGE_TYPE_Border\"] = 2] = \"EDGE_TYPE_Border\";\n })(EdgeType = exports.EdgeType || (exports.EdgeType = {}));\n var ViewMode;\n (function (ViewMode) {\n ViewMode[ViewMode[\"XY\"] = 0] = \"XY\";\n ViewMode[ViewMode[\"YX\"] = 1] = \"YX\";\n ViewMode[ViewMode[\"XZ\"] = 2] = \"XZ\";\n ViewMode[ViewMode[\"ZX\"] = 3] = \"ZX\";\n ViewMode[ViewMode[\"YZ\"] = 4] = \"YZ\";\n ViewMode[ViewMode[\"ZY\"] = 5] = \"ZY\";\n ViewMode[ViewMode[\"Iso\"] = 6] = \"Iso\";\n ViewMode[ViewMode[\"EN\"] = 7] = \"EN\";\n ViewMode[ViewMode[\"NW\"] = 8] = \"NW\";\n ViewMode[ViewMode[\"WS\"] = 9] = \"WS\";\n ViewMode[ViewMode[\"SE\"] = 10] = \"SE\";\n ViewMode[ViewMode[\"TopE\"] = 11] = \"TopE\";\n ViewMode[ViewMode[\"BottomE\"] = 12] = \"BottomE\";\n ViewMode[ViewMode[\"TopN\"] = 13] = \"TopN\";\n ViewMode[ViewMode[\"BottomN\"] = 14] = \"BottomN\";\n ViewMode[ViewMode[\"TopW\"] = 15] = \"TopW\";\n ViewMode[ViewMode[\"BottomW\"] = 16] = \"BottomW\";\n ViewMode[ViewMode[\"TopS\"] = 17] = \"TopS\";\n ViewMode[ViewMode[\"BottomS\"] = 18] = \"BottomS\";\n ViewMode[ViewMode[\"TopEN\"] = 19] = \"TopEN\";\n ViewMode[ViewMode[\"BottomEN\"] = 20] = \"BottomEN\";\n ViewMode[ViewMode[\"TopNW\"] = 21] = \"TopNW\";\n ViewMode[ViewMode[\"BottomNW\"] = 22] = \"BottomNW\";\n ViewMode[ViewMode[\"TopWS\"] = 23] = \"TopWS\";\n ViewMode[ViewMode[\"BottomWS\"] = 24] = \"BottomWS\";\n ViewMode[ViewMode[\"TopSE\"] = 25] = \"TopSE\";\n ViewMode[ViewMode[\"BottomSE\"] = 26] = \"BottomSE\";\n ViewMode[ViewMode[\"YUpIso\"] = 27] = \"YUpIso\";\n })(ViewMode = exports.ViewMode || (exports.ViewMode = {}));\n var CoordinateSystem;\n (function (CoordinateSystem) {\n CoordinateSystem[CoordinateSystem[\"window\"] = 0] = \"window\";\n CoordinateSystem[CoordinateSystem[\"pixels\"] = 1] = \"pixels\";\n CoordinateSystem[CoordinateSystem[\"world\"] = 2] = \"world\";\n CoordinateSystem[CoordinateSystem[\"object\"] = 3] = \"object\";\n CoordinateSystem[CoordinateSystem[\"viewpoint\"] = 4] = \"viewpoint\";\n })(CoordinateSystem = exports.CoordinateSystem || (exports.CoordinateSystem = {}));\n var UpdateType;\n (function (UpdateType) {\n UpdateType[UpdateType[\"Synchronization\"] = 0] = \"Synchronization\";\n UpdateType[UpdateType[\"Asynchronization\"] = 1] = \"Asynchronization\";\n })(UpdateType = exports.UpdateType || (exports.UpdateType = {}));\n var AreaSelectionType;\n (function (AreaSelectionType) {\n AreaSelectionType[AreaSelectionType[\"TouchAndContain\"] = 0] = \"TouchAndContain\";\n AreaSelectionType[AreaSelectionType[\"Contain\"] = 1] = \"Contain\";\n })(AreaSelectionType = exports.AreaSelectionType || (exports.AreaSelectionType = {}));\n var FontUnitsType;\n (function (FontUnitsType) {\n FontUnitsType[FontUnitsType[\"Points\"] = 1] = \"Points\";\n FontUnitsType[FontUnitsType[\"Pixels\"] = 2] = \"Pixels\";\n FontUnitsType[FontUnitsType[\"Object\"] = 3] = \"Object\";\n FontUnitsType[FontUnitsType[\"World\"] = 4] = \"World\";\n FontUnitsType[FontUnitsType[\"Window\"] = 5] = \"Window\";\n })(FontUnitsType = exports.FontUnitsType || (exports.FontUnitsType = {}));\n var TextAlignment;\n (function (TextAlignment) {\n TextAlignment[TextAlignment[\"LeftBottom\"] = 1] = \"LeftBottom\";\n TextAlignment[TextAlignment[\"LeftCenter\"] = 2] = \"LeftCenter\";\n TextAlignment[TextAlignment[\"LeftTop\"] = 3] = \"LeftTop\";\n TextAlignment[TextAlignment[\"CenterBottom\"] = 4] = \"CenterBottom\";\n TextAlignment[TextAlignment[\"CenterCenter\"] = 5] = \"CenterCenter\";\n TextAlignment[TextAlignment[\"CenterTop\"] = 6] = \"CenterTop\";\n TextAlignment[TextAlignment[\"RightBottom\"] = 7] = \"RightBottom\";\n TextAlignment[TextAlignment[\"RightCenter\"] = 8] = \"RightCenter\";\n TextAlignment[TextAlignment[\"RightTop\"] = 9] = \"RightTop\";\n })(TextAlignment = exports.TextAlignment || (exports.TextAlignment = {}));\n var LightingMode;\n (function (LightingMode) {\n LightingMode[LightingMode[\"None\"] = 0] = \"None\";\n LightingMode[LightingMode[\"Phong\"] = 1] = \"Phong\";\n LightingMode[LightingMode[\"BlinnPhong\"] = 2] = \"BlinnPhong\";\n LightingMode[LightingMode[\"Lambert\"] = 3] = \"Lambert\";\n LightingMode[LightingMode[\"HalfLambert\"] = 4] = \"HalfLambert\";\n LightingMode[LightingMode[\"Banded\"] = 5] = \"Banded\";\n LightingMode[LightingMode[\"PBR\"] = 6] = \"PBR\";\n })(LightingMode = exports.LightingMode || (exports.LightingMode = {}));\n var CollisionType;\n (function (CollisionType) {\n CollisionType[CollisionType[\"None\"] = 0] = \"None\";\n CollisionType[CollisionType[\"Intersect\"] = 1] = \"Intersect\";\n CollisionType[CollisionType[\"Touch\"] = 2] = \"Touch\";\n CollisionType[CollisionType[\"Contain\"] = 4] = \"Contain\";\n CollisionType[CollisionType[\"Soft\"] = 8] = \"Soft\";\n })(CollisionType = exports.CollisionType || (exports.CollisionType = {}));\n var GLTypes;\n (function (GLTypes) {\n GLTypes[GLTypes[\"BYTE\"] = 5120] = \"BYTE\";\n GLTypes[GLTypes[\"UNSIGNED_BYTE\"] = 5121] = \"UNSIGNED_BYTE\";\n GLTypes[GLTypes[\"SHORT\"] = 5122] = \"SHORT\";\n GLTypes[GLTypes[\"UNSIGNED_SHORT\"] = 5123] = \"UNSIGNED_SHORT\";\n GLTypes[GLTypes[\"INT\"] = 5124] = \"INT\";\n GLTypes[GLTypes[\"UNSIGNED_INT\"] = 5125] = \"UNSIGNED_INT\";\n GLTypes[GLTypes[\"FLOAT\"] = 5126] = \"FLOAT\";\n GLTypes[GLTypes[\"DOUBLE\"] = 5130] = \"DOUBLE\";\n GLTypes[GLTypes[\"STATIC_DRAW\"] = 35044] = \"STATIC_DRAW\";\n GLTypes[GLTypes[\"DYNAMIC_DRAW\"] = 35048] = \"DYNAMIC_DRAW\";\n })(GLTypes = exports.GLTypes || (exports.GLTypes = {}));\n var Viewer = function () {\n function Viewer(containerId) {\n var _this = this;\n this.maxMemoryFactor = 0.8;\n this._viewKey = -1;\n this._sceneKey = -1;\n this._modelKey = -1;\n this._styleKey = -1;\n this._backgroundKey = -1;\n this._screenKey = -1;\n this._width = 600;\n this._height = 400;\n this._aspectRatio = 1;\n this._cameraOrientationFixed = false;\n this._smoothTransition = true;\n this._smoothTransitionDuration = 500;\n this.sceneCameraChanging = new gs_collections_1.List();\n this.sceneCameraChanged = new gs_collections_1.List();\n this.documentChanged = new gs_collections_1.List();\n this.collisionComputing = new gs_collections_1.List();\n this.collisionComputed = new gs_collections_1.List();\n this.geometryItem = new gs_collections_1.List();\n this.geometryItems = new gs_collections_1.List();\n this.geometryDrawFinish = new gs_collections_1.List();\n this.zoomLimit = 0.000001;\n this.imageUrls = {};\n this._onResize = null;\n this._testGslId = null;\n this._updateType = UpdateType.Synchronization;\n this._running = false;\n this._isBusy = false;\n this._isUpdateTt = false;\n this._isSharedArrayBuffer = false;\n this._isCache = false;\n this._dynamicMemory = segment_1.DynamicMemoryType.None;\n this._currentMemorySize = -1;\n this.xhrList = new gs_collections_1.List();\n this.getAsynGroupGeoDataAction = null;\n this._loadingList = {};\n this._loadingListCount = 0;\n this._bufferVaoNo = 0;\n this._bufferVaoListMapNo = {};\n this._bufferKeyCount = 0;\n this._offset = 0;\n this._geoDataIsCompression = false;\n this._groupSizeLimit = 1024 * 1024;\n this._threadUPVIsRunning = false;\n this._threadUPVIsPreparing = false;\n this._threadUPVCancelled = false;\n this._threadUPVIsAgain = false;\n this._threadUPGDIsRunning = false;\n this._threadUPGDCancelled = false;\n this._threadUPGDIsAgain = false;\n this._threadSTGDIsRunningCount = 0;\n this._streamToSegmentRunningCount = 0;\n this._decodeManagerIsRunning = false;\n this._decodingObjectList = new Array();\n this._renderViewPerGroup = 50;\n this._cacheSegKeys = new Array();\n this._cacheGeometryDataList = new Array();\n this._cacheDataSize = 0;\n this.renderViewAll = false;\n this.comAndUpdGeoIsInterrupted = false;\n this.isGeometryLoading = false;\n this._segmentLoadingCount = 0;\n this.bufferingGeometryCount = 0;\n this.modelDebug = false;\n this.onComputeCollisionFinished = new gs_collections_1.NumberKeyList();\n this.isFixFrameRender = true;\n JS_Init_Apis();\n JS_Init_Database();\n JS_Init_Multithreading_Services(navigator.hardwareConcurrency);\n var vi = this;\n this._onResize = function () {\n vi.updateSize();\n vi.updateDisplay();\n };\n this.createView(containerId);\n Module[\"onTaskProcessingFinished\"] = function (task_id, type, view_key) {\n _this.debugLog(\"type:\" + type);\n var viewer = _this.findViewerByKey(view_key);\n if (viewer) {\n if (type === 1 || type === 2) {\n if (!viewer.isBusy && !viewer.threadIsRunning) {\n JS_Execute_Task_Post_Processing(task_id);\n if (type === 1) {\n viewer.streamToSegmentRunningCount--;\n console.log(\"streamToSegmentRunningCount:\", viewer.streamToSegmentRunningCount);\n }\n if (type === 2) {\n viewer._threadSTGDIsRunningCount--;\n console.log(\"this._threadSTGDIsRunningCount:\", viewer._threadSTGDIsRunningCount);\n }\n } else {\n var timer_1 = setInterval(function () {\n if (viewer.isBusy || viewer.threadIsRunning) {} else {\n JS_Execute_Task_Post_Processing(task_id);\n if (type === 1) {\n viewer.streamToSegmentRunningCount--;\n console.log(\"streamToSegmentRunningCount:\", viewer.streamToSegmentRunningCount);\n }\n if (type === 2) {\n viewer._threadSTGDIsRunningCount--;\n console.log(\"this._threadSTGDIsRunningCount:\", viewer._threadSTGDIsRunningCount);\n }\n clearInterval(timer_1);\n }\n }, 50);\n }\n } else {\n if (!viewer.isBusy) {\n _this.debugLog(\"onTaskProcessingFinished execute \" + \"type:\" + type);\n JS_Execute_Task_Post_Processing(task_id);\n } else {\n var timer_2 = setInterval(function () {\n if (viewer.isBusy) {\n _this.debugLog(\"onTaskProcessingFinished is Busy\");\n } else {\n _this.debugLog(\"onTaskProcessingFinished execute \" + \"type:\" + type + \" id\" + task_id);\n JS_Execute_Task_Post_Processing(task_id);\n clearInterval(timer_2);\n }\n }, 50);\n }\n }\n }\n };\n if (!Module[\"streamToSegmentList\"]) {\n Module[\"streamToSegmentList\"] = new gs_collections_1.NumberKeyList();\n }\n Module[\"afterAsynUpdateView\"] = function (view_key, cancelled) {\n var viewer = _this.findViewerByKey(view_key);\n if (!cancelled) {\n viewer.unBufferAndBufferGeometries(true, viewer._threadPromise, true);\n viewer._threadUPVCancelled = false;\n } else {\n viewer.debugLog(\"AsynUpdateView cancelled\");\n viewer._threadUPVCancelled = true;\n }\n viewer._threadUPVIsRunning = false;\n viewer._threadUPVIsPreparing = false;\n viewer.debugLog(\"JS_Asyn_Update_View_By_Key_Tt_End\");\n if (viewer._threadUPVCancelled) {\n viewer.debugLog(\"JS_Asyn_Update_View_By_Key_Tt_Start_Cancelled\");\n JS_Asyn_Update_View_By_Key_Tt(viewer.viewKey);\n viewer._threadUPVIsRunning = true;\n viewer._threadUPVCancelled = false;\n viewer._threadUPVIsAgain = false;\n } else if (viewer._threadUPVIsAgain) {\n viewer.debugLog(\"JS_Asyn_Update_View_By_Key_Tt_Start_Again\");\n JS_Asyn_Update_View_By_Key_Tt(viewer.viewKey);\n viewer._threadUPVIsRunning = true;\n viewer._threadUPVCancelled = false;\n viewer._threadUPVIsAgain = false;\n }\n };\n Module[\"afterAsynUpdateGeometryData\"] = function (view_key, partial_key, cancelled) {\n var viewer = _this.findViewerByKey(view_key);\n if (!cancelled) {\n viewer._threadUPGDCancelled = false;\n var asynKeys = JS_Show_Asyn_Geometry_Data_Keys(viewer._viewKey);\n viewer.debugLog(\"asynKeysLength:\" + asynKeys.length);\n var memoryIsFree = viewer.ensureMemorySize();\n if (memoryIsFree) {\n viewer.asynLoadGeometries(asynKeys);\n } else {\n console.log(\"memory is full before asynLoadGeometries\");\n }\n viewer.asynRemoveGeometry();\n } else {\n viewer._threadUPGDCancelled = true;\n viewer.debugLog(\"AsynUpdateGeometryData cancelled\");\n }\n viewer._threadUPGDIsRunning = false;\n viewer.debugLog(\"JS_Asyn_Update_Geometry_Data_By_Key_Tt_End\");\n if (viewer._threadUPGDCancelled) {\n viewer.debugLog(\"JS_Asyn_Update_Geometry_Data_By_Key_Tt_Start_Cancelled\");\n JS_Asyn_Update_Geometry_Data_By_Key_Tt(viewer.viewKey, -1);\n viewer._threadUPGDIsRunning = true;\n viewer._threadUPGDCancelled = false;\n viewer._threadUPGDIsAgain = false;\n } else if (viewer._threadUPGDIsAgain) {\n viewer.debugLog(\"JS_Asyn_Update_Geometry_Data_By_Key_Tt_Start_Again\");\n JS_Asyn_Update_Geometry_Data_By_Key_Tt(viewer.viewKey, -1);\n viewer._threadUPGDIsRunning = true;\n viewer._threadUPGDCancelled = false;\n viewer._threadUPGDIsAgain = false;\n }\n };\n Module[\"onImageExternalLoading\"] = function (view_key, image_key, buffer) {\n var viewer = _this.findViewerByKey(view_key);\n var name = JS_Show_One_Image_Option(image_key, \"name\");\n var format = JS_Show_One_Image_Option(image_key, \"format\");\n var id = JS_Show_One_Image_Option(image_key, \"id\");\n if (name) {\n var url = _this.getAsynImageAction.url + id + \"/\" + name + \".\" + format;\n if (viewer.imageUrls[url]) {\n return;\n } else {\n viewer.imageUrls[url] = true;\n }\n var token = (0, cookie_1.getCookie)(\"GsToken\");\n var xhr_1 = new XMLHttpRequest();\n _this.xhrList.add(xhr_1);\n xhr_1.open(\"GET\", url, true);\n xhr_1.setRequestHeader(\"Content-Type\", \"application/json\");\n xhr_1.responseType = \"blob\";\n xhr_1.setRequestHeader(\"Access-Control-Allow-Origin\", \"*\");\n if (token) {\n xhr_1.setRequestHeader(\"Authorization\", token);\n }\n xhr_1.onload = function () {\n _this.xhrList.remove(xhr_1);\n var blob = xhr_1.response;\n createImageBitmap(blob).then(function (image) {\n viewer.makeContextCurrent();\n var gl = viewer.gl;\n var texture = JS_Create_Texture(buffer);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n if (format == \"jpg\" || format == \"jpeg\" || format == \"rgb\") {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image);\n gl.generateMipmap(gl.TEXTURE_2D);\n } else if (format == \"png\" || format == \"rgba\") {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n gl.generateMipmap(gl.TEXTURE_2D);\n } else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image);\n gl.generateMipmap(gl.TEXTURE_2D);\n }\n gl.bindTexture(gl.TEXTURE_2D, null);\n viewer.updateDisplay();\n });\n };\n xhr_1.send();\n }\n };\n Module[\"onCollisionComputing\"] = function (view_key, total, current) {\n var viewer = vi.findViewerByKey(view_key);\n if (viewer) {\n viewer.collisionComputing.forEach(function (value) {\n value(viewer, total, current);\n });\n }\n };\n Module[\"onCollisionComputed\"] = function (view_key, count) {\n var viewer = vi.findViewerByKey(view_key);\n if (viewer) {\n viewer.collisionComputed.forEach(function (value) {\n value(viewer, count);\n });\n }\n };\n Module[\"onStreamToSegmentFinished\"] = function (key, no) {\n _this.debugLog(\"onStreamToSegmentFinished: \" + key + no);\n var event = Module[\"streamToSegmentList\"].get(no);\n if (event) {\n event(key);\n }\n };\n Module[\"onStreamToGeometryDataFinished\"] = function (count) {\n _this.debugLog(\"onStreamToGeometryDataFinished: \" + count);\n process_1.Process.processList.forEach(function (process) {\n process.viewers.forEach(function (view) {\n var bufferTaskLength = view.aysnTaskManager.getTaskLength(2);\n if (bufferTaskLength === 0) {\n view.computeAndUpdateGeometries(true, null);\n } else {\n view.comAndUpdGeoIsInterrupted = true;\n }\n });\n });\n _this.debugLog(\"JS_Stream_To_Geometry_Data_By_Keys_Tt_End\");\n };\n Module[\"onBufferGeometryFinished\"] = function (no) {\n _this.debugLog(\"onBufferGeometryFinished\");\n JS_Asyn_Render_View_By_Key(_this.viewKey, false);\n };\n Module[\"onComputeCollisionFinished\"] = function (no, items) {\n var event = _this.onComputeCollisionFinished.get(no);\n if (event) {\n event(items);\n }\n };\n }\n Object.defineProperty(Viewer.prototype, \"aspectRatio\", {\n get: function get() {\n return this._aspectRatio;\n },\n set: function set(aspectRatio) {\n this._aspectRatio = aspectRatio;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"geoDataIsCompression\", {\n get: function get() {\n return this._geoDataIsCompression;\n },\n set: function set(value) {\n this._geoDataIsCompression = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"threadIsRunning\", {\n get: function get() {\n return this._threadUPVIsRunning || this._threadUPGDIsRunning;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"renderViewPerGroup\", {\n get: function get() {\n return this._renderViewPerGroup;\n },\n set: function set(value) {\n this._renderViewPerGroup = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"streamToSegmentRunningCount\", {\n get: function get() {\n return this._streamToSegmentRunningCount;\n },\n set: function set(value) {\n this._streamToSegmentRunningCount = value;\n },\n enumerable: false,\n configurable: true\n });\n Viewer.prototype.asynLoadGeometries = function (asynKeys) {\n return tslib_1.__awaiter(this, void 0, void 0, function () {\n var lightModels, idMapKeys, i, modelId, keys;\n return tslib_1.__generator(this, function (_a) {\n if (asynKeys.length > 0) {\n this.isGeometryLoading = true;\n console.log(\"isGeometryLoading:\", this.isGeometryLoading);\n lightModels = this.process.findModelRenderObjects();\n idMapKeys = {};\n this.groupingAsynKeysOfEachLightModel(asynKeys, idMapKeys);\n for (i = 0; i < lightModels.length; i++) {\n modelId = lightModels[i].modelId;\n keys = idMapKeys[modelId];\n if (keys) {\n this.getGeometryDataPerLightModel(lightModels[i], idMapKeys);\n }\n }\n }\n return [2];\n });\n });\n };\n Viewer.prototype.getGeometryDataPerLightModel = function (lightModel, idMapKeys) {\n return tslib_1.__awaiter(this, void 0, void 0, function () {\n var modelId, modelVersion, keys, dictionary_1, cacheDictionary_1, noCacheKeys_1, groupSizeCount_1, groupIds_1, idb, tx, loadingFiltedKeys, _loop_1, this_1, j;\n var _this = this;\n return tslib_1.__generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n modelId = lightModel.modelId;\n modelVersion = lightModel.version;\n keys = idMapKeys[modelId];\n if (!keys) return [3, 3];\n dictionary_1 = {};\n cacheDictionary_1 = {};\n noCacheKeys_1 = new Array();\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n idb = void 0;\n tx = void 0;\n if (!this.isCache) return [3, 2];\n idb = idb_1.default.getInstance(modelId);\n return [4, idb.transaction()];\n case 1:\n tx = _a.sent();\n _a.label = 2;\n case 2:\n loadingFiltedKeys = this.filterLoadingList(keys);\n this._segmentLoadingCount += loadingFiltedKeys.length;\n keys = loadingFiltedKeys;\n _loop_1 = function _loop_1(j) {\n var segKey = keys[j];\n var id = null;\n JS_Open_Segment_By_Key(segKey);\n {\n id = JS_Show_One_Heuristic_Option(\"geometry id\");\n }\n JS_Close_Segment();\n if (id) {\n this_1._loadingList[segKey] = 0;\n this_1._loadingListCount++;\n if (this_1.isCache) {\n tx.store.get(modelId + \"?v=\" + modelVersion + \"_\" + id).then(function (data) {\n if (data) {\n cacheDictionary_1[id] = {\n key: segKey,\n data: data\n };\n JS_Open_Segment_By_Key(segKey);\n {\n JS_Set_One_Heuristic_Option(\"asyn geometry\", \"off\");\n }\n JS_Close_Segment();\n delete _this._loadingList[segKey];\n _this._loadingListCount--;\n if (_this._loadingListCount === 0) {\n console.log(\"获取完全部几何数据\");\n }\n var isLast = false;\n if (j === keys.length - 1) {\n isLast = true;\n }\n _this.asynBatchSetSegmentsDataFromCache(segKey, data, isLast);\n if (j === keys.length - 1 && groupIds_1.length > 0) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n _this.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n }\n } else {\n dictionary_1[id] = segKey;\n noCacheKeys_1.push(segKey);\n var size = null;\n JS_Open_Segment_By_Key(segKey);\n {\n var tempSize = JS_Show_One_Heuristic_Option(\"geometry size\");\n size = Number(tempSize);\n }\n JS_Close_Segment();\n if (size >= _this._groupSizeLimit) {\n if (groupIds_1.length > 0) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n _this.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n }\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n groupIds_1 = id;\n _this.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n } else {\n groupIds_1 = groupIds_1 + id + \",\";\n groupSizeCount_1 += size;\n if (groupSizeCount_1 >= _this._groupSizeLimit) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n _this.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n }\n }\n if (j === keys.length - 1 && groupIds_1.length > 0) {\n if (groupIds_1[groupIds_1.length - 1] === \",\") {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n }\n _this.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n }\n var isLast = false;\n if (j === keys.length - 1) {\n isLast = true;\n }\n _this.asynBatchSetSegmentsDataFromCache(null, null, isLast);\n }\n });\n } else {\n dictionary_1[id] = segKey;\n noCacheKeys_1.push(segKey);\n var size = null;\n JS_Open_Segment_By_Key(segKey);\n {\n var tempSize = JS_Show_One_Heuristic_Option(\"geometry size\");\n size = Number(tempSize);\n }\n JS_Close_Segment();\n if (size >= this_1._groupSizeLimit) {\n if (groupIds_1.length > 0) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n this_1.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n }\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n groupIds_1 = id;\n this_1.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n } else {\n groupIds_1 = groupIds_1 + id + \",\";\n groupSizeCount_1 += size;\n if (groupSizeCount_1 >= this_1._groupSizeLimit) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n this_1.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n }\n }\n if (j === keys.length - 1 && groupIds_1.length > 0) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n this_1.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n }\n }\n }\n };\n this_1 = this;\n for (j = 0; j < keys.length; j++) {\n _loop_1(j);\n }\n _a.label = 3;\n case 3:\n return [2];\n }\n });\n });\n };\n Viewer.prototype.filterLoadingList = function (keys) {\n var loadingFiltedKeys = new Array();\n for (var j = 0; j < keys.length; j++) {\n var segKey = keys[j];\n var id = null;\n JS_Open_Segment_By_Key(segKey);\n {\n id = JS_Show_One_Heuristic_Option(\"geometry id\");\n }\n JS_Close_Segment();\n if (id) {\n var res = this._loadingList[segKey];\n if (res !== null && res !== undefined) {\n continue;\n }\n loadingFiltedKeys.push(segKey);\n }\n }\n return loadingFiltedKeys;\n };\n Viewer.prototype.asynBatchSetSegmentsDataFromCache = function (segKey, bytes, isLast) {\n var _this = this;\n if (segKey) {\n this._cacheSegKeys.push(segKey);\n }\n if (bytes) {\n this._cacheGeometryDataList.push(bytes);\n this._cacheDataSize += bytes.length;\n }\n if (this._cacheSegKeys.length > this._renderViewPerGroup || this._cacheDataSize > this._groupSizeLimit * 20 || isLast) {\n var keys_1 = tslib_1.__spreadArray([], tslib_1.__read(this._cacheSegKeys), false);\n if (!keys_1 || keys_1.length === 0) {\n return;\n }\n var allByteLength_1 = 0;\n for (var i = 0; i < this._cacheGeometryDataList.length; i++) {\n allByteLength_1 += this._cacheGeometryDataList[i].length;\n }\n var geometryGrupData_1 = new Uint8Array(allByteLength_1);\n var currentOffset = 0;\n for (var i = 0; i < this._cacheGeometryDataList.length; i++) {\n geometryGrupData_1.set(this._cacheGeometryDataList[i], currentOffset);\n currentOffset += this._cacheGeometryDataList[i].length;\n this._cacheGeometryDataList[i] = null;\n }\n var timer_3 = setInterval(function () {\n if (_this.checkStreamToGeometryDisable()) {} else {\n _this._currentMemorySize += allByteLength_1 * 3;\n var isFree = _this.ensureCurrentMemorySize();\n if (isFree) {\n if (_this.isUpdateTt) {\n var timer_4 = setInterval(function () {\n if (!_this._threadUPVIsRunning) {\n _this.debugLog(\"JS_Stream_To_Geometry_Data_By_Keys_Tt_Start\");\n _this._threadSTGDIsRunningCount++;\n JS_Stream_To_Geometry_Data_By_Keys_Tt(keys_1, geometryGrupData_1, _this.viewKey);\n _this._segmentLoadingCount -= keys_1.length;\n clearInterval(timer_4);\n }\n }, 20);\n } else {\n console.log(\"JS_Stream_To_Geometry_Data_By_Keys\", keys_1.length);\n JS_Stream_To_Geometry_Data_By_Keys(keys_1, geometryGrupData_1);\n _this._segmentLoadingCount -= keys_1.length;\n _this.computeAndUpdateGeometries(true, null);\n }\n } else {\n console.log(\"memory is full from cache\");\n }\n clearInterval(timer_3);\n }\n }, 20);\n this._cacheSegKeys = new Array();\n this._cacheGeometryDataList = new Array();\n this._cacheDataSize = 0;\n }\n };\n Viewer.prototype.findViewerByKey = function (view_key) {\n var viewer = null;\n process_1.Process.processList.forEach(function (process) {\n process.viewers.forEach(function (vi) {\n if (vi.viewKey == view_key) {\n viewer = vi;\n return false;\n }\n });\n if (viewer) {\n return false;\n }\n });\n if (!viewer) {\n console.log(\"找不到viewer\");\n return null;\n }\n return viewer;\n };\n Viewer.prototype.createView = function (containerId) {\n this.container = document.getElementById(containerId);\n this.container.style.overflow = \"hidden\";\n this.canvas = document.createElement(\"canvas\");\n this.canvas.setAttribute(\"id\", \"canvas_\" + containerId);\n this.canvas.style.position = \"absolute\";\n this.canvas.style.left = \"0px\";\n this.canvas.style.right = \"0px\";\n this.canvas.style.zIndex = \"0\";\n this.canvas.style.touchAction = \"none\";\n this.canvas.width = this.container.offsetWidth;\n this.canvas.height = this.container.offsetHeight;\n this.canvas.oncontextmenu = function () {\n return false;\n };\n this.container.appendChild(this.canvas);\n this.container[\"viewer\"] = this;\n this._width = this.container.offsetWidth;\n this._height = this.container.offsetHeight;\n this._aspectRatio = this._width / this._height;\n JS_Open_Segment(\"/driver/emscripten\");\n {\n JS_Set_Driver_Configs(\"driver=emscripten\");\n this._viewKey = JS_Open_Segment(containerId);\n {\n JS_Set_Driver_Options(\"viewer id='#canvas_\" + containerId + \"',selection tolerance=0.005\");\n JS_Set_Shader(\"name=blinn phong\");\n JS_Set_Viewport(0, 0, 1, 1, \"window\");\n JS_Set_Color(\"lights=(r=1,g=1,b=1),ambients=(r=0.5,g=0.5,b=0.5)\");\n JS_Set_Color(\"background=(r=1.0,g=1.0,b=1.0),markers=(r=0.0,g=1.0,b=0.0),lines=(r=0.0,g=1.0,b=0.0),vertices=(r=0.0,g=1.0,b=0.0),edges=(r=0.0,g=1.0,b=0.0),faces=(color=(r=0.0,g=1.0,b=0.27),emissive=(r=0.0,g=0.0,b=0.0),transparency=1.0,metallic=0.1,roughness=0.2,specular=0.5,diffuse=-),cutting faces=(color=(r=1.0,g=0.8,b=0.0),diffuse=-)\");\n JS_Set_Visibility(\"lights=on,cutting planes=off\");\n JS_Set_Rendering_Options(\"marker size=6,vertex size=6,line width=3,edge width=3,mesh line=off,mesh edge=off,cull back face=on,logarithmic depth buffer=off,depth range=(0,1),face offset=(0,0)\");\n JS_Insert_Image(0, 0, 0, 1, 1, new Int8Array([255, 255, 255, 255]), \"name=-,local\");\n this._sceneKey = JS_Open_Segment(\"scene\");\n {\n JS_Set_Camera([0, 0, 5], [0, 0, 0], [0, 1, 0], 2.0, 2.0, \"orthographic\");\n JS_Insert_Light(0, 0.4, 1.5, true);\n JS_Set_ModellingMatrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n }\n JS_Close_Segment();\n this._screenKey = JS_Open_Segment(\"screen\");\n {\n JS_Set_Camera([0, 0, 5], [0, 0, 0], [0, 1, 0], 2.0, 2.0, \"orthographic\");\n JS_Set_ModellingMatrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n JS_Set_Rendering_Options(\"sync update=on,depth range=(0.0, 0.1),screen drawing=on,view frustum culling=off,culling maximum extent=0\");\n JS_Set_Heuristic_Options(\"exclude bounding=on\");\n JS_Set_Visibility(\"lights=off\");\n }\n JS_Close_Segment();\n }\n JS_Close_Segment();\n }\n JS_Close_Segment();\n JS_Open_Segment(\"/include library\");\n {\n this._modelKey = JS_Open_Segment(\"model_\" + containerId);\n JS_Close_Segment();\n }\n JS_Close_Segment();\n JS_Open_Segment(\"/style library\");\n {\n this._styleKey = JS_Open_Segment(\"style_\" + containerId);\n JS_Close_Segment();\n }\n JS_Close_Segment();\n JS_Update_Display();\n this.gl = this.canvas.getContext(\"webgl2\");\n window.addEventListener(\"resize\", this._onResize);\n };\n Viewer.prototype.dispose = function () {\n window.removeEventListener(\"resize\", this._onResize);\n this.xhrList.forEach(function (xhr) {\n xhr.abort();\n });\n this.imageUrls = {};\n if (this._viewKey != -1) {\n JS_Delete_By_Key(this._viewKey);\n this._viewKey = -1;\n }\n if (this._modelKey != -1) {\n JS_Delete_By_Key(this._modelKey);\n this._modelKey = -1;\n }\n if (this._styleKey != -1) {\n JS_Delete_By_Key(this._styleKey);\n this._styleKey = -1;\n }\n this.sceneCameraChanged.clear();\n this.container.removeChild(this.canvas);\n this.canvas = null;\n this.container = null;\n };\n Viewer.prototype.rebind = function (containerId) {\n this.createView(containerId);\n };\n Viewer.prototype.ensureMemorySize = function () {\n var allocated_size = JS_Show_Allocated_Memory_Size();\n this._currentMemorySize = allocated_size;\n if (allocated_size > 2147483648 * this.maxMemoryFactor) {\n return false;\n } else {\n return true;\n }\n };\n Viewer.prototype.ensureCurrentMemorySize = function () {\n if (this._currentMemorySize > 2147483648 * this.maxMemoryFactor) {\n return false;\n } else {\n return true;\n }\n };\n Object.defineProperty(Viewer.prototype, \"viewKey\", {\n get: function get() {\n return this._viewKey;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"sceneKey\", {\n get: function get() {\n return this._sceneKey;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"modelKey\", {\n get: function get() {\n return this._modelKey;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"styleKey\", {\n get: function get() {\n return this._styleKey;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"isBusy\", {\n get: function get() {\n return this._isBusy;\n },\n set: function set(value) {\n this._isBusy = value;\n if (this._isBusy) {}\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"isUpdateTt\", {\n get: function get() {\n return this._isUpdateTt;\n },\n set: function set(value) {\n this._isUpdateTt = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"isSharedArrayBuffer\", {\n get: function get() {\n return this._isSharedArrayBuffer;\n },\n set: function set(value) {\n this._isSharedArrayBuffer = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"isCache\", {\n get: function get() {\n return this._isCache;\n },\n set: function set(value) {\n this._isCache = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"testGslId\", {\n get: function get() {\n return this._testGslId;\n },\n set: function set(value) {\n this._testGslId = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"updateType\", {\n get: function get() {\n return this._updateType;\n },\n set: function set(value) {\n if (value == UpdateType.Asynchronization && this._updateType == UpdateType.Synchronization) {\n this._updateType = value;\n this._running = true;\n } else if (value == UpdateType.Synchronization && this._updateType == UpdateType.Asynchronization) {\n this._updateType = value;\n this._running = false;\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"dynamicMemory\", {\n get: function get() {\n var result = segment_1.DynamicMemoryType.None;\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var dm = JS_Show_One_Rendering_Option(\"dynamic memory\");\n if (dm == \"client\") {\n result = segment_1.DynamicMemoryType.Client;\n } else if (dm == \"server\") {\n result = segment_1.DynamicMemoryType.Server;\n } else {\n result = segment_1.DynamicMemoryType.None;\n }\n }\n JS_Close_Segment();\n return result;\n },\n set: function set(type) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n JS_Set_Rendering_Options(\"dynamic memory=\" + segment_1.DynamicMemoryType[type].toLowerCase());\n }\n JS_Close_Segment();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"dynamicMemoryThreshold\", {\n get: function get() {\n var result = 0.0;\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var dm = JS_Show_One_Rendering_Option(\"dynamic memory threshold\");\n if (dm) {\n result = parseFloat(dm);\n }\n }\n JS_Close_Segment();\n return result;\n },\n set: function set(value) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n JS_Set_Rendering_Options(\"dynamic memory threshold=\" + value);\n }\n JS_Close_Segment();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"lightingMode\", {\n get: function get() {\n var result = LightingMode.None;\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var name = JS_Show_One_Shader(\"name\");\n if (name == \"phong\") {\n result = LightingMode.Phong;\n } else if (name == \"blinn phong\") {\n result = LightingMode.BlinnPhong;\n } else if (name == \"lambert\") {\n result = LightingMode.Lambert;\n } else if (name == \"half lambert\") {\n result = LightingMode.HalfLambert;\n } else if (name == \"banded\") {\n result = LightingMode.Banded;\n } else if (name == \"pbr\") {\n result = LightingMode.PBR;\n }\n }\n JS_Close_Segment();\n return result;\n },\n set: function set(mode) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n if (mode == LightingMode.Phong) {\n JS_Set_Shader(\"name = phong\");\n } else if (mode == LightingMode.BlinnPhong) {\n JS_Set_Shader(\"name = blinn phong\");\n } else if (mode == LightingMode.Lambert) {\n JS_Set_Shader(\"name = lambert\");\n } else if (mode == LightingMode.HalfLambert) {\n JS_Set_Shader(\"name = half lambert\");\n } else if (mode == LightingMode.Banded) {\n JS_Set_Shader(\"name = banded\");\n } else if (mode == LightingMode.PBR) {\n JS_Set_Shader(\"name = pbr\");\n }\n }\n JS_Close_Segment();\n },\n enumerable: false,\n configurable: true\n });\n Viewer.prototype.asynUPGDTaskRun = function () {\n this.debugLog(\"JS_Asyn_Update_Geometry_Data_By_Key_Tt_Start\");\n JS_Asyn_Update_Geometry_Data_By_Key_Tt(this.viewKey, -1);\n this._threadUPGDIsRunning = true;\n };\n Viewer.prototype.makeContextCurrent = function () {\n JS_Make_Context_Current(this._viewKey);\n };\n Viewer.prototype.debugLog = function (mes) {\n if (this.modelDebug) {\n console.log(mes);\n }\n };\n Viewer.prototype.updateDisplaySynced = function () {\n JS_Update_View_Display_By_Key(this._viewKey);\n };\n Viewer.prototype.updateDisplay = function () {\n var _this = this;\n if (this._updateType == UpdateType.Synchronization) {\n JS_Update_View_Display_By_Key(this._viewKey);\n return new ThreadPromise(function (resolve) {\n resolve(new UpdateInfo(_this, UpdateDisplayType.Synchronization));\n });\n } else {\n if (!this.isBusy) {\n this.debugLog(\"not busy\");\n JS_Asyn_Update_Camera_By_Key(this.viewKey);\n if (this.renderViewAll) {\n JS_Asyn_Render_View_By_Key(this._viewKey, false);\n this.renderViewAll = false;\n }\n var lightModels = null;\n if (this.process) {\n lightModels = this.process.findModelRenderObjects();\n }\n if (lightModels) {\n if (lightModels.length === 0) {\n this.debugLog(\"ligthModels length = 0\");\n }\n if (this._isUpdateTt) {\n if (!this._threadUPGDIsRunning && this.streamToSegmentRunningCount === 0) {\n this.asynUPGDTaskRun();\n }\n } else {\n JS_Asyn_Update_Geometry_Data_By_Key(this.viewKey, -1);\n var asynKeys = JS_Show_Asyn_Geometry_Data_Keys(this._viewKey);\n this.asynLoadGeometries(asynKeys);\n if (asynKeys.length <= 0) {\n this.debugLog(\"asynKeys.length = 0\");\n }\n this.asynRemoveGeometry();\n }\n } else {\n this.debugLog(\"lightModels is null\");\n }\n var promise = new ThreadPromise();\n this.computeAndUpdateGeometries(false, promise);\n return promise;\n } else {\n this.debugLog(\"busy\");\n JS_Asyn_Render_View_By_Key(this._viewKey, this.isFixFrameRender);\n return new ThreadPromise(function (resolve) {\n resolve(new UpdateInfo(_this, UpdateDisplayType.Busy));\n });\n }\n }\n };\n Viewer.prototype.asynRemoveGeometry = function () {\n var _this = this;\n this.aysnTaskManager.clearTask(3);\n var removeKeys = JS_Show_Asyn_Remove_Geometry_Data_Keys(this._viewKey);\n var count = removeKeys.length;\n var perGroupLength = 1000;\n var groupCount = 0;\n var group = new Array();\n for (var j = 0; j < count; j++) {\n groupCount++;\n group.push(removeKeys[j]);\n if (groupCount === perGroupLength || j === count - 1) {\n var copyGroup = JSON.parse(JSON.stringify(group));\n groupCount = 0;\n group = new Array();\n this.aysnTaskManager.asynTask(function (keyList) {\n return tslib_1.__awaiter(_this, void 0, void 0, function () {\n var i;\n return tslib_1.__generator(this, function (_a) {\n if (this.isBusy || this.threadIsRunning) {\n return [2, false];\n } else {\n for (i = 0; i < keyList.length; i++) {\n JS_Open_Segment_By_Key(keyList[i]);\n {\n JS_Clear_Geometry();\n JS_Set_One_Heuristic_Option(\"asyn geometry\", \"on\");\n }\n JS_Close_Segment();\n }\n return [2, true];\n }\n return [2];\n });\n });\n }, [copyGroup], 3);\n }\n }\n };\n Viewer.prototype.groupingAsynKeysOfEachLightModel = function (asynKeys, idMapKeys) {\n for (var i = 0; i < asynKeys.length; i++) {\n var key = asynKeys[i];\n var modelId = JS_Show_Key_Tag(key);\n var array = idMapKeys[modelId];\n if (!array) {\n array = new Array();\n }\n array.push(key);\n idMapKeys[modelId] = array;\n }\n };\n Viewer.prototype.asynUpdateView = function () {\n JS_Asyn_Update_View_By_Key(this._viewKey);\n };\n Viewer.prototype.asynBatchSetSegmentsData = function (modelId, groupIdsList, version, dictionary) {\n var _this = this;\n var token = (0, cookie_1.getCookie)(\"GsToken\");\n if (!token) {}\n var _loop_2 = function _loop_2(i) {\n if (this_2.getAsynGroupGeoDataAction) {\n var action = this_2.getAsynGroupGeoDataAction(modelId, version);\n var xhr_2 = new XMLHttpRequest();\n this_2.xhrList.add(xhr_2);\n xhr_2.open(action.httpType, action.url, true);\n xhr_2.setRequestHeader(\"Content-Type\", \"application/json\");\n xhr_2.responseType = \"blob\";\n xhr_2.setRequestHeader(\"Access-Control-Allow-Origin\", \"*\");\n if (token) {\n xhr_2.setRequestHeader(\"Authorization\", token);\n }\n xhr_2.onload = function () {\n _this.xhrList.remove(xhr_2);\n if (xhr_2.status.toString().slice(0, 1) === \"2\") {\n var reader = new FileReader();\n reader.readAsArrayBuffer(xhr_2.response);\n reader.onload = function (e) {\n if (e.target[\"readyState\"] == FileReader.DONE) {\n var blobData = e.target[\"result\"];\n var decodingObject = {\n modelId: modelId,\n version: version,\n data: blobData,\n groupIds: groupIdsList[i],\n dictionary: dictionary\n };\n _this._decodingObjectList.push(decodingObject);\n _this.debugLog(\"decodeMng:\" + _this._decodeManagerIsRunning);\n if (!_this._decodeManagerIsRunning) {\n _this.decodeMngRun();\n }\n }\n };\n } else {\n console.log(\"请求分组几何失败:\", xhr_2.response);\n }\n };\n xhr_2.onerror = function (err) {\n console.log(\"error\", err);\n };\n var strArray = groupIdsList[i].split(\",\");\n xhr_2.send(JSON.stringify({\n ids: strArray\n }));\n } else {\n console.error(\"Viewer.getAsynGroupGeoDataAction 未定义\");\n }\n };\n var this_2 = this;\n for (var i = 0; i < groupIdsList.length; i++) {\n _loop_2(i);\n }\n };\n Viewer.prototype.computeAndUpdateGeometries = function (isStreamToGeometry, promise) {\n this.comAndUpdGeoIsInterrupted = false;\n this.debugLog(\"computeAndUpdateGeometries start\");\n if (!this.isBusy) {\n this.debugLog(\"computeAndUpdateGeometries not busy\");\n if (this._isUpdateTt) {\n this.debugLog(\"computeAndUpdateGeometries updateTt\");\n var viewer_1 = this;\n if (!this._threadUPVIsRunning && !this._threadUPVIsPreparing) {\n var timer_5 = setInterval(function () {\n if (viewer_1.streamToSegmentRunningCount === 0 && viewer_1._threadSTGDIsRunningCount === 0) {\n if (!viewer_1._threadUPVIsRunning) {\n viewer_1._threadPromise = promise;\n viewer_1.debugLog(\"JS_Asyn_Update_View_By_Key_Tt_Start\");\n JS_Asyn_Update_View_By_Key_Tt(viewer_1.viewKey);\n viewer_1._threadUPVIsRunning = true;\n } else {\n viewer_1._threadUPVIsAgain = true;\n }\n clearInterval(timer_5);\n }\n }, 50);\n viewer_1._threadUPVIsPreparing = true;\n }\n } else {\n this.debugLog(\"computeAndUpdateGeometries not updateTt\");\n JS_Asyn_Update_View_By_Key(this.viewKey);\n this.unBufferAndBufferGeometries(isStreamToGeometry, promise, false);\n }\n }\n };\n Viewer.prototype.unBufferAndBufferGeometries = function (isStreamToGeometry, promise, isThread) {\n var unbufferGeomKeys = JS_Show_Asyn_Unbuffer_Geometry_Keys(this.viewKey);\n var filteredGeomKeysUnbuffer = this.filterRepeatKeysUnbuffer(unbufferGeomKeys);\n JS_Asyn_Unbuffer_Geometry_By_Key(this.viewKey, filteredGeomKeysUnbuffer);\n for (var i = 0; i < filteredGeomKeysUnbuffer.length; i++) {\n var key = filteredGeomKeysUnbuffer[i];\n }\n var geomKeys = JS_Show_Asyn_Buffer_Geometry_Keys(this._viewKey);\n var filteredGeomKeys = this.filterRepeatKeysBuffer(geomKeys);\n this.debugLog(\"filteredGeomKeys:\" + filteredGeomKeys.length);\n this.createAndDrawVao(filteredGeomKeys, isStreamToGeometry, promise, isThread);\n };\n Viewer.prototype.createAndDrawVao = function (geomKeys, isStreamToGeometry, promise, isThread) {\n var _this = this;\n if (isStreamToGeometry) {\n this.aysnTaskManager.clearTask(2);\n this.bufferingGeometryCount = 0;\n }\n this.bufferingGeometryCount += geomKeys.length;\n console.log(\"bufferingGeometryCount:\", this.bufferingGeometryCount);\n var count = geomKeys.length;\n var groupCount = 0;\n var group = new Array();\n var _loop_3 = function _loop_3(j) {\n groupCount++;\n group.push(geomKeys[j]);\n if (groupCount === this_3._renderViewPerGroup || j === count - 1) {\n var copyGroup = JSON.parse(JSON.stringify(group));\n groupCount = 0;\n group = new Array();\n this_3._bufferKeyCount += copyGroup.length;\n if (false) {} else {\n var updateInfo_1 = new UpdateInfo(this_3, isThread ? UpdateDisplayType.AsynThreadBufferGeometry : UpdateDisplayType.AsynBufferGeometry);\n this_3.aysnTaskManager.asynTask(function (viewkey, keyList) {\n return tslib_1.__awaiter(_this, void 0, void 0, function () {\n var bufferTaskCount;\n return tslib_1.__generator(this, function (_a) {\n if (this.isBusy || this._threadUPVIsRunning) {\n return [2, false];\n } else {\n JS_Asyn_Buffer_Geometry_By_Key(viewkey, keyList);\n JS_Asyn_Render_View_By_Key(viewkey, false);\n this.bufferingGeometryCount -= keyList.length;\n this.bufferingGeometryCount -= keyList.length;\n promise === null || promise === void 0 ? void 0 : promise.resolve(updateInfo_1);\n updateInfo_1._count++;\n bufferTaskCount = this.aysnTaskManager.getTaskLength(2);\n if (bufferTaskCount === 1) {\n if (this.comAndUpdGeoIsInterrupted) {\n this.comAndUpdGeoIsInterrupted = false;\n this.computeAndUpdateGeometries(false, promise);\n } else {\n console.log(\"bufferingGeometryCount1:\", this.bufferingGeometryCount);\n if (this.bufferingGeometryCount === 0 && this._segmentLoadingCount === 0) {\n console.log(\"draw finish\");\n this.geometryDrawFinish.forEach(function (value) {\n value();\n });\n console.log(\"isGeometryLoading1:\", this.isGeometryLoading);\n this.isGeometryLoading = false;\n console.log(\"isGeometryLoading2:\", this.isGeometryLoading);\n }\n }\n }\n return [2, true];\n }\n return [2];\n });\n });\n }, [this_3.viewKey, copyGroup], 2);\n }\n }\n };\n var this_3 = this;\n for (var j = 0; j < count; j++) {\n _loop_3(j);\n }\n if (count === 0) {\n JS_Asyn_Render_View_By_Key(this._viewKey, false);\n promise === null || promise === void 0 ? void 0 : promise.resolve(new UpdateInfo(this, isThread ? UpdateDisplayType.AsynThreadNoneBufferGeometry : UpdateDisplayType.AsynNoneBufferGeometry));\n }\n };\n Viewer.prototype.decodeMngRun = function () {\n if (this._decodingObjectList.length > 0) {\n this.debugLog(\"decoding\");\n this._decodeManagerIsRunning = true;\n var obj = this._decodingObjectList.pop();\n this.AsynDecodeData(obj);\n for (var i = 0; i < this.process.lzmaManager.workers.length; i++) {\n var worker = this.process.lzmaManager.workers[i];\n if (worker.idle) {\n this.decodeMngRun();\n break;\n }\n }\n } else {\n this.debugLog(\"decode all finish\");\n this._decodeManagerIsRunning = false;\n }\n };\n Viewer.prototype.AsynDecodeData = function (obj) {\n var _this = this;\n var modelId = obj.modelId;\n var version = obj.version;\n var blobData = obj.data;\n var group = obj.groupIds;\n var dictionary = obj.dictionary;\n var dataView = new DataView(blobData);\n this._offset = 0;\n var deCodeCount = 0;\n var count = this.dataViewReadInt32(dataView);\n var idArray = group.split(\",\");\n if (count !== idArray.length) {\n console.log(\"返回的二进制数据的几何个数与几何组长度不一致\");\n this.debugLog(\"next decode\");\n this.decodeMngRun();\n return;\n }\n var idb;\n if (this.isCache) {\n idb = idb_1.default.getInstance(modelId);\n }\n var segKeys = new Array();\n var bytesArray = new Array();\n var _loop_4 = function _loop_4(i) {\n var streamLength = this_4.dataViewReadInt32(dataView);\n var compressFlag = 0;\n if (this_4._geoDataIsCompression) {\n compressFlag = this_4.dataViewReadInt32(dataView);\n }\n var id = idArray[i];\n var segKey = dictionary[id];\n var geoStreamData = blobData.slice(this_4._offset, this_4._offset + streamLength);\n this_4._offset += streamLength;\n JS_Open_Segment_By_Key(segKey);\n {\n JS_Set_One_Heuristic_Option(\"asyn geometry\", \"off\");\n if (compressFlag === 1) {\n this_4.process.lzmaManager.decode(geoStreamData).then(function (outstream) {\n deCodeCount++;\n var data = outstream;\n var bytes = data.toUint8Array();\n bytesArray.push(bytes);\n segKeys.push(segKey);\n if (_this.isCache) {\n idb.set(modelId + \"?v=\" + version + \"_\" + id, bytes);\n }\n if (deCodeCount === count) {\n _this.oneGroupDecodeFinish(segKeys, bytesArray);\n }\n }).catch(function (err) {\n console.log(\"decode error:\", err);\n deCodeCount++;\n if (deCodeCount === count) {\n _this.oneGroupDecodeFinish(segKeys, bytesArray);\n }\n });\n } else if (compressFlag === 0) {\n deCodeCount++;\n var bytes = new Uint8Array(geoStreamData);\n bytesArray.push(bytes);\n segKeys.push(segKey);\n if (this_4.isCache) {\n idb.set(modelId + \"?v=\" + version + \"_\" + id, bytes);\n }\n if (deCodeCount === count) {\n this_4.oneGroupDecodeFinish(segKeys, bytesArray);\n }\n }\n }\n JS_Close_Segment();\n delete this_4._loadingList[segKey];\n this_4._loadingListCount--;\n if (this_4._loadingListCount === 0) {\n console.log(\"获取完全部几何数据\");\n }\n };\n var this_4 = this;\n for (var i = 0; i < count; i++) {\n _loop_4(i);\n }\n };\n Viewer.prototype.checkStreamToGeometryDisable = function () {\n if (!this.isUpdateTt) {\n return this.isBusy;\n } else {\n return this.isBusy || this.threadIsRunning;\n }\n };\n Viewer.prototype.oneGroupDecodeFinish = function (segKeys, bytesArray) {\n var _this = this;\n this.debugLog(\"next decode\");\n this.decodeMngRun();\n var self = this;\n var timer = setInterval(function () {\n if (_this.checkStreamToGeometryDisable()) {} else {\n var allByteLength = 0;\n for (var i = 0; i < bytesArray.length; i++) {\n allByteLength += bytesArray[i].length;\n }\n var geometryGrupData_2 = new Uint8Array(allByteLength);\n _this._currentMemorySize += allByteLength * 3;\n var isFree = _this.ensureCurrentMemorySize();\n if (isFree) {\n var currentOffset = 0;\n for (var i = 0; i < bytesArray.length; i++) {\n geometryGrupData_2.set(bytesArray[i], currentOffset);\n currentOffset += bytesArray[i].length;\n }\n if (_this.isUpdateTt) {\n var timer_6 = setInterval(function () {\n if (!_this._threadUPVIsRunning) {\n _this.debugLog(\"JS_Stream_To_Geometry_Data_By_Keys_Tt_Start\");\n _this._threadSTGDIsRunningCount++;\n JS_Stream_To_Geometry_Data_By_Keys_Tt(segKeys, geometryGrupData_2, _this.viewKey);\n _this._segmentLoadingCount -= segKeys.length;\n clearInterval(timer_6);\n }\n }, 20);\n } else {\n JS_Stream_To_Geometry_Data_By_Keys(segKeys, geometryGrupData_2);\n _this._segmentLoadingCount -= segKeys.length;\n _this.computeAndUpdateGeometries(true, null);\n }\n } else {\n console.log(\"_currentMemorySize is full\");\n }\n clearInterval(timer);\n }\n }, 20);\n };\n Viewer.prototype.filterRepeatKeysBuffer = function (geomKeys) {\n var geomKeysCount = geomKeys.length;\n var filteredGeomKeys = new Array();\n for (var i = 0; i < geomKeysCount; i++) {\n var geomKey = geomKeys[i];\n filteredGeomKeys.push(geomKey);\n }\n return filteredGeomKeys;\n };\n Viewer.prototype.filterRepeatKeysUnbuffer = function (geomKeys) {\n var geomKeysCount = geomKeys.length;\n var filteredGeomKeys = new Array();\n for (var i = 0; i < geomKeysCount; i++) {\n var geomKey = geomKeys[i];\n filteredGeomKeys.push(geomKey);\n }\n return filteredGeomKeys;\n };\n Viewer.prototype.getGslId = function (key) {\n var modelId = null;\n modelId = JS_Show_Property_String(key, \"modelId\");\n if (modelId) {\n return modelId;\n } else {\n var owner_key = JS_Show_Owner_By_Key(key);\n if (owner_key !== -1) {\n return this.getGslId(owner_key);\n } else {\n return null;\n }\n }\n };\n Viewer.prototype.dataViewReadInt32 = function (dataView) {\n var resultInt = dataView.getInt32(this._offset);\n this._offset += 4;\n return resultInt;\n };\n Viewer.prototype.updateDisplayWithFramerate = function (framerate, cullingThreshold) {\n JS_Update_View_Display_With_Framerate_By_Key(this._viewKey, framerate, cullingThreshold);\n };\n Viewer.prototype.updateDisplayWithTime = function (time) {\n JS_Update_View_Display_With_Time_By_Key(this._viewKey, time);\n };\n Object.defineProperty(Viewer.prototype, \"width\", {\n get: function get() {\n return this._width;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"height\", {\n get: function get() {\n return this._height;\n },\n enumerable: false,\n configurable: true\n });\n Viewer.prototype.updateSize = function () {\n var _this = this;\n JS_Make_Context_Current(this._viewKey);\n this.canvas.width = this.container.offsetWidth;\n this.canvas.height = this.container.offsetHeight;\n this._width = this.container.offsetWidth;\n this._height = this.container.offsetHeight;\n this._aspectRatio = this._width / this._height;\n JS_Resize_By_Key(this._viewKey);\n this.updateBackgroundColor();\n JS_Update_View_Display_By_Key(this.viewKey);\n setTimeout(function () {\n _this.updateDocument();\n }, 0);\n };\n Viewer.prototype.updateBackgroundColor = function () {\n if (this._backgroundKey != -1) {\n JS_Open_Segment_By_Key(this._backgroundKey);\n {\n var geoms = JS_Show_Geometry_List();\n if (geoms.length > 0 && JS_Show_Key_Type(geoms[0]) == ObjectType.TYPE_Shell) {\n var aspect_ratio = this._aspectRatio;\n var far = -aspect_ratio * 2 + 1.000001;\n var w = 1.0;\n var h = 1.0;\n if (aspect_ratio > 1) {\n w *= aspect_ratio;\n } else {\n h /= aspect_ratio;\n far = -2 + 1.000001;\n }\n JS_Edit_Shell(geoms[0], [-w, -h, far, w, -h, far, w, h, far, -w, h, far], [4, 0, 1, 2, 3]);\n }\n }\n JS_Close_Segment();\n }\n };\n Object.defineProperty(Viewer.prototype, \"cameraOrientationFixed\", {\n get: function get() {\n return this._cameraOrientationFixed;\n },\n set: function set(val) {\n this._cameraOrientationFixed = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"smoothTransition\", {\n get: function get() {\n return this._smoothTransition;\n },\n set: function set(val) {\n this._smoothTransition = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"smoothTransitionDuration\", {\n get: function get() {\n return this._smoothTransitionDuration;\n },\n set: function set(duration) {\n this._smoothTransitionDuration = duration;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"backgroundColor\", {\n get: function get() {\n var colors;\n JS_Open_Segment_By_Key(this._viewKey);\n {\n colors = JS_Show_Color_By_Value(\"background\");\n }\n JS_Close_Segment();\n return colors;\n },\n set: function set(val) {\n if (val) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n if (val.length == 3) {\n if (this._backgroundKey != -1) {\n JS_Delete_By_Key(this._backgroundKey);\n this._backgroundKey = -1;\n }\n JS_Set_Color(\"background=(r=\" + (val[0] / 255.0).toFixed(2) + \",g=\" + (val[1] / 255.0).toFixed(2) + \",b=\" + (val[2] / 255.0).toFixed(2) + \")\");\n } else if (val.length == 4) {\n if (this._backgroundKey != -1) {\n JS_Delete_By_Key(this._backgroundKey);\n this._backgroundKey = -1;\n }\n JS_Set_Color(\"background=(r=\" + (val[0] / 255.0).toFixed(2) + \",g=\" + (val[1] / 255.0).toFixed(2) + \",b=\" + (val[2] / 255.0).toFixed(2) + \",a=\" + val[3].toFixed(2) + \")\");\n } else if (val.length == 6 || val.length == 12) {\n JS_Set_Color(\"background=(r=1.0,g=1.0,b=1.0,a=1.0)\");\n JS_Open_Segment_By_Key(this._viewKey);\n {\n if (this._backgroundKey != -1) {\n JS_Clear_All_By_Key(this._backgroundKey);\n }\n this._backgroundKey = JS_Open_Segment(\"background\");\n {\n JS_Set_Camera([0, 0, 1], [0, 0, 0], [0, 1, 0], 2.0, 2.0, \"orthographic\");\n JS_Set_Camera_Extent(-1, 1);\n JS_Set_ModellingMatrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n JS_Set_Visibility(\"lights=off\");\n JS_Set_Rendering_Options(\"sync update=on\");\n JS_Set_Heuristic_Options(\"exclude bounding=on,exclude segment bounding=on\");\n var aspect_ratio = this._aspectRatio;\n var far = -aspect_ratio * 2 + 1.000001;\n var w = 1.0;\n var h = 1.0;\n if (aspect_ratio > 1) {\n w *= aspect_ratio;\n } else {\n h /= aspect_ratio;\n far = -2 + 1.000001;\n }\n var shellKey = JS_Insert_Shell([-w, -h, far, w, -h, far, w, h, far, -w, h, far], [4, 0, 1, 2, 3]);\n if (val.length == 6) {\n var br = val[0] / 255.0;\n var bg = val[1] / 255.0;\n var bb = val[2] / 255.0;\n var ba = 1.0;\n var tr = val[3] / 255.0;\n var tg = val[4] / 255.0;\n var tb = val[5] / 255.0;\n var ta = 1.0;\n JS_Set_Geometry_Color_By_Value(shellKey, \"face\", 0, [br, bg, bb, ba, br, bg, bb, ba, tr, tg, tb, ta, tr, tg, tb, ta]);\n } else {\n var vals = Array(16);\n for (var i = 0; i < 4; i++) {\n vals[i * 4] = val[i * 3] / 255.0;\n vals[i * 4 + 1] = val[i * 3 + 1] / 255.0;\n vals[i * 4 + 2] = val[i * 3 + 2] / 255.0;\n vals[i * 4 + 3] = 1.0;\n }\n JS_Set_Geometry_Color_By_Value(shellKey, \"face\", 0, vals);\n }\n }\n JS_Close_Segment();\n }\n JS_Close_Segment();\n }\n JS_Update_View_Display_By_Key(this._viewKey);\n this.updateDisplay();\n }\n JS_Close_Segment();\n }\n },\n enumerable: false,\n configurable: true\n });\n Viewer.prototype.imagePathToImageData = function (path) {\n var canvas = document.createElement(\"canvas\");\n var img = document.createElement(\"img\");\n var context = canvas.getContext(\"2d\");\n return new Promise(function (resolve) {\n img.src = path;\n img.crossOrigin = \"*\";\n img.onload = function (e) {\n canvas.width = img.width;\n canvas.height = img.height;\n context.drawImage(img, 0, 0, img.width, img.height);\n var image = context.getImageData(0, 0, img.width, img.height);\n resolve(image);\n };\n });\n };\n Object.defineProperty(Viewer.prototype, \"backgroundImage\", {\n set: function set(imageSrc) {\n var _this = this;\n this.imagePathToImageData(imageSrc).then(function (image) {\n JS_Open_Segment_By_Key(_this._viewKey);\n {\n JS_Set_Color(\"background=(r=1.0,g=1.0,b=1.0,a=1.0)\");\n if (_this._backgroundKey != -1) {\n JS_Clear_All_By_Key(_this._backgroundKey);\n }\n _this._backgroundKey = JS_Open_Segment(\"background\");\n {\n JS_Set_Camera([0, 0, 1], [0, 0, 0], [0, 1, 0], 2.0, 2.0, \"orthographic\");\n JS_Set_Camera_Extent(-1, 1);\n JS_Set_ModellingMatrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n JS_Set_Visibility(\"lights=off\");\n JS_Set_Rendering_Options(\"sync update=on\");\n JS_Set_Heuristic_Options(\"exclude bounding=on,exclude segment bounding=on\");\n var aspect_ratio = _this._aspectRatio;\n var far = -aspect_ratio * 2 + 1.000001;\n var w = 1.0;\n var h = 1.0;\n if (aspect_ratio > 1) {\n w *= aspect_ratio;\n } else {\n h /= aspect_ratio;\n far = -2 + 1.000001;\n }\n var shellKey = JS_Insert_Shell([-w, -h, far, w, -h, far, w, h, far, -w, h, far], [4, 0, 1, 2, 3]);\n JS_Set_Geometry_Texture_Coords(shellKey, 0, 4, [0, 0, 1, 0, 1, 1, 0, 1]);\n JS_Insert_Image(0, 0, 0, image.width, image.height, image.data, \"name='background',local,format=rgba\");\n JS_Set_Color(\"face diffuse='background'\");\n }\n JS_Close_Segment();\n }\n JS_Close_Segment();\n JS_Update_View_Display_By_Key(_this._viewKey);\n JS_Update_View_Display_By_Key(_this._viewKey);\n _this.updateDisplay();\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"selectionTolerance\", {\n get: function get() {\n var result = 0.0;\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var option = JS_Show_One_Driver_Option(\"selection tolerance\");\n result = parseFloat(option);\n }\n JS_Close_Segment();\n }\n return result;\n },\n set: function set(value) {\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n JS_Set_Driver_Options(\"selection tolerance=\" + value.toString());\n }\n JS_Close_Segment();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"collisionTolerance\", {\n get: function get() {\n var result = 0.0;\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var option = JS_Show_One_Driver_Option(\"collision tolerance\");\n result = parseFloat(option);\n }\n JS_Close_Segment();\n }\n return result;\n },\n set: function set(value) {\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n JS_Set_Driver_Options(\"collision tolerance=\" + value.toString());\n }\n JS_Close_Segment();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"softCollisionDistance\", {\n get: function get() {\n var result = 0.0;\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var option = JS_Show_One_Driver_Option(\"soft collision distance\");\n result = parseFloat(option);\n }\n JS_Close_Segment();\n }\n return result;\n },\n set: function set(value) {\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n JS_Set_Driver_Options(\"soft collision distance=\" + value.toString());\n }\n JS_Close_Segment();\n }\n },\n enumerable: false,\n configurable: true\n });\n Viewer.prototype.exeSceneCameraChanging = function (type) {\n var self = this;\n this.updateCameraNearFar();\n this.sceneCameraChanging.forEach(function (value) {\n value(self, type);\n });\n };\n Viewer.prototype.exeSceneCameraChanged = function (type) {\n var self = this;\n this.sceneCameraChanged.forEach(function (value) {\n value(self, type);\n });\n this.updateDocument();\n };\n Viewer.prototype.updateDocument = function () {\n this.documentChanged.forEach(function (value) {\n value(self);\n });\n };\n Viewer.prototype.updateCameraNearFar = function () {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n var camera = JS_Show_Camera();\n if (camera.projection === \"perspective\") {\n var bb = void 0;\n if (this.process && this.process.renderObject) {\n var model = this.process.renderObject;\n if (model && model.properties && model.properties.boundingBox) {\n bb = model.properties.boundingBox;\n var bb2 = JS_Compute_Boundingbox_By_Key(this.sceneKey);\n gs_math_1.BoundingBox.extend(bb, bb2);\n } else {\n bb = JS_Compute_Boundingbox_By_Key(this.sceneKey);\n }\n } else {\n bb = JS_Compute_Boundingbox_By_Key(this.sceneKey);\n }\n var min = new Float64Array([bb[0], bb[1], bb[2]]);\n var max = new Float64Array([bb[3], bb[4], bb[5]]);\n (0, utility_1.CalculateNearFar)(camera, min, max);\n }\n }\n JS_Close_Segment();\n };\n Viewer.prototype.internalFitWorld = function (type) {\n if (this._sceneKey != -1) {\n var center = new Float32Array(3);\n var min = new Float32Array(3);\n var max = new Float32Array(3);\n if (type) {\n var bb = JS_Compute_Boundingbox_With_Visibility_By_Key(this._sceneKey, ElementType.ELEMENT_TYPE_Face);\n min[0] = bb[0];\n min[1] = bb[1];\n min[2] = bb[2];\n max[0] = bb[3];\n max[1] = bb[4];\n max[2] = bb[5];\n } else {\n var bb = JS_Compute_Boundingbox_By_Key(this._sceneKey);\n min[0] = bb[0];\n min[1] = bb[1];\n min[2] = bb[2];\n max[0] = bb[3];\n max[1] = bb[4];\n max[2] = bb[5];\n }\n if (max[0] > min[0] || max[1] > min[1] || max[2] > min[2]) {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n var diagonalVector = gs_math_1.Point.subtract(max, min);\n var diagonalLength = gs_math_1.Vector.module(diagonalVector);\n center[0] = 0.5 * (min[0] + max[0]);\n center[1] = 0.5 * (min[1] + max[1]);\n center[2] = 0.5 * (min[2] + max[2]);\n var camera = JS_Show_Camera();\n var new_position = null;\n var new_target = new Float64Array(center);\n var new_width = 2.0;\n var new_height = 2.0;\n var viewingVector = gs_math_1.DPoint.subtract(camera.position, camera.target);\n gs_math_1.DVector.normalize(viewingVector);\n if (diagonalLength != 0) {\n new_position = new Float64Array(3);\n new_position[0] = center[0] + 2.5 * viewingVector[0] * diagonalLength;\n new_position[1] = center[1] + 2.5 * viewingVector[1] * diagonalLength;\n new_position[2] = center[2] + 2.5 * viewingVector[2] * diagonalLength;\n new_width = diagonalLength;\n new_height = diagonalLength;\n } else {\n new_position = camera.pos;\n new_width = camera.width;\n new_height = camera.height;\n }\n var maxZoomLevel = this.zoomLimit;\n if (new_width < maxZoomLevel) {\n new_width = maxZoomLevel;\n }\n if (new_height < maxZoomLevel) {\n new_height = maxZoomLevel;\n }\n if (camera.projection == \"perspective\") {\n new_width *= 2.0;\n new_height *= 2.0;\n }\n JS_Set_Camera(new_position, new_target, camera.up, new_width, new_height, camera.projection);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {\n JS_Keep_Camera_Ratio(1);\n JS_Set_Camera_Extent(1, diagonalLength * 10);\n }\n }\n JS_Close_Segment();\n }\n }\n };\n Viewer.prototype.internalFitWorldByBB = function (bb) {\n if (this._sceneKey != -1) {\n var center = new Float32Array(3);\n var min = new Float32Array(3);\n var max = new Float32Array(3);\n min[0] = bb[0];\n min[1] = bb[1];\n min[2] = bb[2];\n max[0] = bb[3];\n max[1] = bb[4];\n max[2] = bb[5];\n if (max[0] > min[0] || max[1] > min[1] || max[2] > min[2]) {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n var diagonalVector = gs_math_1.Point.subtract(max, min);\n var diagonalLength = gs_math_1.Vector.module(diagonalVector);\n center[0] = 0.5 * (min[0] + max[0]);\n center[1] = 0.5 * (min[1] + max[1]);\n center[2] = 0.5 * (min[2] + max[2]);\n var camera = JS_Show_Camera();\n var new_position = null;\n var new_target = new Float64Array(center);\n var new_width = 2.0;\n var new_height = 2.0;\n var viewingVector = gs_math_1.DPoint.subtract(camera.position, camera.target);\n gs_math_1.DVector.normalize(viewingVector);\n if (diagonalLength != 0) {\n new_position = new Float64Array(3);\n new_position[0] = center[0] + 2.5 * viewingVector[0] * diagonalLength;\n new_position[1] = center[1] + 2.5 * viewingVector[1] * diagonalLength;\n new_position[2] = center[2] + 2.5 * viewingVector[2] * diagonalLength;\n new_width = diagonalLength;\n new_height = diagonalLength;\n } else {\n new_position = camera.pos;\n new_width = camera.width;\n new_height = camera.height;\n }\n var maxZoomLevel = this.zoomLimit;\n if (new_width < maxZoomLevel) {\n new_width = maxZoomLevel;\n }\n if (new_height < maxZoomLevel) {\n new_height = maxZoomLevel;\n }\n if (camera.projection == \"perspective\") {\n new_width *= 2.0;\n new_height *= 2.0;\n }\n JS_Set_Camera(new_position, new_target, camera.up, new_width, new_height, camera.projection);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {\n JS_Keep_Camera_Ratio(1);\n JS_Set_Camera_Extent(1, diagonalLength * 10);\n }\n }\n JS_Close_Segment();\n }\n }\n };\n Viewer.prototype.fitWorld = function (type) {\n if (this._sceneKey != -1) {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n var camera = JS_Show_Camera();\n var co = camera.position;\n var to = camera.target;\n var uo = camera.up;\n var widtho = camera.width;\n var heighto = camera.height;\n this.internalFitWorld(type);\n if (this._smoothTransition) {\n var camera_1 = JS_Show_Camera();\n var cn = camera_1.position;\n var tn = camera_1.target;\n var un = camera_1.up;\n var widthn = camera_1.width;\n var heightn = camera_1.height;\n GsWebGLUtility.smoothTransitionD(co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, this);\n } else {\n var viewer = this;\n this.exeSceneCameraChanging(CameraChangeType.Rotate);\n this.updateDisplay();\n this.exeSceneCameraChanged(CameraChangeType.Rotate);\n }\n }\n JS_Close_Segment();\n }\n };\n Viewer.prototype.locateWorld = function (key) {\n if (this._sceneKey != -1) {\n var center = new Float32Array(3);\n var min = new Float32Array(3);\n var max = new Float32Array(3);\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n var bb = JS_Compute_View_Boundingbox_By_Key(this._viewKey, key);\n if (bb[0] === 1 && bb[1] === 1 && bb[2] === 1 && bb[3] === -1 && bb[4] === -1 && bb[5] === -1) {\n console.log(\"boundingBox为-1---1\");\n } else {\n min[0] = bb[0];\n min[1] = bb[1];\n min[2] = bb[2];\n max[0] = bb[3];\n max[1] = bb[4];\n max[2] = bb[5];\n if (min[0] > max[0]) {\n var tmp = void 0;\n tmp = min[0];\n min[0] = max[0];\n max[0] = tmp;\n }\n if (min[1] > max[1]) {\n var tmp = void 0;\n tmp = min[1];\n min[1] = max[1];\n max[1] = tmp;\n }\n if (min[2] > max[2]) {\n var tmp = void 0;\n tmp = min[2];\n min[2] = max[2];\n max[2] = tmp;\n }\n var diagonalVector = new Float32Array([max[0] - min[0], max[1] - min[1], max[2] - min[2]]);\n var diagonalLength = gs_math_1.Vector.module(diagonalVector);\n center[0] = 0.5 * (min[0] + max[0]);\n center[1] = 0.5 * (min[1] + max[1]);\n center[2] = 0.5 * (min[2] + max[2]);\n var camera = JS_Show_Camera();\n var co = camera.position;\n var to = camera.target;\n var uo = camera.up;\n var widtho = camera.width;\n var heighto = camera.height;\n var cn = new Float64Array(3);\n var tn = new Float64Array(3);\n var un = new Float64Array(3);\n var widthn = void 0,\n heightn = void 0;\n if (diagonalLength != 0) {\n tn[0] = center[0];\n tn[1] = center[1];\n tn[2] = center[2];\n var viewingVector = new Float64Array([co[0] - to[0], co[1] - to[1], co[2] - to[2]]);\n gs_math_1.DVector.normalize(viewingVector);\n cn[0] = center[0] + 2.5 * viewingVector[0] * diagonalLength;\n cn[1] = center[1] + 2.5 * viewingVector[1] * diagonalLength;\n cn[2] = center[2] + 2.5 * viewingVector[2] * diagonalLength;\n widthn = diagonalLength;\n heightn = diagonalLength;\n un = uo;\n } else {\n tn[0] = center[0];\n tn[1] = center[1];\n tn[2] = center[2];\n cn = co;\n un = uo;\n widthn = widtho;\n heightn = heighto;\n }\n var maxZoomLevel = this.zoomLimit;\n if (widthn < maxZoomLevel) {\n widthn = maxZoomLevel;\n }\n if (heightn < maxZoomLevel) {\n heightn = maxZoomLevel;\n }\n if (camera.projection == \"perspective\") {\n widthn *= 2.0;\n heightn *= 2.0;\n }\n JS_Set_Camera(cn, tn, un, widthn, heightn, camera.projection);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n if (this._smoothTransition) {\n var camera_2 = JS_Show_Camera();\n cn = camera_2.position;\n tn = camera_2.target;\n un = camera_2.up;\n widthn = camera_2.width;\n heightn = camera_2.height;\n GsWebGLUtility.smoothTransitionD(co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, this);\n }\n }\n }\n JS_Close_Segment();\n }\n };\n Viewer.prototype.locateWorldByData = function (target, min, max) {\n if (this._sceneKey != -1) {\n var center = new Float32Array(3);\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n if (min[0] > max[0]) {\n var tmp = void 0;\n tmp = min[0];\n min[0] = max[0];\n max[0] = tmp;\n }\n if (min[1] > max[1]) {\n var tmp = void 0;\n tmp = min[1];\n min[1] = max[1];\n max[1] = tmp;\n }\n if (min[2] > max[2]) {\n var tmp = void 0;\n tmp = min[2];\n min[2] = max[2];\n max[2] = tmp;\n }\n var diagonalVector = new Float32Array([max[0] - min[0], max[1] - min[1], max[2] - min[2]]);\n var diagonalLength = gs_math_1.Vector.module(diagonalVector);\n center[0] = 0.5 * (min[0] + max[0]);\n center[1] = 0.5 * (min[1] + max[1]);\n center[2] = 0.5 * (min[2] + max[2]);\n var offset = new Float32Array([target[0] - center[0], target[1] - center[1], target[2] - center[2]]);\n center = target;\n diagonalLength += gs_math_1.Vector.module(offset);\n var camera = JS_Show_Camera();\n var co = camera.position;\n var to = camera.target;\n var uo = camera.up;\n var widtho = camera.width;\n var heighto = camera.height;\n var cn = new Float64Array(3);\n var tn = new Float64Array(3);\n var un = new Float64Array(3);\n var widthn = void 0,\n heightn = void 0;\n if (diagonalLength != 0) {\n tn[0] = center[0];\n tn[1] = center[1];\n tn[2] = center[2];\n var viewingVector = new Float64Array([co[0] - to[0], co[1] - to[1], co[2] - to[2]]);\n gs_math_1.DVector.normalize(viewingVector);\n cn[0] = center[0] + 2.5 * viewingVector[0] * diagonalLength;\n cn[1] = center[1] + 2.5 * viewingVector[1] * diagonalLength;\n cn[2] = center[2] + 2.5 * viewingVector[2] * diagonalLength;\n widthn = diagonalLength;\n heightn = diagonalLength;\n un = uo;\n } else {\n tn[0] = center[0];\n tn[1] = center[1];\n tn[2] = center[2];\n cn = co;\n un = uo;\n widthn = widtho;\n heightn = heighto;\n }\n var maxZoomLevel = this.zoomLimit;\n if (widthn < maxZoomLevel) {\n widthn = maxZoomLevel;\n }\n if (heightn < maxZoomLevel) {\n heightn = maxZoomLevel;\n }\n JS_Set_Camera(cn, tn, un, widthn, heightn, camera.projection);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {\n JS_Keep_Camera_Ratio(2.0);\n }\n this.exeSceneCameraChanging(CameraChangeType.Rotate);\n if (this._smoothTransition) {\n var camera_3 = JS_Show_Camera();\n cn = camera_3.position;\n tn = camera_3.target;\n un = camera_3.up;\n widthn = camera_3.width;\n heightn = camera_3.height;\n GsWebGLUtility.smoothTransitionD(co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, this);\n }\n }\n JS_Close_Segment();\n }\n };\n Viewer.prototype.setViewMode = function (mode, fitWorld, bb) {\n if (this._cameraOrientationFixed) {\n return;\n }\n var camera;\n var co;\n var to;\n var uo;\n var widtho;\n var heighto;\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n camera = JS_Show_Camera();\n co = camera.position;\n to = camera.target;\n uo = camera.up;\n widtho = camera.width;\n heighto = camera.height;\n if (fitWorld) {\n if (bb) {\n this.internalFitWorldByBB(bb);\n } else {\n this.internalFitWorld();\n }\n }\n camera = JS_Show_Camera();\n var target = camera.target;\n var position = camera.position;\n var view = gs_math_1.DPoint.subtract(position, target);\n var length = gs_math_1.DVector.module(view);\n switch (mode) {\n case ViewMode.XY:\n {\n position[0] = target[0];\n position[1] = target[1];\n position[2] = target[2] + length;\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 1.0, 0.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.YX:\n {\n position[0] = target[0];\n position[1] = target[1];\n position[2] = target[2] - length;\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 1.0, 0.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.XZ:\n {\n position[0] = target[0];\n position[1] = target[1] - length;\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.ZX:\n {\n position[0] = target[0];\n position[1] = target[1] + length;\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.YZ:\n {\n position[0] = target[0] + length;\n position[1] = target[1];\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.ZY:\n {\n position[0] = target[0] - length;\n position[1] = target[1];\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.Iso:\n {\n var newLen = length * 0.5774;\n position[0] = target[0] + newLen;\n position[1] = target[1] - newLen;\n position[2] = target[2] + newLen;\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.YUpIso:\n {\n var newLen = length * 0.5774;\n position[0] = target[0] + newLen;\n position[1] = target[1] + newLen;\n position[2] = target[2] + newLen;\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.EN:\n {\n position[0] = target[0] - length / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0);\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.NW:\n {\n position[0] = target[0] + length / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0);\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.WS:\n {\n position[0] = target[0] + length / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0);\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.SE:\n {\n position[0] = target[0] - length / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0);\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopE:\n {\n position[0] = target[0] - length / Math.sqrt(2.0);\n position[1] = target[1];\n position[2] = target[2] + length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomE:\n {\n position[0] = target[0] - length / Math.sqrt(2.0);\n position[1] = target[1];\n position[2] = target[2] - length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopN:\n {\n position[0] = target[0];\n position[1] = target[1] + length / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomN:\n {\n position[0] = target[0];\n position[1] = target[1] + length / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopW:\n {\n position[0] = target[0] + length / Math.sqrt(2.0);\n position[1] = target[1];\n position[2] = target[2] + length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomW:\n {\n position[0] = target[0] + length / Math.sqrt(2.0);\n position[1] = target[1];\n position[2] = target[2] - length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopS:\n {\n position[0] = target[0];\n position[1] = target[1] - length / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomS:\n {\n position[0] = target[0];\n position[1] = target[1] - length / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopEN:\n {\n position[0] = target[0] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomEN:\n {\n position[0] = target[0] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopNW:\n {\n position[0] = target[0] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomNW:\n {\n position[0] = target[0] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopWS:\n {\n position[0] = target[0] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomWS:\n {\n position[0] = target[0] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopSE:\n {\n position[0] = target[0] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomSE:\n {\n position[0] = target[0] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n default:\n break;\n }\n }\n JS_Close_Segment();\n if (this._smoothTransition) {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n camera = JS_Show_Camera();\n }\n JS_Close_Segment();\n var cn = camera.position;\n var tn = camera.target;\n var un = camera.up;\n var widthn = camera.width;\n var heightn = camera.height;\n GsWebGLUtility.smoothTransitionD(co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, this);\n } else {\n var viewer = this;\n this.exeSceneCameraChanging(CameraChangeType.Rotate | CameraChangeType.Scale);\n viewer.updateDisplay();\n this.exeSceneCameraChanged(CameraChangeType.Rotate | CameraChangeType.Scale);\n }\n };\n Viewer.prototype.setSceneCamera = function (positin, target, up, width, height) {\n var camera;\n var co;\n var to;\n var uo;\n var widtho;\n var heighto;\n var proj;\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n camera = JS_Show_Camera();\n co = camera.position;\n to = camera.target;\n uo = camera.up;\n widtho = camera.width;\n heighto = camera.height;\n proj = camera.projection;\n }\n JS_Close_Segment();\n if (this._smoothTransition) {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n if (width && height) {\n JS_Set_Camera(positin, target, up, width, height, proj);\n } else {\n JS_Set_Camera(positin, target, up, widtho, heighto, proj);\n }\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n camera = JS_Show_Camera();\n }\n JS_Close_Segment();\n var cn = camera.position;\n var tn = camera.target;\n var un = camera.up;\n var widthn = camera.width;\n var heightn = camera.height;\n GsWebGLUtility.smoothTransitionD(co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, this);\n } else {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n if (width && height) {\n JS_Set_Camera(positin, target, up, width, height, proj);\n } else {\n JS_Set_Camera(positin, target, up, widtho, heighto, proj);\n }\n if (proj == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else {}\n camera = JS_Show_Camera();\n }\n JS_Close_Segment();\n var viewer = this;\n this.exeSceneCameraChanging(CameraChangeType.Rotate | CameraChangeType.Scale);\n viewer.updateDisplay();\n }\n };\n Viewer.prototype.convertCoordinate = function (in_coords, out_coords, in_pos) {\n return JS_Compute_Coordinates_By_Key(this._sceneKey, CoordinateSystem[in_coords].toLowerCase(), in_pos, CoordinateSystem[out_coords].toLowerCase());\n };\n Viewer.prototype.convertDCoordinate = function (in_coords, out_coords, in_pos) {\n return JS_DCompute_Coordinates_By_Key(this._sceneKey, CoordinateSystem[in_coords].toLowerCase(), in_pos, CoordinateSystem[out_coords].toLowerCase());\n };\n Viewer.prototype.selectPositionByPoint = function (winPos) {\n var count = JS_Compute_Selection_By_Key(this._viewKey, this._sceneKey, winPos[0], winPos[1]);\n if (count > 0) {\n var selectedPos = null;\n for (var i = 0; i < count; i++) {\n if (selectedPos == null) {\n selectedPos = JS_Show_Selection_Position(i);\n } else {\n var newPos = JS_Show_Selection_Position(i);\n if (newPos[2] < selectedPos[2]) {\n selectedPos = newPos;\n }\n }\n }\n return selectedPos;\n }\n return null;\n };\n Viewer.prototype.computePerspectiveNearWorldPos = function (pixel) {\n var camera = null;\n var extent = null;\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n camera = JS_Show_Camera();\n extent = JS_Show_Camera_Extent();\n }\n JS_Close_Segment();\n if (camera.projection == \"perspective\") {\n var cameraPosition = camera.position;\n var cameraTarget = camera.target;\n var cameraUp = camera.up;\n var cameraView = gs_math_1.DPoint.subtract(cameraPosition, cameraTarget);\n gs_math_1.DVector.normalize(cameraView);\n var xAxis = gs_math_1.DVector.cross(cameraUp, cameraView);\n gs_math_1.DVector.reverse(cameraView);\n var wcs = new gs_math_1.DWcs(gs_math_1.DGeometryOperators.distancePoint(cameraPosition, cameraView, extent[0]), xAxis, cameraUp);\n var lenPerPixel = 2 * Math.tan(Math.PI / 12) * extent[0] / this.height;\n var pixelPos = new Float64Array(3);\n pixelPos[0] = pixel[0] - this.width / 2;\n pixelPos[1] = this.height / 2 - pixel[1];\n pixelPos[2] = 0;\n var localWorldPos = new Float64Array([pixelPos[0] * lenPerPixel, pixelPos[1] * lenPerPixel, pixelPos[2]]);\n var worldPos = wcs.toModelPoint(localWorldPos);\n return worldPos;\n }\n return null;\n };\n Viewer.prototype.computeNearPlaneWorldPos = function (pixel) {\n var camera = null;\n var extent = null;\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n camera = JS_Show_Camera();\n extent = JS_Show_Camera_Extent();\n }\n JS_Close_Segment();\n if (camera.projection == \"orthographic\") {\n var out_pos = JS_Compute_Coordinates_By_Key(this._sceneKey, \"pixels\", pixel, \"world\");\n var pos = new Float64Array(out_pos);\n var cameraPosition = camera.position;\n var cameraTarget = camera.target;\n var direct = gs_math_1.DPoint.subtract(cameraPosition, cameraTarget);\n gs_math_1.DVector.normalize(direct);\n return gs_math_1.DGeometryOperators.projectPointToPlane(pos, cameraPosition, direct);\n } else if (camera.projection == \"perspective\") {\n var cameraPosition = camera.position;\n var cameraTarget = camera.target;\n var cameraUp = camera.up;\n var cameraView = gs_math_1.DPoint.subtract(cameraPosition, cameraTarget);\n gs_math_1.DVector.normalize(cameraView);\n var xAxis = gs_math_1.DVector.cross(cameraUp, cameraView);\n gs_math_1.DVector.reverse(cameraView);\n var wcs = new gs_math_1.DWcs(gs_math_1.DGeometryOperators.distancePoint(cameraPosition, cameraView, extent[0]), xAxis, cameraUp);\n var lenPerPixel = 2 * Math.tan(Math.PI / 12) * extent[0] / this.height;\n var pixelPos = new Float64Array(3);\n pixelPos[0] = pixel[0] - this.width / 2;\n pixelPos[1] = this.height / 2 - pixel[1];\n pixelPos[2] = 0;\n var localWorldPos = new Float64Array([pixelPos[0] * lenPerPixel, pixelPos[1] * lenPerPixel, pixelPos[2]]);\n var worldPos = wcs.toModelPoint(localWorldPos);\n return worldPos;\n }\n return null;\n };\n return Viewer;\n }();\n exports.Viewer = Viewer;\n var ThreadPromise = function () {\n function ThreadPromise(event) {\n this._resolve = null;\n this._reject = null;\n this._event = null;\n if (event) {\n this._event = event;\n }\n }\n ThreadPromise.prototype.then = function (resolve, reject) {\n this._resolve = resolve;\n this._reject = reject;\n if (this._event) {\n this._event(this._resolve, this._reject);\n }\n };\n ThreadPromise.prototype.resolve = function (value) {\n if (this._resolve) {\n this._resolve(value);\n }\n };\n ThreadPromise.prototype.reject = function (reason) {\n if (this._reject) {\n this._reject(reason);\n }\n };\n return ThreadPromise;\n }();\n exports.ThreadPromise = ThreadPromise;\n var UpdateDisplayType;\n (function (UpdateDisplayType) {\n UpdateDisplayType[UpdateDisplayType[\"Synchronization\"] = 0] = \"Synchronization\";\n UpdateDisplayType[UpdateDisplayType[\"Busy\"] = 1] = \"Busy\";\n UpdateDisplayType[UpdateDisplayType[\"AsynBufferGeometry\"] = 2] = \"AsynBufferGeometry\";\n UpdateDisplayType[UpdateDisplayType[\"AsynNoneBufferGeometry\"] = 3] = \"AsynNoneBufferGeometry\";\n UpdateDisplayType[UpdateDisplayType[\"AsynThreadBufferGeometry\"] = 4] = \"AsynThreadBufferGeometry\";\n UpdateDisplayType[UpdateDisplayType[\"AsynThreadNoneBufferGeometry\"] = 5] = \"AsynThreadNoneBufferGeometry\";\n })(UpdateDisplayType = exports.UpdateDisplayType || (exports.UpdateDisplayType = {}));\n var UpdateInfo = function () {\n function UpdateInfo(viewer, type) {\n this._count = 0;\n this._viewer = viewer;\n this._type = type;\n }\n Object.defineProperty(UpdateInfo.prototype, \"viewer\", {\n get: function get() {\n return this._viewer;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(UpdateInfo.prototype, \"type\", {\n get: function get() {\n return this._type;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(UpdateInfo.prototype, \"count\", {\n get: function get() {\n return this._count;\n },\n enumerable: false,\n configurable: true\n });\n return UpdateInfo;\n }();\n exports.UpdateInfo = UpdateInfo;\n var ViewerEvent = function () {\n function ViewerEvent(viewer, e) {\n this.viewer = viewer;\n this.uiEvent = e;\n }\n ViewerEvent.prototype.mouseEvent = function () {\n return this.uiEvent;\n };\n ViewerEvent.prototype.wheelEvent = function () {\n return this.uiEvent;\n };\n ViewerEvent.prototype.touchEvent = function () {\n return this.uiEvent;\n };\n ViewerEvent.prototype.mousePixelPos = function () {\n var mouseEvent = this.mouseEvent();\n return new Float32Array([mouseEvent.offsetX, mouseEvent.offsetY, 0]);\n };\n ViewerEvent.prototype.mouseWorldPos = function () {\n var mouseEvent = this.mouseEvent();\n var pixelPos = [mouseEvent.offsetX, mouseEvent.offsetY, -1];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.mouseFarWorldPos = function () {\n var mouseEvent = this.mouseEvent();\n var pixelPos = [mouseEvent.offsetX, mouseEvent.offsetY, 1];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.mouseZWorldPos = function (z) {\n var mouseEvent = this.mouseEvent();\n var pixelPos = [mouseEvent.offsetX, mouseEvent.offsetY, z];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.mouseWorldRay = function () {\n var ray = null;\n JS_Open_Segment_By_Key(this.viewer.sceneKey);\n {\n var camera = JS_Show_Camera();\n if (camera.projection == \"orthographic\") {\n ray = gs_math_1.Point.subtract(camera.target, camera.position);\n gs_math_1.Vector.normalize(ray);\n } else if (camera.projection == \"perspective\") {\n var mouseEvent = this.mouseEvent();\n var pixelPos = new Float32Array([mouseEvent.offsetX, mouseEvent.offsetY, -1]);\n var nearPos = this.viewer.computePerspectiveNearWorldPos(pixelPos);\n ray = gs_math_1.DPoint.subtract(nearPos, camera.position);\n gs_math_1.DVector.normalize(ray);\n return new Float32Array(ray);\n }\n }\n JS_Close_Segment();\n return ray;\n };\n ViewerEvent.prototype.mouseViewpointPos = function () {\n return new Float32Array([0, 0, 0]);\n };\n ViewerEvent.prototype.mouseWindowPos = function () {\n var mouseEvent = this.mouseEvent();\n var pixelPos = [mouseEvent.offsetX, mouseEvent.offsetY, -1];\n var windowPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"window\");\n return windowPos;\n };\n ViewerEvent.prototype.mouseUnitWindowPos = function () {\n var viewer = this.viewer;\n var mouseEvent = this.mouseEvent();\n var pixelPos = [mouseEvent.offsetX, mouseEvent.offsetY, -1];\n var windowPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"window\");\n var x = windowPos[0];\n var y = windowPos[1];\n if (viewer.aspectRatio > 1) {\n x *= viewer.aspectRatio;\n } else if (viewer.aspectRatio < 1) {\n y /= viewer.aspectRatio;\n }\n return new Float32Array([x, y, 0]);\n };\n ViewerEvent.prototype.getElementPos = function (element) {\n var actualTop = element.offsetTop;\n var actualLeft = element.offsetLeft;\n var current = element.offsetParent;\n while (current !== null) {\n actualTop += current.offsetTop;\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n return {\n top: actualTop,\n left: actualLeft\n };\n };\n ViewerEvent.prototype.touchWorldPos = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[0].clientX - left, touchEvent.touches[0].clientY - top, -1];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.touchWorldPos1 = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[1].clientX - left, touchEvent.touches[1].clientY - top, -1];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.touchWorldPos2 = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[2].clientX - left, touchEvent.touches[2].clientY - top, -1];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.touchWindowPos = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[0].clientX - left, touchEvent.touches[0].clientY - top, -1];\n var windowPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"window\");\n return windowPos;\n };\n ViewerEvent.prototype.touchWindowPos1 = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[1].clientX - left, touchEvent.touches[1].clientY - top, -1];\n var windowPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"window\");\n return windowPos;\n };\n ViewerEvent.prototype.touchUnitWindowPos = function () {\n var viewer = this.viewer;\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[0].clientX - left, touchEvent.touches[0].clientY - top, -1];\n var windowPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"window\");\n var x = windowPos[0];\n var y = windowPos[1];\n if (viewer.aspectRatio > 1) {\n x *= viewer.aspectRatio;\n } else if (viewer.aspectRatio < 1) {\n y /= viewer.aspectRatio;\n }\n return new Float32Array([x, y, 0]);\n };\n ViewerEvent.prototype.touchPixelPos = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n return new Float32Array([touchEvent.touches[0].clientX - left, touchEvent.touches[0].clientY - top, 0]);\n };\n ViewerEvent.prototype.touchPixelPos1 = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n return new Float32Array([touchEvent.touches[1].clientX - left, touchEvent.touches[1].clientY - top, 0]);\n };\n return ViewerEvent;\n }();\n exports.ViewerEvent = ViewerEvent;\n var GsWebGLUtility = function () {\n function GsWebGLUtility() {}\n GsWebGLUtility.smoothTransition = function (co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, vi) {\n var camera = {\n position: new Float32Array(3),\n target: new Float32Array(3),\n up: new Float32Array(3),\n width: 0,\n height: 0,\n projection: \"\"\n };\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n camera = JS_Show_Camera();\n }\n JS_Close_Segment();\n var X = 0;\n var Y = 1;\n var Z = 2;\n if (gs_math_1.Tolerance.sameValueFloatArray(co, cn) && gs_math_1.Tolerance.sameValueFloatArray(to, tn) && gs_math_1.Tolerance.sameValueFloatArray(uo, un) && gs_math_1.Tolerance.sameValue(widtho, widthn) && gs_math_1.Tolerance.sameValue(heighto, heightn)) {\n return;\n }\n var matrix_old = new Float32Array(16);\n var matrix_new = new Float32Array(16);\n var view_vector_old = new Float32Array([to[X] - co[X], to[Y] - co[Y], to[Z] - co[Z]]);\n var view_vector_new = new Float32Array([tn[X] - cn[X], tn[Y] - cn[Y], tn[Z] - cn[Z]]);\n var length = gs_math_1.Vector.module(view_vector_old);\n var length_delta = gs_math_1.Vector.module(view_vector_new) - length;\n gs_math_1.Vector.normalize(view_vector_old);\n gs_math_1.Vector.normalize(view_vector_new);\n var need_rotation = true;\n var rotation_delta = new Float32Array([view_vector_old[0] - view_vector_new[0], view_vector_old[1] - view_vector_new[1], view_vector_old[2] - view_vector_new[2]]);\n var up_delta = new Float32Array([un[X] - uo[X], un[Y] - uo[Y], un[Z] - uo[Z]]);\n if (gs_math_1.Vector.module(rotation_delta) < 0.0001 && gs_math_1.Vector.module(up_delta) < 0.0001) {\n need_rotation = false;\n }\n var translation = new Float32Array(3);\n var position_move_delta = new Float32Array(3);\n if (need_rotation) {\n GsWebGLUtility.GetMatrixFromCamera(to, co, uo, translation, matrix_old);\n GsWebGLUtility.GetMatrixFromCamera(tn, cn, un, translation, matrix_new);\n } else {\n position_move_delta[X] = cn[X] - co[X];\n position_move_delta[Y] = cn[Y] - co[Y];\n position_move_delta[Z] = cn[Z] - co[Z];\n }\n var matrix_interim = new Float32Array(16);\n var quat_old = new Float32Array(4);\n var quat_new = new Float32Array(4);\n var quat_interim = new Float32Array(4);\n if (need_rotation) {\n GsWebGLUtility.MatrixToQuaternion(matrix_old, quat_old);\n GsWebGLUtility.MatrixToQuaternion(matrix_new, quat_new);\n }\n var target_move_delta = new Float32Array([tn[X] - to[X], tn[Y] - to[Y], tn[Z] - to[Z]]);\n var field_width_delta = widthn - widtho;\n var field_height_delta = heightn - heighto;\n var dot1, dot2;\n if (need_rotation) {\n dot1 = (quat_old[0] - quat_new[0]) * (quat_old[0] - quat_new[0]) + (quat_old[1] - quat_new[1]) * (quat_old[1] - quat_new[1]) + (quat_old[2] - quat_new[2]) * (quat_old[2] - quat_new[2]) + (quat_old[3] - quat_new[3]) * (quat_old[3] - quat_new[3]);\n dot2 = (quat_old[0] + quat_new[0]) * (quat_old[0] + quat_new[0]) + (quat_old[1] + quat_new[1]) * (quat_old[1] + quat_new[1]) + (quat_old[2] + quat_new[2]) * (quat_old[2] + quat_new[2]) + (quat_old[3] + quat_new[3]) * (quat_old[3] + quat_new[3]);\n if (dot2 < dot1) {\n quat_new[0] = -quat_new[0];\n quat_new[1] = -quat_new[1];\n quat_new[2] = -quat_new[2];\n quat_new[3] = -quat_new[3];\n }\n }\n var position = new Float32Array(3);\n var up_vector = new Float32Array(3);\n var total_duration = vi._smoothTransitionDuration;\n var q, current_time;\n var total_time_start = Date.now();\n total_time_start -= 100;\n function tick() {\n current_time = Date.now();\n q = (current_time - total_time_start) / total_duration;\n if (q >= 1.0) {\n q = 1.0;\n }\n q = GsWebGLUtility.EaseInEaseOut(q, 0.49, 0.02, 0.49);\n if (q < 0) {\n q = 0;\n }\n if (need_rotation) {\n var to2 = new Float32Array([to[X] + q * target_move_delta[X], to[Y] + q * target_move_delta[Y], to[Z] + q * target_move_delta[Z]]);\n GsWebGLUtility.TransitionQuaternion(quat_old, quat_new, q, quat_interim);\n GsWebGLUtility.QuaternionToMatrix(quat_interim, matrix_interim);\n position[X] = to2[X] - matrix_interim[8] * (length + length_delta * q);\n position[Y] = to2[Y] - matrix_interim[9] * (length + length_delta * q);\n position[Z] = to2[Z] - matrix_interim[10] * (length + length_delta * q);\n up_vector[X] = matrix_interim[4];\n up_vector[Y] = matrix_interim[5];\n up_vector[Z] = matrix_interim[6];\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up(up_vector);\n }\n JS_Close_Segment();\n } else {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Position(new Float32Array([co[X] + q * position_move_delta[X], co[Y] + q * position_move_delta[Y], co[Z] + q * position_move_delta[Z]]));\n }\n JS_Close_Segment();\n }\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Target(new Float32Array([to[X] + q * target_move_delta[X], to[Y] + q * target_move_delta[Y], to[Z] + q * target_move_delta[Z]]));\n }\n JS_Close_Segment();\n var fw = widtho + q * field_width_delta;\n var fh = heighto + q * field_height_delta;\n if (fw > 0.00001 && fh > 0.00001) {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Field(fw, fh);\n }\n JS_Close_Segment();\n q = (current_time - total_time_start) / total_duration;\n vi.updateDisplay();\n }\n if (q < 1.0 - GsWebGLUtility.EPSILON) {\n requestAnimationFrame(tick);\n } else {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera(cn, tn, un, widthn, heightn, camera.projection);\n }\n JS_Close_Segment();\n vi.sceneCameraChanged.forEach(function (value) {\n value(vi, CameraChangeType.Rotate | CameraChangeType.Scale);\n });\n requestAnimationFrame(function () {\n vi.updateDisplay();\n });\n }\n }\n requestAnimationFrame(tick);\n };\n GsWebGLUtility.smoothTransitionD = function (co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, vi) {\n vi.isBusy = true;\n var camera;\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n camera = JS_Show_Camera();\n }\n JS_Close_Segment();\n var X = 0;\n var Y = 1;\n var Z = 2;\n if (gs_math_1.DTolerance.sameValueFloatArray(co, cn) && gs_math_1.DTolerance.sameValueFloatArray(to, tn) && gs_math_1.DTolerance.sameValueFloatArray(uo, un) && gs_math_1.DTolerance.sameValue(widtho, widthn) && gs_math_1.DTolerance.sameValue(heighto, heightn)) {\n vi.isBusy = false;\n vi.updateDisplay();\n return;\n }\n var matrix_old = new Float64Array(16);\n var matrix_new = new Float64Array(16);\n var view_vector_old = new Float64Array([to[X] - co[X], to[Y] - co[Y], to[Z] - co[Z]]);\n var view_vector_new = new Float64Array([tn[X] - cn[X], tn[Y] - cn[Y], tn[Z] - cn[Z]]);\n var length = gs_math_1.DVector.module(view_vector_old);\n var length_delta = gs_math_1.DVector.module(view_vector_new) - length;\n gs_math_1.DVector.normalize(view_vector_old);\n gs_math_1.DVector.normalize(view_vector_new);\n var need_rotation = true;\n var rotation_delta = new Float64Array([view_vector_old[0] - view_vector_new[0], view_vector_old[1] - view_vector_new[1], view_vector_old[2] - view_vector_new[2]]);\n var up_delta = new Float64Array([un[X] - uo[X], un[Y] - uo[Y], un[Z] - uo[Z]]);\n if (gs_math_1.DVector.module(rotation_delta) < 0.0001 && gs_math_1.DVector.module(up_delta) < 0.0001) {\n need_rotation = false;\n }\n var translation = new Float64Array(3);\n var position_move_delta = new Float64Array(3);\n if (need_rotation) {\n GsWebGLUtility.GetMatrixFromCameraD(to, co, uo, translation, matrix_old);\n GsWebGLUtility.GetMatrixFromCameraD(tn, cn, un, translation, matrix_new);\n } else {\n position_move_delta[X] = cn[X] - co[X];\n position_move_delta[Y] = cn[Y] - co[Y];\n position_move_delta[Z] = cn[Z] - co[Z];\n }\n var matrix_interim = new Float64Array(16);\n var quat_old = new Float64Array(4);\n var quat_new = new Float64Array(4);\n var quat_interim = new Float64Array(4);\n if (need_rotation) {\n GsWebGLUtility.MatrixToQuaternionD(matrix_old, quat_old);\n GsWebGLUtility.MatrixToQuaternionD(matrix_new, quat_new);\n }\n var target_move_delta = new Float64Array([tn[X] - to[X], tn[Y] - to[Y], tn[Z] - to[Z]]);\n var field_width_delta = widthn - widtho;\n var field_height_delta = heightn - heighto;\n var dot1, dot2;\n if (need_rotation) {\n dot1 = (quat_old[0] - quat_new[0]) * (quat_old[0] - quat_new[0]) + (quat_old[1] - quat_new[1]) * (quat_old[1] - quat_new[1]) + (quat_old[2] - quat_new[2]) * (quat_old[2] - quat_new[2]) + (quat_old[3] - quat_new[3]) * (quat_old[3] - quat_new[3]);\n dot2 = (quat_old[0] + quat_new[0]) * (quat_old[0] + quat_new[0]) + (quat_old[1] + quat_new[1]) * (quat_old[1] + quat_new[1]) + (quat_old[2] + quat_new[2]) * (quat_old[2] + quat_new[2]) + (quat_old[3] + quat_new[3]) * (quat_old[3] + quat_new[3]);\n if (dot2 < dot1) {\n quat_new[0] = -quat_new[0];\n quat_new[1] = -quat_new[1];\n quat_new[2] = -quat_new[2];\n quat_new[3] = -quat_new[3];\n }\n }\n var position = new Float64Array(3);\n var up_vector = new Float64Array(3);\n var total_duration = vi._smoothTransitionDuration;\n var q, current_time;\n var total_time_start = Date.now();\n total_time_start -= 100;\n function tick() {\n current_time = Date.now();\n q = (current_time - total_time_start) / total_duration;\n if (q >= 1.0) {\n q = 1.0;\n }\n q = GsWebGLUtility.EaseInEaseOut(q, 0.49, 0.02, 0.49);\n if (q < 0) {\n q = 0;\n }\n if (need_rotation) {\n var to2 = new Float64Array([to[X] + q * target_move_delta[X], to[Y] + q * target_move_delta[Y], to[Z] + q * target_move_delta[Z]]);\n GsWebGLUtility.TransitionQuaternionD(quat_old, quat_new, q, quat_interim);\n GsWebGLUtility.QuaternionToMatrixD(quat_interim, matrix_interim);\n position[X] = to2[X] - matrix_interim[8] * (length + length_delta * q);\n position[Y] = to2[Y] - matrix_interim[9] * (length + length_delta * q);\n position[Z] = to2[Z] - matrix_interim[10] * (length + length_delta * q);\n up_vector[X] = matrix_interim[4];\n up_vector[Y] = matrix_interim[5];\n up_vector[Z] = matrix_interim[6];\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up(up_vector);\n }\n JS_Close_Segment();\n } else {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Position(new Float64Array([co[X] + q * position_move_delta[X], co[Y] + q * position_move_delta[Y], co[Z] + q * position_move_delta[Z]]));\n }\n JS_Close_Segment();\n }\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Target(new Float64Array([to[X] + q * target_move_delta[X], to[Y] + q * target_move_delta[Y], to[Z] + q * target_move_delta[Z]]));\n }\n JS_Close_Segment();\n var fw = widtho + q * field_width_delta;\n var fh = heighto + q * field_height_delta;\n if (fw > 0.00001 && fh > 0.00001) {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Field(fw, fh);\n }\n JS_Close_Segment();\n q = (current_time - total_time_start) / total_duration;\n vi.exeSceneCameraChanging(CameraChangeType.Scale | CameraChangeType.Rotate | CameraChangeType.Translate);\n vi.updateDisplay();\n vi.exeSceneCameraChanged(CameraChangeType.Scale | CameraChangeType.Rotate | CameraChangeType.Translate);\n }\n if (q < 1.0 - GsWebGLUtility.EPSILON) {\n requestAnimationFrame(tick);\n } else {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Position(cn);\n JS_Set_Camera_Target(tn);\n JS_Set_Camera_Up(un);\n JS_Set_Camera_Field(widthn, heightn);\n }\n JS_Close_Segment();\n vi.exeSceneCameraChanging(CameraChangeType.Rotate | CameraChangeType.Scale);\n requestAnimationFrame(function () {\n vi.updateDisplay();\n });\n vi.exeSceneCameraChanged(CameraChangeType.Rotate | CameraChangeType.Scale);\n vi.isBusy = false;\n }\n }\n requestAnimationFrame(tick);\n };\n GsWebGLUtility.GetMatrixFromCamera = function (target, position, up_vector, translation, matrix) {\n var view_vector = new Float32Array([target[0] - position[0], target[1] - position[1], target[2] - position[2]]);\n gs_math_1.Vector.normalize(view_vector);\n gs_math_1.Vector.normalize(up_vector);\n var cross1 = gs_math_1.Vector.cross(up_vector, view_vector);\n matrix[0] = cross1[0];\n matrix[1] = cross1[1];\n matrix[2] = cross1[2];\n matrix[3] = 0.0;\n var cross2 = gs_math_1.Vector.cross(view_vector, cross1);\n matrix[4] = cross2[0];\n matrix[5] = cross2[1];\n matrix[6] = cross2[2];\n matrix[7] = 0.0;\n matrix[8] = view_vector[0];\n matrix[9] = view_vector[1];\n matrix[10] = view_vector[2];\n matrix[11] = 0.0;\n matrix[12] = translation[0];\n matrix[13] = translation[1];\n matrix[14] = translation[2];\n matrix[15] = 1.0;\n };\n GsWebGLUtility.GetMatrixFromCameraD = function (target, position, up_vector, translation, matrix) {\n var view_vector = new Float64Array([target[0] - position[0], target[1] - position[1], target[2] - position[2]]);\n gs_math_1.DVector.normalize(view_vector);\n gs_math_1.DVector.normalize(up_vector);\n var cross1 = gs_math_1.DVector.cross(up_vector, view_vector);\n matrix[0] = cross1[0];\n matrix[1] = cross1[1];\n matrix[2] = cross1[2];\n matrix[3] = 0.0;\n var cross2 = gs_math_1.DVector.cross(view_vector, cross1);\n matrix[4] = cross2[0];\n matrix[5] = cross2[1];\n matrix[6] = cross2[2];\n matrix[7] = 0.0;\n matrix[8] = view_vector[0];\n matrix[9] = view_vector[1];\n matrix[10] = view_vector[2];\n matrix[11] = 0.0;\n matrix[12] = translation[0];\n matrix[13] = translation[1];\n matrix[14] = translation[2];\n matrix[15] = 1.0;\n };\n GsWebGLUtility.MatrixToQuaternion = function (matrix, quaternion) {\n var tr, s;\n var i, j, k;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n tr = matrix[0] + matrix[5] + matrix[10];\n if (tr > 0.0) {\n s = Math.sqrt(tr + 1.0);\n quaternion[W] = s * 0.5;\n s = 0.5 / s;\n quaternion[X] = (matrix[6] - matrix[9]) * s;\n quaternion[Y] = (matrix[8] - matrix[2]) * s;\n quaternion[Z] = (matrix[1] - matrix[4]) * s;\n } else {\n i = X;\n if (matrix[Y * 4 + Y] > matrix[X * 4 + X]) {\n i = Y;\n }\n if (matrix[Z * 4 + Z] > matrix[i * 4 + i]) {\n i = Z;\n }\n var nxt = new Int32Array([Y, Z, X]);\n j = nxt[i];\n k = nxt[j];\n s = Math.sqrt(matrix[i * 4 + i] - (matrix[j * 4 + j] + matrix[k * 4 + k]) + 1.0);\n quaternion[i] = s * 0.5;\n s = 0.5 / s;\n quaternion[W] = (matrix[j * 4 + k] - matrix[k * 4 + j]) * s;\n quaternion[j] = (matrix[i * 4 + j] + matrix[j * 4 + i]) * s;\n quaternion[k] = (matrix[i * 4 + k] + matrix[k * 4 + i]) * s;\n }\n };\n GsWebGLUtility.MatrixToQuaternionD = function (matrix, quaternion) {\n var tr, s;\n var i, j, k;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n tr = matrix[0] + matrix[5] + matrix[10];\n if (tr > 0.0) {\n s = Math.sqrt(tr + 1.0);\n quaternion[W] = s * 0.5;\n s = 0.5 / s;\n quaternion[X] = (matrix[6] - matrix[9]) * s;\n quaternion[Y] = (matrix[8] - matrix[2]) * s;\n quaternion[Z] = (matrix[1] - matrix[4]) * s;\n } else {\n i = X;\n if (matrix[Y * 4 + Y] > matrix[X * 4 + X]) {\n i = Y;\n }\n if (matrix[Z * 4 + Z] > matrix[i * 4 + i]) {\n i = Z;\n }\n var nxt = new Int32Array([Y, Z, X]);\n j = nxt[i];\n k = nxt[j];\n s = Math.sqrt(matrix[i * 4 + i] - (matrix[j * 4 + j] + matrix[k * 4 + k]) + 1.0);\n quaternion[i] = s * 0.5;\n s = 0.5 / s;\n quaternion[W] = (matrix[j * 4 + k] - matrix[k * 4 + j]) * s;\n quaternion[j] = (matrix[i * 4 + j] + matrix[j * 4 + i]) * s;\n quaternion[k] = (matrix[i * 4 + k] + matrix[k * 4 + i]) * s;\n }\n };\n GsWebGLUtility.PA = function (t, m, a) {\n return t * t * 0.5 * m / a;\n };\n GsWebGLUtility.PB = function (t, m, a) {\n return GsWebGLUtility.PA(a, m, a) + (t - a) * m;\n };\n GsWebGLUtility.PC = function (t, m, a, b, c) {\n return GsWebGLUtility.PB(a + b, m, a) + (t - (a + b)) * m * (1.0 - 0.5 * (t - (a + b)) / c);\n };\n GsWebGLUtility.EaseInEaseOut = function (t, a, b, c) {\n var res;\n var m = 2.0 / (a + 2.0 * b + c);\n if (t <= a) {\n res = GsWebGLUtility.PA(t, m, a);\n } else if (t >= a && t <= a + b) {\n res = GsWebGLUtility.PB(t, m, a);\n } else {\n res = GsWebGLUtility.PC(t, m, a, b, c);\n }\n if (res > 1.0) {\n res = 1.0;\n }\n return res;\n };\n GsWebGLUtility.H_ACOS = function (x) {\n return x < -1 ? Math.PI : x > 1 ? 0 : Math.acos(x);\n };\n GsWebGLUtility.H_ASIN = function (x) {\n return x < -1 ? -Math.PI / 2 : x > 1 ? Math.PI / 2 : Math.asin(x);\n };\n GsWebGLUtility.TransitionQuaternion = function (quat_old, quat_new, t, qt) {\n var omega, cosom, sinom, sclp, sclq;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n cosom = quat_old[X] * quat_new[X] + quat_old[Y] * quat_new[Y] + quat_old[Z] * quat_new[Z] + quat_old[W] * quat_new[W];\n if (1.0 + cosom > GsWebGLUtility.EPSILON) {\n if (1.0 - cosom > GsWebGLUtility.EPSILON) {\n omega = GsWebGLUtility.H_ACOS(cosom);\n sinom = Math.sin(omega);\n sclp = Math.sin((1.0 - t) * omega) / sinom;\n sclq = Math.sin(t * omega) / sinom;\n } else {\n sclp = 1.0 - t;\n sclq = t;\n }\n for (var i = 0; i < 4; i++) {\n qt[i] = sclp * quat_old[i] + sclq * quat_new[i];\n }\n } else {\n qt[X] = -quat_old[Y];\n qt[Y] = quat_old[X];\n qt[Z] = -quat_old[W];\n qt[W] = quat_old[Z];\n sclp = Math.sin((1.0 - t) * Math.PI / 2);\n sclq = Math.sin(t * Math.PI / 2);\n for (var i = 0; i < 3; i++) {\n qt[i] = sclp * quat_old[i] + sclq * qt[i];\n }\n }\n };\n GsWebGLUtility.TransitionQuaternionD = function (quat_old, quat_new, t, qt) {\n var omega, cosom, sinom, sclp, sclq;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n cosom = quat_old[X] * quat_new[X] + quat_old[Y] * quat_new[Y] + quat_old[Z] * quat_new[Z] + quat_old[W] * quat_new[W];\n if (1.0 + cosom > GsWebGLUtility.EPSILON) {\n if (1.0 - cosom > GsWebGLUtility.EPSILON) {\n omega = GsWebGLUtility.H_ACOS(cosom);\n sinom = Math.sin(omega);\n sclp = Math.sin((1.0 - t) * omega) / sinom;\n sclq = Math.sin(t * omega) / sinom;\n } else {\n sclp = 1.0 - t;\n sclq = t;\n }\n for (var i = 0; i < 4; i++) {\n qt[i] = sclp * quat_old[i] + sclq * quat_new[i];\n }\n } else {\n qt[X] = -quat_old[Y];\n qt[Y] = quat_old[X];\n qt[Z] = -quat_old[W];\n qt[W] = quat_old[Z];\n sclp = Math.sin((1.0 - t) * Math.PI / 2);\n sclq = Math.sin(t * Math.PI / 2);\n for (var i = 0; i < 3; i++) {\n qt[i] = sclp * quat_old[i] + sclq * qt[i];\n }\n }\n };\n GsWebGLUtility.QuaternionToMatrix = function (quaternion, matrix) {\n var s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n s = 2.0 / (quaternion[X] * quaternion[X] + quaternion[Y] * quaternion[Y] + quaternion[Z] * quaternion[Z] + quaternion[W] * quaternion[W]);\n xs = quaternion[X] * s;\n ys = quaternion[Y] * s;\n zs = quaternion[Z] * s;\n wx = quaternion[W] * xs;\n wy = quaternion[W] * ys;\n wz = quaternion[W] * zs;\n xx = quaternion[X] * xs;\n xy = quaternion[X] * ys;\n xz = quaternion[X] * zs;\n yy = quaternion[Y] * ys;\n yz = quaternion[Y] * zs;\n zz = quaternion[Z] * zs;\n matrix[0] = 1.0 - (yy + zz);\n matrix[1] = xy + wz;\n matrix[2] = xz - wy;\n matrix[3] = 0.0;\n matrix[4] = xy - wz;\n matrix[5] = 1.0 - (xx + zz);\n matrix[6] = yz + wx;\n matrix[7] = 0.0;\n matrix[8] = xz + wy;\n matrix[9] = yz - wx;\n matrix[10] = 1.0 - (xx + yy);\n matrix[11] = 0.0;\n matrix[12] = 0.0;\n matrix[13] = 0.0;\n matrix[14] = 0.0;\n matrix[15] = 1.0;\n };\n GsWebGLUtility.QuaternionToMatrixD = function (quaternion, matrix) {\n var s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n s = 2.0 / (quaternion[X] * quaternion[X] + quaternion[Y] * quaternion[Y] + quaternion[Z] * quaternion[Z] + quaternion[W] * quaternion[W]);\n xs = quaternion[X] * s;\n ys = quaternion[Y] * s;\n zs = quaternion[Z] * s;\n wx = quaternion[W] * xs;\n wy = quaternion[W] * ys;\n wz = quaternion[W] * zs;\n xx = quaternion[X] * xs;\n xy = quaternion[X] * ys;\n xz = quaternion[X] * zs;\n yy = quaternion[Y] * ys;\n yz = quaternion[Y] * zs;\n zz = quaternion[Z] * zs;\n matrix[0] = 1.0 - (yy + zz);\n matrix[1] = xy + wz;\n matrix[2] = xz - wy;\n matrix[3] = 0.0;\n matrix[4] = xy - wz;\n matrix[5] = 1.0 - (xx + zz);\n matrix[6] = yz + wx;\n matrix[7] = 0.0;\n matrix[8] = xz + wy;\n matrix[9] = yz - wx;\n matrix[10] = 1.0 - (xx + yy);\n matrix[11] = 0.0;\n matrix[12] = 0.0;\n matrix[13] = 0.0;\n matrix[14] = 0.0;\n matrix[15] = 1.0;\n };\n GsWebGLUtility.browserType = function () {\n var explorer = window.navigator.userAgent,\n compare = function compare(s) {\n return explorer.indexOf(s) >= 0;\n },\n ie11 = function () {\n return \"ActiveXObject\" in window;\n }();\n if (compare(\"MSIE\") || ie11) {\n return \"ie\";\n } else if (compare(\"Edge\") && !ie11) {\n return \"Edge\";\n } else if (compare(\"Firefox\") && !ie11) {\n return \"Firefox\";\n } else if (compare(\"Chrome\") && !ie11) {\n return \"Chrome\";\n } else if (compare(\"Opera\") && !ie11) {\n return \"Opera\";\n } else if (compare(\"Safari\") && !ie11) {\n return \"Safari\";\n }\n };\n GsWebGLUtility.EPSILON = 0.00001;\n return GsWebGLUtility;\n }();\n exports.GsWebGLUtility = GsWebGLUtility;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wYWNrYWdlcy9sb25nYW4vc3JjL2xvbmdhbi9ncy52aWV3ZXIudHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBO0FBc25ZQTtBQXJuWUE7QUFzbllBO0FBcm5ZQTtBQXNuWUE7QUFwbllBO0FBcW5ZQTtBQW5uWUE7QUFvbllBO0FBbm5ZQTtBQW9uWUE7QUFubllBO0FBb25ZQTtBQW5uWUE7QUFvbllBO0FBbm5ZQTtBQW9uWUE7QUFubllBO0FBb25ZQTtBQW5uWUE7QUFvbllBO0FBbm5ZQTtBQW9uWUE7QUFubllBO0FBb25ZQTtBQW5uWUE7QUFvbllBO0FBbm5ZQTtBQW9uWUE7QUFubllBO0FBb25ZQTtBQW5uWUE7QUFvbllBO0FBbm5ZQTtBQW9uWUE7QUFubllBO0FBb25ZQTtBQW5uWUE7QUFvbllBO0FBbm5ZQTtBQW9uWUE7QUFubllBO0FBb25ZQTtBQW5uWUE7QUFvbllBO0FBbm5ZQTtBQW9uWUE7QUFsbllBO0FBbW5ZQTtBQWxuWUE7QUFtbllBO0FBbG5ZQTtBQW1uWUE7QUFsbllBO0FBbW5ZQTtBQWxuWUE7QUFtbllBO0FBam5ZQTtBQWtuWUE7QUFobllBO0FBaW5ZQTtBQS9tWUE7QUFnbllBO0FBOW1ZQTtBQWduWUE7QUE3bVlBO0FBZ25ZQTtBQTltWUE7QUErbVlBO0FBOW1ZQTtBQSttWUE7QUE5bVlBO0FBK21ZQTtBQTdtWUE7QUE4bVlBO0FBN21ZQTtBQThtWUE7QUE1bVlBO0FBNm1ZQTtBQTNtWUE7QUE0bVlBO0FBMW1ZQTtBQTJtWUE7QUF6bVlBO0FBMG1ZQTtBQXhtWUE7QUF5bVlBO0FBdG1ZQTtBQUVBO0FBRUE7QUFxbVlBO0FBcG1ZQTtBQXNtWUE7QUFybVlBO0FBc21ZQTtBQXJtWUE7QUFzbVlBO0FBaG1ZQTtBQWltWUE7QUEvbFlBO0FBRUE7QUErbFlBO0FBN2xZQTtBQThsWUE7QUExbFlBO0FBMmxZQTtBQXZsWUE7QUF3bFlBO0FBdGxZQTtBQXVsWUE7QUFybFlBO0FBc2xZQTtBQXBsWUE7QUFxbFlBO0FBbmxZQTtBQTRrWUE7QUEza1lBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW9sWUE7QUFubFlBO0FBb2xZQTtBQW5sWUE7QUFvbFlBO0FBbmxZQTtBQW9sWUE7QUFubFlBO0FBb2xZQTtBQW5sWUE7QUFvbFlBO0FBbmxZQTtBQW9sWUE7QUFubFlBO0FBb2xZQTtBQW5sWUE7QUE4aFlBO0FBN2hZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBbGxZQTtBQW1sWUE7QUFsbFlBO0FBbWxZQTtBQWxsWUE7QUFtbFlBO0FBamxZQTtBQWtsWUE7QUFqbFlBO0FBa2xZQTtBQWpsWUE7QUFrbFlBO0FBamxZQTtBQWtsWUE7QUFqbFlBO0FBa2xZQTtBQTVrWUE7QUE2a1lBO0FBdGtZQTtBQXdrWUE7QUFoa1lBO0FBK2pZQTtBQXpqWUE7QUEyallBO0FBMWpZQTtBQTJqWUE7QUF6allBO0FBMGpZQTtBQXhqWUE7QUF5allBO0FBeGpZQTtBQXlqWUE7QUF0allBO0FBdWpZQTtBQXBqWUE7QUFxallBO0FBbGpZQTtBQW1qWUE7QUFsallBO0FBbWpZQTtBQWxqWUE7QUFtallBO0FBbGpZQTtBQW1qWUE7QUFsallBO0FBbWpZQTtBQWxqWUE7QUFtallBO0FBbGpZQTtBQW1qWUE7QUFsallBO0FBbWpZQTtBQWxqWUE7QUFtallBO0FBbGpZQTtBQW9qWUE7QUFuallBO0FBb2pZQTtBQW5qWUE7QUFpallBO0FBaGpZQTtBQW1qWUE7QUFsallBO0FBbWpZQTtBQWxqWUE7QUFtallBO0FBbGpZQTtBQW1qWUE7QUFsallBO0FBbWpZQTtBQWxqWUE7QUFtallBO0FBbGpZQTtBQW1qWUE7QUFsallBO0FBbWpZQTtBQWxqWUE7QUFtallBO0FBbGpZQTtBQW1qWUE7QUFsallBO0FBbWpZQTtBQWxqWUE7QUFtallBO0FBbGpZQTtBQW1qWUE7QUFsallBO0FBbWpZQTtBQWxqWUE7QUFtallBO0FBbGpZQTtBQW1qWUE7QUFsallBO0FBbWpZQTtBQWpqWUE7QUFrallBO0FBampZQTtBQWtqWUE7QUFqallBO0FBa2pZQTtBQWpqWUE7QUFrallBO0FBampZQTtBQWtqWUE7QUFqallBO0FBa2pZQTtBQWpqWUE7QUFrallBO0FBampZQTtBQWtqWUE7QUFqallBO0FBa2pZQTtBQWpqWUE7QUFrallBO0FBampZQTtBQWtqWUE7QUFqallBO0FBa2pZQTtBQWpqWUE7QUFrallBO0FBampZQTtBQWtqWUE7QUFqallBO0FBa2pZQTtBQWhqWUE7QUFpallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUE5aVlBO0FBK2lZQTtBQTlpWUE7QUEraVlBO0FBOWlZQTtBQStpWUE7QUE3aVlBO0FBOGlZQTtBQTVpWUE7QUE2aVlBO0FBNWlZQTtBQTZpWUE7QUE1aVlBO0FBNmlZQTtBQTVpWUE7QUE2aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE2aVlBO0FBNWlZQTtBQTJpWUE7QUExaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBeGlZQTtBQTJpWUE7QUFyaVlBO0FBbWlZQTtBQTloWUE7QUEraFlBO0FBM2hZQTtBQTZoWUE7QUE1aFlBO0FBNmhZQTtBQTVoWUE7QUE2aFlBO0FBNWhZQTtBQTZoWUE7QUE1aFlBO0FBNmhZQTtBQTVoWUE7QUE2aFlBO0FBNWhZQTtBQTZoWUE7QUE1aFlBO0FBNmhZQTtBQTVoWUE7QUE2aFlBO0FBNWhZQTtBQTZoWUE7QUE1aFlBO0FBNmhZQTtBQTVoWUE7QUE2aFlBO0FBNWhZQTtBQTZoWUE7QUE1aFlBO0FBNmhZQTtBQTVoWUE7QUE2aFlBO0FBNWhZQTtBQTZoWUE7QUEzaFlBO0FBNGhZQTtBQTFoWUE7QUEyaFlBO0FBemhZQTtBQTBoWUE7QUF4aFlBO0FBeWhZQTtBQXZoWUE7QUF3aFlBO0FBdGhZQTtBQXVoWUE7QUFyaFlBO0FBc2hZQTtBQXJoWUE7QUFzaFlBO0FBamhZQTtBQWtoWUE7QUFoaFlBO0FBaWhZQTtBQXZnWUE7QUF3Z1lBO0FBdmdZQTtBQXdnWUE7QUF0Z1lBO0FBdWdZQTtBQXRnWUE7QUF1Z1lBO0FBdGdZQTtBQXVnWUE7QUF0Z1lBO0FBdWdZQTtBQXRnWUE7QUF1Z1lBO0FBdGdZQTtBQXVnWUE7QUFyZ1lBO0FBc2dZQTtBQWpnWUE7QUFrZ1lBO0FBNS9YQTtBQTYvWEE7QUEzL1hBO0FBNC9YQTtBQTMvWEE7QUE0L1hBO0FBMy9YQTtBQTQvWEE7QUEzL1hBO0FBNC9YQTtBQTEvWEE7QUEyL1hBO0FBcC9YQTtBQXEvWEE7QUFwL1hBO0FBcS9YQTtBQXAvWEE7QUFxL1hBO0FBbi9YQTtBQW8vWEE7QUFsL1hBO0FBbS9YQTtBQWwvWEE7QUFtL1hBO0FBbC9YQTtBQW0vWEE7QUFqL1hBO0FBay9YQTtBQWgvWEE7QUFpL1hBO0FBaC9YQTtBQWkvWEE7QUFoL1hBO0FBaS9YQTtBQWgvWEE7QUFFQTtBQSsrWEE7QUE5K1hBO0FBKytYQTtBQTcrWEE7QUE4K1hBO0FBNStYQTtBQTYrWEE7QUEzK1hBO0FBNCtYQTtBQTErWEE7QUEyK1hBO0FBeitYQTtBQTArWEE7QUF6K1hBO0FBMCtYQTtBQXgrWEE7QUF5K1hBO0FBdCtYQTtBQXUrWEE7QUFwK1hBO0FBcStYQTtBQW4rWEE7QUFvK1hBO0FBbCtYQTtBQW0rWEE7QUEzOVhBO0FBNDlYQTtBQXA5WEE7QUFxOVhBO0FBNzhYQTtBQTg4WEE7QUFyOFhBO0FBczhYQTtBQTk3WEE7QUErN1hBO0FBdjdYQTtBQXc3WEE7QUFuN1hBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFHQTtBQUdBO0FBSUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBSUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBSUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFPQTs7QUFFQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFPQTs7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFNQTs7QUFFQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFTQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFPQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBUUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBUUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTs7QUFFQTtBQU9BO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBU0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBOztBQUlBO0FBU0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBU0E7QUFDQTtBQUNBOztBQUVBO0FBU0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFRQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQVNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7O0FBR0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFRQTtBQUNBO0FBQ0E7QUFVQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7OztBQUlBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUVBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQVNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFPQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFPQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQU9BO0FBRUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFTQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQVNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQVVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQVVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFPQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBTUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQU9BO0FBRUE7QUFFQTtBQUVBO0FBUUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFPQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOztBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7O0FBRUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBUUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBUUE7QUFDQTs7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBd2tOQTtBQXRrTkE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUVBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQTBNQTtBQUFBO0FBck1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUlBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBUUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUtBO0FBR0E7QUFFQTtBQUVBO0FBSUE7QUFLQTtBQUtBO0FBSUE7QUFNQTtBQUVBO0FBVUE7QUFFQTtBQXVDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFNQTtBQUVBO0FBQ0E7O0FBS0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7O0FBTUE7QUFFQTtBQUNBOztBQU1BOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBRUE7QUFDQTs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBS0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUdBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQStDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQVFBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBcURBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFHQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQTFkQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBMGJBOzs7O0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7OztBQUlBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFVQTtBQUVBO0FBQ0E7QUFDQTtBQUdBOztBQUFBOzs7QUFJQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUdBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUdBO0FBQ0E7QUFHQTtBQUNBOztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQU9BO0FBQ0E7OztBQUtBO0FBQ0E7QUFDQTs7QUFFQTtBQU9BO0FBQ0E7O0FBSUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUdBO0FBQ0E7QUFHQTtBQUNBOztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQU9BO0FBQ0E7OztBQUtBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7Ozs7OztBQXpOQTtBQUFBOzs7Ozs7OztBQStOQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTs7O0FBSUE7QUFDQTtBQVFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUtBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUtBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7QUFFQTtBQUNBOztBQUdBOztBQUdBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBSUE7QUFVQTtBQUNBO0FBQ0E7QUFRQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFHQTtBQUdBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBR0E7QUFFQTtBQUVBO0FBMEhBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFNQTs7OztBQVVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQWlDQTtBQUlBO0FBRUE7O0FBRUE7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBQ0E7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBcUJBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUlBOztBQUVBO0FBQ0E7QUFDQTs7QUFJQTtBQUNBO0FBSUE7O0FBRUE7QUFHQTtBQUdBO0FBR0E7QUFFQTtBQUNBOztBQUdBOztBQUVBO0FBQ0E7O0FBTUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUVBO0FBQUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWNBO0FBQ0E7OztBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7O0FBR0E7Ozs7O0FBRUE7OztBQU1BO0FBTUE7QUFJQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTs7QUFFQTtBQUVBO0FBRUE7QUFHQTtBQUtBO0FBQUE7QUFNQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOzs7O0FBakRBO0FBQUE7O0FBb0RBO0FBR0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBOztBQUVBO0FBQ0E7O0FBZ0JBO0FBQ0E7QUFHQTtBQUVBOzs7QUFHQTtBQUdBO0FBS0E7QUFHQTtBQUVBO0FBRUE7QUFDQTs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQU1BO0FBR0E7QUFBQTtBQU1BO0FBQ0E7QUFDQTs7QUFJQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBWUE7QUFRQTtBQUNBOzs7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQWlCQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBOzs7O0FBUUE7Ozs7O0FBRUE7Ozs7O0FBekdBO0FBQUE7O0FBaUhBO0FBQ0E7QUFFQTs7QUFTQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUlBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUdBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBOztBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUlBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBOztBQUtBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUtBO0FBQ0E7Ozs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOzs7O0FBekVBO0FBQUE7O0FBNkVBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBU0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7O0FBR0E7O0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBOztBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUlBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBSUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBOzs7QUFPQTs7QUFFQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFXQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTs7QUFHQTtBQUNBOztBQUVBOztBQUVBOzs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFLQTtBQU9BO0FBU0E7O0FBRUE7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOzs7O0FBb0RBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQVNBO0FBVUE7QUFDQTtBQWtCQTtBQUVBOzs7QUFLQTs7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFTQTtBQVVBO0FBQ0E7QUFrQkE7QUFFQTs7O0FBS0E7OztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFhQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFRQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUlBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQWdCQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFRQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFNQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUlBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQWVBOztBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUtBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBQUE7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWFBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7O0FBd0JBO0FBRUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUdBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBSUE7O0FBRUE7QUFFQTtBQUVBO0FBR0E7O0FBS0E7QUFFQTtBQWtCQTtBQU1BO0FBRUE7QUFLQTtBQU1BO0FBRUE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUtBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBRUE7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBRUE7O0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFqOUlBO0FBbTlJQTtBQVFBO0FBUEE7QUFDQTtBQUNBO0FBV0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBdkNBO0FBeUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBa0JBO0FBZEE7QUFlQTtBQUNBO0FBQ0E7QUFmQTtBQUFBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFNQTtBQUFBO0FBdEJBO0FBd0JBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFLQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFwU0E7QUFpdUJBO0FBQUE7QUFHQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQU9BOztBQUdBO0FBQ0E7QUFDQTtBQUtBO0FBTUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBTUE7QUFNQTtBQUlBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFNQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUlBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFRQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFLQTtBQU1BO0FBQ0E7QUFDQTs7QUFRQTs7QUFTQTtBQUNBO0FBQ0E7O0FBUUE7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQU1BOztBQWNBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBT0E7QUFFQTtBQWNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFLQTtBQU1BO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQU1BO0FBTUE7QUFJQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFNQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBTUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFJQTtBQUNBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBUUE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBS0E7QUFNQTtBQUNBO0FBQ0E7O0FBUUE7O0FBU0E7QUFDQTtBQUNBOztBQVFBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFHQTtBQU1BO0FBRUE7O0FBa0JBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTs7QUFHQTtBQUVBO0FBT0E7QUFFQTtBQU9BO0FBTUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFPQTtBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBRUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQW5pQ0E7QUFvaUNBO0FBQUE7QUFyaUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmltbGlnaHQtcGxhdGZvcm0vLi9wYWNrYWdlcy9sb25nYW4vc3JjL2xvbmdhbi9ncy52aWV3ZXIudHM/MmE5YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoID0gXCIuL2xvbmdhbi5kLnRzXCIgLz5cclxuLy8gaW1wb3J0IFwiLi9sb25nYW4uZC50c1wiXHJcbmltcG9ydCB7IEF5c25UYXNrTWFuYWdlciB9IGZyb20gXCIuLi9tYW5hZ2Vycy9hc3luVGFza01hbmFnZXJcIjtcclxuaW1wb3J0IHsgUHJvY2VzcyB9IGZyb20gXCIuLi9wcm9jZXNzXCI7XHJcbmltcG9ydCB7IGdldENvb2tpZSB9IGZyb20gXCIuLi91dGlscy9jb29raWVcIjtcclxuaW1wb3J0IHsgTGlzdCwgTnVtYmVyS2V5TGlzdCwgU3RyaW5nS2V5TGlzdCB9IGZyb20gXCIuL2dzLmNvbGxlY3Rpb25zXCI7XHJcbmltcG9ydCB7XHJcbiAgQm91bmRpbmdCb3gsXHJcbiAgREdlb21ldHJ5T3BlcmF0b3JzLFxyXG4gIERQb2ludCxcclxuICBEVG9sZXJhbmNlLFxyXG4gIERWZWN0b3IsXHJcbiAgRFdjcyxcclxuICBQb2ludCxcclxuICBUb2xlcmFuY2UsXHJcbiAgVmVjdG9yLFxyXG59IGZyb20gXCIuL2dzLm1hdGhcIjtcclxuaW1wb3J0IElEQiBmcm9tIFwiLi9pZGJcIjtcclxuaW1wb3J0IHsgRHluYW1pY01lbW9yeVR5cGUgfSBmcm9tIFwiLi9zZWdtZW50XCI7XHJcbmltcG9ydCB7IENhbGN1bGF0ZU5lYXJGYXIgfSBmcm9tIFwiLi91dGlsaXR5XCI7XHJcblxyXG5pbnRlcmZhY2UgRGVjb2RpbmdPYmplY3Qge1xyXG4gIG1vZGVsSWQ6IHN0cmluZztcclxuICB2ZXJzaW9uOiBudW1iZXI7XHJcbiAgZGF0YTogc3RyaW5nIHwgQXJyYXlCdWZmZXI7IC8v57uE55qE5Yeg5L2V5pWw5o2u5rWBLlxyXG4gIGdyb3VwSWRzOiBzdHJpbmc7IC8v57uE55qEaWTliJfooahcclxuICBkaWN0aW9uYXJ5OiB7IFtpZDogc3RyaW5nXTogbnVtYmVyIH07IC8vaWTlkoxzZWdLZXnnmoTlrZflhbhcclxufVxyXG5cclxubGV0IEpTX0luaXRfRGF0YWJhc2UgPSAod2luZG93IGFzIGFueSkuSlNfSW5pdF9EYXRhYmFzZTtcclxubGV0IEpTX0ZpbmFfRGF0YWJhc2UgPSAod2luZG93IGFzIGFueSkuSlNfRmluYV9EYXRhYmFzZTtcclxubGV0IEpTX0luaXRfTXVsdGl0aHJlYWRpbmdfU2VydmljZXMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfSW5pdF9NdWx0aXRocmVhZGluZ19TZXJ2aWNlcztcclxubGV0IEpTX0ZpbmFfTXVsdGl0aHJlYWRpbmdfU2VydmljZXMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfRmluYV9NdWx0aXRocmVhZGluZ19TZXJ2aWNlcztcclxubGV0IEpTX09wZW5fU2VnbWVudCA9ICh3aW5kb3cgYXMgYW55KS5KU19PcGVuX1NlZ21lbnQ7XHJcbmxldCBKU19PcGVuX1NlZ21lbnRfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX09wZW5fU2VnbWVudF9CeV9LZXk7XHJcbmxldCBKU19DbG9zZV9TZWdtZW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0Nsb3NlX1NlZ21lbnQ7XHJcbmxldCBKU19EZWxldGVfU2VnbWVudCA9ICh3aW5kb3cgYXMgYW55KS5KU19EZWxldGVfU2VnbWVudDtcclxubGV0IEpTX0RlbGV0ZV9TZWdtZW50X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19EZWxldGVfU2VnbWVudF9CeV9LZXk7XHJcbmxldCBKU19EZWxldGVfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0RlbGV0ZV9CeV9LZXk7XHJcbmxldCBKU19DbGVhcl9HZW9tZXRyeSA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9HZW9tZXRyeTtcclxubGV0IEpTX0NsZWFyX0dlb21ldHJ5X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9HZW9tZXRyeV9CeV9LZXk7XHJcbmxldCBKU19DbGVhcl9BdHRyaWJ1dGVzID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0F0dHJpYnV0ZXM7XHJcbmxldCBKU19DbGVhcl9BdHRyaWJ1dGVzX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9BdHRyaWJ1dGVzX0J5X0tleTtcclxubGV0IEpTX0NsZWFyX0luY2x1ZGVzID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0luY2x1ZGVzO1xyXG5sZXQgSlNfQ2xlYXJfSW5jbHVkZXNfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0luY2x1ZGVzX0J5X0tleTtcclxubGV0IEpTX0NsZWFyX1N0eWxlcyA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9TdHlsZXM7XHJcbmxldCBKU19DbGVhcl9TdHlsZXNfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX1N0eWxlc19CeV9LZXk7XHJcbmxldCBKU19DbGVhcl9TdWJzZWdtZW50cyA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9TdWJzZWdtZW50cztcclxubGV0IEpTX0NsZWFyX1N1YnNlZ21lbnRzX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9TdWJzZWdtZW50c19CeV9LZXk7XHJcbmxldCBKU19DbGVhcl9BbGwgPSAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfQWxsO1xyXG5sZXQgSlNfQ2xlYXJfQWxsX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9BbGxfQnlfS2V5O1xyXG5sZXQgSlNfSW5jbHVkZV9TZWdtZW50X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19JbmNsdWRlX1NlZ21lbnRfQnlfS2V5O1xyXG5sZXQgSlNfQ29uZGl0aW9uYWxfSW5jbHVkZV9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQ29uZGl0aW9uYWxfSW5jbHVkZV9CeV9LZXk7XHJcbmxldCBKU19TdHlsZV9TZWdtZW50X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19TdHlsZV9TZWdtZW50X0J5X0tleTtcclxubGV0IEpTX0NvbmRpdGlvbmFsX1N0eWxlX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19Db25kaXRpb25hbF9TdHlsZV9CeV9LZXk7XHJcbmxldCBKU19NYWtlX0NvbnRleHRfQ3VycmVudCA9ICh3aW5kb3cgYXMgYW55KS5KU19NYWtlX0NvbnRleHRfQ3VycmVudDtcclxubGV0IEpTX1VwZGF0ZV9EaXNwbGF5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VwZGF0ZV9EaXNwbGF5O1xyXG5sZXQgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXk7XHJcbmxldCBKU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfRnJhbWVyYXRlX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfRnJhbWVyYXRlX0J5X0tleTtcclxubGV0IEpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfV2l0aF9UaW1lX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfVGltZV9CeV9LZXk7XHJcbmxldCBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleTtcclxubGV0IEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0O1xyXG4vLyBsZXQgSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0J5X0tleTtcclxubGV0IEpTX0FzeW5fTmVlZF9VcGRhdGVfVmlld19CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQXN5bl9OZWVkX1VwZGF0ZV9WaWV3X0J5X0tleTtcclxubGV0IEpTX0FzeW5fVXBkYXRlX0NhbWVyYV9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfQXN5bl9VcGRhdGVfQ2FtZXJhX0J5X0tleTtcclxubGV0IEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5O1xyXG5sZXQgSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHQgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHQ7XHJcbmxldCBKU19Bc3luX1JlbmRlcl9WaWV3X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX1JlbmRlcl9WaWV3X0J5X0tleTtcclxubGV0IEpTX0FzeW5fUmVuZGVyX1ZpZXdfV2l0aF9UaW1lX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Bc3luX1JlbmRlcl9WaWV3X1dpdGhfVGltZV9CeV9LZXk7XHJcbmxldCBKU19TaG93X0FzeW5fR2VvbWV0cnlfRGF0YV9LZXlzID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1Nob3dfQXN5bl9HZW9tZXRyeV9EYXRhX0tleXM7XHJcbmxldCBKU19TaG93X0FzeW5fUmVtb3ZlX0dlb21ldHJ5X0RhdGFfS2V5cyA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0FzeW5fUmVtb3ZlX0dlb21ldHJ5X0RhdGFfS2V5cztcclxubGV0IEpTX1Nob3dfQXN5bl9CdWZmZXJfR2VvbWV0cnlfS2V5cyA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0FzeW5fQnVmZmVyX0dlb21ldHJ5X0tleXM7XHJcbmxldCBKU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5O1xyXG5sZXQgSlNfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5X1R0ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0FzeW5fQnVmZmVyX0dlb21ldHJ5X0J5X0tleV9UdDtcclxuXHJcbmxldCBKU19TaG93X0FzeW5fVW5idWZmZXJfR2VvbWV0cnlfS2V5cyA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0FzeW5fVW5idWZmZXJfR2VvbWV0cnlfS2V5cztcclxubGV0IEpTX0FzeW5fVW5idWZmZXJfR2VvbWV0cnlfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0FzeW5fVW5idWZmZXJfR2VvbWV0cnlfQnlfS2V5O1xyXG5sZXQgSlNfU2hvd19LZXlfVHlwZSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0tleV9UeXBlO1xyXG5sZXQgSlNfU2hvd19Pd25lcl9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Pd25lcl9CeV9LZXk7XHJcbmxldCBKU19Db21wdXRlX1BhdGggPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9QYXRoO1xyXG5sZXQgSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXk6IChcclxuICBrZXk6IG51bWJlcixcclxuICBpbl9jb29yZGluYXRlOiBzdHJpbmcsXHJcbiAgaW5fcG9zaXRpb246IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gIG91dF9jb29yZGluYXRlOiBzdHJpbmdcclxuKSA9PiBGbG9hdDMyQXJyYXkgPSBudWxsO1xyXG5sZXQgSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9QYXRoID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfUGF0aDtcclxubGV0IEpTX0RDb21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19EQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXk7XHJcbmxldCBKU19Db21wdXRlX0JvdW5kaW5nYm94X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Db21wdXRlX0JvdW5kaW5nYm94X0J5X0tleTtcclxubGV0IEpTX0NvbXB1dGVfQm91bmRpbmdib3hfV2l0aF9WaXNpYmlsaXR5X0J5X0tleTogKFxyXG4gIGtleTogbnVtYmVyLFxyXG4gIGVsZW1lbnRfdHlwZXM6IEVsZW1lbnRUeXBlXHJcbikgPT4gRmxvYXQzMkFycmF5ID0gbnVsbDtcclxubGV0IEpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveF9CeV9LZXk6IChcclxuICBzZWdfa2V5OiBudW1iZXIsXHJcbiAga2V5OiBudW1iZXJcclxuKSA9PiBGbG9hdDMyQXJyYXkgPSBudWxsO1xyXG5sZXQgSlNfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94X0J5X0tleXMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94X0J5X0tleXM7XHJcbmxldCBKU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hlc19CeV9LZXlzID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveGVzX0J5X0tleXM7XHJcbmxldCBKU19Db21wdXRlX1NlZ21lbnRfQm91bmRpbmdib3hfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0NvbXB1dGVfU2VnbWVudF9Cb3VuZGluZ2JveF9CeV9LZXk7XHJcbmxldCBKU19DbGVhcl9TZWdtZW50X0JvdW5kaW5nYm94X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19DbGVhcl9TZWdtZW50X0JvdW5kaW5nYm94X0J5X0tleTtcclxubGV0IEpTX1Nob3dfQm91bmRpbmdCb3hfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQm91bmRpbmdCb3hfQnlfS2V5O1xyXG5sZXQgSlNfQ29tcHV0ZV9WaXNpYmxlX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX1Zpc2libGVfQnlfS2V5O1xyXG5sZXQgSlNfU2hvd19BdHRyaWJ1dGVfQ291bnQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19BdHRyaWJ1dGVfQ291bnQ7XHJcbmxldCBKU19TaG93X0F0dHJpYnV0ZV9MaXN0ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQXR0cmlidXRlX0xpc3Q7XHJcbmxldCBKU19TaG93X0dlb21ldHJ5X0NvdW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfR2VvbWV0cnlfQ291bnQ7XHJcbmxldCBKU19TaG93X0dlb21ldHJ5X0xpc3QgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19HZW9tZXRyeV9MaXN0O1xyXG5sZXQgSlNfU2hvd19TdWJzZWdtZW50X0NvdW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3Vic2VnbWVudF9Db3VudDtcclxubGV0IEpTX1Nob3dfU3Vic2VnbWVudF9MaXN0ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3Vic2VnbWVudF9MaXN0O1xyXG5sZXQgSlNfU2hvd19BbGxfU3Vic2VnbWVudF9Db3VudCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0FsbF9TdWJzZWdtZW50X0NvdW50O1xyXG5sZXQgSlNfU2hvd19BbGxfU3Vic2VnbWVudF9MaXN0ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQWxsX1N1YnNlZ21lbnRfTGlzdDtcclxubGV0IEpTX1Nob3dfSW5jbHVkZV9Db3VudCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0luY2x1ZGVfQ291bnQ7XHJcbmxldCBKU19TaG93X0luY2x1ZGVfTGlzdCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0luY2x1ZGVfTGlzdDtcclxubGV0IEpTX1Nob3dfSW5jbHVkZSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0luY2x1ZGU7XHJcbmxldCBKU19TaG93X0luY2x1ZGVfU2VnbWVudCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0luY2x1ZGVfU2VnbWVudDtcclxubGV0IEpTX1Nob3dfU3R5bGVfQ291bnQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TdHlsZV9Db3VudDtcclxubGV0IEpTX1Nob3dfU3R5bGVfTGlzdCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1N0eWxlX0xpc3Q7XHJcbmxldCBKU19TaG93X1N0eWxlID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3R5bGU7XHJcbmxldCBKU19TaG93X1N0eWxlX1NlZ21lbnQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TdHlsZV9TZWdtZW50O1xyXG5sZXQgSlNfU2hvd19TZWdtZW50X05hbWUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWdtZW50X05hbWU7XHJcbmxldCBKU19TaG93X1NlZ21lbnRfUGF0aCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NlZ21lbnRfUGF0aDtcclxubGV0IEpTX1NlZ21lbnRfRXhpc3RzID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NlZ21lbnRfRXhpc3RzO1xyXG5sZXQgSlNfTW92ZV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfTW92ZV9LZXk7XHJcbmxldCBKU19Nb3ZlX0tleV9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfTW92ZV9LZXlfQnlfS2V5O1xyXG5sZXQgSlNfUmVuYW1lX1NlZ21lbnQgPSAod2luZG93IGFzIGFueSkuSlNfUmVuYW1lX1NlZ21lbnQ7XHJcbmxldCBKU19BZGRfUHJvcGVydHlfQm9vbGVhbiA9ICh3aW5kb3cgYXMgYW55KS5KU19BZGRfUHJvcGVydHlfQm9vbGVhbjtcclxubGV0IEpTX0FkZF9Qcm9wZXJ0eV9JbnRlZ2VyID0gKHdpbmRvdyBhcyBhbnkpLkpTX0FkZF9Qcm9wZXJ0eV9JbnRlZ2VyO1xyXG5sZXQgSlNfQWRkX1Byb3BlcnR5X0RvdWJsZSA9ICh3aW5kb3cgYXMgYW55KS5KU19BZGRfUHJvcGVydHlfRG91YmxlO1xyXG5sZXQgSlNfQWRkX1Byb3BlcnR5X1N0cmluZyA9ICh3aW5kb3cgYXMgYW55KS5KU19BZGRfUHJvcGVydHlfU3RyaW5nO1xyXG5sZXQgSlNfQWRkX1Byb3BlcnR5X0pzb24gPSAod2luZG93IGFzIGFueSkuSlNfQWRkX1Byb3BlcnR5X0pzb247XHJcbmxldCBKU19TaG93X1Byb3BlcnR5X1R5cGUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qcm9wZXJ0eV9UeXBlO1xyXG5sZXQgSlNfU2hvd19Qcm9wZXJ0eV9Cb29sZWFuID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUHJvcGVydHlfQm9vbGVhbjtcclxubGV0IEpTX1Nob3dfUHJvcGVydHlfSW50ZWdlciA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Byb3BlcnR5X0ludGVnZXI7XHJcbmxldCBKU19TaG93X1Byb3BlcnR5X0RvdWJsZSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Byb3BlcnR5X0RvdWJsZTtcclxubGV0IEpTX1Nob3dfUHJvcGVydHlfU3RyaW5nID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUHJvcGVydHlfU3RyaW5nO1xyXG5sZXQgSlNfUHJvcGVydHlfRXhpc3RzID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Byb3BlcnR5X0V4aXN0cztcclxubGV0IEpTX1JlbW92ZV9Qcm9wZXJ0eSA9ICh3aW5kb3cgYXMgYW55KS5KU19SZW1vdmVfUHJvcGVydHk7XHJcbmxldCBKU19DbGVhcl9Qcm9wZXJ0aWVzID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX1Byb3BlcnRpZXM7XHJcbmxldCBKU19TaG93X1Byb3BlcnRpZXMgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qcm9wZXJ0aWVzO1xyXG5sZXQgSlNfU2hvd19LZXlfQnlfSWQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19LZXlfQnlfSWQ7XHJcbmxldCBKU19TZXRfS2V5X0luZGV4ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9LZXlfSW5kZXg7XHJcbmxldCBKU19TaG93X0tleV9JbmRleCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0tleV9JbmRleDtcclxubGV0IEpTX1Nob3dfS2V5X1RhZyA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0tleV9UYWc7XHJcbmxldCBKU19Db21wdXRlX1NlbGVjdGlvbl9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9TZWxlY3Rpb25fQnlfS2V5O1xyXG5sZXQgSlNfQ29tcHV0ZV9TZWxlY3Rpb25fQnlfQXJlYSA9ICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX1NlbGVjdGlvbl9CeV9BcmVhO1xyXG5sZXQgSlNfU2hvd19TZWxlY3Rpb25fQ291bnQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3Rpb25fQ291bnQ7XHJcbmxldCBKU19TaG93X1NlbGVjdGlvbl9FbGVtZW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX0VsZW1lbnQ7XHJcbmxldCBKU19TaG93X1NlbGVjdGlvbl9QYXRoID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX1BhdGg7XHJcbmxldCBKU19TaG93X1NlbGVjdGlvbl9QYXRoX0J5X0tleXMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19TZWxlY3Rpb25fUGF0aF9CeV9LZXlzO1xyXG5sZXQgSlNfU2hvd19TZWxlY3Rpb25fUG9zaXRpb24gPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3Rpb25fUG9zaXRpb247XHJcbmxldCBKU19TaG93X1NlbGVjdGlvbl9QYXJhbSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NlbGVjdGlvbl9QYXJhbTtcclxubGV0IEpTX1Nob3dfU2VsZWN0aW9uX0luZGV4ZXMgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3Rpb25fSW5kZXhlcztcclxubGV0IEpTX1Nob3dfU2VsZWN0aW9uX1Rlc3RfSW5mbyA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NlbGVjdGlvbl9UZXN0X0luZm87XHJcbmxldCBKU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlzOiAoXHJcbiAgdmlld0tleTogbnVtYmVyLFxyXG4gIG9uZUtleXM6IEludDMyQXJyYXksXHJcbiAgdHdvS2V5czogSW50MzJBcnJheSxcclxuICB0eXBlOiBDb2xsaXNpb25UeXBlXHJcbikgPT4gbnVtYmVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleXM7XHJcbmxldCBKU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXk6IChcclxuICB2aWV3S2V5OiBudW1iZXIsXHJcbiAgb25lS2V5OiBudW1iZXIsXHJcbiAgdHdvS2V5OiBudW1iZXIsXHJcbiAgdHlwZTogQ29sbGlzaW9uVHlwZSxcclxuICBvcHRpb25zOiBzdHJpbmdcclxuKSA9PiBudW1iZXIgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5O1xyXG5sZXQgSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5X1R0OiAoXHJcbiAgdmlld2tleTogbnVtYmVyLFxyXG4gIG9uZUtleTogbnVtYmVyLFxyXG4gIHR3b0tleTogbnVtYmVyLFxyXG4gIHR5cGU6IENvbGxpc2lvblR5cGUsXHJcbiAgbm86IG51bWJlcixcclxuICBvcHRpb25zOiBzdHJpbmdcclxuKSA9PiB2b2lkID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleV9UdDtcclxubGV0IEpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleXNfVHQ6IChcclxuICB2aWV3X2tleTogbnVtYmVyLFxyXG4gIG9uZUtleXM6IEludDMyQXJyYXksXHJcbiAgdHdvS2V5czogSW50MzJBcnJheSxcclxuICB0eXBlOiBDb2xsaXNpb25UeXBlXHJcbikgPT4gbnVtYmVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleXNfVHQ7XHJcbmxldCBKU19TaG93X0NvbGxpc2lvbl9TdGF0dXMgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Db2xsaXNpb25fU3RhdHVzO1xyXG5sZXQgSlNfU2hvd19Db2xsaXNpb25fQ291bnQ6ICgpID0+IG51bWJlciA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0NvbGxpc2lvbl9Db3VudDtcclxubGV0IEpTX1Nob3dfQ29sbGlzaW9uX0VsZW1lbnRzOiAoaW5kZXg6IG51bWJlcikgPT4gSW50MzJBcnJheSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0NvbGxpc2lvbl9FbGVtZW50cztcclxubGV0IEpTX1Nob3dfQ29sbGlzaW9uX1BhdGhzID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ29sbGlzaW9uX1BhdGhzO1xyXG5sZXQgSlNfU2hvd19Db2xsaXNpb25fUGF0aF9CeV9LZXlzOiAoaW5kZXg6IG51bWJlcikgPT4gSW50MzJBcnJheVtdID0gKFxyXG4gIHdpbmRvdyBhcyBhbnlcclxuKS5KU19TaG93X0NvbGxpc2lvbl9QYXRoX0J5X0tleXM7XHJcbmxldCBKU19TaG93X0NvbGxpc2lvbl9Qb3NpdGlvbjogKGluZGV4OiBudW1iZXIpID0+IEZsb2F0MzJBcnJheSA9IChcclxuICB3aW5kb3cgYXMgYW55XHJcbikuSlNfU2hvd19Db2xsaXNpb25fUG9zaXRpb247XHJcbmxldCBKU19TaG93X0NvbGxpc2lvbl9UeXBlOiAoaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1Nob3dfQ29sbGlzaW9uX1R5cGU7XHJcblxyXG5sZXQgSlNfQWRkX0ZvbnRfTGlicmFyeSA9ICh3aW5kb3cgYXMgYW55KS5KU19BZGRfRm9udF9MaWJyYXJ5O1xyXG5sZXQgSlNfRm9udF9MaWJyYXJ5X0V4aXN0cyA9ICh3aW5kb3cgYXMgYW55KS5KU19Gb250X0xpYnJhcnlfRXhpc3RzO1xyXG5sZXQgSlNfUmVtb3ZlX0ZvbnRfTGlicmFyeSA9ICh3aW5kb3cgYXMgYW55KS5KU19SZW1vdmVfRm9udF9MaWJyYXJ5O1xyXG5sZXQgSlNfQ2xlYXJfRm9udF9MaWJyYXJ5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0ZvbnRfTGlicmFyeTtcclxubGV0IEpTX1NldF9Ecml2ZXJfQ29uZmlncyA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfRHJpdmVyX0NvbmZpZ3M7XHJcbmxldCBKU19TZXRfRHJpdmVyX09wdGlvbnMgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X0RyaXZlcl9PcHRpb25zO1xyXG5sZXQgSlNfU2hvd19Ecml2ZXJfT3B0aW9ucyA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0RyaXZlcl9PcHRpb25zO1xyXG5sZXQgSlNfU2hvd19PbmVfRHJpdmVyX09wdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X09uZV9Ecml2ZXJfT3B0aW9uO1xyXG5sZXQgSlNfU2V0X1NoYWRlciA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfU2hhZGVyO1xyXG5sZXQgSlNfU2hvd19TaGFkZXIgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TaGFkZXI7XHJcbmxldCBKU19TaG93X09uZV9TaGFkZXIgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfU2hhZGVyO1xyXG5sZXQgSlNfVW5TZXRfU2hhZGVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X1NoYWRlcjtcclxubGV0IEpTX1NldF9WaWV3cG9ydCA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfVmlld3BvcnQ7XHJcbmxldCBKU19TZXRfQ2FtZXJhID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmE7XHJcbmxldCBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmFfUG9zaXRpb247XHJcbmxldCBKU19TZXRfQ2FtZXJhX1RhcmdldCA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ2FtZXJhX1RhcmdldDtcclxubGV0IEpTX1NldF9DYW1lcmFfVXAgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X0NhbWVyYV9VcDtcclxubGV0IEpTX1NldF9DYW1lcmFfRmllbGQgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X0NhbWVyYV9GaWVsZDtcclxubGV0IEpTX1NldF9DYW1lcmFfRXh0ZW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmFfRXh0ZW50O1xyXG5sZXQgSlNfU2V0X0NhbWVyYV9Qcm9qZWN0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmFfUHJvamVjdGlvbjtcclxubGV0IEpTX0tlZXBfQ2FtZXJhX1JhdGlvID0gKHdpbmRvdyBhcyBhbnkpLkpTX0tlZXBfQ2FtZXJhX1JhdGlvO1xyXG5sZXQgSlNfU2hvd19DYW1lcmEgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmE7XHJcbmxldCBKU19TaG93X0NhbWVyYV9Qb3NpdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9Qb3NpdGlvbjtcclxubGV0IEpTX1Nob3dfQ2FtZXJhX1RhcmdldCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9UYXJnZXQ7XHJcbmxldCBKU19TaG93X0NhbWVyYV9VcCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9VcDtcclxubGV0IEpTX1Nob3dfQ2FtZXJhX0ZpZWxkID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2FtZXJhX0ZpZWxkO1xyXG5sZXQgSlNfU2hvd19DYW1lcmFfRXh0ZW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2FtZXJhX0V4dGVudDtcclxubGV0IEpTX1Nob3dfQ2FtZXJhX1Byb2plY3Rpb24gPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfUHJvamVjdGlvbjtcclxubGV0IEpTX1Nob3dfQ2FtZXJhX1Byb2plY3Rpb25fTWF0cml4ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1Nob3dfQ2FtZXJhX1Byb2plY3Rpb25fTWF0cml4O1xyXG5sZXQgSlNfU2hvd19DYW1lcmFfVmlld19NYXRyaXggPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfVmlld19NYXRyaXg7XHJcbmxldCBKU19TaG93X1BhdGhfQ2FtZXJhX1Bvc2l0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUGF0aF9DYW1lcmFfUG9zaXRpb247XHJcbmxldCBKU19TaG93X1BhdGhfQ2FtZXJhX1RhcmdldCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1BhdGhfQ2FtZXJhX1RhcmdldDtcclxubGV0IEpTX0RvbGx5X0NhbWVyYSA9ICh3aW5kb3cgYXMgYW55KS5KU19Eb2xseV9DYW1lcmE7XHJcbmxldCBKU19Sb2xsX0NhbWVyYSA9ICh3aW5kb3cgYXMgYW55KS5KU19Sb2xsX0NhbWVyYTtcclxubGV0IEpTX1pvb21fQ2FtZXJhID0gKHdpbmRvdyBhcyBhbnkpLkpTX1pvb21fQ2FtZXJhO1xyXG5sZXQgSlNfVW5TZXRfQ2FtZXJhID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X0NhbWVyYTtcclxubGV0IEpTX1NldF9Db2xvciA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ29sb3I7XHJcbmxldCBKU19VblNldF9Db2xvciA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9Db2xvcjtcclxubGV0IEpTX1VuU2V0X09uZV9Db2xvciA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9PbmVfQ29sb3I7XHJcbmxldCBKU19TaG93X0NvbG9yID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ29sb3I7XHJcbmxldCBKU19TaG93X09uZV9Db2xvciA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X09uZV9Db2xvcjtcclxubGV0IEpTX1Nob3dfQ29sb3JfQnlfVmFsdWUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Db2xvcl9CeV9WYWx1ZTtcclxubGV0IEpTX1NldF9HZW9tZXRyeV9Db2xvciA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfR2VvbWV0cnlfQ29sb3I7XHJcbmxldCBKU19TZXRfR2VvbWV0cnlfQ29sb3JfQnlfVmFsdWUgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2V0X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlO1xyXG5sZXQgSlNfU2hvd19HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlO1xyXG5sZXQgSlNfVW5TZXRfR2VvbWV0cnlfQ29sb3IgPSAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfR2VvbWV0cnlfQ29sb3I7XHJcbmxldCBKU19TZXRfVmlzaWJpbGl0eSA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfVmlzaWJpbGl0eTtcclxubGV0IEpTX1VuU2V0X1Zpc2liaWxpdHkgPSAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfVmlzaWJpbGl0eTtcclxubGV0IEpTX1VuU2V0X09uZV9WaXNpYmlsaXR5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X09uZV9WaXNpYmlsaXR5O1xyXG5sZXQgSlNfU2hvd19WaXNpYmlsaXR5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfVmlzaWJpbGl0eTtcclxubGV0IEpTX1Nob3dfT25lX1Zpc2liaWxpdHkgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfVmlzaWJpbGl0eTtcclxubGV0IEpTX1NldF9TZWxlY3RhYmlsaXR5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9TZWxlY3RhYmlsaXR5O1xyXG5sZXQgSlNfVW5TZXRfU2VsZWN0YWJpbGl0eSA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9TZWxlY3RhYmlsaXR5O1xyXG5sZXQgSlNfVW5TZXRfT25lX1NlbGVjdGFiaWxpdHkgPSAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfT25lX1NlbGVjdGFiaWxpdHk7XHJcbmxldCBKU19TaG93X1NlbGVjdGFiaWxpdHkgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3RhYmlsaXR5O1xyXG5sZXQgSlNfU2hvd19PbmVfU2VsZWN0YWJpbGl0eSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X09uZV9TZWxlY3RhYmlsaXR5O1xyXG5sZXQgSlNfU2V0X01vZGVsbGluZ01hdHJpeCA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfTW9kZWxsaW5nTWF0cml4O1xyXG5sZXQgSlNfQXBwZW5kX01vZGVsbGluZ01hdHJpeCA9ICh3aW5kb3cgYXMgYW55KS5KU19BcHBlbmRfTW9kZWxsaW5nTWF0cml4O1xyXG5sZXQgSlNfU2hvd19Nb2RlbGxpbmdNYXRyaXggPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Nb2RlbGxpbmdNYXRyaXg7XHJcbmxldCBKU19TaG93X1BhdGhfTW9kZWxsaW5nTWF0cml4ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUGF0aF9Nb2RlbGxpbmdNYXRyaXg7XHJcbmxldCBKU19VblNldF9Nb2RlbGxpbmdNYXRyaXggPSAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfTW9kZWxsaW5nTWF0cml4O1xyXG5sZXQgSlNfU2V0X1JlbmRlcmluZ19PcHRpb25zID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9SZW5kZXJpbmdfT3B0aW9ucztcclxubGV0IEpTX1VuU2V0X1JlbmRlcmluZ19PcHRpb25zID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X1JlbmRlcmluZ19PcHRpb25zO1xyXG5sZXQgSlNfVW5TZXRfT25lX1JlbmRlcmluZ19PcHRpb24gPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfVW5TZXRfT25lX1JlbmRlcmluZ19PcHRpb247XHJcbmxldCBKU19TaG93X1JlbmRlcmluZ19PcHRpb25zID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUmVuZGVyaW5nX09wdGlvbnM7XHJcbmxldCBKU19TaG93X09uZV9SZW5kZXJpbmdfT3B0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX1JlbmRlcmluZ19PcHRpb247XHJcbmxldCBKU19TaG93X09uZV9EZWZhdWx0X1JlbmRlcmluZ19PcHRpb24gPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19PbmVfRGVmYXVsdF9SZW5kZXJpbmdfT3B0aW9uO1xyXG5sZXQgSlNfU2hvd19PbmVfUGF0aF9SZW5kZXJpbmdfT3B0aW9uID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1Nob3dfT25lX1BhdGhfUmVuZGVyaW5nX09wdGlvbjtcclxubGV0IEpTX1NldF9IZXVyaXN0aWNfT3B0aW9ucyA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfSGV1cmlzdGljX09wdGlvbnM7XHJcbmxldCBKU19TZXRfT25lX0hldXJpc3RpY19PcHRpb24gPSAod2luZG93IGFzIGFueSkuSlNfU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uO1xyXG5sZXQgSlNfVW5TZXRfSGV1cmlzdGljX09wdGlvbnMgPSAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfSGV1cmlzdGljX09wdGlvbnM7XHJcbmxldCBKU19VblNldF9PbmVfSGV1cmlzdGljX09wdGlvbiA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19VblNldF9PbmVfSGV1cmlzdGljX09wdGlvbjtcclxubGV0IEpTX1Nob3dfSGV1cmlzdGljX09wdGlvbnMgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19IZXVyaXN0aWNfT3B0aW9ucztcclxubGV0IEpTX1Nob3dfT25lX0hldXJpc3RpY19PcHRpb24gPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfSGV1cmlzdGljX09wdGlvbjtcclxubGV0IEpTX1NldF9Db25kaXRpb24gPSAod2luZG93IGFzIGFueSkuSlNfU2V0X0NvbmRpdGlvbjtcclxubGV0IEpTX1Nob3dfQ29uZGl0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ29uZGl0aW9uO1xyXG5sZXQgSlNfVW5TZXRfQ29uZGl0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X0NvbmRpdGlvbjtcclxubGV0IEpTX1NldF9UZXh0X0ZvbnQgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X1RleHRfRm9udDtcclxubGV0IEpTX1VuU2V0X1RleHRfRm9udCA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9UZXh0X0ZvbnQ7XHJcbmxldCBKU19VblNldF9PbmVfVGV4dF9Gb250ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X09uZV9UZXh0X0ZvbnQ7XHJcbmxldCBKU19TaG93X1RleHRfRm9udCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1RleHRfRm9udDtcclxubGV0IEpTX1Nob3dfT25lX1RleHRfRm9udCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X09uZV9UZXh0X0ZvbnQ7XHJcbmxldCBKU19BdHRyaWJ1dGVfRXhpc3RzID0gKHdpbmRvdyBhcyBhbnkpLkpTX0F0dHJpYnV0ZV9FeGlzdHM7XHJcbmxldCBKU19JbWFnZV9FeGlzdHMgPSAod2luZG93IGFzIGFueSkuSlNfSW1hZ2VfRXhpc3RzO1xyXG5sZXQgSlNfUmVzaXplX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19SZXNpemVfQnlfS2V5O1xyXG5sZXQgSlNfSW5zZXJ0X01hcmtlciA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfTWFya2VyO1xyXG5sZXQgSlNfRWRpdF9NYXJrZXIgPSAod2luZG93IGFzIGFueSkuSlNfRWRpdF9NYXJrZXI7XHJcbmxldCBKU19TaG93X01hcmtlciA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X01hcmtlcjtcclxubGV0IEpTX0luc2VydF9Qb2ludF9DbG91ZCA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfUG9pbnRfQ2xvdWQ7XHJcbmxldCBKU19FZGl0X1BvaW50X0Nsb3VkID0gKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfUG9pbnRfQ2xvdWQ7XHJcbmxldCBKU19TaG93X1BvaW50X0Nsb3VkID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUG9pbnRfQ2xvdWQ7XHJcbmxldCBKU19JbnNlcnRfTGluZSA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfTGluZTtcclxubGV0IEpTX1Nob3dfTGluZSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0xpbmU7XHJcbmxldCBKU19FZGl0X0xpbmUgPSAod2luZG93IGFzIGFueSkuSlNfRWRpdF9MaW5lO1xyXG5sZXQgSlNfSW5zZXJ0X1BvbHlsaW5lID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9Qb2x5bGluZTtcclxubGV0IEpTX1Nob3dfUG9seWxpbmVfQ291bnQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qb2x5bGluZV9Db3VudDtcclxubGV0IEpTX1Nob3dfUG9seWxpbmUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qb2x5bGluZTtcclxubGV0IEpTX0luc2VydF9DaXJjbGUgPSAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X0NpcmNsZTtcclxubGV0IEpTX1Nob3dfQ2lyY2xlID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2lyY2xlO1xyXG5sZXQgSlNfSW5zZXJ0X0N5bGluZGVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9DeWxpbmRlcjtcclxubGV0IEpTX1Nob3dfQ3lsaW5kZXIgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19DeWxpbmRlcjtcclxubGV0IEpTX0luc2VydF9Qb2x5Q3lsaW5kZXIgPSAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X1BvbHlDeWxpbmRlcjtcclxubGV0IEpTX0VkaXRfUG9seUN5bGluZGVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfUG9seUN5bGluZGVyO1xyXG5sZXQgSlNfSW5zZXJ0X1NoZWxsID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9TaGVsbDtcclxubGV0IEpTX0VkaXRfU2hlbGwgPSAod2luZG93IGFzIGFueSkuSlNfRWRpdF9TaGVsbDtcclxubGV0IEpTX1Nob3dfU2hlbGxfU2l6ZSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NoZWxsX1NpemU7XHJcbmxldCBKU19TaG93X1NoZWxsID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2hlbGw7XHJcbmxldCBKU19JbnNlcnRfVHJpYW5ndWxhcl9TaGVsbCA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfVHJpYW5ndWxhcl9TaGVsbDtcclxubGV0IEpTX0luc2VydF9NZXNoID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9NZXNoO1xyXG5sZXQgSlNfRWRpdF9NZXNoX1BvaW50cyA9ICh3aW5kb3cgYXMgYW55KS5KU19FZGl0X01lc2hfUG9pbnRzO1xyXG5sZXQgSlNfU2hvd19NZXNoX1NpemUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19NZXNoX1NpemU7XHJcbmxldCBKU19TaG93X01lc2ggPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19NZXNoO1xyXG5sZXQgSlNfSW5zZXJ0X1ZlY3Rvcl9UZXh0ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9WZWN0b3JfVGV4dDtcclxubGV0IEpTX0luc2VydF9QYXJhbWV0cmljX0dlb21ldHJ5OiAoXHJcbiAgdHlwZTogc3RyaW5nLFxyXG4gIHBhcmFtczogRmxvYXQ2NEFycmF5XHJcbikgPT4gbnVtYmVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9QYXJhbWV0cmljX0dlb21ldHJ5O1xyXG5sZXQgSlNfSW5zZXJ0X1BhcmFtZXRyaWNfR2VvbWV0cmllczogKFxyXG4gIHR5cGU6IHN0cmluZyxcclxuICBwYXJhbXM6IEZsb2F0NjRBcnJheSxcclxuICBnZW9Db3VudDogbnVtYmVyXHJcbikgPT4gbnVtYmVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9QYXJhbWV0cmljX0dlb21ldHJpZXM7XHJcblxyXG5sZXQgSlNfRWRpdF9QYXJhbWV0cmljX0dlb21ldHJ5OiAoXHJcbiAga2V5OiBudW1iZXIsXHJcbiAgdHlwZTogc3RyaW5nLFxyXG4gIHBhcmFtczogRmxvYXQ2NEFycmF5XHJcbikgPT4gbnVtYmVyID0gbnVsbDtcclxubGV0IEpTX1Nob3dfUGFyYW1ldHJpY19HZW9tZXRyeTogKGtleTogbnVtYmVyKSA9PiB7XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIHBhcmFtczogRmxvYXQ2NEFycmF5O1xyXG59ID0gbnVsbDtcclxubGV0IEpTX0luc2VydF9MaWdodCA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfTGlnaHQ7XHJcbmxldCBKU19FZGl0X0xpZ2h0ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfTGlnaHQ7XHJcbmxldCBKU19TaG93X0xpZ2h0ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfTGlnaHQ7XHJcbmxldCBKU19JbnNlcnRfSW1hZ2UgPSAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X0ltYWdlO1xyXG5sZXQgSlNfU2V0X0ltYWdlX09wdGlvbnMgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X0ltYWdlX09wdGlvbnM7XHJcbmxldCBKU19VblNldF9PbmVfSW1hZ2VfT3B0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X09uZV9JbWFnZV9PcHRpb247XHJcbmxldCBKU19TaG93X0ltYWdlX1Bvc2l0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSW1hZ2VfUG9zaXRpb247XHJcbmxldCBKU19TaG93X0ltYWdlX1NpemUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbWFnZV9TaXplO1xyXG5sZXQgSlNfU2hvd19JbWFnZV9EYXRhID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSW1hZ2VfRGF0YTtcclxubGV0IEpTX1Nob3dfSW1hZ2VfT3B0aW9ucyA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0ltYWdlX09wdGlvbnM7XHJcbmxldCBKU19TaG93X09uZV9JbWFnZV9PcHRpb24gPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfSW1hZ2VfT3B0aW9uO1xyXG5sZXQgSlNfU2hvd19JbWFnZSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0ltYWdlO1xyXG5sZXQgSlNfSW5zZXJ0X0N1dHRpbmdfUGxhbmVzID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9DdXR0aW5nX1BsYW5lcztcclxubGV0IEpTX0VkaXRfQ3V0dGluZ19QbGFuZXMgPSAod2luZG93IGFzIGFueSkuSlNfRWRpdF9DdXR0aW5nX1BsYW5lcztcclxubGV0IEpTX1Nob3dfQ3V0dGluZ19QbGFuZXMgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19DdXR0aW5nX1BsYW5lcztcclxubGV0IEpTX1Nob3dfR2VvbWV0cnlfVmVydGljZXNfUG9zaXRpb25fQnlfSW5kZXhlcyA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0dlb21ldHJ5X1ZlcnRpY2VzX1Bvc2l0aW9uX0J5X0luZGV4ZXM7XHJcbmxldCBKU19TaG93X0dlb21ldHJ5X0VsZW1lbnRfVHlwZSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0dlb21ldHJ5X0VsZW1lbnRfVHlwZTtcclxubGV0IEpTX1NldF9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TZXRfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHM7XHJcbmxldCBKU19TaG93X0dlb21ldHJ5X1RleHR1cmVfRGltZW5zaW9uID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1Nob3dfR2VvbWV0cnlfVGV4dHVyZV9EaW1lbnNpb247XHJcbmxldCBKU19TaG93X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1Nob3dfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHM7XHJcbmxldCBKU19VblNldF9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19VblNldF9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcztcclxubGV0IEpTX0NvbXB1dGVfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQ29tcHV0ZV9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcztcclxubGV0IEpTX1NldF9HZW9tZXRyeV9Ob3JtYWxzID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9HZW9tZXRyeV9Ob3JtYWxzO1xyXG5sZXQgSlNfU2hvd19HZW9tZXRyeV9Ob3JtYWxzOiAoXHJcbiAga2V5OiBudW1iZXIsXHJcbiAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgY291bnQ6IG51bWJlclxyXG4pID0+IEZsb2F0MzJBcnJheSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0dlb21ldHJ5X05vcm1hbHM7XHJcbmxldCBKU19VblNldF9HZW9tZXRyeV9Ob3JtYWxzID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X0dlb21ldHJ5X05vcm1hbHM7XHJcblxyXG5sZXQgSlNfQ29tcHV0ZV9HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGE6IChcclxuICBrZXk6IG51bWJlcixcclxuICBpbWFnZV9rZXk6IG51bWJlcixcclxuICBvcHRpb25zOiBzdHJpbmdcclxuKSA9PiB7XHJcbiAgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXk7XHJcbiAgaW5kZXhlczogSW50MzJBcnJheTtcclxuICBub3JtYWxzOiBGbG9hdDMyQXJyYXk7XHJcbiAgdGV4Y29vcmRzOiBGbG9hdDMyQXJyYXk7XHJcbn0gPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGE7XHJcbmxldCBKU19Db21wdXRlX0dlb21ldHJ5X0RhdGEgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9HZW9tZXRyeV9EYXRhO1xyXG5sZXQgSlNfTWVyZ2VfU2hlbGwgPSAod2luZG93IGFzIGFueSkuSlNfTWVyZ2VfU2hlbGw7XHJcblxyXG5sZXQgSlNfRXh0cnVkZV9CeV9TaGVsbCA9ICh3aW5kb3cgYXMgYW55KS5KU19FeHRydWRlX0J5X1NoZWxsO1xyXG5sZXQgSlNfU3dlZXBfQnlfU2hlbGwgPSAod2luZG93IGFzIGFueSkuSlNfU3dlZXBfQnlfU2hlbGw7XHJcbmxldCBKU19EU3dlZXBfQnlfU2hlbGwgPSAod2luZG93IGFzIGFueSkuSlNfRFN3ZWVwX0J5X1NoZWxsO1xyXG5sZXQgSlNfREV4dHJ1ZGVfQnlfU2hlbGwgPSAod2luZG93IGFzIGFueSkuSlNfREV4dHJ1ZGVfQnlfU2hlbGw7XHJcbmxldCBKU19Sb3RhdGVfQnlfU2hlbGwgPSAod2luZG93IGFzIGFueSkuSlNfUm90YXRlX0J5X1NoZWxsO1xyXG5sZXQgSlNfRFJvdGF0ZV9CeV9TaGVsbCA9ICh3aW5kb3cgYXMgYW55KS5KU19EUm90YXRlX0J5X1NoZWxsO1xyXG5cclxubGV0IEpTX0NvbXB1dGVfUmF5X1Rlc3Q6IChcclxuICB2aWV3X2tleTogbnVtYmVyLFxyXG4gIG9yaWdpbjogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgZGlyZWN0OiBBcnJheUxpa2U8bnVtYmVyPlxyXG4pID0+IEZsb2F0MzJBcnJheSA9ICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX1JheV9UZXN0O1xyXG5sZXQgSlNfQ29tcHV0ZV9HZW9tZXRyeV9SYXlfVGVzdDogKFxyXG4gIHZpZXdfa2V5OiBudW1iZXIsXHJcbiAgZ2VvbV9rZXk6IG51bWJlcixcclxuICBvcmlnaW46IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gIGRpcmVjdDogQXJyYXlMaWtlPG51bWJlcj5cclxuKSA9PiBGbG9hdDMyQXJyYXkgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9HZW9tZXRyeV9SYXlfVGVzdDtcclxubGV0IEpTX0NvbXB1dGVfQm94X1Rlc3QgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Cb3hfVGVzdDtcclxuXHJcbmxldCBKU19Db21wdXRlX1BvbHlnb25fQXJlYSA9ICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX1BvbHlnb25fQXJlYTtcclxubGV0IEpTX0NvbXB1dGVfQXJlYTogKGtleTogbnVtYmVyKSA9PiBhbnkgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9BcmVhO1xyXG5sZXQgSlNfQ29tcHV0ZV9Wb2x1bWU6IChrZXk6IG51bWJlcikgPT4gYW55ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfVm9sdW1lO1xyXG5sZXQgSlNfSXNfU29saWRfR2VvbWV0cnk6IChrZXk6IG51bWJlcikgPT4gYm9vbGVhbiA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Jc19Tb2xpZF9HZW9tZXRyeTtcclxubGV0IEpTX0NvbXB1dGVfR2VvbWV0cnlfRGlzdGFuY2U6IChcclxuICBnZW9tS2V5MTogbnVtYmVyLFxyXG4gIGdlb21LZXkyOiBudW1iZXIsXHJcbiAgcGF0aDE6IEludDMyQXJyYXksXHJcbiAgcGF0aDI6IEludDMyQXJyYXlcclxuKSA9PiBGbG9hdDMyQXJyYXkgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9HZW9tZXRyeV9EaXN0YW5jZTtcclxuXHJcbmxldCBKU19TZWdtZW50X1RvX1N0cmVhbSA9ICh3aW5kb3cgYXMgYW55KS5KU19TZWdtZW50X1RvX1N0cmVhbTtcclxubGV0IEpTX1NlZ21lbnRfVG9fU3RyZWFtX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19TZWdtZW50X1RvX1N0cmVhbV9CeV9LZXk7XHJcbmxldCBKU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1NlZ21lbnRfVG9fU3RyZWFtX1dpdGhfQ29tcHJlc3Npb247XHJcbmxldCBKU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uX0J5X0tleTtcclxubGV0IEpTX1N0cmVhbV9Ub19TZWdtZW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1N0cmVhbV9Ub19TZWdtZW50O1xyXG5sZXQgSlNfU3RyZWFtX1RvX1NlZ21lbnRfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1N0cmVhbV9Ub19TZWdtZW50X0J5X0tleTtcclxubGV0IEpTX1N0cmVhbV9Ub19TZWdtZW50X0J5X0tleV9UdCA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TdHJlYW1fVG9fU2VnbWVudF9CeV9LZXlfVHQ7XHJcbmxldCBKU19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbl9Ub19TZWdtZW50X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbl9Ub19TZWdtZW50X0J5X0tleTtcclxubGV0IEpTX1NlZ21lbnRfRGF0YV9Ub19TdHJlYW0gPSAod2luZG93IGFzIGFueSkuSlNfU2VnbWVudF9EYXRhX1RvX1N0cmVhbTtcclxubGV0IEpTX1N0cmVhbV9Ub19TZWdtZW50X0RhdGEgPSAod2luZG93IGFzIGFueSkuSlNfU3RyZWFtX1RvX1NlZ21lbnRfRGF0YTtcclxubGV0IEpTX0dlb21ldHJ5X0RhdGFfVG9fU3RyZWFtID0gKHdpbmRvdyBhcyBhbnkpLkpTX0dlb21ldHJ5X0RhdGFfVG9fU3RyZWFtO1xyXG5sZXQgSlNfR2VvbWV0cnlfRGF0YV9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbiA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19HZW9tZXRyeV9EYXRhX1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uO1xyXG5sZXQgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGEgPSAod2luZG93IGFzIGFueSkuSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGE7XHJcbmxldCBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5O1xyXG5sZXQgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5cyA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzO1xyXG5sZXQgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5c19UdCA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzX1R0O1xyXG5sZXQgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfV2l0aF9Db21wcmVzc2lvbiA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9XaXRoX0NvbXByZXNzaW9uO1xyXG5sZXQgSlNfQ29weV9TZWdtZW50X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19Db3B5X1NlZ21lbnRfQnlfS2V5O1xyXG5cclxubGV0IEpTX1Nob3dfRGF0YWJhc2VfSW5mbyA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0RhdGFiYXNlX0luZm87XHJcbmxldCBKU19TaG93X0FsbG9jYXRlZF9NZW1vcnlfU2l6ZSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0FsbG9jYXRlZF9NZW1vcnlfU2l6ZTtcclxubGV0IEpTX0V4ZWN1dGVfVGFza19Qb3N0X1Byb2Nlc3NpbmcgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfRXhlY3V0ZV9UYXNrX1Bvc3RfUHJvY2Vzc2luZztcclxuXHJcbmxldCBKU19DcmVhdGVfVGV4dHVyZTogKGJ1ZmZlcjogbnVtYmVyKSA9PiBXZWJHTFRleHR1cmUgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQ3JlYXRlX1RleHR1cmU7XHJcblxyXG5sZXQgSlNfQm9vbGVhbl9JbnRlcnNlY3Rpb25fR3JhcGggPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQm9vbGVhbl9JbnRlcnNlY3Rpb25fR3JhcGg7XHJcbmxldCBKU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5bGluZV9Qb2x5Z29uX1h5ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0Jvb2xlYW5fSW50ZXJzZWN0X1BvbHlsaW5lX1BvbHlnb25fWHk7XHJcbmxldCBKU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5Z29uX1BvbHlnb25fWHk6IChcclxuICBwb2x5Z29uX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIHBvbHlnb25faW5kZXhlczogSW50MzJBcnJheSxcclxuICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIHRvb2xfaW5kZXhlczogSW50MzJBcnJheVxyXG4gIC8vIHJlc3VsdF9wb2ludHM6IEZsb2F0NjRBcnJheVxyXG4pID0+IHsgcG9zaXRpb25zOiBGbG9hdDY0QXJyYXk7IGluZGV4ZXM6IEludDMyQXJyYXkgfSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5Z29uX1BvbHlnb25fWHk7XHJcbmxldCBKU19Cb29sZWFuX0ludGVyc2VjdF9HcmFwaF9Qb2x5Z29uX1h5OiAoXHJcbiAgZ3JhcGhfcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgZ3JhcGhfaW5kZXhlczogSW50MzJBcnJheSxcclxuICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIHRvb2xfaW5kZXhlczogSW50MzJBcnJheVxyXG4gIC8vIHJlc3VsdF9wb2ludHM6IEZsb2F0NjRBcnJheVxyXG4pID0+IHsgcG9zaXRpb25zOiBGbG9hdDY0QXJyYXk7IGluZGV4ZXM6IEludDMyQXJyYXkgfSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Cb29sZWFuX0ludGVyc2VjdF9HcmFwaF9Qb2x5Z29uX1h5O1xyXG5sZXQgSlNfQm9vbGVhbl9TdWJ0cmFjdF9Qb2x5Z29uX1BvbHlnb25fWHk6IChcclxuICBwb2x5Z29uX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIHBvbHlnb25faW5kZXhlczogSW50MzJBcnJheSxcclxuICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIHRvb2xfaW5kZXhlczogSW50MzJBcnJheVxyXG4gIC8vIHJlc3VsdF9wb2ludHM6IEZsb2F0NjRBcnJheVxyXG4pID0+IHsgcG9zaXRpb25zOiBGbG9hdDY0QXJyYXk7IGluZGV4ZXM6IEludDMyQXJyYXkgfSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Cb29sZWFuX1N1YnRyYWN0X1BvbHlnb25fUG9seWdvbl9YeTtcclxubGV0IEpTX0Jvb2xlYW5fQ3V0X1BvbHlnb25fUG9seWdvbl9YeTogKFxyXG4gIHBvbHlnb25fcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgcG9seWdvbl9pbmRleGVzOiBJbnQzMkFycmF5LFxyXG4gIHRvb2xfcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgdG9vbF9pbmRleGVzOiBJbnQzMkFycmF5XHJcbiAgLy8gcmVzdWx0X3BvaW50czogRmxvYXQ2NEFycmF5XHJcbikgPT4geyBwb3NpdGlvbnM6IEZsb2F0NjRBcnJheTsgaW5kZXhlczogSW50MzJBcnJheSB9ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0Jvb2xlYW5fQ3V0X1BvbHlnb25fUG9seWdvbl9YeTtcclxuXHJcbmxldCBKU19Cb29sZWFuX1N1YnRyYWN0OiAoXHJcbiAgYmxhbmtfcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgYmxhbmtfaW5kZXhlczogSW50MzJBcnJheSxcclxuICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIHRvb2xfaW5kZXhlczogSW50MzJBcnJheVxyXG4pID0+IHsgcG9zaXRpb25zOiBGbG9hdDY0QXJyYXk7IGluZGV4ZXM6IEludDMyQXJyYXkgfSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Cb29sZWFuX1N1YnRyYWN0O1xyXG5cclxubGV0IEpTX0ZlYXR1cmVfRXh0cnVkZTogKFxyXG4gIHBvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIGluZGV4ZXM6IEludDMyQXJyYXksXHJcbiAgbm9ybWFsOiBGbG9hdDY0QXJyYXksXHJcbiAgb3B0aW9uczogc3RyaW5nXHJcbikgPT4geyBwb3NpdGlvbnM6IEZsb2F0NjRBcnJheTsgaW5kZXhlczogSW50MzJBcnJheSB9ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0ZlYXR1cmVfRXh0cnVkZTtcclxuXHJcbmxldCBKU19QbGFuYXJfUG9seWxpbmVfT2Zmc2V0OiAoXHJcbiAgcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgb2Zmc2V0X3ZhbHVlOiBudW1iZXJcclxuKSA9PiBMaXN0PEZsb2F0NjRBcnJheT4gPSAod2luZG93IGFzIGFueSkuSlNfUGxhbmFyX1BvbHlsaW5lX09mZnNldDtcclxuXHJcbmxldCBKU19Jbml0X0FwaXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgLy8gcmVxdWlyZShcIi4uLy4uLy4uL3B1YmxpYy9qcy9sb25nYW4vbG9uZ2FuLmpzXCIpXHJcbiAgaWYgKCFKU19Jbml0X0RhdGFiYXNlKSB7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5pdF9EYXRhYmFzZSA9IEpTX0luaXRfRGF0YWJhc2UgPSBfR1NfSW5pdF9EYXRhYmFzZTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19GaW5hX0RhdGFiYXNlID0gSlNfRmluYV9EYXRhYmFzZSA9IF9HU19GaW5hX0RhdGFiYXNlO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luaXRfTXVsdGl0aHJlYWRpbmdfU2VydmljZXMgPVxyXG4gICAgICBKU19Jbml0X011bHRpdGhyZWFkaW5nX1NlcnZpY2VzID0gX0dTX0luaXRfTXVsdGl0aHJlYWRpbmdfU2VydmljZXM7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRmluYV9NdWx0aXRocmVhZGluZ19TZXJ2aWNlcyA9XHJcbiAgICAgIEpTX0ZpbmFfTXVsdGl0aHJlYWRpbmdfU2VydmljZXMgPSBfR1NfRmluYV9NdWx0aXRocmVhZGluZ19TZXJ2aWNlcztcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19PcGVuX1NlZ21lbnQgPSBKU19PcGVuX1NlZ21lbnQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfbmFtZSA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgbGV0IGtleSA9IF9HU19PcGVuX1NlZ21lbnQocHRyX25hbWUpO1xyXG4gICAgICBfZnJlZShwdHJfbmFtZSk7XHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX09wZW5fU2VnbWVudF9CeV9LZXkgPSBKU19PcGVuX1NlZ21lbnRfQnlfS2V5ID1cclxuICAgICAgX0dTX09wZW5fU2VnbWVudF9CeV9LZXk7XHJcblxyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0Nsb3NlX1NlZ21lbnQgPSBKU19DbG9zZV9TZWdtZW50ID0gX0dTX0Nsb3NlX1NlZ21lbnQ7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRGVsZXRlX1NlZ21lbnQgPSBKU19EZWxldGVfU2VnbWVudCA9IGZ1bmN0aW9uIChcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBfR1NfRGVsZXRlX1NlZ21lbnQocHRyX25hbWUpO1xyXG4gICAgICBfZnJlZShwdHJfbmFtZSk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0RlbGV0ZV9CeV9LZXkgPSBKU19EZWxldGVfQnlfS2V5ID0gX0dTX0RlbGV0ZV9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfR2VvbWV0cnkgPSBKU19DbGVhcl9HZW9tZXRyeSA9IF9HU19DbGVhcl9HZW9tZXRyeTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9HZW9tZXRyeV9CeV9LZXkgPSBKU19DbGVhcl9HZW9tZXRyeV9CeV9LZXkgPVxyXG4gICAgICBfR1NfQ2xlYXJfR2VvbWV0cnlfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0F0dHJpYnV0ZXMgPSBKU19DbGVhcl9BdHRyaWJ1dGVzID1cclxuICAgICAgX0dTX0NsZWFyX0F0dHJpYnV0ZXM7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfQXR0cmlidXRlc19CeV9LZXkgPSBKU19DbGVhcl9BdHRyaWJ1dGVzX0J5X0tleSA9XHJcbiAgICAgIF9HU19DbGVhcl9BdHRyaWJ1dGVzX0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9JbmNsdWRlcyA9IEpTX0NsZWFyX0luY2x1ZGVzID0gX0dTX0NsZWFyX0luY2x1ZGVzO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0luY2x1ZGVzX0J5X0tleSA9IEpTX0NsZWFyX0luY2x1ZGVzX0J5X0tleSA9XHJcbiAgICAgIF9HU19DbGVhcl9JbmNsdWRlc19CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfU3R5bGVzID0gSlNfQ2xlYXJfU3R5bGVzID0gX0dTX0NsZWFyX1N0eWxlcztcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9TdHlsZXNfQnlfS2V5ID0gSlNfQ2xlYXJfU3R5bGVzX0J5X0tleSA9XHJcbiAgICAgIF9HU19DbGVhcl9TdHlsZXNfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX1N1YnNlZ21lbnRzID0gSlNfQ2xlYXJfU3Vic2VnbWVudHMgPVxyXG4gICAgICBfR1NfQ2xlYXJfU3Vic2VnbWVudHM7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfU3Vic2VnbWVudHNfQnlfS2V5ID0gSlNfQ2xlYXJfU3Vic2VnbWVudHNfQnlfS2V5ID1cclxuICAgICAgX0dTX0NsZWFyX1N1YnNlZ21lbnRzX0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9BbGwgPSBKU19DbGVhcl9BbGwgPSBfR1NfQ2xlYXJfQWxsO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0FsbF9CeV9LZXkgPSBKU19DbGVhcl9BbGxfQnlfS2V5ID1cclxuICAgICAgX0dTX0NsZWFyX0FsbF9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5jbHVkZV9TZWdtZW50X0J5X0tleSA9IEpTX0luY2x1ZGVfU2VnbWVudF9CeV9LZXkgPVxyXG4gICAgICBfR1NfSW5jbHVkZV9TZWdtZW50X0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db25kaXRpb25hbF9JbmNsdWRlX0J5X0tleSA9XHJcbiAgICAgIEpTX0NvbmRpdGlvbmFsX0luY2x1ZGVfQnlfS2V5ID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICAgIGNvbmRpdGlvbnM6IHN0cmluZ1xyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KGNvbmRpdGlvbnMpO1xyXG4gICAgICAgIF9HU19Db25kaXRpb25hbF9JbmNsdWRlX0J5X0tleShrZXksIHB0cik7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TdHlsZV9TZWdtZW50X0J5X0tleSA9IEpTX1N0eWxlX1NlZ21lbnRfQnlfS2V5ID1cclxuICAgICAgX0dTX1N0eWxlX1NlZ21lbnRfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbmRpdGlvbmFsX1N0eWxlX0J5X0tleSA9IEpTX0NvbmRpdGlvbmFsX1N0eWxlX0J5X0tleSA9XHJcbiAgICAgIGZ1bmN0aW9uIChrZXk6IG51bWJlciwgY29uZGl0aW9uczogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChjb25kaXRpb25zKTtcclxuICAgICAgICBfR1NfQ29uZGl0aW9uYWxfU3R5bGVfQnlfS2V5KGtleSwgcHRyKTtcclxuICAgICAgICBfZnJlZShwdHIpO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfS2V5X1R5cGUgPSBKU19TaG93X0tleV9UeXBlID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogbnVtYmVyIHtcclxuICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfS2V5X1R5cGUoa2V5LCBwdHIpO1xyXG5cclxuICAgICAgbGV0IHR5cGUgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcblxyXG4gICAgICByZXR1cm4gdHlwZTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfTWFrZV9Db250ZXh0X0N1cnJlbnQgPSBKU19NYWtlX0NvbnRleHRfQ3VycmVudCA9XHJcbiAgICAgIF9HU19NYWtlX0NvbnRleHRfQ3VycmVudDtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VcGRhdGVfRGlzcGxheSA9IEpTX1VwZGF0ZV9EaXNwbGF5ID0gX0dTX1VwZGF0ZV9EaXNwbGF5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5ID1cclxuICAgICAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXkgPSBfR1NfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9XaXRoX0ZyYW1lcmF0ZV9CeV9LZXkgPVxyXG4gICAgICBKU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfRnJhbWVyYXRlX0J5X0tleSA9XHJcbiAgICAgICAgX0dTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfV2l0aF9GcmFtZXJhdGVfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfV2l0aF9UaW1lX0J5X0tleSA9XHJcbiAgICAgIEpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfV2l0aF9UaW1lX0J5X0tleSA9XHJcbiAgICAgICAgX0dTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfV2l0aF9UaW1lX0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleSA9XHJcbiAgICAgIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5ID1cclxuICAgICAgICBfR1NfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHQgPVxyXG4gICAgICBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleV9UdCA9XHJcbiAgICAgICAgX0dTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0O1xyXG4gICAgLy8gKHdpbmRvdyBhcyBhbnkpLkpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0J5X0tleSA9IEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0J5X0tleSA9IF9HU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXN5bl9OZWVkX1VwZGF0ZV9WaWV3X0J5X0tleSA9XHJcbiAgICAgIEpTX0FzeW5fTmVlZF9VcGRhdGVfVmlld19CeV9LZXkgPSBfR1NfQXN5bl9OZWVkX1VwZGF0ZV9WaWV3X0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX1VwZGF0ZV9DYW1lcmFfQnlfS2V5ID1cclxuICAgICAgSlNfQXN5bl9VcGRhdGVfQ2FtZXJhX0J5X0tleSA9IF9HU19Bc3luX1VwZGF0ZV9DYW1lcmFfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5ID0gSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXkgPVxyXG4gICAgICBfR1NfQXN5bl9VcGRhdGVfVmlld19CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHQgPVxyXG4gICAgICBKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdCA9IGZ1bmN0aW9uICh2aWV3X2tleTogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IF9HU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdCh2aWV3X2tleSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkgPSBKU19Bc3luX1JlbmRlcl9WaWV3X0J5X0tleSA9XHJcbiAgICAgIF9HU19Bc3luX1JlbmRlcl9WaWV3X0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX1JlbmRlcl9WaWV3X1dpdGhfVGltZV9CeV9LZXkgPVxyXG4gICAgICBKU19Bc3luX1JlbmRlcl9WaWV3X1dpdGhfVGltZV9CeV9LZXkgPVxyXG4gICAgICAgIF9HU19Bc3luX1JlbmRlcl9WaWV3X1dpdGhfVGltZV9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Bc3luX0dlb21ldHJ5X0RhdGFfS2V5cyA9XHJcbiAgICAgIEpTX1Nob3dfQXN5bl9HZW9tZXRyeV9EYXRhX0tleXMgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgdmlld19rZXk6IG51bWJlclxyXG4gICAgICApOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfQXN5bl9HZW9tZXRyeV9EYXRhX0NvdW50KHZpZXdfa2V5LCBwdHJfY291bnQpO1xyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNF07XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9saXN0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIGNvdW50KTtcclxuICAgICAgICAgIF9HU19TaG93X0FzeW5fR2VvbWV0cnlfRGF0YV9LZXlzKHZpZXdfa2V5LCBwdHJfbGlzdCk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoY291bnQpO1xyXG5cclxuICAgICAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgLy8gICByZXN1bHRbaV0gPSBNb2R1bGUuSEVBUDMyW3B0cl9saXN0IC8gNCArIGldO1xyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgcmVzdWx0LnNldChcclxuICAgICAgICAgICAgTW9kdWxlLkhFQVAzMi5zdWJhcnJheShwdHJfbGlzdCAvIDQsIHB0cl9saXN0IC8gNCArIGNvdW50KVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2xpc3QpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheSgwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfY291bnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQXN5bl9SZW1vdmVfR2VvbWV0cnlfRGF0YV9LZXlzID1cclxuICAgICAgSlNfU2hvd19Bc3luX1JlbW92ZV9HZW9tZXRyeV9EYXRhX0tleXMgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgdmlld19rZXk6IG51bWJlclxyXG4gICAgICApOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfQXN5bl9HZW9tZXRyeV9EYXRhX0NvdW50KHZpZXdfa2V5LCBwdHJfY291bnQpO1xyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNF07XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9saXN0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIGNvdW50KTtcclxuICAgICAgICAgIF9HU19TaG93X0FzeW5fUmVtb3ZlX0dlb21ldHJ5X0RhdGFfS2V5cyh2aWV3X2tleSwgcHRyX2xpc3QpO1xyXG5cclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KGNvdW50KTtcclxuXHJcbiAgICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIC8vICAgcmVzdWx0W2ldID0gTW9kdWxlLkhFQVAzMltwdHJfbGlzdCAvIDQgKyBpXTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkocHRyX2xpc3QgLyA0LCBwdHJfbGlzdCAvIDQgKyBjb3VudClcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9saXN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvdW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0FzeW5fQnVmZmVyX0dlb21ldHJ5X0tleXMgPVxyXG4gICAgICBKU19TaG93X0FzeW5fQnVmZmVyX0dlb21ldHJ5X0tleXMgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgdmlld19rZXk6IG51bWJlclxyXG4gICAgICApOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQ291bnQodmlld19rZXksIHB0cl9jb3VudCk7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfY291bnQgLyA0XTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdDtcclxuICAgICAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2xpc3QgPSBNb2R1bGUuX21hbGxvYyg0ICogY291bnQpO1xyXG4gICAgICAgICAgX0dTX1Nob3dfQXN5bl9CdWZmZXJfR2VvbWV0cnlfS2V5cyh2aWV3X2tleSwgcHRyX2xpc3QpO1xyXG5cclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KGNvdW50KTtcclxuICAgICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkocHRyX2xpc3QgLyA0LCBwdHJfbGlzdCAvIDQgKyBjb3VudClcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9saXN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvdW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXkgPVxyXG4gICAgICBKU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgdmlld19rZXk6IG51bWJlcixcclxuICAgICAgICBnZW9tX2tleXM6IEludDMyQXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKGdlb21fa2V5cyAmJiBnZW9tX2tleXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGdlb21fa2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoZ2VvbV9rZXlzLCBwdHJfa2V5cyAvIDQpO1xyXG5cclxuICAgICAgICAgIF9HU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXkodmlld19rZXksIHB0cl9rZXlzLCBnZW9tX2tleXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2tleXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIEpTX0FzeW5fQnVmZmVyX0dlb21ldHJ5X0J5X0tleV9UdCA9IGZ1bmN0aW9uIChcclxuICAgICAgdmlld19rZXk6IG51bWJlcixcclxuICAgICAgZ2VvbV9rZXlzOiBJbnQzMkFycmF5LFxyXG4gICAgICBubzogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgaWYgKGdlb21fa2V5cyAmJiBnZW9tX2tleXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBwdHJfa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBnZW9tX2tleXMubGVuZ3RoKTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChnZW9tX2tleXMsIHB0cl9rZXlzIC8gNCk7XHJcblxyXG4gICAgICAgIF9HU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXlfVHQoXHJcbiAgICAgICAgICB2aWV3X2tleSxcclxuICAgICAgICAgIHB0cl9rZXlzLFxyXG4gICAgICAgICAgZ2VvbV9rZXlzLmxlbmd0aCxcclxuICAgICAgICAgIG5vXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9rZXlzKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXlfVHQgPVxyXG4gICAgICBKU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXlfVHQgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgdmlld19rZXk6IG51bWJlcixcclxuICAgICAgICBnZW9tX2tleXM6IEludDMyQXJyYXksXHJcbiAgICAgICAgbm86IG51bWJlclxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoZ2VvbV9rZXlzICYmIGdlb21fa2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICogZ2VvbV9rZXlzLmxlbmd0aCk7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChnZW9tX2tleXMsIHB0cl9rZXlzIC8gNCk7XHJcblxyXG4gICAgICAgICAgX0dTX0FzeW5fQnVmZmVyX0dlb21ldHJ5X0J5X0tleV9UdChcclxuICAgICAgICAgICAgdmlld19rZXksXHJcbiAgICAgICAgICAgIHB0cl9rZXlzLFxyXG4gICAgICAgICAgICBnZW9tX2tleXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBub1xyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2tleXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0FzeW5fVW5idWZmZXJfR2VvbWV0cnlfS2V5cyA9XHJcbiAgICAgIEpTX1Nob3dfQXN5bl9VbmJ1ZmZlcl9HZW9tZXRyeV9LZXlzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXJcclxuICAgICAgKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X0FzeW5fVW5idWZmZXJfR2VvbWV0cnlfQ291bnQodmlld19rZXksIHB0cl9jb3VudCk7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfY291bnQgLyA0XTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdDtcclxuICAgICAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2xpc3QgPSBNb2R1bGUuX21hbGxvYyg0ICogY291bnQpO1xyXG4gICAgICAgICAgX0dTX1Nob3dfQXN5bl9VbmJ1ZmZlcl9HZW9tZXRyeV9LZXlzKHZpZXdfa2V5LCBwdHJfbGlzdCk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoY291bnQpO1xyXG4gICAgICAgICAgcmVzdWx0LnNldChcclxuICAgICAgICAgICAgTW9kdWxlLkhFQVAzMi5zdWJhcnJheShwdHJfbGlzdCAvIDQsIHB0cl9saXN0IC8gNCArIGNvdW50KVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2xpc3QpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheSgwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfY291bnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0FzeW5fVW5idWZmZXJfR2VvbWV0cnlfQnlfS2V5ID1cclxuICAgICAgSlNfQXN5bl9VbmJ1ZmZlcl9HZW9tZXRyeV9CeV9LZXkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgdmlld19rZXk6IG51bWJlcixcclxuICAgICAgICBnZW9tX2tleXM6IEludDMyQXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKGdlb21fa2V5cyAmJiBnZW9tX2tleXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGdlb21fa2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoZ2VvbV9rZXlzLCBwdHJfa2V5cyAvIDQpO1xyXG5cclxuICAgICAgICAgIF9HU19Bc3luX1VuYnVmZmVyX0dlb21ldHJ5X0J5X0tleShcclxuICAgICAgICAgICAgdmlld19rZXksXHJcbiAgICAgICAgICAgIHB0cl9rZXlzLFxyXG4gICAgICAgICAgICBnZW9tX2tleXMubGVuZ3RoXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT3duZXJfQnlfS2V5ID0gSlNfU2hvd19Pd25lcl9CeV9LZXkgPVxyXG4gICAgICBfR1NfU2hvd19Pd25lcl9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9QYXRoID0gSlNfQ29tcHV0ZV9QYXRoID0gZnVuY3Rpb24gKFxyXG4gICAgICBzdGFydF9rZXk6IG51bWJlcixcclxuICAgICAgZW5kX2tleTogbnVtYmVyLFxyXG4gICAgICBjb3VudDogbnVtYmVyLFxyXG4gICAgICBwYXRoOiBJbnQzMkFycmF5XHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX3BhdGggPSBNb2R1bGUuX21hbGxvYyg0ICogNTEyKTtcclxuXHJcbiAgICAgIF9HU19Db21wdXRlX1BhdGgoc3RhcnRfa2V5LCBlbmRfa2V5LCBwdHJfY291bnQsIHB0cl9wYXRoKTtcclxuXHJcbiAgICAgIGxldCBjbyA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNF07XHJcbiAgICAgIGxldCBwYSA9IG5ldyBGbG9hdDMyQXJyYXkoY28pO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvOyBpKyspIHtcclxuICAgICAgICBwYVtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNCArIGldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvdW50KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXRoKTtcclxuXHJcbiAgICAgIHJldHVybiBwYTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkgPVxyXG4gICAgICBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlcixcclxuICAgICAgICBpbl9jb29yZGluYXRlOiBzdHJpbmcsXHJcbiAgICAgICAgaW5fcG9zaXRpb246IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICAgIG91dF9jb29yZGluYXRlOiBzdHJpbmdcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl9pYyA9IGFsbG9jYXRlVVRGOChpbl9jb29yZGluYXRlKTtcclxuICAgICAgICBsZXQgcHRyX29jID0gYWxsb2NhdGVVVEY4KG91dF9jb29yZGluYXRlKTtcclxuICAgICAgICBsZXQgcHRyX2lwID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9pcCAvIDRdID0gaW5fcG9zaXRpb25bMF07XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2lwIC8gNCArIDFdID0gaW5fcG9zaXRpb25bMV07XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2lwIC8gNCArIDJdID0gaW5fcG9zaXRpb25bMl07XHJcbiAgICAgICAgbGV0IHB0cl9vcCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3AgLyA0XSA9IDA7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29wIC8gNCArIDFdID0gMDtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3AgLyA0ICsgMl0gPSAwO1xyXG5cclxuICAgICAgICBfR1NfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkoa2V5LCBwdHJfaWMsIHB0cl9pcCwgcHRyX29jLCBwdHJfb3ApO1xyXG5cclxuICAgICAgICBsZXQgb3V0X3Bvc2l0aW9uID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgICBvdXRfcG9zaXRpb25bMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfb3AgLyA0XTtcclxuICAgICAgICBvdXRfcG9zaXRpb25bMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfb3AgLyA0ICsgMV07XHJcbiAgICAgICAgb3V0X3Bvc2l0aW9uWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX29wIC8gNCArIDJdO1xyXG5cclxuICAgICAgICBfZnJlZShwdHJfaWMpO1xyXG4gICAgICAgIF9mcmVlKHB0cl9vYyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pcCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9vcCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRfcG9zaXRpb247XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9QYXRoID1cclxuICAgICAgSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9QYXRoID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHBhdGg6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICAgIGluX2Nvb3JkaW5hdGU6IHN0cmluZyxcclxuICAgICAgICBpbl9wb3NpdGlvbjogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgICAgb3V0X2Nvb3JkaW5hdGU6IHN0cmluZ1xyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcGNvdW50ID0gcGF0aC5sZW5ndGg7XHJcbiAgICAgICAgbGV0IHB0cl9wYXRoID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfcGF0aCAvIDQgKyBpXSA9IHBhdGhbaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcHRyX2ljID0gYWxsb2NhdGVVVEY4KGluX2Nvb3JkaW5hdGUpO1xyXG4gICAgICAgIGxldCBwdHJfb2MgPSBhbGxvY2F0ZVVURjgob3V0X2Nvb3JkaW5hdGUpO1xyXG4gICAgICAgIGxldCBwdHJfaXAgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2lwIC8gNF0gPSBpbl9wb3NpdGlvblswXTtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfaXAgLyA0ICsgMV0gPSBpbl9wb3NpdGlvblsxXTtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfaXAgLyA0ICsgMl0gPSBpbl9wb3NpdGlvblsyXTtcclxuICAgICAgICBsZXQgcHRyX29wID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9vcCAvIDRdID0gMDtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3AgLyA0ICsgMV0gPSAwO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9vcCAvIDQgKyAyXSA9IDA7XHJcblxyXG4gICAgICAgIF9HU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X1BhdGgoXHJcbiAgICAgICAgICBwdHJfcGF0aCxcclxuICAgICAgICAgIHBjb3VudCxcclxuICAgICAgICAgIHB0cl9pYyxcclxuICAgICAgICAgIHB0cl9pcCxcclxuICAgICAgICAgIHB0cl9vYyxcclxuICAgICAgICAgIHB0cl9vcFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBvdXRfcG9zaXRpb24gPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICAgIG91dF9wb3NpdGlvblswXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9vcCAvIDRdO1xyXG4gICAgICAgIG91dF9wb3NpdGlvblsxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9vcCAvIDQgKyAxXTtcclxuICAgICAgICBvdXRfcG9zaXRpb25bMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfb3AgLyA0ICsgMl07XHJcblxyXG4gICAgICAgIF9mcmVlKHB0cl9pYyk7XHJcbiAgICAgICAgX2ZyZWUocHRyX29jKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2lwKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX29wKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhdGgpO1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0X3Bvc2l0aW9uO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0RDb21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleSA9XHJcbiAgICAgIEpTX0RDb21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlcixcclxuICAgICAgICBpbl9jb29yZGluYXRlOiBzdHJpbmcsXHJcbiAgICAgICAgaW5fcG9zaXRpb25zOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgICBvdXRfY29vcmRpbmF0ZTogc3RyaW5nXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBjb3VudCA9IGluX3Bvc2l0aW9ucy5sZW5ndGggLyAzO1xyXG5cclxuICAgICAgICBsZXQgcHRyX2ljID0gYWxsb2NhdGVVVEY4KGluX2Nvb3JkaW5hdGUpO1xyXG4gICAgICAgIGxldCBwdHJfb2MgPSBhbGxvY2F0ZVVURjgob3V0X2Nvb3JkaW5hdGUpO1xyXG4gICAgICAgIGxldCBwdHJfaXAgPSBNb2R1bGUuX21hbGxvYyg4ICogMyAqIGNvdW50KTtcclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQobmV3IEZsb2F0NjRBcnJheShpbl9wb3NpdGlvbnMpLCBwdHJfaXAgLyA4KTtcclxuICAgICAgICBsZXQgcHRyX29wID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMgKiBjb3VudCk7XHJcblxyXG4gICAgICAgIF9HU19EQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkoXHJcbiAgICAgICAgICBrZXksXHJcbiAgICAgICAgICBwdHJfaWMsXHJcbiAgICAgICAgICBwdHJfaXAsXHJcbiAgICAgICAgICBwdHJfb2MsXHJcbiAgICAgICAgICBwdHJfb3AsXHJcbiAgICAgICAgICBjb3VudFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBvdXRfcG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheSgzICogY291bnQpO1xyXG4gICAgICAgIG91dF9wb3NpdGlvbnMuc2V0KFxyXG4gICAgICAgICAgTW9kdWxlLkhFQVBGNjQuc3ViYXJyYXkocHRyX29wIC8gOCwgcHRyX29wIC8gOCArIDMgKiBjb3VudClcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBfZnJlZShwdHJfaWMpO1xyXG4gICAgICAgIF9mcmVlKHB0cl9vYyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pcCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9vcCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRfcG9zaXRpb25zO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQm91bmRpbmdib3hfQnlfS2V5ID1cclxuICAgICAgSlNfQ29tcHV0ZV9Cb3VuZGluZ2JveF9CeV9LZXkgPSBmdW5jdGlvbiAoa2V5OiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHRyX21pbiA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgICBsZXQgcHRyX21heCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuXHJcbiAgICAgICAgX0dTX0NvbXB1dGVfQm91bmRpbmdib3hfQnlfS2V5KGtleSwgcHRyX21pbiwgcHRyX21heCk7XHJcblxyXG4gICAgICAgIGxldCBiYiA9IG5ldyBGbG9hdDMyQXJyYXkoNik7XHJcblxyXG4gICAgICAgIGJiWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDRdO1xyXG4gICAgICAgIGJiWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDQgKyAxXTtcclxuICAgICAgICBiYlsyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9taW4gLyA0ICsgMl07XHJcblxyXG4gICAgICAgIGJiWzNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDRdO1xyXG4gICAgICAgIGJiWzRdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDQgKyAxXTtcclxuICAgICAgICBiYls1XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXggLyA0ICsgMl07XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbWluKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX21heCk7XHJcblxyXG4gICAgICAgIHJldHVybiBiYjtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0JvdW5kaW5nYm94X1dpdGhfVmlzaWJpbGl0eV9CeV9LZXkgPVxyXG4gICAgICBKU19Db21wdXRlX0JvdW5kaW5nYm94X1dpdGhfVmlzaWJpbGl0eV9CeV9LZXkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgICAgZWxlbWVudF90eXBlczogRWxlbWVudFR5cGVcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl9taW4gPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgICAgbGV0IHB0cl9tYXggPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcblxyXG4gICAgICAgIF9HU19Db21wdXRlX0JvdW5kaW5nYm94X1dpdGhfVmlzaWJpbGl0eV9CeV9LZXkoXHJcbiAgICAgICAgICBrZXksXHJcbiAgICAgICAgICBlbGVtZW50X3R5cGVzLFxyXG4gICAgICAgICAgcHRyX21pbixcclxuICAgICAgICAgIHB0cl9tYXhcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgYmIgPSBuZXcgRmxvYXQzMkFycmF5KDYpO1xyXG5cclxuICAgICAgICBiYlswXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9taW4gLyA0XTtcclxuICAgICAgICBiYlsxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9taW4gLyA0ICsgMV07XHJcbiAgICAgICAgYmJbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNCArIDJdO1xyXG5cclxuICAgICAgICBiYlszXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXggLyA0XTtcclxuICAgICAgICBiYls0XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXggLyA0ICsgMV07XHJcbiAgICAgICAgYmJbNV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNCArIDJdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX21pbik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9tYXgpO1xyXG5cclxuICAgICAgICByZXR1cm4gYmI7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94X0J5X0tleSA9XHJcbiAgICAgIEpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveF9CeV9LZXkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgc2VnX2tleTogbnVtYmVyLFxyXG4gICAgICAgIGtleTogbnVtYmVyXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfbWluID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICAgIGxldCBwdHJfbWF4ID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG5cclxuICAgICAgICBfR1NfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94X0J5X0tleShzZWdfa2V5LCBrZXksIHB0cl9taW4sIHB0cl9tYXgpO1xyXG5cclxuICAgICAgICBsZXQgYmIgPSBuZXcgRmxvYXQzMkFycmF5KDYpO1xyXG5cclxuICAgICAgICBiYlswXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9taW4gLyA0XTtcclxuICAgICAgICBiYlsxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9taW4gLyA0ICsgMV07XHJcbiAgICAgICAgYmJbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNCArIDJdO1xyXG5cclxuICAgICAgICBiYlszXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXggLyA0XTtcclxuICAgICAgICBiYls0XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXggLyA0ICsgMV07XHJcbiAgICAgICAgYmJbNV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNCArIDJdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX21pbik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9tYXgpO1xyXG5cclxuICAgICAgICByZXR1cm4gYmI7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94X0J5X0tleXMgPVxyXG4gICAgICBKU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hfQnlfS2V5cyA9IGZ1bmN0aW9uIChcclxuICAgICAgICBzZWdfa2V5OiBudW1iZXIsXHJcbiAgICAgICAga2V5czogSW50MzJBcnJheVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyX21pbiA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgICBsZXQgcHRyX21heCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGtleXMubGVuZ3RoKTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChrZXlzLCBwdHJfa2V5cyAvIDQpO1xyXG5cclxuICAgICAgICBfR1NfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94X0J5X0tleXMoXHJcbiAgICAgICAgICBzZWdfa2V5LFxyXG4gICAgICAgICAgcHRyX2tleXMsXHJcbiAgICAgICAgICBrZXlzLmxlbmd0aCxcclxuICAgICAgICAgIHB0cl9taW4sXHJcbiAgICAgICAgICBwdHJfbWF4XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGJiID0gbmV3IEZsb2F0MzJBcnJheSg2KTtcclxuXHJcbiAgICAgICAgYmJbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNF07XHJcbiAgICAgICAgYmJbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNCArIDFdO1xyXG4gICAgICAgIGJiWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDQgKyAyXTtcclxuXHJcbiAgICAgICAgYmJbM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNF07XHJcbiAgICAgICAgYmJbNF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNCArIDFdO1xyXG4gICAgICAgIGJiWzVdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDQgKyAyXTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9rZXlzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX21pbik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9tYXgpO1xyXG5cclxuICAgICAgICByZXR1cm4gYmI7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94ZXNfQnlfS2V5cyA9XHJcbiAgICAgIEpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveGVzX0J5X0tleXMgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgc2VnX2tleTogbnVtYmVyLFxyXG4gICAgICAgIGtleXM6IEludDMyQXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl9taW4gPSBNb2R1bGUuX21hbGxvYyg0ICogMyAqIGtleXMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX21heCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzICoga2V5cy5sZW5ndGgpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICoga2V5cy5sZW5ndGgpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KGtleXMsIHB0cl9rZXlzIC8gNCk7XHJcblxyXG4gICAgICAgIF9HU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hlc19CeV9LZXlzKFxyXG4gICAgICAgICAgc2VnX2tleSxcclxuICAgICAgICAgIHB0cl9rZXlzLFxyXG4gICAgICAgICAga2V5cy5sZW5ndGgsXHJcbiAgICAgICAgICBwdHJfbWluLFxyXG4gICAgICAgICAgcHRyX21heFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBiYiA9IG5ldyBGbG9hdDMyQXJyYXkoNiAqIGtleXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBiYltpICogNl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNCArIGkgKiAzXTtcclxuICAgICAgICAgIGJiW2kgKiA2ICsgMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNCArIGkgKiAzICsgMV07XHJcbiAgICAgICAgICBiYltpICogNiArIDJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDQgKyBpICogMyArIDJdO1xyXG5cclxuICAgICAgICAgIGJiW2kgKiA2ICsgM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNCArIGkgKiAzXTtcclxuICAgICAgICAgIGJiW2kgKiA2ICsgNF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNCArIGkgKiAzICsgMV07XHJcbiAgICAgICAgICBiYltpICogNiArIDVdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDQgKyBpICogMyArIDJdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9rZXlzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX21pbik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9tYXgpO1xyXG5cclxuICAgICAgICByZXR1cm4gYmI7XHJcbiAgICAgIH07XHJcbiAgICBKU19Db21wdXRlX1NlZ21lbnRfQm91bmRpbmdib3hfQnlfS2V5ID1cclxuICAgICAgX0dTX0NvbXB1dGVfU2VnbWVudF9Cb3VuZGluZ2JveF9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfU2VnbWVudF9Cb3VuZGluZ2JveF9CeV9LZXkgPVxyXG4gICAgICBKU19DbGVhcl9TZWdtZW50X0JvdW5kaW5nYm94X0J5X0tleSA9XHJcbiAgICAgICAgX0dTX0NsZWFyX1NlZ21lbnRfQm91bmRpbmdib3hfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQm91bmRpbmdCb3hfQnlfS2V5ID0gSlNfU2hvd19Cb3VuZGluZ0JveF9CeV9LZXkgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICAgIGxldCBwdHJfbWluID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICAgIGxldCBwdHJfbWF4ID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19Cb3VuZGluZ0JveF9CeV9LZXkoa2V5LCBwdHJfbWluLCBwdHJfbWF4KTtcclxuXHJcbiAgICAgICAgbGV0IGJiID0gbmV3IEZsb2F0MzJBcnJheSg2KTtcclxuXHJcbiAgICAgICAgYmJbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNF07XHJcbiAgICAgICAgYmJbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNCArIDFdO1xyXG4gICAgICAgIGJiWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDQgKyAyXTtcclxuXHJcbiAgICAgICAgYmJbM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNF07XHJcbiAgICAgICAgYmJbNF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNCArIDFdO1xyXG4gICAgICAgIGJiWzVdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDQgKyAyXTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9taW4pO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbWF4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJiO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfVmlzaWJsZV9CeV9LZXkgPSBKU19Db21wdXRlX1Zpc2libGVfQnlfS2V5ID1cclxuICAgICAgZnVuY3Rpb24gKGRpc3BsYXlfa2V5OiBudW1iZXIsIHN0YXJ0X2tleTogbnVtYmVyLCBudW0/OiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHRyX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfa2V5cyA9IG51bGw7XHJcbiAgICAgICAgaWYgKG51bSkge1xyXG4gICAgICAgICAgcHRyX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICogbnVtKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcHRyX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICogMTAyNCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfR1NfQ29tcHV0ZV9WaXNpYmxlX0J5X0tleShkaXNwbGF5X2tleSwgc3RhcnRfa2V5LCBwdHJfY291bnQsIHB0cl9rZXlzKTtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfY291bnQgLyA0XTtcclxuICAgICAgICBsZXQga2V5cyA9IG5ldyBJbnQzMkFycmF5KGNvdW50KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBrZXlzW2ldID0gTW9kdWxlLkhFQVAzMltwdHJfa2V5cyAvIDQgKyBpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfY291bnQpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5cyk7XHJcblxyXG4gICAgICAgIHJldHVybiBrZXlzO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQXR0cmlidXRlX0NvdW50ID0gSlNfU2hvd19BdHRyaWJ1dGVfQ291bnQgPVxyXG4gICAgICBmdW5jdGlvbiAoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0F0dHJpYnV0ZV9Db3VudChwdHIpO1xyXG5cclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQXR0cmlidXRlX0xpc3QgPSBKU19TaG93X0F0dHJpYnV0ZV9MaXN0ID1cclxuICAgICAgZnVuY3Rpb24gKCk6IEludDMyQXJyYXkge1xyXG4gICAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBfR1NfU2hvd19BdHRyaWJ1dGVfQ291bnQocHRyKTtcclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfbGlzdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBjb3VudCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19BdHRyaWJ1dGVfTGlzdChwdHJfbGlzdCk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoY291bnQpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2xpc3QgLyA0ICsgaV07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9saXN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfR2VvbWV0cnlfQ291bnQgPSBKU19TaG93X0dlb21ldHJ5X0NvdW50ID1cclxuICAgICAgZnVuY3Rpb24gKCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19HZW9tZXRyeV9Db3VudChwdHIpO1xyXG5cclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfR2VvbWV0cnlfTGlzdCA9IEpTX1Nob3dfR2VvbWV0cnlfTGlzdCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfR2VvbWV0cnlfQ291bnQocHRyKTtcclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfbGlzdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBjb3VudCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19HZW9tZXRyeV9MaXN0KHB0cl9saXN0KTtcclxuXHJcbiAgICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheShjb3VudCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gTW9kdWxlLkhFQVAzMltwdHJfbGlzdCAvIDQgKyBpXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2xpc3QpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheSgwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TdWJzZWdtZW50X0NvdW50ID0gSlNfU2hvd19TdWJzZWdtZW50X0NvdW50ID1cclxuICAgICAgZnVuY3Rpb24gKCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19TdWJzZWdtZW50X0NvdW50KHB0cik7XHJcblxyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyIC8gNF07XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TdWJzZWdtZW50X0xpc3QgPSBKU19TaG93X1N1YnNlZ21lbnRfTGlzdCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfU3Vic2VnbWVudF9Db3VudChwdHIpO1xyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyIC8gNF07XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9saXN0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIGNvdW50KTtcclxuICAgICAgICAgIF9HU19TaG93X1N1YnNlZ21lbnRfTGlzdChwdHJfbGlzdCk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoY291bnQpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2xpc3QgLyA0ICsgaV07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9saXN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQWxsX1N1YnNlZ21lbnRfQ291bnQgPVxyXG4gICAgICBKU19TaG93X0FsbF9TdWJzZWdtZW50X0NvdW50ID0gZnVuY3Rpb24gKCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19BbGxfU3Vic2VnbWVudF9Db3VudChwdHIpO1xyXG5cclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQWxsX1N1YnNlZ21lbnRfTGlzdCA9IEpTX1Nob3dfQWxsX1N1YnNlZ21lbnRfTGlzdCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfQWxsX1N1YnNlZ21lbnRfQ291bnQocHRyKTtcclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfbGlzdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBjb3VudCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19BbGxfU3Vic2VnbWVudF9MaXN0KHB0cl9saXN0KTtcclxuXHJcbiAgICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheShjb3VudCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gTW9kdWxlLkhFQVAzMltwdHJfbGlzdCAvIDQgKyBpXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2xpc3QpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheSgwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbmNsdWRlX0NvdW50ID0gSlNfU2hvd19JbmNsdWRlX0NvdW50ID1cclxuICAgICAgZnVuY3Rpb24gKCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19JbmNsdWRlX0NvdW50KHB0cik7XHJcblxyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyIC8gNF07XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbmNsdWRlX0xpc3QgPSBKU19TaG93X0luY2x1ZGVfTGlzdCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfSW5jbHVkZV9Db3VudChwdHIpO1xyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyIC8gNF07XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9saXN0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIGNvdW50KTtcclxuICAgICAgICAgIF9HU19TaG93X0luY2x1ZGVfTGlzdChwdHJfbGlzdCk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoY291bnQpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2xpc3QgLyA0ICsgaV07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9saXN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSW5jbHVkZSA9IEpTX1Nob3dfSW5jbHVkZSA9IGZ1bmN0aW9uIChcclxuICAgICAgaW5kZXg6IG51bWJlclxyXG4gICAgKTogbnVtYmVyIHtcclxuICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBfR1NfU2hvd19JbmNsdWRlKGluZGV4LCBwdHIpO1xyXG5cclxuICAgICAgbGV0IGtleSA9IE1vZHVsZS5IRUFQMzJbcHRyIC8gNF07XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSW5jbHVkZV9TZWdtZW50ID0gSlNfU2hvd19JbmNsdWRlX1NlZ21lbnQgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIpOiBhbnkge1xyXG4gICAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX2NkID0gTW9kdWxlLl9tYWxsb2MoMjU2KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfSW5jbHVkZV9TZWdtZW50KGtleSwgcHRyLCBwdHJfY2QpO1xyXG5cclxuICAgICAgICBsZXQgaW5jbHVkZV9rZXkgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG4gICAgICAgIGxldCBjb25kaXRpb24gPSBVVEY4VG9TdHJpbmcocHRyX2NkKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jZCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGtleTogaW5jbHVkZV9rZXksIGNvbmRpdGlvbiB9O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3R5bGVfQ291bnQgPSBKU19TaG93X1N0eWxlX0NvdW50ID1cclxuICAgICAgZnVuY3Rpb24gKCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19TdHlsZV9Db3VudChwdHIpO1xyXG5cclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3R5bGVfTGlzdCA9IEpTX1Nob3dfU3R5bGVfTGlzdCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfU3R5bGVfQ291bnQocHRyKTtcclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfbGlzdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBjb3VudCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19TdHlsZV9MaXN0KHB0cl9saXN0KTtcclxuXHJcbiAgICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheShjb3VudCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gTW9kdWxlLkhFQVAzMltwdHJfbGlzdCAvIDQgKyBpXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2xpc3QpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheSgwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TdHlsZSA9IEpTX1Nob3dfU3R5bGUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGluZGV4OiBudW1iZXJcclxuICAgICk6IG51bWJlciB7XHJcbiAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgX0dTX1Nob3dfU3R5bGUoaW5kZXgsIHB0cik7XHJcblxyXG4gICAgICBsZXQga2V5ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TdHlsZV9TZWdtZW50ID0gSlNfU2hvd19TdHlsZV9TZWdtZW50ID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogYW55IHtcclxuICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX2NkID0gTW9kdWxlLl9tYWxsb2MoMjU2KTtcclxuXHJcbiAgICAgIF9HU19TaG93X1N0eWxlX1NlZ21lbnQoa2V5LCBwdHIsIHB0cl9jZCk7XHJcblxyXG4gICAgICBsZXQgc3R5bGVfa2V5ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuICAgICAgbGV0IGNvbmRpdGlvbiA9IFVURjhUb1N0cmluZyhwdHJfY2QpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfY2QpO1xyXG5cclxuICAgICAgcmV0dXJuIHsga2V5OiBzdHlsZV9rZXksIGNvbmRpdGlvbiB9O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX1NlbGVjdGlvbl9CeV9LZXkgPSBKU19Db21wdXRlX1NlbGVjdGlvbl9CeV9LZXkgPVxyXG4gICAgICBfR1NfQ29tcHV0ZV9TZWxlY3Rpb25fQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfU2VsZWN0aW9uX0J5X0FyZWEgPVxyXG4gICAgICBKU19Db21wdXRlX1NlbGVjdGlvbl9CeV9BcmVhID0gX0dTX0NvbXB1dGVfU2VsZWN0aW9uX0J5X0FyZWE7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3Rpb25fQ291bnQgPSBKU19TaG93X1NlbGVjdGlvbl9Db3VudCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBfR1NfU2hvd19TZWxlY3Rpb25fQ291bnQocHRyKTtcclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3Rpb25fRWxlbWVudCA9IEpTX1Nob3dfU2VsZWN0aW9uX0VsZW1lbnQgPVxyXG4gICAgICBmdW5jdGlvbiAoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X1NlbGVjdGlvbl9FbGVtZW50KGluZGV4LCBwdHIpO1xyXG4gICAgICAgIGxldCBrZXkgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX1BhdGggPSBKU19TaG93X1NlbGVjdGlvbl9QYXRoID0gZnVuY3Rpb24gKFxyXG4gICAgICBpbmRleDogbnVtYmVyXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcHRyX3BhdGggPSBNb2R1bGUuX21hbGxvYyg0MDk2KTtcclxuXHJcbiAgICAgIF9HU19TaG93X1NlbGVjdGlvbl9QYXRoKGluZGV4LCBwdHJfcGF0aCk7XHJcblxyXG4gICAgICBsZXQgcGF0aCA9IFVURjhUb1N0cmluZyhwdHJfcGF0aCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGF0aCk7XHJcblxyXG4gICAgICByZXR1cm4gcGF0aDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3Rpb25fUGF0aF9CeV9LZXlzID1cclxuICAgICAgSlNfU2hvd19TZWxlY3Rpb25fUGF0aF9CeV9LZXlzID0gZnVuY3Rpb24gKGluZGV4OiBudW1iZXIpOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1NlbGVjdGlvbl9QYXRoX0J5X0tleXMoaW5kZXgsIHB0cl9jb3VudCwgcHRyX2tleXMpO1xyXG5cclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudCAvIDRdO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgSW50MzJBcnJheShjb3VudCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgcmVzdWx0W2ldID0gTW9kdWxlLkhFQVAzMltwdHJfa2V5cyAvIDQgKyBpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfY291bnQpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5cyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3Rpb25fUG9zaXRpb24gPSBKU19TaG93X1NlbGVjdGlvbl9Qb3NpdGlvbiA9XHJcbiAgICAgIGZ1bmN0aW9uIChpbmRleDogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2MoNCAqIDYpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19TZWxlY3Rpb25fUG9zaXRpb25fQnlfVmFsdWUoaW5kZXgsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQzMkFycmF5KDYpO1xyXG4gICAgICAgIHBvc1swXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDRdO1xyXG4gICAgICAgIHBvc1sxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDQgKyAxXTtcclxuICAgICAgICBwb3NbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgMl07XHJcbiAgICAgICAgcG9zWzNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDNdO1xyXG4gICAgICAgIHBvc1s0XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDQgKyA0XTtcclxuICAgICAgICBwb3NbNV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgNV07XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gcG9zO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX1BhcmFtID0gSlNfU2hvd19TZWxlY3Rpb25fUGFyYW0gPVxyXG4gICAgICBmdW5jdGlvbiAoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHB0cl92YWx1ZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19TZWxlY3Rpb25fUGFyYW0oaW5kZXgsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIGxldCBwYXJhbSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDRdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBhcmFtO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX0luZGV4ZXMgPSBKU19TaG93X1NlbGVjdGlvbl9JbmRleGVzID1cclxuICAgICAgZnVuY3Rpb24gKGluZGV4OiBudW1iZXIpOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2MoNCAqIDYpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19TZWxlY3Rpb25fSW5kZXhlcyhpbmRleCwgcHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgbGV0IGlkeCA9IG5ldyBJbnQzMkFycmF5KDYpO1xyXG4gICAgICAgIGlkeFswXSA9IE1vZHVsZS5IRUFQMzJbcHRyX3ZhbHVlIC8gNF07XHJcbiAgICAgICAgaWR4WzFdID0gTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0ICsgMV07XHJcbiAgICAgICAgaWR4WzJdID0gTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0ICsgMl07XHJcbiAgICAgICAgaWR4WzNdID0gTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0ICsgM107XHJcbiAgICAgICAgaWR4WzRdID0gTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0ICsgNF07XHJcbiAgICAgICAgaWR4WzVdID0gTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0ICsgNV07XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gaWR4O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX1Rlc3RfSW5mbyA9IEpTX1Nob3dfU2VsZWN0aW9uX1Rlc3RfSW5mbyA9XHJcbiAgICAgIGZ1bmN0aW9uIChpbmRleDogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2MoNCAqIDE1KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfU2VsZWN0aW9uX1Rlc3RfSW5mbyhpbmRleCwgcHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgbGV0IHBvcyA9IG5ldyBGbG9hdDMyQXJyYXkoMTUpO1xyXG4gICAgICAgIHBvc1swXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDRdO1xyXG4gICAgICAgIHBvc1sxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDQgKyAxXTtcclxuICAgICAgICBwb3NbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgMl07XHJcbiAgICAgICAgcG9zWzNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDNdO1xyXG4gICAgICAgIHBvc1s0XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDQgKyA0XTtcclxuICAgICAgICBwb3NbNV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgNV07XHJcbiAgICAgICAgcG9zWzZdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDZdO1xyXG4gICAgICAgIHBvc1s3XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDQgKyA3XTtcclxuICAgICAgICBwb3NbOF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgOF07XHJcbiAgICAgICAgcG9zWzldID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDldO1xyXG4gICAgICAgIHBvc1sxMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgMTBdO1xyXG4gICAgICAgIHBvc1sxMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgMTFdO1xyXG4gICAgICAgIHBvc1sxMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgMTJdO1xyXG4gICAgICAgIHBvc1sxM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgMTNdO1xyXG4gICAgICAgIHBvc1sxNF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgMTRdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBvcztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXkgPSBKU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXkgPVxyXG4gICAgICBmdW5jdGlvbiAoXHJcbiAgICAgICAgdmlld0tleTogbnVtYmVyLFxyXG4gICAgICAgIG9uZUtleTogbnVtYmVyLFxyXG4gICAgICAgIHR3b0tleTogbnVtYmVyLFxyXG4gICAgICAgIHR5cGU6IENvbGxpc2lvblR5cGUsXHJcbiAgICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfb3B0aW9ucyA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgIHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY291bnQgPSBfR1NfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5KFxyXG4gICAgICAgICAgdmlld0tleSxcclxuICAgICAgICAgIG9uZUtleSxcclxuICAgICAgICAgIHR3b0tleSxcclxuICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICBwdHJfb3B0aW9uc1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHB0cl9vcHRpb25zKSB7XHJcbiAgICAgICAgICBfZnJlZShwdHJfb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5cyA9XHJcbiAgICAgIEpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleXMgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgdmlld19rZXk6IG51bWJlcixcclxuICAgICAgICBvbmVLZXlzOiBJbnQzMkFycmF5LFxyXG4gICAgICAgIHR3b0tleXM6IEludDMyQXJyYXksXHJcbiAgICAgICAgdHlwZTogQ29sbGlzaW9uVHlwZVxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAob25lS2V5cy5sZW5ndGggPiAwICYmIHR3b0tleXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9vbmVfa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBvbmVLZXlzLmxlbmd0aCk7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChvbmVLZXlzLCBwdHJfb25lX2tleXMgLyA0KTtcclxuICAgICAgICAgIGxldCBwdHJfdHdvX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICogdHdvS2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQodHdvS2V5cywgcHRyX3R3b19rZXlzIC8gNCk7XHJcblxyXG4gICAgICAgICAgbGV0IGNvdW50ID0gX0dTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleXMoXHJcbiAgICAgICAgICAgIHZpZXdfa2V5LFxyXG4gICAgICAgICAgICBwdHJfb25lX2tleXMsXHJcbiAgICAgICAgICAgIG9uZUtleXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwdHJfdHdvX2tleXMsXHJcbiAgICAgICAgICAgIHR3b0tleXMubGVuZ3RoLFxyXG4gICAgICAgICAgICB0eXBlXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfb25lX2tleXMpO1xyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90d29fa2V5cyk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleXNfVHQgPVxyXG4gICAgICBKU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlzX1R0ID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXIsXHJcbiAgICAgICAgb25lS2V5czogSW50MzJBcnJheSxcclxuICAgICAgICB0d29LZXlzOiBJbnQzMkFycmF5LFxyXG4gICAgICAgIHR5cGU6IENvbGxpc2lvblR5cGVcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKG9uZUtleXMubGVuZ3RoID4gMCAmJiB0d29LZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfb25lX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICogb25lS2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbmVLZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX29uZV9rZXlzIC8gNCArIGldID0gb25lS2V5c1tpXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIE1vZHVsZS5IRUFQMzIuc2V0KG9uZUtleXMsIHB0cl9vbmVfa2V5cyAvIDQpO1xyXG4gICAgICAgICAgbGV0IHB0cl90d29fa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiB0d29LZXlzLmxlbmd0aCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR3b0tleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfdHdvX2tleXMgLyA0ICsgaV0gPSB0d29LZXlzW2ldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gTW9kdWxlLkhFQVAzMi5zZXQodHdvS2V5cywgcHRyX3R3b19rZXlzIC8gNCk7XHJcblxyXG4gICAgICAgICAgbGV0IGNvdW50ID0gX0dTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleXNfVHQoXHJcbiAgICAgICAgICAgIHZpZXdfa2V5LFxyXG4gICAgICAgICAgICBwdHJfb25lX2tleXMsXHJcbiAgICAgICAgICAgIG9uZUtleXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwdHJfdHdvX2tleXMsXHJcbiAgICAgICAgICAgIHR3b0tleXMubGVuZ3RoLFxyXG4gICAgICAgICAgICB0eXBlXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfb25lX2tleXMpO1xyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90d29fa2V5cyk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleV9UdCA9XHJcbiAgICAgIEpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleV9UdCA9IGZ1bmN0aW9uIChcclxuICAgICAgICB2aWV3a2V5OiBudW1iZXIsXHJcbiAgICAgICAgb25lS2V5OiBudW1iZXIsXHJcbiAgICAgICAgdHdvS2V5OiBudW1iZXIsXHJcbiAgICAgICAgdHlwZTogQ29sbGlzaW9uVHlwZSxcclxuICAgICAgICBubzogbnVtYmVyLFxyXG4gICAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyX29wdGlvbnMgPSBudWxsO1xyXG4gICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvdW50ID0gX0dTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleV9UdChcclxuICAgICAgICAgIHZpZXdrZXksXHJcbiAgICAgICAgICBvbmVLZXksXHJcbiAgICAgICAgICB0d29LZXksXHJcbiAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgbm8sXHJcbiAgICAgICAgICBwdHJfb3B0aW9uc1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChwdHJfb3B0aW9ucykge1xyXG4gICAgICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ29sbGlzaW9uX1N0YXR1cyA9IEpTX1Nob3dfQ29sbGlzaW9uX1N0YXR1cyA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBudW1iZXJbXSB7XHJcbiAgICAgICAgbGV0IHB0clRvdGFsID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0ckN1cnJlbnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBfR1NfU2hvd19Db2xsaXNpb25fU3RhdHVzKHB0clRvdGFsLCBwdHJDdXJyZW50KTtcclxuICAgICAgICBsZXQgdG90YWwgPSBNb2R1bGUuSEVBUDMyW3B0clRvdGFsIC8gNF07XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBNb2R1bGUuSEVBUDMyW3B0ckN1cnJlbnQgLyA0XTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyVG90YWwpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJDdXJyZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFt0b3RhbCwgY3VycmVudF07XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Db2xsaXNpb25fQ291bnQgPSBKU19TaG93X0NvbGxpc2lvbl9Db3VudCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBfR1NfU2hvd19Db2xsaXNpb25fQ291bnQocHRyKTtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ29sbGlzaW9uX0VsZW1lbnRzID0gSlNfU2hvd19Db2xsaXNpb25fRWxlbWVudHMgPVxyXG4gICAgICBmdW5jdGlvbiAoaW5kZXg6IG51bWJlcik6IEludDMyQXJyYXkge1xyXG4gICAgICAgIGxldCBwdHJfc2VnX29uZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfc2VnX3R3byA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfZ2VvbV9vbmUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX2dlb21fdHdvID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfQ29sbGlzaW9uX0VsZW1lbnRzKFxyXG4gICAgICAgICAgaW5kZXgsXHJcbiAgICAgICAgICBwdHJfc2VnX29uZSxcclxuICAgICAgICAgIHB0cl9zZWdfdHdvLFxyXG4gICAgICAgICAgcHRyX2dlb21fb25lLFxyXG4gICAgICAgICAgcHRyX2dlb21fdHdvXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQga2V5X3NlZ19vbmUgPSBNb2R1bGUuSEVBUDMyW3B0cl9zZWdfb25lIC8gNF07XHJcbiAgICAgICAgbGV0IGtleV9zZWdfdHdvID0gTW9kdWxlLkhFQVAzMltwdHJfc2VnX3R3byAvIDRdO1xyXG4gICAgICAgIGxldCBrZXlfZ2VvbV9vbmUgPSBNb2R1bGUuSEVBUDMyW3B0cl9nZW9tX29uZSAvIDRdO1xyXG4gICAgICAgIGxldCBrZXlfZ2VvbV90d28gPSBNb2R1bGUuSEVBUDMyW3B0cl9nZW9tX3R3byAvIDRdO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfc2VnX29uZSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zZWdfdHdvKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2dlb21fb25lKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2dlb21fdHdvKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KFtcclxuICAgICAgICAgIGtleV9zZWdfb25lLFxyXG4gICAgICAgICAga2V5X3NlZ190d28sXHJcbiAgICAgICAgICBrZXlfZ2VvbV9vbmUsXHJcbiAgICAgICAgICBrZXlfZ2VvbV90d28sXHJcbiAgICAgICAgXSk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Db2xsaXNpb25fUGF0aHMgPSBKU19TaG93X0NvbGxpc2lvbl9QYXRocyA9XHJcbiAgICAgIGZ1bmN0aW9uIChpbmRleDogbnVtYmVyKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGxldCBwdHJfcGF0aF9vbmUgPSBNb2R1bGUuX21hbGxvYygxMDI0KTtcclxuICAgICAgICBsZXQgcHRyX3BhdGhfdHdvID0gTW9kdWxlLl9tYWxsb2MoMTAyNCk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0NvbGxpc2lvbl9QYXRocyhpbmRleCwgcHRyX3BhdGhfb25lLCBwdHJfcGF0aF90d28pO1xyXG5cclxuICAgICAgICBsZXQgcGF0aF9vbmUgPSBVVEY4VG9TdHJpbmcocHRyX3BhdGhfb25lKTtcclxuICAgICAgICBsZXQgcGF0aF90d28gPSBVVEY4VG9TdHJpbmcocHRyX3BhdGhfdHdvKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXRoX29uZSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXRoX3R3byk7XHJcblxyXG4gICAgICAgIHJldHVybiBbcGF0aF9vbmUsIHBhdGhfdHdvXTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbGxpc2lvbl9QYXRoX0J5X0tleXMgPVxyXG4gICAgICBKU19TaG93X0NvbGxpc2lvbl9QYXRoX0J5X0tleXMgPSBmdW5jdGlvbiAoaW5kZXg6IG51bWJlcik6IEludDMyQXJyYXlbXSB7XHJcbiAgICAgICAgbGV0IHB0cl9jb3VudF9vbmUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX2tleXNfb25lID0gTW9kdWxlLl9tYWxsb2MoNCAqIDUxMik7XHJcbiAgICAgICAgbGV0IHB0cl9jb3VudF90d28gPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX2tleXNfdHdvID0gTW9kdWxlLl9tYWxsb2MoNCAqIDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0NvbGxpc2lvbl9QYXRoX0J5X0tleXMoXHJcbiAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgIHB0cl9jb3VudF9vbmUsXHJcbiAgICAgICAgICBwdHJfa2V5c19vbmUsXHJcbiAgICAgICAgICBwdHJfY291bnRfdHdvLFxyXG4gICAgICAgICAgcHRyX2tleXNfdHdvXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50X29uZSA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50X29uZSAvIDRdO1xyXG4gICAgICAgIGxldCByZXN1bHRfb25lID0gbmV3IEludDMyQXJyYXkoY291bnRfb25lKTtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50X3R3byA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50X3R3byAvIDRdO1xyXG4gICAgICAgIGxldCByZXN1bHRfdHdvID0gbmV3IEludDMyQXJyYXkoY291bnRfdHdvKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudF9vbmU7IGkrKykge1xyXG4gICAgICAgICAgcmVzdWx0X29uZVtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2tleXNfb25lIC8gNCArIGldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50X3R3bzsgaSsrKSB7XHJcbiAgICAgICAgICByZXN1bHRfdHdvW2ldID0gTW9kdWxlLkhFQVAzMltwdHJfa2V5c190d28gLyA0ICsgaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvdW50X29uZSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9rZXlzX29uZSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb3VudF90d28pO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5c190d28pO1xyXG5cclxuICAgICAgICByZXR1cm4gW3Jlc3VsdF9vbmUsIHJlc3VsdF90d29dO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ29sbGlzaW9uX1Bvc2l0aW9uID0gSlNfU2hvd19Db2xsaXNpb25fUG9zaXRpb24gPVxyXG4gICAgICBmdW5jdGlvbiAoaW5kZXg6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0cl92YWx1ZSA9IE1vZHVsZS5fbWFsbG9jKDQgKiA2KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfQ29sbGlzaW9uX1Bvc2l0aW9uKGluZGV4LCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICBsZXQgcG9zID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgICBwb3NbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0XTtcclxuICAgICAgICBwb3NbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgMV07XHJcbiAgICAgICAgcG9zWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDJdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBvcztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbGxpc2lvbl9UeXBlID0gSlNfU2hvd19Db2xsaXNpb25fVHlwZSA9IGZ1bmN0aW9uIChcclxuICAgICAgaW5kZXg6IG51bWJlclxyXG4gICAgKTogbnVtYmVyIHtcclxuICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfQ29sbGlzaW9uX1R5cGUoaW5kZXgsIHB0cik7XHJcbiAgICAgIGxldCB0eXBlID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcblxyXG4gICAgICByZXR1cm4gdHlwZTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWdtZW50X05hbWUgPSBKU19TaG93X1NlZ21lbnRfTmFtZSA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBwdHJfbmFtZSA9IE1vZHVsZS5fbWFsbG9jKDI1Nik7XHJcbiAgICAgIF9HU19TaG93X1NlZ21lbnRfTmFtZShrZXksIHB0cl9uYW1lKTtcclxuXHJcbiAgICAgIGxldCBuYW1lID0gVVRGOFRvU3RyaW5nKHB0cl9uYW1lKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfbmFtZSk7XHJcblxyXG4gICAgICByZXR1cm4gbmFtZTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWdtZW50X1BhdGggPSBKU19TaG93X1NlZ21lbnRfUGF0aCA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBwdHJfcGF0aCA9IE1vZHVsZS5fbWFsbG9jKDEwMjQpO1xyXG4gICAgICBfR1NfU2hvd19TZWdtZW50X1BhdGgoa2V5LCBwdHJfcGF0aCk7XHJcblxyXG4gICAgICBsZXQgcGF0aCA9IFVURjhUb1N0cmluZyhwdHJfcGF0aCk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhdGgpO1xyXG5cclxuICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NlZ21lbnRfRXhpc3RzID0gSlNfU2VnbWVudF9FeGlzdHMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBfR1NfU2VnbWVudF9FeGlzdHMocHRyKTtcclxuICAgICAgX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX01vdmVfS2V5ID0gSlNfTW92ZV9LZXkgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBuZXdfb3duZXJfcGF0aDogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuZXdfb3duZXJfcGF0aCk7XHJcbiAgICAgIF9HU19Nb3ZlX0tleShrZXksIHB0cik7XHJcbiAgICAgIF9mcmVlKHB0cik7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1JlbmFtZV9TZWdtZW50ID0gSlNfUmVuYW1lX1NlZ21lbnQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBfR1NfUmVuYW1lX1NlZ21lbnQocHRyKTtcclxuICAgICAgX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX01vdmVfS2V5X0J5X0tleSA9IEpTX01vdmVfS2V5X0J5X0tleSA9XHJcbiAgICAgIF9HU19Nb3ZlX0tleV9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQWRkX0ZvbnRfTGlicmFyeSA9IEpTX0FkZF9Gb250X0xpYnJhcnkgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZyxcclxuICAgICAgZGF0YTogQXJyYXlCdWZmZXJcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX25hbWUgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgYXJyYXkgPSBuZXcgSW50OEFycmF5KGRhdGEpO1xyXG4gICAgICBNb2R1bGUuSEVBUDguc2V0KGFycmF5LCBwdHJfZGF0YSk7XHJcblxyXG4gICAgICBfR1NfQWRkX0ZvbnRfTGlicmFyeShwdHJfbmFtZSwgcHRyX2RhdGEsIGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG4gICAgICBfZnJlZShwdHJfbmFtZSk7XHJcblxyXG4gICAgICBhcnJheSA9IG51bGw7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0ZvbnRfTGlicmFyeV9FeGlzdHMgPSBKU19Gb250X0xpYnJhcnlfRXhpc3RzID0gZnVuY3Rpb24gKFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgICBsZXQgcHRyX25hbWUgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcblxyXG4gICAgICByZXN1bHQgPSBfR1NfRm9udF9MaWJyYXJ5X0V4aXN0cyhwdHJfbmFtZSk7XHJcblxyXG4gICAgICBfZnJlZShwdHJfbmFtZSk7XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19SZW1vdmVfRm9udF9MaWJyYXJ5ID0gSlNfUmVtb3ZlX0ZvbnRfTGlicmFyeSA9IGZ1bmN0aW9uIChcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG5cclxuICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG5cclxuICAgICAgcmVzdWx0ID0gX0dTX1JlbW92ZV9Gb250X0xpYnJhcnkocHRyX25hbWUpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfRm9udF9MaWJyYXJ5ID0gX0dTX0NsZWFyX0ZvbnRfTGlicmFyeTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfRHJpdmVyX0NvbmZpZ3MgPSBKU19TZXRfRHJpdmVyX0NvbmZpZ3MgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGNvbmZpZ3M6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfY29uZmlncyA9IGFsbG9jYXRlVVRGOChjb25maWdzKTtcclxuICAgICAgX0dTX1NldF9Ecml2ZXJfQ29uZmlncyhwdHJfY29uZmlncyk7XHJcbiAgICAgIF9mcmVlKHB0cl9jb25maWdzKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQWRkX1Byb3BlcnR5X0Jvb2xlYW4gPSBKU19BZGRfUHJvcGVydHlfQm9vbGVhbiA9XHJcbiAgICAgIGZ1bmN0aW9uIChrZXk6IG51bWJlciwgbmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX3ZhbHVlIC8gNF0gPSAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl92YWx1ZSAvIDRdID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9HU19BZGRfUHJvcGVydHlfQm9vbGVhbihrZXksIHB0ciwgcHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19BZGRfUHJvcGVydHlfSW50ZWdlciA9IEpTX0FkZF9Qcm9wZXJ0eV9JbnRlZ2VyID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0XSA9IHZhbHVlO1xyXG5cclxuICAgICAgICBfR1NfQWRkX1Byb3BlcnR5X0ludGVnZXIoa2V5LCBwdHIsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl92YWx1ZSk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQWRkX1Byb3BlcnR5X0RvdWJsZSA9IEpTX0FkZF9Qcm9wZXJ0eV9Eb3VibGUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgIHZhbHVlOiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG5cclxuICAgICAgbGV0IHB0cl92YWx1ZSA9IE1vZHVsZS5fbWFsbG9jKDgpO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfdmFsdWUgLyA4XSA9IHZhbHVlO1xyXG5cclxuICAgICAgX0dTX0FkZF9Qcm9wZXJ0eV9Eb3VibGVfQnlfUG9pbnRlcihrZXksIHB0ciwgcHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgIF9mcmVlKHB0cik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdmFsdWUpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19BZGRfUHJvcGVydHlfU3RyaW5nID0gSlNfQWRkX1Byb3BlcnR5X1N0cmluZyA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgIG5hbWU6IHN0cmluZyxcclxuICAgICAgdmFsdWU6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCBwdHJfdmFsdWUgPSBhbGxvY2F0ZVVURjgodmFsdWUpO1xyXG5cclxuICAgICAgX0dTX0FkZF9Qcm9wZXJ0eV9TdHJpbmcoa2V5LCBwdHIsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICBfZnJlZShwdHIpO1xyXG4gICAgICBfZnJlZShwdHJfdmFsdWUpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19BZGRfUHJvcGVydHlfSnNvbiA9IEpTX0FkZF9Qcm9wZXJ0eV9Kc29uID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgICB2YWx1ZTogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgbGV0IHB0cl92YWx1ZSA9IGFsbG9jYXRlVVRGOCh2YWx1ZSk7XHJcblxyXG4gICAgICBfR1NfQWRkX1Byb3BlcnR5X0pzb24oa2V5LCBwdHIsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICBfZnJlZShwdHIpO1xyXG4gICAgICBfZnJlZShwdHJfdmFsdWUpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Byb3BlcnR5X1R5cGUgPSBKU19TaG93X1Byb3BlcnR5X1R5cGUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICk6IG51bWJlciB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcblxyXG4gICAgICBsZXQgcHRyX3R5cGUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X1Byb3BlcnR5X1R5cGUoa2V5LCBwdHIsIHB0cl90eXBlKTtcclxuXHJcbiAgICAgIGxldCB0eXBlID0gTW9kdWxlLkhFQVAzMltwdHJfdHlwZSAvIDRdO1xyXG5cclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgX2ZyZWUocHRyX3R5cGUpO1xyXG5cclxuICAgICAgcmV0dXJuIHR5cGU7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUHJvcGVydHlfQm9vbGVhbiA9IEpTX1Nob3dfUHJvcGVydHlfQm9vbGVhbiA9XHJcbiAgICAgIGZ1bmN0aW9uIChrZXk6IG51bWJlciwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl92YWx1ZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19Qcm9wZXJ0eV9Cb29sZWFuKGtleSwgcHRyLCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICBsZXQgdmFsdWUgPSBNb2R1bGUuSEVBUDMyW3B0cl92YWx1ZSAvIDRdO1xyXG5cclxuICAgICAgICBfZnJlZShwdHIpO1xyXG4gICAgICAgIF9mcmVlKHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSA9PSAxKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Byb3BlcnR5X0ludGVnZXIgPSBKU19TaG93X1Byb3BlcnR5X0ludGVnZXIgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl92YWx1ZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19Qcm9wZXJ0eV9JbnRlZ2VyKGtleSwgcHRyLCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICBsZXQgdmFsdWUgPSBNb2R1bGUuSEVBUDMyW3B0cl92YWx1ZSAvIDRdO1xyXG5cclxuICAgICAgICBfZnJlZShwdHIpO1xyXG4gICAgICAgIF9mcmVlKHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Byb3BlcnR5X0RvdWJsZSA9IEpTX1Nob3dfUHJvcGVydHlfRG91YmxlID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfUHJvcGVydHlfRG91YmxlKGtleSwgcHRyLCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICBsZXQgdmFsdWUgPSBNb2R1bGUuSEVBUEY2NFtwdHJfdmFsdWUgLyA4XTtcclxuXHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgICBfZnJlZShwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qcm9wZXJ0eV9TdHJpbmcgPSBKU19TaG93X1Byb3BlcnR5X1N0cmluZyA9XHJcbiAgICAgIGZ1bmN0aW9uIChrZXk6IG51bWJlciwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICAgIGxldCBwdHJfbGVuID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1Byb3BlcnR5X1N0cmluZ19MZW5ndGgoa2V5LCBwdHIsIHB0cl9sZW4pO1xyXG4gICAgICAgIGxldCBsZW4gPSBNb2R1bGUuSEVBUDMyW3B0cl9sZW4gLyA0XTtcclxuXHJcbiAgICAgICAgaWYgKGxlbiA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyhsZW4gKyAxKTtcclxuXHJcbiAgICAgICAgICBfR1NfU2hvd19Qcm9wZXJ0eV9TdHJpbmcoa2V5LCBwdHIsIHB0cl92YWx1ZSk7XHJcbiAgICAgICAgICByZXN1bHQgPSBVVEY4VG9TdHJpbmcocHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9sZW4pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Byb3BlcnR5X0V4aXN0cyA9IEpTX1Byb3BlcnR5X0V4aXN0cyA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKTogYm9vbGVhbiB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcblxyXG4gICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gX0dTX1Byb3BlcnR5X0V4aXN0cyhrZXksIHB0cik7XHJcblxyXG4gICAgICBfZnJlZShwdHIpO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfUmVtb3ZlX1Byb3BlcnR5ID0gSlNfUmVtb3ZlX1Byb3BlcnR5ID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuXHJcbiAgICAgIEpTX1JlbW92ZV9Qcm9wZXJ0eShrZXksIHB0cik7XHJcblxyXG4gICAgICBfZnJlZShwdHIpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9Qcm9wZXJ0aWVzID0gSlNfQ2xlYXJfUHJvcGVydGllcyA9XHJcbiAgICAgIF9HU19DbGVhcl9Qcm9wZXJ0aWVzO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUHJvcGVydGllcyA9IEpTX1Nob3dfUHJvcGVydGllcyA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gbmV3IFN0cmluZ0tleUxpc3Q8YW55PigpO1xyXG4gICAgICBsZXQgcHRyX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19Qcm9wZXJ0eV9Db3VudChrZXksIHB0cl9jb3VudCk7XHJcbiAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNF07XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICBsZXQgcHRyX3R5cGUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX25hbWVfbGVuID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl92YWx1ZV9sZW4gPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfUHJvcGVydHlfVHlwZV9CeV9JbmRleChrZXksIGksIHB0cl90eXBlKTtcclxuICAgICAgICBfR1NfU2hvd19Qcm9wZXJ0eV9MZW5ndGhfQnlfSW5kZXgoa2V5LCBpLCBwdHJfbmFtZV9sZW4sIHB0cl92YWx1ZV9sZW4pO1xyXG5cclxuICAgICAgICBsZXQgdHlwZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3R5cGUgLyA0XTtcclxuICAgICAgICBsZXQgbmFtZV9sZW4gPSBNb2R1bGUuSEVBUDMyW3B0cl9uYW1lX2xlbiAvIDRdO1xyXG4gICAgICAgIGxldCB2YWx1ZV9sZW4gPSBNb2R1bGUuSEVBUDMyW3B0cl92YWx1ZV9sZW4gLyA0XTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGUgPT0gMSkge1xyXG4gICAgICAgICAgbGV0IHB0cl9uYW1lID0gTW9kdWxlLl9tYWxsb2MobmFtZV9sZW4gKyAxKTtcclxuICAgICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICAgIF9HU19TaG93X1Byb3BlcnR5X0J5X0luZGV4KGtleSwgaSwgcHRyX25hbWUsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgICAgbGV0IG5hbWUgPSBVVEY4VG9TdHJpbmcocHRyX25hbWUpO1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0XTtcclxuICAgICAgICAgIHJlc3VsdC5hZGQobmFtZSwgdmFsdWUgYXMgYm9vbGVhbik7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9uYW1lKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAyKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX25hbWUgPSBNb2R1bGUuX21hbGxvYyhuYW1lX2xlbiArIDEpO1xyXG4gICAgICAgICAgbGV0IHB0cl92YWx1ZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgICAgX0dTX1Nob3dfUHJvcGVydHlfQnlfSW5kZXgoa2V5LCBpLCBwdHJfbmFtZSwgcHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgICBsZXQgbmFtZSA9IFVURjhUb1N0cmluZyhwdHJfbmFtZSk7XHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSBNb2R1bGUuSEVBUDMyW3B0cl92YWx1ZSAvIDRdO1xyXG4gICAgICAgICAgcmVzdWx0LmFkZChuYW1lLCB2YWx1ZSBhcyBudW1iZXIpO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbmFtZSk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMykge1xyXG4gICAgICAgICAgbGV0IHB0cl9uYW1lID0gTW9kdWxlLl9tYWxsb2MobmFtZV9sZW4gKyAxKTtcclxuICAgICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuICAgICAgICAgIF9HU19TaG93X1Byb3BlcnR5X0J5X0luZGV4KGtleSwgaSwgcHRyX25hbWUsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgICAgbGV0IG5hbWUgPSBVVEY4VG9TdHJpbmcocHRyX25hbWUpO1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gTW9kdWxlLkhFQVBGNjRbcHRyX3ZhbHVlIC8gOF07XHJcbiAgICAgICAgICByZXN1bHQuYWRkKG5hbWUsIHZhbHVlIGFzIG51bWJlcik7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9uYW1lKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSA0IHx8IHR5cGUgPT0gNSkge1xyXG4gICAgICAgICAgbGV0IHB0cl9uYW1lID0gTW9kdWxlLl9tYWxsb2MobmFtZV9sZW4gKyAxKTtcclxuICAgICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyh2YWx1ZV9sZW4gKyAxKTtcclxuICAgICAgICAgIF9HU19TaG93X1Byb3BlcnR5X0J5X0luZGV4KGtleSwgaSwgcHRyX25hbWUsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgICAgbGV0IG5hbWUgPSBVVEY4VG9TdHJpbmcocHRyX25hbWUpO1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gVVRGOFRvU3RyaW5nKHB0cl92YWx1ZSk7XHJcbiAgICAgICAgICByZXN1bHQuYWRkKG5hbWUsIHZhbHVlKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX25hbWUpO1xyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl92YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3R5cGUpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbmFtZV9sZW4pO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdmFsdWVfbGVuKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb3VudCk7XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0tleV9CeV9JZCA9IEpTX1Nob3dfS2V5X0J5X0lkID0gZnVuY3Rpb24gKFxyXG4gICAgICBpZDogc3RyaW5nXHJcbiAgICApOiBudW1iZXIge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KGlkKTtcclxuICAgICAgbGV0IGtleSA9IF9HU19TaG93X0tleV9CeV9JZChwdHIpO1xyXG4gICAgICBfZnJlZShwdHIpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0tleV9JbmRleCA9IEpTX1NldF9LZXlfSW5kZXggPSBfR1NfU2V0X0tleV9JbmRleDtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0tleV9JbmRleCA9IEpTX1Nob3dfS2V5X0luZGV4ID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogbnVtYmVyIHtcclxuICAgICAgbGV0IHB0cl9pbmRleCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfS2V5X0luZGV4KGtleSwgcHRyX2luZGV4KTtcclxuXHJcbiAgICAgIGxldCBpbmRleCA9IE1vZHVsZS5IRUFQMzJbcHRyX2luZGV4IC8gNF07XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2luZGV4KTtcclxuXHJcbiAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19LZXlfVGFnID0gSlNfU2hvd19LZXlfVGFnID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcbiAgICAgIGxldCBwdHJfdGFnID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgIGlmIChfR1NfU2hvd19LZXlfVGFnKGtleSwgcHRyX3RhZykpIHtcclxuICAgICAgICByZXN1bHQgPSBVVEY4VG9TdHJpbmcocHRyX3RhZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdGFnKTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9Ecml2ZXJfT3B0aW9ucyA9IEpTX1NldF9Ecml2ZXJfT3B0aW9ucyA9IGZ1bmN0aW9uIChcclxuICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG4gICAgICBfR1NfU2V0X0RyaXZlcl9PcHRpb25zKHB0cl9vcHRpb25zKTtcclxuICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0RyaXZlcl9PcHRpb25zID0gSlNfU2hvd19Ecml2ZXJfT3B0aW9ucyA9XHJcbiAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcHRyX3JvID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfRHJpdmVyX09wdGlvbnMocHRyX3JvKTtcclxuXHJcbiAgICAgICAgbGV0IHJvID0gVVRGOFRvU3RyaW5nKHB0cl9ybyk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcm8pO1xyXG5cclxuICAgICAgICByZXR1cm4gcm87XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfRHJpdmVyX09wdGlvbiA9IEpTX1Nob3dfT25lX0RyaXZlcl9PcHRpb24gPVxyXG4gICAgICBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgICBsZXQgcHRyX3JvID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfT25lX0RyaXZlcl9PcHRpb24ocHRyLCBwdHJfcm8pO1xyXG5cclxuICAgICAgICBsZXQgcm8gPSBVVEY4VG9TdHJpbmcocHRyX3JvKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ybyk7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJvO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9TaGFkZXIgPSBKU19TZXRfU2hhZGVyID0gZnVuY3Rpb24gKHNoYWRlcjogc3RyaW5nKSB7XHJcbiAgICAgIGxldCBwdHJfc2hhZGVyID0gYWxsb2NhdGVVVEY4KHNoYWRlcik7XHJcbiAgICAgIC8vbGV0IHB0cl9zaGFkZXIgPSBNb2R1bGUuX21hbGxvYyhzaGFkZXIubGVuZ3RoICsgMSk7XHJcbiAgICAgIC8vc3RyaW5nVG9Bc2NpaShzaGFkZXIsIHB0cl9zaGFkZXIpO1xyXG4gICAgICBfR1NfU2V0X1NoYWRlcihwdHJfc2hhZGVyKTtcclxuICAgICAgX2ZyZWUocHRyX3NoYWRlcik7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2hhZGVyID0gSlNfU2hvd19TaGFkZXIgPSBmdW5jdGlvbiAoKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHB0cl9zaCA9IE1vZHVsZS5fbWFsbG9jKDIwNDAwKTtcclxuXHJcbiAgICAgIF9HU19TaG93X1NoYWRlcihwdHJfc2gpO1xyXG5cclxuICAgICAgbGV0IHNoID0gVVRGOFRvU3RyaW5nKHB0cl9zaCk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3NoKTtcclxuXHJcbiAgICAgIHJldHVybiBzaDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfU2hhZGVyID0gSlNfU2hvd19PbmVfU2hhZGVyID0gZnVuY3Rpb24gKFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCBwdHJfc2ggPSBNb2R1bGUuX21hbGxvYygyMDQwMCk7XHJcblxyXG4gICAgICBsZXQgc3VjY2VlZCA9IF9HU19TaG93X09uZV9TaGFkZXIocHRyLCBwdHJfc2gpO1xyXG5cclxuICAgICAgbGV0IHNoID0gbnVsbDtcclxuICAgICAgaWYgKHN1Y2NlZWQpIHtcclxuICAgICAgICBsZXQgc2ggPSBVVEY4VG9TdHJpbmcocHRyX3NoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zaCk7XHJcbiAgICAgIF9mcmVlKHB0cik7XHJcblxyXG4gICAgICByZXR1cm4gc2g7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X1NoYWRlciA9IEpTX1VuU2V0X1NoYWRlciA9IF9HU19VblNldF9TaGFkZXI7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X1ZpZXdwb3J0ID0gSlNfU2V0X1ZpZXdwb3J0ID0gZnVuY3Rpb24gKFxyXG4gICAgICB4OiBudW1iZXIsXHJcbiAgICAgIHk6IG51bWJlcixcclxuICAgICAgd2lkdGg6IG51bWJlcixcclxuICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgIHR5cGU6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfdHlwZSA9IGFsbG9jYXRlVVRGOCh0eXBlKTtcclxuICAgICAgX0dTX1NldF9WaWV3cG9ydCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwdHJfdHlwZSk7XHJcbiAgICAgIF9mcmVlKHB0cl90eXBlKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0NhbWVyYSA9IEpTX1NldF9DYW1lcmEgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHBvczogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIHRhcjogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIHVwOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgd2lkdGg6IG51bWJlcixcclxuICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgIHByb2plY3Rpb246IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOF0gPSBwb3NbMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4ICsgMV0gPSBwb3NbMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4ICsgMl0gPSBwb3NbMl07XHJcblxyXG4gICAgICBsZXQgcHRyX3RhciA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDhdID0gdGFyWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfdGFyIC8gOCArIDFdID0gdGFyWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfdGFyIC8gOCArIDJdID0gdGFyWzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl91cCA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3VwIC8gOF0gPSB1cFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3VwIC8gOCArIDFdID0gdXBbMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDggKyAyXSA9IHVwWzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl9wcm9qID0gYWxsb2NhdGVVVEY4KHByb2plY3Rpb24pO1xyXG5cclxuICAgICAgX0dTX1NldF9DYW1lcmEocHRyX3BvcywgcHRyX3RhciwgcHRyX3VwLCB3aWR0aCwgaGVpZ2h0LCBwdHJfcHJvaik7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdGFyKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl91cCk7XHJcbiAgICAgIF9mcmVlKHB0cl9wcm9qKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbiA9IEpTX1NldF9DYW1lcmFfUG9zaXRpb24gPSBmdW5jdGlvbiAoXHJcbiAgICAgIHBvczogQXJyYXlMaWtlPG51bWJlcj5cclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDhdID0gcG9zWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOCArIDFdID0gcG9zWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOCArIDJdID0gcG9zWzJdO1xyXG5cclxuICAgICAgX0dTX1NldF9DYW1lcmFfUG9zaXRpb24ocHRyX3Bvcyk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmFfVGFyZ2V0ID0gSlNfU2V0X0NhbWVyYV9UYXJnZXQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHRhcjogQXJyYXlMaWtlPG51bWJlcj5cclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3RhciA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDhdID0gdGFyWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfdGFyIC8gOCArIDFdID0gdGFyWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfdGFyIC8gOCArIDJdID0gdGFyWzJdO1xyXG5cclxuICAgICAgX0dTX1NldF9DYW1lcmFfVGFyZ2V0KHB0cl90YXIpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl90YXIpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ2FtZXJhX1VwID0gSlNfU2V0X0NhbWVyYV9VcCA9IGZ1bmN0aW9uIChcclxuICAgICAgdXA6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl91cCA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3VwIC8gOF0gPSB1cFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3VwIC8gOCArIDFdID0gdXBbMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDggKyAyXSA9IHVwWzJdO1xyXG5cclxuICAgICAgX0dTX1NldF9DYW1lcmFfVXAocHRyX3VwKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdXApO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ2FtZXJhX0ZpZWxkID0gSlNfU2V0X0NhbWVyYV9GaWVsZCA9XHJcbiAgICAgIF9HU19TZXRfQ2FtZXJhX0ZpZWxkO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmFfRXh0ZW50ID0gSlNfU2V0X0NhbWVyYV9FeHRlbnQgPVxyXG4gICAgICBfR1NfU2V0X0NhbWVyYV9FeHRlbnQ7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0NhbWVyYV9Qcm9qZWN0aW9uID0gSlNfU2V0X0NhbWVyYV9Qcm9qZWN0aW9uID1cclxuICAgICAgZnVuY3Rpb24gKHByb2plY3Rpb246IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHJfcHJvaiA9IGFsbG9jYXRlVVRGOChwcm9qZWN0aW9uKTtcclxuXHJcbiAgICAgICAgX0dTX1NldF9DYW1lcmFfUHJvamVjdGlvbihwdHJfcHJvaik7XHJcblxyXG4gICAgICAgIF9mcmVlKHB0cl9wcm9qKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19LZWVwX0NhbWVyYV9SYXRpbyA9IEpTX0tlZXBfQ2FtZXJhX1JhdGlvID1cclxuICAgICAgX0dTX0tlZXBfQ2FtZXJhX1JhdGlvO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2FtZXJhID0gSlNfU2hvd19DYW1lcmEgPSBmdW5jdGlvbiAoKTogYW55IHtcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcbiAgICAgIGxldCBwdHJfdGFyID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG4gICAgICBsZXQgcHRyX3VwID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG5cclxuICAgICAgbGV0IHB0cl93aWR0aCA9IE1vZHVsZS5fbWFsbG9jKDgpO1xyXG4gICAgICBsZXQgcHRyX2hlaWdodCA9IE1vZHVsZS5fbWFsbG9jKDgpO1xyXG5cclxuICAgICAgbGV0IHB0cl9wcm9qID0gTW9kdWxlLl9tYWxsb2MoNjQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfQ2FtZXJhKFxyXG4gICAgICAgIHB0cl9wb3MsXHJcbiAgICAgICAgcHRyX3RhcixcclxuICAgICAgICBwdHJfdXAsXHJcbiAgICAgICAgcHRyX3dpZHRoLFxyXG4gICAgICAgIHB0cl9oZWlnaHQsXHJcbiAgICAgICAgcHRyX3Byb2pcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGxldCBjYW1lcmE6IGFueSA9IHt9O1xyXG5cclxuICAgICAgbGV0IHBvcyA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICAgIHBvc1swXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4XTtcclxuICAgICAgcG9zWzFdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDggKyAxXTtcclxuICAgICAgcG9zWzJdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDggKyAyXTtcclxuICAgICAgY2FtZXJhLnBvc2l0aW9uID0gcG9zO1xyXG5cclxuICAgICAgbGV0IHRhciA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICAgIHRhclswXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl90YXIgLyA4XTtcclxuICAgICAgdGFyWzFdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDggKyAxXTtcclxuICAgICAgdGFyWzJdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDggKyAyXTtcclxuICAgICAgY2FtZXJhLnRhcmdldCA9IHRhcjtcclxuXHJcbiAgICAgIGxldCB1cCA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICAgIHVwWzBdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3VwIC8gOF07XHJcbiAgICAgIHVwWzFdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3VwIC8gOCArIDFdO1xyXG4gICAgICB1cFsyXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDggKyAyXTtcclxuICAgICAgY2FtZXJhLnVwID0gdXA7XHJcblxyXG4gICAgICBjYW1lcmEud2lkdGggPSBNb2R1bGUuSEVBUEY2NFtwdHJfd2lkdGggLyA4XTtcclxuICAgICAgY2FtZXJhLmhlaWdodCA9IE1vZHVsZS5IRUFQRjY0W3B0cl9oZWlnaHQgLyA4XTtcclxuXHJcbiAgICAgIGNhbWVyYS5wcm9qZWN0aW9uID0gVVRGOFRvU3RyaW5nKHB0cl9wcm9qKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl90YXIpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3VwKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl93aWR0aCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfaGVpZ2h0KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wcm9qKTtcclxuXHJcbiAgICAgIHJldHVybiBjYW1lcmE7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2FtZXJhX1Bvc2l0aW9uID0gSlNfU2hvd19DYW1lcmFfUG9zaXRpb24gPVxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0NhbWVyYV9Qb3NpdGlvbihwdHJfcG9zKTtcclxuXHJcbiAgICAgICAgbGV0IHBvcyA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcblxyXG4gICAgICAgIHBvc1swXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4XTtcclxuICAgICAgICBwb3NbMV0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOCArIDFdO1xyXG4gICAgICAgIHBvc1syXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4ICsgMl07XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBvcztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9UYXJnZXQgPSBKU19TaG93X0NhbWVyYV9UYXJnZXQgPVxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHB0cl90YXIgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0NhbWVyYV9UYXJnZXQocHRyX3Rhcik7XHJcblxyXG4gICAgICAgIGxldCB0YXIgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG5cclxuICAgICAgICB0YXJbMF0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfdGFyIC8gOF07XHJcbiAgICAgICAgdGFyWzFdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDggKyAxXTtcclxuICAgICAgICB0YXJbMl0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfdGFyIC8gOCArIDJdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Rhcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0YXI7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfVXAgPSBKU19TaG93X0NhbWVyYV9VcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgbGV0IHB0cl91cCA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuXHJcbiAgICAgIF9HU19TaG93X0NhbWVyYV9VcChwdHJfdXApO1xyXG5cclxuICAgICAgbGV0IHVwID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuXHJcbiAgICAgIHVwWzBdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3VwIC8gOF07XHJcbiAgICAgIHVwWzFdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3VwIC8gOCArIDFdO1xyXG4gICAgICB1cFsyXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDggKyAyXTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdXApO1xyXG5cclxuICAgICAgcmV0dXJuIHVwO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9GaWVsZCA9IEpTX1Nob3dfQ2FtZXJhX0ZpZWxkID1cclxuICAgICAgZnVuY3Rpb24gKCk6IGFueSB7XHJcbiAgICAgICAgbGV0IHB0cl93aWR0aCA9IE1vZHVsZS5fbWFsbG9jKDgpO1xyXG4gICAgICAgIGxldCBwdHJfaGVpZ2h0ID0gTW9kdWxlLl9tYWxsb2MoOCk7XHJcblxyXG4gICAgICAgIGxldCBmaWVsZCA9IG5ldyBGbG9hdDY0QXJyYXkoMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0NhbWVyYV9GaWVsZChwdHJfd2lkdGgsIHB0cl9oZWlnaHQpO1xyXG5cclxuICAgICAgICBmaWVsZFswXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl93aWR0aCAvIDhdO1xyXG4gICAgICAgIGZpZWxkWzFdID0gTW9kdWxlLkhFQVBGNjRbcHRyX2hlaWdodCAvIDhdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3dpZHRoKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2hlaWdodCk7XHJcblxyXG4gICAgICAgIHJldHVybiBmaWVsZDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9FeHRlbnQgPSBKU19TaG93X0NhbWVyYV9FeHRlbnQgPVxyXG4gICAgICBmdW5jdGlvbiAoKTogRmxvYXQ2NEFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX25lYXIgPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuICAgICAgICBsZXQgcHRyX2ZhciA9IE1vZHVsZS5fbWFsbG9jKDgpO1xyXG5cclxuICAgICAgICBsZXQgZXh0ZW50ID0gbmV3IEZsb2F0NjRBcnJheSgyKTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfQ2FtZXJhX0V4dGVudChwdHJfbmVhciwgcHRyX2Zhcik7XHJcblxyXG4gICAgICAgIGV4dGVudFswXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9uZWFyIC8gOF07XHJcbiAgICAgICAgZXh0ZW50WzFdID0gTW9kdWxlLkhFQVBGNjRbcHRyX2ZhciAvIDhdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX25lYXIpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZmFyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGV4dGVudDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9Qcm9qZWN0aW9uID0gSlNfU2hvd19DYW1lcmFfUHJvamVjdGlvbiA9XHJcbiAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcHRyX3Byb2ogPSBNb2R1bGUuX21hbGxvYyg2NCk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0NhbWVyYV9Qcm9qZWN0aW9uKHB0cl9wcm9qKTtcclxuXHJcbiAgICAgICAgbGV0IHByb2plY3Rpb24gPSBVVEY4VG9TdHJpbmcocHRyX3Byb2opO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Byb2opO1xyXG5cclxuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9Qcm9qZWN0aW9uX01hdHJpeCA9XHJcbiAgICAgIEpTX1Nob3dfQ2FtZXJhX1Byb2plY3Rpb25fTWF0cml4ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwdHJfbWF0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIDE2KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfQ2FtZXJhX1Byb2plY3Rpb25fTWF0cml4KHB0cl9tYXQpO1xyXG5cclxuICAgICAgICBsZXQgbWF0ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XHJcbiAgICAgICAgICBtYXRbaV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF0IC8gNCArIGldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9tYXQpO1xyXG5cclxuICAgICAgICByZXR1cm4gbWF0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2FtZXJhX1ZpZXdfTWF0cml4ID0gSlNfU2hvd19DYW1lcmFfVmlld19NYXRyaXggPVxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHB0cl9tYXQgPSBNb2R1bGUuX21hbGxvYyg0ICogMTYpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19DYW1lcmFfVmlld19NYXRyaXgocHRyX21hdCk7XHJcblxyXG4gICAgICAgIGxldCBtYXQgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcclxuICAgICAgICAgIG1hdFtpXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXQgLyA0ICsgaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX21hdCk7XHJcblxyXG4gICAgICAgIHJldHVybiBtYXQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19QYXRoX0NhbWVyYV9Qb3NpdGlvbiA9XHJcbiAgICAgIEpTX1Nob3dfUGF0aF9DYW1lcmFfUG9zaXRpb24gPSBmdW5jdGlvbiAocGF0aDogQXJyYXlMaWtlPG51bWJlcj4pIHtcclxuICAgICAgICBsZXQgcGNvdW50ID0gcGF0aC5sZW5ndGg7XHJcbiAgICAgICAgbGV0IHB0cl9wYXRoID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfcGF0aCAvIDQgKyBpXSA9IHBhdGhbaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfUGF0aF9DYW1lcmFfUG9zaXRpb24ocHRyX3BhdGgsIHBjb3VudCwgcHRyX3Bvcyk7XHJcblxyXG4gICAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG5cclxuICAgICAgICBwb3NbMF0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOF07XHJcbiAgICAgICAgcG9zWzFdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDggKyAxXTtcclxuICAgICAgICBwb3NbMl0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOCArIDJdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXRoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBvcztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1BhdGhfQ2FtZXJhX1RhcmdldCA9IEpTX1Nob3dfUGF0aF9DYW1lcmFfVGFyZ2V0ID1cclxuICAgICAgZnVuY3Rpb24gKHBhdGg6IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICAgICAgbGV0IHBjb3VudCA9IHBhdGgubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwdHJfcGF0aCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX3BhdGggLyA0ICsgaV0gPSBwYXRoW2ldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1BhdGhfQ2FtZXJhX1RhcmdldChwdHJfcGF0aCwgcGNvdW50LCBwdHJfcG9zKTtcclxuXHJcbiAgICAgICAgbGV0IHBvcyA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcblxyXG4gICAgICAgIHBvc1swXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4XTtcclxuICAgICAgICBwb3NbMV0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOCArIDFdO1xyXG4gICAgICAgIHBvc1syXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4ICsgMl07XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhdGgpO1xyXG5cclxuICAgICAgICByZXR1cm4gcG9zO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0RvbGx5X0NhbWVyYSA9IEpTX0RvbGx5X0NhbWVyYSA9IF9HU19Eb2xseV9DYW1lcmE7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfUm9sbF9DYW1lcmEgPSBKU19Sb2xsX0NhbWVyYSA9IGZ1bmN0aW9uIChcclxuICAgICAgc3RhcnQ6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBlbmQ6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9zdGFydCA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3N0YXJ0IC8gOF0gPSBzdGFydFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3N0YXJ0IC8gOCArIDFdID0gc3RhcnRbMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9zdGFydCAvIDggKyAyXSA9IHN0YXJ0WzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl9lbmQgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9lbmQgLyA4XSA9IGVuZFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX2VuZCAvIDggKyAxXSA9IGVuZFsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX2VuZCAvIDggKyAyXSA9IGVuZFsyXTtcclxuXHJcbiAgICAgIF9HU19Sb2xsX0NhbWVyYShwdHJfc3RhcnQsIHB0cl9lbmQpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zdGFydCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfZW5kKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfWm9vbV9DYW1lcmEgPSBKU19ab29tX0NhbWVyYSA9IF9HU19ab29tX0NhbWVyYTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9DYW1lcmEgPSBKU19VblNldF9DYW1lcmEgPSBfR1NfVW5TZXRfQ2FtZXJhO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9Db2xvciA9IEpTX1NldF9Db2xvciA9IGZ1bmN0aW9uIChvcHRpb25zOiBzdHJpbmcpIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgX0dTX1NldF9Db2xvcihwdHIpO1xyXG4gICAgICBfZnJlZShwdHIpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9Db2xvciA9IEpTX1VuU2V0X0NvbG9yID0gX0dTX1VuU2V0X0NvbG9yO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X09uZV9Db2xvciA9IEpTX1VuU2V0X09uZV9Db2xvciA9IGZ1bmN0aW9uIChcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBfR1NfVW5TZXRfT25lX0NvbG9yKHB0cl9uYW1lKTtcclxuICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbG9yID0gSlNfU2hvd19Db2xvciA9IGZ1bmN0aW9uICgpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcHRyX2NvbG9ycyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICBfR1NfU2hvd19Db2xvcihwdHJfY29sb3JzKTtcclxuXHJcbiAgICAgIGxldCBjb2xvciA9IFVURjhUb1N0cmluZyhwdHJfY29sb3JzKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfY29sb3JzKTtcclxuXHJcbiAgICAgIHJldHVybiBjb2xvcjtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfQ29sb3IgPSBKU19TaG93X09uZV9Db2xvciA9IGZ1bmN0aW9uIChcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcHRyX25hbWUgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCBwdHJfY29sb3JzID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgIGxldCBjb2xvciA9IG51bGw7XHJcbiAgICAgIGlmIChfR1NfU2hvd19PbmVfQ29sb3IocHRyX25hbWUsIHB0cl9jb2xvcnMpKSB7XHJcbiAgICAgICAgY29sb3IgPSBVVEY4VG9TdHJpbmcocHRyX2NvbG9ycyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfY29sb3JzKTtcclxuICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG5cclxuICAgICAgcmV0dXJuIGNvbG9yO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbG9yX0J5X1ZhbHVlID0gSlNfU2hvd19Db2xvcl9CeV9WYWx1ZSA9IGZ1bmN0aW9uIChcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICBsZXQgcHRyX25hbWUgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCBwdHJfdmFsdWVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIDQpO1xyXG5cclxuICAgICAgaWYgKF9HU19TaG93X0NvbG9yX0J5X1ZhbHVlKHB0cl9uYW1lLCBwdHJfdmFsdWVzKSkge1xyXG4gICAgICAgIGxldCB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xyXG5cclxuICAgICAgICB2YWx1ZXNbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWVzIC8gNF07XHJcbiAgICAgICAgdmFsdWVzWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlcyAvIDQgKyAxXTtcclxuICAgICAgICB2YWx1ZXNbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWVzIC8gNCArIDJdO1xyXG4gICAgICAgIHZhbHVlc1szXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZXMgLyA0ICsgM107XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdmFsdWVzKTtcclxuICAgICAgICBfZnJlZShwdHJfbmFtZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfR2VvbWV0cnlfQ29sb3IgPSBKU19TZXRfR2VvbWV0cnlfQ29sb3IgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG4gICAgICBfR1NfU2V0X0dlb21ldHJ5X0NvbG9yKGtleSwgcHRyKTtcclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlID1cclxuICAgICAgSlNfU2V0X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICAgIHR5cGU6IHN0cmluZyxcclxuICAgICAgICBvZmZzZXQ6IG51bWJlcixcclxuICAgICAgICB2YWx1ZTogQXJyYXlMaWtlPG51bWJlcj5cclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl90eXBlID0gYWxsb2NhdGVVVEY4KHR5cGUpO1xyXG4gICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyh2YWx1ZS5sZW5ndGggKiA0KTtcclxuXHJcbiAgICAgICAgbGV0IGxlbiA9IHZhbHVlLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgaV0gPSB2YWx1ZVtpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9HU19TZXRfR2VvbWV0cnlfQ29sb3JfQnlfVmFsdWUoXHJcbiAgICAgICAgICBrZXksXHJcbiAgICAgICAgICBwdHJfdHlwZSxcclxuICAgICAgICAgIG9mZnNldCxcclxuICAgICAgICAgIHZhbHVlLmxlbmd0aCAvIDQsXHJcbiAgICAgICAgICBwdHJfdmFsdWVcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuICAgICAgICBfZnJlZShwdHJfdHlwZSk7XHJcbiAgICAgIH07XHJcbiAgICAvLyAod2luZG93IGFzIGFueSkuSlNfU2hvd19HZW9tZXRyeV9Db2xvcl9UeXBlID0gSlNfU2hvd19HZW9tZXRyeV9Db2xvcl9UeXBlID0gZnVuY3Rpb24gKGtleTogbnVtYmVyLCB0eXBlOiBzdHJpbmcpIHtcclxuICAgIC8vICAgbGV0IHB0cl90eXBlID0gYWxsb2NhdGVVVEY4KHR5cGUpO1xyXG4gICAgLy8gICBsZXQgcHRyX2NvbG9yX3R5cGUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgIC8vICAgX0dTX1Nob3dfR2VvbWV0cnlfQ29sb3JfVHlwZShrZXksIHB0cl90eXBlLCBwdHJfY29sb3JfdHlwZSk7XHJcbiAgICAvLyAgIGxldCBjb2xvcl90eXBlID0gTW9kdWxlLkhFQVAzMltwdHJfY29sb3JfdHlwZSAvIDRdO1xyXG4gICAgLy8gICBfZnJlZShwdHJfdHlwZSk7XHJcblxyXG4gICAgLy8gICByZXR1cm4gY29sb3JfdHlwZTtcclxuICAgIC8vIH1cclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlID1cclxuICAgICAgSlNfU2hvd19HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlcixcclxuICAgICAgICB0eXBlOiBzdHJpbmcsXHJcbiAgICAgICAgb2Zmc2V0OiBudW1iZXJcclxuICAgICAgKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xyXG4gICAgICAgIGxldCBwY291bnQgPSAwO1xyXG4gICAgICAgIGxldCBrZXlfdHlwZSA9IEpTX1Nob3dfS2V5X1R5cGUoa2V5KTtcclxuICAgICAgICBpZiAoa2V5X3R5cGUgPT0gMTAzIHx8IGtleV90eXBlID09IDEwNykge1xyXG4gICAgICAgICAgbGV0IHNoZWxsX3NpemUgPSBKU19TaG93X1NoZWxsX1NpemUoa2V5KTtcclxuICAgICAgICAgIHBjb3VudCA9IHNoZWxsX3NpemUucG9zO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5X3R5cGUgPT0gMTA0KSB7XHJcbiAgICAgICAgICBsZXQgbWVzaF9zaXplID0gSlNfU2hvd19NZXNoX1NpemUoa2V5KTtcclxuICAgICAgICAgIHBjb3VudCA9IG1lc2hfc2l6ZS5yb3cgKiBtZXNoX3NpemUuY29sO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHB0cl90eXBlID0gYWxsb2NhdGVVVEY4KHR5cGUpO1xyXG4gICAgICAgIGxldCBwdHJfY29sb3JfdHlwZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X0dlb21ldHJ5X0NvbG9yX1R5cGUoa2V5LCBwdHJfdHlwZSwgcHRyX2NvbG9yX3R5cGUpO1xyXG4gICAgICAgIGxldCBjb2xvcl90eXBlID0gTW9kdWxlLkhFQVAzMltwdHJfY29sb3JfdHlwZSAvIDRdO1xyXG5cclxuICAgICAgICBpZiAocGNvdW50ID4gMCAmJiBjb2xvcl90eXBlID4gMCkge1xyXG4gICAgICAgICAgaWYgKGNvbG9yX3R5cGUgPT0gMSkge1xyXG4gICAgICAgICAgICBwY291bnQgPSAxO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyhwY291bnQgKiA0KTtcclxuXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIF9HU19TaG93X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlKFxyXG4gICAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgICBwdHJfdHlwZSxcclxuICAgICAgICAgICAgICBvZmZzZXQsXHJcbiAgICAgICAgICAgICAgcGNvdW50LFxyXG4gICAgICAgICAgICAgIHB0cl92YWx1ZVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgbGV0IGxlbiA9IHBjb3VudCAqIDQ7XHJcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgdmFsdWVbaV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfY29sb3JfdHlwZSk7XHJcbiAgICAgICAgX2ZyZWUocHRyX3R5cGUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfR2VvbWV0cnlfQ29sb3IgPSBKU19VblNldF9HZW9tZXRyeV9Db2xvciA9XHJcbiAgICAgIGZ1bmN0aW9uIChrZXk6IG51bWJlciwgdHlwZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHB0cl90eXBlID0gYWxsb2NhdGVVVEY4KHR5cGUpO1xyXG5cclxuICAgICAgICBfR1NfVW5TZXRfR2VvbWV0cnlfQ29sb3Ioa2V5LCBwdHJfdHlwZSk7XHJcblxyXG4gICAgICAgIF9mcmVlKHB0cl90eXBlKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfVmlzaWJpbGl0eSA9IEpTX1NldF9WaXNpYmlsaXR5ID0gZnVuY3Rpb24gKFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG4gICAgICBfR1NfU2V0X1Zpc2liaWxpdHkocHRyKTtcclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfVmlzaWJpbGl0eSA9IEpTX1VuU2V0X1Zpc2liaWxpdHkgPVxyXG4gICAgICBfR1NfVW5TZXRfVmlzaWJpbGl0eTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9PbmVfVmlzaWJpbGl0eSA9IEpTX1VuU2V0X09uZV9WaXNpYmlsaXR5ID1cclxuICAgICAgZnVuY3Rpb24gKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgICAgX0dTX1VuU2V0X09uZV9WaXNpYmlsaXR5KHB0cik7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Zpc2liaWxpdHkgPSBKU19TaG93X1Zpc2liaWxpdHkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGxldCBwdHJfdmkgPSBNb2R1bGUuX21hbGxvYyg1MTIpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfVmlzaWJpbGl0eShwdHJfdmkpO1xyXG5cclxuICAgICAgbGV0IHZpID0gVVRGOFRvU3RyaW5nKHB0cl92aSk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZpKTtcclxuXHJcbiAgICAgIHJldHVybiB2aTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfVmlzaWJpbGl0eSA9IEpTX1Nob3dfT25lX1Zpc2liaWxpdHkgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfbmFtZSA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgbGV0IHB0cl92aSA9IE1vZHVsZS5fbWFsbG9jKDY0KTtcclxuXHJcbiAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBfR1NfU2hvd19PbmVfVmlzaWJpbGl0eShwdHJfbmFtZSwgcHRyX3ZpKTtcclxuXHJcbiAgICAgIGxldCB2aSA9IG51bGw7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICB2aSA9IFVURjhUb1N0cmluZyhwdHJfdmkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBfZnJlZShwdHJfbmFtZSk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdmkpO1xyXG5cclxuICAgICAgcmV0dXJuIHZpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfU2VsZWN0YWJpbGl0eSA9IEpTX1NldF9TZWxlY3RhYmlsaXR5ID0gZnVuY3Rpb24gKFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG4gICAgICBfR1NfU2V0X1NlbGVjdGFiaWxpdHkocHRyKTtcclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfU2VsZWN0YWJpbGl0eSA9IEpTX1VuU2V0X1NlbGVjdGFiaWxpdHkgPVxyXG4gICAgICBfR1NfVW5TZXRfU2VsZWN0YWJpbGl0eTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9PbmVfU2VsZWN0YWJpbGl0eSA9IEpTX1VuU2V0X09uZV9TZWxlY3RhYmlsaXR5ID1cclxuICAgICAgZnVuY3Rpb24gKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgICAgX0dTX1VuU2V0X09uZV9TZWxlY3RhYmlsaXR5KHB0cik7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NlbGVjdGFiaWxpdHkgPSBKU19TaG93X1NlbGVjdGFiaWxpdHkgPVxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHB0cl9zZSA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1NlbGVjdGFiaWxpdHkocHRyX3NlKTtcclxuXHJcbiAgICAgICAgbGV0IHNlID0gVVRGOFRvU3RyaW5nKHB0cl9zZSk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfc2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gc2U7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfU2VsZWN0YWJpbGl0eSA9IEpTX1Nob3dfT25lX1NlbGVjdGFiaWxpdHkgPVxyXG4gICAgICBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICAgIGxldCBwdHJfc2UgPSBNb2R1bGUuX21hbGxvYyg2NCk7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBfR1NfU2hvd19PbmVfU2VsZWN0YWJpbGl0eShwdHJfbmFtZSwgcHRyX3NlKTtcclxuXHJcbiAgICAgICAgbGV0IHNlID0gbnVsbDtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICBzZSA9IFVURjhUb1N0cmluZyhwdHJfc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfc2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gc2U7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X01vZGVsbGluZ01hdHJpeCA9IEpTX1NldF9Nb2RlbGxpbmdNYXRyaXggPSBmdW5jdGlvbiAoXHJcbiAgICAgIG1tOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfbW0gPSBNb2R1bGUuX21hbGxvYyg0ICogMTYpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfbW0gLyA0ICsgaV0gPSBtbVtpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgX0dTX1NldF9Nb2RlbGxpbmdNYXRyaXgocHRyX21tKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfbW0pO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19BcHBlbmRfTW9kZWxsaW5nTWF0cml4ID0gSlNfQXBwZW5kX01vZGVsbGluZ01hdHJpeCA9XHJcbiAgICAgIGZ1bmN0aW9uIChtbTogQXJyYXlMaWtlPG51bWJlcj4pIHtcclxuICAgICAgICBsZXQgcHRyX21tID0gTW9kdWxlLl9tYWxsb2MoNCAqIDE2KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9tbSAvIDQgKyBpXSA9IG1tW2ldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX0dTX0FwcGVuZF9Nb2RlbGxpbmdNYXRyaXgocHRyX21tKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9tbSk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Nb2RlbGxpbmdNYXRyaXggPSBKU19TaG93X01vZGVsbGluZ01hdHJpeCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICAgIGxldCBwdHJfbW0gPSBNb2R1bGUuX21hbGxvYyg0ICogMTYpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19Nb2RlbGxpbmdNYXRyaXgocHRyX21tKTtcclxuXHJcbiAgICAgICAgbGV0IG1tID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XHJcbiAgICAgICAgICBtbVtpXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tbSAvIDQgKyBpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbW0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbW07XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19QYXRoX01vZGVsbGluZ01hdHJpeCA9XHJcbiAgICAgIEpTX1Nob3dfUGF0aF9Nb2RlbGxpbmdNYXRyaXggPSBmdW5jdGlvbiAocGF0aDogSW50MzJBcnJheSk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHBjb3VudCA9IHBhdGgubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwdHJfcGF0aCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICAvLyAgIE1vZHVsZS5IRUFQMzJbcHRyX3BhdGggLyA0ICsgaV0gPSBwYXRoW2ldO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChwYXRoLCBwdHJfcGF0aCAvIDQpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX21tID0gTW9kdWxlLl9tYWxsb2MoNCAqIDE2KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfUGF0aF9Nb2RlbGxpbmdNYXRyaXgocHRyX3BhdGgsIHBjb3VudCwgcHRyX21tKTtcclxuXHJcbiAgICAgICAgbGV0IG1tID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XHJcbiAgICAgICAgICBtbVtpXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tbSAvIDQgKyBpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGF0aCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9tbSk7XHJcblxyXG4gICAgICAgIHJldHVybiBtbTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9Nb2RlbGxpbmdNYXRyaXggPSBKU19VblNldF9Nb2RlbGxpbmdNYXRyaXggPVxyXG4gICAgICBfR1NfVW5TZXRfTW9kZWxsaW5nTWF0cml4O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9SZW5kZXJpbmdfT3B0aW9ucyA9IEpTX1NldF9SZW5kZXJpbmdfT3B0aW9ucyA9XHJcbiAgICAgIGZ1bmN0aW9uIChvcHRpb25zOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG4gICAgICAgIF9HU19TZXRfUmVuZGVyaW5nX09wdGlvbnMocHRyKTtcclxuICAgICAgICBfZnJlZShwdHIpO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X1JlbmRlcmluZ19PcHRpb25zID0gSlNfVW5TZXRfUmVuZGVyaW5nX09wdGlvbnMgPVxyXG4gICAgICBfR1NfVW5TZXRfUmVuZGVyaW5nX09wdGlvbnM7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfT25lX1JlbmRlcmluZ19PcHRpb24gPVxyXG4gICAgICBKU19VblNldF9PbmVfUmVuZGVyaW5nX09wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb246IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgob3B0aW9uKTtcclxuICAgICAgICBfR1NfVW5TZXRfT25lX1JlbmRlcmluZ19PcHRpb24ocHRyKTtcclxuICAgICAgICBfZnJlZShwdHIpO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUmVuZGVyaW5nX09wdGlvbnMgPSBKU19TaG93X1JlbmRlcmluZ19PcHRpb25zID1cclxuICAgICAgZnVuY3Rpb24gKCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHB0cl9ybyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1JlbmRlcmluZ19PcHRpb25zKHB0cl9ybyk7XHJcblxyXG4gICAgICAgIGxldCBybyA9IFVURjhUb1N0cmluZyhwdHJfcm8pO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3JvKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJvO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX1JlbmRlcmluZ19PcHRpb24gPVxyXG4gICAgICBKU19TaG93X09uZV9SZW5kZXJpbmdfT3B0aW9uID0gZnVuY3Rpb24gKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgICBsZXQgcHRyX3JvID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfT25lX1JlbmRlcmluZ19PcHRpb24ocHRyLCBwdHJfcm8pO1xyXG5cclxuICAgICAgICBsZXQgcm8gPSBVVEY4VG9TdHJpbmcocHRyX3JvKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ybyk7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJvO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX0RlZmF1bHRfUmVuZGVyaW5nX09wdGlvbiA9XHJcbiAgICAgIEpTX1Nob3dfT25lX0RlZmF1bHRfUmVuZGVyaW5nX09wdGlvbiA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgICAgbGV0IHB0cl9ybyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X09uZV9EZWZhdWx0X1JlbmRlcmluZ19PcHRpb24ocHRyLCBwdHJfcm8pO1xyXG5cclxuICAgICAgICBsZXQgcm8gPSBVVEY4VG9TdHJpbmcocHRyX3JvKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ybyk7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJvO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX1BhdGhfUmVuZGVyaW5nX09wdGlvbiA9XHJcbiAgICAgIEpTX1Nob3dfT25lX1BhdGhfUmVuZGVyaW5nX09wdGlvbiA9IGZ1bmN0aW9uIChcclxuICAgICAgICBwYXRoOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgICBuYW1lOiBzdHJpbmdcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHBjb3VudCA9IHBhdGgubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwdHJfcGF0aCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX3BhdGggLyA0ICsgaV0gPSBwYXRoW2ldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgICBsZXQgcHRyX3JvID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfT25lX1BhdGhfUmVuZGVyaW5nX09wdGlvbihwdHJfcGF0aCwgcGNvdW50LCBwdHIsIHB0cl9ybyk7XHJcblxyXG4gICAgICAgIGxldCBybyA9IFVURjhUb1N0cmluZyhwdHJfcm8pO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhdGgpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcm8pO1xyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIHJldHVybiBybztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfSGV1cmlzdGljX09wdGlvbnMgPSBKU19TZXRfSGV1cmlzdGljX09wdGlvbnMgPVxyXG4gICAgICBmdW5jdGlvbiAob3B0aW9uczogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgICBfR1NfU2V0X0hldXJpc3RpY19PcHRpb25zKHB0cik7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfT25lX0hldXJpc3RpY19PcHRpb24gPSBKU19TZXRfT25lX0hldXJpc3RpY19PcHRpb24gPVxyXG4gICAgICBmdW5jdGlvbiAobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICAgIGxldCBwdHJfdmFsdWUgPSBhbGxvY2F0ZVVURjgodmFsdWUpO1xyXG4gICAgICAgIF9HU19TZXRfT25lX0hldXJpc3RpY19PcHRpb24ocHRyX25hbWUsIHB0cl92YWx1ZSk7XHJcbiAgICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG4gICAgICAgIF9mcmVlKHB0cl92YWx1ZSk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfT25lX0hldXJpc3RpY19PcHRpb24gPVxyXG4gICAgICBKU19VblNldF9PbmVfSGV1cmlzdGljX09wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb246IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgob3B0aW9uKTtcclxuICAgICAgICBfR1NfVW5TZXRfT25lX0hldXJpc3RpY19PcHRpb24ocHRyKTtcclxuICAgICAgICBfZnJlZShwdHIpO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X0hldXJpc3RpY19PcHRpb25zID0gSlNfVW5TZXRfSGV1cmlzdGljX09wdGlvbnMgPVxyXG4gICAgICBfR1NfVW5TZXRfSGV1cmlzdGljX09wdGlvbnM7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19IZXVyaXN0aWNfT3B0aW9ucyA9IEpTX1Nob3dfSGV1cmlzdGljX09wdGlvbnMgPVxyXG4gICAgICBmdW5jdGlvbiAob3B0aW9uczogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcHRyX2hvID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfSGV1cmlzdGljX09wdGlvbnMocHRyX2hvKTtcclxuXHJcbiAgICAgICAgbGV0IGhvID0gVVRGOFRvU3RyaW5nKHB0cl9obyk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaG8pO1xyXG5cclxuICAgICAgICByZXR1cm4gaG87XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfSGV1cmlzdGljX09wdGlvbiA9XHJcbiAgICAgIEpTX1Nob3dfT25lX0hldXJpc3RpY19PcHRpb24gPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICAgIGxldCBwdHJfaG8gPSBNb2R1bGUuX21hbGxvYyg1MTIpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19PbmVfSGV1cmlzdGljX09wdGlvbihwdHIsIHB0cl9obyk7XHJcblxyXG4gICAgICAgIGxldCBobyA9IFVURjhUb1N0cmluZyhwdHJfaG8pO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2hvKTtcclxuICAgICAgICBfZnJlZShwdHIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaG87XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0NvbmRpdGlvbiA9IEpTX1NldF9Db25kaXRpb24gPSBmdW5jdGlvbiAoXHJcbiAgICAgIGNvbmRpdGlvbjogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChjb25kaXRpb24pO1xyXG4gICAgICBfR1NfU2V0X0NvbmRpdGlvbihwdHIpO1xyXG4gICAgICBfZnJlZShwdHIpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbmRpdGlvbiA9IEpTX1Nob3dfQ29uZGl0aW9uID1cclxuICAgICAgZnVuY3Rpb24gKCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGNvbmRpdGlvbiA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmIChfR1NfQXR0cmlidXRlX0V4aXN0cyhPYmplY3RUeXBlLlRZUEVfQ29uZGl0aW9uIGFzIG51bWJlcikpIHtcclxuICAgICAgICAgIGxldCBwdHJfY29uZGl0aW9uID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgICAgICBfR1NfU2hvd19Db25kaXRpb24ocHRyX2NvbmRpdGlvbik7XHJcblxyXG4gICAgICAgICAgY29uZGl0aW9uID0gVVRGOFRvU3RyaW5nKHB0cl9jb25kaXRpb24pO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfY29uZGl0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjb25kaXRpb247XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfQ29uZGl0aW9uID0gSlNfVW5TZXRfQ29uZGl0aW9uID1cclxuICAgICAgX0dTX1VuU2V0X0NvbmRpdGlvbjtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfVGV4dF9Gb250ID0gSlNfU2V0X1RleHRfRm9udCA9IGZ1bmN0aW9uIChcclxuICAgICAgZm9udHM6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgoZm9udHMpO1xyXG4gICAgICBfR1NfU2V0X1RleHRfRm9udChwdHIpO1xyXG4gICAgICBfZnJlZShwdHIpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9UZXh0X0ZvbnQgPSBKU19VblNldF9UZXh0X0ZvbnQgPVxyXG4gICAgICBfR1NfVW5TZXRfVGV4dF9Gb250O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X09uZV9UZXh0X0ZvbnQgPSBKU19VblNldF9PbmVfVGV4dF9Gb250ID0gZnVuY3Rpb24gKFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBfR1NfVW5TZXRfT25lX1RleHRfRm9udChwdHIpO1xyXG4gICAgICBfZnJlZShwdHIpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1RleHRfRm9udCA9IEpTX1Nob3dfVGV4dF9Gb250ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBsZXQgcHRyX2ZvbnRzID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgIF9HU19TaG93X1RleHRfRm9udChwdHJfZm9udHMpO1xyXG5cclxuICAgICAgbGV0IGZvbnRzID0gVVRGOFRvU3RyaW5nKHB0cl9mb250cyk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2ZvbnRzKTtcclxuXHJcbiAgICAgIHJldHVybiBmb250cztcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfVGV4dF9Gb250ID0gSlNfU2hvd19PbmVfVGV4dF9Gb250ID0gZnVuY3Rpb24gKFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX25hbWUgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCBwdHJfZm9udHMgPSBNb2R1bGUuX21hbGxvYyg1MTIpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfT25lX1RleHRfRm9udChwdHJfbmFtZSwgcHRyX2ZvbnRzKTtcclxuXHJcbiAgICAgIGxldCBmb250cyA9IFVURjhUb1N0cmluZyhwdHJfZm9udHMpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9mb250cyk7XHJcbiAgICAgIF9mcmVlKHB0cl9uYW1lKTtcclxuXHJcbiAgICAgIHJldHVybiBmb250cztcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXR0cmlidXRlX0V4aXN0cyA9IEpTX0F0dHJpYnV0ZV9FeGlzdHMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHR5cGU6IE9iamVjdFR5cGVcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gX0dTX0F0dHJpYnV0ZV9FeGlzdHModHlwZSBhcyBudW1iZXIpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbWFnZV9FeGlzdHMgPSBKU19JbWFnZV9FeGlzdHMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBfR1NfSW1hZ2VfRXhpc3RzKHB0cik7XHJcbiAgICAgIF9mcmVlKHB0cik7XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19SZXNpemVfQnlfS2V5ID0gSlNfUmVzaXplX0J5X0tleSA9IF9HU19SZXNpemVfQnlfS2V5O1xyXG5cclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfTWFya2VyID0gSlNfSW5zZXJ0X01hcmtlciA9IF9HU19JbnNlcnRfTWFya2VyO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfTWFya2VyID0gSlNfRWRpdF9NYXJrZXIgPSBfR1NfRWRpdF9NYXJrZXI7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19NYXJrZXIgPSBKU19TaG93X01hcmtlciA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIGxldCBwdHJfeCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX3kgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl96ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19NYXJrZXIoa2V5LCBwdHJfeCwgcHRyX3ksIHB0cl96KTtcclxuXHJcbiAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICBwb3NbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfeCAvIDRdO1xyXG4gICAgICBwb3NbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfeSAvIDRdO1xyXG4gICAgICBwb3NbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfeiAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl94KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl95KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl96KTtcclxuXHJcbiAgICAgIHJldHVybiBwb3M7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9Qb2ludF9DbG91ZCA9IEpTX0luc2VydF9Qb2ludF9DbG91ZCA9IGZ1bmN0aW9uIChcclxuICAgICAgcG9pbnRzOiBGbG9hdDMyQXJyYXlcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwb2ludHMubGVuZ3RoKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzIuc2V0KHBvaW50cywgcHRyX3BvaW50cyAvIDQpO1xyXG5cclxuICAgICAgbGV0IGtleSA9IF9HU19JbnNlcnRfUG9pbnRfQ2xvdWQocHRyX3BvaW50cywgcG9pbnRzLmxlbmd0aCAvIDMpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2ludHMpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRWRpdF9Qb2ludF9DbG91ZCA9IEpTX0VkaXRfUG9pbnRfQ2xvdWQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBwb2ludHM6IEZsb2F0MzJBcnJheVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvaW50cy5sZW5ndGgpO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMi5zZXQocG9pbnRzLCBwdHJfcG9pbnRzIC8gNCk7XHJcblxyXG4gICAgICBfR1NfRWRpdF9Qb2ludF9DbG91ZChrZXksIHB0cl9wb2ludHMsIHBvaW50cy5sZW5ndGggLyAzKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9pbnRzKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUG9pbnRfQ2xvdWQgPSBKU19TaG93X1BvaW50X0Nsb3VkID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgX0dTX1Nob3dfUG9pbnRfQ2xvdWRfQ291bnQoa2V5LCBwdHJfY291bnQpO1xyXG4gICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgbGV0IHB0cl9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg0ICogY291bnQgKiAzKTtcclxuXHJcbiAgICAgIF9HU19TaG93X1BvaW50X0Nsb3VkKGtleSwgcHRyX3BvaW50cywgcHRyX2NvdW50KTtcclxuXHJcbiAgICAgIGxldCByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMyk7XHJcblxyXG4gICAgICByZXN1bHQuc2V0KFxyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyLnN1YmFycmF5KHB0cl9wb2ludHMgLyA0LCBwdHJfcG9pbnRzIC8gNCArIGNvdW50ICogMylcclxuICAgICAgKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9pbnRzKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb3VudCk7XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfTGluZSA9IEpTX0luc2VydF9MaW5lID0gX0dTX0luc2VydF9MaW5lO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfTGluZSA9IEpTX0VkaXRfTGluZSA9IF9HU19FZGl0X0xpbmU7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19MaW5lID0gSlNfU2hvd19MaW5lID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgbGV0IHB0cl94MSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX3kxID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfejEgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl94MiA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX3kyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfejIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0xpbmUoa2V5LCBwdHJfeDEsIHB0cl95MSwgcHRyX3oxLCBwdHJfeDIsIHB0cl95MiwgcHRyX3oyKTtcclxuXHJcbiAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQzMkFycmF5KDYpO1xyXG4gICAgICBwb3NbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfeDEgLyA0XTtcclxuICAgICAgcG9zWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3kxIC8gNF07XHJcbiAgICAgIHBvc1syXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl96MSAvIDRdO1xyXG4gICAgICBwb3NbM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfeDIgLyA0XTtcclxuICAgICAgcG9zWzRdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3kyIC8gNF07XHJcbiAgICAgIHBvc1s1XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl96MiAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl94MSk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeTEpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3oxKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl94Mik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeTIpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3oyKTtcclxuXHJcbiAgICAgIHJldHVybiBwb3M7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9Qb2x5bGluZSA9IEpTX0luc2VydF9Qb2x5bGluZSA9IGZ1bmN0aW9uIChcclxuICAgICAgcG9pbnRzOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBudW0gPSBwb2ludHMubGVuZ3RoO1xyXG4gICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBudW0pO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXSA9IHBvaW50c1tpXTtcclxuICAgICAgfVxyXG4gICAgICBsZXQga2V5ID0gX0dTX0luc2VydF9Qb2x5bGluZShwdHJfcG9zLCBudW0gLyAzKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qb2x5bGluZV9Db3VudCA9IEpTX1Nob3dfUG9seWxpbmVfQ291bnQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBudW1iZXIge1xyXG4gICAgICBsZXQgcHRyX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19Qb2x5bGluZV9Db3VudChrZXksIHB0cl9jb3VudCk7XHJcblxyXG4gICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb3VudCk7XHJcblxyXG4gICAgICByZXR1cm4gY291bnQ7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUG9seWxpbmUgPSBKU19TaG93X1BvbHlsaW5lID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBfR1NfU2hvd19Qb2x5bGluZV9Db3VudChrZXksIHB0cl9jb3VudCk7XHJcbiAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNF07XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfY291bnQpO1xyXG5cclxuICAgICAgbGV0IGxlbiA9IGNvdW50ICogMztcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogbGVuKTtcclxuXHJcbiAgICAgIF9HU19TaG93X1BvbHlsaW5lKGtleSwgY291bnQsIHB0cl9wb3MpO1xyXG5cclxuICAgICAgbGV0IHBvcyA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIHBvc1tpXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuXHJcbiAgICAgIHJldHVybiBwb3M7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9DaXJjbGUgPSBKU19JbnNlcnRfQ2lyY2xlID0gZnVuY3Rpb24gKFxyXG4gICAgICBjZW50ZXI6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICByYWRpdXM6IG51bWJlcixcclxuICAgICAgbm9ybWFsOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfY2VudGVyID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfY2VudGVyIC8gNF0gPSBjZW50ZXJbMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9jZW50ZXIgLyA0ICsgMV0gPSBjZW50ZXJbMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9jZW50ZXIgLyA0ICsgMl0gPSBjZW50ZXJbMl07XHJcblxyXG4gICAgICBsZXQgcHRyX25vcm1hbCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDRdID0gbm9ybWFsWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFsIC8gNCArIDFdID0gbm9ybWFsWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFsIC8gNCArIDJdID0gbm9ybWFsWzJdO1xyXG5cclxuICAgICAgbGV0IGtleSA9IF9HU19JbnNlcnRfQ2lyY2xlKHB0cl9jZW50ZXIsIHJhZGl1cywgcHRyX25vcm1hbCk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2NlbnRlcik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfbm9ybWFsKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2lyY2xlID0gSlNfU2hvd19DaXJjbGUgPSBmdW5jdGlvbiAoa2V5OiBudW1iZXIpIHtcclxuICAgICAgbGV0IHB0cl9jZW50ZXIgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIGxldCBwdHJfbm9ybWFsID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICBsZXQgcHRyX3JhZGl1cyA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfQ2lyY2xlKGtleSwgcHRyX2NlbnRlciwgcHRyX3JhZGl1cywgcHRyX25vcm1hbCk7XHJcblxyXG4gICAgICBsZXQgY2VudGVyID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgY2VudGVyWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX2NlbnRlciAvIDRdO1xyXG4gICAgICBjZW50ZXJbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfY2VudGVyIC8gNCArIDFdO1xyXG4gICAgICBjZW50ZXJbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfY2VudGVyIC8gNCArIDJdO1xyXG5cclxuICAgICAgbGV0IG5vcm1hbCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICAgIG5vcm1hbFswXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWwgLyA0XTtcclxuICAgICAgbm9ybWFsWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDQgKyAxXTtcclxuICAgICAgbm9ybWFsWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDQgKyAyXTtcclxuXHJcbiAgICAgIGxldCByYWRpdXMgPSBNb2R1bGUuSEVBUEYzMltwdHJfcmFkaXVzIC8gNF07XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2NlbnRlcik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfbm9ybWFsKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yYWRpdXMpO1xyXG5cclxuICAgICAgcmV0dXJuIHsgY2VudGVyLCByYWRpdXMsIG5vcm1hbCB9O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfQ3lsaW5kZXIgPSBKU19JbnNlcnRfQ3lsaW5kZXIgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHN0YXJ0OiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgZW5kOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgcmFkaXVzOiBudW1iZXIsXHJcbiAgICAgIGNhcDogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9zdGFydCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3N0YXJ0IC8gNF0gPSBzdGFydFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3N0YXJ0IC8gNCArIDFdID0gc3RhcnRbMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9zdGFydCAvIDQgKyAyXSA9IHN0YXJ0WzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl9lbmQgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9lbmQgLyA0XSA9IGVuZFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2VuZCAvIDQgKyAxXSA9IGVuZFsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2VuZCAvIDQgKyAyXSA9IGVuZFsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfY2FwID0gYWxsb2NhdGVVVEY4KGNhcCk7XHJcblxyXG4gICAgICBsZXQga2V5ID0gX0dTX0luc2VydF9DeWxpbmRlcihwdHJfc3RhcnQsIHB0cl9lbmQsIHJhZGl1cywgcHRyX2NhcCk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3N0YXJ0KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9lbmQpO1xyXG4gICAgICBfZnJlZShwdHJfY2FwKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ3lsaW5kZXIgPSBKU19TaG93X0N5bGluZGVyID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfc3RhcnQgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIGxldCBwdHJfZW5kID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICBsZXQgcHRyX3JhZGl1cyA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgbGV0IHB0cl9jYXAgPSBNb2R1bGUuX21hbGxvYygxNik7XHJcblxyXG4gICAgICBfR1NfU2hvd19DeWxpbmRlcihrZXksIHB0cl9zdGFydCwgcHRyX2VuZCwgcHRyX3JhZGl1cywgcHRyX2NhcCk7XHJcblxyXG4gICAgICBsZXQgc3RhcnQgPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICBzdGFydFswXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9zdGFydCAvIDRdO1xyXG4gICAgICBzdGFydFsxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9zdGFydCAvIDQgKyAxXTtcclxuICAgICAgc3RhcnRbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfc3RhcnQgLyA0ICsgMl07XHJcblxyXG4gICAgICBsZXQgZW5kID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgZW5kWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX2VuZCAvIDRdO1xyXG4gICAgICBlbmRbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfZW5kIC8gNCArIDFdO1xyXG4gICAgICBlbmRbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfZW5kIC8gNCArIDJdO1xyXG5cclxuICAgICAgbGV0IHJhZGl1cyA9IE1vZHVsZS5IRUFQRjMyW3B0cl9yYWRpdXMgLyA0XTtcclxuXHJcbiAgICAgIGxldCBjYXAgPSBVVEY4VG9TdHJpbmcocHRyX2NhcCk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3N0YXJ0KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9lbmQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3JhZGl1cyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfY2FwKTtcclxuXHJcbiAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQsIHJhZGl1cywgY2FwIH07XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9Qb2x5Q3lsaW5kZXIgPSBKU19JbnNlcnRfUG9seUN5bGluZGVyID0gZnVuY3Rpb24gKFxyXG4gICAgICBwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICByYWRpaTogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIGNhcDogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXSA9IHBvaW50c1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHB0cl9yYWQgPSBNb2R1bGUuX21hbGxvYyg0ICogcmFkaWkubGVuZ3RoKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYWRpaS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9yYWQgLyA0ICsgaV0gPSByYWRpaVtpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHB0cl9jYXAgPSBhbGxvY2F0ZVVURjgoY2FwKTtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBfR1NfSW5zZXJ0X1BvbHlDeWxpbmRlcihcclxuICAgICAgICBwdHJfcG9zLFxyXG4gICAgICAgIHB0cl9yYWQsXHJcbiAgICAgICAgcmFkaWkubGVuZ3RoLFxyXG4gICAgICAgIHB0cl9jYXBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yYWQpO1xyXG4gICAgICBfZnJlZShwdHJfY2FwKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfUG9seUN5bGluZGVyID0gSlNfRWRpdF9Qb2x5Q3lsaW5kZXIgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICByYWRpaTogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIGNhcDogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXSA9IHBvaW50c1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHB0cl9yYWQgPSBNb2R1bGUuX21hbGxvYyg0ICogcmFkaWkubGVuZ3RoKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYWRpaS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9yYWQgLyA0ICsgaV0gPSByYWRpaVtpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHB0cl9jYXAgPSBhbGxvY2F0ZVVURjgoY2FwKTtcclxuXHJcbiAgICAgIF9HU19FZGl0X1BvbHlDeWxpbmRlcihrZXksIHB0cl9wb3MsIHB0cl9yYWQsIHJhZGlpLmxlbmd0aCwgcHRyX2NhcCk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmFkKTtcclxuICAgICAgX2ZyZWUocHRyX2NhcCk7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfU2hlbGwgPSBKU19JbnNlcnRfU2hlbGwgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHBvaW50czogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIGluZGV4ZXM6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICApIHtcclxuICAgICAgbGV0IHBjb3VudCA9IHBvaW50cy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGldID0gcG9pbnRzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaWNvdW50ID0gaW5kZXhlcy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfaW5kID0gTW9kdWxlLl9tYWxsb2MoNCAqIGljb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl9pbmQgLyA0ICsgaV0gPSBpbmRleGVzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQga2V5ID0gX0dTX0luc2VydF9TaGVsbChwdHJfcG9zLCBwY291bnQgLyAzLCBwdHJfaW5kLCBpY291bnQpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2luZCk7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19FZGl0X1NoZWxsID0gSlNfRWRpdF9TaGVsbCA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgIHBvaW50czogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIGluZGV4ZXM6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICApIHtcclxuICAgICAgbGV0IHBjb3VudCA9IHBvaW50cy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGldID0gcG9pbnRzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaWNvdW50ID0gaW5kZXhlcy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfaW5kID0gTW9kdWxlLl9tYWxsb2MoNCAqIGljb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl9pbmQgLyA0ICsgaV0gPSBpbmRleGVzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBfR1NfRWRpdF9TaGVsbChrZXksIHB0cl9wb3MsIHBjb3VudCAvIDMsIHB0cl9pbmQsIGljb3VudCk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW5kKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X1RyaWFuZ3VsYXJfU2hlbGwgPSBKU19JbnNlcnRfVHJpYW5ndWxhcl9TaGVsbCA9XHJcbiAgICAgIGZ1bmN0aW9uIChwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+LCBpbmRleGVzOiBBcnJheUxpa2U8bnVtYmVyPikge1xyXG4gICAgICAgIGxldCBwY291bnQgPSBwb2ludHMubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXSA9IHBvaW50c1tpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpY291bnQgPSBpbmRleGVzLmxlbmd0aDtcclxuICAgICAgICBsZXQgcHRyX2luZCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBpY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWNvdW50OyBpKyspIHtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX2luZCAvIDQgKyBpXSA9IGluZGV4ZXNbaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQga2V5ID0gX0dTX0luc2VydF9Ucmlhbmd1bGFyX1NoZWxsKFxyXG4gICAgICAgICAgcHRyX3BvcyxcclxuICAgICAgICAgIHBjb3VudCAvIDMsXHJcbiAgICAgICAgICBwdHJfaW5kLFxyXG4gICAgICAgICAgaWNvdW50XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW5kKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NoZWxsX1NpemUgPSBKU19TaG93X1NoZWxsX1NpemUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBhbnkge1xyXG4gICAgICBsZXQgcHRyX3Bvc19jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX2ZhY2VfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X1NoZWxsX1NpemUoa2V5LCBwdHJfcG9zX2NvdW50LCBwdHJfZmFjZV9jb3VudCk7XHJcblxyXG4gICAgICBsZXQgcG9zX2NvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfcG9zX2NvdW50IC8gNF07XHJcbiAgICAgIGxldCBmYWNlX2NvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfZmFjZV9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3NfY291bnQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2ZhY2VfY291bnQpO1xyXG5cclxuICAgICAgcmV0dXJuIHsgcG9zOiBwb3NfY291bnQsIGZhY2U6IGZhY2VfY291bnQgfTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TaGVsbCA9IEpTX1Nob3dfU2hlbGwgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBhbnkge1xyXG4gICAgICBsZXQgcHRyX3Bvc19jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX2ZhY2VfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X1NoZWxsX1NpemUoa2V5LCBwdHJfcG9zX2NvdW50LCBwdHJfZmFjZV9jb3VudCk7XHJcblxyXG4gICAgICBsZXQgcG9zX2NvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfcG9zX2NvdW50IC8gNF07XHJcbiAgICAgIGxldCBmYWNlX2NvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfZmFjZV9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogcG9zX2NvdW50ICogMyk7XHJcbiAgICAgIGxldCBwdHJfZmFjZSA9IE1vZHVsZS5fbWFsbG9jKDQgKiBmYWNlX2NvdW50KTtcclxuXHJcbiAgICAgIF9HU19TaG93X1NoZWxsKGtleSwgcHRyX3Bvc19jb3VudCwgcHRyX3BvcywgcHRyX2ZhY2VfY291bnQsIHB0cl9mYWNlKTtcclxuXHJcbiAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQzMkFycmF5KHBvc19jb3VudCAqIDMpO1xyXG4gICAgICBsZXQgZmFjZSA9IG5ldyBJbnQzMkFycmF5KGZhY2VfY291bnQpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NfY291bnQ7IGkrKykge1xyXG4gICAgICAgIHBvc1tpICogM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGkgKiAzXTtcclxuICAgICAgICBwb3NbaSAqIDMgKyAxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaSAqIDMgKyAxXTtcclxuICAgICAgICBwb3NbaSAqIDMgKyAyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaSAqIDMgKyAyXTtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZhY2VfY291bnQ7IGkrKykge1xyXG4gICAgICAgIGZhY2VbaV0gPSBNb2R1bGUuSEVBUDMyW3B0cl9mYWNlIC8gNCArIGldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvc19jb3VudCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfZmFjZV9jb3VudCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9mYWNlKTtcclxuXHJcbiAgICAgIHJldHVybiB7IHBvcywgZmFjZSB9O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfTWVzaCA9IEpTX0luc2VydF9NZXNoID0gZnVuY3Rpb24gKFxyXG4gICAgICByb3c6IG51bWJlcixcclxuICAgICAgY29sOiBudW1iZXIsXHJcbiAgICAgIHBvaW50czogQXJyYXlMaWtlPG51bWJlcj5cclxuICAgICkge1xyXG4gICAgICBsZXQgcGNvdW50ID0gcm93ICogY29sICogMztcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogcGNvdW50KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV0gPSBwb2ludHNbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBrZXkgPSBfR1NfSW5zZXJ0X01lc2gocm93LCBjb2wsIHB0cl9wb3MpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRWRpdF9NZXNoX1BvaW50cyA9IEpTX0VkaXRfTWVzaF9Qb2ludHMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICApIHtcclxuICAgICAgbGV0IHBjb3VudCA9IHBvaW50cy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGldID0gcG9pbnRzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBfR1NfRWRpdF9NZXNoX1BvaW50cyhrZXksIHB0cl9wb3MpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19NZXNoX1NpemUgPSBKU19TaG93X01lc2hfU2l6ZSA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IGFueSB7XHJcbiAgICAgIGxldCBwdHJfcm93X2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfY29sX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19NZXNoX1NpemUoa2V5LCBwdHJfcm93X2NvdW50LCBwdHJfY29sX2NvdW50KTtcclxuXHJcbiAgICAgIGxldCByb3dfY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9yb3dfY291bnQgLyA0XTtcclxuICAgICAgbGV0IGNvbF9jb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvbF9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yb3dfY291bnQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvbF9jb3VudCk7XHJcblxyXG4gICAgICByZXR1cm4geyByb3c6IHJvd19jb3VudCwgY29sOiBjb2xfY291bnQgfTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19NZXNoID0gSlNfU2hvd19NZXNoID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgbGV0IHB0cl9yb3dfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl9jb2xfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X01lc2hfU2l6ZShrZXksIHB0cl9yb3dfY291bnQsIHB0cl9jb2xfY291bnQpO1xyXG5cclxuICAgICAgbGV0IHJvdyA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jvd19jb3VudCAvIDRdO1xyXG4gICAgICBsZXQgY29sID0gTW9kdWxlLkhFQVAzMltwdHJfY29sX2NvdW50IC8gNF07XHJcblxyXG4gICAgICBsZXQgY291bnQgPSByb3cgKiBjb2wgKiAzO1xyXG5cclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogcm93ICogY29sICogMyk7XHJcblxyXG4gICAgICBfR1NfU2hvd19NZXNoKGtleSwgcHRyX3Jvd19jb3VudCwgcHRyX2NvbF9jb3VudCwgcHRyX3Bvcyk7XHJcblxyXG4gICAgICBsZXQgcG9zID0gbmV3IEZsb2F0MzJBcnJheShyb3cgKiBjb2wgKiAzKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgIHBvc1tpXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcm93X2NvdW50KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb2xfY291bnQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcblxyXG4gICAgICByZXR1cm4gcG9zO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfVmVjdG9yX1RleHQgPSBKU19JbnNlcnRfVmVjdG9yX1RleHQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHRleHQ6IHN0cmluZyxcclxuICAgICAgcG9zaXRpb246IEZsb2F0MzJBcnJheSxcclxuICAgICAgeF9heGlzOiBGbG9hdDMyQXJyYXksXHJcbiAgICAgIHlfYXhpczogRmxvYXQzMkFycmF5LFxyXG4gICAgICBmb250czogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl90ZXh0ID0gYWxsb2NhdGVVVEY4KHRleHQpO1xyXG4gICAgICBsZXQgcHRyX2ZvbnRzID0gbnVsbDtcclxuICAgICAgaWYgKGZvbnRzKSB7XHJcbiAgICAgICAgcHRyX2ZvbnRzID0gYWxsb2NhdGVVVEY4KGZvbnRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyLnNldChwb3NpdGlvbiwgcHRyX3BvcyAvIDQpO1xyXG4gICAgICBsZXQgcHRyX3ggPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyLnNldCh4X2F4aXMsIHB0cl94IC8gNCk7XHJcbiAgICAgIGxldCBwdHJfeSA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzIuc2V0KHlfYXhpcywgcHRyX3kgLyA0KTtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBfR1NfSW5zZXJ0X1ZlY3Rvcl9UZXh0KFxyXG4gICAgICAgIHB0cl90ZXh0LFxyXG4gICAgICAgIHB0cl9wb3MsXHJcbiAgICAgICAgcHRyX3gsXHJcbiAgICAgICAgcHRyX3ksXHJcbiAgICAgICAgcHRyX2ZvbnRzXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeSk7XHJcbiAgICAgIF9mcmVlKHB0cl90ZXh0KTtcclxuICAgICAgaWYgKGZvbnRzKSB7XHJcbiAgICAgICAgX2ZyZWUocHRyX2ZvbnRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X1BhcmFtZXRyaWNfR2VvbWV0cnkgPVxyXG4gICAgICBKU19JbnNlcnRfUGFyYW1ldHJpY19HZW9tZXRyeSA9IGZ1bmN0aW9uIChcclxuICAgICAgICB0eXBlOiBzdHJpbmcsXHJcbiAgICAgICAgcGFyYW1zOiBGbG9hdDY0QXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl90eXBlID0gYWxsb2NhdGVVVEY4KHR5cGUpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3BhcmFtcyA9IE1vZHVsZS5fbWFsbG9jKDggKiBwYXJhbXMubGVuZ3RoKTtcclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQocGFyYW1zLCBwdHJfcGFyYW1zIC8gOCk7XHJcblxyXG4gICAgICAgIGxldCBrZXkgPSBfR1NfSW5zZXJ0X1BhcmFtZXRyaWNfR2VvbWV0cnkoXHJcbiAgICAgICAgICBwdHJfdHlwZSxcclxuICAgICAgICAgIHB0cl9wYXJhbXMsXHJcbiAgICAgICAgICBwYXJhbXMubGVuZ3RoXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXJhbXMpO1xyXG4gICAgICAgIF9mcmVlKHB0cl90eXBlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19FZGl0X1BhcmFtZXRyaWNfR2VvbWV0cnkgPSBKU19FZGl0X1BhcmFtZXRyaWNfR2VvbWV0cnkgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIsIHR5cGU6IHN0cmluZywgcGFyYW1zOiBGbG9hdDY0QXJyYXkpIHtcclxuICAgICAgICBsZXQgcHRyX3R5cGUgPSBhbGxvY2F0ZVVURjgodHlwZSk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfcGFyYW1zID0gTW9kdWxlLl9tYWxsb2MoOCAqIHBhcmFtcy5sZW5ndGgpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnNldChwYXJhbXMsIHB0cl9wYXJhbXMgLyA4KTtcclxuXHJcbiAgICAgICAgX0dTX0VkaXRfUGFyYW1ldHJpY19HZW9tZXRyeShrZXksIHB0cl90eXBlLCBwdHJfcGFyYW1zLCBwYXJhbXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXJhbXMpO1xyXG4gICAgICAgIF9mcmVlKHB0cl90eXBlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1BhcmFtZXRyaWNfR2VvbWV0cnkgPSBKU19TaG93X1BhcmFtZXRyaWNfR2VvbWV0cnkgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHRyX3R5cGUgPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuICAgICAgICBsZXQgcHRyX3BhcmFtcyA9IE1vZHVsZS5fbWFsbG9jKDggKiAxMDI0KTtcclxuICAgICAgICBsZXQgcHRyX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1BhcmFtZXRyaWNfR2VvbWV0cnkoa2V5LCBwdHJfdHlwZSwgcHRyX3BhcmFtcywgcHRyX2NvdW50KTtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfY291bnQgLyA0XTtcclxuICAgICAgICBsZXQgdHlwZSA9IFVURjhUb1N0cmluZyhwdHJfdHlwZSk7XHJcblxyXG4gICAgICAgIGxldCBwYXJhbXMgPSBuZXcgRmxvYXQ2NEFycmF5KGNvdW50KTtcclxuICAgICAgICBwYXJhbXMuc2V0KFxyXG4gICAgICAgICAgTW9kdWxlLkhFQVBGNjQuc3ViYXJyYXkocHRyX3BhcmFtcyAvIDgsIHB0cl9wYXJhbXMgLyA4ICsgY291bnQpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb3VudCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXJhbXMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdHlwZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IHR5cGUsIHBhcmFtcyB9O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9QYXJhbWV0cmljX0dlb21ldHJpZXMgPVxyXG4gICAgICBKU19JbnNlcnRfUGFyYW1ldHJpY19HZW9tZXRyaWVzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHR5cGU6IHN0cmluZyxcclxuICAgICAgICBwYXJhbXM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgICBnZW9Db3VudDogbnVtYmVyXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfdHlwZSA9IGFsbG9jYXRlVVRGOCh0eXBlKTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9wYXJhbXMgPSBNb2R1bGUuX21hbGxvYyg4ICogcGFyYW1zLmxlbmd0aCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHBhcmFtcywgcHRyX3BhcmFtcyAvIDgpO1xyXG5cclxuICAgICAgICBsZXQga2V5ID0gX0dTX0luc2VydF9QYXJhbWV0cmljX0dlb21ldHJpZXMoXHJcbiAgICAgICAgICBwdHJfdHlwZSxcclxuICAgICAgICAgIHB0cl9wYXJhbXMsXHJcbiAgICAgICAgICBwYXJhbXMubGVuZ3RoLFxyXG4gICAgICAgICAgZ2VvQ291bnRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhcmFtcyk7XHJcbiAgICAgICAgX2ZyZWUocHRyX3R5cGUpO1xyXG5cclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9MaWdodCA9IEpTX0luc2VydF9MaWdodCA9IF9HU19JbnNlcnRfTGlnaHQ7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRWRpdF9MaWdodCA9IEpTX0VkaXRfTGlnaHQgPSBfR1NfRWRpdF9MaWdodDtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0xpZ2h0ID0gSlNfU2hvd19MaWdodCA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IGFueSB7XHJcbiAgICAgIGxldCBwdHJfeCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX3kgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl96ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfYiA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfTGlnaHQoa2V5LCBwdHJfeCwgcHRyX3ksIHB0cl96LCBwdHJfYik7XHJcblxyXG4gICAgICBsZXQgcG9zID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgcG9zWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ggLyA0XTtcclxuICAgICAgcG9zWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3kgLyA0XTtcclxuICAgICAgcG9zWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ogLyA0XTtcclxuXHJcbiAgICAgIGxldCBjYW1lcmFfcmVsYXRpdmUgPSBNb2R1bGUuSEVBUDMyW3B0cl9iIC8gNF07XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3gpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3kpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3opO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2IpO1xyXG5cclxuICAgICAgcmV0dXJuIHsgcG9zLCBjYW1lcmFfcmVsYXRpdmU6IGNhbWVyYV9yZWxhdGl2ZSA9PSAwID8gZmFsc2UgOiB0cnVlIH07XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9JbWFnZSA9IEpTX0luc2VydF9JbWFnZSA9IGZ1bmN0aW9uIChcclxuICAgICAgeDogbnVtYmVyLFxyXG4gICAgICB5OiBudW1iZXIsXHJcbiAgICAgIHo6IG51bWJlcixcclxuICAgICAgd2lkdGg6IG51bWJlcixcclxuICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgIGRhdGE6IEFycmF5QnVmZmVyIHwgbnVsbCxcclxuICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9kYXRhID0gbnVsbDtcclxuXHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyhkYXRhLmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICBsZXQgYXJyYXkgPSBuZXcgVWludDhBcnJheShkYXRhKTtcclxuICAgICAgICBNb2R1bGUuSEVBUDguc2V0KGFycmF5LCBwdHJfZGF0YSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfZGF0YSAvIDRdID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG5cclxuICAgICAgbGV0IGtleSA9IF9HU19JbnNlcnRfSW1hZ2UoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCwgcHRyX2RhdGEsIHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcbiAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9JbWFnZV9PcHRpb25zID0gSlNfU2V0X0ltYWdlX09wdGlvbnMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcblxyXG4gICAgICBfR1NfU2V0X0ltYWdlX09wdGlvbnMoa2V5LCBwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICBfZnJlZShwdHJfb3B0aW9ucyk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X09uZV9JbWFnZV9PcHRpb24gPSBKU19VblNldF9PbmVfSW1hZ2VfT3B0aW9uID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyLCBuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcHRyX25hbWUgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcblxyXG4gICAgICAgIF9HU19VblNldF9PbmVfSW1hZ2VfT3B0aW9uKGtleSwgcHRyX25hbWUpO1xyXG5cclxuICAgICAgICBfZnJlZShwdHJfbmFtZSk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbWFnZV9Qb3NpdGlvbiA9IEpTX1Nob3dfSW1hZ2VfUG9zaXRpb24gPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICBsZXQgcHRyX3ggPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl95ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfeiA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfSW1hZ2VfUG9zaXRpb24oa2V5LCBwdHJfeCwgcHRyX3ksIHB0cl96KTtcclxuXHJcbiAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICBwb3NbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfeCAvIDRdO1xyXG4gICAgICBwb3NbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfeSAvIDRdO1xyXG4gICAgICBwb3NbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfeiAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl94KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl95KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl96KTtcclxuXHJcbiAgICAgIHJldHVybiBwb3M7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSW1hZ2VfU2l6ZSA9IEpTX1Nob3dfSW1hZ2VfU2l6ZSA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IGFueSB7XHJcbiAgICAgIGxldCBwdHJfd2lkdGggPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl9oZWlnaHQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0ltYWdlX1NpemUoa2V5LCBwdHJfd2lkdGgsIHB0cl9oZWlnaHQpO1xyXG5cclxuICAgICAgbGV0IHdpZHRoID0gTW9kdWxlLkhFQVAzMltwdHJfd2lkdGggLyA0XTtcclxuICAgICAgbGV0IGhlaWdodCA9IE1vZHVsZS5IRUFQMzJbcHRyX2hlaWdodCAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl93aWR0aCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfaGVpZ2h0KTtcclxuXHJcbiAgICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbWFnZV9EYXRhID0gSlNfU2hvd19JbWFnZV9EYXRhID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogVWludDhBcnJheSB7XHJcbiAgICAgIGxldCBwdHJfc2l6ZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfSW1hZ2VfRGF0YV9TaXplKGtleSwgcHRyX3NpemUpO1xyXG5cclxuICAgICAgbGV0IHNpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9zaXplIC8gNF07XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3NpemUpO1xyXG5cclxuICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2Moc2l6ZSk7XHJcblxyXG4gICAgICBfR1NfU2hvd19JbWFnZV9EYXRhKGtleSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihzaXplKTtcclxuICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICBkYXRhLnNldChNb2R1bGUuSEVBUDguc3ViYXJyYXkocHRyX2RhdGEsIHB0cl9kYXRhICsgc2l6ZSkpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kYXRhKTtcclxuXHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0ltYWdlX09wdGlvbnMgPSBKU19TaG93X0ltYWdlX09wdGlvbnMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcHRyX29wdGlvbnMgPSBNb2R1bGUuX21hbGxvYyg1MTIpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfSW1hZ2VfT3B0aW9ucyhrZXksIHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIGxldCBvcHRpb25zID0gVVRGOFRvU3RyaW5nKHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfSW1hZ2VfT3B0aW9uID0gSlNfU2hvd19PbmVfSW1hZ2VfT3B0aW9uID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBwdHJfbmFtZSA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgICBsZXQgcHRyX29wdGlvbiA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X09uZV9JbWFnZV9PcHRpb24oa2V5LCBwdHJfbmFtZSwgcHRyX29wdGlvbik7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb24gPSBVVEY4VG9TdHJpbmcocHRyX29wdGlvbik7XHJcblxyXG4gICAgICAgIF9mcmVlKHB0cl9uYW1lKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX29wdGlvbik7XHJcblxyXG4gICAgICAgIHJldHVybiBvcHRpb247XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X0N1dHRpbmdfUGxhbmVzID0gSlNfSW5zZXJ0X0N1dHRpbmdfUGxhbmVzID1cclxuICAgICAgZnVuY3Rpb24gKHBsYW5lczogRmxvYXQzMkFycmF5KSB7XHJcbiAgICAgICAgbGV0IHB0cl9wbGFuZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogcGxhbmVzLmxlbmd0aCAqIDMpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcGxhbmVzIC8gNCArIGldID0gcGxhbmVzW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQga2V5ID0gX0dTX0luc2VydF9DdXR0aW5nX1BsYW5lcyhwdHJfcGxhbmVzLCBwbGFuZXMubGVuZ3RoIC8gMTIpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGxhbmVzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19FZGl0X0N1dHRpbmdfUGxhbmVzID0gSlNfRWRpdF9DdXR0aW5nX1BsYW5lcyA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgIHBsYW5lczogRmxvYXQzMkFycmF5XHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9wbGFuZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogcGxhbmVzLmxlbmd0aCAqIDMpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9wbGFuZXMgLyA0ICsgaV0gPSBwbGFuZXNbaV07XHJcbiAgICAgIH1cclxuICAgICAgX0dTX0VkaXRfQ3V0dGluZ19QbGFuZXMoa2V5LCBwdHJfcGxhbmVzLCBwbGFuZXMubGVuZ3RoIC8gMTIpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3BsYW5lcyk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ3V0dGluZ19QbGFuZXMgPSBKU19TaG93X0N1dHRpbmdfUGxhbmVzID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfcGxhbmVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIDYgKiAzICogNCk7XHJcbiAgICAgIGxldCBwdHJfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0N1dHRpbmdfUGxhbmVzKGtleSwgcHRyX3BsYW5lcywgcHRyX2NvdW50KTtcclxuXHJcbiAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNF0gKiA0ICogMztcclxuICAgICAgbGV0IHBsYW5lcyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICBwbGFuZXNbaV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcGxhbmVzIC8gNCArIGldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvdW50KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wbGFuZXMpO1xyXG5cclxuICAgICAgcmV0dXJuIHBsYW5lcztcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19HZW9tZXRyeV9WZXJ0aWNlc19Qb3NpdGlvbl9CeV9JbmRleGVzID1cclxuICAgICAgSlNfU2hvd19HZW9tZXRyeV9WZXJ0aWNlc19Qb3NpdGlvbl9CeV9JbmRleGVzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICAgIGluZGV4ZXM6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICAgICk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IGljb3VudCA9IGluZGV4ZXMubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwdHJfaWR4ID0gTW9kdWxlLl9tYWxsb2MoNCAqIGljb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfaWR4IC8gNCArIGldID0gaW5kZXhlc1tpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwY291bnQgPSBpY291bnQgKiAzO1xyXG4gICAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0dlb21ldHJ5X1ZlcnRpY2VzX1Bvc2l0aW9uX0J5X0luZGV4ZXMoXHJcbiAgICAgICAgICBrZXksXHJcbiAgICAgICAgICBwdHJfaWR4LFxyXG4gICAgICAgICAgaWNvdW50LFxyXG4gICAgICAgICAgcHRyX3Bvc1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KHBjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgcG9zaXRpb25zW2ldID0gTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaWR4KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcblxyXG4gICAgICAgIHJldHVybiBwb3NpdGlvbnM7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19HZW9tZXRyeV9FbGVtZW50X1R5cGUgPVxyXG4gICAgICBKU19TaG93X0dlb21ldHJ5X0VsZW1lbnRfVHlwZSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlcixcclxuICAgICAgICBlbGVtZW50X3R5cGU6IEVsZW1lbnRUeXBlLFxyXG4gICAgICAgIGluZGV4ZXM6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICAgICk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnRfdHlwZSA9PSBFbGVtZW50VHlwZS5FTEVNRU5UX1RZUEVfVmVydGV4KSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2lkeCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfaWR4IC8gNF0gPSBpbmRleGVzWzBdO1xyXG5cclxuICAgICAgICAgIGxldCBwdHJfdHlwZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgICAgX0dTX1Nob3dfR2VvbWV0cnlfRWxlbWVudF9UeXBlKFxyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIGVsZW1lbnRfdHlwZSBhcyBudW1iZXIsXHJcbiAgICAgICAgICAgIHB0cl9pZHgsXHJcbiAgICAgICAgICAgIHB0cl90eXBlXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGxldCB0eXBlID0gTW9kdWxlLkhFQVAzMltwdHJfdHlwZSAvIDRdO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaWR4KTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdHlwZSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHR5cGU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRWxlbWVudFR5cGUuRUxFTUVOVF9UWVBFX0VkZ2UpIHtcclxuICAgICAgICAgIGxldCBwdHJfaWR4ID0gTW9kdWxlLl9tYWxsb2MoNCAqIDIpO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfaWR4IC8gNF0gPSBpbmRleGVzWzBdO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfaWR4IC8gNCArIDFdID0gaW5kZXhlc1sxXTtcclxuXHJcbiAgICAgICAgICBsZXQgcHRyX3R5cGUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICAgIF9HU19TaG93X0dlb21ldHJ5X0VsZW1lbnRfVHlwZShcclxuICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICBlbGVtZW50X3R5cGUgYXMgbnVtYmVyLFxyXG4gICAgICAgICAgICBwdHJfaWR4LFxyXG4gICAgICAgICAgICBwdHJfdHlwZVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBsZXQgdHlwZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3R5cGUgLyA0XTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2lkeCk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3R5cGUpO1xyXG5cclxuICAgICAgICAgIHJldHVybiB0eXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMgPVxyXG4gICAgICBKU19TZXRfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICAgICAgY291bnQ6IG51bWJlcixcclxuICAgICAgICB2YWx1ZTogRmxvYXQzMkFycmF5XHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwY291bnQgPSB2YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogcGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGldID0gdmFsdWVbaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfR1NfU2V0X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzKGtleSwgb2Zmc2V0LCBjb3VudCwgcHRyX3Bvcyk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0dlb21ldHJ5X1RleHR1cmVfRGltZW5zaW9uID1cclxuICAgICAgSlNfU2hvd19HZW9tZXRyeV9UZXh0dXJlX0RpbWVuc2lvbiA9IGZ1bmN0aW9uIChrZXk6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHB0cl9kaW0gPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfR2VvbWV0cnlfVGV4dHVyZV9EaW1lbnNpb24oa2V5LCBwdHJfZGltKTtcclxuXHJcbiAgICAgICAgbGV0IGRpbSA9IE1vZHVsZS5IRUFQMzJbcHRyX2RpbSAvIDRdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RpbSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkaW07XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyA9XHJcbiAgICAgIEpTX1Nob3dfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICAgICAgY291bnRcclxuICAgICAgKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgICBsZXQgbGVuID0gY291bnQgKiAyO1xyXG5cclxuICAgICAgICBsZXQgcHRyX2Nvb3JkcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBsZW4pO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyhrZXksIG9mZnNldCwgY291bnQsIHB0cl9jb29yZHMpO1xyXG5cclxuICAgICAgICBsZXQgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICBjb29yZHNbaV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfY29vcmRzIC8gNCArIGldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb29yZHMpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29vcmRzO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzID1cclxuICAgICAgSlNfVW5TZXRfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMgPSBfR1NfVW5TZXRfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHM7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyA9XHJcbiAgICAgIEpTX0NvbXB1dGVfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuXHJcbiAgICAgICAgX0dTX0NvbXB1dGVfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMoa2V5LCBwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfR2VvbWV0cnlfTm9ybWFscyA9IEpTX1NldF9HZW9tZXRyeV9Ob3JtYWxzID1cclxuICAgICAgZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICAgIG9mZnNldDogbnVtYmVyLFxyXG4gICAgICAgIGNvdW50OiBudW1iZXIsXHJcbiAgICAgICAgdmFsdWU6IEZsb2F0MzJBcnJheVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcGNvdW50ID0gdmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXSA9IHZhbHVlW2ldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX0dTX1NldF9HZW9tZXRyeV9Ob3JtYWxzKGtleSwgb2Zmc2V0LCBjb3VudCwgcHRyX3Bvcyk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0dlb21ldHJ5X05vcm1hbHMgPSBKU19TaG93X0dlb21ldHJ5X05vcm1hbHMgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIsIG9mZnNldDogbnVtYmVyLCBjb3VudDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHB0cl9ub3JtYWxzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGNvdW50ICogMyk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0dlb21ldHJ5X05vcm1hbHMoa2V5LCBvZmZzZXQsIGNvdW50LCBwdHJfbm9ybWFscyk7XHJcblxyXG4gICAgICAgIGxldCBub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDMpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIG5vcm1hbHNbaSAqIDNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbHMgLyA0ICsgaSAqIDNdO1xyXG4gICAgICAgICAgbm9ybWFsc1tpICogMyArIDFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbHMgLyA0ICsgaSAqIDMgKyAxXTtcclxuICAgICAgICAgIG5vcm1hbHNbaSAqIDMgKyAyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWxzIC8gNCArIGkgKiAzICsgMl07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX25vcm1hbHMpO1xyXG5cclxuICAgICAgICByZXR1cm4gbm9ybWFscztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9HZW9tZXRyeV9Ob3JtYWxzID0gSlNfVW5TZXRfR2VvbWV0cnlfTm9ybWFscyA9XHJcbiAgICAgIF9HU19VblNldF9HZW9tZXRyeV9Ob3JtYWxzO1xyXG5cclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0dlb21ldHJ5X0RhdGEgPSBKU19Db21wdXRlX0dlb21ldHJ5X0RhdGEgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIsIG9wdGlvbnM6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgICBfR1NfQ29tcHV0ZV9HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGEoa2V5LCBwdHJfb3B0aW9ucyk7XHJcbiAgICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0dlb21ldHJ5X1Rlc3NlbGxhdGVfRGF0YSA9XHJcbiAgICAgIEpTX0NvbXB1dGVfR2VvbWV0cnlfVGVzc2VsbGF0ZV9EYXRhID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICAgIGltYWdlX2tleTogbnVtYmVyLFxyXG4gICAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcblxyXG4gICAgICAgIF9HU19Db21wdXRlX0dlb21ldHJ5X1Rlc3NlbGxhdGVfRGF0YShrZXksIHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9wb3NfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX2lkeF9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGFfQ291bnQoXHJcbiAgICAgICAgICBrZXksXHJcbiAgICAgICAgICBwdHJfcG9zX2NvdW50LFxyXG4gICAgICAgICAgcHRyX2lkeF9jb3VudFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBwb3NfY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9wb3NfY291bnQgLyA0XTtcclxuICAgICAgICBsZXQgaWR4X2NvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfaWR4X2NvdW50IC8gNF07XHJcblxyXG4gICAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvc19jb3VudCAqIDMpO1xyXG4gICAgICAgIGxldCBwdHJfaWR4ID0gTW9kdWxlLl9tYWxsb2MoNCAqIGlkeF9jb3VudCk7XHJcbiAgICAgICAgbGV0IHB0cl9ub3IgPSBNb2R1bGUuX21hbGxvYyg0ICogcG9zX2NvdW50ICogMyk7XHJcbiAgICAgICAgbGV0IHB0cl90ZXggPSBNb2R1bGUuX21hbGxvYyg0ICogcG9zX2NvdW50ICogMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0dlb21ldHJ5X1Rlc3NlbGxhdGVfRGF0YShcclxuICAgICAgICAgIGtleSxcclxuICAgICAgICAgIGltYWdlX2tleSxcclxuICAgICAgICAgIHB0cl9wb3MsXHJcbiAgICAgICAgICBwdHJfaWR4LFxyXG4gICAgICAgICAgcHRyX25vcixcclxuICAgICAgICAgIHB0cl90ZXhcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgcG9zID0gbmV3IEZsb2F0MzJBcnJheShwb3NfY291bnQgKiAzKTtcclxuICAgICAgICBsZXQgaWR4ID0gbmV3IEludDMyQXJyYXkoaWR4X2NvdW50KTtcclxuICAgICAgICBsZXQgbm9yID0gbmV3IEZsb2F0MzJBcnJheShwb3NfY291bnQgKiAzKTtcclxuICAgICAgICBsZXQgdGV4ID0gbmV3IEZsb2F0MzJBcnJheShwb3NfY291bnQgKiAyKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NfY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgcG9zW2kgKiAzXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaSAqIDNdO1xyXG4gICAgICAgICAgcG9zW2kgKiAzICsgMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGkgKiAzICsgMV07XHJcbiAgICAgICAgICBwb3NbaSAqIDMgKyAyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaSAqIDMgKyAyXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHhfY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgaWR4W2ldID0gTW9kdWxlLkhFQVAzMltwdHJfaWR4IC8gNCArIGldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc19jb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBub3JbaSAqIDNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX25vciAvIDQgKyBpICogM107XHJcbiAgICAgICAgICBub3JbaSAqIDMgKyAxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3IgLyA0ICsgaSAqIDMgKyAxXTtcclxuICAgICAgICAgIG5vcltpICogMyArIDJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX25vciAvIDQgKyBpICogMyArIDJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc19jb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICB0ZXhbaSAqIDJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3RleCAvIDQgKyBpICogMl07XHJcbiAgICAgICAgICB0ZXhbaSAqIDIgKyAxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl90ZXggLyA0ICsgaSAqIDIgKyAxXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zX2NvdW50KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2lkeF9jb3VudCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaWR4KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX25vcik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90ZXgpO1xyXG5cclxuICAgICAgICBfZnJlZShwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIF9HU19DbGVhcl9HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGEoa2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgcG9zaXRpb25zOiBwb3MsIGluZGV4ZXM6IGlkeCwgbm9ybWFsczogbm9yLCB0ZXhjb29yZHM6IHRleCB9O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX01lcmdlX1NoZWxsID0gSlNfTWVyZ2VfU2hlbGwgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBmcm9tX2tleTogbnVtYmVyLFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcblxyXG4gICAgICBfR1NfQ29tcHV0ZV9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyhrZXksIHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuICAgIH07XHJcbiAgICBKU19TZXRfR2VvbWV0cnlfTm9ybWFscyA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgIG9mZnNldDogbnVtYmVyLFxyXG4gICAgICBjb3VudDogbnVtYmVyLFxyXG4gICAgICB2YWx1ZTogRmxvYXQzMkFycmF5XHJcbiAgICApIHtcclxuICAgICAgbGV0IHBjb3VudCA9IHZhbHVlLmxlbmd0aDtcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogcGNvdW50KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV0gPSB2YWx1ZVtpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgX0dTX1NldF9HZW9tZXRyeV9Ob3JtYWxzKGtleSwgb2Zmc2V0LCBjb3VudCwgcHRyX3Bvcyk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICB9O1xyXG4gICAgSlNfU2hvd19HZW9tZXRyeV9Ob3JtYWxzID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICAgIGNvdW50OiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX25vcm1hbHMgPSBNb2R1bGUuX21hbGxvYyg0ICogY291bnQgKiAzKTtcclxuXHJcbiAgICAgIF9HU19TaG93X0dlb21ldHJ5X05vcm1hbHMoa2V5LCBvZmZzZXQsIGNvdW50LCBwdHJfbm9ybWFscyk7XHJcblxyXG4gICAgICBsZXQgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAzKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgIG5vcm1hbHNbaSAqIDNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbHMgLyA0ICsgaSAqIDNdO1xyXG4gICAgICAgIG5vcm1hbHNbaSAqIDMgKyAxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWxzIC8gNCArIGkgKiAzICsgMV07XHJcbiAgICAgICAgbm9ybWFsc1tpICogMyArIDJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbHMgLyA0ICsgaSAqIDMgKyAyXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ub3JtYWxzKTtcclxuXHJcbiAgICAgIHJldHVybiBub3JtYWxzO1xyXG4gICAgfTtcclxuICAgIEpTX1VuU2V0X0dlb21ldHJ5X05vcm1hbHMgPSBfR1NfVW5TZXRfR2VvbWV0cnlfTm9ybWFscztcclxuICAgIEpTX0NvbXB1dGVfR2VvbWV0cnlfVGVzc2VsbGF0ZV9EYXRhID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgaW1hZ2Vfa2V5OiBudW1iZXIsXHJcbiAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuXHJcbiAgICAgIF9HU19Db21wdXRlX0dlb21ldHJ5X1Rlc3NlbGxhdGVfRGF0YShrZXksIHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIGxldCBwdHJfcG9zX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfaWR4X2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGFfQ291bnQoXHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIHB0cl9wb3NfY291bnQsXHJcbiAgICAgICAgcHRyX2lkeF9jb3VudFxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGV0IHBvc19jb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX3Bvc19jb3VudCAvIDRdO1xyXG4gICAgICBsZXQgaWR4X2NvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfaWR4X2NvdW50IC8gNF07XHJcblxyXG4gICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwb3NfY291bnQgKiAzKTtcclxuICAgICAgbGV0IHB0cl9pZHggPSBNb2R1bGUuX21hbGxvYyg0ICogaWR4X2NvdW50KTtcclxuICAgICAgbGV0IHB0cl9ub3IgPSBNb2R1bGUuX21hbGxvYyg0ICogcG9zX2NvdW50ICogMyk7XHJcbiAgICAgIGxldCBwdHJfdGV4ID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvc19jb3VudCAqIDIpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfR2VvbWV0cnlfVGVzc2VsbGF0ZV9EYXRhKFxyXG4gICAgICAgIGtleSxcclxuICAgICAgICBpbWFnZV9rZXksXHJcbiAgICAgICAgcHRyX3BvcyxcclxuICAgICAgICBwdHJfaWR4LFxyXG4gICAgICAgIHB0cl9ub3IsXHJcbiAgICAgICAgcHRyX3RleFxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGV0IHBvcyA9IG5ldyBGbG9hdDMyQXJyYXkocG9zX2NvdW50ICogMyk7XHJcbiAgICAgIGxldCBpZHggPSBuZXcgSW50MzJBcnJheShpZHhfY291bnQpO1xyXG4gICAgICBsZXQgbm9yID0gbmV3IEZsb2F0MzJBcnJheShwb3NfY291bnQgKiAzKTtcclxuICAgICAgbGV0IHRleCA9IG5ldyBGbG9hdDMyQXJyYXkocG9zX2NvdW50ICogMik7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc19jb3VudDsgaSsrKSB7XHJcbiAgICAgICAgcG9zW2kgKiAzXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaSAqIDNdO1xyXG4gICAgICAgIHBvc1tpICogMyArIDFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpICogMyArIDFdO1xyXG4gICAgICAgIHBvc1tpICogMyArIDJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpICogMyArIDJdO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWR4X2NvdW50OyBpKyspIHtcclxuICAgICAgICBpZHhbaV0gPSBNb2R1bGUuSEVBUDMyW3B0cl9pZHggLyA0ICsgaV07XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NfY291bnQ7IGkrKykge1xyXG4gICAgICAgIG5vcltpICogM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfbm9yIC8gNCArIGkgKiAzXTtcclxuICAgICAgICBub3JbaSAqIDMgKyAxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3IgLyA0ICsgaSAqIDMgKyAxXTtcclxuICAgICAgICBub3JbaSAqIDMgKyAyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3IgLyA0ICsgaSAqIDMgKyAyXTtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc19jb3VudDsgaSsrKSB7XHJcbiAgICAgICAgdGV4W2kgKiAyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl90ZXggLyA0ICsgaSAqIDJdO1xyXG4gICAgICAgIHRleFtpICogMiArIDFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3RleCAvIDQgKyBpICogMiArIDFdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvc19jb3VudCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfaWR4X2NvdW50KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2lkeCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfbm9yKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl90ZXgpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgX0dTX0NsZWFyX0dlb21ldHJ5X1Rlc3NlbGxhdGVfRGF0YShrZXkpO1xyXG5cclxuICAgICAgcmV0dXJuIHsgcG9zaXRpb25zOiBwb3MsIGluZGV4ZXM6IGlkeCwgbm9ybWFsczogbm9yLCB0ZXhjb29yZHM6IHRleCB9O1xyXG4gICAgfTtcclxuICAgIEpTX01lcmdlX1NoZWxsID0gZnVuY3Rpb24gKGtleTogbnVtYmVyLCBmcm9tX2tleTogbnVtYmVyLCBvcHRpb25zOiBzdHJpbmcpIHtcclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG4gICAgICBfR1NfTWVyZ2VfU2hlbGwoa2V5LCBmcm9tX2tleSwgcHRyX29wdGlvbnMpO1xyXG4gICAgICBfZnJlZShwdHJfb3B0aW9ucyk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0V4dHJ1ZGVfQnlfU2hlbGwgPSBKU19FeHRydWRlX0J5X1NoZWxsID0gZnVuY3Rpb24gKFxyXG4gICAgICBwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBpbmRleGVzOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgbm9ybWFsOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHBjb3VudCA9IHBvaW50cy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGldID0gcG9pbnRzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaWNvdW50ID0gaW5kZXhlcy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfaW5kID0gTW9kdWxlLl9tYWxsb2MoNCAqIGljb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl9pbmQgLyA0ICsgaV0gPSBpbmRleGVzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcHRyX25vcm1hbCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDRdID0gbm9ybWFsWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFsIC8gNCArIDFdID0gbm9ybWFsWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFsIC8gNCArIDJdID0gbm9ybWFsWzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG5cclxuICAgICAgbGV0IGtleSA9IF9HU19FeHRydWRlX0J5X1NoZWxsKFxyXG4gICAgICAgIHB0cl9wb3MsXHJcbiAgICAgICAgcGNvdW50IC8gMyxcclxuICAgICAgICBwdHJfaW5kLFxyXG4gICAgICAgIGljb3VudCxcclxuICAgICAgICBwdHJfbm9ybWFsLFxyXG4gICAgICAgIHB0cl9vcHRpb25zXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW5kKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ub3JtYWwpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfREV4dHJ1ZGVfQnlfU2hlbGwgPSBKU19ERXh0cnVkZV9CeV9TaGVsbCA9IGZ1bmN0aW9uIChcclxuICAgICAgcG9pbnRzOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgaW5kZXhlczogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIG5vcm1hbDogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwY291bnQgPSBwb2ludHMubGVuZ3RoO1xyXG4gICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDggKiBwY291bnQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDggKyBpXSA9IHBvaW50c1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGljb3VudCA9IGluZGV4ZXMubGVuZ3RoO1xyXG4gICAgICBsZXQgcHRyX2luZCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBpY291bnQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljb3VudDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfaW5kIC8gNCArIGldID0gaW5kZXhlc1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHB0cl9ub3JtYWwgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9ub3JtYWwgLyA4XSA9IG5vcm1hbFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX25vcm1hbCAvIDggKyAxXSA9IG5vcm1hbFsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX25vcm1hbCAvIDggKyAyXSA9IG5vcm1hbFsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBfR1NfREV4dHJ1ZGVfQnlfU2hlbGwoXHJcbiAgICAgICAgcHRyX3BvcyxcclxuICAgICAgICBwY291bnQgLyAzLFxyXG4gICAgICAgIHB0cl9pbmQsXHJcbiAgICAgICAgaWNvdW50LFxyXG4gICAgICAgIHB0cl9ub3JtYWwsXHJcbiAgICAgICAgcHRyX29wdGlvbnNcclxuICAgICAgKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pbmQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX25vcm1hbCk7XHJcblxyXG4gICAgICBfZnJlZShwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Sb3RhdGVfQnlfU2hlbGwgPSBKU19Sb3RhdGVfQnlfU2hlbGwgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHBvaW50czogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIGluZGV4ZXM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBvcmlnaW46IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBub3JtYWw6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogcGNvdW50KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV0gPSBwb2ludHNbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBpY291bnQgPSBpbmRleGVzLmxlbmd0aDtcclxuICAgICAgbGV0IHB0cl9pbmQgPSBNb2R1bGUuX21hbGxvYyg0ICogaWNvdW50KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpY291bnQ7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX2luZCAvIDQgKyBpXSA9IGluZGV4ZXNbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwdHJfb3JpZ2luID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3JpZ2luIC8gNF0gPSBvcmlnaW5bMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9vcmlnaW4gLyA0ICsgMV0gPSBvcmlnaW5bMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9vcmlnaW4gLyA0ICsgMl0gPSBvcmlnaW5bMl07XHJcblxyXG4gICAgICBsZXQgcHRyX25vcm1hbCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDRdID0gbm9ybWFsWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFsIC8gNCArIDFdID0gbm9ybWFsWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFsIC8gNCArIDJdID0gbm9ybWFsWzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG5cclxuICAgICAgbGV0IGtleSA9IF9HU19Sb3RhdGVfQnlfU2hlbGwoXHJcbiAgICAgICAgcHRyX3BvcyxcclxuICAgICAgICBwY291bnQgLyAzLFxyXG4gICAgICAgIHB0cl9pbmQsXHJcbiAgICAgICAgaWNvdW50LFxyXG4gICAgICAgIHB0cl9vcmlnaW4sXHJcbiAgICAgICAgcHRyX25vcm1hbCxcclxuICAgICAgICBwdHJfb3B0aW9uc1xyXG4gICAgICApO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2luZCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfb3JpZ2luKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ub3JtYWwpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRFJvdGF0ZV9CeV9TaGVsbCA9IEpTX0RSb3RhdGVfQnlfU2hlbGwgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHBvaW50czogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIGluZGV4ZXM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBvcmlnaW46IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBub3JtYWw6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg4ICogcGNvdW50KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA4ICsgaV0gPSBwb2ludHNbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBpY291bnQgPSBpbmRleGVzLmxlbmd0aDtcclxuICAgICAgbGV0IHB0cl9pbmQgPSBNb2R1bGUuX21hbGxvYyg0ICogaWNvdW50KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpY291bnQ7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX2luZCAvIDQgKyBpXSA9IGluZGV4ZXNbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwdHJfb3JpZ2luID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3JpZ2luIC8gOF0gPSBvcmlnaW5bMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9vcmlnaW4gLyA4ICsgMV0gPSBvcmlnaW5bMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9vcmlnaW4gLyA4ICsgMl0gPSBvcmlnaW5bMl07XHJcblxyXG4gICAgICBsZXQgcHRyX25vcm1hbCA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDhdID0gbm9ybWFsWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFsIC8gOCArIDFdID0gbm9ybWFsWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFsIC8gOCArIDJdID0gbm9ybWFsWzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG5cclxuICAgICAgbGV0IGtleSA9IF9HU19EUm90YXRlX0J5X1NoZWxsKFxyXG4gICAgICAgIHB0cl9wb3MsXHJcbiAgICAgICAgcGNvdW50IC8gMyxcclxuICAgICAgICBwdHJfaW5kLFxyXG4gICAgICAgIGljb3VudCxcclxuICAgICAgICBwdHJfb3JpZ2luLFxyXG4gICAgICAgIHB0cl9ub3JtYWwsXHJcbiAgICAgICAgcHRyX29wdGlvbnNcclxuICAgICAgKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pbmQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX29yaWdpbik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfbm9ybWFsKTtcclxuXHJcbiAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1N3ZWVwX0J5X1NoZWxsID0gSlNfU3dlZXBfQnlfU2hlbGwgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHBvaW50czogRmxvYXQzMkFycmF5LFxyXG4gICAgICBpbmRleGVzOiBJbnQzMkFycmF5LFxyXG4gICAgICBwYXRoOiBGbG9hdDMyQXJyYXksXHJcbiAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvaW50cy5sZW5ndGgpO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMi5zZXQocG9pbnRzLCBwdHJfcG9pbnRzIC8gNCk7XHJcblxyXG4gICAgICBsZXQgcHRyX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogaW5kZXhlcy5sZW5ndGgpO1xyXG4gICAgICBNb2R1bGUuSEVBUDMyLnNldChpbmRleGVzLCBwdHJfaW5kZXhlcyAvIDQpO1xyXG5cclxuICAgICAgbGV0IHB0cl9wYXRoID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBhdGgubGVuZ3RoKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzIuc2V0KHBhdGgsIHB0cl9wYXRoIC8gNCk7XHJcblxyXG4gICAgICBsZXQgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcblxyXG4gICAgICBsZXQga2V5ID0gX0dTX1N3ZWVwX0J5X1NoZWxsKFxyXG4gICAgICAgIHB0cl9wb2ludHMsXHJcbiAgICAgICAgcG9pbnRzLmxlbmd0aCAvIDMsXHJcbiAgICAgICAgcHRyX2luZGV4ZXMsXHJcbiAgICAgICAgaW5kZXhlcy5sZW5ndGgsXHJcbiAgICAgICAgcHRyX3BhdGgsXHJcbiAgICAgICAgcGF0aC5sZW5ndGggLyAzLFxyXG4gICAgICAgIHB0cl9vcHRpb25zXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3BvaW50cyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW5kZXhlcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGF0aCk7XHJcblxyXG4gICAgICBfZnJlZShwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19EU3dlZXBfQnlfU2hlbGwgPSBKU19EU3dlZXBfQnlfU2hlbGwgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHBvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICBpbmRleGVzOiBJbnQzMkFycmF5LFxyXG4gICAgICBwYXRoOiBGbG9hdDY0QXJyYXksXHJcbiAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoOCAqIHBvaW50cy5sZW5ndGgpO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NC5zZXQocG9pbnRzLCBwdHJfcG9pbnRzIC8gOCk7XHJcblxyXG4gICAgICBsZXQgcHRyX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogaW5kZXhlcy5sZW5ndGgpO1xyXG4gICAgICBNb2R1bGUuSEVBUDMyLnNldChpbmRleGVzLCBwdHJfaW5kZXhlcyAvIDQpO1xyXG5cclxuICAgICAgbGV0IHB0cl9wYXRoID0gTW9kdWxlLl9tYWxsb2MoOCAqIHBhdGgubGVuZ3RoKTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHBhdGgsIHB0cl9wYXRoIC8gOCk7XHJcblxyXG4gICAgICBsZXQgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcblxyXG4gICAgICBsZXQga2V5ID0gX0dTX0RTd2VlcF9CeV9TaGVsbChcclxuICAgICAgICBwdHJfcG9pbnRzLFxyXG4gICAgICAgIHBvaW50cy5sZW5ndGggLyAzLFxyXG4gICAgICAgIHB0cl9pbmRleGVzLFxyXG4gICAgICAgIGluZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgIHB0cl9wYXRoLFxyXG4gICAgICAgIHBhdGgubGVuZ3RoIC8gMyxcclxuICAgICAgICBwdHJfb3B0aW9uc1xyXG4gICAgICApO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2ludHMpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2luZGV4ZXMpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhdGgpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9SYXlfVGVzdCA9IEpTX0NvbXB1dGVfUmF5X1Rlc3QgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHZpZXdfa2V5OiBudW1iZXIsXHJcbiAgICAgIG9yaWdpbjogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIGRpcmVjdDogQXJyYXlMaWtlPG51bWJlcj5cclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX29yaWdpbiA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29yaWdpbiAvIDRdID0gb3JpZ2luWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3JpZ2luIC8gNCArIDFdID0gb3JpZ2luWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3JpZ2luIC8gNCArIDJdID0gb3JpZ2luWzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl9kaXJlY3QgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9kaXJlY3QgLyA0XSA9IGRpcmVjdFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2RpcmVjdCAvIDQgKyAxXSA9IGRpcmVjdFsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2RpcmVjdCAvIDQgKyAyXSA9IGRpcmVjdFsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfcG9zaXRpb24gPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcblxyXG4gICAgICBsZXQgcG9zaXRpb24gPSBudWxsO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgX0dTX0NvbXB1dGVfUmF5X1Rlc3Qodmlld19rZXksIHB0cl9vcmlnaW4sIHB0cl9kaXJlY3QsIHB0cl9wb3NpdGlvbilcclxuICAgICAgKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICAgIHBvc2l0aW9uWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3Bvc2l0aW9uIC8gNF07XHJcbiAgICAgICAgcG9zaXRpb25bMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zaXRpb24gLyA0ICsgMV07XHJcbiAgICAgICAgcG9zaXRpb25bMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zaXRpb24gLyA0ICsgMl07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfb3JpZ2luKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kaXJlY3QpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvc2l0aW9uKTtcclxuXHJcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9HZW9tZXRyeV9SYXlfVGVzdCA9XHJcbiAgICAgIEpTX0NvbXB1dGVfR2VvbWV0cnlfUmF5X1Rlc3QgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgdmlld19rZXk6IG51bWJlcixcclxuICAgICAgICBnZW9tX2tleTogbnVtYmVyLFxyXG4gICAgICAgIG9yaWdpbjogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgICAgZGlyZWN0OiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyX29yaWdpbiA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3JpZ2luIC8gNF0gPSBvcmlnaW5bMF07XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29yaWdpbiAvIDQgKyAxXSA9IG9yaWdpblsxXTtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3JpZ2luIC8gNCArIDJdID0gb3JpZ2luWzJdO1xyXG5cclxuICAgICAgICBsZXQgcHRyX2RpcmVjdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfZGlyZWN0IC8gNF0gPSBkaXJlY3RbMF07XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2RpcmVjdCAvIDQgKyAxXSA9IGRpcmVjdFsxXTtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfZGlyZWN0IC8gNCArIDJdID0gZGlyZWN0WzJdO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3Bvc2l0aW9uID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG5cclxuICAgICAgICBsZXQgcG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIF9HU19Db21wdXRlX0dlb21ldHJ5X1JheV9UZXN0KFxyXG4gICAgICAgICAgICB2aWV3X2tleSxcclxuICAgICAgICAgICAgZ2VvbV9rZXksXHJcbiAgICAgICAgICAgIHB0cl9vcmlnaW4sXHJcbiAgICAgICAgICAgIHB0cl9kaXJlY3QsXHJcbiAgICAgICAgICAgIHB0cl9wb3NpdGlvblxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcG9zaXRpb24gPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICAgICAgcG9zaXRpb25bMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zaXRpb24gLyA0XTtcclxuICAgICAgICAgIHBvc2l0aW9uWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3Bvc2l0aW9uIC8gNCArIDFdO1xyXG4gICAgICAgICAgcG9zaXRpb25bMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zaXRpb24gLyA0ICsgMl07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX29yaWdpbik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kaXJlY3QpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zaXRpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Cb3hfVGVzdCA9IEpTX0NvbXB1dGVfQm94X1Rlc3QgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHZpZXdfa2V5OiBudW1iZXIsXHJcbiAgICAgIGJiOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfYmIgPSBNb2R1bGUuX21hbGxvYyg0ICogNik7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyLnNldChiYiwgcHRyX2JiIC8gNCk7XHJcblxyXG4gICAgICBsZXQgcHRyX3Jlc3VsdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiA2KTtcclxuXHJcbiAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICBpZiAoX0dTX0NvbXB1dGVfQm94X1Rlc3Qodmlld19rZXksIHB0cl9iYiwgcHRyX3Jlc3VsdCkpIHtcclxuICAgICAgICByZXN1bHQgPSBuZXcgRmxvYXQzMkFycmF5KDYpO1xyXG4gICAgICAgIHJlc3VsdC5zZXQoTW9kdWxlLkhFQVBGMzIuc3ViYXJyYXkocHRyX3Jlc3VsdCAvIDQsIHB0cl9yZXN1bHQgLyA0ICsgNikpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2JiKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXN1bHQpO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Qb2x5Z29uX0FyZWEgPSBKU19Db21wdXRlX1BvbHlnb25fQXJlYSA9XHJcbiAgICAgIGZ1bmN0aW9uIChwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICAgICAgbGV0IHB0cl9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHBvaW50cywgcHRyX3BvaW50cyAvIDgpO1xyXG4gICAgICAgIGxldCBwdHJfYXJlYSA9IE1vZHVsZS5fbWFsbG9jKDgpO1xyXG5cclxuICAgICAgICBfR1NfQ29tcHV0ZV9Qb2x5Z29uX0FyZWEocHRyX3BvaW50cywgcG9pbnRzLmxlbmd0aCAvIDMsIHB0cl9hcmVhKTtcclxuXHJcbiAgICAgICAgbGV0IGFyZWEgPSBNb2R1bGUuSEVBUEY2NFtwdHJfYXJlYSAvIDhdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9hcmVhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFyZWE7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9BcmVhID0gSlNfQ29tcHV0ZV9BcmVhID0gZnVuY3Rpb24gKGtleTogbnVtYmVyKSB7XHJcbiAgICAgIGxldCBwdHJfYXJlYSA9IE1vZHVsZS5fbWFsbG9jKDgpO1xyXG5cclxuICAgICAgX0dTX0NvbXB1dGVfQXJlYShrZXksIHB0cl9hcmVhKTtcclxuXHJcbiAgICAgIGxldCBhcmVhID0gTW9kdWxlLkhFQVBGNjRbcHRyX2FyZWEgLyA4XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfYXJlYSk7XHJcblxyXG4gICAgICByZXR1cm4gYXJlYTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Wb2x1bWUgPSBKU19Db21wdXRlX1ZvbHVtZSA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3ZvbHVtZSA9IE1vZHVsZS5fbWFsbG9jKDgpO1xyXG5cclxuICAgICAgX0dTX0NvbXB1dGVfVm9sdW1lKGtleSwgcHRyX3ZvbHVtZSk7XHJcblxyXG4gICAgICBsZXQgdm9sdW1lID0gTW9kdWxlLkhFQVBGNjRbcHRyX3ZvbHVtZSAvIDhdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl92b2x1bWUpO1xyXG5cclxuICAgICAgcmV0dXJuIHZvbHVtZTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSXNfU29saWRfR2VvbWV0cnkgPSBKU19Jc19Tb2xpZF9HZW9tZXRyeSA9XHJcbiAgICAgIF9HU19Jc19Tb2xpZF9HZW9tZXRyeTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0dlb21ldHJ5X0Rpc3RhbmNlID1cclxuICAgICAgSlNfQ29tcHV0ZV9HZW9tZXRyeV9EaXN0YW5jZSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBnZW9tS2V5MTogbnVtYmVyLFxyXG4gICAgICAgIGdlb21LZXkyOiBudW1iZXIsXHJcbiAgICAgICAgcGF0aDE6IEludDMyQXJyYXksXHJcbiAgICAgICAgcGF0aDI6IEludDMyQXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl9kaXN0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIDcpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3BhdGgxID0gbnVsbDtcclxuICAgICAgICBsZXQgcGF0aDFfbGVuID0gMDtcclxuICAgICAgICBpZiAocGF0aDEpIHtcclxuICAgICAgICAgIHB0cl9wYXRoMSA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwYXRoMS5sZW5ndGgpO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQocGF0aDEsIHB0cl9wYXRoMSAvIDQpO1xyXG4gICAgICAgICAgcGF0aDFfbGVuID0gcGF0aDEubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcHRyX3BhdGgyID0gbnVsbDtcclxuICAgICAgICBsZXQgcGF0aDJfbGVuID0gMDtcclxuICAgICAgICBpZiAocGF0aDIpIHtcclxuICAgICAgICAgIHB0cl9wYXRoMiA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwYXRoMi5sZW5ndGgpO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQocGF0aDIsIHB0cl9wYXRoMiAvIDQpO1xyXG4gICAgICAgICAgcGF0aDJfbGVuID0gcGF0aDIubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX0dTX0NvbXB1dGVfR2VvbWV0cnlfRGlzdGFuY2UoXHJcbiAgICAgICAgICBnZW9tS2V5MSxcclxuICAgICAgICAgIGdlb21LZXkyLFxyXG4gICAgICAgICAgcHRyX3BhdGgxLFxyXG4gICAgICAgICAgcGF0aDFfbGVuLFxyXG4gICAgICAgICAgcHRyX3BhdGgyLFxyXG4gICAgICAgICAgcGF0aDJfbGVuLFxyXG4gICAgICAgICAgcHRyX2Rpc3RcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheSg3KTtcclxuICAgICAgICByZXN1bHRbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfZGlzdCAvIDRdO1xyXG4gICAgICAgIHJlc3VsdFsxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9kaXN0IC8gNCArIDFdO1xyXG4gICAgICAgIHJlc3VsdFsyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9kaXN0IC8gNCArIDJdO1xyXG4gICAgICAgIHJlc3VsdFszXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9kaXN0IC8gNCArIDNdO1xyXG4gICAgICAgIHJlc3VsdFs0XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9kaXN0IC8gNCArIDRdO1xyXG4gICAgICAgIHJlc3VsdFs1XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9kaXN0IC8gNCArIDVdO1xyXG4gICAgICAgIHJlc3VsdFs2XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9kaXN0IC8gNCArIDZdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2Rpc3QpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGF0aDEpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGF0aDIpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NlZ21lbnRfVG9fU3RyZWFtID0gSlNfU2VnbWVudF9Ub19TdHJlYW0gPVxyXG4gICAgICBmdW5jdGlvbiAoKTogQXJyYXlCdWZmZXIge1xyXG4gICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfc2l6ZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2VnbWVudF9Ub19TdHJlYW0ocHRyX2RhdGEsIHB0cl9zaXplKTtcclxuXHJcbiAgICAgICAgbGV0IGxvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9kYXRhIC8gNF07XHJcbiAgICAgICAgbGV0IHNpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9zaXplIC8gNF07XHJcblxyXG4gICAgICAgIGxldCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc2l6ZSk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgcmVzdWx0LnNldChNb2R1bGUuSEVBUDguc3ViYXJyYXkobG9jYSwgbG9jYSArIHNpemUpKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKGxvY2EpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zaXplKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZWdtZW50X1RvX1N0cmVhbV9CeV9LZXkgPSBKU19TZWdtZW50X1RvX1N0cmVhbV9CeV9LZXkgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIpOiBBcnJheUJ1ZmZlciB7XHJcbiAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9zaXplID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIF9HU19TZWdtZW50X1RvX1N0cmVhbV9CeV9LZXkoa2V5LCBwdHJfZGF0YSwgcHRyX3NpemUpO1xyXG5cclxuICAgICAgICBsZXQgbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX2RhdGEgLyA0XTtcclxuICAgICAgICBsZXQgc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3NpemUgLyA0XTtcclxuXHJcbiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihzaXplKTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgICAgICByZXN1bHQuc2V0KE1vZHVsZS5IRUFQOC5zdWJhcnJheShsb2NhLCBsb2NhICsgc2l6ZSkpO1xyXG4gICAgICAgIHJldHVybiBidWZmZXI7XHJcbiAgICAgIH07XHJcblxyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NlZ21lbnRfVG9fU3RyZWFtX1dpdGhfQ29tcHJlc3Npb24gPVxyXG4gICAgICBKU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uID0gZnVuY3Rpb24gKCk6IEFycmF5QnVmZmVyIHtcclxuICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3NpemUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1NlZ21lbnRfVG9fU3RyZWFtX1dpdGhfQ29tcHJlc3Npb24ocHRyX2RhdGEsIHB0cl9zaXplKTtcclxuXHJcbiAgICAgICAgbGV0IGxvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9kYXRhIC8gNF07XHJcbiAgICAgICAgbGV0IHNpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9zaXplIC8gNF07XHJcblxyXG4gICAgICAgIGxldCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc2l6ZSk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgcmVzdWx0LnNldChNb2R1bGUuSEVBUDguc3ViYXJyYXkobG9jYSwgbG9jYSArIHNpemUpKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKGxvY2EpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zaXplKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uX0J5X0tleSA9XHJcbiAgICAgIEpTX1NlZ21lbnRfVG9fU3RyZWFtX1dpdGhfQ29tcHJlc3Npb25fQnlfS2V5ID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleTogbnVtYmVyXHJcbiAgICAgICk6IEFycmF5QnVmZmVyIHtcclxuICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3NpemUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1NlZ21lbnRfVG9fU3RyZWFtX1dpdGhfQ29tcHJlc3Npb25fQnlfS2V5KGtleSwgcHRyX2RhdGEsIHB0cl9zaXplKTtcclxuXHJcbiAgICAgICAgbGV0IGxvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9kYXRhIC8gNF07XHJcbiAgICAgICAgbGV0IHNpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9zaXplIC8gNF07XHJcblxyXG4gICAgICAgIGxldCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc2l6ZSk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgcmVzdWx0LnNldChNb2R1bGUuSEVBUDguc3ViYXJyYXkobG9jYSwgbG9jYSArIHNpemUpKTtcclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgICB9O1xyXG5cclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fVG9fU2VnbWVudF9CeV9LZXkgPSBKU19TdHJlYW1fVG9fU2VnbWVudF9CeV9LZXkgPVxyXG4gICAgICBmdW5jdGlvbiAoZGF0YTogQXJyYXlCdWZmZXIsIG93bmVyX2tleTogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgbGV0IGFycmF5ID0gbmV3IEludDhBcnJheShkYXRhKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVA4LnNldChhcnJheSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgICBsZXQga2V5ID0gX0dTX1N0cmVhbV9Ub19TZWdtZW50X0J5X0tleShcclxuICAgICAgICAgIHB0cl9kYXRhLFxyXG4gICAgICAgICAgZGF0YS5ieXRlTGVuZ3RoLFxyXG4gICAgICAgICAgb3duZXJfa2V5XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgYXJyYXkgPSBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1N0cmVhbV9Ub19TZWdtZW50X0J5X0tleV9UdCA9XHJcbiAgICAgIEpTX1N0cmVhbV9Ub19TZWdtZW50X0J5X0tleV9UdCA9IGZ1bmN0aW9uIChcclxuICAgICAgICBkYXRhOiBBcnJheUJ1ZmZlcixcclxuICAgICAgICBvd25lcl9rZXk6IG51bWJlcixcclxuICAgICAgICBubzogbnVtYmVyLFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXJcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgbGV0IGFycmF5ID0gbmV3IEludDhBcnJheShkYXRhKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVA4LnNldChhcnJheSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgICBsZXQga2V5ID0gX0dTX1N0cmVhbV9Ub19TZWdtZW50X0J5X0tleV9UdChcclxuICAgICAgICAgIHB0cl9kYXRhLFxyXG4gICAgICAgICAgZGF0YS5ieXRlTGVuZ3RoLFxyXG4gICAgICAgICAgb3duZXJfa2V5LFxyXG4gICAgICAgICAgbm8sXHJcbiAgICAgICAgICB2aWV3X2tleVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgIGFycmF5ID0gbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbl9Ub19TZWdtZW50X0J5X0tleSA9XHJcbiAgICAgIEpTX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uX1RvX1NlZ21lbnRfQnlfS2V5ID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGRhdGE6IEFycmF5QnVmZmVyLFxyXG4gICAgICAgIG93bmVyX2tleTogbnVtYmVyLFxyXG4gICAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyhkYXRhLmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuXHJcbiAgICAgICAgbGV0IGFycmF5ID0gbmV3IEludDhBcnJheShkYXRhKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVA4LnNldChhcnJheSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgICBsZXQga2V5ID0gX0dTX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uX1RvX1NlZ21lbnRfQnlfS2V5KFxyXG4gICAgICAgICAgcHRyX2RhdGEsXHJcbiAgICAgICAgICBkYXRhLmJ5dGVMZW5ndGgsXHJcbiAgICAgICAgICBvd25lcl9rZXksXHJcbiAgICAgICAgICBwdHJfb3B0aW9uc1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcbiAgICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgICBhcnJheSA9IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2VnbWVudF9EYXRhX1RvX1N0cmVhbSA9IEpTX1NlZ21lbnRfRGF0YV9Ub19TdHJlYW0gPVxyXG4gICAgICBmdW5jdGlvbiAoKTogQXJyYXlCdWZmZXIge1xyXG4gICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfc2l6ZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2VnbWVudF9EYXRhX1RvX1N0cmVhbShwdHJfZGF0YSwgcHRyX3NpemUpO1xyXG5cclxuICAgICAgICBsZXQgbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX2RhdGEgLyA0XTtcclxuICAgICAgICBsZXQgc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3NpemUgLyA0XTtcclxuXHJcbiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihzaXplKTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgICAgICByZXN1bHQuc2V0KE1vZHVsZS5IRUFQOC5zdWJhcnJheShsb2NhLCBsb2NhICsgc2l6ZSkpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUobG9jYSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kYXRhKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3NpemUpO1xyXG5cclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1N0cmVhbV9Ub19TZWdtZW50X0RhdGEgPSBKU19TdHJlYW1fVG9fU2VnbWVudF9EYXRhID1cclxuICAgICAgZnVuY3Rpb24gKGRhdGE6IEFycmF5QnVmZmVyKSB7XHJcbiAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgbGV0IGFycmF5ID0gbmV3IEludDhBcnJheShkYXRhKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVA4LnNldChhcnJheSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgICBsZXQga2V5ID0gX0dTX1N0cmVhbV9Ub19TZWdtZW50X0RhdGEocHRyX2RhdGEsIGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgIGFycmF5ID0gbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19HZW9tZXRyeV9EYXRhX1RvX1N0cmVhbSA9IEpTX0dlb21ldHJ5X0RhdGFfVG9fU3RyZWFtID1cclxuICAgICAgZnVuY3Rpb24gKCk6IEFycmF5QnVmZmVyIHtcclxuICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3NpemUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX0dlb21ldHJ5X0RhdGFfVG9fU3RyZWFtKHB0cl9kYXRhLCBwdHJfc2l6ZSk7XHJcblxyXG4gICAgICAgIGxldCBsb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfZGF0YSAvIDRdO1xyXG4gICAgICAgIGxldCBzaXplID0gTW9kdWxlLkhFQVAzMltwdHJfc2l6ZSAvIDRdO1xyXG5cclxuICAgICAgICBsZXQgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHNpemUpO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICAgIHJlc3VsdC5zZXQoTW9kdWxlLkhFQVA4LnN1YmFycmF5KGxvY2EsIGxvY2EgKyBzaXplKSk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShsb2NhKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfc2l6ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBidWZmZXI7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfR2VvbWV0cnlfRGF0YV9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbiA9XHJcbiAgICAgIEpTX0dlb21ldHJ5X0RhdGFfVG9fU3RyZWFtX1dpdGhfQ29tcHJlc3Npb24gPSBmdW5jdGlvbiAoKTogQXJyYXlCdWZmZXIge1xyXG4gICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfc2l6ZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfR2VvbWV0cnlfRGF0YV9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbihwdHJfZGF0YSwgcHRyX3NpemUpO1xyXG5cclxuICAgICAgICBsZXQgbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX2RhdGEgLyA0XTtcclxuICAgICAgICBsZXQgc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3NpemUgLyA0XTtcclxuXHJcbiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihzaXplKTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgICAgICByZXN1bHQuc2V0KE1vZHVsZS5IRUFQOC5zdWJhcnJheShsb2NhLCBsb2NhICsgc2l6ZSkpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUobG9jYSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kYXRhKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3NpemUpO1xyXG5cclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhID0gSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGEgPVxyXG4gICAgICBmdW5jdGlvbiAoZGF0YTogQXJyYXlCdWZmZXIpIHtcclxuICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyhkYXRhLmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICBsZXQgYXJyYXkgPSBuZXcgSW50OEFycmF5KGRhdGEpO1xyXG5cclxuICAgICAgICBNb2R1bGUuSEVBUDguc2V0KGFycmF5LCBwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgIF9HU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YShwdHJfZGF0YSwgZGF0YS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgYXJyYXkgPSBudWxsO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleSA9XHJcbiAgICAgIEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlcixcclxuICAgICAgICBkYXRhOiBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xyXG4gICAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBsZXQgYXJyYXkgPSBuZXcgSW50OEFycmF5KGRhdGEpO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5IRUFQOC5zZXQoYXJyYXksIHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgICBfR1NfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5KGtleSwgcHRyX2RhdGEsIGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgICBhcnJheSA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xyXG4gICAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5sZW5ndGgpO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5IRUFQOC5zZXQoZGF0YSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgICAgIF9HU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXkoa2V5LCBwdHJfZGF0YSwgZGF0YS5sZW5ndGgpO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXMgPVxyXG4gICAgICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleXM6IEludDMyQXJyYXksXHJcbiAgICAgICAgZGF0YTogQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5XHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcclxuICAgICAgICAgIGxldCBwdHJfa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBrZXlzLmxlbmd0aCk7XHJcbiAgICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyhkYXRhLmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KGtleXMsIHB0cl9rZXlzIC8gNCk7XHJcblxyXG4gICAgICAgICAgbGV0IGFycmF5ID0gbmV3IEludDhBcnJheShkYXRhKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDguc2V0KGFycmF5LCBwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgICAgX0dTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXMoXHJcbiAgICAgICAgICAgIHB0cl9rZXlzLFxyXG4gICAgICAgICAgICBrZXlzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX2RhdGEsXHJcbiAgICAgICAgICAgIGRhdGEuYnl0ZUxlbmd0aFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2tleXMpO1xyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgICBhcnJheSA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xyXG4gICAgICAgICAgbGV0IHB0cl9rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGtleXMubGVuZ3RoKTtcclxuICAgICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKGRhdGEubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChrZXlzLCBwdHJfa2V5cyAvIDQpO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVA4LnNldChkYXRhLCBwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgICAgX0dTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXMoXHJcbiAgICAgICAgICAgIHB0cl9rZXlzLFxyXG4gICAgICAgICAgICBrZXlzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX2RhdGEsXHJcbiAgICAgICAgICAgIGRhdGEubGVuZ3RoXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5cyk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzX1R0ID1cclxuICAgICAgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5c19UdCA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXlzOiBJbnQzMkFycmF5LFxyXG4gICAgICAgIGRhdGE6IEFycmF5QnVmZmVyIHwgVWludDhBcnJheSxcclxuICAgICAgICB2aWV3X2tleTogbnVtYmVyXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcclxuICAgICAgICAgIGxldCBwdHJfa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBrZXlzLmxlbmd0aCk7XHJcbiAgICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyhkYXRhLmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KGtleXMsIHB0cl9rZXlzIC8gNCk7XHJcblxyXG4gICAgICAgICAgbGV0IGFycmF5ID0gbmV3IEludDhBcnJheShkYXRhKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDguc2V0KGFycmF5LCBwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgICAgX0dTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXNfVHQoXHJcbiAgICAgICAgICAgIHB0cl9rZXlzLFxyXG4gICAgICAgICAgICBrZXlzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX2RhdGEsXHJcbiAgICAgICAgICAgIGRhdGEuYnl0ZUxlbmd0aCxcclxuICAgICAgICAgICAgdmlld19rZXlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9rZXlzKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgICAgYXJyYXkgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcclxuICAgICAgICAgIGxldCBwdHJfa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBrZXlzLmxlbmd0aCk7XHJcbiAgICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyhkYXRhLmxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoa2V5cywgcHRyX2tleXMgLyA0KTtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQOC5zZXQoZGF0YSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgICAgIF9HU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzX1R0KFxyXG4gICAgICAgICAgICBwdHJfa2V5cyxcclxuICAgICAgICAgICAga2V5cy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHB0cl9kYXRhLFxyXG4gICAgICAgICAgICBkYXRhLmxlbmd0aCxcclxuICAgICAgICAgICAgdmlld19rZXlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9rZXlzKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX1dpdGhfQ29tcHJlc3Npb24gPVxyXG4gICAgICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9XaXRoX0NvbXByZXNzaW9uID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGRhdGE6IEFycmF5QnVmZmVyXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIGxldCBhcnJheSA9IG5ldyBJbnQ4QXJyYXkoZGF0YSk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQOC5zZXQoYXJyYXksIHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgX0dTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX1dpdGhfQ29tcHJlc3Npb24ocHRyX2RhdGEsIGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgIGFycmF5ID0gbnVsbDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db3B5X1NlZ21lbnRfQnlfS2V5ID0gSlNfQ29weV9TZWdtZW50X0J5X0tleSA9XHJcbiAgICAgIF9HU19Db3B5X1NlZ21lbnRfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfRGF0YWJhc2VfSW5mbyA9IEpTX1Nob3dfRGF0YWJhc2VfSW5mbyA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX2luZm8gPSBNb2R1bGUuX21hbGxvYyg1MTIpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfRGF0YWJhc2VfSW5mbyhrZXksIHB0cl9pbmZvKTtcclxuXHJcbiAgICAgIGxldCBpbmZvID0gVVRGOFRvU3RyaW5nKHB0cl9pbmZvKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW5mbyk7XHJcblxyXG4gICAgICByZXR1cm4gaW5mbztcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19BbGxvY2F0ZWRfTWVtb3J5X1NpemUgPVxyXG4gICAgICBKU19TaG93X0FsbG9jYXRlZF9NZW1vcnlfU2l6ZSA9IF9HU19TaG93X0FsbG9jYXRlZF9NZW1vcnlfU2l6ZTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19FeGVjdXRlX1Rhc2tfUG9zdF9Qcm9jZXNzaW5nID1cclxuICAgICAgSlNfRXhlY3V0ZV9UYXNrX1Bvc3RfUHJvY2Vzc2luZyA9IF9HU19FeGVjdXRlX1Rhc2tfUG9zdF9Qcm9jZXNzaW5nO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NyZWF0ZV9UZXh0dXJlID0gSlNfQ3JlYXRlX1RleHR1cmUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGJ1ZmZlcjogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgX2dsR2VuVGV4dHVyZXMoMSwgYnVmZmVyKTtcclxuICAgICAgaWYgKHdpbmRvdy5HUk9XQUJMRV9IRUFQX0kzMikge1xyXG4gICAgICAgIHJldHVybiBHTC50ZXh0dXJlc1tHUk9XQUJMRV9IRUFQX0kzMigpW2J1ZmZlciA+PiAyXV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIEdMLnRleHR1cmVzW0hFQVAzMltidWZmZXIgPj4gMl1dO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0Jvb2xlYW5fSW50ZXJzZWN0aW9uX0dyYXBoID1cclxuICAgICAgSlNfQm9vbGVhbl9JbnRlcnNlY3Rpb25fR3JhcGggPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgICAgICAgaW5kZXhlczogSW50MzJBcnJheSxcclxuICAgICAgICByb290OiBGbG9hdDY0QXJyYXksXHJcbiAgICAgICAgbm9ybWFsOiBGbG9hdDY0QXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBwdHJfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoOCAqIHBvaW50cy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBpbmRleGVzLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHB0cl9yb290ID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG4gICAgICAgIGxldCBwdHJfbm9ybWFsID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG5cclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQocG9pbnRzLCBwdHJfcG9pbnRzIC8gOCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoaW5kZXhlcywgcHRyX2luZGV4ZXMgLyA0KTtcclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQocm9vdCwgcHRyX3Jvb3QgLyA4KTtcclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQobm9ybWFsLCBwdHJfbm9ybWFsIC8gOCk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfaW50ZXJfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9pbnRlcl9wb3NfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX2ludGVyX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX2ludGVyX2lkeF9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBfR1NfQm9vbGVhbl9JbnRlcnNlY3Rpb25fR3JhcGgoXHJcbiAgICAgICAgICAgIHB0cl9wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl9pbmRleGVzLFxyXG4gICAgICAgICAgICBpbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3Jvb3QsXHJcbiAgICAgICAgICAgIHB0cl9ub3JtYWwsXHJcbiAgICAgICAgICAgIHB0cl9pbnRlcl9wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl9pbnRlcl9wb3NfY291bnQsXHJcbiAgICAgICAgICAgIHB0cl9pbnRlcl9pbmRleGVzLFxyXG4gICAgICAgICAgICBwdHJfaW50ZXJfaWR4X2NvdW50XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBsZXQgcG9zX2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9pbnRlcl9wb2ludHMgLyA0XTtcclxuICAgICAgICAgIGxldCBwb3Nfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX2ludGVyX3Bvc19jb3VudCAvIDRdICogMztcclxuICAgICAgICAgIGxldCBpbnRlcl9wb2ludHMgPSBuZXcgRmxvYXQ2NEFycmF5KHBvc19zaXplKTtcclxuICAgICAgICAgIGludGVyX3BvaW50cy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHBvc19sb2NhIC8gOCwgcG9zX2xvY2EgLyA4ICsgcG9zX3NpemUpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGxldCBpZHhfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX2ludGVyX2luZGV4ZXMgLyA0XTtcclxuICAgICAgICAgIGxldCBpZHhfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX2ludGVyX2lkeF9jb3VudCAvIDRdO1xyXG4gICAgICAgICAgbGV0IGludGVyX2luZGV4ZXMgPSBuZXcgSW50MzJBcnJheShpZHhfc2l6ZSk7XHJcbiAgICAgICAgICBpbnRlcl9pbmRleGVzLnNldChcclxuICAgICAgICAgICAgTW9kdWxlLkhFQVAzMi5zdWJhcnJheShpZHhfbG9jYSAvIDQsIGlkeF9sb2NhIC8gNCArIGlkeF9zaXplKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocG9zX2xvY2EpO1xyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKGlkeF9sb2NhKTtcclxuXHJcbiAgICAgICAgICByZXN1bHQgPSB7IHBvc2l0aW9uczogaW50ZXJfcG9pbnRzLCBpbmRleGVzOiBpbnRlcl9pbmRleGVzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2ludGVyX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pbnRlcl9wb3NfY291bnQpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW50ZXJfaW5kZXhlcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pbnRlcl9pZHhfY291bnQpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pbmRleGVzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jvb3QpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbm9ybWFsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5bGluZV9Qb2x5Z29uX1h5ID1cclxuICAgICAgSlNfQm9vbGVhbl9JbnRlcnNlY3RfUG9seWxpbmVfUG9seWdvbl9YeSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBwb2x5bGluZV9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgICBwb2x5bGluZV9pbmRleGVzOiBJbnQzMkFycmF5LFxyXG4gICAgICAgIHRvb2xfcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgICAgICAgdG9vbF9pbmRleGVzOiBJbnQzMkFycmF5LFxyXG4gICAgICAgIHJlc3VsdF9wb2ludHM6IEZsb2F0NjRBcnJheVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9wb2x5bGluZV9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogcG9seWxpbmVfcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHB0cl9wb2x5bGluZV9pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvbHlsaW5lX2luZGV4ZXMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3Rvb2xfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoOCAqIHRvb2xfcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHB0cl90b29sX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogdG9vbF9pbmRleGVzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnNldChwb2x5bGluZV9wb2ludHMsIHB0cl9wb2x5bGluZV9wb2ludHMgLyA4KTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChwb2x5bGluZV9pbmRleGVzLCBwdHJfcG9seWxpbmVfaW5kZXhlcyAvIDQpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnNldCh0b29sX3BvaW50cywgcHRyX3Rvb2xfcG9pbnRzIC8gOCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQodG9vbF9pbmRleGVzLCBwdHJfdG9vbF9pbmRleGVzIC8gNCk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfcmVzX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfcmVzX3Bvc19jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfcmVzX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3Jlc19pZHhfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgX0dTX0Jvb2xlYW5fSW50ZXJzZWN0X1BvbHlsaW5lX1BvbHlnb25fWHkoXHJcbiAgICAgICAgICAgIHB0cl9wb2x5bGluZV9wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl9wb2x5bGluZV9pbmRleGVzLFxyXG4gICAgICAgICAgICBwb2x5bGluZV9pbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3Rvb2xfcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfdG9vbF9pbmRleGVzLFxyXG4gICAgICAgICAgICB0b29sX2luZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwdHJfcmVzX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3Jlc19wb3NfY291bnQsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfaW5kZXhlcyxcclxuICAgICAgICAgICAgcHRyX3Jlc19pZHhfY291bnRcclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGxldCBwb3NfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb2ludHMgLyA0XTtcclxuICAgICAgICAgIGxldCBwb3Nfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb3NfY291bnQgLyA0XSAqIDM7XHJcbiAgICAgICAgICBsZXQgcmVzX3BvaW50cyA9IG5ldyBGbG9hdDY0QXJyYXkocG9zX3NpemUpO1xyXG4gICAgICAgICAgcmVzX3BvaW50cy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHBvc19sb2NhIC8gOCwgcG9zX2xvY2EgLyA4ICsgcG9zX3NpemUpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGxldCBpZHhfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19pbmRleGVzIC8gNF07XHJcbiAgICAgICAgICBsZXQgaWR4X3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaWR4X2NvdW50IC8gNF07XHJcbiAgICAgICAgICBsZXQgcmVzX2luZGV4ZXMgPSBuZXcgSW50MzJBcnJheShpZHhfc2l6ZSk7XHJcbiAgICAgICAgICByZXNfaW5kZXhlcy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkoaWR4X2xvY2EgLyA0LCBpZHhfbG9jYSAvIDQgKyBpZHhfc2l6ZSlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHBvc19sb2NhKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShpZHhfbG9jYSk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0geyBwb3NpdGlvbnM6IHJlc19wb2ludHMsIGluZGV4ZXM6IHJlc19pbmRleGVzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX3Bvc19jb3VudCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaW5kZXhlcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaWR4X2NvdW50KTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2x5bGluZV9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9seWxpbmVfaW5kZXhlcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90b29sX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90b29sX2luZGV4ZXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0Jvb2xlYW5fSW50ZXJzZWN0X1BvbHlnb25fUG9seWdvbl9YeSA9XHJcbiAgICAgIEpTX0Jvb2xlYW5fSW50ZXJzZWN0X1BvbHlnb25fUG9seWdvbl9YeSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBwb2x5Z29uX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICAgIHBvbHlnb25faW5kZXhlczogSW50MzJBcnJheSxcclxuICAgICAgICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICAgIHRvb2xfaW5kZXhlczogSW50MzJBcnJheVxyXG4gICAgICAgIC8vIHJlc3VsdF9wb2ludHM6IEZsb2F0NjRBcnJheVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9wb2x5Z29uX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDggKiBwb2x5Z29uX3BvaW50cy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfcG9seWdvbl9pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvbHlnb25faW5kZXhlcy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfdG9vbF9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogdG9vbF9wb2ludHMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3Rvb2xfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiB0b29sX2luZGV4ZXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHBvbHlnb25fcG9pbnRzLCBwdHJfcG9seWdvbl9wb2ludHMgLyA4KTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChwb2x5Z29uX2luZGV4ZXMsIHB0cl9wb2x5Z29uX2luZGV4ZXMgLyA0KTtcclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQodG9vbF9wb2ludHMsIHB0cl90b29sX3BvaW50cyAvIDgpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KHRvb2xfaW5kZXhlcywgcHRyX3Rvb2xfaW5kZXhlcyAvIDQpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3Jlc19wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3Jlc19wb3NfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3Jlc19pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfaWR4X2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIF9HU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5Z29uX1BvbHlnb25fWHkoXHJcbiAgICAgICAgICAgIHB0cl9wb2x5Z29uX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3BvbHlnb25faW5kZXhlcyxcclxuICAgICAgICAgICAgcG9seWdvbl9pbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3Rvb2xfcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfdG9vbF9pbmRleGVzLFxyXG4gICAgICAgICAgICB0b29sX2luZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwdHJfcmVzX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3Jlc19wb3NfY291bnQsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfaW5kZXhlcyxcclxuICAgICAgICAgICAgcHRyX3Jlc19pZHhfY291bnRcclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGxldCBwb3NfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb2ludHMgLyA0XTtcclxuICAgICAgICAgIGxldCBwb3Nfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb3NfY291bnQgLyA0XSAqIDM7XHJcbiAgICAgICAgICBsZXQgcmVzX3BvaW50cyA9IG5ldyBGbG9hdDY0QXJyYXkocG9zX3NpemUpO1xyXG4gICAgICAgICAgcmVzX3BvaW50cy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHBvc19sb2NhIC8gOCwgcG9zX2xvY2EgLyA4ICsgcG9zX3NpemUpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGxldCBpZHhfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19pbmRleGVzIC8gNF07XHJcbiAgICAgICAgICBsZXQgaWR4X3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaWR4X2NvdW50IC8gNF07XHJcbiAgICAgICAgICBsZXQgcmVzX2luZGV4ZXMgPSBuZXcgSW50MzJBcnJheShpZHhfc2l6ZSk7XHJcbiAgICAgICAgICByZXNfaW5kZXhlcy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkoaWR4X2xvY2EgLyA0LCBpZHhfbG9jYSAvIDQgKyBpZHhfc2l6ZSlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHBvc19sb2NhKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShpZHhfbG9jYSk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0geyBwb3NpdGlvbnM6IHJlc19wb2ludHMsIGluZGV4ZXM6IHJlc19pbmRleGVzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX3Bvc19jb3VudCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaW5kZXhlcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaWR4X2NvdW50KTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2x5Z29uX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2x5Z29uX2luZGV4ZXMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdG9vbF9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdG9vbF9pbmRleGVzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Cb29sZWFuX0ludGVyc2VjdF9HcmFwaF9Qb2x5Z29uX1h5ID1cclxuICAgICAgSlNfQm9vbGVhbl9JbnRlcnNlY3RfR3JhcGhfUG9seWdvbl9YeSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBncmFwaF9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgICBncmFwaF9pbmRleGVzOiBJbnQzMkFycmF5LFxyXG4gICAgICAgIHRvb2xfcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgICAgICAgdG9vbF9pbmRleGVzOiBJbnQzMkFycmF5XHJcbiAgICAgICAgLy8gcmVzdWx0X3BvaW50czogRmxvYXQ2NEFycmF5XHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgcHRyX2dyYXBoX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDggKiBncmFwaF9wb2ludHMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX2dyYXBoX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogZ3JhcGhfaW5kZXhlcy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfdG9vbF9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogdG9vbF9wb2ludHMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3Rvb2xfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiB0b29sX2luZGV4ZXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KGdyYXBoX3BvaW50cywgcHRyX2dyYXBoX3BvaW50cyAvIDgpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KGdyYXBoX2luZGV4ZXMsIHB0cl9ncmFwaF9pbmRleGVzIC8gNCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHRvb2xfcG9pbnRzLCBwdHJfdG9vbF9wb2ludHMgLyA4KTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldCh0b29sX2luZGV4ZXMsIHB0cl90b29sX2luZGV4ZXMgLyA0KTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9yZXNfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfcG9zX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfcmVzX2lkeF9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBfR1NfQm9vbGVhbl9JbnRlcnNlY3RfR3JhcGhfUG9seWdvbl9YeShcclxuICAgICAgICAgICAgcHRyX2dyYXBoX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX2dyYXBoX2luZGV4ZXMsXHJcbiAgICAgICAgICAgIGdyYXBoX2luZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwdHJfdG9vbF9wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl90b29sX2luZGV4ZXMsXHJcbiAgICAgICAgICAgIHRvb2xfaW5kZXhlcy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfcmVzX3Bvc19jb3VudCxcclxuICAgICAgICAgICAgcHRyX3Jlc19pbmRleGVzLFxyXG4gICAgICAgICAgICBwdHJfcmVzX2lkeF9jb3VudFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgbGV0IHBvc19sb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX3BvaW50cyAvIDRdO1xyXG4gICAgICAgICAgbGV0IHBvc19zaXplID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX3Bvc19jb3VudCAvIDRdICogMztcclxuICAgICAgICAgIGxldCByZXNfcG9pbnRzID0gbmV3IEZsb2F0NjRBcnJheShwb3Nfc2l6ZSk7XHJcbiAgICAgICAgICByZXNfcG9pbnRzLnNldChcclxuICAgICAgICAgICAgTW9kdWxlLkhFQVBGNjQuc3ViYXJyYXkocG9zX2xvY2EgLyA4LCBwb3NfbG9jYSAvIDggKyBwb3Nfc2l6ZSlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgbGV0IGlkeF9sb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX2luZGV4ZXMgLyA0XTtcclxuICAgICAgICAgIGxldCBpZHhfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19pZHhfY291bnQgLyA0XTtcclxuICAgICAgICAgIGxldCByZXNfaW5kZXhlcyA9IG5ldyBJbnQzMkFycmF5KGlkeF9zaXplKTtcclxuICAgICAgICAgIHJlc19pbmRleGVzLnNldChcclxuICAgICAgICAgICAgTW9kdWxlLkhFQVAzMi5zdWJhcnJheShpZHhfbG9jYSAvIDQsIGlkeF9sb2NhIC8gNCArIGlkeF9zaXplKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocG9zX2xvY2EpO1xyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKGlkeF9sb2NhKTtcclxuXHJcbiAgICAgICAgICByZXN1bHQgPSB7IHBvc2l0aW9uczogcmVzX3BvaW50cywgaW5kZXhlczogcmVzX2luZGV4ZXMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfcG9zX2NvdW50KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19pbmRleGVzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19pZHhfY291bnQpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2dyYXBoX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ncmFwaF9pbmRleGVzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Rvb2xfcG9pbnRzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Rvb2xfaW5kZXhlcyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQm9vbGVhbl9TdWJ0cmFjdF9Qb2x5Z29uX1BvbHlnb25fWHkgPVxyXG4gICAgICBKU19Cb29sZWFuX1N1YnRyYWN0X1BvbHlnb25fUG9seWdvbl9YeSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBwb2x5Z29uX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICAgIHBvbHlnb25faW5kZXhlczogSW50MzJBcnJheSxcclxuICAgICAgICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICAgIHRvb2xfaW5kZXhlczogSW50MzJBcnJheVxyXG4gICAgICAgIC8vIHJlc3VsdF9wb2ludHM6IEZsb2F0NjRBcnJheVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9wb2x5Z29uX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDggKiBwb2x5Z29uX3BvaW50cy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfcG9seWdvbl9pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvbHlnb25faW5kZXhlcy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfdG9vbF9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogdG9vbF9wb2ludHMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3Rvb2xfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiB0b29sX2luZGV4ZXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHBvbHlnb25fcG9pbnRzLCBwdHJfcG9seWdvbl9wb2ludHMgLyA4KTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChwb2x5Z29uX2luZGV4ZXMsIHB0cl9wb2x5Z29uX2luZGV4ZXMgLyA0KTtcclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQodG9vbF9wb2ludHMsIHB0cl90b29sX3BvaW50cyAvIDgpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KHRvb2xfaW5kZXhlcywgcHRyX3Rvb2xfaW5kZXhlcyAvIDQpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3Jlc19wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3Jlc19wb3NfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3Jlc19pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfaWR4X2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIF9HU19Cb29sZWFuX1N1YnRyYWN0X1BvbHlnb25fUG9seWdvbl9YeShcclxuICAgICAgICAgICAgcHRyX3BvbHlnb25fcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfcG9seWdvbl9pbmRleGVzLFxyXG4gICAgICAgICAgICBwb2x5Z29uX2luZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwdHJfdG9vbF9wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl90b29sX2luZGV4ZXMsXHJcbiAgICAgICAgICAgIHRvb2xfaW5kZXhlcy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfcmVzX3Bvc19jb3VudCxcclxuICAgICAgICAgICAgcHRyX3Jlc19pbmRleGVzLFxyXG4gICAgICAgICAgICBwdHJfcmVzX2lkeF9jb3VudFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgbGV0IHBvc19sb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX3BvaW50cyAvIDRdO1xyXG4gICAgICAgICAgbGV0IHBvc19zaXplID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX3Bvc19jb3VudCAvIDRdICogMztcclxuICAgICAgICAgIGxldCByZXNfcG9pbnRzID0gbmV3IEZsb2F0NjRBcnJheShwb3Nfc2l6ZSk7XHJcbiAgICAgICAgICByZXNfcG9pbnRzLnNldChcclxuICAgICAgICAgICAgTW9kdWxlLkhFQVBGNjQuc3ViYXJyYXkocG9zX2xvY2EgLyA4LCBwb3NfbG9jYSAvIDggKyBwb3Nfc2l6ZSlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgbGV0IGlkeF9sb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX2luZGV4ZXMgLyA0XTtcclxuICAgICAgICAgIGxldCBpZHhfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19pZHhfY291bnQgLyA0XTtcclxuICAgICAgICAgIGxldCByZXNfaW5kZXhlcyA9IG5ldyBJbnQzMkFycmF5KGlkeF9zaXplKTtcclxuICAgICAgICAgIHJlc19pbmRleGVzLnNldChcclxuICAgICAgICAgICAgTW9kdWxlLkhFQVAzMi5zdWJhcnJheShpZHhfbG9jYSAvIDQsIGlkeF9sb2NhIC8gNCArIGlkeF9zaXplKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocG9zX2xvY2EpO1xyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKGlkeF9sb2NhKTtcclxuXHJcbiAgICAgICAgICByZXN1bHQgPSB7IHBvc2l0aW9uczogcmVzX3BvaW50cywgaW5kZXhlczogcmVzX2luZGV4ZXMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfcG9zX2NvdW50KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19pbmRleGVzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19pZHhfY291bnQpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BvbHlnb25fcG9pbnRzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BvbHlnb25faW5kZXhlcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90b29sX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90b29sX2luZGV4ZXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0Jvb2xlYW5fQ3V0X1BvbHlnb25fUG9seWdvbl9YeSA9XHJcbiAgICAgIEpTX0Jvb2xlYW5fQ3V0X1BvbHlnb25fUG9seWdvbl9YeSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBwb2x5Z29uX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICAgIHBvbHlnb25faW5kZXhlczogSW50MzJBcnJheSxcclxuICAgICAgICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICAgIHRvb2xfaW5kZXhlczogSW50MzJBcnJheVxyXG4gICAgICAgIC8vIHJlc3VsdF9wb2ludHM6IEZsb2F0NjRBcnJheVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9wb2x5Z29uX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDggKiBwb2x5Z29uX3BvaW50cy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfcG9seWdvbl9pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvbHlnb25faW5kZXhlcy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfdG9vbF9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogdG9vbF9wb2ludHMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3Rvb2xfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiB0b29sX2luZGV4ZXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHBvbHlnb25fcG9pbnRzLCBwdHJfcG9seWdvbl9wb2ludHMgLyA4KTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChwb2x5Z29uX2luZGV4ZXMsIHB0cl9wb2x5Z29uX2luZGV4ZXMgLyA0KTtcclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQodG9vbF9wb2ludHMsIHB0cl90b29sX3BvaW50cyAvIDgpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KHRvb2xfaW5kZXhlcywgcHRyX3Rvb2xfaW5kZXhlcyAvIDQpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3Jlc19wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3Jlc19wb3NfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3Jlc19pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfaWR4X2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIF9HU19Cb29sZWFuX0N1dF9Qb2x5Z29uX1BvbHlnb25fWHkoXHJcbiAgICAgICAgICAgIHB0cl9wb2x5Z29uX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3BvbHlnb25faW5kZXhlcyxcclxuICAgICAgICAgICAgcG9seWdvbl9pbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3Rvb2xfcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfdG9vbF9pbmRleGVzLFxyXG4gICAgICAgICAgICB0b29sX2luZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwdHJfcmVzX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3Jlc19wb3NfY291bnQsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfaW5kZXhlcyxcclxuICAgICAgICAgICAgcHRyX3Jlc19pZHhfY291bnRcclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGxldCBwb3NfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb2ludHMgLyA0XTtcclxuICAgICAgICAgIGxldCBwb3Nfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb3NfY291bnQgLyA0XSAqIDM7XHJcbiAgICAgICAgICBsZXQgcmVzX3BvaW50cyA9IG5ldyBGbG9hdDY0QXJyYXkocG9zX3NpemUpO1xyXG4gICAgICAgICAgcmVzX3BvaW50cy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHBvc19sb2NhIC8gOCwgcG9zX2xvY2EgLyA4ICsgcG9zX3NpemUpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGxldCBpZHhfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19pbmRleGVzIC8gNF07XHJcbiAgICAgICAgICBsZXQgaWR4X3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaWR4X2NvdW50IC8gNF07XHJcbiAgICAgICAgICBsZXQgcmVzX2luZGV4ZXMgPSBuZXcgSW50MzJBcnJheShpZHhfc2l6ZSk7XHJcbiAgICAgICAgICByZXNfaW5kZXhlcy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkoaWR4X2xvY2EgLyA0LCBpZHhfbG9jYSAvIDQgKyBpZHhfc2l6ZSlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHBvc19sb2NhKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShpZHhfbG9jYSk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0geyBwb3NpdGlvbnM6IHJlc19wb2ludHMsIGluZGV4ZXM6IHJlc19pbmRleGVzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX3Bvc19jb3VudCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaW5kZXhlcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaWR4X2NvdW50KTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2x5Z29uX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2x5Z29uX2luZGV4ZXMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdG9vbF9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdG9vbF9pbmRleGVzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuXHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQm9vbGVhbl9TdWJ0cmFjdCA9IEpTX0Jvb2xlYW5fU3VidHJhY3QgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGJsYW5rX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICBibGFua19pbmRleGVzOiBJbnQzMkFycmF5LFxyXG4gICAgICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICB0b29sX2luZGV4ZXM6IEludDMyQXJyYXlcclxuICAgICAgLy8gcmVzdWx0X3BvaW50czogRmxvYXQ2NEFycmF5XHJcbiAgICApIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG4gICAgICBsZXQgcHRyX2JsYW5rX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDggKiBibGFua19wb2ludHMubGVuZ3RoKTtcclxuICAgICAgbGV0IHB0cl9ibGFua19pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGJsYW5rX2luZGV4ZXMubGVuZ3RoKTtcclxuICAgICAgbGV0IHB0cl90b29sX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDggKiB0b29sX3BvaW50cy5sZW5ndGgpO1xyXG4gICAgICBsZXQgcHRyX3Rvb2xfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiB0b29sX2luZGV4ZXMubGVuZ3RoKTtcclxuXHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0LnNldChibGFua19wb2ludHMsIHB0cl9ibGFua19wb2ludHMgLyA4KTtcclxuICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoYmxhbmtfaW5kZXhlcywgcHRyX2JsYW5rX2luZGV4ZXMgLyA0KTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHRvb2xfcG9pbnRzLCBwdHJfdG9vbF9wb2ludHMgLyA4KTtcclxuICAgICAgTW9kdWxlLkhFQVAzMi5zZXQodG9vbF9pbmRleGVzLCBwdHJfdG9vbF9pbmRleGVzIC8gNCk7XHJcblxyXG4gICAgICBsZXQgcHRyX3Jlc19wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl9yZXNfcG9zX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfcmVzX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl9yZXNfaWR4X2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgX0dTX0Jvb2xlYW5fU3VidHJhY3QoXHJcbiAgICAgICAgICBwdHJfYmxhbmtfcG9pbnRzLFxyXG4gICAgICAgICAgYmxhbmtfcG9pbnRzLmxlbmd0aCAvIDMsXHJcbiAgICAgICAgICBwdHJfYmxhbmtfaW5kZXhlcyxcclxuICAgICAgICAgIGJsYW5rX2luZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgICAgcHRyX3Rvb2xfcG9pbnRzLFxyXG4gICAgICAgICAgdG9vbF9wb2ludHMubGVuZ3RoIC8gMyxcclxuICAgICAgICAgIHB0cl90b29sX2luZGV4ZXMsXHJcbiAgICAgICAgICB0b29sX2luZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgICAgcHRyX3Jlc19wb2ludHMsXHJcbiAgICAgICAgICBwdHJfcmVzX3Bvc19jb3VudCxcclxuICAgICAgICAgIHB0cl9yZXNfaW5kZXhlcyxcclxuICAgICAgICAgIHB0cl9yZXNfaWR4X2NvdW50XHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcG9zX2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfcG9pbnRzIC8gNF07XHJcbiAgICAgICAgbGV0IHBvc19zaXplID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX3Bvc19jb3VudCAvIDRdICogMztcclxuICAgICAgICBsZXQgcmVzX3BvaW50cyA9IG5ldyBGbG9hdDY0QXJyYXkocG9zX3NpemUpO1xyXG4gICAgICAgIHJlc19wb2ludHMuc2V0KFxyXG4gICAgICAgICAgTW9kdWxlLkhFQVBGNjQuc3ViYXJyYXkocG9zX2xvY2EgLyA4LCBwb3NfbG9jYSAvIDggKyBwb3Nfc2l6ZSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgaWR4X2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaW5kZXhlcyAvIDRdO1xyXG4gICAgICAgIGxldCBpZHhfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19pZHhfY291bnQgLyA0XTtcclxuICAgICAgICBsZXQgcmVzX2luZGV4ZXMgPSBuZXcgSW50MzJBcnJheShpZHhfc2l6ZSk7XHJcbiAgICAgICAgcmVzX2luZGV4ZXMuc2V0KFxyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMi5zdWJhcnJheShpZHhfbG9jYSAvIDQsIGlkeF9sb2NhIC8gNCArIGlkeF9zaXplKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwb3NfbG9jYSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKGlkeF9sb2NhKTtcclxuXHJcbiAgICAgICAgcmVzdWx0ID0geyBwb3NpdGlvbnM6IHJlc19wb2ludHMsIGluZGV4ZXM6IHJlc19pbmRleGVzIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX3BvaW50cyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX3Bvc19jb3VudCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX2luZGV4ZXMpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19pZHhfY291bnQpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ibGFua19wb2ludHMpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2JsYW5rX2luZGV4ZXMpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Rvb2xfcG9pbnRzKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl90b29sX2luZGV4ZXMpO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgfVxyXG59O1xyXG5cclxuKHdpbmRvdyBhcyBhbnkpLkpTX0ZlYXR1cmVfRXh0cnVkZSA9IEpTX0ZlYXR1cmVfRXh0cnVkZSA9IGZ1bmN0aW9uIChcclxuICBwb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICBpbmRleGVzOiBJbnQzMkFycmF5LFxyXG4gIG5vcm1hbDogRmxvYXQ2NEFycmF5LFxyXG4gIG9wdGlvbnM6IHN0cmluZ1xyXG4pIHtcclxuICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuXHJcbiAgbGV0IHB0cl9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogcG9pbnRzLmxlbmd0aCk7XHJcbiAgbGV0IHB0cl9pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGluZGV4ZXMubGVuZ3RoKTtcclxuICBsZXQgcHRyX25vcm1hbCA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuXHJcbiAgTW9kdWxlLkhFQVBGNjQuc2V0KHBvaW50cywgcHRyX3BvaW50cyAvIDgpO1xyXG4gIE1vZHVsZS5IRUFQMzIuc2V0KGluZGV4ZXMsIHB0cl9pbmRleGVzIC8gNCk7XHJcbiAgTW9kdWxlLkhFQVBGNjQuc2V0KG5vcm1hbCwgcHRyX25vcm1hbCAvIDgpO1xyXG5cclxuICBsZXQgcHRyX29wdGlvbnMgPSBudWxsO1xyXG4gIGlmIChvcHRpb25zKSB7XHJcbiAgICBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGxldCBwdHJfcmVzX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gIGxldCBwdHJfcmVzX3Bvc19jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gIGxldCBwdHJfcmVzX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICBsZXQgcHRyX3Jlc19pZHhfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgaWYgKFxyXG4gICAgX0dTX0ZlYXR1cmVfRXh0cnVkZShcclxuICAgICAgcHRyX3BvaW50cyxcclxuICAgICAgcG9pbnRzLmxlbmd0aCAvIDMsXHJcbiAgICAgIHB0cl9pbmRleGVzLFxyXG4gICAgICBpbmRleGVzLmxlbmd0aCxcclxuICAgICAgcHRyX25vcm1hbCxcclxuICAgICAgcHRyX29wdGlvbnMsXHJcbiAgICAgIHB0cl9yZXNfcG9pbnRzLFxyXG4gICAgICBwdHJfcmVzX3Bvc19jb3VudCxcclxuICAgICAgcHRyX3Jlc19pbmRleGVzLFxyXG4gICAgICBwdHJfcmVzX2lkeF9jb3VudFxyXG4gICAgKVxyXG4gICkge1xyXG4gICAgbGV0IHBvc19sb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX3BvaW50cyAvIDRdO1xyXG4gICAgbGV0IHBvc19zaXplID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX3Bvc19jb3VudCAvIDRdICogMztcclxuICAgIGxldCByZXNfcG9pbnRzID0gbmV3IEZsb2F0NjRBcnJheShwb3Nfc2l6ZSk7XHJcbiAgICByZXNfcG9pbnRzLnNldChcclxuICAgICAgTW9kdWxlLkhFQVBGNjQuc3ViYXJyYXkocG9zX2xvY2EgLyA4LCBwb3NfbG9jYSAvIDggKyBwb3Nfc2l6ZSlcclxuICAgICk7XHJcblxyXG4gICAgbGV0IGlkeF9sb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX2luZGV4ZXMgLyA0XTtcclxuICAgIGxldCBpZHhfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19pZHhfY291bnQgLyA0XTtcclxuICAgIGxldCByZXNfaW5kZXhlcyA9IG5ldyBJbnQzMkFycmF5KGlkeF9zaXplKTtcclxuICAgIHJlc19pbmRleGVzLnNldChcclxuICAgICAgTW9kdWxlLkhFQVAzMi5zdWJhcnJheShpZHhfbG9jYSAvIDQsIGlkeF9sb2NhIC8gNCArIGlkeF9zaXplKVxyXG4gICAgKTtcclxuXHJcbiAgICBNb2R1bGUuX2ZyZWUocG9zX2xvY2EpO1xyXG4gICAgTW9kdWxlLl9mcmVlKGlkeF9sb2NhKTtcclxuXHJcbiAgICByZXN1bHQgPSB7IHBvc2l0aW9uczogcmVzX3BvaW50cywgaW5kZXhlczogcmVzX2luZGV4ZXMgfTtcclxuICB9XHJcblxyXG4gIE1vZHVsZS5fZnJlZShwdHJfcmVzX3BvaW50cyk7XHJcbiAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfcG9zX2NvdW50KTtcclxuICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19pbmRleGVzKTtcclxuICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19pZHhfY291bnQpO1xyXG5cclxuICBNb2R1bGUuX2ZyZWUocHRyX3BvaW50cyk7XHJcbiAgTW9kdWxlLl9mcmVlKHB0cl9pbmRleGVzKTtcclxuICBNb2R1bGUuX2ZyZWUocHRyX25vcm1hbCk7XHJcblxyXG4gIGlmIChwdHJfb3B0aW9ucykge1xyXG4gICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbih3aW5kb3cgYXMgYW55KS5KU19QbGFuYXJfUG9seWxpbmVfT2Zmc2V0ID0gSlNfUGxhbmFyX1BvbHlsaW5lX09mZnNldCA9XHJcbiAgZnVuY3Rpb24gKHBvaW50czogRmxvYXQ2NEFycmF5LCBvZmZzZXRfdmFsdWU6IG51bWJlcikge1xyXG4gICAgbGV0IHJlc3VsdCA9IG5ldyBMaXN0PEZsb2F0NjRBcnJheT4oKTtcclxuXHJcbiAgICBsZXQgcHRyX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDggKiBwb2ludHMubGVuZ3RoKTtcclxuICAgIE1vZHVsZS5IRUFQRjY0LnNldChwb2ludHMsIHB0cl9wb2ludHMgLyA4KTtcclxuXHJcbiAgICBsZXQgcHRyX3Jlc19wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgIGxldCBwdHJfcmVzX3Bvc19jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgX0dTX1BsYW5hcl9Qb2x5bGluZV9PZmZzZXQoXHJcbiAgICAgICAgcHRyX3BvaW50cyxcclxuICAgICAgICBwb2ludHMubGVuZ3RoIC8gMyxcclxuICAgICAgICBvZmZzZXRfdmFsdWUsXHJcbiAgICAgICAgcHRyX3Jlc19wb2ludHMsXHJcbiAgICAgICAgcHRyX3Jlc19wb3NfY291bnRcclxuICAgICAgKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwb3NfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb2ludHMgLyA0XTtcclxuICAgICAgbGV0IHBvc19zaXplID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX3Bvc19jb3VudCAvIDRdICogMztcclxuICAgICAgbGV0IHJlc19wb2ludHMgPSBuZXcgRmxvYXQ2NEFycmF5KHBvc19zaXplKTtcclxuICAgICAgcmVzX3BvaW50cy5zZXQoXHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc3ViYXJyYXkocG9zX2xvY2EgLyA4LCBwb3NfbG9jYSAvIDggKyBwb3Nfc2l6ZSlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJlc3VsdCA9IERHZW9tZXRyeU9wZXJhdG9ycy5jcmVhdGVQb2x5bGluZXNCeVNlZ21lbnRzKHJlc19wb2ludHMpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHBvc19sb2NhKTtcclxuICAgIH1cclxuXHJcbiAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb2ludHMpO1xyXG4gICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfcG9zX2NvdW50KTtcclxuICAgIE1vZHVsZS5fZnJlZShwdHJfcG9pbnRzKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH07XHJcblxyXG5leHBvcnQgZW51bSBDYW1lcmFDaGFuZ2VUeXBlIHtcclxuICBUcmFuc2xhdGUgPSAxLFxyXG4gIFJvdGF0ZSA9IDIsXHJcbiAgU2NhbGUgPSA0LFxyXG59XHJcbmV4cG9ydCBlbnVtIE9iamVjdFR5cGUge1xyXG4gIFRZUEVfVW5rbm93biA9IDAsXHJcbiAgVFlQRV9TZWdtZW50ID0gMSxcclxuICBUWVBFX0luY2x1ZGUgPSAyLFxyXG4gIFRZUEVfU3R5bGUgPSAzLFxyXG5cclxuICBUWVBFX0RyaXZlciA9IDEwLFxyXG4gIFRZUEVfUmVuZGVyQ29udGV4dCA9IDExLFxyXG4gIFRZUEVfQ29sb3IgPSAxMixcclxuICBUWVBFX1NoYWRlciA9IDEzLFxyXG4gIFRZUEVfVmlld3BvcnQgPSAxNCxcclxuICBUWVBFX0NhbWVyYSA9IDE1LFxyXG4gIFRZUEVfVmlzaWJpbGl0eSA9IDE2LFxyXG4gIFRZUEVfTW9kZWxsaW5nTWF0cml4ID0gMTcsXHJcbiAgVFlQRV9SZW5kZXJpbmdPcHRpb25zID0gMTgsXHJcbiAgVFlQRV9Db25kaXRpb24gPSAxOSxcclxuICBUWVBFX1NlbGVjdGFiaWxpdHkgPSAyMCxcclxuICBUWVBFX0ZvbnQgPSAyMSxcclxuICBUWVBFX0hldXJpc3RpY09wdGlvbnMgPSAyMixcclxuXHJcbiAgLy9UWVBFX01hcmtlclNpemUgPSAzMCxcclxuICAvL1RZUEVfVmVydGV4U2l6ZSA9IDMxLFxyXG4gIC8vVFlQRV9MaW5lV2lkdGggPSAzMixcclxuICAvL1RZUEVfRWRnZVdpZHRoID0gMzMsXHJcblxyXG4gIFRZUEVfTWFya2VyID0gMTAwLFxyXG4gIFRZUEVfTGluZSA9IDEwMSxcclxuICBUWVBFX1BvbHlsaW5lID0gMTAyLFxyXG4gIFRZUEVfQ2lyY2xlID0gMTA2LFxyXG4gIFRZUEVfU2hlbGwgPSAxMDMsXHJcbiAgVFlQRV9NZXNoID0gMTA0LFxyXG4gIFRZUEVfQ3lsaW5kZXIgPSAxMDUsXHJcbiAgVFlQRV9Ucmlhbmd1bGFyU2hlbGwgPSAxMDcsXHJcbiAgLy9UWVBFX0ZhY2VTaGVsbCA9IDEwOCxcclxuICBUWVBFX0N1dHRpbmdQbGFuZXMgPSAxMDksXHJcbiAgVFlQRV9DaXJjdWxhckFyYyA9IDExMCxcclxuICBUWVBFX0VsbGlwc2UgPSAxMTEsXHJcbiAgVFlQRV9FbGxpcHNlQXJjID0gMTEyLFxyXG4gIFRZUEVfUG9seUN5bGluZGVyID0gMTEzLFxyXG4gIFRZUEVfTGlnaHQgPSAxMjAsXHJcbiAgVFlQRV9JbWFnZSA9IDEyMSxcclxuICBUWVBFX1ZlY3RvclRleHQgPSAxMjIsXHJcbiAgVFlQRV9QYXJhbWV0cmljR2VvbWV0cnkgPSAxMjMsXHJcbiAgVFlQRV9Qb2ludENsb3VkID0gMTI0LFxyXG59XHJcbmV4cG9ydCBlbnVtIEVsZW1lbnRUeXBlIHtcclxuICBFTEVNRU5UX1RZUEVfVW5rbm93biA9IDAsXHJcbiAgRUxFTUVOVF9UWVBFX1ZlcnRleCA9IDEsXHJcbiAgRUxFTUVOVF9UWVBFX0VkZ2UgPSAyLFxyXG4gIEVMRU1FTlRfVFlQRV9NYXJrZXIgPSA0LFxyXG4gIEVMRU1FTlRfVFlQRV9MaW5lID0gOCxcclxuICBFTEVNRU5UX1RZUEVfRmFjZSA9IDE2LFxyXG59XHJcbmV4cG9ydCBlbnVtIFZlcnRleFR5cGUge1xyXG4gIFZFUlRFWF9UWVBFX05vbmUgPSAwLFxyXG4gIFZFUlRFWF9UWVBFX0lubmVyID0gMSxcclxuICBWRVJURVhfVFlQRV9Cb3JkZXIgPSAyLFxyXG59XHJcbmV4cG9ydCBlbnVtIEVkZ2VUeXBlIHtcclxuICBFREdFX1RZUEVfTm9uZSA9IDAsXHJcbiAgRURHRV9UWVBFX0lubmVyID0gMSxcclxuICBFREdFX1RZUEVfQm9yZGVyID0gMixcclxufVxyXG5leHBvcnQgZW51bSBWaWV3TW9kZSB7XHJcbiAgWFksXHJcbiAgWVgsXHJcbiAgWFosXHJcbiAgWlgsXHJcbiAgWVosXHJcbiAgWlksXHJcbiAgSXNvLFxyXG4gIEVOLFxyXG4gIE5XLFxyXG4gIFdTLFxyXG4gIFNFLFxyXG4gIFRvcEUsXHJcbiAgQm90dG9tRSxcclxuICBUb3BOLFxyXG4gIEJvdHRvbU4sXHJcbiAgVG9wVyxcclxuICBCb3R0b21XLFxyXG4gIFRvcFMsXHJcbiAgQm90dG9tUyxcclxuICBUb3BFTixcclxuICBCb3R0b21FTixcclxuICBUb3BOVyxcclxuICBCb3R0b21OVyxcclxuICBUb3BXUyxcclxuICBCb3R0b21XUyxcclxuICBUb3BTRSxcclxuICBCb3R0b21TRSxcclxuICBZVXBJc28sXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIENvb3JkaW5hdGVTeXN0ZW0ge1xyXG4gIHdpbmRvdyxcclxuICBwaXhlbHMsXHJcbiAgd29ybGQsXHJcbiAgb2JqZWN0LFxyXG4gIHZpZXdwb2ludCxcclxufVxyXG5cclxuZXhwb3J0IGVudW0gVXBkYXRlVHlwZSB7XHJcbiAgLyoq5ZCM5q2l5pu05pawICovXHJcbiAgU3luY2hyb25pemF0aW9uLFxyXG4gIC8qKuW8guatpeabtOaWsCAqL1xyXG4gIEFzeW5jaHJvbml6YXRpb24sXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEFyZWFTZWxlY3Rpb25UeXBlIHtcclxuICBUb3VjaEFuZENvbnRhaW4gPSAwLFxyXG4gIENvbnRhaW4gPSAxLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBGb250VW5pdHNUeXBlIHtcclxuICBQb2ludHMgPSAxLFxyXG4gIFBpeGVscyA9IDIsXHJcbiAgT2JqZWN0ID0gMyxcclxuICBXb3JsZCA9IDQsXHJcbiAgV2luZG93ID0gNSxcclxufVxyXG5cclxuZXhwb3J0IGVudW0gVGV4dEFsaWdubWVudCB7XHJcbiAgTGVmdEJvdHRvbSA9IDEsXHJcbiAgTGVmdENlbnRlciA9IDIsXHJcbiAgTGVmdFRvcCA9IDMsXHJcbiAgQ2VudGVyQm90dG9tID0gNCxcclxuICBDZW50ZXJDZW50ZXIgPSA1LFxyXG4gIENlbnRlclRvcCA9IDYsXHJcbiAgUmlnaHRCb3R0b20gPSA3LFxyXG4gIFJpZ2h0Q2VudGVyID0gOCxcclxuICBSaWdodFRvcCA9IDksXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIExpZ2h0aW5nTW9kZSB7XHJcbiAgTm9uZSA9IDAsXHJcbiAgUGhvbmcgPSAxLFxyXG4gIEJsaW5uUGhvbmcgPSAyLFxyXG4gIExhbWJlcnQgPSAzLFxyXG4gIEhhbGZMYW1iZXJ0ID0gNCxcclxuICBCYW5kZWQgPSA1LFxyXG4gIFBCUiA9IDYsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIENvbGxpc2lvblR5cGUge1xyXG4gIE5vbmUgPSAwLFxyXG4gIC8qKiDnoaznorDmkp4gKi9cclxuICBJbnRlcnNlY3QgPSAxLFxyXG4gIC8qKiDmjqXop6bnorDmkp4gKi9cclxuICBUb3VjaCA9IDIsXHJcbiAgLyoqIOWMheWQqyAqL1xyXG4gIENvbnRhaW4gPSA0LFxyXG4gIC8qKiDova/norDmkp4gKi9cclxuICBTb2Z0ID0gOCxcclxufVxyXG5cclxuZXhwb3J0IGVudW0gR0xUeXBlcyB7XHJcbiAgQllURSA9IDB4MTQwMCxcclxuICBVTlNJR05FRF9CWVRFID0gMHgxNDAxLFxyXG4gIFNIT1JUID0gMHgxNDAyLFxyXG4gIFVOU0lHTkVEX1NIT1JUID0gMHgxNDAzLFxyXG4gIElOVCA9IDB4MTQwNCxcclxuICBVTlNJR05FRF9JTlQgPSAweDE0MDUsXHJcbiAgRkxPQVQgPSAweDE0MDYsXHJcbiAgRE9VQkxFID0gMHgxNDBhLFxyXG4gIFNUQVRJQ19EUkFXID0gMHg4OGU0LFxyXG4gIERZTkFNSUNfRFJBVyA9IDB4ODhlOCxcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFZpZXdlciB7XHJcbiAgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xyXG4gIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xyXG4gIC8qKiDmnIDlpKflhoXlrZjns7vmlbAgKi9cclxuICBtYXhNZW1vcnlGYWN0b3IgPSAwLjg7XHJcblxyXG4gIHByb3RlY3RlZCBfdmlld0tleTogbnVtYmVyID0gLTE7XHJcbiAgcHJvdGVjdGVkIF9zY2VuZUtleTogbnVtYmVyID0gLTE7XHJcbiAgcHJvdGVjdGVkIF9tb2RlbEtleTogbnVtYmVyID0gLTE7XHJcbiAgcHJvdGVjdGVkIF9zdHlsZUtleTogbnVtYmVyID0gLTE7XHJcbiAgcHJvdGVjdGVkIF9iYWNrZ3JvdW5kS2V5OiBudW1iZXIgPSAtMTtcclxuICBwcm90ZWN0ZWQgX3NjcmVlbktleTogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8vYXR0cmlidXRlc1xyXG4gIHByb3RlY3RlZCBfd2lkdGggPSA2MDA7XHJcbiAgcHJvdGVjdGVkIF9oZWlnaHQgPSA0MDA7XHJcbiAgcHJvdGVjdGVkIF9hc3BlY3RSYXRpbyA9IDE7XHJcblxyXG4gIC8vLy9pbnB1dHNcclxuICAvL2xCdXR0b25Eb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy9yQnV0dG9uRG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8vbUJ1dHRvbkRvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvL3RvdWNoaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vY2FtZXJhIGF0dHJpYnV0ZXNcclxuICBwcm90ZWN0ZWQgX2NhbWVyYU9yaWVudGF0aW9uRml4ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX3Ntb290aFRyYW5zaXRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByb3RlY3RlZCBfc21vb3RoVHJhbnNpdGlvbkR1cmF0aW9uOiBudW1iZXIgPSA1MDA7XHJcblxyXG4gIHNjZW5lQ2FtZXJhQ2hhbmdpbmc6IExpc3Q8RnVuY3Rpb24+ID0gbmV3IExpc3Q8RnVuY3Rpb24+KCk7XHJcbiAgc2NlbmVDYW1lcmFDaGFuZ2VkOiBMaXN0PEZ1bmN0aW9uPiA9IG5ldyBMaXN0PEZ1bmN0aW9uPigpO1xyXG4gIGRvY3VtZW50Q2hhbmdlZDogTGlzdDxGdW5jdGlvbj4gPSBuZXcgTGlzdDxGdW5jdGlvbj4oKTtcclxuICBjb2xsaXNpb25Db21wdXRpbmc6IExpc3Q8RnVuY3Rpb24+ID0gbmV3IExpc3Q8RnVuY3Rpb24+KCk7XHJcbiAgY29sbGlzaW9uQ29tcHV0ZWQ6IExpc3Q8RnVuY3Rpb24+ID0gbmV3IExpc3Q8RnVuY3Rpb24+KCk7XHJcbiAgZ2VvbWV0cnlJdGVtOiBMaXN0PEZ1bmN0aW9uPiA9IG5ldyBMaXN0PEZ1bmN0aW9uPigpO1xyXG4gIGdlb21ldHJ5SXRlbXM6IExpc3Q8RnVuY3Rpb24+ID0gbmV3IExpc3Q8RnVuY3Rpb24+KCk7XHJcbiAgZ2VvbWV0cnlEcmF3RmluaXNoOiBMaXN0PEZ1bmN0aW9uPiA9IG5ldyBMaXN0PEZ1bmN0aW9uPigpO1xyXG5cclxuICB6b29tTGltaXQgPSAwLjAwMDAwMTtcclxuICBpbWFnZVVybHMgPSB7fTtcclxuXHJcbiAgLy9ldmVudHNcclxuICBwcm90ZWN0ZWQgX29uUmVzaXplID0gbnVsbDtcclxuXHJcbiAgcHJvdGVjdGVkIF90ZXN0R3NsSWQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVR5cGU6IFVwZGF0ZVR5cGUgPSBVcGRhdGVUeXBlLlN5bmNocm9uaXphdGlvbjtcclxuICBwcml2YXRlIF9ydW5uaW5nID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICog5b2T5YmNdmlld2Vy55qEaXNCdXN554q25oCBXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfaXNCdXN5ID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICog6byg5qCHVXDml7bvvIx2aWV3ZXLopoHlj5jmiJDnmoTnirbmgIFcclxuICAgKi9cclxuICAvLyBwcml2YXRlIF9idXR0b25VcElzQnVzeSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzVXBkYXRlVHQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1NoYXJlZEFycmF5QnVmZmVyID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNDYWNoZSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3ByZXZpb3VzVXBkYXRlS2V5c0xlbmd0aDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2R5bmFtaWNNZW1vcnk6IER5bmFtaWNNZW1vcnlUeXBlID0gRHluYW1pY01lbW9yeVR5cGUuTm9uZTtcclxuXHJcbiAgcHJvdGVjdGVkIF9jdXJyZW50TWVtb3J5U2l6ZTogbnVtYmVyID0gLTE7XHJcblxyXG4gIHByaXZhdGUgeGhyTGlzdCA9IG5ldyBMaXN0PGFueT4oKTtcclxuXHJcbiAgcHVibGljIGdldEFzeW5Hcm91cEdlb0RhdGFBY3Rpb246IChcclxuICAgIG1vZGVsSWQ6IHN0cmluZyxcclxuICAgIHZlcnNpb246IG51bWJlclxyXG4gICkgPT4geyBodHRwVHlwZTogc3RyaW5nOyB1cmw6IHN0cmluZyB9ID0gbnVsbDtcclxuICBwdWJsaWMgZ2V0QXN5bkltYWdlQWN0aW9uOiB7IGh0dHBUeXBlOiBzdHJpbmc7IHVybDogc3RyaW5nIH07XHJcbiAgLy/liqDovb3kuK3nmoRzZWdtZW50TGlzdC5cclxuICBwcm90ZWN0ZWQgX2xvYWRpbmdMaXN0OiB7IFtpZDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICBwcm90ZWN0ZWQgX2xvYWRpbmdMaXN0Q291bnQgPSAwO1xyXG5cclxuICBwcm90ZWN0ZWQgX2J1ZmZlclZhb05vOiBudW1iZXIgPSAwO1xyXG4gIHByb3RlY3RlZCBfYnVmZmVyVmFvTGlzdE1hcE5vOiB7IFtubzogbnVtYmVyXTogbnVtYmVyW10gfSA9IHt9O1xyXG5cclxuICBwcml2YXRlIF9idWZmZXJLZXlDb3VudCA9IDA7XHJcblxyXG4gIC8vYXN5bkxvYWRlZENvdW50OiBudW1iZXIgPSAwO1xyXG4gIC8vYXN5bkxvYWRpbmdDb3VudDogbnVtYmVyID0gMDtcclxuICAvL2FzeW5WaWV3TG9hZFBlcmNlbnQ6IExpc3Q8KHBlcmNlbnQ6IG51bWJlcikgPT4gdm9pZD4gPSBuZXcgTGlzdDwocGVyY2VudDogbnVtYmVyKSA9PiB2b2lkPigpO1xyXG4gIC8v55yL5Yiw6L+H55qE5omA5pyJ5Yeg5L2VLOW8guatpeWKoOi9veWujOavleeahOWbnuiwg+S6i+S7tlxyXG4gIC8vYXN5blZpZXdBbGxMb2FlZDogTGlzdDxGdW5jdGlvbj4gPSBuZXcgTGlzdDxGdW5jdGlvbj4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIF9vZmZzZXQgPSAwO1xyXG4gIC8vIOaVsOaNruaYr+WQpuWOi+e8qVxyXG4gIHByb3RlY3RlZCBfZ2VvRGF0YUlzQ29tcHJlc3Npb24gPSBmYWxzZTtcclxuICAvLyDkuIDnu4Tlh6DkvZUo6Kej5Y6L5YmNKeeahOacgOWkp+aVsOaNrumHj1xyXG4gIHByb3RlY3RlZCBfZ3JvdXBTaXplTGltaXQgPSAxMDI0ICogMTAyNDtcclxuICAvL+Wkmue6v+eoi3VwZGF0ZV92aWV3ZeeahOaJp+ihjOagh+ivhlxyXG4gIHByb3RlY3RlZCBfdGhyZWFkVVBWSXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgLy/lpJrnur/nqIt1cGRhdGVfdmlld2Xlt7Lnu4/lnKhzZXRJbnRlcnZhbOS4reeahOagh+ivhijor6XmoIflv5fkvY3kuLp0cnVl5pe277yM5bCx5LiN6KaB5YaN5Yib5bu65a6a5pe25Zmo5LqGKS5cclxuICBwcm90ZWN0ZWQgX3RocmVhZFVQVklzUHJlcGFyaW5nID0gZmFsc2U7XHJcbiAgLy8tLS0tLS0tLS10aHJlYWRfeHhfVHTnmoRDYW5jZWxsZWTlkoxJc0FnYWlu5ZCM57qnLOWNs+iLpeS4pOS4quagh+W/l+S9jemDveS4unRydWUs5Y+q6ZyA6KaB5omn6KGM5LiA5qyhVHQs5YiZ5Lik5Liq5qCH5b+X5L2N6YO95oGi5aSNZmFsc2UtLS0tLS0tXHJcbiAgLy/lpJrnur/nqIt1cGRhdGVfdmlld2XnmoTmiafooYzooqtjYW5jZWzkuoZcclxuICBwcm90ZWN0ZWQgX3RocmVhZFVQVkNhbmNlbGxlZCA9IGZhbHNlO1xyXG4gIC8vdXBkYXRlX3ZpZXdlX1R05omn6KGM6YCU5Lit5Y+I6KKr6LCD55So5LqG5LiA5qyhLlxyXG4gIHByb3RlY3RlZCBfdGhyZWFkVVBWSXNBZ2FpbiA9IGZhbHNlO1xyXG4gIC8vIFVwZGF0ZUdlb21ldHJ5RGF0YeeahOWkmue6v+eoi+eahOagh+ivhi5cclxuICBwcm90ZWN0ZWQgX3RocmVhZFVQR0RJc1J1bm5pbmcgPSBmYWxzZTtcclxuICAvL+Wkmue6v+eoi1VwZGF0ZUdlb21ldHJ5RGF0YeaJp+ihjOiiq2NhbmNlbOS6hlxyXG4gIHByb3RlY3RlZCBfdGhyZWFkVVBHRENhbmNlbGxlZCA9IGZhbHNlO1xyXG4gIC8vVXBkYXRlR2VvbWV0cnlEYXRhX1R05omn6KGM6YCU5Lit5Y+I6KKr6LCD55So5LqG5LiA5qyhLlxyXG4gIHByb3RlY3RlZCBfdGhyZWFkVVBHRElzQWdhaW4gPSBmYWxzZTtcclxuICAvL3N0cmVhbVRvR2VvbWV0cnlEYXRhX1R05aSa57q/56iL5Ye95pWw5omn6KGM5qCH6K+GXHJcbiAgcHJvdGVjdGVkIF90aHJlYWRTVEdESXNSdW5uaW5nQ291bnQgPSAwO1xyXG4gIC8vIHN0cmVhbVRvU2VnbWVudFR05q2j5Zyo5omn6KGM55qE5qyh5pWwKOetieS6jjDml7booajnpLrmsqHmnInmraPlnKjmiafooYznmoTov5vnqIspLlxyXG4gIHByb3RlY3RlZCBfc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50ID0gMDtcclxuICAvL+ino+WOi+euoeeQhuWZqOeahOi/kOihjOagh+ivhi5cclxuICBwcm90ZWN0ZWQgX2RlY29kZU1hbmFnZXJJc1J1bm5pbmcgPSBmYWxzZTtcclxuICAvL+ivt+axguWHoOS9leaVsOaNrueahOi/lOWbnue7k+aenOWIl+ihqC5cclxuICBwcm90ZWN0ZWQgX2RlY29kaW5nT2JqZWN0TGlzdDogRGVjb2RpbmdPYmplY3RbXSA9IG5ldyBBcnJheTxEZWNvZGluZ09iamVjdD4oKTtcclxuICAvLyDmr4/lpJrlsJHkuKrlh6DkvZXvvIxyZW5kZXJWaWV35LiA5qyhLlxyXG4gIC8vIHByaXZhdGUgX3JlbmRlclZpZXdQZXJHcm91cCA9IDUwMDtcclxuICAvLyBwcml2YXRlIF9yZW5kZXJWaWV3UGVyR3JvdXAgPSAxMDAwO1xyXG4gIC8vIHByaXZhdGUgX3JlbmRlclZpZXdQZXJHcm91cCA9IDIwMDtcclxuICBwcml2YXRlIF9yZW5kZXJWaWV3UGVyR3JvdXAgPSA1MDtcclxuXHJcbiAgLy8g57yT5a2Y55qEa2V5c1xyXG4gIHByb3RlY3RlZCBfY2FjaGVTZWdLZXlzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAvLyDnvJPlrZjnmoTlh6DkvZXmlbDmja5saXN0XHJcbiAgcHJvdGVjdGVkIF9jYWNoZUdlb21ldHJ5RGF0YUxpc3QgPSBuZXcgQXJyYXk8VWludDhBcnJheT4oKTtcclxuICAvLyDnvJPlrZjnmoTmlbDmja7ph4/lpKflsI9cclxuICBwcm90ZWN0ZWQgX2NhY2hlRGF0YVNpemUgPSAwO1xyXG4gIC8qKlxyXG4gICAqIOmcgOimgeWFiOe7mOWItuaJgOaciSjpvKDmoIfmk43kvZxidXN55pe25Lya5Y+q57uY5Yi25LiA6YOo5YiG5Zu+5b2iLilcclxuICAgKi9cclxuICBwdWJsaWMgcmVuZGVyVmlld0FsbCA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiDmj5LlhaXlh6DkvZXnmoRjb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllc+iiq0J1ZmZlcl9HZW9tZXRyeeS4reaWrVxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBjb21BbmRVcGRHZW9Jc0ludGVycnVwdGVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIOaYr+WQpuacieWHoOS9leaVsOaNruato+WcqOmAmui/h3VwZGF0ZURpc3BsYXnov5vooYzliqDovb0uXHJcbiAgICovXHJcbiAgcHVibGljIGlzR2VvbWV0cnlMb2FkaW5nID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICog5q2j5Zyo6K+75Y+W5Yeg5L2V5pWw5o2u55qEc2VnbWVudOeahOaVsOmHjy5cclxuICAgKi9cclxuICBwcml2YXRlIF9zZWdtZW50TG9hZGluZ0NvdW50ID0gMDtcclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIOato+WcqGJ1ZmZlcueahOWHoOS9leaVsOaNruaVsOmHjy5cclxuICAgKi9cclxuICBwdWJsaWMgYnVmZmVyaW5nR2VvbWV0cnlDb3VudCA9IDA7XHJcblxyXG4gIHB1YmxpYyBtb2RlbERlYnVnID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgc3FsV29ya2VyOiBXb3JrZXI7XHJcblxyXG4gIHByaXZhdGUgX3RocmVhZFByb21pc2U6IFRocmVhZFByb21pc2U8VXBkYXRlSW5mbz47XHJcblxyXG4gIC8vIGxvYWRUaW1lRmxhZyA9IHRydWU7XHJcbiAgLy8gcHJvdGVjdGVkIF9uZWVkQXN5blVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvL3B1YmxpYyBvblN0cmVhbVRvU2VnbWVudEZpbmlzaGVkID0gbmV3IE51bWJlcktleUxpc3Q8KGtleTogbnVtYmVyKSA9PiB2b2lkPigpO1xyXG4gIHB1YmxpYyBvbkNvbXB1dGVDb2xsaXNpb25GaW5pc2hlZCA9IG5ldyBOdW1iZXJLZXlMaXN0PChpdGVtOiBbXSkgPT4gdm9pZD4oKTtcclxuXHJcbiAgcHVibGljIGlzRml4RnJhbWVSZW5kZXIgPSB0cnVlO1xyXG5cclxuICBnZXQgYXNwZWN0UmF0aW8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXNwZWN0UmF0aW87XHJcbiAgfVxyXG5cclxuICBzZXQgYXNwZWN0UmF0aW8oYXNwZWN0UmF0aW8pIHtcclxuICAgIHRoaXMuX2FzcGVjdFJhdGlvID0gYXNwZWN0UmF0aW87XHJcbiAgfVxyXG5cclxuICBnZXQgZ2VvRGF0YUlzQ29tcHJlc3Npb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ2VvRGF0YUlzQ29tcHJlc3Npb247XHJcbiAgfVxyXG5cclxuICBzZXQgZ2VvRGF0YUlzQ29tcHJlc3Npb24odmFsdWUpIHtcclxuICAgIHRoaXMuX2dlb0RhdGFJc0NvbXByZXNzaW9uID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgdGhyZWFkSXNSdW5uaW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RocmVhZFVQVklzUnVubmluZyB8fCB0aGlzLl90aHJlYWRVUEdESXNSdW5uaW5nO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlbmRlclZpZXdQZXJHcm91cCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZW5kZXJWaWV3UGVyR3JvdXA7XHJcbiAgfVxyXG5cclxuICBzZXQgcmVuZGVyVmlld1Blckdyb3VwKHZhbHVlKSB7XHJcbiAgICB0aGlzLl9yZW5kZXJWaWV3UGVyR3JvdXAgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBzdHJlYW1Ub1NlZ21lbnRSdW5uaW5nQ291bnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50O1xyXG4gIH1cclxuXHJcbiAgc2V0IHN0cmVhbVRvU2VnbWVudFJ1bm5pbmdDb3VudCh2YWx1ZSkge1xyXG4gICAgdGhpcy5fc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250YWluZXJJZDogc3RyaW5nKSB7XHJcbiAgICBKU19Jbml0X0FwaXMoKTtcclxuICAgIEpTX0luaXRfRGF0YWJhc2UoKTtcclxuICAgIC8vaWYgKCFNb2R1bGVbXCJ0aHJlYWRpbmcgaW5pdGVkXCJdKSB7XHJcbiAgICBKU19Jbml0X011bHRpdGhyZWFkaW5nX1NlcnZpY2VzKG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5KTtcclxuICAgIC8vXHRNb2R1bGVbXCJ0aHJlYWRpbmcgaW5pdGVkXCJdID0gdHJ1ZTtcclxuICAgIC8vfVxyXG5cclxuICAgIGxldCB2aTogVmlld2VyID0gdGhpcztcclxuICAgIHRoaXMuX29uUmVzaXplID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICB2aS51cGRhdGVTaXplKCk7XHJcbiAgICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5jcmVhdGVWaWV3KGNvbnRhaW5lcklkKTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZyhcInNxbFdvcmtlcuWIneWni+WMllwiKTtcclxuICAgIC8vIHRoaXMuc3FsV29ya2VyID0gbmV3IFdvcmtlcihuZXcgVVJMKFwiLi9zcWxpdGUud29ya2VyLmpzXCIsIGltcG9ydC5tZXRhLnVybCkpO1xyXG4gICAgLy8gaW5pdEJhY2tlbmQodGhpcy5zcWxXb3JrZXIpO1xyXG5cclxuICAgIE1vZHVsZVtcIm9uVGFza1Byb2Nlc3NpbmdGaW5pc2hlZFwiXSA9IChcclxuICAgICAgdGFza19pZDogbnVtYmVyLFxyXG4gICAgICB0eXBlOiBudW1iZXIsXHJcbiAgICAgIHZpZXdfa2V5OiBudW1iZXJcclxuICAgICkgPT4ge1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKFwidHlwZTpcIiArIHR5cGUpO1xyXG4gICAgICBsZXQgdmlld2VyID0gdGhpcy5maW5kVmlld2VyQnlLZXkodmlld19rZXkpO1xyXG4gICAgICBpZiAodmlld2VyKSB7XHJcbiAgICAgICAgLy8g5Y+q5pyJc3RyZWFtVG9HZW9tZXRyeVR05ZKMc3RyZWFtVG9TZWdtZW50VHTmiY3pnIDopoHpop3lpJbliKTmlq10aHJlYWRJc1J1bm5pbmcuXHJcbiAgICAgICAgaWYgKHR5cGUgPT09IDEgfHwgdHlwZSA9PT0gMikge1xyXG4gICAgICAgICAgaWYgKCF2aWV3ZXIuaXNCdXN5ICYmICF2aWV3ZXIudGhyZWFkSXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgIEpTX0V4ZWN1dGVfVGFza19Qb3N0X1Byb2Nlc3NpbmcodGFza19pZCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgLy8g6KGo56S6c3RyZWFtVG9TZWdtZW50VHTnur/nqIvnu5PmnZ9cclxuICAgICAgICAgICAgICB2aWV3ZXIuc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50LS07XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICBcInN0cmVhbVRvU2VnbWVudFJ1bm5pbmdDb3VudDpcIixcclxuICAgICAgICAgICAgICAgIHZpZXdlci5zdHJlYW1Ub1NlZ21lbnRSdW5uaW5nQ291bnRcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gMikge1xyXG4gICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgdmlld2VyLl90aHJlYWRTVEdESXNSdW5uaW5nQ291bnQtLTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAgIFwidGhpcy5fdGhyZWFkU1RHRElzUnVubmluZ0NvdW50OlwiLFxyXG4gICAgICAgICAgICAgICAgdmlld2VyLl90aHJlYWRTVEdESXNSdW5uaW5nQ291bnRcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHZpZXdlci5pc0J1c3kgfHwgdmlld2VyLnRocmVhZElzUnVubmluZykge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJvblRhc2tQcm9jZXNzaW5nRmluaXNoZWQgaXMgQnVzeVwiKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgSlNfRXhlY3V0ZV9UYXNrX1Bvc3RfUHJvY2Vzc2luZyh0YXNrX2lkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyDooajnpLpzdHJlYW1Ub1NlZ21lbnRUdOe6v+eoi+e7k+adn1xyXG4gICAgICAgICAgICAgICAgICB2aWV3ZXIuc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgICAgIFwic3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50OlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHZpZXdlci5zdHJlYW1Ub1NlZ21lbnRSdW5uaW5nQ291bnRcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgICB2aWV3ZXIuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAgICAgICBcInRoaXMuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudDpcIixcclxuICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoIXZpZXdlci5pc0J1c3kpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIm9uVGFza1Byb2Nlc3NpbmdGaW5pc2hlZCBleGVjdXRlIFwiICsgXCJ0eXBlOlwiICsgdHlwZSk7XHJcbiAgICAgICAgICAgIEpTX0V4ZWN1dGVfVGFza19Qb3N0X1Byb2Nlc3NpbmcodGFza19pZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHZpZXdlci5pc0J1c3kpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJvblRhc2tQcm9jZXNzaW5nRmluaXNoZWQgaXMgQnVzeVwiKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcclxuICAgICAgICAgICAgICAgICAgXCJvblRhc2tQcm9jZXNzaW5nRmluaXNoZWQgZXhlY3V0ZSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlOlwiICtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlICtcclxuICAgICAgICAgICAgICAgICAgICBcIiBpZFwiICtcclxuICAgICAgICAgICAgICAgICAgICB0YXNrX2lkXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgSlNfRXhlY3V0ZV9UYXNrX1Bvc3RfUHJvY2Vzc2luZyh0YXNrX2lkKTtcclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoIU1vZHVsZVtcInN0cmVhbVRvU2VnbWVudExpc3RcIl0pIHtcclxuICAgICAgTW9kdWxlW1wic3RyZWFtVG9TZWdtZW50TGlzdFwiXSA9IG5ldyBOdW1iZXJLZXlMaXN0PFxyXG4gICAgICAgIChrZXk6IG51bWJlcikgPT4gdm9pZFxyXG4gICAgICA+KCk7XHJcbiAgICB9XHJcbiAgICBNb2R1bGVbXCJhZnRlckFzeW5VcGRhdGVWaWV3XCJdID0gKHZpZXdfa2V5OiBudW1iZXIsIGNhbmNlbGxlZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGxldCB2aWV3ZXIgPSB0aGlzLmZpbmRWaWV3ZXJCeUtleSh2aWV3X2tleSk7XHJcblxyXG4gICAgICBpZiAoIWNhbmNlbGxlZCkge1xyXG4gICAgICAgIHZpZXdlci51bkJ1ZmZlckFuZEJ1ZmZlckdlb21ldHJpZXModHJ1ZSwgdmlld2VyLl90aHJlYWRQcm9taXNlLCB0cnVlKTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQVkNhbmNlbGxlZCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZpZXdlci5kZWJ1Z0xvZyhcIkFzeW5VcGRhdGVWaWV3IGNhbmNlbGxlZFwiKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFzeW5VcGRhdGVWaWV3IGNhbmNlbGxlZFwiKTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQVkNhbmNlbGxlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZpZXdlci5fdGhyZWFkVVBWSXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgIHZpZXdlci5fdGhyZWFkVVBWSXNQcmVwYXJpbmcgPSBmYWxzZTtcclxuICAgICAgdmlld2VyLmRlYnVnTG9nKFwiSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHRfRW5kXCIpO1xyXG5cclxuICAgICAgaWYgKHZpZXdlci5fdGhyZWFkVVBWQ2FuY2VsbGVkKSB7XHJcbiAgICAgICAgdmlld2VyLmRlYnVnTG9nKFwiSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHRfU3RhcnRfQ2FuY2VsbGVkXCIpO1xyXG4gICAgICAgIEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5X1R0KHZpZXdlci52aWV3S2V5KTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQVklzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgdmlld2VyLl90aHJlYWRVUFZDYW5jZWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQVklzQWdhaW4gPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmICh2aWV3ZXIuX3RocmVhZFVQVklzQWdhaW4pIHtcclxuICAgICAgICB2aWV3ZXIuZGVidWdMb2coXCJKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdF9TdGFydF9BZ2FpblwiKTtcclxuICAgICAgICBKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdCh2aWV3ZXIudmlld0tleSk7XHJcbiAgICAgICAgdmlld2VyLl90aHJlYWRVUFZJc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHZpZXdlci5fdGhyZWFkVVBWQ2FuY2VsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdmlld2VyLl90aHJlYWRVUFZJc0FnYWluID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgTW9kdWxlW1wiYWZ0ZXJBc3luVXBkYXRlR2VvbWV0cnlEYXRhXCJdID0gKFxyXG4gICAgICB2aWV3X2tleTogbnVtYmVyLFxyXG4gICAgICBwYXJ0aWFsX2tleTogbnVtYmVyLFxyXG4gICAgICBjYW5jZWxsZWQ6IG51bWJlclxyXG4gICAgKSA9PiB7XHJcbiAgICAgIGxldCB2aWV3ZXIgPSB0aGlzLmZpbmRWaWV3ZXJCeUtleSh2aWV3X2tleSk7XHJcblxyXG4gICAgICBpZiAoIWNhbmNlbGxlZCkge1xyXG4gICAgICAgIHZpZXdlci5fdGhyZWFkVVBHRENhbmNlbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIC8v6L+Y5pyq5Yqg6L295Yeg5L2V55qEc2VnbWVudOWIl+ihqFxyXG4gICAgICAgIGxldCBhc3luS2V5czogSW50MzJBcnJheSA9IEpTX1Nob3dfQXN5bl9HZW9tZXRyeV9EYXRhX0tleXMoXHJcbiAgICAgICAgICB2aWV3ZXIuX3ZpZXdLZXlcclxuICAgICAgICApIGFzIEludDMyQXJyYXk7XHJcbiAgICAgICAgdmlld2VyLmRlYnVnTG9nKFwiYXN5bktleXNMZW5ndGg6XCIgKyBhc3luS2V5cy5sZW5ndGgpO1xyXG5cclxuICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCJlbnN1cmVNZW1vcnlTaXplXCIpO1xyXG4gICAgICAgIGxldCBtZW1vcnlJc0ZyZWUgPSB2aWV3ZXIuZW5zdXJlTWVtb3J5U2l6ZSgpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUudGltZUVuZChcImVuc3VyZU1lbW9yeVNpemVcIik7XHJcblxyXG4gICAgICAgIGlmIChtZW1vcnlJc0ZyZWUpIHtcclxuICAgICAgICAgIHZpZXdlci5hc3luTG9hZEdlb21ldHJpZXMoYXN5bktleXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIm1lbW9yeSBpcyBmdWxsIGJlZm9yZSBhc3luTG9hZEdlb21ldHJpZXNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZpZXdlci5hc3luUmVtb3ZlR2VvbWV0cnkoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQR0RDYW5jZWxsZWQgPSB0cnVlO1xyXG4gICAgICAgIHZpZXdlci5kZWJ1Z0xvZyhcIkFzeW5VcGRhdGVHZW9tZXRyeURhdGEgY2FuY2VsbGVkXCIpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQXN5blVwZGF0ZUdlb21ldHJ5RGF0YSBjYW5jZWxsZWRcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZpZXdlci5fdGhyZWFkVVBHRElzUnVubmluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgdmlld2VyLmRlYnVnTG9nKFwiSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHRfRW5kXCIpO1xyXG5cclxuICAgICAgaWYgKHZpZXdlci5fdGhyZWFkVVBHRENhbmNlbGxlZCkge1xyXG4gICAgICAgIHZpZXdlci5kZWJ1Z0xvZyhcclxuICAgICAgICAgIFwiSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHRfU3RhcnRfQ2FuY2VsbGVkXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0KHZpZXdlci52aWV3S2V5LCAtMSk7XHJcbiAgICAgICAgdmlld2VyLl90aHJlYWRVUEdESXNSdW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQR0RDYW5jZWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQR0RJc0FnYWluID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSBpZiAodmlld2VyLl90aHJlYWRVUEdESXNBZ2Fpbikge1xyXG4gICAgICAgIHZpZXdlci5kZWJ1Z0xvZyhcIkpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0X1N0YXJ0X0FnYWluXCIpO1xyXG4gICAgICAgIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0KHZpZXdlci52aWV3S2V5LCAtMSk7XHJcbiAgICAgICAgdmlld2VyLl90aHJlYWRVUEdESXNSdW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQR0RDYW5jZWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQR0RJc0FnYWluID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gbGV0IGltYWdlVXJscyA9IHt9XHJcbiAgICBNb2R1bGVbXCJvbkltYWdlRXh0ZXJuYWxMb2FkaW5nXCJdID0gKFxyXG4gICAgICB2aWV3X2tleTogbnVtYmVyLFxyXG4gICAgICBpbWFnZV9rZXk6IG51bWJlcixcclxuICAgICAgYnVmZmVyOiBudW1iZXJcclxuICAgICkgPT4ge1xyXG4gICAgICBsZXQgdmlld2VyID0gdGhpcy5maW5kVmlld2VyQnlLZXkodmlld19rZXkpIGFzIFZpZXdlcjtcclxuXHJcbiAgICAgIGxldCBuYW1lID0gSlNfU2hvd19PbmVfSW1hZ2VfT3B0aW9uKGltYWdlX2tleSwgXCJuYW1lXCIpO1xyXG4gICAgICBsZXQgZm9ybWF0ID0gSlNfU2hvd19PbmVfSW1hZ2VfT3B0aW9uKGltYWdlX2tleSwgXCJmb3JtYXRcIik7XHJcbiAgICAgIGxldCBpZCA9IEpTX1Nob3dfT25lX0ltYWdlX09wdGlvbihpbWFnZV9rZXksIFwiaWRcIik7XHJcbiAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgLy8gY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgICAgLy8gaW1nLmNyb3NzT3JpZ2luID0gXCIqXCI7XHJcbiAgICAgICAgLy8gaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyAgIC8vIF9nbEdlblRleHR1cmVzKDEsIGJ1ZmZlcik7XHJcbiAgICAgICAgLy8gICAvLyBsZXQgdGV4dHVyZSA9IEdMLnRleHR1cmVzW0dST1dBQkxFX0hFQVBfSTMyKClbYnVmZmVyID4+IDJdXSBhcyBXZWJHTFRleHR1cmU7XHJcbiAgICAgICAgLy8gICBsZXQgdGV4dHVyZSA9IEpTX0NyZWF0ZV9UZXh0dXJlKGJ1ZmZlcik7XHJcbiAgICAgICAgLy8gICBzZWxmLmdsLmJpbmRUZXh0dXJlKHNlbGYuZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XHJcbiAgICAgICAgLy8gICBpZiAoZm9ybWF0ID09IFwianBnXCIgfHwgZm9ybWF0ID09IFwicmdiXCIpIHtcclxuICAgICAgICAvLyAgICAgc2VsZi5nbC50ZXhJbWFnZTJEKHNlbGYuZ2wuVEVYVFVSRV8yRCwgMCwgc2VsZi5nbC5SR0IsIHNlbGYuZ2wuUkdCLCBzZWxmLmdsLlVOU0lHTkVEX0JZVEUsIGltZyk7XHJcbiAgICAgICAgLy8gICAgIHNlbGYuZ2wuZ2VuZXJhdGVNaXBtYXAoc2VsZi5nbC5URVhUVVJFXzJEKTtcclxuXHJcbiAgICAgICAgLy8gICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBcInBuZ1wiIHx8IGZvcm1hdCA9PSBcInJnYmFcIikge1xyXG4gICAgICAgIC8vICAgICBzZWxmLmdsLnRleEltYWdlMkQoc2VsZi5nbC5URVhUVVJFXzJELCAwLCBzZWxmLmdsLlJHQkEsIHNlbGYuZ2wuUkdCQSwgc2VsZi5nbC5VTlNJR05FRF9CWVRFLCBpbWcpO1xyXG4gICAgICAgIC8vICAgICBzZWxmLmdsLmdlbmVyYXRlTWlwbWFwKHNlbGYuZ2wuVEVYVFVSRV8yRCk7XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gICBzZWxmLmdsLmJpbmRUZXh0dXJlKHNlbGYuZ2wuVEVYVFVSRV8yRCwgbnVsbCk7XHJcblxyXG4gICAgICAgIC8vICAgc2VsZi51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGltZy5zcmMgPSBcImh0dHA6Ly84LjEzNC44NS4yNTQ6ODAyMS9pbWFnZXMvdGVzdC9cIiArIG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGZpbGVOYW1lID0gXCJodHRwOi8vOC4xMzQuODUuMjU0OjgwMjEvaW1hZ2VzL3Rlc3QvXCIgKyBuYW1lO1xyXG4gICAgICAgIC8vIGZldGNoKGZpbGVOYW1lKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAvLyAgIHJlc3BvbnNlLmJsb2IoKS50aGVuKGJsb2IgPT4ge1xyXG4gICAgICAgIC8vICAgICBwb29sLmV4ZWMobG9hZEltYWdlLCBbYmxvYl0pLnRoZW4oaW1hZ2UgPT4ge1xyXG4gICAgICAgIC8vICAgICAgIGxldCBnbCA9IHNlbGYuZ2w7XHJcbiAgICAgICAgLy8gICAgICAgbGV0IHRleHR1cmUgPSBKU19DcmVhdGVfVGV4dHVyZShidWZmZXIpO1xyXG4gICAgICAgIC8vICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xyXG4gICAgICAgIC8vICAgICAgIGlmIChmb3JtYXQgPT0gXCJqcGdcIiB8fCBmb3JtYXQgPT0gXCJyZ2JcIikge1xyXG4gICAgICAgIC8vICAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0IsIGdsLlJHQiwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UpO1xyXG4gICAgICAgIC8vICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XHJcblxyXG4gICAgICAgIC8vICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IFwicG5nXCIgfHwgZm9ybWF0ID09IFwicmdiYVwiKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltYWdlKTtcclxuICAgICAgICAvLyAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xyXG4gICAgICAgIC8vICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTtcclxuXHJcbiAgICAgICAgLy8gICAgICAgc2VsZi51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgLy8gICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBsZXQgZmlsZU5hbWUgPSBcImh0dHA6Ly84LjEzNC44NS4yNTQ6ODAyMS9pbWFnZXMvdGVzdC9cIiArIG5hbWU7XHJcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuZ2V0QXN5bkltYWdlQWN0aW9uLnVybCArIGlkICsgXCIvXCIgKyBuYW1lICsgXCIuXCIgKyBmb3JtYXQ7XHJcbiAgICAgICAgaWYgKHZpZXdlci5pbWFnZVVybHNbdXJsXSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2aWV3ZXIuaW1hZ2VVcmxzW3VybF0gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRva2VuID0gZ2V0Q29va2llKFwiR3NUb2tlblwiKTtcclxuICAgICAgICAvLyBpZiAodG9rZW4pIHtcclxuICAgICAgICAvLyAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCB0b2tlbilcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIHRoaXMueGhyTGlzdC5hZGQoeGhyKTtcclxuXHJcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgdXJsLCB0cnVlKTtcclxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XHJcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IFwiYmxvYlwiO1xyXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIsIFwiKlwiKTtcclxuICAgICAgICBpZiAodG9rZW4pIHtcclxuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCB0b2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnhockxpc3QucmVtb3ZlKHhocik7XHJcblxyXG4gICAgICAgICAgbGV0IGJsb2IgPSB4aHIucmVzcG9uc2U7XHJcbiAgICAgICAgICBjcmVhdGVJbWFnZUJpdG1hcChibG9iKS50aGVuKChpbWFnZSkgPT4ge1xyXG4gICAgICAgICAgICB2aWV3ZXIubWFrZUNvbnRleHRDdXJyZW50KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZ2wgPSB2aWV3ZXIuZ2w7XHJcbiAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gSlNfQ3JlYXRlX1RleHR1cmUoYnVmZmVyKTtcclxuXHJcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xyXG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09IFwianBnXCIgfHwgZm9ybWF0ID09IFwianBlZ1wiIHx8IGZvcm1hdCA9PSBcInJnYlwiKSB7XHJcbiAgICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChcclxuICAgICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsXHJcbiAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICAgZ2wuUkdCLFxyXG4gICAgICAgICAgICAgICAgZ2wuUkdCLFxyXG4gICAgICAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSxcclxuICAgICAgICAgICAgICAgIGltYWdlXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gXCJwbmdcIiB8fCBmb3JtYXQgPT0gXCJyZ2JhXCIpIHtcclxuICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKFxyXG4gICAgICAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCxcclxuICAgICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgICBnbC5SR0JBLFxyXG4gICAgICAgICAgICAgICAgZ2wuUkdCQSxcclxuICAgICAgICAgICAgICAgIGdsLlVOU0lHTkVEX0JZVEUsXHJcbiAgICAgICAgICAgICAgICBpbWFnZVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChcclxuICAgICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsXHJcbiAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICAgZ2wuUkdCLFxyXG4gICAgICAgICAgICAgICAgZ2wuUkdCLFxyXG4gICAgICAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSxcclxuICAgICAgICAgICAgICAgIGltYWdlXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIHZpZXdlci51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHhoci5zZW5kKCk7XHJcblxyXG4gICAgICAgIC8vIGZldGNoKHVybCwge1xyXG4gICAgICAgIC8vICAgaGVhZGVyczoge1xyXG4gICAgICAgIC8vICAgICBBdXRob3JpemF0aW9uOiB0b2tlbixcclxuICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgLy8gfSkudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAvLyAgIHJlc3BvbnNlLmJsb2IoKS50aGVuKChibG9iKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGNyZWF0ZUltYWdlQml0bWFwKGJsb2IpLnRoZW4oKGltYWdlKSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgdmlld2VyLm1ha2VDb250ZXh0Q3VycmVudCgpO1xyXG5cclxuICAgICAgICAvLyAgICAgICBsZXQgZ2wgPSB2aWV3ZXIuZ2w7XHJcbiAgICAgICAgLy8gICAgICAgbGV0IHRleHR1cmUgPSBKU19DcmVhdGVfVGV4dHVyZShidWZmZXIpO1xyXG5cclxuICAgICAgICAvLyAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcclxuICAgICAgICAvLyAgICAgICBpZiAoZm9ybWF0ID09IFwianBnXCIgfHwgZm9ybWF0ID09IFwianBlZ1wiIHx8IGZvcm1hdCA9PSBcInJnYlwiKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBnbC50ZXhJbWFnZTJEKFxyXG4gICAgICAgIC8vICAgICAgICAgICBnbC5URVhUVVJFXzJELFxyXG4gICAgICAgIC8vICAgICAgICAgICAwLFxyXG4gICAgICAgIC8vICAgICAgICAgICBnbC5SR0IsXHJcbiAgICAgICAgLy8gICAgICAgICAgIGdsLlJHQixcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSxcclxuICAgICAgICAvLyAgICAgICAgICAgaW1hZ2VcclxuICAgICAgICAvLyAgICAgICAgICk7XHJcbiAgICAgICAgLy8gICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcclxuICAgICAgICAvLyAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBcInBuZ1wiIHx8IGZvcm1hdCA9PSBcInJnYmFcIikge1xyXG4gICAgICAgIC8vICAgICAgICAgZ2wudGV4SW1hZ2UyRChcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCxcclxuICAgICAgICAvLyAgICAgICAgICAgMCxcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuUkdCQSxcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuUkdCQSxcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSxcclxuICAgICAgICAvLyAgICAgICAgICAgaW1hZ2VcclxuICAgICAgICAvLyAgICAgICAgICk7XHJcbiAgICAgICAgLy8gICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcclxuICAgICAgICAvLyAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgZ2wudGV4SW1hZ2UyRChcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCxcclxuICAgICAgICAvLyAgICAgICAgICAgMCxcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuUkdCLFxyXG4gICAgICAgIC8vICAgICAgICAgICBnbC5SR0IsXHJcbiAgICAgICAgLy8gICAgICAgICAgIGdsLlVOU0lHTkVEX0JZVEUsXHJcbiAgICAgICAgLy8gICAgICAgICAgIGltYWdlXHJcbiAgICAgICAgLy8gICAgICAgICApO1xyXG4gICAgICAgIC8vICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XHJcbiAgICAgICAgLy8gICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpO1xyXG5cclxuICAgICAgICAvLyAgICAgICB2aWV3ZXIudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIE1vZHVsZVtcIm9uQ29sbGlzaW9uQ29tcHV0aW5nXCJdID0gKFxyXG4gICAgICB2aWV3X2tleTogbnVtYmVyLFxyXG4gICAgICB0b3RhbDogbnVtYmVyLFxyXG4gICAgICBjdXJyZW50OiBudW1iZXJcclxuICAgICkgPT4ge1xyXG4gICAgICBsZXQgdmlld2VyID0gdmkuZmluZFZpZXdlckJ5S2V5KHZpZXdfa2V5KSBhcyBWaWV3ZXI7XHJcbiAgICAgIGlmICh2aWV3ZXIpIHtcclxuICAgICAgICB2aWV3ZXIuY29sbGlzaW9uQ29tcHV0aW5nLmZvckVhY2goZnVuY3Rpb24gKFxyXG4gICAgICAgICAgdmFsdWU6ICh2aWV3ZXI6IFZpZXdlciwgdG90YWw6IG51bWJlciwgY3VycmVudDogbnVtYmVyKSA9PiB2b2lkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB2YWx1ZSh2aWV3ZXIsIHRvdGFsLCBjdXJyZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBNb2R1bGVbXCJvbkNvbGxpc2lvbkNvbXB1dGVkXCJdID0gKHZpZXdfa2V5OiBudW1iZXIsIGNvdW50OiBudW1iZXIpID0+IHtcclxuICAgICAgbGV0IHZpZXdlciA9IHZpLmZpbmRWaWV3ZXJCeUtleSh2aWV3X2tleSkgYXMgVmlld2VyO1xyXG4gICAgICBpZiAodmlld2VyKSB7XHJcbiAgICAgICAgdmlld2VyLmNvbGxpc2lvbkNvbXB1dGVkLmZvckVhY2goXHJcbiAgICAgICAgICAodmFsdWU6ICh2aWV3ZXI6IFZpZXdlciwgY291bnQ6IG51bWJlcikgPT4gdm9pZCkgPT4ge1xyXG4gICAgICAgICAgICB2YWx1ZSh2aWV3ZXIsIGNvdW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIE1vZHVsZVtcIm9uU3RyZWFtVG9TZWdtZW50RmluaXNoZWRcIl0gPSAoa2V5OiBudW1iZXIsIG5vOiBudW1iZXIpID0+IHtcclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIm9uU3RyZWFtVG9TZWdtZW50RmluaXNoZWQ6IFwiICsga2V5ICsgbm8pO1xyXG5cclxuICAgICAgbGV0IGV2ZW50ID0gTW9kdWxlW1wic3RyZWFtVG9TZWdtZW50TGlzdFwiXS5nZXQobm8pO1xyXG4gICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICBldmVudChrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIE1vZHVsZVtcIm9uU3RyZWFtVG9HZW9tZXRyeURhdGFGaW5pc2hlZFwiXSA9IChjb3VudDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIC8vIHRoaXMuZGVidWdMb2coXCJvblN0cmVhbVRvR2VvbWV0cnlEYXRhRmluaXNoZWRcIik7XHJcbiAgICAgIHRoaXMuZGVidWdMb2coXCJvblN0cmVhbVRvR2VvbWV0cnlEYXRhRmluaXNoZWQ6IFwiICsgY291bnQpO1xyXG4gICAgICBQcm9jZXNzLnByb2Nlc3NMaXN0LmZvckVhY2goKHByb2Nlc3MpID0+IHtcclxuICAgICAgICBwcm9jZXNzLnZpZXdlcnMuZm9yRWFjaCgodmlldykgPT4ge1xyXG4gICAgICAgICAgbGV0IGJ1ZmZlclRhc2tMZW5ndGggPSB2aWV3LmF5c25UYXNrTWFuYWdlci5nZXRUYXNrTGVuZ3RoKDIpO1xyXG4gICAgICAgICAgaWYgKGJ1ZmZlclRhc2tMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdmlldy5jb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllcyh0cnVlLCBudWxsKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZpZXcuY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYnVmZmVyVGFzayBjb3VudCA+IDAsIGNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVz5Lit5patXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXNfVHRfRW5kXCIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBNb2R1bGVbXCJvbkJ1ZmZlckdlb21ldHJ5RmluaXNoZWRcIl0gPSAobm86IG51bWJlcikgPT4ge1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKFwib25CdWZmZXJHZW9tZXRyeUZpbmlzaGVkXCIpO1xyXG5cclxuICAgICAgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkodGhpcy52aWV3S2V5LCBmYWxzZSk7IC8v57uY5Yi2XHJcbiAgICB9O1xyXG5cclxuICAgIE1vZHVsZVtcIm9uQ29tcHV0ZUNvbGxpc2lvbkZpbmlzaGVkXCJdID0gKG5vOiBudW1iZXIsIGl0ZW1zOiBbXSkgPT4ge1xyXG4gICAgICAvL2NvbnNvbGUubG9nKFwib25Db21wdXRlQ29sbGlzaW9uRmluaXNoZWQ6IFwiLCBubywgaXRlbXMpO1xyXG5cclxuICAgICAgbGV0IGV2ZW50ID0gdGhpcy5vbkNvbXB1dGVDb2xsaXNpb25GaW5pc2hlZC5nZXQobm8pO1xyXG4gICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICBldmVudChpdGVtcyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBhc3luTG9hZEdlb21ldHJpZXMoYXN5bktleXM6IEludDMyQXJyYXkpIHtcclxuICAgIGlmIChhc3luS2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuaXNHZW9tZXRyeUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAvLyB0aGlzLl9zZWdtZW50TG9hZGluZ0NvdW50ID0gMDtcclxuICAgICAgY29uc29sZS5sb2coXCJpc0dlb21ldHJ5TG9hZGluZzpcIiwgdGhpcy5pc0dlb21ldHJ5TG9hZGluZyk7XHJcblxyXG4gICAgICBsZXQgbGlnaHRNb2RlbHMgPSAodGhpcyBhcyBhbnkpLnByb2Nlc3MuZmluZE1vZGVsUmVuZGVyT2JqZWN0cygpO1xyXG4gICAgICBsZXQgaWRNYXBLZXlzOiB7IFtpZDogc3RyaW5nXTogbnVtYmVyW10gfSA9IHt9O1xyXG4gICAgICB0aGlzLmdyb3VwaW5nQXN5bktleXNPZkVhY2hMaWdodE1vZGVsKGFzeW5LZXlzLCBpZE1hcEtleXMpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaWdodE1vZGVscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBtb2RlbElkID0gbGlnaHRNb2RlbHNbaV0ubW9kZWxJZDtcclxuICAgICAgICBsZXQga2V5cyA9IGlkTWFwS2V5c1ttb2RlbElkXTtcclxuXHJcbiAgICAgICAgaWYgKGtleXMpIHtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibW9kZWwtXCIgKyBtb2RlbElkICsgXCItLS1cIiArIGkpO1xyXG4gICAgICAgICAgdGhpcy5nZXRHZW9tZXRyeURhdGFQZXJMaWdodE1vZGVsKGxpZ2h0TW9kZWxzW2ldLCBpZE1hcEtleXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0R2VvbWV0cnlEYXRhUGVyTGlnaHRNb2RlbChcclxuICAgIGxpZ2h0TW9kZWwsXHJcbiAgICBpZE1hcEtleXM6IHsgW2lkOiBzdHJpbmddOiBudW1iZXJbXSB9XHJcbiAgKSB7XHJcbiAgICBsZXQgbW9kZWxJZCA9IGxpZ2h0TW9kZWwubW9kZWxJZDtcclxuICAgIGxldCBtb2RlbFZlcnNpb24gPSBsaWdodE1vZGVsLnZlcnNpb247XHJcbiAgICBsZXQga2V5cyA9IGlkTWFwS2V5c1ttb2RlbElkXTtcclxuXHJcbiAgICBpZiAoa2V5cykge1xyXG4gICAgICBsZXQgZGljdGlvbmFyeTogeyBbaWQ6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICAgIGxldCBjYWNoZURpY3Rpb25hcnk6IHsgW2lkOiBzdHJpbmddOiB7IGtleTogbnVtYmVyOyBkYXRhOiBhbnkgfSB9ID0ge307XHJcblxyXG4gICAgICAvLyBjb25zb2xlLnRpbWUoXCLmn6Xor6JpbmRleGVkREJcIik7XHJcbiAgICAgIGxldCBub0NhY2hlS2V5cyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcblxyXG4gICAgICBsZXQgZ3JvdXBTaXplQ291bnQgPSAwO1xyXG4gICAgICBsZXQgZ3JvdXBJZHMgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gY29uc29sZS50aW1lKFwi5Yik5patc2VnbWVudOaYr+WQpue8k+WtmFwiK21vZGVsSWQpO1xyXG4gICAgICAvLyBsZXQgZmlyc3RJZDtcclxuICAgICAgLy8gSlNfT3Blbl9TZWdtZW50X0J5X0tleShrZXlzWzBdKTtcclxuICAgICAgLy8ge1xyXG4gICAgICAvLyAgIGZpcnN0SWQgPSBKU19TaG93X09uZV9IZXVyaXN0aWNfT3B0aW9uKFwiZ2VvbWV0cnkgaWRcIik7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgbGV0IGlkYjogSURCO1xyXG4gICAgICAvLyBsZXQgaWRiRXhpc3QgPSB0cnVlO1xyXG4gICAgICBsZXQgdHg7XHJcbiAgICAgIGlmICh0aGlzLmlzQ2FjaGUpIHtcclxuICAgICAgICBpZGIgPSBJREIuZ2V0SW5zdGFuY2UobW9kZWxJZCk7XHJcbiAgICAgICAgLy8gaWRiRXhpc3QgPVxyXG4gICAgICAgIC8vICAgKGF3YWl0IGlkYi5nZXQobW9kZWxJZCkpICYmIChhd2FpdCBpZGIuZ2V0KG1vZGVsSWQgKyBcIl9cIiArIGZpcnN0SWQpKTtcclxuICAgICAgICB0eCA9IGF3YWl0IGlkYi50cmFuc2FjdGlvbigpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDpgY3ljoZrZXlz77yM5YWI5bCG5bey57uPbG9hZGluZ2xpc3TnmoRrZXnliIbnprvlh7rljrsuXHJcbiAgICAgIGxldCBsb2FkaW5nRmlsdGVkS2V5cyA9IHRoaXMuZmlsdGVyTG9hZGluZ0xpc3Qoa2V5cyk7XHJcblxyXG4gICAgICB0aGlzLl9zZWdtZW50TG9hZGluZ0NvdW50ICs9IGxvYWRpbmdGaWx0ZWRLZXlzLmxlbmd0aDtcclxuXHJcbiAgICAgIGtleXMgPSBsb2FkaW5nRmlsdGVkS2V5cztcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgbGV0IHNlZ0tleSA9IGtleXNbal07XHJcblxyXG4gICAgICAgIGxldCBpZCA9IG51bGw7XHJcbiAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleShzZWdLZXkpO1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkID0gSlNfU2hvd19PbmVfSGV1cmlzdGljX09wdGlvbihcImdlb21ldHJ5IGlkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaWRcIiwgaWQpO1xyXG4gICAgICAgIGlmIChpZCkge1xyXG4gICAgICAgICAgdGhpcy5fbG9hZGluZ0xpc3Rbc2VnS2V5XSA9IDA7XHJcbiAgICAgICAgICB0aGlzLl9sb2FkaW5nTGlzdENvdW50Kys7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNDYWNoZSkge1xyXG4gICAgICAgICAgICB0eC5zdG9yZVxyXG4gICAgICAgICAgICAgIC5nZXQobW9kZWxJZCArIFwiP3Y9XCIgKyBtb2RlbFZlcnNpb24gKyBcIl9cIiArIGlkKVxyXG4gICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLl9hbGxHZW9Db3VudEZyb21DYWNoZSsrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgY2FjaGVEaWN0aW9uYXJ5W2lkXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IHNlZ0tleSxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleShzZWdLZXkpO1xyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9KU19TZXRfSGV1cmlzdGljX09wdGlvbnMoXCJhc3luIGdlb21ldHJ5PW9mZlwiKTtcclxuICAgICAgICAgICAgICAgICAgICBKU19TZXRfT25lX0hldXJpc3RpY19PcHRpb24oXCJhc3luIGdlb21ldHJ5XCIsIFwib2ZmXCIpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xvYWRpbmdMaXN0W3NlZ0tleV07XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdMaXN0Q291bnQtLTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sb2FkaW5nTGlzdENvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5blrozlhajpg6jlh6DkvZXmlbDmja5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwiZ2V0IGRhdGEgZmluaXNoXCIpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChqID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpc0xhc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXN5bkJhdGNoU2V0U2VnbWVudHNEYXRhRnJvbUNhY2hlKHNlZ0tleSwgZGF0YSwgaXNMYXN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8v5pyA5ZCO5LiA57uELlxyXG4gICAgICAgICAgICAgICAgICBpZiAoaiA9PT0ga2V5cy5sZW5ndGggLSAxICYmIGdyb3VwSWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBncm91cElkcyA9IGdyb3VwSWRzLnN1YnN0cmluZygwLCBncm91cElkcy5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3luQmF0Y2hTZXRTZWdtZW50c0RhdGEoXHJcbiAgICAgICAgICAgICAgICAgICAgICBtb2RlbElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgW2dyb3VwSWRzXSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmVyc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBncm91cFNpemVDb3VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNlZ21lbnRcIiArIG1vZGVsSWQgKyBcIl9cIiArIGlkICsgXCLlt7LnvJPlrZhcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2lkXSA9IHNlZ0tleTtcclxuICAgICAgICAgICAgICAgICAgbm9DYWNoZUtleXMucHVzaChzZWdLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkoc2VnS2V5KTtcclxuICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wU2l6ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICBKU19TaG93X09uZV9IZXVyaXN0aWNfT3B0aW9uKFwiZ2VvbWV0cnkgc2l6ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gTnVtYmVyKHRlbXBTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNpemUsXCIsIHNpemUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8v5YWI5Yik5patc2l6ZeaYr+WQpuWkp+S6jjEwMjQgKiAxMDI0O1xyXG4gICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSB0aGlzLl9ncm91cFNpemVMaW1pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cElkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvL+aJuemHjyhpZCnmj5LlhaXlh6DkvZXmlbDmja4uXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyDliarljrvmnIDlkI7kuIDkuKrpgJflj7flrZfnrKZcclxuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWRzID0gZ3JvdXBJZHMuc3Vic3RyaW5nKDAsIGdyb3VwSWRzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3luQmF0Y2hTZXRTZWdtZW50c0RhdGEoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cElkc10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmVyc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeVxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwU2l6ZUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBncm91cElkcyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBpZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzeW5CYXRjaFNldFNlZ21lbnRzRGF0YShcclxuICAgICAgICAgICAgICAgICAgICAgIG1vZGVsSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBJZHNdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbW9kZWxWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwU2l6ZUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBncm91cElkcyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9lbHNlLua3u+WKoOiHs+aVsOe7hOS4rS5ncm91cFNpemVDb3VudCArPSBzaXplLlxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSWRzID0gZ3JvdXBJZHMgKyBpZCArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwU2l6ZUNvdW50ICs9IHNpemU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cFNpemVDb3VudCA+PSB0aGlzLl9ncm91cFNpemVMaW1pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy/lpoLmnpzmlbDnu4RzaXplID4gMTAyNCAqIDEwMjQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyDliarljrvmnIDlkI7kuIDkuKrpgJflj7flrZfnrKZcclxuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWRzID0gZ3JvdXBJZHMuc3Vic3RyaW5nKDAsIGdyb3VwSWRzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3luQmF0Y2hTZXRTZWdtZW50c0RhdGEoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cElkc10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmVyc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeVxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBncm91cFNpemVDb3VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkcyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAvL+acgOWQjuS4gOe7hC5cclxuICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGtleXMubGVuZ3RoIC0gMSAmJiBncm91cElkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwSWRzW2dyb3VwSWRzLmxlbmd0aCAtIDFdID09PSBcIixcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBncm91cElkcy5zdWJzdHJpbmcoMCwgZ3JvdXBJZHMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXN5bkJhdGNoU2V0U2VnbWVudHNEYXRhKFxyXG4gICAgICAgICAgICAgICAgICAgICAgbW9kZWxJZCxcclxuICAgICAgICAgICAgICAgICAgICAgIFtncm91cElkc10sXHJcbiAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBTaXplQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSWRzID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgLy8g5pyA5ZCO5LiA57uELlxyXG4gICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChqID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpc0xhc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXN5bkJhdGNoU2V0U2VnbWVudHNEYXRhRnJvbUNhY2hlKG51bGwsIG51bGwsIGlzTGFzdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkaWN0aW9uYXJ5W2lkXSA9IHNlZ0tleTtcclxuICAgICAgICAgICAgbm9DYWNoZUtleXMucHVzaChzZWdLZXkpO1xyXG4gICAgICAgICAgICBsZXQgc2l6ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkoc2VnS2V5KTtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGxldCB0ZW1wU2l6ZSA9IEpTX1Nob3dfT25lX0hldXJpc3RpY19PcHRpb24oXCJnZW9tZXRyeSBzaXplXCIpO1xyXG4gICAgICAgICAgICAgIHNpemUgPSBOdW1iZXIodGVtcFNpemUpO1xyXG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2l6ZSxcIiwgc2l6ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgICAgICAgLy/lhYjliKTmlq1zaXpl5piv5ZCm5aSn5LqOMTAyNCAqIDEwMjQ7XHJcbiAgICAgICAgICAgIGlmIChzaXplID49IHRoaXMuX2dyb3VwU2l6ZUxpbWl0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGdyb3VwSWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8v5om56YePKGlkKeaPkuWFpeWHoOS9leaVsOaNri5cclxuICAgICAgICAgICAgICAgIC8vIOWJquWOu+acgOWQjuS4gOS4qumAl+WPt+Wtl+esplxyXG4gICAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBncm91cElkcy5zdWJzdHJpbmcoMCwgZ3JvdXBJZHMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFzeW5CYXRjaFNldFNlZ21lbnRzRGF0YShcclxuICAgICAgICAgICAgICAgICAgbW9kZWxJZCxcclxuICAgICAgICAgICAgICAgICAgW2dyb3VwSWRzXSxcclxuICAgICAgICAgICAgICAgICAgbW9kZWxWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgZ3JvdXBTaXplQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgIGdyb3VwSWRzID0gXCJcIjtcclxuICAgICAgICAgICAgICBncm91cElkcyA9IGlkO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXN5bkJhdGNoU2V0U2VnbWVudHNEYXRhKFxyXG4gICAgICAgICAgICAgICAgbW9kZWxJZCxcclxuICAgICAgICAgICAgICAgIFtncm91cElkc10sXHJcbiAgICAgICAgICAgICAgICBtb2RlbFZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5XHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgZ3JvdXBTaXplQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgIGdyb3VwSWRzID0gXCJcIjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvL2Vsc2Uu5re75Yqg6Iez5pWw57uE5LitLmdyb3VwU2l6ZUNvdW50ICs9IHNpemUuXHJcbiAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBncm91cElkcyArIGlkICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgZ3JvdXBTaXplQ291bnQgKz0gc2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGdyb3VwU2l6ZUNvdW50ID49IHRoaXMuX2dyb3VwU2l6ZUxpbWl0KSB7XHJcbiAgICAgICAgICAgICAgICAvL+WmguaenOaVsOe7hHNpemUgPiAxMDI0ICogMTAyNDtcclxuICAgICAgICAgICAgICAgIC8vIOWJquWOu+acgOWQjuS4gOS4qumAl+WPt+Wtl+esplxyXG4gICAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBncm91cElkcy5zdWJzdHJpbmcoMCwgZ3JvdXBJZHMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFzeW5CYXRjaFNldFNlZ21lbnRzRGF0YShcclxuICAgICAgICAgICAgICAgICAgbW9kZWxJZCxcclxuICAgICAgICAgICAgICAgICAgW2dyb3VwSWRzXSxcclxuICAgICAgICAgICAgICAgICAgbW9kZWxWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5XHJcbiAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgIGdyb3VwU2l6ZUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIGdyb3VwSWRzID0gXCJcIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8v5pyA5ZCO5LiA57uELlxyXG4gICAgICAgICAgICBpZiAoaiA9PT0ga2V5cy5sZW5ndGggLSAxICYmIGdyb3VwSWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICBncm91cElkcyA9IGdyb3VwSWRzLnN1YnN0cmluZygwLCBncm91cElkcy5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICB0aGlzLmFzeW5CYXRjaFNldFNlZ21lbnRzRGF0YShcclxuICAgICAgICAgICAgICAgIG1vZGVsSWQsXHJcbiAgICAgICAgICAgICAgICBbZ3JvdXBJZHNdLFxyXG4gICAgICAgICAgICAgICAgbW9kZWxWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgZGljdGlvbmFyeVxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIGdyb3VwU2l6ZUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICBncm91cElkcyA9IFwiXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOmBjeWOhmtleXMs5YWI5bCGbG9hZGluZ2xpc3TnmoRrZXnov4fmu6TmjokuXHJcbiAgICogQHBhcmFtIGtleXNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGZpbHRlckxvYWRpbmdMaXN0KGtleXM6IG51bWJlcltdKSB7XHJcbiAgICBsZXQgbG9hZGluZ0ZpbHRlZEtleXMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgIGxldCBzZWdLZXkgPSBrZXlzW2pdO1xyXG5cclxuICAgICAgbGV0IGlkID0gbnVsbDtcclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleShzZWdLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgaWQgPSBKU19TaG93X09uZV9IZXVyaXN0aWNfT3B0aW9uKFwiZ2VvbWV0cnkgaWRcIik7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgaWYgKGlkKSB7XHJcbiAgICAgICAgLy8g6Ziy5q2i6YeN5aSN5Yqg6L2955u45ZCM55qE5Yeg5L2VLlxyXG4gICAgICAgIGxldCByZXMgPSB0aGlzLl9sb2FkaW5nTGlzdFtzZWdLZXldO1xyXG4gICAgICAgIGlmIChyZXMgIT09IG51bGwgJiYgcmVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9hZGluZ0ZpbHRlZEtleXMucHVzaChzZWdLZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxvYWRpbmdGaWx0ZWRLZXlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5om56YeP5re75Yqgc2VnbWVudOeahOWHoOS9leaVsOaNri5cclxuICAgKiBAcGFyYW0gc2VnS2V5IOWNleS4qnNlZ21lbnTnmoRrZXlcclxuICAgKiBAcGFyYW0gYnl0ZXMg5Y2V5Liqc2VnbWVudOWHoOS9leaVsOaNrlxyXG4gICAqIEBwYXJhbSBpc0xhc3RcclxuICAgKi9cclxuICBhc3luQmF0Y2hTZXRTZWdtZW50c0RhdGFGcm9tQ2FjaGUoc2VnS2V5LCBieXRlcywgaXNMYXN0OiBib29sZWFuKSB7XHJcbiAgICBpZiAoc2VnS2V5KSB7XHJcbiAgICAgIHRoaXMuX2NhY2hlU2VnS2V5cy5wdXNoKHNlZ0tleSk7XHJcbiAgICB9XHJcbiAgICBpZiAoYnl0ZXMpIHtcclxuICAgICAgdGhpcy5fY2FjaGVHZW9tZXRyeURhdGFMaXN0LnB1c2goYnl0ZXMpO1xyXG4gICAgICB0aGlzLl9jYWNoZURhdGFTaXplICs9IGJ5dGVzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX2NhY2hlU2VnS2V5cy5sZW5ndGggPiB0aGlzLl9yZW5kZXJWaWV3UGVyR3JvdXAgfHxcclxuICAgICAgdGhpcy5fY2FjaGVEYXRhU2l6ZSA+IHRoaXMuX2dyb3VwU2l6ZUxpbWl0ICogMjAgfHxcclxuICAgICAgaXNMYXN0XHJcbiAgICApIHtcclxuICAgICAgbGV0IGtleXMgPSBbLi4udGhpcy5fY2FjaGVTZWdLZXlzXTtcclxuICAgICAgaWYgKCFrZXlzIHx8IGtleXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgYWxsQnl0ZUxlbmd0aCA9IDA7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FjaGVHZW9tZXRyeURhdGFMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgYWxsQnl0ZUxlbmd0aCArPSB0aGlzLl9jYWNoZUdlb21ldHJ5RGF0YUxpc3RbaV0ubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZ2VvbWV0cnlHcnVwRGF0YSA9IG5ldyBVaW50OEFycmF5KGFsbEJ5dGVMZW5ndGgpO1xyXG4gICAgICBsZXQgY3VycmVudE9mZnNldCA9IDA7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FjaGVHZW9tZXRyeURhdGFMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZ2VvbWV0cnlHcnVwRGF0YS5zZXQodGhpcy5fY2FjaGVHZW9tZXRyeURhdGFMaXN0W2ldLCBjdXJyZW50T2Zmc2V0KTtcclxuICAgICAgICBjdXJyZW50T2Zmc2V0ICs9IHRoaXMuX2NhY2hlR2VvbWV0cnlEYXRhTGlzdFtpXS5sZW5ndGg7XHJcblxyXG4gICAgICAgIHRoaXMuX2NhY2hlR2VvbWV0cnlEYXRhTGlzdFtpXSA9IG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXNfVHTkuI50aHJlYWRJc1J1bm5pbmfkuI3kupLmlqVcclxuICAgICAgLy8g5Y+q5piv5YW2UHJvY2Vzc2luZ0V4ZWN1dGXkuI50aHJlYWRJc1J1bm5pbmfkupLmlqVcclxuICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgIC8vIOW8guatpeaJp+ihjEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleSzkuJTkuI3og73kuI7nur/nqIvlkIzml7bmiafooYxcclxuICAgICAgICBpZiAodGhpcy5jaGVja1N0cmVhbVRvR2VvbWV0cnlEaXNhYmxlKCkpIHtcclxuICAgICAgICAgIC8vIGlmICh0aGlzLmlzQnVzeSkge1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJidXN5IHwgdGhyZWFkSXNSdW5pbmcsSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V55bu25ZCOXCIpO1xyXG4gICAgICAgICAgLy8gcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9jdXJyZW50TWVtb3J5U2l6ZSArPSBhbGxCeXRlTGVuZ3RoICogMztcclxuICAgICAgICAgIGxldCBpc0ZyZWUgPSB0aGlzLmVuc3VyZUN1cnJlbnRNZW1vcnlTaXplKCk7XHJcbiAgICAgICAgICBpZiAoaXNGcmVlKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwia2V5czpcIiwga2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1VwZGF0ZVR0KSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90aHJlYWRVUFZJc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXNfVHRfU3RhcnRcIik7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzX1R0KFxyXG4gICAgICAgICAgICAgICAgICAgIGtleXMsXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnlHcnVwRGF0YSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdLZXlcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fc2VnbWVudExvYWRpbmdDb3VudCAtPSBrZXlzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICAgIC8vICAgXCJfc2VnbWVudExvYWRpbmdDb3VudDpcIixcclxuICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLl9zZWdtZW50TG9hZGluZ0NvdW50XHJcbiAgICAgICAgICAgICAgICAgIC8vICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9LCAyMCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzXCIsIGtleXMubGVuZ3RoKTtcclxuICAgICAgICAgICAgICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzKGtleXMsIGdlb21ldHJ5R3J1cERhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3NlZ21lbnRMb2FkaW5nQ291bnQgLT0ga2V5cy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJfc2VnbWVudExvYWRpbmdDb3VudDpcIiwgdGhpcy5fc2VnbWVudExvYWRpbmdDb3VudCk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXModHJ1ZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWVtb3J5IGlzIGZ1bGwgZnJvbSBjYWNoZVwiKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTtcclxuICAgICAgICAgIC8vIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMjApO1xyXG5cclxuICAgICAgdGhpcy5fY2FjaGVTZWdLZXlzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgICAgdGhpcy5fY2FjaGVHZW9tZXRyeURhdGFMaXN0ID0gbmV3IEFycmF5PFVpbnQ4QXJyYXk+KCk7XHJcbiAgICAgIHRoaXMuX2NhY2hlRGF0YVNpemUgPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmluZFZpZXdlckJ5S2V5KHZpZXdfa2V5KTogVmlld2VyIHtcclxuICAgIGxldCB2aWV3ZXIgPSBudWxsO1xyXG4gICAgUHJvY2Vzcy5wcm9jZXNzTGlzdC5mb3JFYWNoKChwcm9jZXNzKSA9PiB7XHJcbiAgICAgIHByb2Nlc3Mudmlld2Vycy5mb3JFYWNoKCh2aSkgPT4ge1xyXG4gICAgICAgIGlmICh2aS52aWV3S2V5ID09IHZpZXdfa2V5KSB7XHJcbiAgICAgICAgICB2aWV3ZXIgPSB2aTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodmlld2VyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXZpZXdlcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIuaJvuS4jeWIsHZpZXdlclwiKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmlld2VyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVWaWV3KGNvbnRhaW5lcklkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpO1xyXG4gICAgLy90aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuICAgIC8vIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IFwiMFwiO1xyXG4gICAgLy90aGlzLmNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9IFwibm9uZVwiO1xyXG4gICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJjYW52YXNfXCIgKyBjb250YWluZXJJZCk7XHJcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgIHRoaXMuY2FudmFzLnN0eWxlLmxlZnQgPSBcIjBweFwiO1xyXG4gICAgdGhpcy5jYW52YXMuc3R5bGUucmlnaHQgPSBcIjBweFwiO1xyXG4gICAgdGhpcy5jYW52YXMuc3R5bGUuekluZGV4ID0gXCIwXCI7XHJcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS50b3VjaEFjdGlvbiA9IFwibm9uZVwiO1xyXG4gICAgLy8gdGhpcy5jYW52YXMudGFiSW5kZXggPSAxO1xyXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDtcclxuICAgIHRoaXMuY2FudmFzLm9uY29udGV4dG1lbnUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XHJcbiAgICB0aGlzLmNvbnRhaW5lcltcInZpZXdlclwiXSA9IHRoaXM7XHJcblxyXG4gICAgdGhpcy5fd2lkdGggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMuX2hlaWdodCA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICB0aGlzLl9hc3BlY3RSYXRpbyA9IHRoaXMuX3dpZHRoIC8gdGhpcy5faGVpZ2h0O1xyXG5cclxuICAgIEpTX09wZW5fU2VnbWVudChcIi9kcml2ZXIvZW1zY3JpcHRlblwiKTtcclxuICAgIHtcclxuICAgICAgSlNfU2V0X0RyaXZlcl9Db25maWdzKFwiZHJpdmVyPWVtc2NyaXB0ZW5cIik7XHJcblxyXG4gICAgICB0aGlzLl92aWV3S2V5ID0gSlNfT3Blbl9TZWdtZW50KGNvbnRhaW5lcklkKTtcclxuICAgICAge1xyXG4gICAgICAgIEpTX1NldF9Ecml2ZXJfT3B0aW9ucyhcclxuICAgICAgICAgIFwidmlld2VyIGlkPScjY2FudmFzX1wiICsgY29udGFpbmVySWQgKyBcIicsc2VsZWN0aW9uIHRvbGVyYW5jZT0wLjAwNVwiXHJcbiAgICAgICAgKTtcclxuICAgICAgICBKU19TZXRfU2hhZGVyKFwibmFtZT1ibGlubiBwaG9uZ1wiKTtcclxuICAgICAgICBKU19TZXRfVmlld3BvcnQoMCwgMCwgMSwgMSwgXCJ3aW5kb3dcIik7XHJcblxyXG4gICAgICAgIEpTX1NldF9Db2xvcihcImxpZ2h0cz0ocj0xLGc9MSxiPTEpLGFtYmllbnRzPShyPTAuNSxnPTAuNSxiPTAuNSlcIik7XHJcbiAgICAgICAgSlNfU2V0X0NvbG9yKFxyXG4gICAgICAgICAgXCJiYWNrZ3JvdW5kPShyPTEuMCxnPTEuMCxiPTEuMCksbWFya2Vycz0ocj0wLjAsZz0xLjAsYj0wLjApLGxpbmVzPShyPTAuMCxnPTEuMCxiPTAuMCksdmVydGljZXM9KHI9MC4wLGc9MS4wLGI9MC4wKSxlZGdlcz0ocj0wLjAsZz0xLjAsYj0wLjApLGZhY2VzPShjb2xvcj0ocj0wLjAsZz0xLjAsYj0wLjI3KSxlbWlzc2l2ZT0ocj0wLjAsZz0wLjAsYj0wLjApLHRyYW5zcGFyZW5jeT0xLjAsbWV0YWxsaWM9MC4xLHJvdWdobmVzcz0wLjIsc3BlY3VsYXI9MC41LGRpZmZ1c2U9LSksY3V0dGluZyBmYWNlcz0oY29sb3I9KHI9MS4wLGc9MC44LGI9MC4wKSxkaWZmdXNlPS0pXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIEpTX1NldF9WaXNpYmlsaXR5KFwibGlnaHRzPW9uLGN1dHRpbmcgcGxhbmVzPW9mZlwiKTtcclxuICAgICAgICBKU19TZXRfUmVuZGVyaW5nX09wdGlvbnMoXHJcbiAgICAgICAgICBcIm1hcmtlciBzaXplPTYsdmVydGV4IHNpemU9NixsaW5lIHdpZHRoPTMsZWRnZSB3aWR0aD0zLG1lc2ggbGluZT1vZmYsbWVzaCBlZGdlPW9mZixjdWxsIGJhY2sgZmFjZT1vbixsb2dhcml0aG1pYyBkZXB0aCBidWZmZXI9b2ZmLGRlcHRoIHJhbmdlPSgwLDEpLGZhY2Ugb2Zmc2V0PSgwLDApXCJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBKU19JbnNlcnRfSW1hZ2UoXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICAxLFxyXG4gICAgICAgICAgMSxcclxuICAgICAgICAgIG5ldyBJbnQ4QXJyYXkoWzI1NSwgMjU1LCAyNTUsIDI1NV0pLFxyXG4gICAgICAgICAgXCJuYW1lPS0sbG9jYWxcIlxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NjZW5lS2V5ID0gSlNfT3Blbl9TZWdtZW50KFwic2NlbmVcIik7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYShcclxuICAgICAgICAgICAgWzAsIDAsIDVdLFxyXG4gICAgICAgICAgICBbMCwgMCwgMF0sXHJcbiAgICAgICAgICAgIFswLCAxLCAwXSxcclxuICAgICAgICAgICAgMi4wLFxyXG4gICAgICAgICAgICAyLjAsXHJcbiAgICAgICAgICAgIFwib3J0aG9ncmFwaGljXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBKU19JbnNlcnRfTGlnaHQoMCwgMC40LCAxLjUsIHRydWUpO1xyXG4gICAgICAgICAgSlNfU2V0X01vZGVsbGluZ01hdHJpeChbXHJcbiAgICAgICAgICAgIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsXHJcbiAgICAgICAgICBdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgICB0aGlzLl9zY3JlZW5LZXkgPSBKU19PcGVuX1NlZ21lbnQoXCJzY3JlZW5cIik7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYShcclxuICAgICAgICAgICAgWzAsIDAsIDVdLFxyXG4gICAgICAgICAgICBbMCwgMCwgMF0sXHJcbiAgICAgICAgICAgIFswLCAxLCAwXSxcclxuICAgICAgICAgICAgMi4wLFxyXG4gICAgICAgICAgICAyLjAsXHJcbiAgICAgICAgICAgIFwib3J0aG9ncmFwaGljXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBKU19TZXRfTW9kZWxsaW5nTWF0cml4KFtcclxuICAgICAgICAgICAgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSxcclxuICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgSlNfU2V0X1JlbmRlcmluZ19PcHRpb25zKFxyXG4gICAgICAgICAgICBcInN5bmMgdXBkYXRlPW9uLGRlcHRoIHJhbmdlPSgwLjAsIDAuMSksc2NyZWVuIGRyYXdpbmc9b24sdmlldyBmcnVzdHVtIGN1bGxpbmc9b2ZmLGN1bGxpbmcgbWF4aW11bSBleHRlbnQ9MFwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgSlNfU2V0X0hldXJpc3RpY19PcHRpb25zKFwiZXhjbHVkZSBib3VuZGluZz1vblwiKTtcclxuICAgICAgICAgIEpTX1NldF9WaXNpYmlsaXR5KFwibGlnaHRzPW9mZlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICBKU19PcGVuX1NlZ21lbnQoXCIvaW5jbHVkZSBsaWJyYXJ5XCIpO1xyXG4gICAge1xyXG4gICAgICB0aGlzLl9tb2RlbEtleSA9IEpTX09wZW5fU2VnbWVudChcIm1vZGVsX1wiICsgY29udGFpbmVySWQpO1xyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICB9XHJcbiAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgSlNfT3Blbl9TZWdtZW50KFwiL3N0eWxlIGxpYnJhcnlcIik7XHJcbiAgICB7XHJcbiAgICAgIHRoaXMuX3N0eWxlS2V5ID0gSlNfT3Blbl9TZWdtZW50KFwic3R5bGVfXCIgKyBjb250YWluZXJJZCk7XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAvL0pTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgSlNfVXBkYXRlX0Rpc3BsYXkoKTtcclxuXHJcbiAgICB0aGlzLmdsID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIndlYmdsMlwiKTtcclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLl9vblJlc2l6ZSk7XHJcblxyXG4gICAgLy9hZGRSZXNpemVMaXN0ZW5lcih0aGlzLmNvbnRhaW5lciwgZnVuY3Rpb24gcmVzaXplKGU6IEV2ZW50KSB7XHJcbiAgICAvLyAgICB2aS5jYW52YXMud2lkdGggPSB2aS5jb250YWluZXIub2Zmc2V0V2lkdGg7XHJcbiAgICAvLyAgICB2aS5jYW52YXMuaGVpZ2h0ID0gdmkuY29udGFpbmVyLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAvLyAgICB2aS5fd2lkdGggPSB2aS5jb250YWluZXIub2Zmc2V0V2lkdGg7XHJcbiAgICAvLyAgICB2aS5faGVpZ2h0ID0gdmkuY29udGFpbmVyLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAvLyAgICB2aS5fYXNwZWN0UmF0aW8gPSB2aS5fd2lkdGggLyB2aS5faGVpZ2h0O1xyXG5cclxuICAgIC8vICAgIEpTX1Jlc2l6ZV9CeV9LZXkodmkuX3ZpZXdLZXkpO1xyXG4gICAgLy8gICAgdmkudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgLy99KVxyXG5cclxuICAgIC8vdGhpcy5jYW52YXMub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZTogTW91c2VFdmVudCkge1xyXG4gICAgLy8gICAgaWYgKGUuYnV0dG9uID09IDApIHtcclxuICAgIC8vICAgICAgICB2aS5sQnV0dG9uRG93biA9IHRydWU7XHJcblxyXG4gICAgLy8gICAgICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICAgICAgdmFsdWUub25MQnV0dG9uRG93bihuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuICAgIC8vICAgIGVsc2UgaWYgKGUuYnV0dG9uID09IDIpIHtcclxuICAgIC8vICAgICAgICB2aS5yQnV0dG9uRG93biA9IHRydWU7XHJcblxyXG4gICAgLy8gICAgICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICAgICAgdmFsdWUub25SQnV0dG9uRG93bihuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuICAgIC8vICAgIGVsc2UgaWYgKGUuYnV0dG9uID09IDEpIHtcclxuICAgIC8vICAgICAgICB2aS5tQnV0dG9uRG93biA9IHRydWU7XHJcblxyXG4gICAgLy8gICAgICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICAgICAgdmFsdWUub25NQnV0dG9uRG93bihuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuICAgIC8vfVxyXG5cclxuICAgIC8vdGhpcy5jYW52YXMub25tb3VzZXVwID0gZnVuY3Rpb24gKGU6IE1vdXNlRXZlbnQpIHtcclxuICAgIC8vICAgIGlmIChlLmJ1dHRvbiA9PSAwKSB7XHJcbiAgICAvLyAgICAgICAgdmkubEJ1dHRvbkRvd24gPSBmYWxzZTtcclxuXHJcbiAgICAvLyAgICAgICAgdmkub3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBPcGVyYXRvcikge1xyXG4gICAgLy8gICAgICAgICAgICB2YWx1ZS5vbkxCdXR0b25VcChuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuICAgIC8vICAgIGVsc2UgaWYgKGUuYnV0dG9uID09IDIpIHtcclxuICAgIC8vICAgICAgICB2aS5yQnV0dG9uRG93biA9IGZhbHNlO1xyXG5cclxuICAgIC8vICAgICAgICB2aS5vcGVyYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IE9wZXJhdG9yKSB7XHJcbiAgICAvLyAgICAgICAgICAgIHZhbHVlLm9uUkJ1dHRvblVwKG5ldyBWaWV3ZXJFdmVudCh2aSwgZSkpO1xyXG4gICAgLy8gICAgICAgIH0pO1xyXG4gICAgLy8gICAgfVxyXG4gICAgLy8gICAgZWxzZSBpZiAoZS5idXR0b24gPT0gMSkge1xyXG4gICAgLy8gICAgICAgIHZpLm1CdXR0b25Eb3duID0gZmFsc2U7XHJcblxyXG4gICAgLy8gICAgICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICAgICAgdmFsdWUub25NQnV0dG9uVXAobmV3IFZpZXdlckV2ZW50KHZpLCBlKSk7XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICAvLyAgICB9XHJcbiAgICAvL31cclxuXHJcbiAgICAvL3RoaXMuY2FudmFzLm9ubW91c2Vtb3ZlID0gZnVuY3Rpb24gKGU6IE1vdXNlRXZlbnQpIHtcclxuICAgIC8vICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICB2YWx1ZS5vbk1vdXNlTW92ZShuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgIH0pO1xyXG5cclxuICAgIC8vICAgIGlmICh2aS5sQnV0dG9uRG93bikge1xyXG4gICAgLy8gICAgICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICAgICAgdmFsdWUub25MQnV0dG9uRG93bkFuZE1vdmUobmV3IFZpZXdlckV2ZW50KHZpLCBlKSk7XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICAvLyAgICB9XHJcblxyXG4gICAgLy8gICAgaWYgKHZpLm1CdXR0b25Eb3duKSB7XHJcbiAgICAvLyAgICAgICAgdmkub3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBPcGVyYXRvcikge1xyXG4gICAgLy8gICAgICAgICAgICB2YWx1ZS5vbk1CdXR0b25Eb3duQW5kTW92ZShuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuXHJcbiAgICAvLyAgICBpZiAodmkuckJ1dHRvbkRvd24pIHtcclxuICAgIC8vICAgICAgICB2aS5vcGVyYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IE9wZXJhdG9yKSB7XHJcbiAgICAvLyAgICAgICAgICAgIHZhbHVlLm9uUkJ1dHRvbkRvd25BbmRNb3ZlKG5ldyBWaWV3ZXJFdmVudCh2aSwgZSkpO1xyXG4gICAgLy8gICAgICAgIH0pO1xyXG4gICAgLy8gICAgfVxyXG4gICAgLy99XHJcblxyXG4gICAgLy90aGlzLmNhbnZhcy5vbm1vdXNld2hlZWwgPSBmdW5jdGlvbiAoZTogV2hlZWxFdmVudCkge1xyXG4gICAgLy8gICAgdmkub3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBPcGVyYXRvcikge1xyXG4gICAgLy8gICAgICAgIHZhbHVlLm9uTW91c2VXaGVlbChuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgIH0pO1xyXG4gICAgLy99XHJcblxyXG4gICAgLy90aGlzLmNhbnZhcy5vbnRvdWNoc3RhcnQgPSBmdW5jdGlvbiAoZTogVG91Y2hFdmVudCkge1xyXG4gICAgLy8gICAgdmkudG91Y2hpbmcgPSB0cnVlO1xyXG5cclxuICAgIC8vICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICB2YWx1ZS5vblRvdWNoU3RhcnQobmV3IFZpZXdlckV2ZW50KHZpLCBlKSk7XHJcbiAgICAvLyAgICB9KTtcclxuICAgIC8vfVxyXG5cclxuICAgIC8vdGhpcy5jYW52YXMub250b3VjaG1vdmUgPSBmdW5jdGlvbiAoZTogVG91Y2hFdmVudCkge1xyXG4gICAgLy8gICAgdmkub3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBPcGVyYXRvcikge1xyXG4gICAgLy8gICAgICAgIHZhbHVlLm9uVG91Y2hNb3ZlKG5ldyBWaWV3ZXJFdmVudCh2aSwgZSkpO1xyXG4gICAgLy8gICAgfSk7XHJcbiAgICAvL31cclxuXHJcbiAgICAvL3RoaXMuY2FudmFzLm9udG91Y2hlbmQgPSBmdW5jdGlvbiAoZTogVG91Y2hFdmVudCkge1xyXG4gICAgLy8gICAgdmkudG91Y2hpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvLyAgICB2aS5vcGVyYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IE9wZXJhdG9yKSB7XHJcbiAgICAvLyAgICAgICAgdmFsdWUub25Ub3VjaEVuZChuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgIH0pO1xyXG4gICAgLy99XHJcblxyXG4gICAgLy90aGlzLmNhbnZhcy5vbnRvdWNoY2FuY2VsID0gZnVuY3Rpb24gKGU6IFRvdWNoRXZlbnQpIHtcclxuICAgIC8vICAgIHZpLnRvdWNoaW5nID0gZmFsc2U7XHJcblxyXG4gICAgLy8gICAgdmkub3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBPcGVyYXRvcikge1xyXG4gICAgLy8gICAgICAgIHZhbHVlLm9uVG91Y2hDYW5jZWwobmV3IFZpZXdlckV2ZW50KHZpLCBlKSk7XHJcbiAgICAvLyAgICB9KTtcclxuICAgIC8vfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLl9vblJlc2l6ZSk7XHJcbiAgICB0aGlzLnhockxpc3QuZm9yRWFjaCgoeGhyKSA9PiB7XHJcbiAgICAgIHhoci5hYm9ydCgpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmltYWdlVXJscyA9IHt9O1xyXG5cclxuICAgIC8vSlNfRmluYV9EYXRhYmFzZSgpO1xyXG4gICAgaWYgKHRoaXMuX3ZpZXdLZXkgIT0gLTEpIHtcclxuICAgICAgSlNfRGVsZXRlX0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgICAgdGhpcy5fdmlld0tleSA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9tb2RlbEtleSAhPSAtMSkge1xyXG4gICAgICBKU19EZWxldGVfQnlfS2V5KHRoaXMuX21vZGVsS2V5KTtcclxuICAgICAgdGhpcy5fbW9kZWxLZXkgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fc3R5bGVLZXkgIT0gLTEpIHtcclxuICAgICAgSlNfRGVsZXRlX0J5X0tleSh0aGlzLl9zdHlsZUtleSk7XHJcbiAgICAgIHRoaXMuX3N0eWxlS2V5ID0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zY2VuZUNhbWVyYUNoYW5nZWQuY2xlYXIoKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XHJcbiAgICB0aGlzLmNhbnZhcyA9IG51bGw7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmViaW5kKGNvbnRhaW5lcklkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY3JlYXRlVmlldyhjb250YWluZXJJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW5zdXJlTWVtb3J5U2l6ZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBhbGxvY2F0ZWRfc2l6ZSA9IEpTX1Nob3dfQWxsb2NhdGVkX01lbW9yeV9TaXplKCk7XHJcbiAgICB0aGlzLl9jdXJyZW50TWVtb3J5U2l6ZSA9IGFsbG9jYXRlZF9zaXplO1xyXG4gICAgaWYgKGFsbG9jYXRlZF9zaXplID4gMjE0NzQ4MzY0OCAqIHRoaXMubWF4TWVtb3J5RmFjdG9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVuc3VyZUN1cnJlbnRNZW1vcnlTaXplKCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJrZXlzOl9jdXJyZW50TWVtb3J5U2l6ZTpcIiwgdGhpcy5fY3VycmVudE1lbW9yeVNpemUpO1xyXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRNZW1vcnlTaXplID4gMjE0NzQ4MzY0OCAqIHRoaXMubWF4TWVtb3J5RmFjdG9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB2aWV3S2V5KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmlld0tleTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc2NlbmVLZXkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zY2VuZUtleTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbW9kZWxLZXkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlbEtleTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc3R5bGVLZXkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zdHlsZUtleTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNCdXN5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzQnVzeTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgaXNCdXN5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc0J1c3kgPSB2YWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5faXNCdXN5KSB7XHJcbiAgICAgIC8v5Lit5pat5pON5L2cLlxyXG4gICAgICAvL+Wwhuivt+axguaxoOS4reeahOi/kOihjOS4reivt+axguWJlOmZpC5cclxuICAgICAgLy8gdGhpcy5sb2FkaW5nTGlzdC5jbGVhcigpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImJ1c3ksY291bnQ6XCIsIHRoaXMubG9hZGluZ0xpc3QuY291bnQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgZ2V0IGJ1dHRvblVwSXNCdXN5KCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2J1dHRvblVwSXNCdXN5O1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHVibGljIHNldCBidXR0b25VcElzQnVzeSh2YWx1ZSkge1xyXG4gIC8vICAgdGhpcy5fYnV0dG9uVXBJc0J1c3kgPSB2YWx1ZTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNVcGRhdGVUdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1VwZGF0ZVR0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBpc1VwZGF0ZVR0KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc1VwZGF0ZVR0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGlzU2hhcmVkQXJyYXlCdWZmZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNTaGFyZWRBcnJheUJ1ZmZlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgaXNTaGFyZWRBcnJheUJ1ZmZlcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNTaGFyZWRBcnJheUJ1ZmZlciA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc0NhY2hlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzQ2FjaGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGlzQ2FjaGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzQ2FjaGUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdGVzdEdzbElkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rlc3RHc2xJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgdGVzdEdzbElkKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3Rlc3RHc2xJZCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB1cGRhdGVUeXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZVR5cGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHVwZGF0ZVR5cGUodmFsdWU6IFVwZGF0ZVR5cGUpIHtcclxuICAgIGlmIChcclxuICAgICAgdmFsdWUgPT0gVXBkYXRlVHlwZS5Bc3luY2hyb25pemF0aW9uICYmXHJcbiAgICAgIHRoaXMuX3VwZGF0ZVR5cGUgPT0gVXBkYXRlVHlwZS5TeW5jaHJvbml6YXRpb25cclxuICAgICkge1xyXG4gICAgICB0aGlzLl91cGRhdGVUeXBlID0gdmFsdWU7XHJcblxyXG4gICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcclxuICAgICAgLy8gbGV0IGRyYXcgPSAodGltZSkgPT4ge1xyXG4gICAgICAvLyAgIC8vIGNvbnNvbGUubG9nKFwiZHJhd1wiKVxyXG4gICAgICAvLyAgIC8vIGlmICghdGhpcy5faXNCdXN5ICYmIHRoaXMuX2FzeW5VcGRhdGVLZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gICAvLyAgICAgdGhpcy5fYXN5blVwZGF0ZUtleXMgPSBKU19TaG93X0FzeW5fTmVlZF9VcGRhdGVfS2V5cygpIGFzIEludDMyQXJyYXk7XHJcblxyXG4gICAgICAvLyAgIC8vICAgICBjb25zb2xlLmxvZyhcImtleXNcIiwgdGhpcy5fYXN5blVwZGF0ZUtleXMubGVuZ3RoKVxyXG4gICAgICAvLyAgIC8vICAgICBpZiAodGhpcy5fYXN5blVwZGF0ZUtleXMubGVuZ3RoID4gMCAmJiB0aGlzLl9wcmV2aW91c1VwZGF0ZUtleXNMZW5ndGggIT0gdGhpcy5fYXN5blVwZGF0ZUtleXMubGVuZ3RoKSB7XHJcbiAgICAgIC8vICAgLy8gICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2FzeW5VcGRhdGVLZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vICAgLy8gICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vICAgLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0J1c3kpIHtcclxuICAgICAgLy8gICAvLyAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XHJcbiAgICAgIC8vICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgIC8vICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgICAgLy8gICAvLyAgICAgICAgICAgICAgICAgSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnkodGhpcy5fYXN5blVwZGF0ZUtleXNbaV0sIG51bGwpO1xyXG5cclxuICAgICAgLy8gICAvLyAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgLy8gICAvLyAgICAgICAgICAgICAgICAgdGltZXIgPSBudWxsO1xyXG4gICAgICAvLyAgIC8vICAgICAgICAgICAgIH0sIGkgLyAxMDApO1xyXG4gICAgICAvLyAgIC8vICAgICAgICAgfVxyXG4gICAgICAvLyAgIC8vICAgICB9XHJcbiAgICAgIC8vICAgLy8gfVxyXG5cclxuICAgICAgLy8gICAvLyBpZiAodGhpcy5faXNCdXN5IHx8IHRoaXMuX2FzeW5VcGRhdGVLZXlzLmxlbmd0aCA9PSAwIHx8IHRoaXMuX3ByZXZpb3VzVXBkYXRlS2V5c0xlbmd0aCAhPSB0aGlzLl9hc3luVXBkYXRlS2V5cy5sZW5ndGgpXHJcbiAgICAgIC8vICAgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcblxyXG4gICAgICAvLyAgIC8vIHRoaXMuX3ByZXZpb3VzVXBkYXRlS2V5c0xlbmd0aCA9IHRoaXMuX2FzeW5VcGRhdGVLZXlzLmxlbmd0aDtcclxuXHJcbiAgICAgIC8vICAgaWYgKHRoaXMuX3J1bm5pbmcpIHtcclxuICAgICAgLy8gICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShkcmF3KTtcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH07XHJcbiAgICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZShkcmF3KTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHZhbHVlID09IFVwZGF0ZVR5cGUuU3luY2hyb25pemF0aW9uICYmXHJcbiAgICAgIHRoaXMuX3VwZGF0ZVR5cGUgPT0gVXBkYXRlVHlwZS5Bc3luY2hyb25pemF0aW9uXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5fdXBkYXRlVHlwZSA9IHZhbHVlO1xyXG5cclxuICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIOWGheWtmOmZkOWItiAqL1xyXG4gIHB1YmxpYyBnZXQgZHluYW1pY01lbW9yeSgpOiBEeW5hbWljTWVtb3J5VHlwZSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gRHluYW1pY01lbW9yeVR5cGUuTm9uZTtcclxuXHJcbiAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAge1xyXG4gICAgICBsZXQgZG0gPSBKU19TaG93X09uZV9SZW5kZXJpbmdfT3B0aW9uKFwiZHluYW1pYyBtZW1vcnlcIik7XHJcbiAgICAgIGlmIChkbSA9PSBcImNsaWVudFwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gRHluYW1pY01lbW9yeVR5cGUuQ2xpZW50O1xyXG4gICAgICB9IGVsc2UgaWYgKGRtID09IFwic2VydmVyXCIpIHtcclxuICAgICAgICByZXN1bHQgPSBEeW5hbWljTWVtb3J5VHlwZS5TZXJ2ZXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0ID0gRHluYW1pY01lbW9yeVR5cGUuTm9uZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKiog6K6+572u5YaF5a2Y6ZmQ5Yi2ICovXHJcbiAgcHVibGljIHNldCBkeW5hbWljTWVtb3J5KHR5cGU6IER5bmFtaWNNZW1vcnlUeXBlKSB7XHJcbiAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAge1xyXG4gICAgICBKU19TZXRfUmVuZGVyaW5nX09wdGlvbnMoXHJcbiAgICAgICAgXCJkeW5hbWljIG1lbW9yeT1cIiArIER5bmFtaWNNZW1vcnlUeXBlW3R5cGVdLnRvTG93ZXJDYXNlKClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICB9XHJcblxyXG4gIC8qKiDlhoXlrZjpmZDliLbpmIjlgLwgKi9cclxuICBwdWJsaWMgZ2V0IGR5bmFtaWNNZW1vcnlUaHJlc2hvbGQoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQgPSAwLjA7XHJcblxyXG4gICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgIHtcclxuICAgICAgbGV0IGRtID0gSlNfU2hvd19PbmVfUmVuZGVyaW5nX09wdGlvbihcImR5bmFtaWMgbWVtb3J5IHRocmVzaG9sZFwiKTtcclxuICAgICAgaWYgKGRtKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcGFyc2VGbG9hdChkbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqIOiuvue9ruWGheWtmOmZkOWItumYiOWAvCAqL1xyXG4gIHB1YmxpYyBzZXQgZHluYW1pY01lbW9yeVRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAge1xyXG4gICAgICBKU19TZXRfUmVuZGVyaW5nX09wdGlvbnMoXCJkeW5hbWljIG1lbW9yeSB0aHJlc2hvbGQ9XCIgKyB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGxpZ2h0aW5nTW9kZSgpOiBMaWdodGluZ01vZGUge1xyXG4gICAgbGV0IHJlc3VsdCA9IExpZ2h0aW5nTW9kZS5Ob25lO1xyXG4gICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgIHtcclxuICAgICAgbGV0IG5hbWUgPSBKU19TaG93X09uZV9TaGFkZXIoXCJuYW1lXCIpO1xyXG4gICAgICBpZiAobmFtZSA9PSBcInBob25nXCIpIHtcclxuICAgICAgICByZXN1bHQgPSBMaWdodGluZ01vZGUuUGhvbmc7XHJcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBcImJsaW5uIHBob25nXCIpIHtcclxuICAgICAgICByZXN1bHQgPSBMaWdodGluZ01vZGUuQmxpbm5QaG9uZztcclxuICAgICAgfSBlbHNlIGlmIChuYW1lID09IFwibGFtYmVydFwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gTGlnaHRpbmdNb2RlLkxhbWJlcnQ7XHJcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBcImhhbGYgbGFtYmVydFwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gTGlnaHRpbmdNb2RlLkhhbGZMYW1iZXJ0O1xyXG4gICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gXCJiYW5kZWRcIikge1xyXG4gICAgICAgIHJlc3VsdCA9IExpZ2h0aW5nTW9kZS5CYW5kZWQ7XHJcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBcInBiclwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gTGlnaHRpbmdNb2RlLlBCUjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGxpZ2h0aW5nTW9kZShtb2RlOiBMaWdodGluZ01vZGUpIHtcclxuICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgICB7XHJcbiAgICAgIGlmIChtb2RlID09IExpZ2h0aW5nTW9kZS5QaG9uZykge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gcGhvbmdcIik7XHJcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBMaWdodGluZ01vZGUuQmxpbm5QaG9uZykge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gYmxpbm4gcGhvbmdcIik7XHJcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBMaWdodGluZ01vZGUuTGFtYmVydCkge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gbGFtYmVydFwiKTtcclxuICAgICAgfSBlbHNlIGlmIChtb2RlID09IExpZ2h0aW5nTW9kZS5IYWxmTGFtYmVydCkge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gaGFsZiBsYW1iZXJ0XCIpO1xyXG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTGlnaHRpbmdNb2RlLkJhbmRlZCkge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gYmFuZGVkXCIpO1xyXG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTGlnaHRpbmdNb2RlLlBCUikge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gcGJyXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgfVxyXG5cclxuICBhc3luVVBHRFRhc2tSdW4oKSB7XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHRfU3RhcnRcIik7XHJcbiAgICAvL+eQhuiuuuS4iuaJp+ihjOWIsOi/memHjOeahOS7o+eggSx0aHJlYWRVUEdESXNSdW5uaW5n5LiN5Lya5Li6dHJ1ZS5cclxuICAgIC8vIGlmICghdGhpcy5fdGhyZWFkVVBHRElzUnVubmluZykge1xyXG4gICAgSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHQodGhpcy52aWV3S2V5LCAtMSk7XHJcbiAgICB0aGlzLl90aHJlYWRVUEdESXNSdW5uaW5nID0gdHJ1ZTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIC8vIGFzeW5VUEdEVGFza1J1bigpIHtcclxuICAvLyAgIC8vIGNvbnNvbGUubG9nKFwicnVuOlwiLCB0aGlzLlVQR0RUYXNrTGlzdC5sZW5ndGgpO1xyXG4gIC8vICAgaWYgKHRoaXMuX1VQR0RUYXNrTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgIC8v55CG6K665LiK5omn6KGM5Yiw6L+Z6YeM55qE5Luj56CBLHRocmVhZFVQR0RJc1J1bm5pbmfkuI3kvJrkuLp0cnVlLlxyXG4gIC8vICAgICAvLyBpZiAoIXRoaXMuX3RocmVhZFVQR0RJc1J1bm5pbmcpIHtcclxuICAvLyAgICAgaWYgKCF0aGlzLnRocmVhZElzUnVubmluZykge1xyXG4gIC8vICAgICAgIGNvbnNvbGUubG9nKFwiSlNfQXN5bl9VcGRhdGVfUGFydGlhbF9HZW9tZXRyeV9EYXRhX0J5X0tleV9UdF9TdGFydFwiKTtcclxuICAvLyAgICAgICAvLyBsZXQgbW9kZWxTZWdtZW50S2V5ID0gdGhpcy5fVVBHRFRhc2tMaXN0LnNwbGljZSgwLCAxKTtcclxuICAvLyAgICAgICAvLyBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleV9UdChcclxuICAvLyAgICAgICAvLyAgIHRoaXMudmlld0tleSxcclxuICAvLyAgICAgICAvLyAgIG1vZGVsU2VnbWVudEtleVswXVxyXG4gIC8vICAgICAgIC8vICk7XHJcblxyXG4gIC8vICAgICAgIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0KHRoaXMudmlld0tleSwgLTEpO1xyXG4gIC8vICAgICAgIHRoaXMuX3RocmVhZFVQR0RJc1J1bm5pbmcgPSB0cnVlO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgbWFrZUNvbnRleHRDdXJyZW50KCkge1xyXG4gICAgSlNfTWFrZV9Db250ZXh0X0N1cnJlbnQodGhpcy5fdmlld0tleSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVidWdMb2cobWVzOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLm1vZGVsRGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2cobWVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEaXNwbGF5U3luY2VkKCkge1xyXG4gICAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGlzcGxheSgpOiBUaHJlYWRQcm9taXNlPFVwZGF0ZUluZm8+IHtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwidXBkYXRlXCIpO1xyXG4gICAgaWYgKHRoaXMuX3VwZGF0ZVR5cGUgPT0gVXBkYXRlVHlwZS5TeW5jaHJvbml6YXRpb24pIHtcclxuICAgICAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcblxyXG4gICAgICByZXR1cm4gbmV3IFRocmVhZFByb21pc2U8VXBkYXRlSW5mbz4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICByZXNvbHZlKG5ldyBVcGRhdGVJbmZvKHRoaXMsIFVwZGF0ZURpc3BsYXlUeXBlLlN5bmNocm9uaXphdGlvbikpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGxldCBuZWVkQXN5blVwZGF0ZSA9IEpTX0FzeW5fTmVlZF9VcGRhdGVfVmlld19CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgICAgIC8vIGlmIChuZWVkQXN5blVwZGF0ZSkge1xyXG4gICAgICAvLyAgIHRoaXMuZGVidWdMb2coXCJuZWVkQXN5blVwZGF0ZVwiKTtcclxuICAgICAgLy8gICB0aGlzLmFzeW5VcGRhdGVWaWV3KCk7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5pc0J1c3kpIHtcclxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwibm90IGJ1c3lcIik7XHJcbiAgICAgICAgSlNfQXN5bl9VcGRhdGVfQ2FtZXJhX0J5X0tleSh0aGlzLnZpZXdLZXkpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlclZpZXdBbGwpIHtcclxuICAgICAgICAgIEpTX0FzeW5fUmVuZGVyX1ZpZXdfQnlfS2V5KHRoaXMuX3ZpZXdLZXksIGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMucmVuZGVyVmlld0FsbCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGxpZ2h0TW9kZWxzID0gbnVsbDtcclxuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5wcm9jZXNzKSB7XHJcbiAgICAgICAgICAvLyBsaWdodE1vZGVscyA9ICh0aGlzIGFzIGFueSkucHJvY2Vzcy5maW5kUmVuZGVyT2JqZWN0c0J5VHlwZShcclxuICAgICAgICAgIC8vICAgXCJMaWdodE1vZGVsXCJcclxuICAgICAgICAgIC8vICk7XHJcbiAgICAgICAgICBsaWdodE1vZGVscyA9ICh0aGlzIGFzIGFueSkucHJvY2Vzcy5maW5kTW9kZWxSZW5kZXJPYmplY3RzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaWdodE1vZGVscykge1xyXG4gICAgICAgICAgaWYgKGxpZ2h0TW9kZWxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmRlYnVnTG9nKFwibGlndGhNb2RlbHMgbGVuZ3RoID0gMFwiKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL+W8gOWQr+S6huWkmue6v+eoiy5cclxuICAgICAgICAgIGlmICh0aGlzLl9pc1VwZGF0ZVR0KSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAhdGhpcy5fdGhyZWFkVVBHRElzUnVubmluZyAmJlxyXG4gICAgICAgICAgICAgIHRoaXMuc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50ID09PSAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHRoaXMuYXN5blVQR0RUYXNrUnVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5KHRoaXMudmlld0tleSk7XHJcbiAgICAgICAgICAgIC8v5Y+q6I635Y+W5Y2V5LiqbGlnaHRNb2RlbOeahOW8guatpeaVsOaNrlxyXG4gICAgICAgICAgICBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleSh0aGlzLnZpZXdLZXksIC0xKTtcclxuXHJcbiAgICAgICAgICAgIC8v6L+Y5pyq5Yqg6L295Yeg5L2V55qEc2VnbWVudOWIl+ihqFxyXG4gICAgICAgICAgICBsZXQgYXN5bktleXM6IEludDMyQXJyYXkgPSBKU19TaG93X0FzeW5fR2VvbWV0cnlfRGF0YV9LZXlzKFxyXG4gICAgICAgICAgICAgIHRoaXMuX3ZpZXdLZXlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5hc3luTG9hZEdlb21ldHJpZXMoYXN5bktleXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFzeW5LZXlzLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcImFzeW5LZXlzLmxlbmd0aCA9IDBcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXN5blJlbW92ZUdlb21ldHJ5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJsaWdodE1vZGVscyBpcyBudWxsXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5aaC5p6cc2VnbWVudOe7k+aehOacieabtOaWsO+8jOWImeebtOaOpeaJp+ihjGNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzXHJcbiAgICAgICAgLy8g5rOoOueOsOWcqOeUseS6juS4gOS6m+WOn+WboO+8jG5lZWRBc3luVXBkYXRl55qE5YC85b+F54S25Li6ZmFsc2UuXHJcbiAgICAgICAgLy8gaWYgKCFuZWVkQXN5blVwZGF0ZSkge1xyXG4gICAgICAgIGxldCBwcm9taXNlID0gbmV3IFRocmVhZFByb21pc2U8VXBkYXRlSW5mbz4oKTtcclxuICAgICAgICB0aGlzLmNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzKGZhbHNlLCBwcm9taXNlKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIGlmICghbmVlZEFzeW5VcGRhdGUgfHwgIXRoaXMuX2lzVXBkYXRlVHQpIHtcclxuICAgICAgICAvLyAgIHRoaXMuY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXMoKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcImJ1c3lcIik7XHJcbiAgICAgICAgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkodGhpcy5fdmlld0tleSwgdGhpcy5pc0ZpeEZyYW1lUmVuZGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaHJlYWRQcm9taXNlPFVwZGF0ZUluZm8+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKG5ldyBVcGRhdGVJbmZvKHRoaXMsIFVwZGF0ZURpc3BsYXlUeXBlLkJ1c3kpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5blJlbW92ZUdlb21ldHJ5KCkge1xyXG4gICAgKCh0aGlzIGFzIGFueSkuYXlzblRhc2tNYW5hZ2VyIGFzIEF5c25UYXNrTWFuYWdlcikuY2xlYXJUYXNrKDMpO1xyXG5cclxuICAgIGxldCByZW1vdmVLZXlzOiBJbnQzMkFycmF5ID0gSlNfU2hvd19Bc3luX1JlbW92ZV9HZW9tZXRyeV9EYXRhX0tleXMoXHJcbiAgICAgIHRoaXMuX3ZpZXdLZXlcclxuICAgICk7XHJcbiAgICBsZXQgY291bnQgPSByZW1vdmVLZXlzLmxlbmd0aDtcclxuICAgIGxldCBwZXJHcm91cExlbmd0aCA9IDEwMDA7XHJcbiAgICBsZXQgZ3JvdXBDb3VudCA9IDA7XHJcbiAgICBsZXQgZ3JvdXAgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7XHJcbiAgICAgIGdyb3VwQ291bnQrKztcclxuICAgICAgZ3JvdXAucHVzaChyZW1vdmVLZXlzW2pdKTtcclxuICAgICAgaWYgKGdyb3VwQ291bnQgPT09IHBlckdyb3VwTGVuZ3RoIHx8IGogPT09IGNvdW50IC0gMSkge1xyXG4gICAgICAgIGxldCBjb3B5R3JvdXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwKSk7XHJcbiAgICAgICAgZ3JvdXBDb3VudCA9IDA7XHJcbiAgICAgICAgZ3JvdXAgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG5cclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiY2xlYXJfR2VvbWV0cnlcIik7XHJcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjb3B5R3JvdXAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkoY29weUdyb3VwW2ldKTtcclxuICAgICAgICAvLyAgIHtcclxuICAgICAgICAvLyAgICAgSlNfQ2xlYXJfR2VvbWV0cnkoKTtcclxuICAgICAgICAvLyAgICAgLy8gSlNfU2V0X0hldXJpc3RpY19PcHRpb25zKFwiYXN5biBnZW9tZXRyeT1vblwiKTtcclxuICAgICAgICAvLyAgICAgSlNfU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uKFwiYXN5biBnZW9tZXRyeVwiLCBcIm9uXCIpO1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy/liKDpmaTlh6DkvZXnmoTlvILmraXku7vliqHkvJjlhYjnuqfkuLozLOS8mOWFiOS6juWIm+W7unZhby5cclxuICAgICAgICAoKHRoaXMgYXMgYW55KS5heXNuVGFza01hbmFnZXIgYXMgQXlzblRhc2tNYW5hZ2VyKS5hc3luVGFzayhcclxuICAgICAgICAgIGFzeW5jIChrZXlMaXN0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQnVzeSB8fCB0aGlzLnRocmVhZElzUnVubmluZykge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJidXN55oiWaXNSdW5uaW5nLHJlbmRlcuW7tuWQjlwiKTtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjbGVhcl9HZW9tZXRyeTogXCIsIGtleUxpc3QubGVuZ3RoKTtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleUxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkoa2V5TGlzdFtpXSk7XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIEpTX0NsZWFyX0dlb21ldHJ5KCk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIEpTX1NldF9IZXVyaXN0aWNfT3B0aW9ucyhcImFzeW4gZ2VvbWV0cnk9b25cIik7XHJcbiAgICAgICAgICAgICAgICAgIEpTX1NldF9PbmVfSGV1cmlzdGljX09wdGlvbihcImFzeW4gZ2VvbWV0cnlcIiwgXCJvblwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgW2NvcHlHcm91cF0sXHJcbiAgICAgICAgICAzXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5bCGa2V55YiX6KGo5oyJ5oyJ5q+P5LiqTGlnaHRNb2Vs6L+b6KGM5YiS5YiGXHJcbiAgICogQHBhcmFtIGFzeW5LZXlzXHJcbiAgICovXHJcbiAgZ3JvdXBpbmdBc3luS2V5c09mRWFjaExpZ2h0TW9kZWwoXHJcbiAgICBhc3luS2V5czogSW50MzJBcnJheSxcclxuICAgIGlkTWFwS2V5czogeyBbaWQ6IHN0cmluZ106IG51bWJlcltdIH1cclxuICApIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXN5bktleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGtleSA9IGFzeW5LZXlzW2ldO1xyXG5cclxuICAgICAgbGV0IG1vZGVsSWQgPSBKU19TaG93X0tleV9UYWcoa2V5KTtcclxuXHJcbiAgICAgIGxldCBhcnJheSA9IGlkTWFwS2V5c1ttb2RlbElkXTtcclxuICAgICAgaWYgKCFhcnJheSkge1xyXG4gICAgICAgIGFycmF5ID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgICAgfVxyXG4gICAgICBhcnJheS5wdXNoKGtleSk7XHJcblxyXG4gICAgICBpZE1hcEtleXNbbW9kZWxJZF0gPSBhcnJheTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luVXBkYXRlVmlldygpIHtcclxuICAgIC8vIEpTX0FzeW5fVXBkYXRlX0NhbWVyYV9CeV9LZXkodGhpcy52aWV3S2V5KTtcclxuICAgIEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG5cclxuICAgIC8vIHRoaXMudW5CdWZmZXJBbmRCdWZmZXJHZW9tZXRyaWVzKCk7XHJcbiAgfVxyXG5cclxuICAvLy9ncm91cElkc0xpc3QtLS1pZOWIl+ihqOeahOWtl+espuS4sueahOaVsOe7hFxyXG4gIC8vL2dyb3VwSWRzLS0taWTliJfooajnmoTlrZfnrKbkuLIs55SoJywn5YiG5YmyXHJcbiAgLy8vZGljdGlvbmFyeS0tLWlk5ZKMc2VnbWVudEtleeeahOaYoOWwhOihqFxyXG4gIHByaXZhdGUgYXN5bkJhdGNoU2V0U2VnbWVudHNEYXRhKFxyXG4gICAgbW9kZWxJZDogc3RyaW5nLFxyXG4gICAgZ3JvdXBJZHNMaXN0OiBzdHJpbmdbXSxcclxuICAgIHZlcnNpb246IG51bWJlcixcclxuICAgIGRpY3Rpb25hcnk6IHsgW2lkOiBzdHJpbmddOiBudW1iZXIgfVxyXG4gICkge1xyXG4gICAgbGV0IHRva2VuID0gZ2V0Q29va2llKFwiR3NUb2tlblwiKTtcclxuICAgIGlmICghdG9rZW4pIHtcclxuICAgICAgLy8gY29uc29sZS53YXJuKFwi6K+35rGC5pyq5pC65bimVG9rZW7vvIHvvIHvvIFcIilcclxuICAgIH1cclxuXHJcbiAgICAvL+avj+S4quWIhue7hOaJuemHj+ivt+axgi5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBJZHNMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLmdldEFzeW5Hcm91cEdlb0RhdGFBY3Rpb24pIHtcclxuICAgICAgICBsZXQgYWN0aW9uID0gdGhpcy5nZXRBc3luR3JvdXBHZW9EYXRhQWN0aW9uKG1vZGVsSWQsIHZlcnNpb24pO1xyXG5cclxuICAgICAgICBsZXQgeGhyOiBYTUxIdHRwUmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIHRoaXMueGhyTGlzdC5hZGQoeGhyKTtcclxuICAgICAgICAvLyBsZXQgdXJsID0gYWN0aW9uLnVybCArIGdyb3Vwc1tpXTtcclxuICAgICAgICB4aHIub3BlbihhY3Rpb24uaHR0cFR5cGUsIGFjdGlvbi51cmwsIHRydWUpO1xyXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcclxuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJibG9iXCI7XHJcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIiwgXCIqXCIpO1xyXG4gICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIHRva2VuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMueGhyTGlzdC5yZW1vdmUoeGhyKTtcclxuXHJcbiAgICAgICAgICBpZiAoeGhyLnN0YXR1cy50b1N0cmluZygpLnNsaWNlKDAsIDEpID09PSBcIjJcIikge1xyXG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKHhoci5yZXNwb25zZSk7XHJcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlLnRhcmdldFtcInJlYWR5U3RhdGVcIl0gPT0gRmlsZVJlYWRlci5ET05FKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmxvYkRhdGEgPSBlLnRhcmdldFtcInJlc3VsdFwiXTtcclxuICAgICAgICAgICAgICAgIGxldCBkZWNvZGluZ09iamVjdDogRGVjb2RpbmdPYmplY3QgPSB7XHJcbiAgICAgICAgICAgICAgICAgIG1vZGVsSWQsXHJcbiAgICAgICAgICAgICAgICAgIHZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGJsb2JEYXRhLFxyXG4gICAgICAgICAgICAgICAgICBncm91cElkczogZ3JvdXBJZHNMaXN0W2ldLFxyXG4gICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RlY29kaW5nT2JqZWN0TGlzdC5wdXNoKGRlY29kaW5nT2JqZWN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnTG9nKFwiZGVjb2RlTW5nOlwiICsgdGhpcy5fZGVjb2RlTWFuYWdlcklzUnVubmluZyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RlY29kZU1hbmFnZXJJc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5kZWNvZGVNbmdSdW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuivt+axguWIhue7hOWHoOS9leWksei0pTpcIiwgeGhyLnJlc3BvbnNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHhoci5vbmVycm9yID0gKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJlcnJvclwiLCBlcnIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBzdHJBcnJheSA9IGdyb3VwSWRzTGlzdFtpXS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgeGhyLnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBpZHM6IHN0ckFycmF5IH0pKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiVmlld2VyLmdldEFzeW5Hcm91cEdlb0RhdGFBY3Rpb24g5pyq5a6a5LmJXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL+WTquS6m+WHoOS9leimgemHjeaWsOabtOaWsFxyXG4gIHByb3RlY3RlZCBjb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllcyhcclxuICAgIGlzU3RyZWFtVG9HZW9tZXRyeTogYm9vbGVhbixcclxuICAgIHByb21pc2U6IFRocmVhZFByb21pc2U8VXBkYXRlSW5mbz5cclxuICApIHtcclxuICAgIC8vIOWPquimgeaJp+ihjOS6hmNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVz77yM5bCx5riF56m6Y29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZC5cclxuICAgIHRoaXMuY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzIHN0YXJ0XCIpO1xyXG4gICAgaWYgKCF0aGlzLmlzQnVzeSkge1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXMgbm90IGJ1c3lcIik7XHJcbiAgICAgIGlmICh0aGlzLl9pc1VwZGF0ZVR0KSB7XHJcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcImNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzIHVwZGF0ZVR0XCIpO1xyXG5cclxuICAgICAgICBsZXQgdmlld2VyID0gdGhpcztcclxuICAgICAgICBpZiAoIXRoaXMuX3RocmVhZFVQVklzUnVubmluZyAmJiAhdGhpcy5fdGhyZWFkVVBWSXNQcmVwYXJpbmcpIHtcclxuICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHZpZXdlci5zdHJlYW1Ub1NlZ21lbnRSdW5uaW5nQ291bnQgPT09IDAgJiZcclxuICAgICAgICAgICAgICB2aWV3ZXIuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudCA9PT0gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBpZiAoIXZpZXdlci5fdGhyZWFkVVBWSXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB2aWV3ZXIuX3RocmVhZFByb21pc2UgPSBwcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgdmlld2VyLmRlYnVnTG9nKFwiSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHRfU3RhcnRcIik7XHJcbiAgICAgICAgICAgICAgICBKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdCh2aWV3ZXIudmlld0tleSk7XHJcbiAgICAgICAgICAgICAgICB2aWV3ZXIuX3RocmVhZFVQVklzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZpZXdlci5fdGhyZWFkVVBWSXNBZ2FpbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgICAgdmlld2VyLl90aHJlYWRVUFZJc1ByZXBhcmluZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiAoXHJcbiAgICAgICAgLy8gICAhdGhpcy5fdGhyZWFkVVBWSXNSdW5uaW5nICYmXHJcbiAgICAgICAgLy8gICB0aGlzLnN0cmVhbVRvU2VnbWVudFJ1bm5pbmdDb3VudCA9PT0gMCAmJlxyXG4gICAgICAgIC8vICAgdGhpcy5fdGhyZWFkU1RHRElzUnVubmluZ0NvdW50ID09PSAwXHJcbiAgICAgICAgLy8gKSB7XHJcbiAgICAgICAgLy8gICB0aGlzLl90aHJlYWRQcm9taXNlID0gcHJvbWlzZTtcclxuICAgICAgICAvLyAgIHRoaXMuZGVidWdMb2coXCJKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdF9TdGFydFwiKTtcclxuICAgICAgICAvLyAgIEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5X1R0KHRoaXMudmlld0tleSk7XHJcbiAgICAgICAgLy8gICB0aGlzLl90aHJlYWRVUFZJc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAvLyDmoIfor4ZKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdOe7k+adn+WQjumcgOimgeWGjeaJp+ihjOS4gOasoS5cclxuICAgICAgICAvLyAgIHRoaXMuX3RocmVhZFVQVklzQWdhaW4gPSB0cnVlO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXMgbm90IHVwZGF0ZVR0XCIpO1xyXG5cclxuICAgICAgICAvLyBKU19Bc3luX1VwZGF0ZV9DYW1lcmFfQnlfS2V5KHRoaXMudmlld0tleSk7XHJcbiAgICAgICAgSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXkodGhpcy52aWV3S2V5KTsgLy9jYW1lcmHov4fmu6Qs56a75pWj5Y+C5pWw5YyW5Yeg5L2VLOiuoeeul+WTquS6m3Zhb+imgeWIm+W7ulxyXG5cclxuICAgICAgICB0aGlzLnVuQnVmZmVyQW5kQnVmZmVyR2VvbWV0cmllcyhpc1N0cmVhbVRvR2VvbWV0cnksIHByb21pc2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5Yig6Zmk6KaB5Yig6Zmk55qEdmFvLOa3u+WKoOimgea3u+WKoOeahHZhby5cclxuICB1bkJ1ZmZlckFuZEJ1ZmZlckdlb21ldHJpZXMoXHJcbiAgICBpc1N0cmVhbVRvR2VvbWV0cnk6IGJvb2xlYW4sXHJcbiAgICBwcm9taXNlOiBUaHJlYWRQcm9taXNlPFVwZGF0ZUluZm8+LFxyXG4gICAgaXNUaHJlYWQ6IGJvb2xlYW5cclxuICApIHtcclxuICAgIGxldCB1bmJ1ZmZlckdlb21LZXlzOiBudW1iZXJbXSA9IEpTX1Nob3dfQXN5bl9VbmJ1ZmZlcl9HZW9tZXRyeV9LZXlzKFxyXG4gICAgICB0aGlzLnZpZXdLZXlcclxuICAgICk7IC8v5pi+56S66KaB5Yig6ZmkdmFv55qE5Yeg5L2Va2V5XHJcbiAgICBsZXQgZmlsdGVyZWRHZW9tS2V5c1VuYnVmZmVyID1cclxuICAgICAgdGhpcy5maWx0ZXJSZXBlYXRLZXlzVW5idWZmZXIodW5idWZmZXJHZW9tS2V5cyk7XHJcbiAgICBKU19Bc3luX1VuYnVmZmVyX0dlb21ldHJ5X0J5X0tleSh0aGlzLnZpZXdLZXksIGZpbHRlcmVkR2VvbUtleXNVbmJ1ZmZlcik7XHJcbiAgICAvL3Nob3dlZFZhb0xpc3RCdWZmZXLmuIXpmaTlr7nlupTnmoRrZXlcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyZWRHZW9tS2V5c1VuYnVmZmVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBrZXkgPSBmaWx0ZXJlZEdlb21LZXlzVW5idWZmZXJbaV07XHJcbiAgICAgIC8vIGRlbGV0ZSB0aGlzLl9zaG93ZWRWYW9MaXN0VW5idWZmZXJba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZ2VvbUtleXM6IG51bWJlcltdID0gSlNfU2hvd19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9LZXlzKHRoaXMuX3ZpZXdLZXkpOyAvL+aYvuekuuimgeWIm+W7unZhb+eahOWHoOS9lWtleVxyXG4gICAgbGV0IGZpbHRlcmVkR2VvbUtleXMgPSB0aGlzLmZpbHRlclJlcGVhdEtleXNCdWZmZXIoZ2VvbUtleXMpO1xyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImZpbHRlcmVkR2VvbUtleXM6XCIgKyBmaWx0ZXJlZEdlb21LZXlzLmxlbmd0aCk7XHJcbiAgICB0aGlzLmNyZWF0ZUFuZERyYXdWYW8oXHJcbiAgICAgIGZpbHRlcmVkR2VvbUtleXMsXHJcbiAgICAgIGlzU3RyZWFtVG9HZW9tZXRyeSxcclxuICAgICAgcHJvbWlzZSxcclxuICAgICAgaXNUaHJlYWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvL+WIm+W7uuW5tue7mOWItnZhby5cclxuICBwcml2YXRlIGNyZWF0ZUFuZERyYXdWYW8oXHJcbiAgICBnZW9tS2V5czogbnVtYmVyW10sXHJcbiAgICBpc1N0cmVhbVRvR2VvbWV0cnk6IGJvb2xlYW4sXHJcbiAgICBwcm9taXNlOiBUaHJlYWRQcm9taXNlPFVwZGF0ZUluZm8+LFxyXG4gICAgaXNUaHJlYWQ6IGJvb2xlYW5cclxuICApIHtcclxuICAgIGlmIChpc1N0cmVhbVRvR2VvbWV0cnkpIHtcclxuICAgICAgKCh0aGlzIGFzIGFueSkuYXlzblRhc2tNYW5hZ2VyIGFzIEF5c25UYXNrTWFuYWdlcikuY2xlYXJUYXNrKDIpO1xyXG4gICAgICB0aGlzLmJ1ZmZlcmluZ0dlb21ldHJ5Q291bnQgPSAwO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImNsZWFyIFRhc2tcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idWZmZXJpbmdHZW9tZXRyeUNvdW50ICs9IGdlb21LZXlzLmxlbmd0aDtcclxuICAgIGNvbnNvbGUubG9nKFwiYnVmZmVyaW5nR2VvbWV0cnlDb3VudDpcIiwgdGhpcy5idWZmZXJpbmdHZW9tZXRyeUNvdW50KTtcclxuXHJcbiAgICBsZXQgY291bnQgPSBnZW9tS2V5cy5sZW5ndGg7XHJcblxyXG4gICAgbGV0IGdyb3VwQ291bnQgPSAwO1xyXG4gICAgbGV0IGdyb3VwID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnQ7IGorKykge1xyXG4gICAgICBncm91cENvdW50Kys7XHJcbiAgICAgIGdyb3VwLnB1c2goZ2VvbUtleXNbal0pO1xyXG4gICAgICBpZiAoZ3JvdXBDb3VudCA9PT0gdGhpcy5fcmVuZGVyVmlld1Blckdyb3VwIHx8IGogPT09IGNvdW50IC0gMSkge1xyXG4gICAgICAgIGxldCBjb3B5R3JvdXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwKSk7XHJcbiAgICAgICAgZ3JvdXBDb3VudCA9IDA7XHJcbiAgICAgICAgZ3JvdXAgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG5cclxuICAgICAgICB0aGlzLl9idWZmZXJLZXlDb3VudCArPSBjb3B5R3JvdXAubGVuZ3RoO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiX2J1ZmZlcktleUNvdW50OlwiLCB0aGlzLl9idWZmZXJLZXlDb3VudCk7XHJcblxyXG4gICAgICAgIC8vIGlmICh0aGlzLmlzVXBkYXRlVHQpIHtcclxuICAgICAgICBpZiAoZmFsc2UpIHtcclxuICAgICAgICAgIHRoaXMuX2J1ZmZlclZhb05vKys7XHJcbiAgICAgICAgICB0aGlzLl9idWZmZXJWYW9MaXN0TWFwTm9bdGhpcy5fYnVmZmVyVmFvTm9dID0gY29weUdyb3VwO1xyXG4gICAgICAgICAgSlNfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5X1R0KFxyXG4gICAgICAgICAgICB0aGlzLnZpZXdLZXksXHJcbiAgICAgICAgICAgIGNvcHlHcm91cCxcclxuICAgICAgICAgICAgdGhpcy5fYnVmZmVyVmFvTm9cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8v5Yib5bu6dmFv5Y+K57uY5Yi255qE5byC5q2l5Lu75Yqh5LyY5YWI57qn5Li6MlxyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZGQgVGFza1wiKTtcclxuXHJcbiAgICAgICAgICBsZXQgdXBkYXRlSW5mbyA9IG5ldyBVcGRhdGVJbmZvKFxyXG4gICAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgICBpc1RocmVhZFxyXG4gICAgICAgICAgICAgID8gVXBkYXRlRGlzcGxheVR5cGUuQXN5blRocmVhZEJ1ZmZlckdlb21ldHJ5XHJcbiAgICAgICAgICAgICAgOiBVcGRhdGVEaXNwbGF5VHlwZS5Bc3luQnVmZmVyR2VvbWV0cnlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjb3B5R3JvdXA6XCIsIGNvcHlHcm91cC5sZW5ndGgpO1xyXG4gICAgICAgICAgKCh0aGlzIGFzIGFueSkuYXlzblRhc2tNYW5hZ2VyIGFzIEF5c25UYXNrTWFuYWdlcikuYXN5blRhc2soXHJcbiAgICAgICAgICAgIGFzeW5jICh2aWV3a2V5LCBrZXlMaXN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydW4gVGFza1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNCdXN5IHx8IHRoaXMuX3RocmVhZFVQVklzUnVubmluZykge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJidXN5LHJlbmRlcuW7tuWQjlwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lKFwiYnVmZmVyIGFuZCByZW5kZXJcIik7XHJcbiAgICAgICAgICAgICAgICBKU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXkodmlld2tleSwga2V5TGlzdCk7IC8v5Yib5bu6dmFvLlxyXG4gICAgICAgICAgICAgICAgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkodmlld2tleSwgZmFsc2UpOyAvL+e7mOWItlxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwiYnVmZmVyIGFuZCByZW5kZXJcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdHZW9tZXRyeUNvdW50IC09IGtleUxpc3QubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwia2V5TGlzdDpcIiwga2V5TGlzdC5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdHZW9tZXRyeUNvdW50IC09IGtleUxpc3QubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIHByb21pc2U/LnJlc29sdmUodXBkYXRlSW5mbyk7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVJbmZvLl9jb3VudCsrO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBidWZmZXJUYXNrQ291bnQgPSAoXHJcbiAgICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSkuYXlzblRhc2tNYW5hZ2VyIGFzIEF5c25UYXNrTWFuYWdlclxyXG4gICAgICAgICAgICAgICAgKS5nZXRUYXNrTGVuZ3RoKDIpO1xyXG4gICAgICAgICAgICAgICAgLy8gYnVmZmVyVGFza0NvdW505Li6MeihqOekuuato+WcqOaJp+ihjOacgOWQjuS4gOS4qmJ1ZmZlclRhc2vvvIzmiafooYzlrozlkI7ku47liJfooajkuK3liKDpmaQuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoYnVmZmVyVGFza0NvdW50ID09PSAxICYmIHRoaXMuY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gICAvLyBjb25zb2xlLmxvZyhcImJ1ZmZlckdlb21ldHJ55a6M5q+VLOaJp+ihjGNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLmNvbUFuZFVwZEdlb0lzSW50ZXJydXB0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vICAgLy8g5aaC5p6cYnVmZmVy5byC5q2l5Lu75Yqh5bey5YWo6YOo5a6M5oiQ77yM5LiUY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXPooqtidWZmZXJfR2VvbWV0cnnkuK3mlq3ov4dcclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5jb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllcyhmYWxzZSwgcHJvbWlzZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoYnVmZmVyVGFza0NvdW50ID09PSAxICYmIHRoaXMuY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gICAvLyBjb25zb2xlLmxvZyhcImJ1ZmZlckdlb21ldHJ55a6M5q+VLOaJp+ihjGNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLmNvbUFuZFVwZEdlb0lzSW50ZXJydXB0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vICAgLy8g5aaC5p6cYnVmZmVy5byC5q2l5Lu75Yqh5bey5YWo6YOo5a6M5oiQ77yM5LiUY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXPooqtidWZmZXJfR2VvbWV0cnnkuK3mlq3ov4dcclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5jb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllcyhmYWxzZSwgcHJvbWlzZSk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKFwiZHJhdyBmaW5pc2hcIik7XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyVGFza0NvdW50ID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbUFuZFVwZEdlb0lzSW50ZXJydXB0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImJ1ZmZlckdlb21ldHJ55a6M5q+VLOaJp+ihjGNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOWmguaenGJ1ZmZlcuW8guatpeS7u+WKoeW3suWFqOmDqOWujOaIkO+8jOS4lGNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVz6KKrYnVmZmVyX0dlb21ldHJ55Lit5pat6L+HXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllcyhmYWxzZSwgcHJvbWlzZSk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICAgICAgICBcImJ1ZmZlcmluZ0dlb21ldHJ5Q291bnQxOlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdHZW9tZXRyeUNvdW50XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcmluZ0dlb21ldHJ5Q291bnQgPT09IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlZ21lbnRMb2FkaW5nQ291bnQgPT09IDBcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIOmikee5geabtOaWsOaXtuacieaXtuWAmeS4jeWHhu+8jOWOn+WboOaYr+WcqOWkmue6v+eoi+S4i++8jF9zZWdtZW50TG9hZGluZ0NvdW5055qE6K6h5pWw5Zmo5LiN5YeG56GuLlxyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJkcmF3IGZpbmlzaFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvbWV0cnlEcmF3RmluaXNoLmZvckVhY2goKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImlzR2VvbWV0cnlMb2FkaW5nMTpcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0dlb21ldHJ5TG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNHZW9tZXRyeUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImlzR2VvbWV0cnlMb2FkaW5nMjpcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0dlb21ldHJ5TG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFt0aGlzLnZpZXdLZXksIGNvcHlHcm91cF0sXHJcbiAgICAgICAgICAgIDJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvdW50ID09PSAwKSB7XHJcbiAgICAgIEpTX0FzeW5fUmVuZGVyX1ZpZXdfQnlfS2V5KHRoaXMuX3ZpZXdLZXksIGZhbHNlKTsgLy/nu5jliLZcclxuXHJcbiAgICAgIHByb21pc2U/LnJlc29sdmUoXHJcbiAgICAgICAgbmV3IFVwZGF0ZUluZm8oXHJcbiAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgaXNUaHJlYWRcclxuICAgICAgICAgICAgPyBVcGRhdGVEaXNwbGF5VHlwZS5Bc3luVGhyZWFkTm9uZUJ1ZmZlckdlb21ldHJ5XHJcbiAgICAgICAgICAgIDogVXBkYXRlRGlzcGxheVR5cGUuQXN5bk5vbmVCdWZmZXJHZW9tZXRyeVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGx6bWFNYW5hZ2VyID0gbmV3IFdMWk1BLk1hbmFnZXIoMCwgXCJqcy9sem1hL3dsem1hLndyay5qc1wiKTtcclxuXHJcbiAgcHJpdmF0ZSBkZWNvZGVNbmdSdW4oKSB7XHJcbiAgICBpZiAodGhpcy5fZGVjb2RpbmdPYmplY3RMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcImRlY29kaW5nXCIpO1xyXG4gICAgICB0aGlzLl9kZWNvZGVNYW5hZ2VySXNSdW5uaW5nID0gdHJ1ZTtcclxuICAgICAgbGV0IG9iajogRGVjb2RpbmdPYmplY3QgPSB0aGlzLl9kZWNvZGluZ09iamVjdExpc3QucG9wKCk7XHJcbiAgICAgIC8vICAgY29uc29sZS50aW1lKFwiQXN5bkRlY29kZURhdGFUaW1lXCIpO1xyXG5cclxuICAgICAgdGhpcy5Bc3luRGVjb2RlRGF0YShvYmopO1xyXG4gICAgICAvLyAgIGNvbnNvbGUudGltZShcIkFzeW5EZWNvZGVEYXRhVGltZVwiKTtcclxuXHJcbiAgICAgIC8vIOWtmOWcqOivt+axgui/lOWbnuaVsOaNruWPquacieS4gOS4quWkp+eahOWHoOS9leaVsOaNrueahOaDheWGtSzmraTml7blj6rkvJrlvIDkuIDkuKrnur/nqIvljrvop6Pljoss5a+86Ie05LqG6Zi75aGeLlxyXG4gICAgICBmb3IgKFxyXG4gICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICBpIDwgKHRoaXMgYXMgYW55KS5wcm9jZXNzLmx6bWFNYW5hZ2VyLndvcmtlcnMubGVuZ3RoO1xyXG4gICAgICAgIGkrK1xyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgd29ya2VyID0gKHRoaXMgYXMgYW55KS5wcm9jZXNzLmx6bWFNYW5hZ2VyLndvcmtlcnNbaV07XHJcbiAgICAgICAgaWYgKHdvcmtlci5pZGxlKSB7XHJcbiAgICAgICAgICB0aGlzLmRlY29kZU1uZ1J1bigpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiZGVjb2RlIGFsbCBmaW5pc2hcIik7XHJcbiAgICAgIHRoaXMuX2RlY29kZU1hbmFnZXJJc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8v6Kej5p6Q57uE55qE5Yeg5L2V5pWw5o2u5rWBLOaLhuWIhuaIkOavj+S4quWHoOS9leeahOaVsOaNri5cclxuICBwcml2YXRlIEFzeW5EZWNvZGVEYXRhKG9iajogRGVjb2RpbmdPYmplY3QpIHtcclxuICAgIC8vIGxldCB3b3JrZXIgPSBuZXcgV29ya2VyKFwiLi9zcWxpdGUud29ya2VyLmpzXCIpO1xyXG5cclxuICAgIGxldCBtb2RlbElkID0gb2JqLm1vZGVsSWQ7XHJcbiAgICBsZXQgdmVyc2lvbiA9IG9iai52ZXJzaW9uO1xyXG4gICAgbGV0IGJsb2JEYXRhID0gb2JqLmRhdGEgYXMgQXJyYXlCdWZmZXI7XHJcbiAgICBsZXQgZ3JvdXAgPSBvYmouZ3JvdXBJZHM7XHJcbiAgICBsZXQgZGljdGlvbmFyeSA9IG9iai5kaWN0aW9uYXJ5O1xyXG5cclxuICAgIGxldCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhibG9iRGF0YSk7XHJcbiAgICB0aGlzLl9vZmZzZXQgPSAwO1xyXG5cclxuICAgIGxldCBkZUNvZGVDb3VudCA9IDA7XHJcbiAgICBsZXQgY291bnQgPSB0aGlzLmRhdGFWaWV3UmVhZEludDMyKGRhdGFWaWV3KTtcclxuICAgIGxldCBpZEFycmF5ID0gZ3JvdXAuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgIGlmIChjb3VudCAhPT0gaWRBcnJheS5sZW5ndGgpIHtcclxuICAgICAgY29uc29sZS5sb2coXCLov5Tlm57nmoTkuozov5vliLbmlbDmja7nmoTlh6DkvZXkuKrmlbDkuI7lh6DkvZXnu4Tplb/luqbkuI3kuIDoh7RcIik7XHJcbiAgICAgIHRoaXMuZGVidWdMb2coXCJuZXh0IGRlY29kZVwiKTtcclxuICAgICAgdGhpcy5kZWNvZGVNbmdSdW4oKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpZGI7XHJcbiAgICBpZiAodGhpcy5pc0NhY2hlKSB7XHJcbiAgICAgIGlkYiA9IElEQi5nZXRJbnN0YW5jZShtb2RlbElkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlh6DkvZXnmoTlrZfoioLmtYHmlbDnu4QuXHJcbiAgICBsZXQgc2VnS2V5czogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgbGV0IGJ5dGVzQXJyYXk6IFVpbnQ4QXJyYXlbXSA9IG5ldyBBcnJheTxVaW50OEFycmF5PigpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICBsZXQgc3RyZWFtTGVuZ3RoID0gdGhpcy5kYXRhVmlld1JlYWRJbnQzMihkYXRhVmlldyk7XHJcbiAgICAgIGxldCBjb21wcmVzc0ZsYWcgPSAwO1xyXG4gICAgICBpZiAodGhpcy5fZ2VvRGF0YUlzQ29tcHJlc3Npb24pIHtcclxuICAgICAgICBjb21wcmVzc0ZsYWcgPSB0aGlzLmRhdGFWaWV3UmVhZEludDMyKGRhdGFWaWV3KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGlkID0gaWRBcnJheVtpXTtcclxuICAgICAgbGV0IHNlZ0tleSA9IGRpY3Rpb25hcnlbaWRdO1xyXG5cclxuICAgICAgbGV0IGdlb1N0cmVhbURhdGEgPSBibG9iRGF0YS5zbGljZShcclxuICAgICAgICB0aGlzLl9vZmZzZXQsXHJcbiAgICAgICAgdGhpcy5fb2Zmc2V0ICsgc3RyZWFtTGVuZ3RoXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuX29mZnNldCArPSBzdHJlYW1MZW5ndGg7XHJcblxyXG4gICAgICAvL+WwhuS6jOi/m+WItuaVsOaNruWGmeWFpeWIsHNlZ21lbnQuXHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkoc2VnS2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIC8vIEpTX1NldF9IZXVyaXN0aWNfT3B0aW9ucyhcImFzeW4gZ2VvbWV0cnk9b2ZmXCIpO1xyXG4gICAgICAgIEpTX1NldF9PbmVfSGV1cmlzdGljX09wdGlvbihcImFzeW4gZ2VvbWV0cnlcIiwgXCJvZmZcIik7XHJcblxyXG4gICAgICAgIGlmIChjb21wcmVzc0ZsYWcgPT09IDEpIHtcclxuICAgICAgICAgICh0aGlzIGFzIGFueSkucHJvY2Vzcy5sem1hTWFuYWdlclxyXG4gICAgICAgICAgICAuZGVjb2RlKGdlb1N0cmVhbURhdGEpXHJcbiAgICAgICAgICAgIC50aGVuKChvdXRzdHJlYW0pID0+IHtcclxuICAgICAgICAgICAgICBkZUNvZGVDb3VudCsrO1xyXG4gICAgICAgICAgICAgIGxldCBkYXRhID0gb3V0c3RyZWFtO1xyXG4gICAgICAgICAgICAgIGxldCBieXRlczogVWludDhBcnJheSA9IGRhdGEudG9VaW50OEFycmF5KCk7XHJcbiAgICAgICAgICAgICAgYnl0ZXNBcnJheS5wdXNoKGJ5dGVzKTtcclxuICAgICAgICAgICAgICBzZWdLZXlzLnB1c2goc2VnS2V5KTtcclxuXHJcbiAgICAgICAgICAgICAgLy8g57yT5a2Y6L+baW5kZXhlZERCXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgaWRiLnNldChtb2RlbElkICsgXCI/dj1cIiArIHZlcnNpb24gKyBcIl9cIiArIGlkLCBieXRlcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvL+ihqOekuuivpee7hOWHoOS9leaVsOaNruW3sue7j+WFqOmDqOino+WOi+WujOavlSzov5vooYzkuIvkuIDnu4Tlh6DkvZXmlbDmja7nmoTop6PljosuXHJcbiAgICAgICAgICAgICAgLy8gdGhpcy5kZWJ1Z0xvZyhcImRlQ29kZUNvdW50OlwiKyBkZUNvZGVDb3VudCArIFwiLS0tLVwiICsgXCJjb3VudDpcIiArIGNvdW50KTtcclxuICAgICAgICAgICAgICBpZiAoZGVDb2RlQ291bnQgPT09IGNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uZUdyb3VwRGVjb2RlRmluaXNoKHNlZ0tleXMsIGJ5dGVzQXJyYXkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImRlY29kZSBlcnJvcjpcIiwgZXJyKTtcclxuICAgICAgICAgICAgICBkZUNvZGVDb3VudCsrO1xyXG4gICAgICAgICAgICAgIGlmIChkZUNvZGVDb3VudCA9PT0gY291bnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25lR3JvdXBEZWNvZGVGaW5pc2goc2VnS2V5cywgYnl0ZXNBcnJheSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbXByZXNzRmxhZyA9PT0gMCkge1xyXG4gICAgICAgICAgZGVDb2RlQ291bnQrKztcclxuICAgICAgICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGdlb1N0cmVhbURhdGEpO1xyXG4gICAgICAgICAgYnl0ZXNBcnJheS5wdXNoKGJ5dGVzKTtcclxuICAgICAgICAgIHNlZ0tleXMucHVzaChzZWdLZXkpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmlzQ2FjaGUpIHtcclxuICAgICAgICAgICAgaWRiLnNldChtb2RlbElkICsgXCI/dj1cIiArIHZlcnNpb24gKyBcIl9cIiArIGlkLCBieXRlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL+ihqOekuuivpee7hOWHoOS9leaVsOaNruW3sue7j+WFqOmDqOino+WOi+WujOavlSzov5vooYzkuIvkuIDnu4Tlh6DkvZXmlbDmja7nmoTop6PljosuXHJcbiAgICAgICAgICAvLyB0aGlzLmRlYnVnTG9nKFwiZGVDb2RlQ291bnQ6XCIrIGRlQ29kZUNvdW50ICsgXCItLS0tXCIgKyBcImNvdW50OlwiICsgY291bnQpO1xyXG5cclxuICAgICAgICAgIGlmIChkZUNvZGVDb3VudCA9PT0gY291bnQpIHtcclxuICAgICAgICAgICAgdGhpcy5vbmVHcm91cERlY29kZUZpbmlzaChzZWdLZXlzLCBieXRlc0FycmF5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgZGVsZXRlIHRoaXMuX2xvYWRpbmdMaXN0W3NlZ0tleV07XHJcbiAgICAgIHRoaXMuX2xvYWRpbmdMaXN0Q291bnQtLTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9sb2FkaW5nTGlzdENvdW50ID09PSAwKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLojrflj5blrozlhajpg6jlh6DkvZXmlbDmja5cIik7XHJcbiAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwiZ2V0IGRhdGEgZmluaXNoXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIOWIpOaWrXN0cmVhbVRvR2VvbWV0cnnmmK/lkKblj6/miafooYwuXHJcbiAgICovXHJcbiAgY2hlY2tTdHJlYW1Ub0dlb21ldHJ5RGlzYWJsZSgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5pc1VwZGF0ZVR0KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzQnVzeTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzQnVzeSB8fCB0aGlzLnRocmVhZElzUnVubmluZztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25lR3JvdXBEZWNvZGVGaW5pc2goc2VnS2V5czogbnVtYmVyW10sIGJ5dGVzQXJyYXk6IFVpbnQ4QXJyYXlbXSkge1xyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIm5leHQgZGVjb2RlXCIpO1xyXG4gICAgdGhpcy5kZWNvZGVNbmdSdW4oKTtcclxuXHJcbiAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIC8vIOW8guatpeaJp+ihjEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleSzkuJTkuI3og73kuI7nur/nqIvlkIzml7bmiafooYxcclxuICAgICAgaWYgKHRoaXMuY2hlY2tTdHJlYW1Ub0dlb21ldHJ5RGlzYWJsZSgpKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXHJcbiAgICAgICAgLy8gICBcImJ1c3kgfCB0aHJlYWRJc1J1bmluZyxKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXnlu7blkI5cIlxyXG4gICAgICAgIC8vICk7XHJcbiAgICAgICAgLy8gcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3RyZWFtX3RvX2dlb21ldHJ5XCIpO1xyXG4gICAgICAgIC8vIOaLvOaOpeaVtOS4quWHoOS9lee7hOeahOaAu+Wtl+iKgua1gS5cclxuICAgICAgICAvLyDlh6DkvZXnu4TnmoTlrZfoioLmtYHmgLvplb/luqYuXHJcbiAgICAgICAgbGV0IGFsbEJ5dGVMZW5ndGggPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXNBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgYWxsQnl0ZUxlbmd0aCArPSBieXRlc0FycmF5W2ldLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGdlb21ldHJ5R3J1cERhdGEgPSBuZXcgVWludDhBcnJheShhbGxCeXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY3VycmVudE1lbW9yeVNpemUgKz0gYWxsQnl0ZUxlbmd0aCAqIDM7XHJcbiAgICAgICAgbGV0IGlzRnJlZSA9IHRoaXMuZW5zdXJlQ3VycmVudE1lbW9yeVNpemUoKTtcclxuICAgICAgICBpZiAoaXNGcmVlKSB7XHJcbiAgICAgICAgICBsZXQgY3VycmVudE9mZnNldCA9IDA7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZ2VvbWV0cnlHcnVwRGF0YS5zZXQoYnl0ZXNBcnJheVtpXSwgY3VycmVudE9mZnNldCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRPZmZzZXQgKz0gYnl0ZXNBcnJheVtpXS5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAvLyBieXRlc0FycmF5W2ldID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLmlzVXBkYXRlVHQpIHtcclxuICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5fdGhyZWFkVVBWSXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnTG9nKFwiSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5c19UdF9TdGFydFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5c19UdChcclxuICAgICAgICAgICAgICAgICAgc2VnS2V5cyxcclxuICAgICAgICAgICAgICAgICAgZ2VvbWV0cnlHcnVwRGF0YSxcclxuICAgICAgICAgICAgICAgICAgdGhpcy52aWV3S2V5XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VnbWVudExvYWRpbmdDb3VudCAtPSBzZWdLZXlzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgLy8gICBcIl9zZWdtZW50TG9hZGluZ0NvdW50OlwiLFxyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLl9zZWdtZW50TG9hZGluZ0NvdW50XHJcbiAgICAgICAgICAgICAgICAvLyApO1xyXG5cclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgMjApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5cyhzZWdLZXlzLCBnZW9tZXRyeUdydXBEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VnbWVudExvYWRpbmdDb3VudCAtPSBzZWdLZXlzLmxlbmd0aDtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJfc2VnbWVudExvYWRpbmdDb3VudDpcIiwgdGhpcy5fc2VnbWVudExvYWRpbmdDb3VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXModHJ1ZSwgbnVsbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiX2N1cnJlbnRNZW1vcnlTaXplIGlzIGZ1bGxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTtcclxuICAgICAgfVxyXG4gICAgfSwgMjApO1xyXG4gIH1cclxuXHJcbiAgLy/ov4fmu6Tph43lpI3nmoR2YW9rZXktLS0tYnVmZmVyLlxyXG4gIHByaXZhdGUgZmlsdGVyUmVwZWF0S2V5c0J1ZmZlcihnZW9tS2V5cyk6IG51bWJlcltdIHtcclxuICAgIGxldCBnZW9tS2V5c0NvdW50ID0gZ2VvbUtleXMubGVuZ3RoO1xyXG4gICAgLy/ov4fmu6Tmjonlt7Lnu49zaG936L+H6KaB5Yib5bu655qEdmFvLi4u6Ziy5q2i5Yib5bu65LiA5LiqdmFv5bey57uP5Zyo6Zif5YiX5LitKOacquWIm+W7uiks5L2G5Y+I6YeN5aSN5omr5o+P5YiwLOWvvOiHtOmHjeWkjeWIm+W7uueahOmXrumimC5cclxuICAgIGxldCBmaWx0ZXJlZEdlb21LZXlzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2VvbUtleXNDb3VudDsgaSsrKSB7XHJcbiAgICAgIGxldCBnZW9tS2V5OiBudW1iZXIgPSBnZW9tS2V5c1tpXTtcclxuICAgICAgZmlsdGVyZWRHZW9tS2V5cy5wdXNoKGdlb21LZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmaWx0ZXJlZEdlb21LZXlzO1xyXG4gIH1cclxuXHJcbiAgLy/ov4fmu6Tph43lpI3nmoR2YW9rZXkuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJSZXBlYXRLZXlzVW5idWZmZXIoZ2VvbUtleXMpOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgZ2VvbUtleXNDb3VudCA9IGdlb21LZXlzLmxlbmd0aDtcclxuICAgIC8v6L+H5ruk5o6J5bey57uPc2hvd+i/h+imgeWIm+W7uueahHZhby4uLumYsuatouWIm+W7uuS4gOS4qnZhb+W3sue7j+WcqOmYn+WIl+S4rSjmnKrliJvlu7opLOS9huWPiOmHjeWkjeaJq+aPj+WIsCzlr7zoh7Tph43lpI3liJvlu7rnmoTpl67popguXHJcbiAgICBsZXQgZmlsdGVyZWRHZW9tS2V5cyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdlb21LZXlzQ291bnQ7IGkrKykge1xyXG4gICAgICBsZXQgZ2VvbUtleTogbnVtYmVyID0gZ2VvbUtleXNbaV07XHJcbiAgICAgIC8vIGxldCByZXMgPSB0aGlzLl9zaG93ZWRWYW9MaXN0VW5idWZmZXJbZ2VvbUtleV07XHJcbiAgICAgIC8vIGlmIChyZXMgPT09IG51bGwgfHwgcmVzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gICB0aGlzLl9zaG93ZWRWYW9MaXN0VW5idWZmZXJbZ2VvbUtleV0gPSAwO1xyXG4gICAgICBmaWx0ZXJlZEdlb21LZXlzLnB1c2goZ2VvbUtleSk7XHJcbiAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmlsdGVyZWRHZW9tS2V5cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRHc2xJZChrZXkpOiBzdHJpbmcge1xyXG4gICAgbGV0IG1vZGVsSWQgPSBudWxsO1xyXG4gICAgbW9kZWxJZCA9IEpTX1Nob3dfUHJvcGVydHlfU3RyaW5nKGtleSwgXCJtb2RlbElkXCIpO1xyXG5cclxuICAgIGlmIChtb2RlbElkKSB7XHJcbiAgICAgIHJldHVybiBtb2RlbElkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG93bmVyX2tleSA9IEpTX1Nob3dfT3duZXJfQnlfS2V5KGtleSk7XHJcbiAgICAgIGlmIChvd25lcl9rZXkgIT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0R3NsSWQob3duZXJfa2V5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRhdGFWaWV3UmVhZEludDMyKGRhdGFWaWV3OiBEYXRhVmlldykge1xyXG4gICAgbGV0IHJlc3VsdEludCA9IGRhdGFWaWV3LmdldEludDMyKHRoaXMuX29mZnNldCk7XHJcbiAgICB0aGlzLl9vZmZzZXQgKz0gNDtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0SW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZURpc3BsYXlXaXRoRnJhbWVyYXRlKFxyXG4gICAgZnJhbWVyYXRlOiBudW1iZXIsXHJcbiAgICBjdWxsaW5nVGhyZXNob2xkOiBudW1iZXJcclxuICApIHtcclxuICAgIEpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfV2l0aF9GcmFtZXJhdGVfQnlfS2V5KFxyXG4gICAgICB0aGlzLl92aWV3S2V5LFxyXG4gICAgICBmcmFtZXJhdGUsXHJcbiAgICAgIGN1bGxpbmdUaHJlc2hvbGRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGlzcGxheVdpdGhUaW1lKHRpbWU6IG51bWJlcikge1xyXG4gICAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9XaXRoX1RpbWVfQnlfS2V5KHRoaXMuX3ZpZXdLZXksIHRpbWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB3aWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLl93aWR0aDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGVpZ2h0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVTaXplKCkge1xyXG4gICAgSlNfTWFrZV9Db250ZXh0X0N1cnJlbnQodGhpcy5fdmlld0tleSk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICB0aGlzLl93aWR0aCA9IHRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoO1xyXG4gICAgdGhpcy5faGVpZ2h0ID0gdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgIHRoaXMuX2FzcGVjdFJhdGlvID0gdGhpcy5fd2lkdGggLyB0aGlzLl9oZWlnaHQ7XHJcblxyXG4gICAgSlNfUmVzaXplX0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwidXBkYXRlU2l6ZS0tLS0tLS0tLS0tLS0tXCIpXHJcblxyXG4gICAgLy8gdXBkYXRlIGJhY2tncm91bmRcclxuICAgIHRoaXMudXBkYXRlQmFja2dyb3VuZENvbG9yKCk7XHJcbiAgICBKU19VcGRhdGVfVmlld19EaXNwbGF5X0J5X0tleSh0aGlzLnZpZXdLZXkpO1xyXG5cclxuICAgIC8vIHVwZGF0ZVNpemXlkI7pnIDopoHlrprml7bmiY3og73miafooYx1cGRhdGVEb2N1bWVudFxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnQoKTtcclxuICAgIH0sIDApO1xyXG4gICAgLy90aGlzLmV4ZVNjZW5lQ2FtZXJhQ2hhbmdlZChDYW1lcmFDaGFuZ2VUeXBlLlRyYW5zbGF0ZSB8fCBDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSB8fCBDYW1lcmFDaGFuZ2VUeXBlLlNjYWxlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVCYWNrZ3JvdW5kQ29sb3IoKSB7XHJcbiAgICBpZiAodGhpcy5fYmFja2dyb3VuZEtleSAhPSAtMSkge1xyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX2JhY2tncm91bmRLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IGdlb21zID0gSlNfU2hvd19HZW9tZXRyeV9MaXN0KCk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZ2VvbXMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgKEpTX1Nob3dfS2V5X1R5cGUoZ2VvbXNbMF0pIGFzIE9iamVjdFR5cGUpID09IE9iamVjdFR5cGUuVFlQRV9TaGVsbFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgbGV0IGFzcGVjdF9yYXRpbyA9IHRoaXMuX2FzcGVjdFJhdGlvO1xyXG4gICAgICAgICAgbGV0IGZhciA9IC1hc3BlY3RfcmF0aW8gKiAyICsgMS4wMDAwMDE7XHJcblxyXG4gICAgICAgICAgbGV0IHcgPSAxLjA7XHJcbiAgICAgICAgICBsZXQgaCA9IDEuMDtcclxuICAgICAgICAgIGlmIChhc3BlY3RfcmF0aW8gPiAxKSB7XHJcbiAgICAgICAgICAgIHcgKj0gYXNwZWN0X3JhdGlvO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaCAvPSBhc3BlY3RfcmF0aW87XHJcbiAgICAgICAgICAgIGZhciA9IC0yICsgMS4wMDAwMDE7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgSlNfRWRpdF9TaGVsbChcclxuICAgICAgICAgICAgZ2VvbXNbMF0sXHJcbiAgICAgICAgICAgIFstdywgLWgsIGZhciwgdywgLWgsIGZhciwgdywgaCwgZmFyLCAtdywgaCwgZmFyXSxcclxuICAgICAgICAgICAgWzQsIDAsIDEsIDIsIDNdXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNhbWVyYU9yaWVudGF0aW9uRml4ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FtZXJhT3JpZW50YXRpb25GaXhlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY2FtZXJhT3JpZW50YXRpb25GaXhlZCh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2NhbWVyYU9yaWVudGF0aW9uRml4ZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNtb290aFRyYW5zaXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc21vb3RoVHJhbnNpdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc21vb3RoVHJhbnNpdGlvbih2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Ntb290aFRyYW5zaXRpb24gPSB2YWw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNtb290aFRyYW5zaXRpb25EdXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Ntb290aFRyYW5zaXRpb25EdXJhdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc21vb3RoVHJhbnNpdGlvbkR1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3Ntb290aFRyYW5zaXRpb25EdXJhdGlvbiA9IGR1cmF0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBiYWNrZ3JvdW5kQ29sb3IoKTogQXJyYXlMaWtlPG51bWJlcj4ge1xyXG4gICAgbGV0IGNvbG9ycztcclxuICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgICB7XHJcbiAgICAgIGNvbG9ycyA9IEpTX1Nob3dfQ29sb3JfQnlfVmFsdWUoXCJiYWNrZ3JvdW5kXCIpO1xyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgIHJldHVybiBjb2xvcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGJhY2tncm91bmRDb2xvcih2YWw6IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICBpZiAodmFsKSB7XHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgICAgIHtcclxuICAgICAgICBpZiAodmFsLmxlbmd0aCA9PSAzKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fYmFja2dyb3VuZEtleSAhPSAtMSkge1xyXG4gICAgICAgICAgICBKU19EZWxldGVfQnlfS2V5KHRoaXMuX2JhY2tncm91bmRLZXkpO1xyXG4gICAgICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kS2V5ID0gLTE7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgSlNfU2V0X0NvbG9yKFxyXG4gICAgICAgICAgICBcImJhY2tncm91bmQ9KHI9XCIgK1xyXG4gICAgICAgICAgICAgICh2YWxbMF0gLyAyNTUuMCkudG9GaXhlZCgyKSArXHJcbiAgICAgICAgICAgICAgXCIsZz1cIiArXHJcbiAgICAgICAgICAgICAgKHZhbFsxXSAvIDI1NS4wKS50b0ZpeGVkKDIpICtcclxuICAgICAgICAgICAgICBcIixiPVwiICtcclxuICAgICAgICAgICAgICAodmFsWzJdIC8gMjU1LjApLnRvRml4ZWQoMikgK1xyXG4gICAgICAgICAgICAgIFwiKVwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsLmxlbmd0aCA9PSA0KSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fYmFja2dyb3VuZEtleSAhPSAtMSkge1xyXG4gICAgICAgICAgICBKU19EZWxldGVfQnlfS2V5KHRoaXMuX2JhY2tncm91bmRLZXkpO1xyXG4gICAgICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kS2V5ID0gLTE7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgSlNfU2V0X0NvbG9yKFxyXG4gICAgICAgICAgICBcImJhY2tncm91bmQ9KHI9XCIgK1xyXG4gICAgICAgICAgICAgICh2YWxbMF0gLyAyNTUuMCkudG9GaXhlZCgyKSArXHJcbiAgICAgICAgICAgICAgXCIsZz1cIiArXHJcbiAgICAgICAgICAgICAgKHZhbFsxXSAvIDI1NS4wKS50b0ZpeGVkKDIpICtcclxuICAgICAgICAgICAgICBcIixiPVwiICtcclxuICAgICAgICAgICAgICAodmFsWzJdIC8gMjU1LjApLnRvRml4ZWQoMikgK1xyXG4gICAgICAgICAgICAgIFwiLGE9XCIgK1xyXG4gICAgICAgICAgICAgIHZhbFszXS50b0ZpeGVkKDIpICtcclxuICAgICAgICAgICAgICBcIilcIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbC5sZW5ndGggPT0gNiB8fCB2YWwubGVuZ3RoID09IDEyKSB7XHJcbiAgICAgICAgICBKU19TZXRfQ29sb3IoXCJiYWNrZ3JvdW5kPShyPTEuMCxnPTEuMCxiPTEuMCxhPTEuMClcIik7XHJcblxyXG4gICAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2JhY2tncm91bmRLZXkgIT0gLTEpIHtcclxuICAgICAgICAgICAgICBKU19DbGVhcl9BbGxfQnlfS2V5KHRoaXMuX2JhY2tncm91bmRLZXkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kS2V5ID0gSlNfT3Blbl9TZWdtZW50KFwiYmFja2dyb3VuZFwiKTtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIEpTX1NldF9DYW1lcmEoXHJcbiAgICAgICAgICAgICAgICBbMCwgMCwgMV0sXHJcbiAgICAgICAgICAgICAgICBbMCwgMCwgMF0sXHJcbiAgICAgICAgICAgICAgICBbMCwgMSwgMF0sXHJcbiAgICAgICAgICAgICAgICAyLjAsXHJcbiAgICAgICAgICAgICAgICAyLjAsXHJcbiAgICAgICAgICAgICAgICBcIm9ydGhvZ3JhcGhpY1wiXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBKU19TZXRfQ2FtZXJhX0V4dGVudCgtMSwgMSk7XHJcbiAgICAgICAgICAgICAgSlNfU2V0X01vZGVsbGluZ01hdHJpeChbXHJcbiAgICAgICAgICAgICAgICAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLFxyXG4gICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgIEpTX1NldF9WaXNpYmlsaXR5KFwibGlnaHRzPW9mZlwiKTtcclxuICAgICAgICAgICAgICBKU19TZXRfUmVuZGVyaW5nX09wdGlvbnMoXCJzeW5jIHVwZGF0ZT1vblwiKTtcclxuICAgICAgICAgICAgICBKU19TZXRfSGV1cmlzdGljX09wdGlvbnMoXHJcbiAgICAgICAgICAgICAgICBcImV4Y2x1ZGUgYm91bmRpbmc9b24sZXhjbHVkZSBzZWdtZW50IGJvdW5kaW5nPW9uXCJcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBsZXQgYXNwZWN0X3JhdGlvID0gdGhpcy5fYXNwZWN0UmF0aW87XHJcbiAgICAgICAgICAgICAgbGV0IGZhciA9IC1hc3BlY3RfcmF0aW8gKiAyICsgMS4wMDAwMDE7XHJcblxyXG4gICAgICAgICAgICAgIGxldCB3ID0gMS4wO1xyXG4gICAgICAgICAgICAgIGxldCBoID0gMS4wO1xyXG4gICAgICAgICAgICAgIGlmIChhc3BlY3RfcmF0aW8gPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB3ICo9IGFzcGVjdF9yYXRpbztcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaCAvPSBhc3BlY3RfcmF0aW87XHJcbiAgICAgICAgICAgICAgICBmYXIgPSAtMiArIDEuMDAwMDAxO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IHNoZWxsS2V5ID0gSlNfSW5zZXJ0X1NoZWxsKFxyXG4gICAgICAgICAgICAgICAgWy13LCAtaCwgZmFyLCB3LCAtaCwgZmFyLCB3LCBoLCBmYXIsIC13LCBoLCBmYXJdLFxyXG4gICAgICAgICAgICAgICAgWzQsIDAsIDEsIDIsIDNdXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHZhbC5sZW5ndGggPT0gNikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGJyID0gdmFsWzBdIC8gMjU1LjA7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmcgPSB2YWxbMV0gLyAyNTUuMDtcclxuICAgICAgICAgICAgICAgIGxldCBiYiA9IHZhbFsyXSAvIDI1NS4wO1xyXG4gICAgICAgICAgICAgICAgbGV0IGJhID0gMS4wO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRyID0gdmFsWzNdIC8gMjU1LjA7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGcgPSB2YWxbNF0gLyAyNTUuMDtcclxuICAgICAgICAgICAgICAgIGxldCB0YiA9IHZhbFs1XSAvIDI1NS4wO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRhID0gMS4wO1xyXG5cclxuICAgICAgICAgICAgICAgIEpTX1NldF9HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZShzaGVsbEtleSwgXCJmYWNlXCIsIDAsIFtcclxuICAgICAgICAgICAgICAgICAgYnIsXHJcbiAgICAgICAgICAgICAgICAgIGJnLFxyXG4gICAgICAgICAgICAgICAgICBiYixcclxuICAgICAgICAgICAgICAgICAgYmEsXHJcbiAgICAgICAgICAgICAgICAgIGJyLFxyXG4gICAgICAgICAgICAgICAgICBiZyxcclxuICAgICAgICAgICAgICAgICAgYmIsXHJcbiAgICAgICAgICAgICAgICAgIGJhLFxyXG4gICAgICAgICAgICAgICAgICB0cixcclxuICAgICAgICAgICAgICAgICAgdGcsXHJcbiAgICAgICAgICAgICAgICAgIHRiLFxyXG4gICAgICAgICAgICAgICAgICB0YSxcclxuICAgICAgICAgICAgICAgICAgdHIsXHJcbiAgICAgICAgICAgICAgICAgIHRnLFxyXG4gICAgICAgICAgICAgICAgICB0YixcclxuICAgICAgICAgICAgICAgICAgdGEsXHJcbiAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHMgPSBBcnJheSgxNik7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICB2YWxzW2kgKiA0XSA9IHZhbFtpICogM10gLyAyNTUuMDtcclxuICAgICAgICAgICAgICAgICAgdmFsc1tpICogNCArIDFdID0gdmFsW2kgKiAzICsgMV0gLyAyNTUuMDtcclxuICAgICAgICAgICAgICAgICAgdmFsc1tpICogNCArIDJdID0gdmFsW2kgKiAzICsgMl0gLyAyNTUuMDtcclxuICAgICAgICAgICAgICAgICAgdmFsc1tpICogNCArIDNdID0gMS4wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgSlNfU2V0X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlKHNoZWxsS2V5LCBcImZhY2VcIiwgMCwgdmFscyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW1hZ2VQYXRoVG9JbWFnZURhdGEocGF0aCkge1xyXG4gICAgbGV0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICBsZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcclxuICAgIGxldCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxJbWFnZURhdGE+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIC8vIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIikge1xyXG5cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBheGlvcy5nZXQocGF0aCwgeyByZXNwb25zZVR5cGU6IFwiYmxvYlwiIH0pLnRoZW4oKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAvLyAgIGltZy5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGRhdGEpO1xyXG4gICAgICAvLyAgIGltZy5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAvLyAgICAgY2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xyXG4gICAgICAvLyAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XHJcbiAgICAgIC8vICAgICAvLyDlsIblm77niYfmjInlg4/ntKDlhpnlhaXnlLvluINcclxuICAgICAgLy8gICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcclxuICAgICAgLy8gICAgIC8vIOivu+WPluWbvueJh+WDj+e0oOS/oeaBr1xyXG4gICAgICAvLyAgICAgbGV0IGltYWdlID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcclxuICAgICAgLy8gICAgIHJlc29sdmUoaW1hZ2UpO1xyXG4gICAgICAvLyAgIH07XHJcbiAgICAgIC8vIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgaW1nLnNyYyA9IHBhdGg7XHJcbiAgICAgIGltZy5jcm9zc09yaWdpbiA9IFwiKlwiO1xyXG4gICAgICBpbWcub25sb2FkID0gKGUpID0+IHtcclxuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XHJcbiAgICAgICAgLy8g5bCG5Zu+54mH5oyJ5YOP57Sg5YaZ5YWl55S75biDXHJcbiAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xyXG4gICAgICAgIC8vIOivu+WPluWbvueJh+WDj+e0oOS/oeaBr1xyXG4gICAgICAgIGxldCBpbWFnZSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XHJcbiAgICAgICAgcmVzb2x2ZShpbWFnZSk7XHJcbiAgICAgIH07XHJcbiAgICAgIC8vIH0pXHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHVibGljIHNldCBiYWNrZ3JvdW5kSW1hZ2UoaW1hZ2VTcmM6IHN0cmluZykge1xyXG4gICAgdGhpcy5pbWFnZVBhdGhUb0ltYWdlRGF0YShpbWFnZVNyYykudGhlbigoaW1hZ2UpID0+IHtcclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIEpTX1NldF9Db2xvcihcImJhY2tncm91bmQ9KHI9MS4wLGc9MS4wLGI9MS4wLGE9MS4wKVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2JhY2tncm91bmRLZXkgIT0gLTEpIHtcclxuICAgICAgICAgIEpTX0NsZWFyX0FsbF9CeV9LZXkodGhpcy5fYmFja2dyb3VuZEtleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kS2V5ID0gSlNfT3Blbl9TZWdtZW50KFwiYmFja2dyb3VuZFwiKTtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhKFxyXG4gICAgICAgICAgICBbMCwgMCwgMV0sXHJcbiAgICAgICAgICAgIFswLCAwLCAwXSxcclxuICAgICAgICAgICAgWzAsIDEsIDBdLFxyXG4gICAgICAgICAgICAyLjAsXHJcbiAgICAgICAgICAgIDIuMCxcclxuICAgICAgICAgICAgXCJvcnRob2dyYXBoaWNcIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmFfRXh0ZW50KC0xLCAxKTtcclxuICAgICAgICAgIEpTX1NldF9Nb2RlbGxpbmdNYXRyaXgoW1xyXG4gICAgICAgICAgICAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLFxyXG4gICAgICAgICAgXSk7XHJcbiAgICAgICAgICBKU19TZXRfVmlzaWJpbGl0eShcImxpZ2h0cz1vZmZcIik7XHJcbiAgICAgICAgICBKU19TZXRfUmVuZGVyaW5nX09wdGlvbnMoXCJzeW5jIHVwZGF0ZT1vblwiKTtcclxuICAgICAgICAgIEpTX1NldF9IZXVyaXN0aWNfT3B0aW9ucyhcclxuICAgICAgICAgICAgXCJleGNsdWRlIGJvdW5kaW5nPW9uLGV4Y2x1ZGUgc2VnbWVudCBib3VuZGluZz1vblwiXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGxldCBhc3BlY3RfcmF0aW8gPSB0aGlzLl9hc3BlY3RSYXRpbztcclxuICAgICAgICAgIGxldCBmYXIgPSAtYXNwZWN0X3JhdGlvICogMiArIDEuMDAwMDAxO1xyXG5cclxuICAgICAgICAgIGxldCB3ID0gMS4wO1xyXG4gICAgICAgICAgbGV0IGggPSAxLjA7XHJcbiAgICAgICAgICBpZiAoYXNwZWN0X3JhdGlvID4gMSkge1xyXG4gICAgICAgICAgICB3ICo9IGFzcGVjdF9yYXRpbztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGggLz0gYXNwZWN0X3JhdGlvO1xyXG4gICAgICAgICAgICBmYXIgPSAtMiArIDEuMDAwMDAxO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBzaGVsbEtleSA9IEpTX0luc2VydF9TaGVsbChcclxuICAgICAgICAgICAgWy13LCAtaCwgZmFyLCB3LCAtaCwgZmFyLCB3LCBoLCBmYXIsIC13LCBoLCBmYXJdLFxyXG4gICAgICAgICAgICBbNCwgMCwgMSwgMiwgM11cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgSlNfU2V0X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzKFxyXG4gICAgICAgICAgICBzaGVsbEtleSxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgNCxcclxuICAgICAgICAgICAgWzAsIDAsIDEsIDAsIDEsIDEsIDAsIDFdXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIEpTX0luc2VydF9JbWFnZShcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgaW1hZ2Uud2lkdGgsXHJcbiAgICAgICAgICAgIGltYWdlLmhlaWdodCxcclxuICAgICAgICAgICAgaW1hZ2UuZGF0YSxcclxuICAgICAgICAgICAgXCJuYW1lPSdiYWNrZ3JvdW5kJyxsb2NhbCxmb3JtYXQ9cmdiYVwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgSlNfU2V0X0NvbG9yKFwiZmFjZSBkaWZmdXNlPSdiYWNrZ3JvdW5kJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAgIEpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICBKU19VcGRhdGVfVmlld19EaXNwbGF5X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc2VsZWN0aW9uVG9sZXJhbmNlKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0ID0gMC4wO1xyXG4gICAgaWYgKHRoaXMuX3ZpZXdLZXkgIT0gLTEpIHtcclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIGxldCBvcHRpb24gPSBKU19TaG93X09uZV9Ecml2ZXJfT3B0aW9uKFwic2VsZWN0aW9uIHRvbGVyYW5jZVwiKTtcclxuICAgICAgICByZXN1bHQgPSBwYXJzZUZsb2F0KG9wdGlvbik7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHNlbGVjdGlvblRvbGVyYW5jZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fdmlld0tleSAhPSAtMSkge1xyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgSlNfU2V0X0RyaXZlcl9PcHRpb25zKFwic2VsZWN0aW9uIHRvbGVyYW5jZT1cIiArIHZhbHVlLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY29sbGlzaW9uVG9sZXJhbmNlKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0ID0gMC4wO1xyXG4gICAgaWYgKHRoaXMuX3ZpZXdLZXkgIT0gLTEpIHtcclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIGxldCBvcHRpb24gPSBKU19TaG93X09uZV9Ecml2ZXJfT3B0aW9uKFwiY29sbGlzaW9uIHRvbGVyYW5jZVwiKTtcclxuICAgICAgICByZXN1bHQgPSBwYXJzZUZsb2F0KG9wdGlvbik7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGNvbGxpc2lvblRvbGVyYW5jZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fdmlld0tleSAhPSAtMSkge1xyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgSlNfU2V0X0RyaXZlcl9PcHRpb25zKFwiY29sbGlzaW9uIHRvbGVyYW5jZT1cIiArIHZhbHVlLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc29mdENvbGxpc2lvbkRpc3RhbmNlKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0ID0gMC4wO1xyXG4gICAgaWYgKHRoaXMuX3ZpZXdLZXkgIT0gLTEpIHtcclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIGxldCBvcHRpb24gPSBKU19TaG93X09uZV9Ecml2ZXJfT3B0aW9uKFwic29mdCBjb2xsaXNpb24gZGlzdGFuY2VcIik7XHJcbiAgICAgICAgcmVzdWx0ID0gcGFyc2VGbG9hdChvcHRpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzb2Z0Q29sbGlzaW9uRGlzdGFuY2UodmFsdWU6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuX3ZpZXdLZXkgIT0gLTEpIHtcclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIEpTX1NldF9Ecml2ZXJfT3B0aW9ucyhcInNvZnQgY29sbGlzaW9uIGRpc3RhbmNlPVwiICsgdmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIGdldCBzY2VuZUNhbWVyYSgpOiBhbnkge1xyXG4gIC8vICAgICBsZXQgY2FtZXJhID0gbnVsbDtcclxuICAvLyAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl9zY2VuZUtleSk7XHJcbiAgLy8gICAgIHtcclxuICAvLyAgICAgICAgIGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAvLyAgICAgcmV0dXJuIGNhbWVyYTtcclxuICAvLyB9XHJcblxyXG4gIC8vcHVibGljIGFkZE9wZXJhdG9yKG9wZXJhdG9yOiBPcGVyYXRvcikge1xyXG4gIC8vICAgIG9wZXJhdG9yLnZpZXdlciA9IHRoaXM7XHJcbiAgLy8gICAgdGhpcy5vcGVyYXRvcnMuYWRkKG9wZXJhdG9yKTtcclxuICAvLyAgICBvcGVyYXRvci5pbml0KCk7XHJcbiAgLy99XHJcblxyXG4gIC8vcHVibGljIHJlbW92ZU9wZXJhdG9yKG9wZXJhdG9yOiBPcGVyYXRvcikge1xyXG4gIC8vICAgIG9wZXJhdG9yLmZpbmEoKTtcclxuICAvLyAgICB0aGlzLm9wZXJhdG9ycy5yZW1vdmUob3BlcmF0b3IpO1xyXG4gIC8vICAgIG9wZXJhdG9yLnZpZXdlciA9IG51bGw7XHJcbiAgLy99XHJcblxyXG4gIC8vcHVibGljIGNsZWFyT3BlcmF0b3JzKCkge1xyXG4gIC8vICAgIGxldCBsZW4gPSB0aGlzLm9wZXJhdG9ycy5pdGVtcy5sZW5ndGg7XHJcbiAgLy8gICAgbGV0IGl0ZW1zID0gdGhpcy5vcGVyYXRvcnMuaXRlbXM7XHJcblxyXG4gIC8vICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAvLyAgICAgICAgaXRlbXNbaV0uZmluYSgpO1xyXG4gIC8vICAgICAgICBpdGVtc1tpXS52aWV3ZXIgPSBudWxsO1xyXG4gIC8vICAgIH1cclxuXHJcbiAgLy8gICAgdGhpcy5vcGVyYXRvcnMuY2xlYXIoKTtcclxuICAvL31cclxuXHJcbiAgLy9wdWJsaWMgZmluZE9wZXJhdG9yPFQgZXh0ZW5kcyBPcGVyYXRvcj4odHlwZTogc3RyaW5nKTogVCB7XHJcbiAgLy8gICAgaWYgKHRoaXMub3BlcmF0b3JzICE9IG51bGwpIHtcclxuICAvLyAgICAgICAgbGV0IGxlbiA9IHRoaXMub3BlcmF0b3JzLml0ZW1zLmxlbmd0aDtcclxuICAvLyAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5vcGVyYXRvcnMuaXRlbXM7XHJcblxyXG4gIC8vICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgLy8gICAgICAgICAgICBpZiAoaXRlbXNbaV0udHlwZU5hbWUoKSA9PSB0eXBlKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgcmV0dXJuIDxUPml0ZW1zW2ldO1xyXG4gIC8vICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICB9XHJcbiAgLy8gICAgfVxyXG5cclxuICAvLyAgICByZXR1cm4gbnVsbDtcclxuICAvL31cclxuXHJcbiAgcHVibGljIGV4ZVNjZW5lQ2FtZXJhQ2hhbmdpbmcodHlwZTogQ2FtZXJhQ2hhbmdlVHlwZSkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgLy8g5pu05pawbmVhcmZhclxyXG4gICAgdGhpcy51cGRhdGVDYW1lcmFOZWFyRmFyKCk7XHJcbiAgICB0aGlzLnNjZW5lQ2FtZXJhQ2hhbmdpbmcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbiAgICAgIHZhbHVlKHNlbGYsIHR5cGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhlU2NlbmVDYW1lcmFDaGFuZ2VkKHR5cGU6IENhbWVyYUNoYW5nZVR5cGUpIHtcclxuICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgIHRoaXMuc2NlbmVDYW1lcmFDaGFuZ2VkLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBGdW5jdGlvbikge1xyXG4gICAgICB2YWx1ZShzZWxmLCB0eXBlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudXBkYXRlRG9jdW1lbnQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEb2N1bWVudCgpIHtcclxuICAgIHRoaXMuZG9jdW1lbnRDaGFuZ2VkLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBGdW5jdGlvbikge1xyXG4gICAgICB2YWx1ZShzZWxmKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUNhbWVyYU5lYXJGYXIoKSB7XHJcbiAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3NjZW5lS2V5KTtcclxuICAgIHtcclxuICAgICAgbGV0IGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcbiAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgbGV0IGJiO1xyXG5cclxuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5wcm9jZXNzICYmICh0aGlzIGFzIGFueSkucHJvY2Vzcy5yZW5kZXJPYmplY3QpIHtcclxuICAgICAgICAgIGxldCBtb2RlbCA9ICh0aGlzIGFzIGFueSkucHJvY2Vzcy5yZW5kZXJPYmplY3Q7XHJcbiAgICAgICAgICBpZiAobW9kZWwgJiYgbW9kZWwucHJvcGVydGllcyAmJiBtb2RlbC5wcm9wZXJ0aWVzLmJvdW5kaW5nQm94KSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibW9kZWwucHJvcGVydGllcy5ib3VuZGluZ0JveFwiLCBtb2RlbC5wcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgYmIgPSBtb2RlbC5wcm9wZXJ0aWVzLmJvdW5kaW5nQm94O1xyXG4gICAgICAgICAgICBsZXQgYmIyID0gSlNfQ29tcHV0ZV9Cb3VuZGluZ2JveF9CeV9LZXkodGhpcy5zY2VuZUtleSk7XHJcblxyXG4gICAgICAgICAgICBCb3VuZGluZ0JveC5leHRlbmQoYmIsIGJiMik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBiYiA9IEpTX0NvbXB1dGVfQm91bmRpbmdib3hfQnlfS2V5KHRoaXMuc2NlbmVLZXkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBiYiA9IEpTX0NvbXB1dGVfQm91bmRpbmdib3hfQnlfS2V5KHRoaXMuc2NlbmVLZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1pbiA9IG5ldyBGbG9hdDY0QXJyYXkoW2JiWzBdLCBiYlsxXSwgYmJbMl1dKTtcclxuICAgICAgICBsZXQgbWF4ID0gbmV3IEZsb2F0NjRBcnJheShbYmJbM10sIGJiWzRdLCBiYls1XV0pO1xyXG4gICAgICAgIENhbGN1bGF0ZU5lYXJGYXIoY2FtZXJhLCBtaW4sIG1heCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbnRlcm5hbEZpdFdvcmxkKHR5cGU/OiBFbGVtZW50VHlwZSkge1xyXG4gICAgaWYgKHRoaXMuX3NjZW5lS2V5ICE9IC0xKSB7XHJcbiAgICAgIGxldCBjZW50ZXIgPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICBsZXQgbWluID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgbGV0IG1heCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcblxyXG4gICAgICBpZiAodHlwZSkge1xyXG4gICAgICAgIGxldCBiYiA9IEpTX0NvbXB1dGVfQm91bmRpbmdib3hfV2l0aF9WaXNpYmlsaXR5X0J5X0tleShcclxuICAgICAgICAgIHRoaXMuX3NjZW5lS2V5LFxyXG4gICAgICAgICAgRWxlbWVudFR5cGUuRUxFTUVOVF9UWVBFX0ZhY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIG1pblswXSA9IGJiWzBdO1xyXG4gICAgICAgIG1pblsxXSA9IGJiWzFdO1xyXG4gICAgICAgIG1pblsyXSA9IGJiWzJdO1xyXG4gICAgICAgIG1heFswXSA9IGJiWzNdO1xyXG4gICAgICAgIG1heFsxXSA9IGJiWzRdO1xyXG4gICAgICAgIG1heFsyXSA9IGJiWzVdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBiYiA9IEpTX0NvbXB1dGVfQm91bmRpbmdib3hfQnlfS2V5KHRoaXMuX3NjZW5lS2V5KTtcclxuICAgICAgICBtaW5bMF0gPSBiYlswXTtcclxuICAgICAgICBtaW5bMV0gPSBiYlsxXTtcclxuICAgICAgICBtaW5bMl0gPSBiYlsyXTtcclxuICAgICAgICBtYXhbMF0gPSBiYlszXTtcclxuICAgICAgICBtYXhbMV0gPSBiYls0XTtcclxuICAgICAgICBtYXhbMl0gPSBiYls1XTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY29uc29sZS5sb2coXCJtaW46IFwiLCBtaW4pO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIm1heDogXCIsIG1heCk7XHJcblxyXG4gICAgICBpZiAobWF4WzBdID4gbWluWzBdIHx8IG1heFsxXSA+IG1pblsxXSB8fCBtYXhbMl0gPiBtaW5bMl0pIHtcclxuICAgICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3NjZW5lS2V5KTtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgZGlhZ29uYWxWZWN0b3IgPSBQb2ludC5zdWJ0cmFjdChtYXgsIG1pbik7XHJcbiAgICAgICAgICBsZXQgZGlhZ29uYWxMZW5ndGggPSBWZWN0b3IubW9kdWxlKGRpYWdvbmFsVmVjdG9yKTtcclxuXHJcbiAgICAgICAgICBjZW50ZXJbMF0gPSAwLjUgKiAobWluWzBdICsgbWF4WzBdKTtcclxuICAgICAgICAgIGNlbnRlclsxXSA9IDAuNSAqIChtaW5bMV0gKyBtYXhbMV0pO1xyXG4gICAgICAgICAgY2VudGVyWzJdID0gMC41ICogKG1pblsyXSArIG1heFsyXSk7XHJcblxyXG4gICAgICAgICAgbGV0IGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcblxyXG4gICAgICAgICAgbGV0IG5ld19wb3NpdGlvbiA9IG51bGw7XHJcbiAgICAgICAgICBsZXQgbmV3X3RhcmdldCA9IG5ldyBGbG9hdDY0QXJyYXkoY2VudGVyKTtcclxuICAgICAgICAgIC8vbGV0IG5ld191cCA9IG51bGw7XHJcbiAgICAgICAgICBsZXQgbmV3X3dpZHRoID0gMi4wO1xyXG4gICAgICAgICAgbGV0IG5ld19oZWlnaHQgPSAyLjA7XHJcblxyXG4gICAgICAgICAgbGV0IHZpZXdpbmdWZWN0b3IgPSBEUG9pbnQuc3VidHJhY3QoY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEudGFyZ2V0KTtcclxuICAgICAgICAgIERWZWN0b3Iubm9ybWFsaXplKHZpZXdpbmdWZWN0b3IpO1xyXG5cclxuICAgICAgICAgIGlmIChkaWFnb25hbExlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgIC8vIHJlc2V0IGNhbWVyYSBwb3NpdGlvbiB0byBsaWUgb24gdGhlIHZpZXdpbmcgdmVjdG9yLCBhdCBhIGRpc3RhbmNlIG9mXHJcbiAgICAgICAgICAgIC8vIDIuNSAqIGRpYWdvbmFsIGxlbmd0aCBhd2F5IGZyb20gdGhlIGNlbnRlciBvZiB0aGUgc2NlbmUgY2VudHJvaWRcclxuICAgICAgICAgICAgbmV3X3Bvc2l0aW9uID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuICAgICAgICAgICAgbmV3X3Bvc2l0aW9uWzBdID1cclxuICAgICAgICAgICAgICBjZW50ZXJbMF0gKyAyLjUgKiB2aWV3aW5nVmVjdG9yWzBdICogZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICAgIG5ld19wb3NpdGlvblsxXSA9XHJcbiAgICAgICAgICAgICAgY2VudGVyWzFdICsgMi41ICogdmlld2luZ1ZlY3RvclsxXSAqIGRpYWdvbmFsTGVuZ3RoO1xyXG4gICAgICAgICAgICBuZXdfcG9zaXRpb25bMl0gPVxyXG4gICAgICAgICAgICAgIGNlbnRlclsyXSArIDIuNSAqIHZpZXdpbmdWZWN0b3JbMl0gKiBkaWFnb25hbExlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIHNldCB0aGUgY2FtZXJhIGZpZWxkIHRvIGJlIHRoZSBkaWFnb25hbCBsZW5ndGggb2YgdGhlIHNjZW5lJ3MgYm91bmRpbmcgYm94XHJcbiAgICAgICAgICAgIG5ld193aWR0aCA9IGRpYWdvbmFsTGVuZ3RoO1xyXG4gICAgICAgICAgICBuZXdfaGVpZ2h0ID0gZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICAgIC8vbmV3X3VwID0gdXA7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdfcG9zaXRpb24gPSBjYW1lcmEucG9zO1xyXG4gICAgICAgICAgICAvL25ld191cCA9IHVwO1xyXG5cclxuICAgICAgICAgICAgbmV3X3dpZHRoID0gY2FtZXJhLndpZHRoO1xyXG4gICAgICAgICAgICBuZXdfaGVpZ2h0ID0gY2FtZXJhLmhlaWdodDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgbWF4Wm9vbUxldmVsID0gdGhpcy56b29tTGltaXQ7XHJcbiAgICAgICAgICBpZiAobmV3X3dpZHRoIDwgbWF4Wm9vbUxldmVsKSB7XHJcbiAgICAgICAgICAgIG5ld193aWR0aCA9IG1heFpvb21MZXZlbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChuZXdfaGVpZ2h0IDwgbWF4Wm9vbUxldmVsKSB7XHJcbiAgICAgICAgICAgIG5ld19oZWlnaHQgPSBtYXhab29tTGV2ZWw7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICBuZXdfd2lkdGggKj0gMi4wO1xyXG4gICAgICAgICAgICBuZXdfaGVpZ2h0ICo9IDIuMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhKFxyXG4gICAgICAgICAgICBuZXdfcG9zaXRpb24sXHJcbiAgICAgICAgICAgIG5ld190YXJnZXQsXHJcbiAgICAgICAgICAgIGNhbWVyYS51cCxcclxuICAgICAgICAgICAgbmV3X3dpZHRoLFxyXG4gICAgICAgICAgICBuZXdfaGVpZ2h0LFxyXG4gICAgICAgICAgICBjYW1lcmEucHJvamVjdGlvblxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAvLyBKU19TZXRfQ2FtZXJhKFxyXG4gICAgICAgICAgICAvLyAgIG5ld19wb3NpdGlvbixcclxuICAgICAgICAgICAgLy8gICBuZXdfdGFyZ2V0LFxyXG4gICAgICAgICAgICAvLyAgIGNhbWVyYS51cCxcclxuICAgICAgICAgICAgLy8gICBuZXdfd2lkdGgsXHJcbiAgICAgICAgICAgIC8vICAgbmV3X2hlaWdodCxcclxuICAgICAgICAgICAgLy8gICBjYW1lcmEucHJvamVjdGlvblxyXG4gICAgICAgICAgICAvLyApO1xyXG5cclxuICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgIC8vIGxldCBhbWRfcG9zaXRpb24gPSBER2VvbWV0cnlPcGVyYXRvcnMuZGlzdGFuY2VQb2ludChuZXdfdGFyZ2V0LCB2aWV3aW5nVmVjdG9yLCBkaWFnb25hbExlbmd0aCk7XHJcbiAgICAgICAgICAgIC8vIGxldCBhbWRfdGFyZ2V0ID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuICAgICAgICAgICAgLy8gYW1kX3RhcmdldFswXSA9IGFtZF9wb3NpdGlvblswXSAtIHZpZXdpbmdWZWN0b3JbMF0gKiAwLjAxO1xyXG4gICAgICAgICAgICAvLyBhbWRfdGFyZ2V0WzFdID0gYW1kX3Bvc2l0aW9uWzFdIC0gdmlld2luZ1ZlY3RvclsxXSAqIDAuMDE7XHJcbiAgICAgICAgICAgIC8vIGFtZF90YXJnZXRbMl0gPSBhbWRfcG9zaXRpb25bMl0gLSB2aWV3aW5nVmVjdG9yWzJdICogMC4wMTtcclxuXHJcbiAgICAgICAgICAgIC8vIEpTX1NldF9DYW1lcmEoXHJcbiAgICAgICAgICAgIC8vICAgYW1kX3Bvc2l0aW9uLFxyXG4gICAgICAgICAgICAvLyAgIGFtZF90YXJnZXQsXHJcbiAgICAgICAgICAgIC8vICAgY2FtZXJhLnVwLFxyXG4gICAgICAgICAgICAvLyAgIG5ld193aWR0aCxcclxuICAgICAgICAgICAgLy8gICBuZXdfaGVpZ2h0LFxyXG4gICAgICAgICAgICAvLyAgIGNhbWVyYS5wcm9qZWN0aW9uXHJcbiAgICAgICAgICAgIC8vICk7XHJcblxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRpYWdvbmFsTGVuZ3RoOiBcIiwgZGlhZ29uYWxMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMSk7XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX0V4dGVudCgxLCBkaWFnb25hbExlbmd0aCAqIDEwKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJkaWFnb25hbExlbmd0aCAvIDEwOiBcIiwgZGlhZ29uYWxMZW5ndGggLyAxMCk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZGlhZ29uYWxMZW5ndGggKiAxMDogXCIsIGRpYWdvbmFsTGVuZ3RoICogMTApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbnRlcm5hbEZpdFdvcmxkQnlCQihiYjogRmxvYXQzMkFycmF5KSB7XHJcbiAgICBpZiAodGhpcy5fc2NlbmVLZXkgIT0gLTEpIHtcclxuICAgICAgbGV0IGNlbnRlciA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICAgIGxldCBtaW4gPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICBsZXQgbWF4ID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuXHJcbiAgICAgIG1pblswXSA9IGJiWzBdO1xyXG4gICAgICBtaW5bMV0gPSBiYlsxXTtcclxuICAgICAgbWluWzJdID0gYmJbMl07XHJcbiAgICAgIG1heFswXSA9IGJiWzNdO1xyXG4gICAgICBtYXhbMV0gPSBiYls0XTtcclxuICAgICAgbWF4WzJdID0gYmJbNV07XHJcblxyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIm1pbjogXCIsIG1pbik7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwibWF4OiBcIiwgbWF4KTtcclxuXHJcbiAgICAgIGlmIChtYXhbMF0gPiBtaW5bMF0gfHwgbWF4WzFdID4gbWluWzFdIHx8IG1heFsyXSA+IG1pblsyXSkge1xyXG4gICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBkaWFnb25hbFZlY3RvciA9IFBvaW50LnN1YnRyYWN0KG1heCwgbWluKTtcclxuICAgICAgICAgIGxldCBkaWFnb25hbExlbmd0aCA9IFZlY3Rvci5tb2R1bGUoZGlhZ29uYWxWZWN0b3IpO1xyXG5cclxuICAgICAgICAgIGNlbnRlclswXSA9IDAuNSAqIChtaW5bMF0gKyBtYXhbMF0pO1xyXG4gICAgICAgICAgY2VudGVyWzFdID0gMC41ICogKG1pblsxXSArIG1heFsxXSk7XHJcbiAgICAgICAgICBjZW50ZXJbMl0gPSAwLjUgKiAobWluWzJdICsgbWF4WzJdKTtcclxuXHJcbiAgICAgICAgICBsZXQgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuXHJcbiAgICAgICAgICBsZXQgbmV3X3Bvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICAgIGxldCBuZXdfdGFyZ2V0ID0gbmV3IEZsb2F0NjRBcnJheShjZW50ZXIpO1xyXG4gICAgICAgICAgLy9sZXQgbmV3X3VwID0gbnVsbDtcclxuICAgICAgICAgIGxldCBuZXdfd2lkdGggPSAyLjA7XHJcbiAgICAgICAgICBsZXQgbmV3X2hlaWdodCA9IDIuMDtcclxuXHJcbiAgICAgICAgICBsZXQgdmlld2luZ1ZlY3RvciA9IERQb2ludC5zdWJ0cmFjdChjYW1lcmEucG9zaXRpb24sIGNhbWVyYS50YXJnZXQpO1xyXG4gICAgICAgICAgRFZlY3Rvci5ub3JtYWxpemUodmlld2luZ1ZlY3Rvcik7XHJcblxyXG4gICAgICAgICAgaWYgKGRpYWdvbmFsTGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgY2FtZXJhIHBvc2l0aW9uIHRvIGxpZSBvbiB0aGUgdmlld2luZyB2ZWN0b3IsIGF0IGEgZGlzdGFuY2Ugb2ZcclxuICAgICAgICAgICAgLy8gMi41ICogZGlhZ29uYWwgbGVuZ3RoIGF3YXkgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBzY2VuZSBjZW50cm9pZFxyXG4gICAgICAgICAgICBuZXdfcG9zaXRpb24gPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICAgICAgICBuZXdfcG9zaXRpb25bMF0gPVxyXG4gICAgICAgICAgICAgIGNlbnRlclswXSArIDIuNSAqIHZpZXdpbmdWZWN0b3JbMF0gKiBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgICAgbmV3X3Bvc2l0aW9uWzFdID1cclxuICAgICAgICAgICAgICBjZW50ZXJbMV0gKyAyLjUgKiB2aWV3aW5nVmVjdG9yWzFdICogZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICAgIG5ld19wb3NpdGlvblsyXSA9XHJcbiAgICAgICAgICAgICAgY2VudGVyWzJdICsgMi41ICogdmlld2luZ1ZlY3RvclsyXSAqIGRpYWdvbmFsTGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgLy8gc2V0IHRoZSBjYW1lcmEgZmllbGQgdG8gYmUgdGhlIGRpYWdvbmFsIGxlbmd0aCBvZiB0aGUgc2NlbmUncyBib3VuZGluZyBib3hcclxuICAgICAgICAgICAgbmV3X3dpZHRoID0gZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICAgIG5ld19oZWlnaHQgPSBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgICAgLy9uZXdfdXAgPSB1cDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5ld19wb3NpdGlvbiA9IGNhbWVyYS5wb3M7XHJcbiAgICAgICAgICAgIC8vbmV3X3VwID0gdXA7XHJcblxyXG4gICAgICAgICAgICBuZXdfd2lkdGggPSBjYW1lcmEud2lkdGg7XHJcbiAgICAgICAgICAgIG5ld19oZWlnaHQgPSBjYW1lcmEuaGVpZ2h0O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBtYXhab29tTGV2ZWwgPSB0aGlzLnpvb21MaW1pdDtcclxuICAgICAgICAgIGlmIChuZXdfd2lkdGggPCBtYXhab29tTGV2ZWwpIHtcclxuICAgICAgICAgICAgbmV3X3dpZHRoID0gbWF4Wm9vbUxldmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG5ld19oZWlnaHQgPCBtYXhab29tTGV2ZWwpIHtcclxuICAgICAgICAgICAgbmV3X2hlaWdodCA9IG1heFpvb21MZXZlbDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgIG5ld193aWR0aCAqPSAyLjA7XHJcbiAgICAgICAgICAgIG5ld19oZWlnaHQgKj0gMi4wO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIEpTX1NldF9DYW1lcmEoXHJcbiAgICAgICAgICAgIG5ld19wb3NpdGlvbixcclxuICAgICAgICAgICAgbmV3X3RhcmdldCxcclxuICAgICAgICAgICAgY2FtZXJhLnVwLFxyXG4gICAgICAgICAgICBuZXdfd2lkdGgsXHJcbiAgICAgICAgICAgIG5ld19oZWlnaHQsXHJcbiAgICAgICAgICAgIGNhbWVyYS5wcm9qZWN0aW9uXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgIC8vIEpTX1NldF9DYW1lcmEoXHJcbiAgICAgICAgICAgIC8vICAgbmV3X3Bvc2l0aW9uLFxyXG4gICAgICAgICAgICAvLyAgIG5ld190YXJnZXQsXHJcbiAgICAgICAgICAgIC8vICAgY2FtZXJhLnVwLFxyXG4gICAgICAgICAgICAvLyAgIG5ld193aWR0aCxcclxuICAgICAgICAgICAgLy8gICBuZXdfaGVpZ2h0LFxyXG4gICAgICAgICAgICAvLyAgIGNhbWVyYS5wcm9qZWN0aW9uXHJcbiAgICAgICAgICAgIC8vICk7XHJcblxyXG4gICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgLy8gbGV0IGFtZF9wb3NpdGlvbiA9IERHZW9tZXRyeU9wZXJhdG9ycy5kaXN0YW5jZVBvaW50KG5ld190YXJnZXQsIHZpZXdpbmdWZWN0b3IsIGRpYWdvbmFsTGVuZ3RoKTtcclxuICAgICAgICAgICAgLy8gbGV0IGFtZF90YXJnZXQgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICAgICAgICAvLyBhbWRfdGFyZ2V0WzBdID0gYW1kX3Bvc2l0aW9uWzBdIC0gdmlld2luZ1ZlY3RvclswXSAqIDAuMDE7XHJcbiAgICAgICAgICAgIC8vIGFtZF90YXJnZXRbMV0gPSBhbWRfcG9zaXRpb25bMV0gLSB2aWV3aW5nVmVjdG9yWzFdICogMC4wMTtcclxuICAgICAgICAgICAgLy8gYW1kX3RhcmdldFsyXSA9IGFtZF9wb3NpdGlvblsyXSAtIHZpZXdpbmdWZWN0b3JbMl0gKiAwLjAxO1xyXG5cclxuICAgICAgICAgICAgLy8gSlNfU2V0X0NhbWVyYShcclxuICAgICAgICAgICAgLy8gICBhbWRfcG9zaXRpb24sXHJcbiAgICAgICAgICAgIC8vICAgYW1kX3RhcmdldCxcclxuICAgICAgICAgICAgLy8gICBjYW1lcmEudXAsXHJcbiAgICAgICAgICAgIC8vICAgbmV3X3dpZHRoLFxyXG4gICAgICAgICAgICAvLyAgIG5ld19oZWlnaHQsXHJcbiAgICAgICAgICAgIC8vICAgY2FtZXJhLnByb2plY3Rpb25cclxuICAgICAgICAgICAgLy8gKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZGlhZ29uYWxMZW5ndGg6IFwiLCBkaWFnb25hbExlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygxKTtcclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfRXh0ZW50KDEsIGRpYWdvbmFsTGVuZ3RoICogMTApO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRpYWdvbmFsTGVuZ3RoIC8gMTA6IFwiLCBkaWFnb25hbExlbmd0aCAvIDEwKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJkaWFnb25hbExlbmd0aCAqIDEwOiBcIiwgZGlhZ29uYWxMZW5ndGggKiAxMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpdFdvcmxkKHR5cGU/OiBFbGVtZW50VHlwZSkge1xyXG4gICAgaWYgKHRoaXMuX3NjZW5lS2V5ICE9IC0xKSB7XHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcbiAgICAgICAgbGV0IGNvID0gY2FtZXJhLnBvc2l0aW9uO1xyXG4gICAgICAgIGxldCB0byA9IGNhbWVyYS50YXJnZXQ7XHJcbiAgICAgICAgbGV0IHVvID0gY2FtZXJhLnVwO1xyXG4gICAgICAgIGxldCB3aWR0aG8gPSBjYW1lcmEud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodG8gPSBjYW1lcmEuaGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLmludGVybmFsRml0V29ybGQodHlwZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zbW9vdGhUcmFuc2l0aW9uKSB7XHJcbiAgICAgICAgICBsZXQgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuXHJcbiAgICAgICAgICBsZXQgY24gPSBjYW1lcmEucG9zaXRpb247XHJcbiAgICAgICAgICBsZXQgdG4gPSBjYW1lcmEudGFyZ2V0O1xyXG4gICAgICAgICAgbGV0IHVuID0gY2FtZXJhLnVwO1xyXG4gICAgICAgICAgbGV0IHdpZHRobiA9IGNhbWVyYS53aWR0aDtcclxuICAgICAgICAgIGxldCBoZWlnaHRuID0gY2FtZXJhLmhlaWdodDtcclxuXHJcbiAgICAgICAgICBHc1dlYkdMVXRpbGl0eS5zbW9vdGhUcmFuc2l0aW9uRChcclxuICAgICAgICAgICAgY28sXHJcbiAgICAgICAgICAgIHRvLFxyXG4gICAgICAgICAgICB1byxcclxuICAgICAgICAgICAgd2lkdGhvLFxyXG4gICAgICAgICAgICBoZWlnaHRvLFxyXG4gICAgICAgICAgICBjbixcclxuICAgICAgICAgICAgdG4sXHJcbiAgICAgICAgICAgIHVuLFxyXG4gICAgICAgICAgICB3aWR0aG4sXHJcbiAgICAgICAgICAgIGhlaWdodG4sXHJcbiAgICAgICAgICAgIHRoaXNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCB2aWV3ZXIgPSB0aGlzO1xyXG4gICAgICAgICAgLy/miafooYxzY2VuZUNhbWVyYUNoYW5nZWTmiafooYzlhYhTZXRDYW1lcmFOZWFyRmFyLlxyXG4gICAgICAgICAgdGhpcy5leGVTY2VuZUNhbWVyYUNoYW5naW5nKENhbWVyYUNoYW5nZVR5cGUuUm90YXRlKTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAgICAgdGhpcy5leGVTY2VuZUNhbWVyYUNoYW5nZWQoQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9jYXRlV29ybGQoa2V5OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9zY2VuZUtleSAhPSAtMSkge1xyXG4gICAgICBsZXQgY2VudGVyID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgbGV0IG1pbiA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICAgIGxldCBtYXggPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG5cclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl9zY2VuZUtleSk7XHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgYmIgPSBKU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hfQnlfS2V5KHRoaXMuX3ZpZXdLZXksIGtleSk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGJiWzBdID09PSAxICYmXHJcbiAgICAgICAgICBiYlsxXSA9PT0gMSAmJlxyXG4gICAgICAgICAgYmJbMl0gPT09IDEgJiZcclxuICAgICAgICAgIGJiWzNdID09PSAtMSAmJlxyXG4gICAgICAgICAgYmJbNF0gPT09IC0xICYmXHJcbiAgICAgICAgICBiYls1XSA9PT0gLTFcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiYm91bmRpbmdCb3jkuLotMS0tLTFcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG1pblswXSA9IGJiWzBdO1xyXG4gICAgICAgICAgbWluWzFdID0gYmJbMV07XHJcbiAgICAgICAgICBtaW5bMl0gPSBiYlsyXTtcclxuXHJcbiAgICAgICAgICBtYXhbMF0gPSBiYlszXTtcclxuICAgICAgICAgIG1heFsxXSA9IGJiWzRdO1xyXG4gICAgICAgICAgbWF4WzJdID0gYmJbNV07XHJcblxyXG4gICAgICAgICAgLy9vcmRlciB0aGUgcG9pbnRzXHJcbiAgICAgICAgICBpZiAobWluWzBdID4gbWF4WzBdKSB7XHJcbiAgICAgICAgICAgIGxldCB0bXA6IG51bWJlcjtcclxuICAgICAgICAgICAgdG1wID0gbWluWzBdO1xyXG4gICAgICAgICAgICBtaW5bMF0gPSBtYXhbMF07XHJcbiAgICAgICAgICAgIG1heFswXSA9IHRtcDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChtaW5bMV0gPiBtYXhbMV0pIHtcclxuICAgICAgICAgICAgbGV0IHRtcDogbnVtYmVyO1xyXG4gICAgICAgICAgICB0bXAgPSBtaW5bMV07XHJcbiAgICAgICAgICAgIG1pblsxXSA9IG1heFsxXTtcclxuICAgICAgICAgICAgbWF4WzFdID0gdG1wO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG1pblsyXSA+IG1heFsyXSkge1xyXG4gICAgICAgICAgICBsZXQgdG1wOiBudW1iZXI7XHJcbiAgICAgICAgICAgIHRtcCA9IG1pblsyXTtcclxuICAgICAgICAgICAgbWluWzJdID0gbWF4WzJdO1xyXG4gICAgICAgICAgICBtYXhbMl0gPSB0bXA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy9jb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIGJib3ggZGlhZ29uYWwgdmVjdG9yXHJcbiAgICAgICAgICAvL3RoaXMgd2lsbCBiZSB1c2VkIHRvIG1ha2UgdGhlIGNhbWVyYSBmaWVsZCBhIGJpdCBsYXJnZXJcclxuICAgICAgICAgIC8vdG8gZW5zdXJlIHRoYXQgb2JqZWN0cyBiZXR3ZWVuIHRoZSBjYW1lcmEgcG9zaXRpb24gYW5kIHRhcmdldFxyXG4gICAgICAgICAgLy93aWxsIHN0aWxsIG5vdCBnZXQgY2xpcHBlZCAodGhpcyBpcyBmb3IgcGVyc3BlY3RpdmUgdmlld2luZyBtb2RlKVxyXG5cclxuICAgICAgICAgIGxldCBkaWFnb25hbFZlY3RvciA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAgICAgICBtYXhbMF0gLSBtaW5bMF0sXHJcbiAgICAgICAgICAgIG1heFsxXSAtIG1pblsxXSxcclxuICAgICAgICAgICAgbWF4WzJdIC0gbWluWzJdLFxyXG4gICAgICAgICAgXSk7XHJcbiAgICAgICAgICBsZXQgZGlhZ29uYWxMZW5ndGggPSBWZWN0b3IubW9kdWxlKGRpYWdvbmFsVmVjdG9yKTtcclxuXHJcbiAgICAgICAgICBjZW50ZXJbMF0gPSAwLjUgKiAobWluWzBdICsgbWF4WzBdKTtcclxuICAgICAgICAgIGNlbnRlclsxXSA9IDAuNSAqIChtaW5bMV0gKyBtYXhbMV0pO1xyXG4gICAgICAgICAgY2VudGVyWzJdID0gMC41ICogKG1pblsyXSArIG1heFsyXSk7XHJcblxyXG4gICAgICAgICAgbGV0IGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcblxyXG4gICAgICAgICAgbGV0IGNvID0gY2FtZXJhLnBvc2l0aW9uO1xyXG4gICAgICAgICAgbGV0IHRvID0gY2FtZXJhLnRhcmdldDtcclxuICAgICAgICAgIGxldCB1byA9IGNhbWVyYS51cDtcclxuICAgICAgICAgIGxldCB3aWR0aG8gPSBjYW1lcmEud2lkdGg7XHJcbiAgICAgICAgICBsZXQgaGVpZ2h0byA9IGNhbWVyYS5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgLy9kb3VibGVbXSBwb3NpdGlvbjtcclxuICAgICAgICAgIC8vZG91YmxlW10gdGFyZ2V0O1xyXG4gICAgICAgICAgLy9kb3VibGVbXSB1cDtcclxuICAgICAgICAgIC8vZG91YmxlIGZpZWxkeCwgZmllbGR5O1xyXG4gICAgICAgICAgLy9zdHJpbmcgcHJvajtcclxuXHJcbiAgICAgICAgICAvL0dDUy5TaG93X0NhbWVyYShvdXQgcG9zaXRpb24sIG91dCB0YXJnZXQsIG91dCB1cCwgb3V0IGZpZWxkeCwgb3V0IGZpZWxkeSwgb3V0IHByb2opO1xyXG5cclxuICAgICAgICAgIC8vIG5vdyB3ZSBkZXRlcm1pbmUgdGhlIG5ldyBjYW1lcmEgZGVmaW5pdGlvblxyXG4gICAgICAgICAgbGV0IGNuID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuICAgICAgICAgIGxldCB0biA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICAgICAgICBsZXQgdW4gPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICAgICAgbGV0IHdpZHRobiwgaGVpZ2h0bjogbnVtYmVyO1xyXG5cclxuICAgICAgICAgIGlmIChkaWFnb25hbExlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgIHRuWzBdID0gY2VudGVyWzBdO1xyXG4gICAgICAgICAgICB0blsxXSA9IGNlbnRlclsxXTtcclxuICAgICAgICAgICAgdG5bMl0gPSBjZW50ZXJbMl07XHJcblxyXG4gICAgICAgICAgICBsZXQgdmlld2luZ1ZlY3RvciA9IG5ldyBGbG9hdDY0QXJyYXkoW1xyXG4gICAgICAgICAgICAgIGNvWzBdIC0gdG9bMF0sXHJcbiAgICAgICAgICAgICAgY29bMV0gLSB0b1sxXSxcclxuICAgICAgICAgICAgICBjb1syXSAtIHRvWzJdLFxyXG4gICAgICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgICAgIERWZWN0b3Iubm9ybWFsaXplKHZpZXdpbmdWZWN0b3IpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzZXQgY2FtZXJhIHBvc2l0aW9uIHRvIGxpZSBvbiB0aGUgdmlld2luZyB2ZWN0b3IsIGF0IGEgZGlzdGFuY2Ugb2ZcclxuICAgICAgICAgICAgLy8gMi41ICogZGlhZ29uYWwgbGVuZ3RoIGF3YXkgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBzY2VuZSBjZW50cm9pZFxyXG4gICAgICAgICAgICBjblswXSA9IGNlbnRlclswXSArIDIuNSAqIHZpZXdpbmdWZWN0b3JbMF0gKiBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgICAgY25bMV0gPSBjZW50ZXJbMV0gKyAyLjUgKiB2aWV3aW5nVmVjdG9yWzFdICogZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICAgIGNuWzJdID0gY2VudGVyWzJdICsgMi41ICogdmlld2luZ1ZlY3RvclsyXSAqIGRpYWdvbmFsTGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgLy8gc2V0IHRoZSBjYW1lcmEgZmllbGQgdG8gYmUgdGhlIGRpYWdvbmFsIGxlbmd0aCBvZiB0aGUgc2NlbmUncyBib3VuZGluZyBib3hcclxuICAgICAgICAgICAgd2lkdGhuID0gZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICAgIGhlaWdodG4gPSBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgICAgdW4gPSB1bztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSBvbmx5IGNoYW5nZSB0aGUgdGFyZ2V0XHJcbiAgICAgICAgICAgIHRuWzBdID0gY2VudGVyWzBdO1xyXG4gICAgICAgICAgICB0blsxXSA9IGNlbnRlclsxXTtcclxuICAgICAgICAgICAgdG5bMl0gPSBjZW50ZXJbMl07XHJcblxyXG4gICAgICAgICAgICBjbiA9IGNvO1xyXG4gICAgICAgICAgICB1biA9IHVvO1xyXG5cclxuICAgICAgICAgICAgd2lkdGhuID0gd2lkdGhvO1xyXG4gICAgICAgICAgICBoZWlnaHRuID0gaGVpZ2h0bztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgbWF4Wm9vbUxldmVsID0gdGhpcy56b29tTGltaXQ7XHJcbiAgICAgICAgICBpZiAod2lkdGhuIDwgbWF4Wm9vbUxldmVsKSB7XHJcbiAgICAgICAgICAgIHdpZHRobiA9IG1heFpvb21MZXZlbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChoZWlnaHRuIDwgbWF4Wm9vbUxldmVsKSB7XHJcbiAgICAgICAgICAgIGhlaWdodG4gPSBtYXhab29tTGV2ZWw7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICB3aWR0aG4gKj0gMi4wO1xyXG4gICAgICAgICAgICBoZWlnaHRuICo9IDIuMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhKGNuLCB0biwgdW4sIHdpZHRobiwgaGVpZ2h0biwgY2FtZXJhLnByb2plY3Rpb24pO1xyXG4gICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9zbW9vdGhUcmFuc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG5cclxuICAgICAgICAgICAgY24gPSBjYW1lcmEucG9zaXRpb247XHJcbiAgICAgICAgICAgIHRuID0gY2FtZXJhLnRhcmdldDtcclxuICAgICAgICAgICAgdW4gPSBjYW1lcmEudXA7XHJcbiAgICAgICAgICAgIHdpZHRobiA9IGNhbWVyYS53aWR0aDtcclxuICAgICAgICAgICAgaGVpZ2h0biA9IGNhbWVyYS5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBHc1dlYkdMVXRpbGl0eS5zbW9vdGhUcmFuc2l0aW9uRChcclxuICAgICAgICAgICAgICBjbyxcclxuICAgICAgICAgICAgICB0byxcclxuICAgICAgICAgICAgICB1byxcclxuICAgICAgICAgICAgICB3aWR0aG8sXHJcbiAgICAgICAgICAgICAgaGVpZ2h0byxcclxuICAgICAgICAgICAgICBjbixcclxuICAgICAgICAgICAgICB0bixcclxuICAgICAgICAgICAgICB1bixcclxuICAgICAgICAgICAgICB3aWR0aG4sXHJcbiAgICAgICAgICAgICAgaGVpZ2h0bixcclxuICAgICAgICAgICAgICB0aGlzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2NhdGVXb3JsZEJ5RGF0YSh0YXJnZXQ6IEZsb2F0MzJBcnJheSwgbWluOiBudW1iZXJbXSwgbWF4OiBudW1iZXJbXSkge1xyXG4gICAgaWYgKHRoaXMuX3NjZW5lS2V5ICE9IC0xKSB7XHJcbiAgICAgIGxldCBjZW50ZXIgPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG5cclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl9zY2VuZUtleSk7XHJcbiAgICAgIHtcclxuICAgICAgICAvL29yZGVyIHRoZSBwb2ludHNcclxuICAgICAgICBpZiAobWluWzBdID4gbWF4WzBdKSB7XHJcbiAgICAgICAgICBsZXQgdG1wOiBudW1iZXI7XHJcbiAgICAgICAgICB0bXAgPSBtaW5bMF07XHJcbiAgICAgICAgICBtaW5bMF0gPSBtYXhbMF07XHJcbiAgICAgICAgICBtYXhbMF0gPSB0bXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtaW5bMV0gPiBtYXhbMV0pIHtcclxuICAgICAgICAgIGxldCB0bXA6IG51bWJlcjtcclxuICAgICAgICAgIHRtcCA9IG1pblsxXTtcclxuICAgICAgICAgIG1pblsxXSA9IG1heFsxXTtcclxuICAgICAgICAgIG1heFsxXSA9IHRtcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1pblsyXSA+IG1heFsyXSkge1xyXG4gICAgICAgICAgbGV0IHRtcDogbnVtYmVyO1xyXG4gICAgICAgICAgdG1wID0gbWluWzJdO1xyXG4gICAgICAgICAgbWluWzJdID0gbWF4WzJdO1xyXG4gICAgICAgICAgbWF4WzJdID0gdG1wO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIGJib3ggZGlhZ29uYWwgdmVjdG9yXHJcbiAgICAgICAgLy90aGlzIHdpbGwgYmUgdXNlZCB0byBtYWtlIHRoZSBjYW1lcmEgZmllbGQgYSBiaXQgbGFyZ2VyXHJcbiAgICAgICAgLy90byBlbnN1cmUgdGhhdCBvYmplY3RzIGJldHdlZW4gdGhlIGNhbWVyYSBwb3NpdGlvbiBhbmQgdGFyZ2V0XHJcbiAgICAgICAgLy93aWxsIHN0aWxsIG5vdCBnZXQgY2xpcHBlZCAodGhpcyBpcyBmb3IgcGVyc3BlY3RpdmUgdmlld2luZyBtb2RlKVxyXG5cclxuICAgICAgICBsZXQgZGlhZ29uYWxWZWN0b3IgPSBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgICAgIG1heFswXSAtIG1pblswXSxcclxuICAgICAgICAgIG1heFsxXSAtIG1pblsxXSxcclxuICAgICAgICAgIG1heFsyXSAtIG1pblsyXSxcclxuICAgICAgICBdKTtcclxuICAgICAgICBsZXQgZGlhZ29uYWxMZW5ndGggPSBWZWN0b3IubW9kdWxlKGRpYWdvbmFsVmVjdG9yKTtcclxuXHJcbiAgICAgICAgY2VudGVyWzBdID0gMC41ICogKG1pblswXSArIG1heFswXSk7XHJcbiAgICAgICAgY2VudGVyWzFdID0gMC41ICogKG1pblsxXSArIG1heFsxXSk7XHJcbiAgICAgICAgY2VudGVyWzJdID0gMC41ICogKG1pblsyXSArIG1heFsyXSk7XHJcblxyXG4gICAgICAgIC8vdGFyZ2V0IGNlbnRlciBvZmZzZXQ7XHJcbiAgICAgICAgbGV0IG9mZnNldCA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAgICAgdGFyZ2V0WzBdIC0gY2VudGVyWzBdLFxyXG4gICAgICAgICAgdGFyZ2V0WzFdIC0gY2VudGVyWzFdLFxyXG4gICAgICAgICAgdGFyZ2V0WzJdIC0gY2VudGVyWzJdLFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBjZW50ZXIgPSB0YXJnZXQ7XHJcbiAgICAgICAgZGlhZ29uYWxMZW5ndGggKz0gVmVjdG9yLm1vZHVsZShvZmZzZXQpO1xyXG5cclxuICAgICAgICBsZXQgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuXHJcbiAgICAgICAgbGV0IGNvID0gY2FtZXJhLnBvc2l0aW9uO1xyXG4gICAgICAgIGxldCB0byA9IGNhbWVyYS50YXJnZXQ7XHJcbiAgICAgICAgbGV0IHVvID0gY2FtZXJhLnVwO1xyXG4gICAgICAgIGxldCB3aWR0aG8gPSBjYW1lcmEud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodG8gPSBjYW1lcmEuaGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBub3cgd2UgZGV0ZXJtaW5lIHRoZSBuZXcgY2FtZXJhIGRlZmluaXRpb25cclxuICAgICAgICBsZXQgY24gPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICAgIGxldCB0biA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICAgICAgbGV0IHVuID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuICAgICAgICBsZXQgd2lkdGhuLCBoZWlnaHRuOiBudW1iZXI7XHJcblxyXG4gICAgICAgIGlmIChkaWFnb25hbExlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICB0blswXSA9IGNlbnRlclswXTtcclxuICAgICAgICAgIHRuWzFdID0gY2VudGVyWzFdO1xyXG4gICAgICAgICAgdG5bMl0gPSBjZW50ZXJbMl07XHJcblxyXG4gICAgICAgICAgbGV0IHZpZXdpbmdWZWN0b3IgPSBuZXcgRmxvYXQ2NEFycmF5KFtcclxuICAgICAgICAgICAgY29bMF0gLSB0b1swXSxcclxuICAgICAgICAgICAgY29bMV0gLSB0b1sxXSxcclxuICAgICAgICAgICAgY29bMl0gLSB0b1syXSxcclxuICAgICAgICAgIF0pO1xyXG5cclxuICAgICAgICAgIERWZWN0b3Iubm9ybWFsaXplKHZpZXdpbmdWZWN0b3IpO1xyXG5cclxuICAgICAgICAgIC8vIHJlc2V0IGNhbWVyYSBwb3NpdGlvbiB0byBsaWUgb24gdGhlIHZpZXdpbmcgdmVjdG9yLCBhdCBhIGRpc3RhbmNlIG9mXHJcbiAgICAgICAgICAvLyAyLjUgKiBkaWFnb25hbCBsZW5ndGggYXdheSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIHNjZW5lIGNlbnRyb2lkXHJcbiAgICAgICAgICBjblswXSA9IGNlbnRlclswXSArIDIuNSAqIHZpZXdpbmdWZWN0b3JbMF0gKiBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgIGNuWzFdID0gY2VudGVyWzFdICsgMi41ICogdmlld2luZ1ZlY3RvclsxXSAqIGRpYWdvbmFsTGVuZ3RoO1xyXG4gICAgICAgICAgY25bMl0gPSBjZW50ZXJbMl0gKyAyLjUgKiB2aWV3aW5nVmVjdG9yWzJdICogZGlhZ29uYWxMZW5ndGg7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IHRoZSBjYW1lcmEgZmllbGQgdG8gYmUgdGhlIGRpYWdvbmFsIGxlbmd0aCBvZiB0aGUgc2NlbmUncyBib3VuZGluZyBib3hcclxuICAgICAgICAgIHdpZHRobiA9IGRpYWdvbmFsTGVuZ3RoO1xyXG4gICAgICAgICAgaGVpZ2h0biA9IGRpYWdvbmFsTGVuZ3RoO1xyXG4gICAgICAgICAgdW4gPSB1bztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIG9ubHkgY2hhbmdlIHRoZSB0YXJnZXRcclxuICAgICAgICAgIHRuWzBdID0gY2VudGVyWzBdO1xyXG4gICAgICAgICAgdG5bMV0gPSBjZW50ZXJbMV07XHJcbiAgICAgICAgICB0blsyXSA9IGNlbnRlclsyXTtcclxuXHJcbiAgICAgICAgICBjbiA9IGNvO1xyXG4gICAgICAgICAgdW4gPSB1bztcclxuXHJcbiAgICAgICAgICB3aWR0aG4gPSB3aWR0aG87XHJcbiAgICAgICAgICBoZWlnaHRuID0gaGVpZ2h0bztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtYXhab29tTGV2ZWwgPSB0aGlzLnpvb21MaW1pdDtcclxuICAgICAgICBpZiAod2lkdGhuIDwgbWF4Wm9vbUxldmVsKSB7XHJcbiAgICAgICAgICB3aWR0aG4gPSBtYXhab29tTGV2ZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChoZWlnaHRuIDwgbWF4Wm9vbUxldmVsKSB7XHJcbiAgICAgICAgICBoZWlnaHRuID0gbWF4Wm9vbUxldmVsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgSlNfU2V0X0NhbWVyYShjbiwgdG4sIHVuLCB3aWR0aG4sIGhlaWdodG4sIGNhbWVyYS5wcm9qZWN0aW9uKTtcclxuICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgLy8gSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi4wKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZXhlU2NlbmVDYW1lcmFDaGFuZ2luZyhDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zbW9vdGhUcmFuc2l0aW9uKSB7XHJcbiAgICAgICAgICBsZXQgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuXHJcbiAgICAgICAgICBjbiA9IGNhbWVyYS5wb3NpdGlvbjtcclxuICAgICAgICAgIHRuID0gY2FtZXJhLnRhcmdldDtcclxuICAgICAgICAgIHVuID0gY2FtZXJhLnVwO1xyXG4gICAgICAgICAgd2lkdGhuID0gY2FtZXJhLndpZHRoO1xyXG4gICAgICAgICAgaGVpZ2h0biA9IGNhbWVyYS5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgR3NXZWJHTFV0aWxpdHkuc21vb3RoVHJhbnNpdGlvbkQoXHJcbiAgICAgICAgICAgIGNvLFxyXG4gICAgICAgICAgICB0byxcclxuICAgICAgICAgICAgdW8sXHJcbiAgICAgICAgICAgIHdpZHRobyxcclxuICAgICAgICAgICAgaGVpZ2h0byxcclxuICAgICAgICAgICAgY24sXHJcbiAgICAgICAgICAgIHRuLFxyXG4gICAgICAgICAgICB1bixcclxuICAgICAgICAgICAgd2lkdGhuLFxyXG4gICAgICAgICAgICBoZWlnaHRuLFxyXG4gICAgICAgICAgICB0aGlzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Vmlld01vZGUobW9kZTogVmlld01vZGUsIGZpdFdvcmxkPzogYm9vbGVhbiwgYmI/OiBGbG9hdDMyQXJyYXkpIHtcclxuICAgIGlmICh0aGlzLl9jYW1lcmFPcmllbnRhdGlvbkZpeGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY2FtZXJhOiBhbnk7XHJcbiAgICBsZXQgY287XHJcbiAgICBsZXQgdG87XHJcbiAgICBsZXQgdW87XHJcbiAgICBsZXQgd2lkdGhvO1xyXG4gICAgbGV0IGhlaWdodG87XHJcblxyXG4gICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl9zY2VuZUtleSk7XHJcbiAgICB7XHJcbiAgICAgIGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcblxyXG4gICAgICBjbyA9IGNhbWVyYS5wb3NpdGlvbjtcclxuICAgICAgdG8gPSBjYW1lcmEudGFyZ2V0O1xyXG4gICAgICB1byA9IGNhbWVyYS51cDtcclxuICAgICAgd2lkdGhvID0gY2FtZXJhLndpZHRoO1xyXG4gICAgICBoZWlnaHRvID0gY2FtZXJhLmhlaWdodDtcclxuXHJcbiAgICAgIGlmIChmaXRXb3JsZCkge1xyXG4gICAgICAgIGlmIChiYikge1xyXG4gICAgICAgICAgdGhpcy5pbnRlcm5hbEZpdFdvcmxkQnlCQihiYik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuaW50ZXJuYWxGaXRXb3JsZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuXHJcbiAgICAgIGxldCB0YXJnZXQgPSBjYW1lcmEudGFyZ2V0O1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSBjYW1lcmEucG9zaXRpb247XHJcblxyXG4gICAgICBsZXQgdmlldyA9IERQb2ludC5zdWJ0cmFjdChwb3NpdGlvbiwgdGFyZ2V0KTtcclxuICAgICAgbGV0IGxlbmd0aCA9IERWZWN0b3IubW9kdWxlKHZpZXcpO1xyXG5cclxuICAgICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5YWTpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gKyBsZW5ndGg7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdIC0gbGVuZ3RoO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDEuMCwgMC4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuWVg6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdIC0gbGVuZ3RoO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSArIGxlbmd0aDtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAxLjAsIDAuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLlhaOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdIC0gbGVuZ3RoO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdICsgbGVuZ3RoO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl07XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5aWDpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSArIGxlbmd0aDtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl07XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSAtIGxlbmd0aDtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuWVo6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSArIGxlbmd0aDtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdIC0gbGVuZ3RoO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLlpZOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gLSBsZW5ndGg7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSArIGxlbmd0aDtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl07XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Jc286XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBuZXdMZW4gPSBsZW5ndGggKiAwLjU3NzQ7XHJcblxyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSArIG5ld0xlbjtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gLSBuZXdMZW47XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdICsgbmV3TGVuO1xyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuWVVwSXNvOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBsZXQgbmV3TGVuID0gbGVuZ3RoICogMC41Nzc0O1xyXG5cclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gKyBuZXdMZW47XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdICsgbmV3TGVuO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSArIG5ld0xlbjtcclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuRU46XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl07XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5OVzpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLldTOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl07XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuU0U6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl07XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Ub3BFOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuQm90dG9tRTpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLlRvcE46XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Cb3R0b21OOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuVG9wVzpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLkJvdHRvbVc6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Ub3BTOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuQm90dG9tUzpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLlRvcEVOOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Cb3R0b21FTjpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuVG9wTlc6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLkJvdHRvbU5XOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Ub3BXUzpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuQm90dG9tV1M6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLlRvcFNFOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Cb3R0b21TRTpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgIGlmICh0aGlzLl9zbW9vdGhUcmFuc2l0aW9uKSB7XHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICBsZXQgY24gPSBjYW1lcmEucG9zaXRpb247XHJcbiAgICAgIGxldCB0biA9IGNhbWVyYS50YXJnZXQ7XHJcbiAgICAgIGxldCB1biA9IGNhbWVyYS51cDtcclxuICAgICAgbGV0IHdpZHRobiA9IGNhbWVyYS53aWR0aDtcclxuICAgICAgbGV0IGhlaWdodG4gPSBjYW1lcmEuaGVpZ2h0O1xyXG5cclxuICAgICAgR3NXZWJHTFV0aWxpdHkuc21vb3RoVHJhbnNpdGlvbkQoXHJcbiAgICAgICAgY28sXHJcbiAgICAgICAgdG8sXHJcbiAgICAgICAgdW8sXHJcbiAgICAgICAgd2lkdGhvLFxyXG4gICAgICAgIGhlaWdodG8sXHJcbiAgICAgICAgY24sXHJcbiAgICAgICAgdG4sXHJcbiAgICAgICAgdW4sXHJcbiAgICAgICAgd2lkdGhuLFxyXG4gICAgICAgIGhlaWdodG4sXHJcbiAgICAgICAgdGhpc1xyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHZpZXdlciA9IHRoaXM7XHJcbiAgICAgIC8v5omn6KGMc2NlbmVDYW1lcmFDaGFuZ2Vk5omn6KGM5YWIU2V0Q2FtZXJhTmVhckZhci5cclxuICAgICAgdGhpcy5leGVTY2VuZUNhbWVyYUNoYW5naW5nKFxyXG4gICAgICAgIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlIHwgQ2FtZXJhQ2hhbmdlVHlwZS5TY2FsZVxyXG4gICAgICApO1xyXG4gICAgICB2aWV3ZXIudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICB0aGlzLmV4ZVNjZW5lQ2FtZXJhQ2hhbmdlZChcclxuICAgICAgICBDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSB8IENhbWVyYUNoYW5nZVR5cGUuU2NhbGVcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIGlmIChmaXRXb3JsZCkge1xyXG4gICAgICAvLyAgIGxldCB2aWV3ZXIgPSB0aGlzO1xyXG4gICAgICAvLyAgIC8v5omn6KGMc2NlbmVDYW1lcmFDaGFuZ2Vk5omn6KGM5YWIU2V0Q2FtZXJhTmVhckZhci5cclxuICAgICAgLy8gICB0aGlzLnVwZGF0ZUNhbWVyYU5lYXJGYXIoKTtcclxuXHJcbiAgICAgIC8vICAgdmlld2VyLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgLy8gICB0aGlzLnNjZW5lQ2FtZXJhQ2hhbmdlZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogRnVuY3Rpb24pIHtcclxuICAgICAgLy8gICAgIHZhbHVlKHZpZXdlciwgQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGUgfCBDYW1lcmFDaGFuZ2VUeXBlLlNjYWxlKTtcclxuICAgICAgLy8gICB9KTtcclxuICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgLy8gICBsZXQgdmlld2VyID0gdGhpcztcclxuICAgICAgLy8gICAvL+aJp+ihjHNjZW5lQ2FtZXJhQ2hhbmdlZOaJp+ihjOWFiFNldENhbWVyYU5lYXJGYXIuXHJcbiAgICAgIC8vICAgdGhpcy51cGRhdGVDYW1lcmFOZWFyRmFyKCk7XHJcbiAgICAgIC8vICAgdGhpcy5zY2VuZUNhbWVyYUNoYW5nZWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbiAgICAgIC8vICAgICB2YWx1ZSh2aWV3ZXIsIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlKTtcclxuICAgICAgLy8gICB9KTtcclxuXHJcbiAgICAgIC8vICAgdmlld2VyLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNjZW5lQ2FtZXJhKFxyXG4gICAgcG9zaXRpbjogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICB0YXJnZXQ6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgdXA6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgd2lkdGg/OiBudW1iZXIsXHJcbiAgICBoZWlnaHQ/OiBudW1iZXJcclxuICApIHtcclxuICAgIGxldCBjYW1lcmE6IGFueTtcclxuICAgIGxldCBjbztcclxuICAgIGxldCB0bztcclxuICAgIGxldCB1bztcclxuICAgIGxldCB3aWR0aG87XHJcbiAgICBsZXQgaGVpZ2h0bztcclxuICAgIGxldCBwcm9qO1xyXG5cclxuICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAge1xyXG4gICAgICBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG5cclxuICAgICAgY28gPSBjYW1lcmEucG9zaXRpb247XHJcbiAgICAgIHRvID0gY2FtZXJhLnRhcmdldDtcclxuICAgICAgdW8gPSBjYW1lcmEudXA7XHJcbiAgICAgIHdpZHRobyA9IGNhbWVyYS53aWR0aDtcclxuICAgICAgaGVpZ2h0byA9IGNhbWVyYS5oZWlnaHQ7XHJcbiAgICAgIHByb2ogPSBjYW1lcmEucHJvamVjdGlvbjtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fc21vb3RoVHJhbnNpdGlvbikge1xyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3NjZW5lS2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIGlmICh3aWR0aCAmJiBoZWlnaHQpIHtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmEocG9zaXRpbiwgdGFyZ2V0LCB1cCwgd2lkdGgsIGhlaWdodCwgcHJvaik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmEocG9zaXRpbiwgdGFyZ2V0LCB1cCwgd2lkdGhvLCBoZWlnaHRvLCBwcm9qKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAgIGxldCBjbiA9IGNhbWVyYS5wb3NpdGlvbjtcclxuICAgICAgbGV0IHRuID0gY2FtZXJhLnRhcmdldDtcclxuICAgICAgbGV0IHVuID0gY2FtZXJhLnVwO1xyXG4gICAgICBsZXQgd2lkdGhuID0gY2FtZXJhLndpZHRoO1xyXG4gICAgICBsZXQgaGVpZ2h0biA9IGNhbWVyYS5oZWlnaHQ7XHJcblxyXG4gICAgICBHc1dlYkdMVXRpbGl0eS5zbW9vdGhUcmFuc2l0aW9uRChcclxuICAgICAgICBjbyxcclxuICAgICAgICB0byxcclxuICAgICAgICB1byxcclxuICAgICAgICB3aWR0aG8sXHJcbiAgICAgICAgaGVpZ2h0byxcclxuICAgICAgICBjbixcclxuICAgICAgICB0bixcclxuICAgICAgICB1bixcclxuICAgICAgICB3aWR0aG4sXHJcbiAgICAgICAgaGVpZ2h0bixcclxuICAgICAgICB0aGlzXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3NjZW5lS2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIGlmICh3aWR0aCAmJiBoZWlnaHQpIHtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmEocG9zaXRpbiwgdGFyZ2V0LCB1cCwgd2lkdGgsIGhlaWdodCwgcHJvaik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmEocG9zaXRpbiwgdGFyZ2V0LCB1cCwgd2lkdGhvLCBoZWlnaHRvLCBwcm9qKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcm9qID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgbGV0IHZpZXdlciA9IHRoaXM7XHJcbiAgICAgIC8v5omn6KGMc2NlbmVDYW1lcmFDaGFuZ2Vk5omn6KGM5YWIU2V0Q2FtZXJhTmVhckZhci5cclxuICAgICAgdGhpcy5leGVTY2VuZUNhbWVyYUNoYW5naW5nKFxyXG4gICAgICAgIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlIHwgQ2FtZXJhQ2hhbmdlVHlwZS5TY2FsZVxyXG4gICAgICApO1xyXG4gICAgICB2aWV3ZXIudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAvLyB0aGlzLmV4ZVNjZW5lQ2FtZXJhQ2hhbmdlZChcclxuICAgICAgLy8gICBDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSB8IENhbWVyYUNoYW5nZVR5cGUuU2NhbGVcclxuICAgICAgLy8gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb252ZXJ0Q29vcmRpbmF0ZShcclxuICAgIGluX2Nvb3JkczogQ29vcmRpbmF0ZVN5c3RlbSxcclxuICAgIG91dF9jb29yZHM6IENvb3JkaW5hdGVTeXN0ZW0sXHJcbiAgICBpbl9wb3M6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgKTogRmxvYXQzMkFycmF5IHtcclxuICAgIC8vaWYgKGluX2Nvb3JkcyA9PSBDb29yZGluYXRlU3lzdGVtLnBpeGVscyAmJiBvdXRfY29vcmRzID09IENvb3JkaW5hdGVTeXN0ZW0ud29ybGQpIHtcclxuICAgIC8vICAgIHJldHVybiBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleSh0aGlzLl9zY2VuZUtleSwgXCJwaXhlbHNcIiwgaW5fcG9zLCBcIndvcmxkXCIpO1xyXG4gICAgLy99XHJcbiAgICAvL2Vsc2UgaWYgKGluX2Nvb3JkcyA9PSBDb29yZGluYXRlU3lzdGVtLndvcmxkICYmIG91dF9jb29yZHMgPT0gQ29vcmRpbmF0ZVN5c3RlbS5waXhlbHMpIHtcclxuICAgIC8vICAgIHJldHVybiBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleSh0aGlzLl9zY2VuZUtleSwgXCJ3b3JsZFwiLCBpbl9wb3MsIFwicGl4ZWxzXCIpO1xyXG4gICAgLy99XHJcbiAgICAvL2Vsc2UgaWYgKGluX2Nvb3JkcyA9PSBDb29yZGluYXRlU3lzdGVtLnBpeGVscyAmJiBvdXRfY29vcmRzID09IENvb3JkaW5hdGVTeXN0ZW0ud2luZG93KSB7XHJcbiAgICAvLyAgICByZXR1cm4gSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkodGhpcy5fc2NlbmVLZXksIFwicGl4ZWxzXCIsIGluX3BvcywgXCJ3aW5kb3dcIik7XHJcbiAgICAvL31cclxuICAgIC8vZWxzZSBpZiAoaW5fY29vcmRzID09IENvb3JkaW5hdGVTeXN0ZW0ud2luZG93ICYmIG91dF9jb29yZHMgPT0gQ29vcmRpbmF0ZVN5c3RlbS53b3JsZCkge1xyXG4gICAgLy8gICAgcmV0dXJuIEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KHRoaXMuX3NjZW5lS2V5LCBcIndpbmRvd1wiLCBpbl9wb3MsIFwid29ybGRcIik7XHJcbiAgICAvL31cclxuXHJcbiAgICByZXR1cm4gSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkoXHJcbiAgICAgIHRoaXMuX3NjZW5lS2V5LFxyXG4gICAgICBDb29yZGluYXRlU3lzdGVtW2luX2Nvb3Jkc10udG9Mb3dlckNhc2UoKSxcclxuICAgICAgaW5fcG9zLFxyXG4gICAgICBDb29yZGluYXRlU3lzdGVtW291dF9jb29yZHNdLnRvTG93ZXJDYXNlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29udmVydERDb29yZGluYXRlKFxyXG4gICAgaW5fY29vcmRzOiBDb29yZGluYXRlU3lzdGVtLFxyXG4gICAgb3V0X2Nvb3JkczogQ29vcmRpbmF0ZVN5c3RlbSxcclxuICAgIGluX3BvczogQXJyYXlMaWtlPG51bWJlcj5cclxuICApOiBGbG9hdDY0QXJyYXkge1xyXG4gICAgcmV0dXJuIEpTX0RDb21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleShcclxuICAgICAgdGhpcy5fc2NlbmVLZXksXHJcbiAgICAgIENvb3JkaW5hdGVTeXN0ZW1baW5fY29vcmRzXS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICBpbl9wb3MsXHJcbiAgICAgIENvb3JkaW5hdGVTeXN0ZW1bb3V0X2Nvb3Jkc10udG9Mb3dlckNhc2UoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RQb3NpdGlvbkJ5UG9pbnQod2luUG9zOiBBcnJheUxpa2U8bnVtYmVyPik6IEZsb2F0MzJBcnJheSB7XHJcbiAgICBsZXQgY291bnQgPSBKU19Db21wdXRlX1NlbGVjdGlvbl9CeV9LZXkoXHJcbiAgICAgIHRoaXMuX3ZpZXdLZXksXHJcbiAgICAgIHRoaXMuX3NjZW5lS2V5LFxyXG4gICAgICB3aW5Qb3NbMF0sXHJcbiAgICAgIHdpblBvc1sxXVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgIGxldCBzZWxlY3RlZFBvcyA9IG51bGw7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgIGlmIChzZWxlY3RlZFBvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICBzZWxlY3RlZFBvcyA9IEpTX1Nob3dfU2VsZWN0aW9uX1Bvc2l0aW9uKGkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgbmV3UG9zID0gSlNfU2hvd19TZWxlY3Rpb25fUG9zaXRpb24oaSk7XHJcbiAgICAgICAgICBpZiAobmV3UG9zWzJdIDwgc2VsZWN0ZWRQb3NbMl0pIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRQb3MgPSBuZXdQb3M7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gc2VsZWN0ZWRQb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29tcHV0ZVBlcnNwZWN0aXZlTmVhcldvcmxkUG9zKHBpeGVsOiBGbG9hdDMyQXJyYXkpOiBGbG9hdDY0QXJyYXkge1xyXG4gICAgbGV0IGNhbWVyYSA9IG51bGw7XHJcbiAgICBsZXQgZXh0ZW50ID0gbnVsbDtcclxuICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAge1xyXG4gICAgICBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG4gICAgICBleHRlbnQgPSBKU19TaG93X0NhbWVyYV9FeHRlbnQoKTtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgIGxldCBjYW1lcmFQb3NpdGlvbiA9IGNhbWVyYS5wb3NpdGlvbiBhcyBGbG9hdDY0QXJyYXk7XHJcbiAgICAgIGxldCBjYW1lcmFUYXJnZXQgPSBjYW1lcmEudGFyZ2V0IGFzIEZsb2F0NjRBcnJheTtcclxuICAgICAgbGV0IGNhbWVyYVVwID0gY2FtZXJhLnVwIGFzIEZsb2F0NjRBcnJheTtcclxuICAgICAgbGV0IGNhbWVyYVZpZXcgPSBEUG9pbnQuc3VidHJhY3QoY2FtZXJhUG9zaXRpb24sIGNhbWVyYVRhcmdldCk7XHJcbiAgICAgIERWZWN0b3Iubm9ybWFsaXplKGNhbWVyYVZpZXcpO1xyXG5cclxuICAgICAgbGV0IHhBeGlzID0gRFZlY3Rvci5jcm9zcyhjYW1lcmFVcCwgY2FtZXJhVmlldyk7XHJcblxyXG4gICAgICBEVmVjdG9yLnJldmVyc2UoY2FtZXJhVmlldyk7XHJcbiAgICAgIGxldCB3Y3MgPSBuZXcgRFdjcyhcclxuICAgICAgICBER2VvbWV0cnlPcGVyYXRvcnMuZGlzdGFuY2VQb2ludChjYW1lcmFQb3NpdGlvbiwgY2FtZXJhVmlldywgZXh0ZW50WzBdKSxcclxuICAgICAgICB4QXhpcyxcclxuICAgICAgICBjYW1lcmFVcFxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGV0IGxlblBlclBpeGVsID0gKDIgKiBNYXRoLnRhbihNYXRoLlBJIC8gMTIpICogZXh0ZW50WzBdKSAvIHRoaXMuaGVpZ2h0O1xyXG5cclxuICAgICAgbGV0IHBpeGVsUG9zID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuICAgICAgcGl4ZWxQb3NbMF0gPSBwaXhlbFswXSAtIHRoaXMud2lkdGggLyAyO1xyXG4gICAgICBwaXhlbFBvc1sxXSA9IHRoaXMuaGVpZ2h0IC8gMiAtIHBpeGVsWzFdO1xyXG4gICAgICBwaXhlbFBvc1syXSA9IDA7XHJcblxyXG4gICAgICBsZXQgbG9jYWxXb3JsZFBvcyA9IG5ldyBGbG9hdDY0QXJyYXkoW1xyXG4gICAgICAgIHBpeGVsUG9zWzBdICogbGVuUGVyUGl4ZWwsXHJcbiAgICAgICAgcGl4ZWxQb3NbMV0gKiBsZW5QZXJQaXhlbCxcclxuICAgICAgICBwaXhlbFBvc1syXSxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICBsZXQgd29ybGRQb3MgPSB3Y3MudG9Nb2RlbFBvaW50KGxvY2FsV29ybGRQb3MpO1xyXG5cclxuICAgICAgcmV0dXJuIHdvcmxkUG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbXB1dGVOZWFyUGxhbmVXb3JsZFBvcyhwaXhlbDogRmxvYXQzMkFycmF5KTogRmxvYXQ2NEFycmF5IHtcclxuICAgIGxldCBjYW1lcmEgPSBudWxsO1xyXG4gICAgbGV0IGV4dGVudCA9IG51bGw7XHJcbiAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3NjZW5lS2V5KTtcclxuICAgIHtcclxuICAgICAgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuICAgICAgZXh0ZW50ID0gSlNfU2hvd19DYW1lcmFfRXh0ZW50KCk7XHJcbiAgICB9XHJcbiAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgbGV0IG91dF9wb3MgPSBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleShcclxuICAgICAgICB0aGlzLl9zY2VuZUtleSxcclxuICAgICAgICBcInBpeGVsc1wiLFxyXG4gICAgICAgIHBpeGVsLFxyXG4gICAgICAgIFwid29ybGRcIlxyXG4gICAgICApO1xyXG4gICAgICBsZXQgcG9zID0gbmV3IEZsb2F0NjRBcnJheShvdXRfcG9zKTtcclxuXHJcbiAgICAgIGxldCBjYW1lcmFQb3NpdGlvbiA9IGNhbWVyYS5wb3NpdGlvbiBhcyBGbG9hdDY0QXJyYXk7XHJcbiAgICAgIGxldCBjYW1lcmFUYXJnZXQgPSBjYW1lcmEudGFyZ2V0IGFzIEZsb2F0NjRBcnJheTtcclxuICAgICAgbGV0IGRpcmVjdCA9IERQb2ludC5zdWJ0cmFjdChjYW1lcmFQb3NpdGlvbiwgY2FtZXJhVGFyZ2V0KTtcclxuICAgICAgRFZlY3Rvci5ub3JtYWxpemUoZGlyZWN0KTtcclxuXHJcbiAgICAgIHJldHVybiBER2VvbWV0cnlPcGVyYXRvcnMucHJvamVjdFBvaW50VG9QbGFuZShcclxuICAgICAgICBwb3MsXHJcbiAgICAgICAgY2FtZXJhUG9zaXRpb24sXHJcbiAgICAgICAgZGlyZWN0XHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICBsZXQgY2FtZXJhUG9zaXRpb24gPSBjYW1lcmEucG9zaXRpb24gYXMgRmxvYXQ2NEFycmF5O1xyXG4gICAgICBsZXQgY2FtZXJhVGFyZ2V0ID0gY2FtZXJhLnRhcmdldCBhcyBGbG9hdDY0QXJyYXk7XHJcbiAgICAgIGxldCBjYW1lcmFVcCA9IGNhbWVyYS51cCBhcyBGbG9hdDY0QXJyYXk7XHJcbiAgICAgIGxldCBjYW1lcmFWaWV3ID0gRFBvaW50LnN1YnRyYWN0KGNhbWVyYVBvc2l0aW9uLCBjYW1lcmFUYXJnZXQpO1xyXG4gICAgICBEVmVjdG9yLm5vcm1hbGl6ZShjYW1lcmFWaWV3KTtcclxuXHJcbiAgICAgIGxldCB4QXhpcyA9IERWZWN0b3IuY3Jvc3MoY2FtZXJhVXAsIGNhbWVyYVZpZXcpO1xyXG5cclxuICAgICAgRFZlY3Rvci5yZXZlcnNlKGNhbWVyYVZpZXcpO1xyXG4gICAgICBsZXQgd2NzID0gbmV3IERXY3MoXHJcbiAgICAgICAgREdlb21ldHJ5T3BlcmF0b3JzLmRpc3RhbmNlUG9pbnQoY2FtZXJhUG9zaXRpb24sIGNhbWVyYVZpZXcsIGV4dGVudFswXSksXHJcbiAgICAgICAgeEF4aXMsXHJcbiAgICAgICAgY2FtZXJhVXBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGxldCBsZW5QZXJQaXhlbCA9ICgyICogTWF0aC50YW4oTWF0aC5QSSAvIDEyKSAqIGV4dGVudFswXSkgLyB0aGlzLmhlaWdodDtcclxuXHJcbiAgICAgIGxldCBwaXhlbFBvcyA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICAgIHBpeGVsUG9zWzBdID0gcGl4ZWxbMF0gLSB0aGlzLndpZHRoIC8gMjtcclxuICAgICAgcGl4ZWxQb3NbMV0gPSB0aGlzLmhlaWdodCAvIDIgLSBwaXhlbFsxXTtcclxuICAgICAgcGl4ZWxQb3NbMl0gPSAwO1xyXG5cclxuICAgICAgbGV0IGxvY2FsV29ybGRQb3MgPSBuZXcgRmxvYXQ2NEFycmF5KFtcclxuICAgICAgICBwaXhlbFBvc1swXSAqIGxlblBlclBpeGVsLFxyXG4gICAgICAgIHBpeGVsUG9zWzFdICogbGVuUGVyUGl4ZWwsXHJcbiAgICAgICAgcGl4ZWxQb3NbMl0sXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgbGV0IHdvcmxkUG9zID0gd2NzLnRvTW9kZWxQb2ludChsb2NhbFdvcmxkUG9zKTtcclxuXHJcbiAgICAgIHJldHVybiB3b3JsZFBvcztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUaHJlYWRQcm9taXNlPFQ+IHtcclxuICBwcml2YXRlIF9yZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQgPSBudWxsO1xyXG4gIHByaXZhdGUgX3JlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXZlbnQ6IChcclxuICAgIHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCxcclxuICAgIHJlamVjdD86IChhbnkpID0+IHZvaWRcclxuICApID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGV2ZW50PzogKFxyXG4gICAgICByZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQsXHJcbiAgICAgIHJlamVjdD86IChyZWFzb24/OiBhbnkpID0+IHZvaWRcclxuICAgICkgPT4gdm9pZFxyXG4gICkge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIHRoaXMuX2V2ZW50ID0gZXZlbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdGhlbihyZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQsIHJlamVjdD86IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcclxuICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xyXG5cclxuICAgIGlmICh0aGlzLl9ldmVudCkge1xyXG4gICAgICB0aGlzLl9ldmVudCh0aGlzLl9yZXNvbHZlLCB0aGlzLl9yZWplY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc29sdmUodmFsdWU6IFQpIHtcclxuICAgIGlmICh0aGlzLl9yZXNvbHZlKSB7XHJcbiAgICAgIHRoaXMuX3Jlc29sdmUodmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlamVjdChyZWFzb24/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLl9yZWplY3QpIHtcclxuICAgICAgdGhpcy5fcmVqZWN0KHJlYXNvbik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBVcGRhdGVEaXNwbGF5VHlwZSB7XHJcbiAgU3luY2hyb25pemF0aW9uLFxyXG4gIEJ1c3ksXHJcbiAgQXN5bkJ1ZmZlckdlb21ldHJ5LFxyXG4gIEFzeW5Ob25lQnVmZmVyR2VvbWV0cnksXHJcbiAgQXN5blRocmVhZEJ1ZmZlckdlb21ldHJ5LFxyXG4gIEFzeW5UaHJlYWROb25lQnVmZmVyR2VvbWV0cnksXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBVcGRhdGVJbmZvIHtcclxuICBwcml2YXRlIF92aWV3ZXI6IFZpZXdlcjtcclxuICBwcml2YXRlIF90eXBlOiBVcGRhdGVEaXNwbGF5VHlwZTtcclxuXHJcbiAgX2NvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICBwdWJsaWMgZ2V0IHZpZXdlcigpIHtcclxuICAgIHJldHVybiB0aGlzLl92aWV3ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHR5cGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY291bnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY291bnQ7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcih2aWV3ZXI6IFZpZXdlciwgdHlwZTogVXBkYXRlRGlzcGxheVR5cGUpIHtcclxuICAgIHRoaXMuX3ZpZXdlciA9IHZpZXdlcjtcclxuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFZpZXdlckV2ZW50IHtcclxuICB2aWV3ZXI6IFZpZXdlcjtcclxuICB1aUV2ZW50OiBVSUV2ZW50O1xyXG4gIGNvbnN0cnVjdG9yKHZpZXdlcjogYW55LCBlOiBVSUV2ZW50KSB7XHJcbiAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjtcclxuICAgIHRoaXMudWlFdmVudCA9IGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW91c2VFdmVudCgpOiBNb3VzZUV2ZW50IHtcclxuICAgIHJldHVybiB0aGlzLnVpRXZlbnQgYXMgTW91c2VFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB3aGVlbEV2ZW50KCk6IFdoZWVsRXZlbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudWlFdmVudCBhcyBXaGVlbEV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvdWNoRXZlbnQoKTogVG91Y2hFdmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy51aUV2ZW50IGFzIFRvdWNoRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW91c2VQaXhlbFBvcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IG1vdXNlRXZlbnQgPSB0aGlzLm1vdXNlRXZlbnQoKTtcclxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFttb3VzZUV2ZW50Lm9mZnNldFgsIG1vdXNlRXZlbnQub2Zmc2V0WSwgMF0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdXNlV29ybGRQb3MoKTogRmxvYXQzMkFycmF5IHtcclxuICAgIGxldCBtb3VzZUV2ZW50ID0gdGhpcy5tb3VzZUV2ZW50KCk7XHJcbiAgICBsZXQgcGl4ZWxQb3MgPSBbbW91c2VFdmVudC5vZmZzZXRYLCBtb3VzZUV2ZW50Lm9mZnNldFksIC0xXTtcclxuXHJcbiAgICBsZXQgd29ybGRQb3MgPSBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleShcclxuICAgICAgdGhpcy52aWV3ZXIuc2NlbmVLZXksXHJcbiAgICAgIFwicGl4ZWxzXCIsXHJcbiAgICAgIHBpeGVsUG9zLFxyXG4gICAgICBcIndvcmxkXCJcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHdvcmxkUG9zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdXNlRmFyV29ybGRQb3MoKTogRmxvYXQzMkFycmF5IHtcclxuICAgIGxldCBtb3VzZUV2ZW50ID0gdGhpcy5tb3VzZUV2ZW50KCk7XHJcbiAgICBsZXQgcGl4ZWxQb3MgPSBbbW91c2VFdmVudC5vZmZzZXRYLCBtb3VzZUV2ZW50Lm9mZnNldFksIDFdO1xyXG5cclxuICAgIGxldCB3b3JsZFBvcyA9IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICB0aGlzLnZpZXdlci5zY2VuZUtleSxcclxuICAgICAgXCJwaXhlbHNcIixcclxuICAgICAgcGl4ZWxQb3MsXHJcbiAgICAgIFwid29ybGRcIlxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gd29ybGRQb3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW91c2VaV29ybGRQb3MoejogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcclxuICAgIGxldCBtb3VzZUV2ZW50ID0gdGhpcy5tb3VzZUV2ZW50KCk7XHJcbiAgICBsZXQgcGl4ZWxQb3MgPSBbbW91c2VFdmVudC5vZmZzZXRYLCBtb3VzZUV2ZW50Lm9mZnNldFksIHpdO1xyXG5cclxuICAgIGxldCB3b3JsZFBvcyA9IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICB0aGlzLnZpZXdlci5zY2VuZUtleSxcclxuICAgICAgXCJwaXhlbHNcIixcclxuICAgICAgcGl4ZWxQb3MsXHJcbiAgICAgIFwid29ybGRcIlxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gd29ybGRQb3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW91c2VXb3JsZFJheSgpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IHJheSA9IG51bGw7XHJcbiAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMudmlld2VyLnNjZW5lS2V5KTtcclxuICAgIHtcclxuICAgICAgbGV0IGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcblxyXG4gICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgIHJheSA9IFBvaW50LnN1YnRyYWN0KFxyXG4gICAgICAgICAgY2FtZXJhLnRhcmdldCBhcyBGbG9hdDMyQXJyYXksXHJcbiAgICAgICAgICBjYW1lcmEucG9zaXRpb24gYXMgRmxvYXQzMkFycmF5XHJcbiAgICAgICAgKTtcclxuICAgICAgICBWZWN0b3Iubm9ybWFsaXplKHJheSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgbGV0IG1vdXNlRXZlbnQgPSB0aGlzLm1vdXNlRXZlbnQoKTtcclxuICAgICAgICBsZXQgcGl4ZWxQb3MgPSBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgICAgIG1vdXNlRXZlbnQub2Zmc2V0WCxcclxuICAgICAgICAgIG1vdXNlRXZlbnQub2Zmc2V0WSxcclxuICAgICAgICAgIC0xLFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBsZXQgbmVhclBvcyA9IHRoaXMudmlld2VyLmNvbXB1dGVQZXJzcGVjdGl2ZU5lYXJXb3JsZFBvcyhwaXhlbFBvcyk7XHJcbiAgICAgICAgcmF5ID0gRFBvaW50LnN1YnRyYWN0KG5lYXJQb3MsIGNhbWVyYS5wb3NpdGlvbik7XHJcbiAgICAgICAgRFZlY3Rvci5ub3JtYWxpemUocmF5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkocmF5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgcmV0dXJuIHJheTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZVZpZXdwb2ludFBvcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDBdKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZVdpbmRvd1BvcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IG1vdXNlRXZlbnQgPSB0aGlzLm1vdXNlRXZlbnQoKTtcclxuICAgIGxldCBwaXhlbFBvcyA9IFttb3VzZUV2ZW50Lm9mZnNldFgsIG1vdXNlRXZlbnQub2Zmc2V0WSwgLTFdO1xyXG5cclxuICAgIGxldCB3aW5kb3dQb3MgPSBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleShcclxuICAgICAgdGhpcy52aWV3ZXIuc2NlbmVLZXksXHJcbiAgICAgIFwicGl4ZWxzXCIsXHJcbiAgICAgIHBpeGVsUG9zLFxyXG4gICAgICBcIndpbmRvd1wiXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB3aW5kb3dQb3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW91c2VVbml0V2luZG93UG9zKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICBsZXQgdmlld2VyID0gdGhpcy52aWV3ZXI7XHJcbiAgICBsZXQgbW91c2VFdmVudCA9IHRoaXMubW91c2VFdmVudCgpO1xyXG5cclxuICAgIGxldCBwaXhlbFBvcyA9IFttb3VzZUV2ZW50Lm9mZnNldFgsIG1vdXNlRXZlbnQub2Zmc2V0WSwgLTFdO1xyXG4gICAgbGV0IHdpbmRvd1BvcyA9IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICB0aGlzLnZpZXdlci5zY2VuZUtleSxcclxuICAgICAgXCJwaXhlbHNcIixcclxuICAgICAgcGl4ZWxQb3MsXHJcbiAgICAgIFwid2luZG93XCJcclxuICAgICk7XHJcblxyXG4gICAgbGV0IHggPSB3aW5kb3dQb3NbMF07XHJcbiAgICBsZXQgeSA9IHdpbmRvd1Bvc1sxXTtcclxuICAgIGlmICh2aWV3ZXIuYXNwZWN0UmF0aW8gPiAxKSB7XHJcbiAgICAgIHggKj0gdmlld2VyLmFzcGVjdFJhdGlvO1xyXG4gICAgfSBlbHNlIGlmICh2aWV3ZXIuYXNwZWN0UmF0aW8gPCAxKSB7XHJcbiAgICAgIHkgLz0gdmlld2VyLmFzcGVjdFJhdGlvO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFt4LCB5LCAwXSk7XHJcbiAgfVxyXG5cclxuICBnZXRFbGVtZW50UG9zKGVsZW1lbnQpIHtcclxuICAgIGxldCBhY3R1YWxUb3AgPSBlbGVtZW50Lm9mZnNldFRvcDtcclxuICAgIGxldCBhY3R1YWxMZWZ0ID0gZWxlbWVudC5vZmZzZXRMZWZ0O1xyXG4gICAgbGV0IGN1cnJlbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDtcclxuICAgIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIGFjdHVhbFRvcCArPSBjdXJyZW50Lm9mZnNldFRvcDtcclxuICAgICAgYWN0dWFsTGVmdCArPSBjdXJyZW50Lm9mZnNldExlZnQ7XHJcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm9mZnNldFBhcmVudDtcclxuICAgIH1cclxuICAgIHJldHVybiB7IHRvcDogYWN0dWFsVG9wLCBsZWZ0OiBhY3R1YWxMZWZ0IH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG91Y2hXb3JsZFBvcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IHRvdWNoRXZlbnQgPSB0aGlzLnRvdWNoRXZlbnQoKTtcclxuICAgIGxldCB7IHRvcCwgbGVmdCB9ID0gdGhpcy5nZXRFbGVtZW50UG9zKHRvdWNoRXZlbnQudGFyZ2V0KTtcclxuICAgIGxldCBwaXhlbFBvcyA9IFtcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzBdLmNsaWVudFggLSBsZWZ0LFxyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSAtIHRvcCxcclxuICAgICAgLTEsXHJcbiAgICBdO1xyXG5cclxuICAgIGxldCB3b3JsZFBvcyA9IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICB0aGlzLnZpZXdlci5zY2VuZUtleSxcclxuICAgICAgXCJwaXhlbHNcIixcclxuICAgICAgcGl4ZWxQb3MsXHJcbiAgICAgIFwid29ybGRcIlxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gd29ybGRQb3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG91Y2hXb3JsZFBvczEoKTogRmxvYXQzMkFycmF5IHtcclxuICAgIGxldCB0b3VjaEV2ZW50ID0gdGhpcy50b3VjaEV2ZW50KCk7XHJcbiAgICBsZXQgeyB0b3AsIGxlZnQgfSA9IHRoaXMuZ2V0RWxlbWVudFBvcyh0b3VjaEV2ZW50LnRhcmdldCk7XHJcbiAgICBsZXQgcGl4ZWxQb3MgPSBbXHJcbiAgICAgIHRvdWNoRXZlbnQudG91Y2hlc1sxXS5jbGllbnRYIC0gbGVmdCxcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzFdLmNsaWVudFkgLSB0b3AsXHJcbiAgICAgIC0xLFxyXG4gICAgXTtcclxuXHJcbiAgICBsZXQgd29ybGRQb3MgPSBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleShcclxuICAgICAgdGhpcy52aWV3ZXIuc2NlbmVLZXksXHJcbiAgICAgIFwicGl4ZWxzXCIsXHJcbiAgICAgIHBpeGVsUG9zLFxyXG4gICAgICBcIndvcmxkXCJcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHdvcmxkUG9zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvdWNoV29ybGRQb3MyKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICBsZXQgdG91Y2hFdmVudCA9IHRoaXMudG91Y2hFdmVudCgpO1xyXG4gICAgbGV0IHsgdG9wLCBsZWZ0IH0gPSB0aGlzLmdldEVsZW1lbnRQb3ModG91Y2hFdmVudC50YXJnZXQpO1xyXG4gICAgbGV0IHBpeGVsUG9zID0gW1xyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMl0uY2xpZW50WCAtIGxlZnQsXHJcbiAgICAgIHRvdWNoRXZlbnQudG91Y2hlc1syXS5jbGllbnRZIC0gdG9wLFxyXG4gICAgICAtMSxcclxuICAgIF07XHJcblxyXG4gICAgbGV0IHdvcmxkUG9zID0gSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkoXHJcbiAgICAgIHRoaXMudmlld2VyLnNjZW5lS2V5LFxyXG4gICAgICBcInBpeGVsc1wiLFxyXG4gICAgICBwaXhlbFBvcyxcclxuICAgICAgXCJ3b3JsZFwiXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB3b3JsZFBvcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b3VjaFdpbmRvd1BvcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IHRvdWNoRXZlbnQgPSB0aGlzLnRvdWNoRXZlbnQoKTtcclxuICAgIGxldCB7IHRvcCwgbGVmdCB9ID0gdGhpcy5nZXRFbGVtZW50UG9zKHRvdWNoRXZlbnQudGFyZ2V0KTtcclxuICAgIGxldCBwaXhlbFBvcyA9IFtcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzBdLmNsaWVudFggLSBsZWZ0LFxyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSAtIHRvcCxcclxuICAgICAgLTEsXHJcbiAgICBdO1xyXG4gICAgbGV0IHdpbmRvd1BvcyA9IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICB0aGlzLnZpZXdlci5zY2VuZUtleSxcclxuICAgICAgXCJwaXhlbHNcIixcclxuICAgICAgcGl4ZWxQb3MsXHJcbiAgICAgIFwid2luZG93XCJcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHdpbmRvd1BvcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b3VjaFdpbmRvd1BvczEoKTogRmxvYXQzMkFycmF5IHtcclxuICAgIGxldCB0b3VjaEV2ZW50ID0gdGhpcy50b3VjaEV2ZW50KCk7XHJcbiAgICBsZXQgeyB0b3AsIGxlZnQgfSA9IHRoaXMuZ2V0RWxlbWVudFBvcyh0b3VjaEV2ZW50LnRhcmdldCk7XHJcbiAgICBsZXQgcGl4ZWxQb3MgPSBbXHJcbiAgICAgIHRvdWNoRXZlbnQudG91Y2hlc1sxXS5jbGllbnRYIC0gbGVmdCxcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzFdLmNsaWVudFkgLSB0b3AsXHJcbiAgICAgIC0xLFxyXG4gICAgXTtcclxuXHJcbiAgICBsZXQgd2luZG93UG9zID0gSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkoXHJcbiAgICAgIHRoaXMudmlld2VyLnNjZW5lS2V5LFxyXG4gICAgICBcInBpeGVsc1wiLFxyXG4gICAgICBwaXhlbFBvcyxcclxuICAgICAgXCJ3aW5kb3dcIlxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gd2luZG93UG9zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvdWNoVW5pdFdpbmRvd1BvcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IHZpZXdlciA9IHRoaXMudmlld2VyO1xyXG4gICAgbGV0IHRvdWNoRXZlbnQgPSB0aGlzLnRvdWNoRXZlbnQoKTtcclxuICAgIGxldCB7IHRvcCwgbGVmdCB9ID0gdGhpcy5nZXRFbGVtZW50UG9zKHRvdWNoRXZlbnQudGFyZ2V0KTtcclxuXHJcbiAgICBsZXQgcGl4ZWxQb3MgPSBbXHJcbiAgICAgIHRvdWNoRXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gbGVmdCxcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzBdLmNsaWVudFkgLSB0b3AsXHJcbiAgICAgIC0xLFxyXG4gICAgXTtcclxuICAgIGxldCB3aW5kb3dQb3MgPSBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleShcclxuICAgICAgdGhpcy52aWV3ZXIuc2NlbmVLZXksXHJcbiAgICAgIFwicGl4ZWxzXCIsXHJcbiAgICAgIHBpeGVsUG9zLFxyXG4gICAgICBcIndpbmRvd1wiXHJcbiAgICApO1xyXG5cclxuICAgIGxldCB4ID0gd2luZG93UG9zWzBdO1xyXG4gICAgbGV0IHkgPSB3aW5kb3dQb3NbMV07XHJcbiAgICBpZiAodmlld2VyLmFzcGVjdFJhdGlvID4gMSkge1xyXG4gICAgICB4ICo9IHZpZXdlci5hc3BlY3RSYXRpbztcclxuICAgIH0gZWxzZSBpZiAodmlld2VyLmFzcGVjdFJhdGlvIDwgMSkge1xyXG4gICAgICB5IC89IHZpZXdlci5hc3BlY3RSYXRpbztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbeCwgeSwgMF0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvdWNoUGl4ZWxQb3MoKTogRmxvYXQzMkFycmF5IHtcclxuICAgIGxldCB0b3VjaEV2ZW50ID0gdGhpcy50b3VjaEV2ZW50KCk7XHJcbiAgICBsZXQgeyB0b3AsIGxlZnQgfSA9IHRoaXMuZ2V0RWxlbWVudFBvcyh0b3VjaEV2ZW50LnRhcmdldCk7XHJcbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgIHRvdWNoRXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gbGVmdCxcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzBdLmNsaWVudFkgLSB0b3AsXHJcbiAgICAgIDAsXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b3VjaFBpeGVsUG9zMSgpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IHRvdWNoRXZlbnQgPSB0aGlzLnRvdWNoRXZlbnQoKTtcclxuICAgIGxldCB7IHRvcCwgbGVmdCB9ID0gdGhpcy5nZXRFbGVtZW50UG9zKHRvdWNoRXZlbnQudGFyZ2V0KTtcclxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzFdLmNsaWVudFggLSBsZWZ0LFxyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMV0uY2xpZW50WSAtIHRvcCxcclxuICAgICAgMCxcclxuICAgIF0pO1xyXG4gIH1cclxufVxyXG5cclxuLy9leHBvcnQgY2xhc3MgT3BlcmF0b3Ige1xyXG4vLyAgICB2aWV3ZXI6IFZpZXdlciA9IG51bGw7XHJcblxyXG4vLyAgICBMQnV0dG9uRG93bjogRnVuY3Rpb24gPSBudWxsO1xyXG4vLyAgICBMQnV0dG9uVXA6IEZ1bmN0aW9uID0gbnVsbDtcclxuLy8gICAgUkJ1dHRvbkRvd246IEZ1bmN0aW9uID0gbnVsbDtcclxuLy8gICAgUkJ1dHRvblVwOiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIE1CdXR0b25Eb3duOiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIE1CdXR0b25VcDogRnVuY3Rpb24gPSBudWxsO1xyXG4vLyAgICBNb3VzZVdoZWVsOiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIE1vdXNlTW92ZTogRnVuY3Rpb24gPSBudWxsO1xyXG4vLyAgICBMQnV0dG9uRG93bkFuZE1vdmU6IEZ1bmN0aW9uID0gbnVsbDtcclxuLy8gICAgTUJ1dHRvbkRvd25BbmRNb3ZlOiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIFJCdXR0b25Eb3duQW5kTW92ZTogRnVuY3Rpb24gPSBudWxsO1xyXG4vLyAgICBUb3VjaFN0YXJ0OiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIFRvdWNoTW92ZTogRnVuY3Rpb24gPSBudWxsO1xyXG4vLyAgICBUb3VjaEVuZDogRnVuY3Rpb24gPSBudWxsO1xyXG4vLyAgICBUb3VjaENhbmNlbDogRnVuY3Rpb24gPSBudWxsO1xyXG5cclxuLy8gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4vLyAgICB9XHJcblxyXG4vLyAgICB0eXBlTmFtZSgpOiBzdHJpbmcge1xyXG4vLyAgICAgICAgcmV0dXJuIFwiT3BlcmF0b3JcIjtcclxuLy8gICAgfVxyXG5cclxuLy8gICAgaW5pdCgpIHtcclxuXHJcbi8vICAgIH1cclxuXHJcbi8vICAgIGZpbmEoKSB7XHJcblxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvbkxCdXR0b25Eb3duKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBpZiAodGhpcy5MQnV0dG9uRG93biAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5MQnV0dG9uRG93bihlKTtcclxuLy8gICAgICAgIH1cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25MQnV0dG9uVXAoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGlmICh0aGlzLkxCdXR0b25VcCAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5MQnV0dG9uVXAoZSk7XHJcbi8vICAgICAgICB9XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uUkJ1dHRvbkRvd24oZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGlmICh0aGlzLlJCdXR0b25Eb3duICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLlJCdXR0b25Eb3duKGUpO1xyXG4vLyAgICAgICAgfVxyXG5cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25SQnV0dG9uVXAoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGlmICh0aGlzLlJCdXR0b25VcCAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5SQnV0dG9uVXAoZSk7XHJcbi8vICAgICAgICB9XHJcblxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvbk1CdXR0b25Eb3duKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBpZiAodGhpcy5NQnV0dG9uRG93biAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5NQnV0dG9uRG93bihlKTtcclxuLy8gICAgICAgIH1cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25NQnV0dG9uVXAoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGlmICh0aGlzLk1CdXR0b25VcCAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5NQnV0dG9uVXAoZSk7XHJcbi8vICAgICAgICB9XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uTW91c2VXaGVlbChlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuTW91c2VXaGVlbCAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5Nb3VzZVdoZWVsKGUpO1xyXG4vLyAgICAgICAgfVxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvbk1vdXNlTW92ZShlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuTW91c2VNb3ZlICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLk1vdXNlTW92ZShlKTtcclxuLy8gICAgICAgIH1cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25MQnV0dG9uRG93bkFuZE1vdmUoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGlmICh0aGlzLkxCdXR0b25Eb3duQW5kTW92ZSAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5MQnV0dG9uRG93bkFuZE1vdmUoZSk7XHJcbi8vICAgICAgICB9XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uTUJ1dHRvbkRvd25BbmRNb3ZlKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBpZiAodGhpcy5NQnV0dG9uRG93bkFuZE1vdmUgIT0gbnVsbCkge1xyXG4vLyAgICAgICAgICAgIHRoaXMuTUJ1dHRvbkRvd25BbmRNb3ZlKGUpO1xyXG4vLyAgICAgICAgfVxyXG5cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25SQnV0dG9uRG93bkFuZE1vdmUoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGlmICh0aGlzLlJCdXR0b25Eb3duQW5kTW92ZSAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5SQnV0dG9uRG93bkFuZE1vdmUoZSk7XHJcbi8vICAgICAgICB9XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uVG91Y2hTdGFydChlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuVG91Y2hTdGFydCAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5Ub3VjaFN0YXJ0KGUpO1xyXG4vLyAgICAgICAgfVxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvblRvdWNoTW92ZShlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuVG91Y2hNb3ZlICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLlRvdWNoTW92ZShlKTtcclxuLy8gICAgICAgIH1cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25Ub3VjaEVuZChlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuVG91Y2hFbmQgIT0gbnVsbCkge1xyXG4vLyAgICAgICAgICAgIHRoaXMuVG91Y2hFbmQoZSk7XHJcbi8vICAgICAgICB9XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uVG91Y2hDYW5jZWwoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGlmICh0aGlzLlRvdWNoQ2FuY2VsICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLlRvdWNoQ2FuY2VsKGUpO1xyXG4vLyAgICAgICAgfVxyXG4vLyAgICB9XHJcbi8vfVxyXG5cclxuLy9leHBvcnQgZW51bSBDYW1lcmFPcGVyYXRlU3RhdGUgeyBOb25lLCBQYW4sIFNjYWxlLCBSb3RhdGUgfTtcclxuLy9leHBvcnQgZW51bSBNb3ZlQnV0dG9uVHlwZSB7IExlZnQsIE1pZGRsZSwgUmlnaHQgfTtcclxuXHJcbi8vZXhwb3J0IGNsYXNzIENhbWVyYU1vdXNlIGV4dGVuZHMgT3BlcmF0b3Ige1xyXG4vLyAgICBwcm90ZWN0ZWQgc3RhdGUgPSBDYW1lcmFPcGVyYXRlU3RhdGUuTm9uZTtcclxuLy8gICAgcHJvdGVjdGVkIHJhZGl1cyA9IDAuOTtcclxuLy8gICAgcHJvdGVjdGVkIF9tb3ZlQnV0dG9uVHlwZSA9IE1vdmVCdXR0b25UeXBlLk1pZGRsZTtcclxuLy8gICAgcHJvdGVjdGVkIF9yb3RhdGlvbkRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4vLyAgICBwcm90ZWN0ZWQgcm90YXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuLy8gICAgcHJvdGVjdGVkIG1CdXR0b25Eb3duZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuLy8gICAgcHJvdGVjdGVkIGRvd25Xb3JsZFBvczogRmxvYXQzMkFycmF5ID0gbnVsbDtcclxuLy8gICAgcHJvdGVjdGVkIGRvd25TcGhlcmVQb3M6IEZsb2F0MzJBcnJheSA9IG51bGw7XHJcbi8vICAgIHByb3RlY3RlZCBtb3ZlU3BoZXJlUG9zOiBGbG9hdDMyQXJyYXkgPSBudWxsO1xyXG5cclxuLy8gICAgcHJvdGVjdGVkIGRvd25DYW1lcmFQb3M6IEZsb2F0MzJBcnJheSA9IG51bGw7XHJcbi8vICAgIHByb3RlY3RlZCBkb3duQ2FtZXJhVGFyOiBGbG9hdDMyQXJyYXkgPSBudWxsO1xyXG4vLyAgICBwcm90ZWN0ZWQgZG93bkNhbWVyYVVwOiBGbG9hdDMyQXJyYXkgPSBudWxsO1xyXG5cclxuLy8gICAgcHJpdmF0ZSByYWRpdXNEaXN0OiBudW1iZXIgPSAwLjA7XHJcbi8vICAgIHByaXZhdGUgc2NhbGVFbmQ6IG51bWJlcjtcclxuXHJcbi8vICAgIGNvbnN0cnVjdG9yKCkge1xyXG4vLyAgICAgICAgc3VwZXIoKTtcclxuLy8gICAgfVxyXG5cclxuLy8gICAgdHlwZU5hbWUoKTogc3RyaW5nIHtcclxuLy8gICAgICAgIHJldHVybiBcIkNhbWVyYU1vdXNlXCI7XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIHB1YmxpYyBtb3ZlQnV0dG9uVHlwZSh0eXBlPzogTW92ZUJ1dHRvblR5cGUpOiBNb3ZlQnV0dG9uVHlwZSB7XHJcbi8vICAgICAgICBpZiAodHlwZSAhPSB1bmRlZmluZWQpIHtcclxuLy8gICAgICAgICAgICB0aGlzLl9tb3ZlQnV0dG9uVHlwZSA9IHR5cGU7XHJcbi8vICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgcmV0dXJuIHRoaXMuX21vdmVCdXR0b25UeXBlO1xyXG4vLyAgICB9XHJcblxyXG4vLyAgICBwdWJsaWMgcm90YXRpb25EaXNhYmxlZChkaXNhYmxlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4vLyAgICAgICAgaWYgKGRpc2FibGUgIT0gdW5kZWZpbmVkKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9IGRpc2FibGU7XHJcbi8vICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQ7XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uTEJ1dHRvbkRvd24oZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIHRoaXMuZG93bldvcmxkUG9zID0gZS5tb3VzZVdvcmxkUG9zKCk7XHJcblxyXG4vLyAgICAgICAgdGhpcy5zdGF0ZSA9IENhbWVyYU9wZXJhdGVTdGF0ZS5Ob25lO1xyXG4vLyAgICAgICAgdGhpcy5yb3RhdGluZyA9IGZhbHNlO1xyXG5cclxuLy8gICAgICAgIHN1cGVyLm9uTEJ1dHRvbkRvd24oZSk7XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uTEJ1dHRvblVwKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICB0aGlzLnZpZXdlci51cGRhdGVEaXNwbGF5KCk7XHJcblxyXG4vLyAgICAgICAgc3VwZXIub25MQnV0dG9uVXAoZSlcclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25SQnV0dG9uRG93bihlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgdGhpcy5zdGF0ZSA9IENhbWVyYU9wZXJhdGVTdGF0ZS5Sb3RhdGU7XHJcblxyXG4vLyAgICAgICAgLy9TaG93Q2FtZXJhQ2lyY2xlKGZhbHNlKTtcclxuXHJcbi8vICAgICAgICBsZXQgcG9zID0gZS5tb3VzZVZpZXdwb2ludFBvcygpO1xyXG4vLyAgICAgICAgdGhpcy5yYWRpdXNEaXN0ID0gcG9zWzFdO1xyXG5cclxuLy8gICAgICAgIHRoaXMuZG93blNwaGVyZVBvcyA9IHRoaXMuZ2V0U3BoZXJlUG9pbnQoZSk7XHJcbi8vICAgICAgICB0aGlzLm1vdmVTcGhlcmVQb3MgPSB0aGlzLmRvd25TcGhlcmVQb3M7XHJcblxyXG4vLyAgICAgICAgLy9TaG93Q2lyY2xlQXJyb3coZSk7XHJcblxyXG4vLyAgICAgICAgc3VwZXIub25SQnV0dG9uRG93bihlKTtcclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25SQnV0dG9uVXAoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIHRoaXMudmlld2VyLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbi8vICAgICAgICBzdXBlci5vblJCdXR0b25VcChlKTtcclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25NQnV0dG9uRG93bihlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgdGhpcy5tQnV0dG9uRG93bmVkID0gdHJ1ZTtcclxuXHJcbi8vICAgICAgICB0aGlzLmRvd25Xb3JsZFBvcyA9IGUubW91c2VXb3JsZFBvcygpO1xyXG5cclxuLy8gICAgICAgIHRoaXMuc3RhdGUgPSBDYW1lcmFPcGVyYXRlU3RhdGUuTm9uZTtcclxuLy8gICAgICAgIHRoaXMucm90YXRpbmcgPSBmYWxzZTtcclxuXHJcbi8vICAgICAgICAvL1Nob3dDYW1lcmFDZW50ZXIoKTtcclxuXHJcbi8vICAgICAgICBzdXBlci5vbk1CdXR0b25Eb3duKGUpO1xyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvbk1CdXR0b25VcChlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgLy90aGlzLnZpZXdlci5jYW1lcmEoKTtcclxuXHJcbi8vICAgICAgICAvL2lmICh0aGlzLnN0YXRlID09IENhbWVyYU9wZXJhdGVTdGF0ZS5Ob25lICYmIHRoaXMubUJ1dHRvbkRvd25lZCkge1xyXG4vLyAgICAgICAgLy8gICAgdGhpcy5zZXRDYW1lcmFDZW50ZXIoZSk7XHJcbi8vICAgICAgICAvL31cclxuXHJcbi8vICAgICAgICAvLy8vRmx1c2hDYW1lcmFDZW50ZXIoZmFsc2UpO1xyXG4vLyAgICAgICAgLy8vL0ZsdXNoQ2FtZXJhQ2lyY2xlKCk7XHJcblxyXG4vLyAgICAgICAgLy90aGlzLnN0YXRlID0gQ2FtZXJhT3BlcmF0ZVN0YXRlLk5vbmU7XHJcblxyXG4vLyAgICAgICAgLy8vL2lmICh0aGlzLnZpZXdlci5vcGVyYXRvck1hbmFnZXIuQ29udGFpbnMoXCJwcmUgc2VsZWN0ZXJcIikpIHtcclxuLy8gICAgICAgIC8vLy8gICAgdmlld2VyLm9wZXJhdG9yTWFuYWdlcltcInByZSBzZWxlY3RlclwiXS5lbmFibGUgPSB0cnVlO1xyXG4vLyAgICAgICAgLy8vL31cclxuXHJcbi8vICAgICAgICAvLy8vaWYgKHRoaXMuTUJ1dHRvblVwICE9IG51bGwpIHtcclxuLy8gICAgICAgIC8vLy8gICAgdGhpcy5NQnV0dG9uVXAodmlld2VyLCBuZXcgVmlld2VyRXZlbnRBcmdzKGUpKTtcclxuLy8gICAgICAgIC8vLy99XHJcblxyXG4vLyAgICAgICAgLy90aGlzLm1CdXR0b25Eb3duZWQgPSBmYWxzZTtcclxuXHJcbi8vICAgICAgICAvL3RoaXMudmlld2VyLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbi8vICAgICAgICBzdXBlci5vbk1CdXR0b25VcChlKTtcclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25Nb3VzZVdoZWVsKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBsZXQgdmlld2VyID0gdGhpcy52aWV3ZXI7XHJcblxyXG4vLyAgICAgICAgbGV0IHdldmVudDogV2hlZWxFdmVudCA9IGUud2hlZWxFdmVudCgpO1xyXG4vLyAgICAgICAgbGV0IGRlbHRhID0gTWF0aC5hYnMod2V2ZW50LndoZWVsRGVsdGEpO1xyXG5cclxuLy8gICAgICAgIGxldCBmYWN0b3I6IG51bWJlciA9IHdldmVudC53aGVlbERlbHRhIC8gNjAwLjA7XHJcbi8vICAgICAgICBpZiAoZGVsdGEgPT0gMTIwKSB7XHJcbi8vICAgICAgICAgICAgZmFjdG9yID0gd2V2ZW50LndoZWVsRGVsdGEgLyA2MDAuMDtcclxuLy8gICAgICAgIH1cclxuLy8gICAgICAgIGVsc2UgaWYgKGRlbHRhID09IDM2MCkge1xyXG4vLyAgICAgICAgICAgIGZhY3RvciA9IHdldmVudC53aGVlbERlbHRhIC8gMTgwMC4wO1xyXG4vLyAgICAgICAgfVxyXG4vLyAgICAgICAgZWxzZSBpZiAoZGVsdGEgPT0gMykge1xyXG4vLyAgICAgICAgICAgIGZhY3RvciA9IHdldmVudC53aGVlbERlbHRhIC8gMTUuMDtcclxuLy8gICAgICAgIH1cclxuXHJcbi8vICAgICAgICBmYWN0b3IgPSAxLjAgLSBmYWN0b3I7XHJcblxyXG4vLyAgICAgICAgaWYgKGZhY3RvciA+IDApIHtcclxuXHJcbi8vICAgICAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aWV3ZXIuc2NlbmVLZXkoKSk7XHJcbi8vICAgICAgICAgICAge1xyXG4vLyAgICAgICAgICAgICAgICBKU19ab29tX0NhbWVyYShmYWN0b3IpO1xyXG4vLyAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4vLyAgICAgICAgICAgIHZpZXdlci5zY2VuZUNhbWVyYUNoYW5nZWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbi8vICAgICAgICAgICAgICAgIHZhbHVlKHZpZXdlciwgQ2FtZXJhQ2hhbmdlVHlwZS5TY2FsZSk7XHJcbi8vICAgICAgICAgICAgfSk7XHJcblxyXG4vLyAgICAgICAgICAgIHZpZXdlci51cGRhdGVEaXNwbGF5KCk7XHJcbi8vICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgc3VwZXIub25Nb3VzZVdoZWVsKGUpO1xyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvbkxCdXR0b25Eb3duQW5kTW92ZShlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgbGV0IHZpZXdlciA9IHRoaXMudmlld2VyO1xyXG5cclxuLy8gICAgICAgIGlmICghdmlld2VyLnJCdXR0b25Eb3duICYmICF0aGlzLnJvdGF0aW5nICYmIHRoaXMuX21vdmVCdXR0b25UeXBlID09IE1vdmVCdXR0b25UeXBlLkxlZnQpIHtcclxuLy8gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ2FtZXJhT3BlcmF0ZVN0YXRlLlBhbjtcclxuXHJcbi8vICAgICAgICAgICAgbGV0IGRlbHRhID0gUG9pbnQuc3VidHJhY3QoZS5tb3VzZVdvcmxkUG9zKCksIHRoaXMuZG93bldvcmxkUG9zKTtcclxuXHJcbi8vICAgICAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aWV3ZXIuc2NlbmVLZXkoKSk7XHJcbi8vICAgICAgICAgICAge1xyXG4vLyAgICAgICAgICAgICAgICBKU19Eb2xseV9DYW1lcmEoZGVsdGFbMF0sIGRlbHRhWzFdLCBkZWx0YVsyXSk7XHJcbi8vICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbi8vICAgICAgICAgICAgdmlld2VyLnNjZW5lQ2FtZXJhQ2hhbmdlZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogRnVuY3Rpb24pIHtcclxuLy8gICAgICAgICAgICAgICAgdmFsdWUodmlld2VyLCBDYW1lcmFDaGFuZ2VUeXBlLlRyYW5zbGF0ZSk7XHJcbi8vICAgICAgICAgICAgfSk7XHJcblxyXG4vLyAgICAgICAgICAgIHZpZXdlci51cGRhdGVEaXNwbGF5KCk7XHJcbi8vICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgc3VwZXIub25MQnV0dG9uRG93bkFuZE1vdmUoZSk7XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uTUJ1dHRvbkRvd25BbmRNb3ZlKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBsZXQgdmlld2VyID0gdGhpcy52aWV3ZXI7XHJcblxyXG4vLyAgICAgICAgaWYgKCF2aWV3ZXIuckJ1dHRvbkRvd24gJiYgIXRoaXMucm90YXRpbmcgJiYgdGhpcy5fbW92ZUJ1dHRvblR5cGUgPT0gTW92ZUJ1dHRvblR5cGUuTWlkZGxlKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENhbWVyYU9wZXJhdGVTdGF0ZS5QYW47XHJcblxyXG4vLyAgICAgICAgICAgIGxldCBkZWx0YSA9IFBvaW50LnN1YnRyYWN0KGUubW91c2VXb3JsZFBvcygpLCB0aGlzLmRvd25Xb3JsZFBvcyk7XHJcblxyXG4vLyAgICAgICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmlld2VyLnNjZW5lS2V5KCkpO1xyXG4vLyAgICAgICAgICAgIHtcclxuLy8gICAgICAgICAgICAgICAgSlNfRG9sbHlfQ2FtZXJhKGRlbHRhWzBdLCBkZWx0YVsxXSwgZGVsdGFbMl0pO1xyXG4vLyAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4vLyAgICAgICAgICAgIHZpZXdlci5zY2VuZUNhbWVyYUNoYW5nZWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbi8vICAgICAgICAgICAgICAgIHZhbHVlKHZpZXdlciwgQ2FtZXJhQ2hhbmdlVHlwZS5UcmFuc2xhdGUpO1xyXG4vLyAgICAgICAgICAgIH0pO1xyXG5cclxuLy8gICAgICAgICAgICB0aGlzLnZpZXdlci51cGRhdGVEaXNwbGF5KCk7XHJcbi8vICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgc3VwZXIub25NQnV0dG9uRG93bkFuZE1vdmUoZSk7XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uUkJ1dHRvbkRvd25BbmRNb3ZlKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBsZXQgdmlld2VyID0gdGhpcy52aWV3ZXI7XHJcblxyXG4vLyAgICAgICAgaWYgKCF0aGlzLl9yb3RhdGlvbkRpc2FibGVkICYmICF2aWV3ZXIuX2NhbWVyYU9yaWVudGF0aW9uRml4ZWQpIHtcclxuLy8gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ2FtZXJhT3BlcmF0ZVN0YXRlLlJvdGF0ZTtcclxuXHJcbi8vICAgICAgICAgICAgbGV0IG5ld19zcGhlcmVfcG9pbnQgPSB0aGlzLmdldFNwaGVyZVBvaW50KGUpO1xyXG5cclxuLy8gICAgICAgICAgICBsZXQgc3RhcnQgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubW92ZVNwaGVyZVBvcyk7XHJcbi8vICAgICAgICAgICAgVmVjdG9yLm5vcm1hbGl6ZShzdGFydCk7XHJcbi8vICAgICAgICAgICAgbGV0IGVuZCA9IG5ldyBGbG9hdDMyQXJyYXkobmV3X3NwaGVyZV9wb2ludCk7XHJcbi8vICAgICAgICAgICAgVmVjdG9yLm5vcm1hbGl6ZShlbmQpO1xyXG5cclxuLy8gICAgICAgICAgICBpZiAoVmVjdG9yLm1vZHVsZShWZWN0b3IuY3Jvc3Moc3RhcnQsIGVuZCkpID4gVG9sZXJhbmNlLnJlc2Ficykge1xyXG5cclxuLy8gICAgICAgICAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aWV3ZXIuc2NlbmVLZXkoKSk7XHJcbi8vICAgICAgICAgICAgICAgIHtcclxuLy8gICAgICAgICAgICAgICAgICAgIEpTX1JvbGxfQ2FtZXJhKHN0YXJ0LCBlbmQpO1xyXG4vLyAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbi8vICAgICAgICAgICAgICAgIHRoaXMubW92ZVNwaGVyZVBvcyA9IG5ld19zcGhlcmVfcG9pbnQ7XHJcblxyXG4vLyAgICAgICAgICAgICAgICB2aWV3ZXIuc2NlbmVDYW1lcmFDaGFuZ2VkLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBGdW5jdGlvbikge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgdmFsdWUodmlld2VyLCBDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSk7XHJcbi8vICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuLy8gICAgICAgICAgICAgICAgdmlld2VyLnVwZGF0ZURpc3BsYXkoKTtcclxuLy8gICAgICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgICAgIHRoaXMucm90YXRpbmcgPSB0cnVlO1xyXG4vLyAgICAgICAgfVxyXG5cclxuLy8gICAgICAgIHN1cGVyLm9uUkJ1dHRvbkRvd25BbmRNb3ZlKGUpO1xyXG4vLyAgICB9XHJcblxyXG4vLyAgICBwcml2YXRlIGdldFNwaGVyZVBvaW50KGU6IFZpZXdlckV2ZW50KTogRmxvYXQzMkFycmF5IHtcclxuLy8gICAgICAgIGxldCBzcGhlcmVfcG9zID0gZS5tb3VzZVVuaXRXaW5kb3dQb3MoKTtcclxuLy8gICAgICAgIHNwaGVyZV9wb3NbMl0gPSAwLjA7XHJcbi8vICAgICAgICBsZXQgYSA9IHNwaGVyZV9wb3NbMF0gKiBzcGhlcmVfcG9zWzBdICsgc3BoZXJlX3Bvc1sxXSAqIHNwaGVyZV9wb3NbMV07XHJcbi8vICAgICAgICBsZXQgYiA9IE1hdGguc3FydChhKTtcclxuXHJcbi8vICAgICAgICBpZiAoYiA+IHRoaXMucmFkaXVzKSB7XHJcbi8vICAgICAgICAgICAgbGV0IHhfZGlyID0gbmV3IEZsb2F0MzJBcnJheShzcGhlcmVfcG9zKTtcclxuLy8gICAgICAgICAgICBWZWN0b3Iubm9ybWFsaXplKHhfZGlyKTtcclxuLy8gICAgICAgICAgICBsZXQgdl91cCA9IG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMC4wLCAxLjBdKTtcclxuLy8gICAgICAgICAgICBsZXQgeV9kaXIgPSBWZWN0b3IuY3Jvc3Modl91cCwgeF9kaXIpO1xyXG4vLyAgICAgICAgICAgIFZlY3Rvci5ub3JtYWxpemUoeV9kaXIpO1xyXG5cclxuLy8gICAgICAgICAgICBsZXQgb3JpZ2luID0gbmV3IEZsb2F0MzJBcnJheShbMC4wLCAwLjAsIDAuMF0pO1xyXG5cclxuLy8gICAgICAgICAgICBsZXQgd2NzID0gbmV3IFdjcyhvcmlnaW4sIHhfZGlyLCB5X2Rpcik7XHJcblxyXG4vLyAgICAgICAgICAgIGxldCBsb2NhbF9zcGhlcmVfcG9zID0gd2NzLnRvTG9jYWxQb2ludChzcGhlcmVfcG9zKTtcclxuXHJcbi8vICAgICAgICAgICAgbGV0IHJlbWFpbiA9IGxvY2FsX3NwaGVyZV9wb3NbMF0gJSAoNCAqIHRoaXMucmFkaXVzKTtcclxuLy8gICAgICAgICAgICAvL2RvdWJsZSB0ZW1wID0gbG9jYWxfc3BoZXJlX3Bvcy54O1xyXG5cclxuLy8gICAgICAgICAgICBsZXQgbmV3X3ggPSAodGhpcy5yYWRpdXMgKiAoMiAvIE1hdGguUEkpKSAqIE1hdGguYXNpbihNYXRoLnNpbihNYXRoLlBJICogKGxvY2FsX3NwaGVyZV9wb3NbMF0gLyAoMiAqIHRoaXMucmFkaXVzKSkpKTtcclxuLy8gICAgICAgICAgICBsb2NhbF9zcGhlcmVfcG9zWzBdID0gbmV3X3g7XHJcblxyXG4vLyAgICAgICAgICAgIHNwaGVyZV9wb3MgPSB3Y3MudG9Nb2RlbFBvaW50KGxvY2FsX3NwaGVyZV9wb3MpO1xyXG5cclxuLy8gICAgICAgICAgICBhID0gc3BoZXJlX3Bvc1swXSAqIHNwaGVyZV9wb3NbMF0gKyBzcGhlcmVfcG9zWzFdICogc3BoZXJlX3Bvc1sxXTtcclxuXHJcbi8vICAgICAgICAgICAgaWYgKHJlbWFpbiA+IHRoaXMucmFkaXVzICYmIHJlbWFpbiA8IDMgKiB0aGlzLnJhZGl1cykge1xyXG4vLyAgICAgICAgICAgICAgICBzcGhlcmVfcG9zWzJdID0gLU1hdGguc3FydCh0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzIC0gYSk7XHJcbi8vICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgIGVsc2Uge1xyXG4vLyAgICAgICAgICAgICAgICBzcGhlcmVfcG9zWzJdID0gTWF0aC5zcXJ0KHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgLSBhKTtcclxuLy8gICAgICAgICAgICB9XHJcbi8vICAgICAgICB9XHJcbi8vICAgICAgICBlbHNlIHtcclxuLy8gICAgICAgICAgICBzcGhlcmVfcG9zWzJdID0gTWF0aC5zcXJ0KHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgLSBhKTtcclxuLy8gICAgICAgIH1cclxuXHJcbi8vICAgICAgICByZXR1cm4gc3BoZXJlX3BvcztcclxuLy8gICAgfVxyXG5cclxuLy8gICAgcHJpdmF0ZSBzZXRDYW1lcmFDZW50ZXIoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIC8vbGV0IHdpbl9wb3MgPSBlLm1vdXNlVW5pdFdpbmRvd1BvcygpO1xyXG5cclxuLy8gICAgICAgIC8vbGV0IGNhbWVyYV90YXJnZXQgPSB0aGlzLnZpZXdlci5zY2VuZVNlZ21lbnQuY2FtZXJhKCkudGFyZ2V0KCk7XHJcbi8vICAgICAgICAvL2xldCBzZWxfcG9zID0gbmV3IEZsb2F0MzJBcnJheShbMCwgMCwgMF0pO1xyXG5cclxuLy8gICAgICAgIC8vTGlzdCA8IFNlbGVjdGlvbktleSA+IHNlbGVjdGlvbl9pdGVtcyA9IHRoaXMudmlld2VyLlNlbGVjdEJ5UG9pbnQod2luX3Bvcyk7XHJcbi8vICAgICAgICAvL2lmIChzZWxlY3Rpb25faXRlbXMuQ291bnQgPiAwKSB7XHJcbi8vICAgICAgICAvLyAgICBzZWxfcG9zID0gc2VsZWN0aW9uX2l0ZW1zWzBdLlNlbGVjdGVkUG9zaXRpb247XHJcbi8vICAgICAgICAvL31cclxuLy8gICAgICAgIC8vZWxzZSB7XHJcbi8vICAgICAgICAvLyAgICBzZWxfcG9zID0gZS5Nb3VzZVdvcmxkUG9zO1xyXG5cclxuLy8gICAgICAgIC8vICAgIGNhbWVyYV90YXJnZXQgPSB2aWV3ZXIuU2NlbmVTZWdtZW50LkNvbnZlcnRDb29yZGluYXRlKEhvb3BzLkNvb3JkaW5hdGVTcGFjZS5Jbm5lcldpbmRvdywgSG9vcHMuQ29vcmRpbmF0ZVNwYWNlLldvcmxkLCBuZXcgUG9pbnQoMCwgMCwgMCkpO1xyXG4vLyAgICAgICAgLy99XHJcblxyXG4vLyAgICAgICAgLy9Qb2ludCBvZmZzZXRfcG9zID0gKFBvaW50KShzZWxfcG9zIC0gY2FtZXJhX3RhcmdldCk7XHJcbi8vICAgICAgICAvL3RoaXMudmlld2VyLlNjZW5lU2VnbWVudC5DYW1lcmEuUG9zaXRpb24gPSB0aGlzLnZpZXdlci5TY2VuZVNlZ21lbnQuQ2FtZXJhLlBvc2l0aW9uICsgb2Zmc2V0X3BvcztcclxuLy8gICAgICAgIC8vdGhpcy52aWV3ZXIuU2NlbmVTZWdtZW50LkNhbWVyYS5UYXJnZXQgPSB0aGlzLnZpZXdlci5TY2VuZVNlZ21lbnQuQ2FtZXJhLlRhcmdldCArIG9mZnNldF9wb3M7XHJcblxyXG4vLyAgICAgICAgLy92aWV3ZXIuRXhlU2NlbmVDYW1lcmFDaGFuZ2VkKG5ldyBDYW1lcmFDaGFuZ2VkRXZlbnRBcmdzKENhbWVyYUNoYW5nZWRUeXBlLlRyYW5zbGF0ZSkpO1xyXG5cclxuLy8gICAgICAgIC8vSENTLlVwZGF0ZV9EaXNwbGF5KCk7XHJcbi8vICAgICAgICAvL3ZpZXdlci5VcGRhdGVEaXNwbGF5KCk7XHJcbi8vICAgIH1cclxuLy99XHJcblxyXG5leHBvcnQgY2xhc3MgR3NXZWJHTFV0aWxpdHkge1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEVQU0lMT04gPSAwLjAwMDAxO1xyXG5cclxuICBzdGF0aWMgc21vb3RoVHJhbnNpdGlvbihcclxuICAgIGNvOiBGbG9hdDMyQXJyYXksXHJcbiAgICB0bzogRmxvYXQzMkFycmF5LFxyXG4gICAgdW86IEZsb2F0MzJBcnJheSxcclxuICAgIHdpZHRobzogbnVtYmVyLFxyXG4gICAgaGVpZ2h0bzogbnVtYmVyLFxyXG4gICAgY246IEZsb2F0MzJBcnJheSxcclxuICAgIHRuOiBGbG9hdDMyQXJyYXksXHJcbiAgICB1bjogRmxvYXQzMkFycmF5LFxyXG4gICAgd2lkdGhuOiBudW1iZXIsXHJcbiAgICBoZWlnaHRuOiBudW1iZXIsXHJcbiAgICB2aTogYW55XHJcbiAgKSB7XHJcbiAgICAvL2xldCBjYW1lcmEgPSB2aS5jYW1lcmEoKTtcclxuICAgIGxldCBjYW1lcmE6IGFueSA9IHtcclxuICAgICAgcG9zaXRpb246IG5ldyBGbG9hdDMyQXJyYXkoMyksXHJcbiAgICAgIHRhcmdldDogbmV3IEZsb2F0MzJBcnJheSgzKSxcclxuICAgICAgdXA6IG5ldyBGbG9hdDMyQXJyYXkoMyksXHJcbiAgICAgIHdpZHRoOiAwLFxyXG4gICAgICBoZWlnaHQ6IDAsXHJcbiAgICAgIHByb2plY3Rpb246IFwiXCIsXHJcbiAgICB9O1xyXG5cclxuICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgIHtcclxuICAgICAgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICBsZXQgWCA9IDA7XHJcbiAgICBsZXQgWSA9IDE7XHJcbiAgICBsZXQgWiA9IDI7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBUb2xlcmFuY2Uuc2FtZVZhbHVlRmxvYXRBcnJheShjbywgY24pICYmXHJcbiAgICAgIFRvbGVyYW5jZS5zYW1lVmFsdWVGbG9hdEFycmF5KHRvLCB0bikgJiZcclxuICAgICAgVG9sZXJhbmNlLnNhbWVWYWx1ZUZsb2F0QXJyYXkodW8sIHVuKSAmJlxyXG4gICAgICBUb2xlcmFuY2Uuc2FtZVZhbHVlKHdpZHRobywgd2lkdGhuKSAmJlxyXG4gICAgICBUb2xlcmFuY2Uuc2FtZVZhbHVlKGhlaWdodG8sIGhlaWdodG4pXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXRyaXhfb2xkID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XHJcbiAgICBsZXQgbWF0cml4X25ldyA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xyXG4gICAgbGV0IHZpZXdfdmVjdG9yX29sZCA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICB0b1tYXSAtIGNvW1hdLFxyXG4gICAgICB0b1tZXSAtIGNvW1ldLFxyXG4gICAgICB0b1taXSAtIGNvW1pdLFxyXG4gICAgXSk7XHJcbiAgICBsZXQgdmlld192ZWN0b3JfbmV3ID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgIHRuW1hdIC0gY25bWF0sXHJcbiAgICAgIHRuW1ldIC0gY25bWV0sXHJcbiAgICAgIHRuW1pdIC0gY25bWl0sXHJcbiAgICBdKTtcclxuXHJcbiAgICBsZXQgbGVuZ3RoID0gVmVjdG9yLm1vZHVsZSh2aWV3X3ZlY3Rvcl9vbGQpO1xyXG5cclxuICAgIGxldCBsZW5ndGhfZGVsdGEgPSBWZWN0b3IubW9kdWxlKHZpZXdfdmVjdG9yX25ldykgLSBsZW5ndGg7XHJcblxyXG4gICAgVmVjdG9yLm5vcm1hbGl6ZSh2aWV3X3ZlY3Rvcl9vbGQpO1xyXG4gICAgVmVjdG9yLm5vcm1hbGl6ZSh2aWV3X3ZlY3Rvcl9uZXcpO1xyXG5cclxuICAgIGxldCBuZWVkX3JvdGF0aW9uID0gdHJ1ZTtcclxuICAgIGxldCByb3RhdGlvbl9kZWx0YSA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICB2aWV3X3ZlY3Rvcl9vbGRbMF0gLSB2aWV3X3ZlY3Rvcl9uZXdbMF0sXHJcbiAgICAgIHZpZXdfdmVjdG9yX29sZFsxXSAtIHZpZXdfdmVjdG9yX25ld1sxXSxcclxuICAgICAgdmlld192ZWN0b3Jfb2xkWzJdIC0gdmlld192ZWN0b3JfbmV3WzJdLFxyXG4gICAgXSk7XHJcblxyXG4gICAgbGV0IHVwX2RlbHRhID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgIHVuW1hdIC0gdW9bWF0sXHJcbiAgICAgIHVuW1ldIC0gdW9bWV0sXHJcbiAgICAgIHVuW1pdIC0gdW9bWl0sXHJcbiAgICBdKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIFZlY3Rvci5tb2R1bGUocm90YXRpb25fZGVsdGEpIDwgMC4wMDAxICYmXHJcbiAgICAgIFZlY3Rvci5tb2R1bGUodXBfZGVsdGEpIDwgMC4wMDAxXHJcbiAgICApIHtcclxuICAgICAgbmVlZF9yb3RhdGlvbiA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0cmFuc2xhdGlvbiA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICBsZXQgcG9zaXRpb25fbW92ZV9kZWx0YSA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcblxyXG4gICAgaWYgKG5lZWRfcm90YXRpb24pIHtcclxuICAgICAgR3NXZWJHTFV0aWxpdHkuR2V0TWF0cml4RnJvbUNhbWVyYSh0bywgY28sIHVvLCB0cmFuc2xhdGlvbiwgbWF0cml4X29sZCk7XHJcbiAgICAgIEdzV2ViR0xVdGlsaXR5LkdldE1hdHJpeEZyb21DYW1lcmEodG4sIGNuLCB1biwgdHJhbnNsYXRpb24sIG1hdHJpeF9uZXcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcG9zaXRpb25fbW92ZV9kZWx0YVtYXSA9IGNuW1hdIC0gY29bWF07XHJcbiAgICAgIHBvc2l0aW9uX21vdmVfZGVsdGFbWV0gPSBjbltZXSAtIGNvW1ldO1xyXG4gICAgICBwb3NpdGlvbl9tb3ZlX2RlbHRhW1pdID0gY25bWl0gLSBjb1taXTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWF0cml4X2ludGVyaW0gPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcclxuICAgIGxldCBxdWF0X29sZCA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XHJcbiAgICBsZXQgcXVhdF9uZXcgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xyXG4gICAgbGV0IHF1YXRfaW50ZXJpbSA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XHJcblxyXG4gICAgaWYgKG5lZWRfcm90YXRpb24pIHtcclxuICAgICAgR3NXZWJHTFV0aWxpdHkuTWF0cml4VG9RdWF0ZXJuaW9uKG1hdHJpeF9vbGQsIHF1YXRfb2xkKTtcclxuICAgICAgR3NXZWJHTFV0aWxpdHkuTWF0cml4VG9RdWF0ZXJuaW9uKG1hdHJpeF9uZXcsIHF1YXRfbmV3KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGFyZ2V0X21vdmVfZGVsdGEgPSBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgdG5bWF0gLSB0b1tYXSxcclxuICAgICAgdG5bWV0gLSB0b1tZXSxcclxuICAgICAgdG5bWl0gLSB0b1taXSxcclxuICAgIF0pO1xyXG5cclxuICAgIGxldCBmaWVsZF93aWR0aF9kZWx0YSA9IHdpZHRobiAtIHdpZHRobztcclxuICAgIGxldCBmaWVsZF9oZWlnaHRfZGVsdGEgPSBoZWlnaHRuIC0gaGVpZ2h0bztcclxuXHJcbiAgICBsZXQgZG90MSwgZG90MjtcclxuXHJcbiAgICBpZiAobmVlZF9yb3RhdGlvbikge1xyXG4gICAgICAvLyBTaW1wbGUgZG90IHByb2R1Y3QgdG8gZGV0ZXJtaW5lIHdoaWNoIGRpcmVjdGlvbiB0aGUgcXVhdGVybmlvbiBzaG91bGRcclxuICAgICAgLy8gZ28gaWYgd2Ugd2FudCB0byB0YWtlIHRoZSBzaG9ydGVzdCBwYXRoLlxyXG4gICAgICBkb3QxID1cclxuICAgICAgICAocXVhdF9vbGRbMF0gLSBxdWF0X25ld1swXSkgKiAocXVhdF9vbGRbMF0gLSBxdWF0X25ld1swXSkgK1xyXG4gICAgICAgIChxdWF0X29sZFsxXSAtIHF1YXRfbmV3WzFdKSAqIChxdWF0X29sZFsxXSAtIHF1YXRfbmV3WzFdKSArXHJcbiAgICAgICAgKHF1YXRfb2xkWzJdIC0gcXVhdF9uZXdbMl0pICogKHF1YXRfb2xkWzJdIC0gcXVhdF9uZXdbMl0pICtcclxuICAgICAgICAocXVhdF9vbGRbM10gLSBxdWF0X25ld1szXSkgKiAocXVhdF9vbGRbM10gLSBxdWF0X25ld1szXSk7XHJcblxyXG4gICAgICBkb3QyID1cclxuICAgICAgICAocXVhdF9vbGRbMF0gKyBxdWF0X25ld1swXSkgKiAocXVhdF9vbGRbMF0gKyBxdWF0X25ld1swXSkgK1xyXG4gICAgICAgIChxdWF0X29sZFsxXSArIHF1YXRfbmV3WzFdKSAqIChxdWF0X29sZFsxXSArIHF1YXRfbmV3WzFdKSArXHJcbiAgICAgICAgKHF1YXRfb2xkWzJdICsgcXVhdF9uZXdbMl0pICogKHF1YXRfb2xkWzJdICsgcXVhdF9uZXdbMl0pICtcclxuICAgICAgICAocXVhdF9vbGRbM10gKyBxdWF0X25ld1szXSkgKiAocXVhdF9vbGRbM10gKyBxdWF0X25ld1szXSk7XHJcblxyXG4gICAgICBpZiAoZG90MiA8IGRvdDEpIHtcclxuICAgICAgICBxdWF0X25ld1swXSA9IC1xdWF0X25ld1swXTtcclxuICAgICAgICBxdWF0X25ld1sxXSA9IC1xdWF0X25ld1sxXTtcclxuICAgICAgICBxdWF0X25ld1syXSA9IC1xdWF0X25ld1syXTtcclxuICAgICAgICBxdWF0X25ld1szXSA9IC1xdWF0X25ld1szXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBwb3NpdGlvbiA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICBsZXQgdXBfdmVjdG9yID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuXHJcbiAgICBsZXQgdG90YWxfZHVyYXRpb24gPSB2aS5fc21vb3RoVHJhbnNpdGlvbkR1cmF0aW9uO1xyXG4gICAgLy9sZXQgdG90YWxfZHVyYXRpb24gPSA1MDA7XHJcbiAgICAvL1x0ZmxvYXQgaW5pdGlhbF9kZWx0YSA9IChmbG9hdCkgMC4wNSAvIHRvdGFsX2R1cmF0aW9uO1x0XHRcdC8vMC4wNSA9IDIwZnBzXHQoZ3Vlc3NpbmcpXHJcbiAgICBsZXQgcSwgY3VycmVudF90aW1lOiBudW1iZXI7XHJcblxyXG4gICAgbGV0IHRvdGFsX3RpbWVfc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgdG90YWxfdGltZV9zdGFydCAtPSAxMDA7IC8vMC4xbXNcclxuXHJcbiAgICAvL2Z1bmN0aW9uIHVkX3RpY2soKSB7XHJcbiAgICAvLyAgICB2aS5zY2VuZUNhbWVyYUNoYW5nZWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgdmFsdWUodmksIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlQW5kU2NhbGUpO1xyXG4gICAgLy8gICAgfSk7XHJcbiAgICAvLyAgICB2aS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAvL31cclxuXHJcbiAgICBmdW5jdGlvbiB0aWNrKCkge1xyXG4gICAgICBjdXJyZW50X3RpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICBxID0gKGN1cnJlbnRfdGltZSAtIHRvdGFsX3RpbWVfc3RhcnQpIC8gdG90YWxfZHVyYXRpb247XHJcbiAgICAgIGlmIChxID49IDEuMCkge1xyXG4gICAgICAgIHEgPSAxLjA7XHJcbiAgICAgIH1cclxuICAgICAgcSA9IEdzV2ViR0xVdGlsaXR5LkVhc2VJbkVhc2VPdXQocSwgMC40OSwgMC4wMiwgMC40OSk7XHJcbiAgICAgIGlmIChxIDwgMCkge1xyXG4gICAgICAgIHEgPSAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobmVlZF9yb3RhdGlvbikge1xyXG4gICAgICAgIGxldCB0bzIgPSBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgICAgIHRvW1hdICsgcSAqIHRhcmdldF9tb3ZlX2RlbHRhW1hdLFxyXG4gICAgICAgICAgdG9bWV0gKyBxICogdGFyZ2V0X21vdmVfZGVsdGFbWV0sXHJcbiAgICAgICAgICB0b1taXSArIHEgKiB0YXJnZXRfbW92ZV9kZWx0YVtaXSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgLy8gZmlyc3QgbGV0IHVzZSBxdWF0ZXJuaW9ucyB0byB0YWtlIGNhcmUgb2YgdGhlIGludGVycG9sYXRpb25cclxuICAgICAgICAvLyBvZiB0aGUgcm90YXRpb24gZWxlbWVudCBvZiB0aGUgY2FtZXJhIG1vdmVtZW50XHJcbiAgICAgICAgR3NXZWJHTFV0aWxpdHkuVHJhbnNpdGlvblF1YXRlcm5pb24oXHJcbiAgICAgICAgICBxdWF0X29sZCxcclxuICAgICAgICAgIHF1YXRfbmV3LFxyXG4gICAgICAgICAgcSxcclxuICAgICAgICAgIHF1YXRfaW50ZXJpbVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgR3NXZWJHTFV0aWxpdHkuUXVhdGVybmlvblRvTWF0cml4KHF1YXRfaW50ZXJpbSwgbWF0cml4X2ludGVyaW0pO1xyXG5cclxuICAgICAgICBwb3NpdGlvbltYXSA9IHRvMltYXSAtIG1hdHJpeF9pbnRlcmltWzhdICogKGxlbmd0aCArIGxlbmd0aF9kZWx0YSAqIHEpO1xyXG4gICAgICAgIHBvc2l0aW9uW1ldID0gdG8yW1ldIC0gbWF0cml4X2ludGVyaW1bOV0gKiAobGVuZ3RoICsgbGVuZ3RoX2RlbHRhICogcSk7XHJcbiAgICAgICAgcG9zaXRpb25bWl0gPSB0bzJbWl0gLSBtYXRyaXhfaW50ZXJpbVsxMF0gKiAobGVuZ3RoICsgbGVuZ3RoX2RlbHRhICogcSk7XHJcblxyXG4gICAgICAgIHVwX3ZlY3RvcltYXSA9IG1hdHJpeF9pbnRlcmltWzRdO1xyXG4gICAgICAgIHVwX3ZlY3RvcltZXSA9IG1hdHJpeF9pbnRlcmltWzVdO1xyXG4gICAgICAgIHVwX3ZlY3RvcltaXSA9IG1hdHJpeF9pbnRlcmltWzZdO1xyXG5cclxuICAgICAgICAvL2NhbWVyYS5wb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgLy9jYW1lcmEudXAodXBfdmVjdG9yKTtcclxuICAgICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHZpLl9zY2VuZUtleSk7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKHVwX3ZlY3Rvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAgICAgLy9sZXQgdXAgPSBKU19TaG93X0NhbWVyYV9VcCgpO1xyXG5cclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiY2FtZXJhIHVwOlwiICsgdXBbMF0gKyBcIixcIiArIHVwWzFdICsgXCIsXCIgKyB1cFsyXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy9jYW1lcmEucG9zaXRpb24obmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgICAgLy8gICAgY29bWF0gKyAocSAqIHBvc2l0aW9uX21vdmVfZGVsdGFbWF0pLFxyXG4gICAgICAgIC8vICAgIGNvW1ldICsgKHEgKiBwb3NpdGlvbl9tb3ZlX2RlbHRhW1ldKSxcclxuICAgICAgICAvLyAgICBjb1taXSArIChxICogcG9zaXRpb25fbW92ZV9kZWx0YVtaXSldKSk7XHJcblxyXG4gICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKFxyXG4gICAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgICAgICAgICBjb1tYXSArIHEgKiBwb3NpdGlvbl9tb3ZlX2RlbHRhW1hdLFxyXG4gICAgICAgICAgICAgIGNvW1ldICsgcSAqIHBvc2l0aW9uX21vdmVfZGVsdGFbWV0sXHJcbiAgICAgICAgICAgICAgY29bWl0gKyBxICogcG9zaXRpb25fbW92ZV9kZWx0YVtaXSxcclxuICAgICAgICAgICAgXSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gbm93IGxpbmVhcmx5IGludGVycG9sYXRlIHRoZSBjYW1lcmEgdGFyZ2V0IGFuZCBmaWVsZCBjaGFuZ2VzXHJcbiAgICAgIC8vY2FtZXJhLnRhcmdldChuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgLy8gICAgdG9bWF0gKyAocSAqIHRhcmdldF9tb3ZlX2RlbHRhW1hdKSxcclxuICAgICAgLy8gICAgdG9bWV0gKyAocSAqIHRhcmdldF9tb3ZlX2RlbHRhW1ldKSxcclxuICAgICAgLy8gICAgdG9bWl0gKyAocSAqIHRhcmdldF9tb3ZlX2RlbHRhW1pdKV0pKTtcclxuXHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIEpTX1NldF9DYW1lcmFfVGFyZ2V0KFxyXG4gICAgICAgICAgbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgICAgICAgIHRvW1hdICsgcSAqIHRhcmdldF9tb3ZlX2RlbHRhW1hdLFxyXG4gICAgICAgICAgICB0b1tZXSArIHEgKiB0YXJnZXRfbW92ZV9kZWx0YVtZXSxcclxuICAgICAgICAgICAgdG9bWl0gKyBxICogdGFyZ2V0X21vdmVfZGVsdGFbWl0sXHJcbiAgICAgICAgICBdKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgbGV0IGZ3ID0gd2lkdGhvICsgcSAqIGZpZWxkX3dpZHRoX2RlbHRhO1xyXG4gICAgICBsZXQgZmggPSBoZWlnaHRvICsgcSAqIGZpZWxkX2hlaWdodF9kZWx0YTtcclxuICAgICAgaWYgKGZ3ID4gMC4wMDAwMSAmJiBmaCA+IDAuMDAwMDEpIHtcclxuICAgICAgICAvL2NhbWVyYS53aWR0aChmdyk7XHJcbiAgICAgICAgLy9jYW1lcmEuaGVpZ2h0KGZoKTtcclxuICAgICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHZpLl9zY2VuZUtleSk7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYV9GaWVsZChmdywgZmgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICAgIHEgPSAoY3VycmVudF90aW1lIC0gdG90YWxfdGltZV9zdGFydCkgLyB0b3RhbF9kdXJhdGlvbjtcclxuXHJcbiAgICAgICAgLy92aS5zY2VuZUNhbWVyYUNoYW5nZWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy8gICAgdmFsdWUodmksIENhbWVyYUNoYW5nZVR5cGUuU2NhbGUpO1xyXG4gICAgICAgIC8vfSk7XHJcblxyXG4gICAgICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgLy9pZiAobmVlZF9yb3RhdGlvbikge1xyXG4gICAgICAgIC8vICAgIC8vbGV0IHVwID0gSlNfU2hvd19DYW1lcmFfVXAoKTtcclxuXHJcbiAgICAgICAgLy8gICAgLy9jb25zb2xlLmxvZyhcImNhbWVyYSB1cDpcIiArIHVwWzBdICsgXCIsXCIgKyB1cFsxXSArIFwiLFwiICsgdXBbMl0pO1xyXG5cclxuICAgICAgICAvLyAgICB2aS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgLy99XHJcbiAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAvLyAgICB2aS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgLy99XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChxIDwgMS4wIC0gR3NXZWJHTFV0aWxpdHkuRVBTSUxPTikge1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvL2NhbWVyYS50YXJnZXQodG4pO1xyXG4gICAgICAgIC8vY2FtZXJhLnBvc2l0aW9uKGNuKTtcclxuICAgICAgICAvL2NhbWVyYS51cCh1bik7XHJcbiAgICAgICAgLy9jYW1lcmEud2lkdGgod2lkdGhuKVxyXG4gICAgICAgIC8vY2FtZXJhLmhlaWdodChoZWlnaHRuKTtcclxuICAgICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHZpLl9zY2VuZUtleSk7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYShjbiwgdG4sIHVuLCB3aWR0aG4sIGhlaWdodG4sIGNhbWVyYS5wcm9qZWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgICB2aS5zY2VuZUNhbWVyYUNoYW5nZWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWJpdHdpc2VcclxuICAgICAgICAgIHZhbHVlKHZpLCBDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSB8IENhbWVyYUNoYW5nZVR5cGUuU2NhbGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgdmkudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xyXG5cclxuICAgIC8vY2FtZXJhLnRhcmdldCh0bik7XHJcbiAgICAvL2NhbWVyYS5wb3NpdGlvbihjbik7XHJcbiAgICAvL2NhbWVyYS51cCh1bik7XHJcbiAgICAvL2NhbWVyYS53aWR0aCh3aWR0aG4pXHJcbiAgICAvL2NhbWVyYS5oZWlnaHQoaGVpZ2h0bik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc21vb3RoVHJhbnNpdGlvbkQoXHJcbiAgICBjbzogRmxvYXQ2NEFycmF5LFxyXG4gICAgdG86IEZsb2F0NjRBcnJheSxcclxuICAgIHVvOiBGbG9hdDY0QXJyYXksXHJcbiAgICB3aWR0aG86IG51bWJlcixcclxuICAgIGhlaWdodG86IG51bWJlcixcclxuICAgIGNuOiBGbG9hdDY0QXJyYXksXHJcbiAgICB0bjogRmxvYXQ2NEFycmF5LFxyXG4gICAgdW46IEZsb2F0NjRBcnJheSxcclxuICAgIHdpZHRobjogbnVtYmVyLFxyXG4gICAgaGVpZ2h0bjogbnVtYmVyLFxyXG4gICAgdmk6IGFueVxyXG4gICkge1xyXG4gICAgLy9sZXQgY2FtZXJhID0gdmkuY2FtZXJhKCk7XHJcbiAgICAodmkgYXMgVmlld2VyKS5pc0J1c3kgPSB0cnVlO1xyXG5cclxuICAgIGxldCBjYW1lcmE6IGFueTtcclxuICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgIHtcclxuICAgICAgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICBsZXQgWCA9IDA7XHJcbiAgICBsZXQgWSA9IDE7XHJcbiAgICBsZXQgWiA9IDI7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBEVG9sZXJhbmNlLnNhbWVWYWx1ZUZsb2F0QXJyYXkoY28sIGNuKSAmJlxyXG4gICAgICBEVG9sZXJhbmNlLnNhbWVWYWx1ZUZsb2F0QXJyYXkodG8sIHRuKSAmJlxyXG4gICAgICBEVG9sZXJhbmNlLnNhbWVWYWx1ZUZsb2F0QXJyYXkodW8sIHVuKSAmJlxyXG4gICAgICBEVG9sZXJhbmNlLnNhbWVWYWx1ZSh3aWR0aG8sIHdpZHRobikgJiZcclxuICAgICAgRFRvbGVyYW5jZS5zYW1lVmFsdWUoaGVpZ2h0bywgaGVpZ2h0bilcclxuICAgICkge1xyXG4gICAgICB2aS5pc0J1c3kgPSBmYWxzZTtcclxuICAgICAgdmkudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1hdHJpeF9vbGQgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcclxuICAgIGxldCBtYXRyaXhfbmV3ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XHJcbiAgICBsZXQgdmlld192ZWN0b3Jfb2xkID0gbmV3IEZsb2F0NjRBcnJheShbXHJcbiAgICAgIHRvW1hdIC0gY29bWF0sXHJcbiAgICAgIHRvW1ldIC0gY29bWV0sXHJcbiAgICAgIHRvW1pdIC0gY29bWl0sXHJcbiAgICBdKTtcclxuICAgIGxldCB2aWV3X3ZlY3Rvcl9uZXcgPSBuZXcgRmxvYXQ2NEFycmF5KFtcclxuICAgICAgdG5bWF0gLSBjbltYXSxcclxuICAgICAgdG5bWV0gLSBjbltZXSxcclxuICAgICAgdG5bWl0gLSBjbltaXSxcclxuICAgIF0pO1xyXG5cclxuICAgIGxldCBsZW5ndGggPSBEVmVjdG9yLm1vZHVsZSh2aWV3X3ZlY3Rvcl9vbGQpO1xyXG5cclxuICAgIGxldCBsZW5ndGhfZGVsdGEgPSBEVmVjdG9yLm1vZHVsZSh2aWV3X3ZlY3Rvcl9uZXcpIC0gbGVuZ3RoO1xyXG5cclxuICAgIERWZWN0b3Iubm9ybWFsaXplKHZpZXdfdmVjdG9yX29sZCk7XHJcbiAgICBEVmVjdG9yLm5vcm1hbGl6ZSh2aWV3X3ZlY3Rvcl9uZXcpO1xyXG5cclxuICAgIGxldCBuZWVkX3JvdGF0aW9uID0gdHJ1ZTtcclxuICAgIGxldCByb3RhdGlvbl9kZWx0YSA9IG5ldyBGbG9hdDY0QXJyYXkoW1xyXG4gICAgICB2aWV3X3ZlY3Rvcl9vbGRbMF0gLSB2aWV3X3ZlY3Rvcl9uZXdbMF0sXHJcbiAgICAgIHZpZXdfdmVjdG9yX29sZFsxXSAtIHZpZXdfdmVjdG9yX25ld1sxXSxcclxuICAgICAgdmlld192ZWN0b3Jfb2xkWzJdIC0gdmlld192ZWN0b3JfbmV3WzJdLFxyXG4gICAgXSk7XHJcblxyXG4gICAgbGV0IHVwX2RlbHRhID0gbmV3IEZsb2F0NjRBcnJheShbXHJcbiAgICAgIHVuW1hdIC0gdW9bWF0sXHJcbiAgICAgIHVuW1ldIC0gdW9bWV0sXHJcbiAgICAgIHVuW1pdIC0gdW9bWl0sXHJcbiAgICBdKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIERWZWN0b3IubW9kdWxlKHJvdGF0aW9uX2RlbHRhKSA8IDAuMDAwMSAmJlxyXG4gICAgICBEVmVjdG9yLm1vZHVsZSh1cF9kZWx0YSkgPCAwLjAwMDFcclxuICAgICkge1xyXG4gICAgICBuZWVkX3JvdGF0aW9uID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRyYW5zbGF0aW9uID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuICAgIGxldCBwb3NpdGlvbl9tb3ZlX2RlbHRhID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuXHJcbiAgICBpZiAobmVlZF9yb3RhdGlvbikge1xyXG4gICAgICBHc1dlYkdMVXRpbGl0eS5HZXRNYXRyaXhGcm9tQ2FtZXJhRCh0bywgY28sIHVvLCB0cmFuc2xhdGlvbiwgbWF0cml4X29sZCk7XHJcbiAgICAgIEdzV2ViR0xVdGlsaXR5LkdldE1hdHJpeEZyb21DYW1lcmFEKHRuLCBjbiwgdW4sIHRyYW5zbGF0aW9uLCBtYXRyaXhfbmV3KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBvc2l0aW9uX21vdmVfZGVsdGFbWF0gPSBjbltYXSAtIGNvW1hdO1xyXG4gICAgICBwb3NpdGlvbl9tb3ZlX2RlbHRhW1ldID0gY25bWV0gLSBjb1tZXTtcclxuICAgICAgcG9zaXRpb25fbW92ZV9kZWx0YVtaXSA9IGNuW1pdIC0gY29bWl07XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1hdHJpeF9pbnRlcmltID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XHJcbiAgICBsZXQgcXVhdF9vbGQgPSBuZXcgRmxvYXQ2NEFycmF5KDQpO1xyXG4gICAgbGV0IHF1YXRfbmV3ID0gbmV3IEZsb2F0NjRBcnJheSg0KTtcclxuICAgIGxldCBxdWF0X2ludGVyaW0gPSBuZXcgRmxvYXQ2NEFycmF5KDQpO1xyXG5cclxuICAgIGlmIChuZWVkX3JvdGF0aW9uKSB7XHJcbiAgICAgIEdzV2ViR0xVdGlsaXR5Lk1hdHJpeFRvUXVhdGVybmlvbkQobWF0cml4X29sZCwgcXVhdF9vbGQpO1xyXG4gICAgICBHc1dlYkdMVXRpbGl0eS5NYXRyaXhUb1F1YXRlcm5pb25EKG1hdHJpeF9uZXcsIHF1YXRfbmV3KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGFyZ2V0X21vdmVfZGVsdGEgPSBuZXcgRmxvYXQ2NEFycmF5KFtcclxuICAgICAgdG5bWF0gLSB0b1tYXSxcclxuICAgICAgdG5bWV0gLSB0b1tZXSxcclxuICAgICAgdG5bWl0gLSB0b1taXSxcclxuICAgIF0pO1xyXG5cclxuICAgIGxldCBmaWVsZF93aWR0aF9kZWx0YSA9IHdpZHRobiAtIHdpZHRobztcclxuICAgIGxldCBmaWVsZF9oZWlnaHRfZGVsdGEgPSBoZWlnaHRuIC0gaGVpZ2h0bztcclxuXHJcbiAgICBsZXQgZG90MSwgZG90MjtcclxuXHJcbiAgICBpZiAobmVlZF9yb3RhdGlvbikge1xyXG4gICAgICAvLyBTaW1wbGUgZG90IHByb2R1Y3QgdG8gZGV0ZXJtaW5lIHdoaWNoIGRpcmVjdGlvbiB0aGUgcXVhdGVybmlvbiBzaG91bGRcclxuICAgICAgLy8gZ28gaWYgd2Ugd2FudCB0byB0YWtlIHRoZSBzaG9ydGVzdCBwYXRoLlxyXG4gICAgICBkb3QxID1cclxuICAgICAgICAocXVhdF9vbGRbMF0gLSBxdWF0X25ld1swXSkgKiAocXVhdF9vbGRbMF0gLSBxdWF0X25ld1swXSkgK1xyXG4gICAgICAgIChxdWF0X29sZFsxXSAtIHF1YXRfbmV3WzFdKSAqIChxdWF0X29sZFsxXSAtIHF1YXRfbmV3WzFdKSArXHJcbiAgICAgICAgKHF1YXRfb2xkWzJdIC0gcXVhdF9uZXdbMl0pICogKHF1YXRfb2xkWzJdIC0gcXVhdF9uZXdbMl0pICtcclxuICAgICAgICAocXVhdF9vbGRbM10gLSBxdWF0X25ld1szXSkgKiAocXVhdF9vbGRbM10gLSBxdWF0X25ld1szXSk7XHJcblxyXG4gICAgICBkb3QyID1cclxuICAgICAgICAocXVhdF9vbGRbMF0gKyBxdWF0X25ld1swXSkgKiAocXVhdF9vbGRbMF0gKyBxdWF0X25ld1swXSkgK1xyXG4gICAgICAgIChxdWF0X29sZFsxXSArIHF1YXRfbmV3WzFdKSAqIChxdWF0X29sZFsxXSArIHF1YXRfbmV3WzFdKSArXHJcbiAgICAgICAgKHF1YXRfb2xkWzJdICsgcXVhdF9uZXdbMl0pICogKHF1YXRfb2xkWzJdICsgcXVhdF9uZXdbMl0pICtcclxuICAgICAgICAocXVhdF9vbGRbM10gKyBxdWF0X25ld1szXSkgKiAocXVhdF9vbGRbM10gKyBxdWF0X25ld1szXSk7XHJcblxyXG4gICAgICBpZiAoZG90MiA8IGRvdDEpIHtcclxuICAgICAgICBxdWF0X25ld1swXSA9IC1xdWF0X25ld1swXTtcclxuICAgICAgICBxdWF0X25ld1sxXSA9IC1xdWF0X25ld1sxXTtcclxuICAgICAgICBxdWF0X25ld1syXSA9IC1xdWF0X25ld1syXTtcclxuICAgICAgICBxdWF0X25ld1szXSA9IC1xdWF0X25ld1szXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBwb3NpdGlvbiA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICBsZXQgdXBfdmVjdG9yID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuXHJcbiAgICBsZXQgdG90YWxfZHVyYXRpb24gPSB2aS5fc21vb3RoVHJhbnNpdGlvbkR1cmF0aW9uO1xyXG4gICAgLy9sZXQgdG90YWxfZHVyYXRpb24gPSA1MDA7XHJcbiAgICAvL1x0ZmxvYXQgaW5pdGlhbF9kZWx0YSA9IChmbG9hdCkgMC4wNSAvIHRvdGFsX2R1cmF0aW9uO1x0XHRcdC8vMC4wNSA9IDIwZnBzXHQoZ3Vlc3NpbmcpXHJcbiAgICBsZXQgcSwgY3VycmVudF90aW1lOiBudW1iZXI7XHJcblxyXG4gICAgbGV0IHRvdGFsX3RpbWVfc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgdG90YWxfdGltZV9zdGFydCAtPSAxMDA7IC8vMC4xbXNcclxuXHJcbiAgICAvL2Z1bmN0aW9uIHVkX3RpY2soKSB7XHJcbiAgICAvLyAgICB2aS5zY2VuZUNhbWVyYUNoYW5nZWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgdmFsdWUodmksIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlQW5kU2NhbGUpO1xyXG4gICAgLy8gICAgfSk7XHJcbiAgICAvLyAgICB2aS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAvL31cclxuXHJcbiAgICBmdW5jdGlvbiB0aWNrKCkge1xyXG4gICAgICBjdXJyZW50X3RpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICBxID0gKGN1cnJlbnRfdGltZSAtIHRvdGFsX3RpbWVfc3RhcnQpIC8gdG90YWxfZHVyYXRpb247XHJcbiAgICAgIGlmIChxID49IDEuMCkge1xyXG4gICAgICAgIHEgPSAxLjA7XHJcbiAgICAgIH1cclxuICAgICAgcSA9IEdzV2ViR0xVdGlsaXR5LkVhc2VJbkVhc2VPdXQocSwgMC40OSwgMC4wMiwgMC40OSk7XHJcbiAgICAgIGlmIChxIDwgMCkge1xyXG4gICAgICAgIHEgPSAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobmVlZF9yb3RhdGlvbikge1xyXG4gICAgICAgIGxldCB0bzIgPSBuZXcgRmxvYXQ2NEFycmF5KFtcclxuICAgICAgICAgIHRvW1hdICsgcSAqIHRhcmdldF9tb3ZlX2RlbHRhW1hdLFxyXG4gICAgICAgICAgdG9bWV0gKyBxICogdGFyZ2V0X21vdmVfZGVsdGFbWV0sXHJcbiAgICAgICAgICB0b1taXSArIHEgKiB0YXJnZXRfbW92ZV9kZWx0YVtaXSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgLy8gZmlyc3QgbGV0IHVzZSBxdWF0ZXJuaW9ucyB0byB0YWtlIGNhcmUgb2YgdGhlIGludGVycG9sYXRpb25cclxuICAgICAgICAvLyBvZiB0aGUgcm90YXRpb24gZWxlbWVudCBvZiB0aGUgY2FtZXJhIG1vdmVtZW50XHJcbiAgICAgICAgR3NXZWJHTFV0aWxpdHkuVHJhbnNpdGlvblF1YXRlcm5pb25EKFxyXG4gICAgICAgICAgcXVhdF9vbGQsXHJcbiAgICAgICAgICBxdWF0X25ldyxcclxuICAgICAgICAgIHEsXHJcbiAgICAgICAgICBxdWF0X2ludGVyaW1cclxuICAgICAgICApO1xyXG4gICAgICAgIEdzV2ViR0xVdGlsaXR5LlF1YXRlcm5pb25Ub01hdHJpeEQocXVhdF9pbnRlcmltLCBtYXRyaXhfaW50ZXJpbSk7XHJcblxyXG4gICAgICAgIHBvc2l0aW9uW1hdID0gdG8yW1hdIC0gbWF0cml4X2ludGVyaW1bOF0gKiAobGVuZ3RoICsgbGVuZ3RoX2RlbHRhICogcSk7XHJcbiAgICAgICAgcG9zaXRpb25bWV0gPSB0bzJbWV0gLSBtYXRyaXhfaW50ZXJpbVs5XSAqIChsZW5ndGggKyBsZW5ndGhfZGVsdGEgKiBxKTtcclxuICAgICAgICBwb3NpdGlvbltaXSA9IHRvMltaXSAtIG1hdHJpeF9pbnRlcmltWzEwXSAqIChsZW5ndGggKyBsZW5ndGhfZGVsdGEgKiBxKTtcclxuXHJcbiAgICAgICAgdXBfdmVjdG9yW1hdID0gbWF0cml4X2ludGVyaW1bNF07XHJcbiAgICAgICAgdXBfdmVjdG9yW1ldID0gbWF0cml4X2ludGVyaW1bNV07XHJcbiAgICAgICAgdXBfdmVjdG9yW1pdID0gbWF0cml4X2ludGVyaW1bNl07XHJcblxyXG4gICAgICAgIC8vY2FtZXJhLnBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAvL2NhbWVyYS51cCh1cF92ZWN0b3IpO1xyXG4gICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAodXBfdmVjdG9yKTtcclxuXHJcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKFwicG9zOlwiICsgcG9zaXRpb25bMF0gKyBcIiwgXCIgKyBwb3NpdGlvblsxXSArIFwiLCBcIiArIHBvc2l0aW9uWzJdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgICAvL2xldCB1cCA9IEpTX1Nob3dfRENhbWVyYV9VcCgpO1xyXG5cclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiY2FtZXJhIHVwOlwiICsgdXBbMF0gKyBcIixcIiArIHVwWzFdICsgXCIsXCIgKyB1cFsyXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy9jYW1lcmEucG9zaXRpb24obmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgICAgLy8gICAgY29bWF0gKyAocSAqIHBvc2l0aW9uX21vdmVfZGVsdGFbWF0pLFxyXG4gICAgICAgIC8vICAgIGNvW1ldICsgKHEgKiBwb3NpdGlvbl9tb3ZlX2RlbHRhW1ldKSxcclxuICAgICAgICAvLyAgICBjb1taXSArIChxICogcG9zaXRpb25fbW92ZV9kZWx0YVtaXSldKSk7XHJcblxyXG4gICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKFxyXG4gICAgICAgICAgICBuZXcgRmxvYXQ2NEFycmF5KFtcclxuICAgICAgICAgICAgICBjb1tYXSArIHEgKiBwb3NpdGlvbl9tb3ZlX2RlbHRhW1hdLFxyXG4gICAgICAgICAgICAgIGNvW1ldICsgcSAqIHBvc2l0aW9uX21vdmVfZGVsdGFbWV0sXHJcbiAgICAgICAgICAgICAgY29bWl0gKyBxICogcG9zaXRpb25fbW92ZV9kZWx0YVtaXSxcclxuICAgICAgICAgICAgXSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gbm93IGxpbmVhcmx5IGludGVycG9sYXRlIHRoZSBjYW1lcmEgdGFyZ2V0IGFuZCBmaWVsZCBjaGFuZ2VzXHJcbiAgICAgIC8vY2FtZXJhLnRhcmdldChuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgLy8gICAgdG9bWF0gKyAocSAqIHRhcmdldF9tb3ZlX2RlbHRhW1hdKSxcclxuICAgICAgLy8gICAgdG9bWV0gKyAocSAqIHRhcmdldF9tb3ZlX2RlbHRhW1ldKSxcclxuICAgICAgLy8gICAgdG9bWl0gKyAocSAqIHRhcmdldF9tb3ZlX2RlbHRhW1pdKV0pKTtcclxuXHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIEpTX1NldF9DYW1lcmFfVGFyZ2V0KFxyXG4gICAgICAgICAgbmV3IEZsb2F0NjRBcnJheShbXHJcbiAgICAgICAgICAgIHRvW1hdICsgcSAqIHRhcmdldF9tb3ZlX2RlbHRhW1hdLFxyXG4gICAgICAgICAgICB0b1tZXSArIHEgKiB0YXJnZXRfbW92ZV9kZWx0YVtZXSxcclxuICAgICAgICAgICAgdG9bWl0gKyBxICogdGFyZ2V0X21vdmVfZGVsdGFbWl0sXHJcbiAgICAgICAgICBdKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgbGV0IGZ3ID0gd2lkdGhvICsgcSAqIGZpZWxkX3dpZHRoX2RlbHRhO1xyXG4gICAgICBsZXQgZmggPSBoZWlnaHRvICsgcSAqIGZpZWxkX2hlaWdodF9kZWx0YTtcclxuICAgICAgaWYgKGZ3ID4gMC4wMDAwMSAmJiBmaCA+IDAuMDAwMDEpIHtcclxuICAgICAgICAvL2NhbWVyYS53aWR0aChmdyk7XHJcbiAgICAgICAgLy9jYW1lcmEuaGVpZ2h0KGZoKTtcclxuICAgICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHZpLl9zY2VuZUtleSk7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYV9GaWVsZChmdywgZmgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICAgIHEgPSAoY3VycmVudF90aW1lIC0gdG90YWxfdGltZV9zdGFydCkgLyB0b3RhbF9kdXJhdGlvbjtcclxuXHJcbiAgICAgICAgLy/miafooYxzY2VuZUNhbWVyYUNoYW5nZWTmiafooYzlhYhTZXRDYW1lcmFOZWFyRmFyLlxyXG4gICAgICAgIHZpLmV4ZVNjZW5lQ2FtZXJhQ2hhbmdpbmcoXHJcbiAgICAgICAgICBDYW1lcmFDaGFuZ2VUeXBlLlNjYWxlIHxcclxuICAgICAgICAgICAgQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGUgfFxyXG4gICAgICAgICAgICBDYW1lcmFDaGFuZ2VUeXBlLlRyYW5zbGF0ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgdmkuZXhlU2NlbmVDYW1lcmFDaGFuZ2VkKFxyXG4gICAgICAgICAgQ2FtZXJhQ2hhbmdlVHlwZS5TY2FsZSB8XHJcbiAgICAgICAgICAgIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlIHxcclxuICAgICAgICAgICAgQ2FtZXJhQ2hhbmdlVHlwZS5UcmFuc2xhdGVcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvL2lmIChuZWVkX3JvdGF0aW9uKSB7XHJcbiAgICAgICAgLy8gICAgLy9sZXQgdXAgPSBKU19TaG93X0NhbWVyYV9VcCgpO1xyXG5cclxuICAgICAgICAvLyAgICAvL2NvbnNvbGUubG9nKFwiY2FtZXJhIHVwOlwiICsgdXBbMF0gKyBcIixcIiArIHVwWzFdICsgXCIsXCIgKyB1cFsyXSk7XHJcblxyXG4gICAgICAgIC8vICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgICAvL31cclxuICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgIC8vICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgICAvL31cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHEgPCAxLjAgLSBHc1dlYkdMVXRpbGl0eS5FUFNJTE9OKSB7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vY2FtZXJhLnRhcmdldCh0bik7XHJcbiAgICAgICAgLy9jYW1lcmEucG9zaXRpb24oY24pO1xyXG4gICAgICAgIC8vY2FtZXJhLnVwKHVuKTtcclxuICAgICAgICAvL2NhbWVyYS53aWR0aCh3aWR0aG4pXHJcbiAgICAgICAgLy9jYW1lcmEuaGVpZ2h0KGhlaWdodG4pO1xyXG5cclxuICAgICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHZpLl9zY2VuZUtleSk7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLy8gSlNfU2V0X0NhbWVyYShjbiwgdG4sIHVuLCB3aWR0aG4sIGhlaWdodG4sIGNhbWVyYS5wcm9qZWN0aW9uKTtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24oY24pO1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYV9UYXJnZXQodG4pO1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcCh1bik7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhX0ZpZWxkKHdpZHRobiwgaGVpZ2h0bik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAgICAgLy/miafooYxzY2VuZUNhbWVyYUNoYW5nZWTmiafooYzlhYhTZXRDYW1lcmFOZWFyRmFyLlxyXG4gICAgICAgIHZpLmV4ZVNjZW5lQ2FtZXJhQ2hhbmdpbmcoXHJcbiAgICAgICAgICBDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSB8IENhbWVyYUNoYW5nZVR5cGUuU2NhbGVcclxuICAgICAgICApO1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB2aS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmkuZXhlU2NlbmVDYW1lcmFDaGFuZ2VkKFxyXG4gICAgICAgICAgQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGUgfCBDYW1lcmFDaGFuZ2VUeXBlLlNjYWxlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdmkuaXNCdXN5ID0gZmFsc2U7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc0J1c3k6XCIsIHZpLmlzQnVzeSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XHJcblxyXG4gICAgLy9jYW1lcmEudGFyZ2V0KHRuKTtcclxuICAgIC8vY2FtZXJhLnBvc2l0aW9uKGNuKTtcclxuICAgIC8vY2FtZXJhLnVwKHVuKTtcclxuICAgIC8vY2FtZXJhLndpZHRoKHdpZHRobilcclxuICAgIC8vY2FtZXJhLmhlaWdodChoZWlnaHRuKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIEdldE1hdHJpeEZyb21DYW1lcmEoXHJcbiAgICB0YXJnZXQ6IEZsb2F0MzJBcnJheSxcclxuICAgIHBvc2l0aW9uOiBGbG9hdDMyQXJyYXksXHJcbiAgICB1cF92ZWN0b3I6IEZsb2F0MzJBcnJheSxcclxuICAgIHRyYW5zbGF0aW9uOiBGbG9hdDMyQXJyYXksXHJcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheVxyXG4gICkge1xyXG4gICAgbGV0IHZpZXdfdmVjdG9yID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgIHRhcmdldFswXSAtIHBvc2l0aW9uWzBdLFxyXG4gICAgICB0YXJnZXRbMV0gLSBwb3NpdGlvblsxXSxcclxuICAgICAgdGFyZ2V0WzJdIC0gcG9zaXRpb25bMl0sXHJcbiAgICBdKTtcclxuXHJcbiAgICBWZWN0b3Iubm9ybWFsaXplKHZpZXdfdmVjdG9yKTtcclxuICAgIFZlY3Rvci5ub3JtYWxpemUodXBfdmVjdG9yKTtcclxuXHJcbiAgICBsZXQgY3Jvc3MxID0gVmVjdG9yLmNyb3NzKHVwX3ZlY3Rvciwgdmlld192ZWN0b3IpO1xyXG5cclxuICAgIG1hdHJpeFswXSA9IGNyb3NzMVswXTtcclxuICAgIG1hdHJpeFsxXSA9IGNyb3NzMVsxXTtcclxuICAgIG1hdHJpeFsyXSA9IGNyb3NzMVsyXTtcclxuICAgIG1hdHJpeFszXSA9IDAuMDtcclxuXHJcbiAgICBsZXQgY3Jvc3MyID0gVmVjdG9yLmNyb3NzKHZpZXdfdmVjdG9yLCBjcm9zczEpO1xyXG5cclxuICAgIG1hdHJpeFs0XSA9IGNyb3NzMlswXTtcclxuICAgIG1hdHJpeFs1XSA9IGNyb3NzMlsxXTtcclxuICAgIG1hdHJpeFs2XSA9IGNyb3NzMlsyXTtcclxuICAgIG1hdHJpeFs3XSA9IDAuMDtcclxuXHJcbiAgICBtYXRyaXhbOF0gPSB2aWV3X3ZlY3RvclswXTtcclxuICAgIG1hdHJpeFs5XSA9IHZpZXdfdmVjdG9yWzFdO1xyXG4gICAgbWF0cml4WzEwXSA9IHZpZXdfdmVjdG9yWzJdO1xyXG4gICAgbWF0cml4WzExXSA9IDAuMDtcclxuXHJcbiAgICBtYXRyaXhbMTJdID0gdHJhbnNsYXRpb25bMF07XHJcbiAgICBtYXRyaXhbMTNdID0gdHJhbnNsYXRpb25bMV07XHJcbiAgICBtYXRyaXhbMTRdID0gdHJhbnNsYXRpb25bMl07XHJcbiAgICBtYXRyaXhbMTVdID0gMS4wO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgR2V0TWF0cml4RnJvbUNhbWVyYUQoXHJcbiAgICB0YXJnZXQ6IEZsb2F0NjRBcnJheSxcclxuICAgIHBvc2l0aW9uOiBGbG9hdDY0QXJyYXksXHJcbiAgICB1cF92ZWN0b3I6IEZsb2F0NjRBcnJheSxcclxuICAgIHRyYW5zbGF0aW9uOiBGbG9hdDY0QXJyYXksXHJcbiAgICBtYXRyaXg6IEZsb2F0NjRBcnJheVxyXG4gICkge1xyXG4gICAgbGV0IHZpZXdfdmVjdG9yID0gbmV3IEZsb2F0NjRBcnJheShbXHJcbiAgICAgIHRhcmdldFswXSAtIHBvc2l0aW9uWzBdLFxyXG4gICAgICB0YXJnZXRbMV0gLSBwb3NpdGlvblsxXSxcclxuICAgICAgdGFyZ2V0WzJdIC0gcG9zaXRpb25bMl0sXHJcbiAgICBdKTtcclxuXHJcbiAgICBEVmVjdG9yLm5vcm1hbGl6ZSh2aWV3X3ZlY3Rvcik7XHJcbiAgICBEVmVjdG9yLm5vcm1hbGl6ZSh1cF92ZWN0b3IpO1xyXG5cclxuICAgIGxldCBjcm9zczEgPSBEVmVjdG9yLmNyb3NzKHVwX3ZlY3Rvciwgdmlld192ZWN0b3IpO1xyXG5cclxuICAgIG1hdHJpeFswXSA9IGNyb3NzMVswXTtcclxuICAgIG1hdHJpeFsxXSA9IGNyb3NzMVsxXTtcclxuICAgIG1hdHJpeFsyXSA9IGNyb3NzMVsyXTtcclxuICAgIG1hdHJpeFszXSA9IDAuMDtcclxuXHJcbiAgICBsZXQgY3Jvc3MyID0gRFZlY3Rvci5jcm9zcyh2aWV3X3ZlY3RvciwgY3Jvc3MxKTtcclxuXHJcbiAgICBtYXRyaXhbNF0gPSBjcm9zczJbMF07XHJcbiAgICBtYXRyaXhbNV0gPSBjcm9zczJbMV07XHJcbiAgICBtYXRyaXhbNl0gPSBjcm9zczJbMl07XHJcbiAgICBtYXRyaXhbN10gPSAwLjA7XHJcblxyXG4gICAgbWF0cml4WzhdID0gdmlld192ZWN0b3JbMF07XHJcbiAgICBtYXRyaXhbOV0gPSB2aWV3X3ZlY3RvclsxXTtcclxuICAgIG1hdHJpeFsxMF0gPSB2aWV3X3ZlY3RvclsyXTtcclxuICAgIG1hdHJpeFsxMV0gPSAwLjA7XHJcblxyXG4gICAgbWF0cml4WzEyXSA9IHRyYW5zbGF0aW9uWzBdO1xyXG4gICAgbWF0cml4WzEzXSA9IHRyYW5zbGF0aW9uWzFdO1xyXG4gICAgbWF0cml4WzE0XSA9IHRyYW5zbGF0aW9uWzJdO1xyXG4gICAgbWF0cml4WzE1XSA9IDEuMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIE1hdHJpeFRvUXVhdGVybmlvbihcclxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxyXG4gICAgcXVhdGVybmlvbjogRmxvYXQzMkFycmF5XHJcbiAgKSB7XHJcbiAgICBsZXQgdHIsIHM6IG51bWJlcjtcclxuICAgIGxldCBpLCBqLCBrOiBudW1iZXI7XHJcbiAgICBsZXQgWCA9IDA7XHJcbiAgICBsZXQgWSA9IDE7XHJcbiAgICBsZXQgWiA9IDI7XHJcbiAgICBsZXQgVyA9IDM7XHJcblxyXG4gICAgdHIgPSBtYXRyaXhbMF0gKyBtYXRyaXhbNV0gKyBtYXRyaXhbMTBdO1xyXG4gICAgaWYgKHRyID4gMC4wKSB7XHJcbiAgICAgIHMgPSBNYXRoLnNxcnQodHIgKyAxLjApO1xyXG4gICAgICBxdWF0ZXJuaW9uW1ddID0gcyAqIDAuNTtcclxuICAgICAgcyA9IDAuNSAvIHM7XHJcblxyXG4gICAgICBxdWF0ZXJuaW9uW1hdID0gKG1hdHJpeFs2XSAtIG1hdHJpeFs5XSkgKiBzO1xyXG4gICAgICBxdWF0ZXJuaW9uW1ldID0gKG1hdHJpeFs4XSAtIG1hdHJpeFsyXSkgKiBzO1xyXG4gICAgICBxdWF0ZXJuaW9uW1pdID0gKG1hdHJpeFsxXSAtIG1hdHJpeFs0XSkgKiBzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaSA9IFg7XHJcbiAgICAgIGlmIChtYXRyaXhbWSAqIDQgKyBZXSA+IG1hdHJpeFtYICogNCArIFhdKSB7XHJcbiAgICAgICAgaSA9IFk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdHJpeFtaICogNCArIFpdID4gbWF0cml4W2kgKiA0ICsgaV0pIHtcclxuICAgICAgICBpID0gWjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG54dCA9IG5ldyBJbnQzMkFycmF5KFtZLCBaLCBYXSk7XHJcblxyXG4gICAgICBqID0gbnh0W2ldO1xyXG4gICAgICBrID0gbnh0W2pdO1xyXG5cclxuICAgICAgcyA9IE1hdGguc3FydChcclxuICAgICAgICBtYXRyaXhbaSAqIDQgKyBpXSAtIChtYXRyaXhbaiAqIDQgKyBqXSArIG1hdHJpeFtrICogNCArIGtdKSArIDEuMFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcXVhdGVybmlvbltpXSA9IHMgKiAwLjU7XHJcbiAgICAgIHMgPSAwLjUgLyBzO1xyXG5cclxuICAgICAgcXVhdGVybmlvbltXXSA9IChtYXRyaXhbaiAqIDQgKyBrXSAtIG1hdHJpeFtrICogNCArIGpdKSAqIHM7XHJcbiAgICAgIHF1YXRlcm5pb25bal0gPSAobWF0cml4W2kgKiA0ICsgal0gKyBtYXRyaXhbaiAqIDQgKyBpXSkgKiBzO1xyXG4gICAgICBxdWF0ZXJuaW9uW2tdID0gKG1hdHJpeFtpICogNCArIGtdICsgbWF0cml4W2sgKiA0ICsgaV0pICogcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIE1hdHJpeFRvUXVhdGVybmlvbkQoXHJcbiAgICBtYXRyaXg6IEZsb2F0NjRBcnJheSxcclxuICAgIHF1YXRlcm5pb246IEZsb2F0NjRBcnJheVxyXG4gICkge1xyXG4gICAgbGV0IHRyLCBzOiBudW1iZXI7XHJcbiAgICBsZXQgaSwgaiwgazogbnVtYmVyO1xyXG4gICAgbGV0IFggPSAwO1xyXG4gICAgbGV0IFkgPSAxO1xyXG4gICAgbGV0IFogPSAyO1xyXG4gICAgbGV0IFcgPSAzO1xyXG5cclxuICAgIHRyID0gbWF0cml4WzBdICsgbWF0cml4WzVdICsgbWF0cml4WzEwXTtcclxuICAgIGlmICh0ciA+IDAuMCkge1xyXG4gICAgICBzID0gTWF0aC5zcXJ0KHRyICsgMS4wKTtcclxuICAgICAgcXVhdGVybmlvbltXXSA9IHMgKiAwLjU7XHJcbiAgICAgIHMgPSAwLjUgLyBzO1xyXG5cclxuICAgICAgcXVhdGVybmlvbltYXSA9IChtYXRyaXhbNl0gLSBtYXRyaXhbOV0pICogcztcclxuICAgICAgcXVhdGVybmlvbltZXSA9IChtYXRyaXhbOF0gLSBtYXRyaXhbMl0pICogcztcclxuICAgICAgcXVhdGVybmlvbltaXSA9IChtYXRyaXhbMV0gLSBtYXRyaXhbNF0pICogcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGkgPSBYO1xyXG4gICAgICBpZiAobWF0cml4W1kgKiA0ICsgWV0gPiBtYXRyaXhbWCAqIDQgKyBYXSkge1xyXG4gICAgICAgIGkgPSBZO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXRyaXhbWiAqIDQgKyBaXSA+IG1hdHJpeFtpICogNCArIGldKSB7XHJcbiAgICAgICAgaSA9IFo7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBueHQgPSBuZXcgSW50MzJBcnJheShbWSwgWiwgWF0pO1xyXG5cclxuICAgICAgaiA9IG54dFtpXTtcclxuICAgICAgayA9IG54dFtqXTtcclxuXHJcbiAgICAgIHMgPSBNYXRoLnNxcnQoXHJcbiAgICAgICAgbWF0cml4W2kgKiA0ICsgaV0gLSAobWF0cml4W2ogKiA0ICsgal0gKyBtYXRyaXhbayAqIDQgKyBrXSkgKyAxLjBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHF1YXRlcm5pb25baV0gPSBzICogMC41O1xyXG4gICAgICBzID0gMC41IC8gcztcclxuXHJcbiAgICAgIHF1YXRlcm5pb25bV10gPSAobWF0cml4W2ogKiA0ICsga10gLSBtYXRyaXhbayAqIDQgKyBqXSkgKiBzO1xyXG4gICAgICBxdWF0ZXJuaW9uW2pdID0gKG1hdHJpeFtpICogNCArIGpdICsgbWF0cml4W2ogKiA0ICsgaV0pICogcztcclxuICAgICAgcXVhdGVybmlvbltrXSA9IChtYXRyaXhbaSAqIDQgKyBrXSArIG1hdHJpeFtrICogNCArIGldKSAqIHM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBQQSh0OiBudW1iZXIsIG06IG51bWJlciwgYTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gKHQgKiB0ICogMC41ICogbSkgLyBhO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyBQQih0OiBudW1iZXIsIG06IG51bWJlciwgYTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gR3NXZWJHTFV0aWxpdHkuUEEoYSwgbSwgYSkgKyAodCAtIGEpICogbTtcclxuICB9XHJcbiAgcHJpdmF0ZSBzdGF0aWMgUEModDogbnVtYmVyLCBtOiBudW1iZXIsIGE6IG51bWJlciwgYjogbnVtYmVyLCBjOiBudW1iZXIpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIEdzV2ViR0xVdGlsaXR5LlBCKGEgKyBiLCBtLCBhKSArXHJcbiAgICAgICh0IC0gKGEgKyBiKSkgKiBtICogKDEuMCAtICgwLjUgKiAodCAtIChhICsgYikpKSAvIGMpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgRWFzZUluRWFzZU91dCh0OiBudW1iZXIsIGE6IG51bWJlciwgYjogbnVtYmVyLCBjOiBudW1iZXIpIHtcclxuICAgIGxldCByZXM6IG51bWJlcjtcclxuICAgIGxldCBtID0gMi4wIC8gKGEgKyAyLjAgKiBiICsgYyk7XHJcblxyXG4gICAgaWYgKHQgPD0gYSkge1xyXG4gICAgICByZXMgPSBHc1dlYkdMVXRpbGl0eS5QQSh0LCBtLCBhKTtcclxuICAgIH0gZWxzZSBpZiAodCA+PSBhICYmIHQgPD0gYSArIGIpIHtcclxuICAgICAgcmVzID0gR3NXZWJHTFV0aWxpdHkuUEIodCwgbSwgYSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXMgPSBHc1dlYkdMVXRpbGl0eS5QQyh0LCBtLCBhLCBiLCBjKTtcclxuICAgIH1cclxuICAgIGlmIChyZXMgPiAxLjApIHtcclxuICAgICAgcmVzID0gMS4wO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIEhfQUNPUyh4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB4IDwgLTEgPyBNYXRoLlBJIDogeCA+IDEgPyAwIDogTWF0aC5hY29zKHgpO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyBIX0FTSU4oeDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4geCA8IC0xID8gLU1hdGguUEkgLyAyIDogeCA+IDEgPyBNYXRoLlBJIC8gMiA6IE1hdGguYXNpbih4KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFRyYW5zaXRpb25RdWF0ZXJuaW9uKFxyXG4gICAgcXVhdF9vbGQ6IEZsb2F0MzJBcnJheSxcclxuICAgIHF1YXRfbmV3OiBGbG9hdDMyQXJyYXksXHJcbiAgICB0OiBudW1iZXIsXHJcbiAgICBxdDogRmxvYXQzMkFycmF5XHJcbiAgKSB7XHJcbiAgICBsZXQgb21lZ2EsIGNvc29tLCBzaW5vbSwgc2NscCwgc2NscTogbnVtYmVyO1xyXG4gICAgbGV0IFggPSAwO1xyXG4gICAgbGV0IFkgPSAxO1xyXG4gICAgbGV0IFogPSAyO1xyXG4gICAgbGV0IFcgPSAzO1xyXG5cclxuICAgIGNvc29tID1cclxuICAgICAgcXVhdF9vbGRbWF0gKiBxdWF0X25ld1tYXSArXHJcbiAgICAgIHF1YXRfb2xkW1ldICogcXVhdF9uZXdbWV0gK1xyXG4gICAgICBxdWF0X29sZFtaXSAqIHF1YXRfbmV3W1pdICtcclxuICAgICAgcXVhdF9vbGRbV10gKiBxdWF0X25ld1tXXTtcclxuXHJcbiAgICBpZiAoMS4wICsgY29zb20gPiBHc1dlYkdMVXRpbGl0eS5FUFNJTE9OKSB7XHJcbiAgICAgIGlmICgxLjAgLSBjb3NvbSA+IEdzV2ViR0xVdGlsaXR5LkVQU0lMT04pIHtcclxuICAgICAgICBvbWVnYSA9IEdzV2ViR0xVdGlsaXR5LkhfQUNPUyhjb3NvbSk7XHJcbiAgICAgICAgc2lub20gPSBNYXRoLnNpbihvbWVnYSk7XHJcbiAgICAgICAgc2NscCA9IE1hdGguc2luKCgxLjAgLSB0KSAqIG9tZWdhKSAvIHNpbm9tO1xyXG4gICAgICAgIHNjbHEgPSBNYXRoLnNpbih0ICogb21lZ2EpIC8gc2lub207XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2NscCA9IDEuMCAtIHQ7XHJcbiAgICAgICAgc2NscSA9IHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XHJcbiAgICAgICAgcXRbaV0gPSBzY2xwICogcXVhdF9vbGRbaV0gKyBzY2xxICogcXVhdF9uZXdbaV07XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHF0W1hdID0gLXF1YXRfb2xkW1ldO1xyXG4gICAgICBxdFtZXSA9IHF1YXRfb2xkW1hdO1xyXG4gICAgICBxdFtaXSA9IC1xdWF0X29sZFtXXTtcclxuICAgICAgcXRbV10gPSBxdWF0X29sZFtaXTtcclxuICAgICAgc2NscCA9IE1hdGguc2luKCgoMS4wIC0gdCkgKiBNYXRoLlBJKSAvIDIpO1xyXG4gICAgICBzY2xxID0gTWF0aC5zaW4oKHQgKiBNYXRoLlBJKSAvIDIpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xyXG4gICAgICAgIHF0W2ldID0gc2NscCAqIHF1YXRfb2xkW2ldICsgc2NscSAqIHF0W2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBUcmFuc2l0aW9uUXVhdGVybmlvbkQoXHJcbiAgICBxdWF0X29sZDogRmxvYXQ2NEFycmF5LFxyXG4gICAgcXVhdF9uZXc6IEZsb2F0NjRBcnJheSxcclxuICAgIHQ6IG51bWJlcixcclxuICAgIHF0OiBGbG9hdDY0QXJyYXlcclxuICApIHtcclxuICAgIGxldCBvbWVnYSwgY29zb20sIHNpbm9tLCBzY2xwLCBzY2xxOiBudW1iZXI7XHJcbiAgICBsZXQgWCA9IDA7XHJcbiAgICBsZXQgWSA9IDE7XHJcbiAgICBsZXQgWiA9IDI7XHJcbiAgICBsZXQgVyA9IDM7XHJcblxyXG4gICAgY29zb20gPVxyXG4gICAgICBxdWF0X29sZFtYXSAqIHF1YXRfbmV3W1hdICtcclxuICAgICAgcXVhdF9vbGRbWV0gKiBxdWF0X25ld1tZXSArXHJcbiAgICAgIHF1YXRfb2xkW1pdICogcXVhdF9uZXdbWl0gK1xyXG4gICAgICBxdWF0X29sZFtXXSAqIHF1YXRfbmV3W1ddO1xyXG5cclxuICAgIGlmICgxLjAgKyBjb3NvbSA+IEdzV2ViR0xVdGlsaXR5LkVQU0lMT04pIHtcclxuICAgICAgaWYgKDEuMCAtIGNvc29tID4gR3NXZWJHTFV0aWxpdHkuRVBTSUxPTikge1xyXG4gICAgICAgIG9tZWdhID0gR3NXZWJHTFV0aWxpdHkuSF9BQ09TKGNvc29tKTtcclxuICAgICAgICBzaW5vbSA9IE1hdGguc2luKG9tZWdhKTtcclxuICAgICAgICBzY2xwID0gTWF0aC5zaW4oKDEuMCAtIHQpICogb21lZ2EpIC8gc2lub207XHJcbiAgICAgICAgc2NscSA9IE1hdGguc2luKHQgKiBvbWVnYSkgLyBzaW5vbTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzY2xwID0gMS4wIC0gdDtcclxuICAgICAgICBzY2xxID0gdDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcclxuICAgICAgICBxdFtpXSA9IHNjbHAgKiBxdWF0X29sZFtpXSArIHNjbHEgKiBxdWF0X25ld1tpXTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcXRbWF0gPSAtcXVhdF9vbGRbWV07XHJcbiAgICAgIHF0W1ldID0gcXVhdF9vbGRbWF07XHJcbiAgICAgIHF0W1pdID0gLXF1YXRfb2xkW1ddO1xyXG4gICAgICBxdFtXXSA9IHF1YXRfb2xkW1pdO1xyXG4gICAgICBzY2xwID0gTWF0aC5zaW4oKCgxLjAgLSB0KSAqIE1hdGguUEkpIC8gMik7XHJcbiAgICAgIHNjbHEgPSBNYXRoLnNpbigodCAqIE1hdGguUEkpIC8gMik7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XHJcbiAgICAgICAgcXRbaV0gPSBzY2xwICogcXVhdF9vbGRbaV0gKyBzY2xxICogcXRbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFF1YXRlcm5pb25Ub01hdHJpeChcclxuICAgIHF1YXRlcm5pb246IEZsb2F0MzJBcnJheSxcclxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5XHJcbiAgKSB7XHJcbiAgICBsZXQgcywgeHMsIHlzLCB6cywgd3gsIHd5LCB3eiwgeHgsIHh5LCB4eiwgeXksIHl6LCB6ejogbnVtYmVyO1xyXG4gICAgbGV0IFggPSAwO1xyXG4gICAgbGV0IFkgPSAxO1xyXG4gICAgbGV0IFogPSAyO1xyXG4gICAgbGV0IFcgPSAzO1xyXG5cclxuICAgIHMgPVxyXG4gICAgICAyLjAgL1xyXG4gICAgICAocXVhdGVybmlvbltYXSAqIHF1YXRlcm5pb25bWF0gK1xyXG4gICAgICAgIHF1YXRlcm5pb25bWV0gKiBxdWF0ZXJuaW9uW1ldICtcclxuICAgICAgICBxdWF0ZXJuaW9uW1pdICogcXVhdGVybmlvbltaXSArXHJcbiAgICAgICAgcXVhdGVybmlvbltXXSAqIHF1YXRlcm5pb25bV10pO1xyXG5cclxuICAgIHhzID0gcXVhdGVybmlvbltYXSAqIHM7XHJcbiAgICB5cyA9IHF1YXRlcm5pb25bWV0gKiBzO1xyXG4gICAgenMgPSBxdWF0ZXJuaW9uW1pdICogcztcclxuICAgIHd4ID0gcXVhdGVybmlvbltXXSAqIHhzO1xyXG4gICAgd3kgPSBxdWF0ZXJuaW9uW1ddICogeXM7XHJcbiAgICB3eiA9IHF1YXRlcm5pb25bV10gKiB6cztcclxuICAgIHh4ID0gcXVhdGVybmlvbltYXSAqIHhzO1xyXG4gICAgeHkgPSBxdWF0ZXJuaW9uW1hdICogeXM7XHJcbiAgICB4eiA9IHF1YXRlcm5pb25bWF0gKiB6cztcclxuICAgIHl5ID0gcXVhdGVybmlvbltZXSAqIHlzO1xyXG4gICAgeXogPSBxdWF0ZXJuaW9uW1ldICogenM7XHJcbiAgICB6eiA9IHF1YXRlcm5pb25bWl0gKiB6cztcclxuXHJcbiAgICBtYXRyaXhbMF0gPSAxLjAgLSAoeXkgKyB6eik7XHJcbiAgICBtYXRyaXhbMV0gPSB4eSArIHd6O1xyXG4gICAgbWF0cml4WzJdID0geHogLSB3eTtcclxuICAgIG1hdHJpeFszXSA9IDAuMDtcclxuXHJcbiAgICBtYXRyaXhbNF0gPSB4eSAtIHd6O1xyXG4gICAgbWF0cml4WzVdID0gMS4wIC0gKHh4ICsgenopO1xyXG4gICAgbWF0cml4WzZdID0geXogKyB3eDtcclxuICAgIG1hdHJpeFs3XSA9IDAuMDtcclxuXHJcbiAgICBtYXRyaXhbOF0gPSB4eiArIHd5O1xyXG4gICAgbWF0cml4WzldID0geXogLSB3eDtcclxuICAgIG1hdHJpeFsxMF0gPSAxLjAgLSAoeHggKyB5eSk7XHJcbiAgICBtYXRyaXhbMTFdID0gMC4wO1xyXG5cclxuICAgIG1hdHJpeFsxMl0gPSAwLjA7XHJcbiAgICBtYXRyaXhbMTNdID0gMC4wO1xyXG4gICAgbWF0cml4WzE0XSA9IDAuMDtcclxuICAgIG1hdHJpeFsxNV0gPSAxLjA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBRdWF0ZXJuaW9uVG9NYXRyaXhEKFxyXG4gICAgcXVhdGVybmlvbjogRmxvYXQ2NEFycmF5LFxyXG4gICAgbWF0cml4OiBGbG9hdDY0QXJyYXlcclxuICApIHtcclxuICAgIGxldCBzLCB4cywgeXMsIHpzLCB3eCwgd3ksIHd6LCB4eCwgeHksIHh6LCB5eSwgeXosIHp6OiBudW1iZXI7XHJcbiAgICBsZXQgWCA9IDA7XHJcbiAgICBsZXQgWSA9IDE7XHJcbiAgICBsZXQgWiA9IDI7XHJcbiAgICBsZXQgVyA9IDM7XHJcblxyXG4gICAgcyA9XHJcbiAgICAgIDIuMCAvXHJcbiAgICAgIChxdWF0ZXJuaW9uW1hdICogcXVhdGVybmlvbltYXSArXHJcbiAgICAgICAgcXVhdGVybmlvbltZXSAqIHF1YXRlcm5pb25bWV0gK1xyXG4gICAgICAgIHF1YXRlcm5pb25bWl0gKiBxdWF0ZXJuaW9uW1pdICtcclxuICAgICAgICBxdWF0ZXJuaW9uW1ddICogcXVhdGVybmlvbltXXSk7XHJcblxyXG4gICAgeHMgPSBxdWF0ZXJuaW9uW1hdICogcztcclxuICAgIHlzID0gcXVhdGVybmlvbltZXSAqIHM7XHJcbiAgICB6cyA9IHF1YXRlcm5pb25bWl0gKiBzO1xyXG4gICAgd3ggPSBxdWF0ZXJuaW9uW1ddICogeHM7XHJcbiAgICB3eSA9IHF1YXRlcm5pb25bV10gKiB5cztcclxuICAgIHd6ID0gcXVhdGVybmlvbltXXSAqIHpzO1xyXG4gICAgeHggPSBxdWF0ZXJuaW9uW1hdICogeHM7XHJcbiAgICB4eSA9IHF1YXRlcm5pb25bWF0gKiB5cztcclxuICAgIHh6ID0gcXVhdGVybmlvbltYXSAqIHpzO1xyXG4gICAgeXkgPSBxdWF0ZXJuaW9uW1ldICogeXM7XHJcbiAgICB5eiA9IHF1YXRlcm5pb25bWV0gKiB6cztcclxuICAgIHp6ID0gcXVhdGVybmlvbltaXSAqIHpzO1xyXG5cclxuICAgIG1hdHJpeFswXSA9IDEuMCAtICh5eSArIHp6KTtcclxuICAgIG1hdHJpeFsxXSA9IHh5ICsgd3o7XHJcbiAgICBtYXRyaXhbMl0gPSB4eiAtIHd5O1xyXG4gICAgbWF0cml4WzNdID0gMC4wO1xyXG5cclxuICAgIG1hdHJpeFs0XSA9IHh5IC0gd3o7XHJcbiAgICBtYXRyaXhbNV0gPSAxLjAgLSAoeHggKyB6eik7XHJcbiAgICBtYXRyaXhbNl0gPSB5eiArIHd4O1xyXG4gICAgbWF0cml4WzddID0gMC4wO1xyXG5cclxuICAgIG1hdHJpeFs4XSA9IHh6ICsgd3k7XHJcbiAgICBtYXRyaXhbOV0gPSB5eiAtIHd4O1xyXG4gICAgbWF0cml4WzEwXSA9IDEuMCAtICh4eCArIHl5KTtcclxuICAgIG1hdHJpeFsxMV0gPSAwLjA7XHJcblxyXG4gICAgbWF0cml4WzEyXSA9IDAuMDtcclxuICAgIG1hdHJpeFsxM10gPSAwLjA7XHJcbiAgICBtYXRyaXhbMTRdID0gMC4wO1xyXG4gICAgbWF0cml4WzE1XSA9IDEuMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgYnJvd3NlclR5cGUoKTogc3RyaW5nIHtcclxuICAgIGxldCBleHBsb3JlciA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LFxyXG4gICAgICBjb21wYXJlID0gZnVuY3Rpb24gKHMpIHtcclxuICAgICAgICByZXR1cm4gZXhwbG9yZXIuaW5kZXhPZihzKSA+PSAwO1xyXG4gICAgICB9LFxyXG4gICAgICBpZTExID0gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gXCJBY3RpdmVYT2JqZWN0XCIgaW4gd2luZG93O1xyXG4gICAgICB9KSgpO1xyXG4gICAgaWYgKGNvbXBhcmUoXCJNU0lFXCIpIHx8IGllMTEpIHtcclxuICAgICAgcmV0dXJuIFwiaWVcIjtcclxuICAgIH0gZWxzZSBpZiAoY29tcGFyZShcIkVkZ2VcIikgJiYgIWllMTEpIHtcclxuICAgICAgcmV0dXJuIFwiRWRnZVwiO1xyXG4gICAgfSBlbHNlIGlmIChjb21wYXJlKFwiRmlyZWZveFwiKSAmJiAhaWUxMSkge1xyXG4gICAgICByZXR1cm4gXCJGaXJlZm94XCI7XHJcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmUoXCJDaHJvbWVcIikgJiYgIWllMTEpIHtcclxuICAgICAgcmV0dXJuIFwiQ2hyb21lXCI7XHJcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmUoXCJPcGVyYVwiKSAmJiAhaWUxMSkge1xyXG4gICAgICByZXR1cm4gXCJPcGVyYVwiO1xyXG4gICAgfSBlbHNlIGlmIChjb21wYXJlKFwiU2FmYXJpXCIpICYmICFpZTExKSB7XHJcbiAgICAgIHJldHVybiBcIlNhZmFyaVwiO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IHtcclxuICBKU19Jbml0X0FwaXMsXHJcbiAgSlNfSW5pdF9EYXRhYmFzZSxcclxuICBKU19GaW5hX0RhdGFiYXNlLFxyXG4gIEpTX0luaXRfTXVsdGl0aHJlYWRpbmdfU2VydmljZXMsXHJcbiAgSlNfRmluYV9NdWx0aXRocmVhZGluZ19TZXJ2aWNlcyxcclxuICBKU19PcGVuX1NlZ21lbnQsXHJcbiAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSxcclxuICBKU19DbG9zZV9TZWdtZW50LFxyXG4gIEpTX0RlbGV0ZV9TZWdtZW50LFxyXG4gIEpTX0RlbGV0ZV9TZWdtZW50X0J5X0tleSxcclxuICBKU19EZWxldGVfQnlfS2V5LFxyXG4gIEpTX0NsZWFyX0dlb21ldHJ5LFxyXG4gIEpTX0NsZWFyX0dlb21ldHJ5X0J5X0tleSxcclxuICBKU19DbGVhcl9BdHRyaWJ1dGVzLFxyXG4gIEpTX0NsZWFyX0F0dHJpYnV0ZXNfQnlfS2V5LFxyXG4gIEpTX0NsZWFyX0luY2x1ZGVzLFxyXG4gIEpTX0NsZWFyX0luY2x1ZGVzX0J5X0tleSxcclxuICBKU19DbGVhcl9TdHlsZXMsXHJcbiAgSlNfQ2xlYXJfU3R5bGVzX0J5X0tleSxcclxuICBKU19DbGVhcl9TdWJzZWdtZW50cyxcclxuICBKU19DbGVhcl9TdWJzZWdtZW50c19CeV9LZXksXHJcbiAgSlNfQ2xlYXJfQWxsLFxyXG4gIEpTX0NsZWFyX0FsbF9CeV9LZXksXHJcbiAgSlNfSW5jbHVkZV9TZWdtZW50X0J5X0tleSxcclxuICBKU19Db25kaXRpb25hbF9JbmNsdWRlX0J5X0tleSxcclxuICBKU19TdHlsZV9TZWdtZW50X0J5X0tleSxcclxuICBKU19Db25kaXRpb25hbF9TdHlsZV9CeV9LZXksXHJcbiAgSlNfTWFrZV9Db250ZXh0X0N1cnJlbnQsXHJcbiAgSlNfVXBkYXRlX0Rpc3BsYXksXHJcbiAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXksXHJcbiAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9XaXRoX0ZyYW1lcmF0ZV9CeV9LZXksXHJcbiAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9XaXRoX1RpbWVfQnlfS2V5LFxyXG4gIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5LFxyXG4gIC8vIEpTX0FzeW5fVXBkYXRlX1BhcnRpYWxfR2VvbWV0cnlfRGF0YV9CeV9LZXksXHJcbiAgSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHQsXHJcbiAgLy8gSlNfQXN5bl9VcGRhdGVfUGFydGlhbF9HZW9tZXRyeV9EYXRhX0J5X0tleV9UdCxcclxuICAvLyBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9CeV9LZXksXHJcbiAgSlNfQXN5bl9OZWVkX1VwZGF0ZV9WaWV3X0J5X0tleSxcclxuICBKU19Bc3luX1VwZGF0ZV9DYW1lcmFfQnlfS2V5LFxyXG4gIEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5LFxyXG4gIEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5X1R0LFxyXG4gIEpTX0FzeW5fUmVuZGVyX1ZpZXdfQnlfS2V5LFxyXG4gIEpTX0FzeW5fUmVuZGVyX1ZpZXdfV2l0aF9UaW1lX0J5X0tleSxcclxuICBKU19TaG93X0FzeW5fR2VvbWV0cnlfRGF0YV9LZXlzLFxyXG4gIEpTX1Nob3dfQXN5bl9SZW1vdmVfR2VvbWV0cnlfRGF0YV9LZXlzLFxyXG4gIEpTX1Nob3dfQXN5bl9CdWZmZXJfR2VvbWV0cnlfS2V5cyxcclxuICBKU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXksXHJcbiAgSlNfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5X1R0LFxyXG4gIC8vIEpTX1Nob3dfQXN5bl9VcGRhdGVfR2VvbWV0cnlfQ291bnQsXHJcbiAgLy8gSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnksXHJcbiAgSlNfU2hvd19LZXlfVHlwZSxcclxuICBKU19TaG93X0tleV9UYWcsXHJcbiAgSlNfU2hvd19Pd25lcl9CeV9LZXksXHJcbiAgSlNfQ29tcHV0ZV9QYXRoLFxyXG4gIEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5LFxyXG4gIEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfUGF0aCxcclxuICBKU19TaG93X0JvdW5kaW5nQm94X0J5X0tleSxcclxuICBKU19Db21wdXRlX0JvdW5kaW5nYm94X0J5X0tleSxcclxuICBKU19Db21wdXRlX0JvdW5kaW5nYm94X1dpdGhfVmlzaWJpbGl0eV9CeV9LZXksXHJcbiAgSlNfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94X0J5X0tleSxcclxuICBKU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hfQnlfS2V5cyxcclxuICBKU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hlc19CeV9LZXlzLFxyXG4gIEpTX0NvbXB1dGVfU2VnbWVudF9Cb3VuZGluZ2JveF9CeV9LZXksXHJcbiAgSlNfQ2xlYXJfU2VnbWVudF9Cb3VuZGluZ2JveF9CeV9LZXksXHJcbiAgSlNfQ29tcHV0ZV9WaXNpYmxlX0J5X0tleSxcclxuICBKU19TaG93X0F0dHJpYnV0ZV9Db3VudCxcclxuICBKU19TaG93X0F0dHJpYnV0ZV9MaXN0LFxyXG4gIEpTX1Nob3dfR2VvbWV0cnlfQ291bnQsXHJcbiAgSlNfU2hvd19HZW9tZXRyeV9MaXN0LFxyXG4gIEpTX1Nob3dfU3Vic2VnbWVudF9Db3VudCxcclxuICBKU19TaG93X1N1YnNlZ21lbnRfTGlzdCxcclxuICBKU19TaG93X0FsbF9TdWJzZWdtZW50X0NvdW50LFxyXG4gIEpTX1Nob3dfQWxsX1N1YnNlZ21lbnRfTGlzdCxcclxuICBKU19TaG93X0luY2x1ZGVfQ291bnQsXHJcbiAgSlNfU2hvd19JbmNsdWRlX0xpc3QsXHJcbiAgSlNfU2hvd19JbmNsdWRlLFxyXG4gIEpTX1Nob3dfSW5jbHVkZV9TZWdtZW50LFxyXG4gIEpTX1Nob3dfU3R5bGVfQ291bnQsXHJcbiAgSlNfU2hvd19TdHlsZV9MaXN0LFxyXG4gIEpTX1Nob3dfU3R5bGUsXHJcbiAgSlNfU2hvd19TdHlsZV9TZWdtZW50LFxyXG4gIEpTX1Nob3dfU2VnbWVudF9OYW1lLFxyXG4gIEpTX1Nob3dfU2VnbWVudF9QYXRoLFxyXG4gIEpTX1NlZ21lbnRfRXhpc3RzLFxyXG4gIEpTX01vdmVfS2V5LFxyXG4gIEpTX01vdmVfS2V5X0J5X0tleSxcclxuICBKU19SZW5hbWVfU2VnbWVudCxcclxuICBKU19BZGRfUHJvcGVydHlfQm9vbGVhbixcclxuICBKU19BZGRfUHJvcGVydHlfSW50ZWdlcixcclxuICBKU19BZGRfUHJvcGVydHlfRG91YmxlLFxyXG4gIEpTX0FkZF9Qcm9wZXJ0eV9TdHJpbmcsXHJcbiAgSlNfQWRkX1Byb3BlcnR5X0pzb24sXHJcbiAgSlNfU2hvd19Qcm9wZXJ0eV9UeXBlLFxyXG4gIEpTX1Nob3dfUHJvcGVydHlfQm9vbGVhbixcclxuICBKU19TaG93X1Byb3BlcnR5X0ludGVnZXIsXHJcbiAgSlNfU2hvd19Qcm9wZXJ0eV9Eb3VibGUsXHJcbiAgLy8gSlNfU2hvd19Qcm9wZXJ0eV9TdHJpbmdfTGVuZ3RoLFxyXG4gIEpTX1Nob3dfUHJvcGVydHlfU3RyaW5nLFxyXG4gIEpTX1Byb3BlcnR5X0V4aXN0cyxcclxuICBKU19SZW1vdmVfUHJvcGVydHksXHJcbiAgSlNfQ2xlYXJfUHJvcGVydGllcyxcclxuICBKU19TaG93X1Byb3BlcnRpZXMsXHJcbiAgSlNfU2hvd19LZXlfQnlfSWQsXHJcbiAgSlNfU2V0X0tleV9JbmRleCxcclxuICBKU19TaG93X0tleV9JbmRleCxcclxuICBKU19Db21wdXRlX1NlbGVjdGlvbl9CeV9LZXksXHJcbiAgSlNfQ29tcHV0ZV9TZWxlY3Rpb25fQnlfQXJlYSxcclxuICBKU19TaG93X1NlbGVjdGlvbl9Db3VudCxcclxuICBKU19TaG93X1NlbGVjdGlvbl9FbGVtZW50LFxyXG4gIEpTX1Nob3dfU2VsZWN0aW9uX1BhdGgsXHJcbiAgSlNfU2hvd19TZWxlY3Rpb25fUGF0aF9CeV9LZXlzLFxyXG4gIEpTX1Nob3dfU2VsZWN0aW9uX1Bvc2l0aW9uLFxyXG4gIEpTX1Nob3dfU2VsZWN0aW9uX1BhcmFtLFxyXG4gIEpTX1Nob3dfU2VsZWN0aW9uX0luZGV4ZXMsXHJcbiAgSlNfU2hvd19TZWxlY3Rpb25fVGVzdF9JbmZvLFxyXG4gIEpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleXMsXHJcbiAgSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5LFxyXG4gIEpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleXNfVHQsXHJcbiAgSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5X1R0LFxyXG4gIEpTX1Nob3dfQ29sbGlzaW9uX1N0YXR1cyxcclxuICBKU19TaG93X0NvbGxpc2lvbl9Db3VudCxcclxuICBKU19TaG93X0NvbGxpc2lvbl9FbGVtZW50cyxcclxuICBKU19TaG93X0NvbGxpc2lvbl9QYXRocyxcclxuICBKU19TaG93X0NvbGxpc2lvbl9QYXRoX0J5X0tleXMsXHJcbiAgSlNfU2hvd19Db2xsaXNpb25fUG9zaXRpb24sXHJcbiAgSlNfU2hvd19Db2xsaXNpb25fVHlwZSxcclxuICBKU19BZGRfRm9udF9MaWJyYXJ5LFxyXG4gIEpTX0ZvbnRfTGlicmFyeV9FeGlzdHMsXHJcbiAgSlNfUmVtb3ZlX0ZvbnRfTGlicmFyeSxcclxuICBKU19DbGVhcl9Gb250X0xpYnJhcnksXHJcbiAgSlNfU2V0X0RyaXZlcl9Db25maWdzLFxyXG4gIEpTX1NldF9Ecml2ZXJfT3B0aW9ucyxcclxuICBKU19TaG93X0RyaXZlcl9PcHRpb25zLFxyXG4gIEpTX1Nob3dfT25lX0RyaXZlcl9PcHRpb24sXHJcbiAgSlNfU2V0X1NoYWRlcixcclxuICBKU19VblNldF9TaGFkZXIsXHJcbiAgSlNfU2hvd19TaGFkZXIsXHJcbiAgSlNfU2hvd19PbmVfU2hhZGVyLFxyXG4gIEpTX1NldF9WaWV3cG9ydCxcclxuICBKU19TZXRfQ2FtZXJhLFxyXG4gIEpTX1NldF9DYW1lcmFfUG9zaXRpb24sXHJcbiAgSlNfU2V0X0NhbWVyYV9UYXJnZXQsXHJcbiAgSlNfU2V0X0NhbWVyYV9VcCxcclxuICBKU19TZXRfQ2FtZXJhX0ZpZWxkLFxyXG4gIEpTX1NldF9DYW1lcmFfRXh0ZW50LFxyXG4gIEpTX1NldF9DYW1lcmFfUHJvamVjdGlvbixcclxuICBKU19LZWVwX0NhbWVyYV9SYXRpbyxcclxuICBKU19TaG93X0NhbWVyYSxcclxuICBKU19TaG93X0NhbWVyYV9Qb3NpdGlvbixcclxuICBKU19TaG93X0NhbWVyYV9UYXJnZXQsXHJcbiAgSlNfU2hvd19DYW1lcmFfVXAsXHJcbiAgSlNfU2hvd19DYW1lcmFfRmllbGQsXHJcbiAgSlNfU2hvd19DYW1lcmFfRXh0ZW50LFxyXG4gIEpTX1Nob3dfQ2FtZXJhX1Byb2plY3Rpb24sXHJcbiAgSlNfU2hvd19DYW1lcmFfUHJvamVjdGlvbl9NYXRyaXgsXHJcbiAgSlNfU2hvd19DYW1lcmFfVmlld19NYXRyaXgsXHJcbiAgSlNfU2hvd19QYXRoX0NhbWVyYV9Qb3NpdGlvbixcclxuICBKU19TaG93X1BhdGhfQ2FtZXJhX1RhcmdldCxcclxuICBKU19Eb2xseV9DYW1lcmEsXHJcbiAgSlNfUm9sbF9DYW1lcmEsXHJcbiAgSlNfWm9vbV9DYW1lcmEsXHJcbiAgSlNfVW5TZXRfQ2FtZXJhLFxyXG4gIEpTX1NldF9Db2xvcixcclxuICBKU19VblNldF9Db2xvcixcclxuICBKU19VblNldF9PbmVfQ29sb3IsXHJcbiAgSlNfU2hvd19Db2xvcixcclxuICBKU19TaG93X09uZV9Db2xvcixcclxuICBKU19TaG93X0NvbG9yX0J5X1ZhbHVlLFxyXG4gIEpTX1NldF9HZW9tZXRyeV9Db2xvcixcclxuICBKU19TZXRfR2VvbWV0cnlfQ29sb3JfQnlfVmFsdWUsXHJcbiAgSlNfU2hvd19HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZSxcclxuICBKU19VblNldF9HZW9tZXRyeV9Db2xvcixcclxuICBKU19TZXRfVmlzaWJpbGl0eSxcclxuICBKU19VblNldF9WaXNpYmlsaXR5LFxyXG4gIEpTX1VuU2V0X09uZV9WaXNpYmlsaXR5LFxyXG4gIEpTX1Nob3dfVmlzaWJpbGl0eSxcclxuICBKU19TaG93X09uZV9WaXNpYmlsaXR5LFxyXG4gIEpTX1NldF9TZWxlY3RhYmlsaXR5LFxyXG4gIEpTX1VuU2V0X1NlbGVjdGFiaWxpdHksXHJcbiAgSlNfVW5TZXRfT25lX1NlbGVjdGFiaWxpdHksXHJcbiAgSlNfU2hvd19TZWxlY3RhYmlsaXR5LFxyXG4gIEpTX1Nob3dfT25lX1NlbGVjdGFiaWxpdHksXHJcbiAgSlNfU2V0X01vZGVsbGluZ01hdHJpeCxcclxuICBKU19BcHBlbmRfTW9kZWxsaW5nTWF0cml4LFxyXG4gIEpTX1Nob3dfTW9kZWxsaW5nTWF0cml4LFxyXG4gIEpTX1Nob3dfUGF0aF9Nb2RlbGxpbmdNYXRyaXgsXHJcbiAgSlNfVW5TZXRfTW9kZWxsaW5nTWF0cml4LFxyXG4gIEpTX1NldF9SZW5kZXJpbmdfT3B0aW9ucyxcclxuICBKU19VblNldF9SZW5kZXJpbmdfT3B0aW9ucyxcclxuICBKU19VblNldF9PbmVfUmVuZGVyaW5nX09wdGlvbixcclxuICBKU19TaG93X1JlbmRlcmluZ19PcHRpb25zLFxyXG4gIEpTX1Nob3dfT25lX1JlbmRlcmluZ19PcHRpb24sXHJcbiAgSlNfU2hvd19PbmVfRGVmYXVsdF9SZW5kZXJpbmdfT3B0aW9uLFxyXG4gIEpTX1Nob3dfT25lX1BhdGhfUmVuZGVyaW5nX09wdGlvbixcclxuICBKU19TZXRfSGV1cmlzdGljX09wdGlvbnMsXHJcbiAgSlNfU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uLFxyXG4gIEpTX1VuU2V0X0hldXJpc3RpY19PcHRpb25zLFxyXG4gIEpTX1VuU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uLFxyXG4gIEpTX1Nob3dfSGV1cmlzdGljX09wdGlvbnMsXHJcbiAgSlNfU2hvd19PbmVfSGV1cmlzdGljX09wdGlvbixcclxuICBKU19TZXRfQ29uZGl0aW9uLFxyXG4gIEpTX1Nob3dfQ29uZGl0aW9uLFxyXG4gIEpTX1VuU2V0X0NvbmRpdGlvbixcclxuICBKU19TZXRfVGV4dF9Gb250LFxyXG4gIEpTX1VuU2V0X1RleHRfRm9udCxcclxuICBKU19VblNldF9PbmVfVGV4dF9Gb250LFxyXG4gIEpTX1Nob3dfVGV4dF9Gb250LFxyXG4gIEpTX1Nob3dfT25lX1RleHRfRm9udCxcclxuICBKU19BdHRyaWJ1dGVfRXhpc3RzLFxyXG4gIEpTX0ltYWdlX0V4aXN0cyxcclxuICBKU19SZXNpemVfQnlfS2V5LFxyXG4gIEpTX0luc2VydF9NYXJrZXIsXHJcbiAgSlNfRWRpdF9NYXJrZXIsXHJcbiAgSlNfU2hvd19NYXJrZXIsXHJcbiAgSlNfSW5zZXJ0X1BvaW50X0Nsb3VkLFxyXG4gIEpTX0VkaXRfUG9pbnRfQ2xvdWQsXHJcbiAgSlNfU2hvd19Qb2ludF9DbG91ZCxcclxuICBKU19JbnNlcnRfTGluZSxcclxuICBKU19FZGl0X0xpbmUsXHJcbiAgSlNfU2hvd19MaW5lLFxyXG4gIEpTX0luc2VydF9Qb2x5bGluZSxcclxuICBKU19TaG93X1BvbHlsaW5lX0NvdW50LFxyXG4gIEpTX1Nob3dfUG9seWxpbmUsXHJcbiAgSlNfSW5zZXJ0X0NpcmNsZSxcclxuICBKU19TaG93X0NpcmNsZSxcclxuICBKU19JbnNlcnRfQ3lsaW5kZXIsXHJcbiAgSlNfU2hvd19DeWxpbmRlcixcclxuICBKU19JbnNlcnRfUG9seUN5bGluZGVyLFxyXG4gIEpTX0VkaXRfUG9seUN5bGluZGVyLFxyXG4gIEpTX0luc2VydF9TaGVsbCxcclxuICBKU19FZGl0X1NoZWxsLFxyXG4gIEpTX1Nob3dfU2hlbGxfU2l6ZSxcclxuICBKU19TaG93X1NoZWxsLFxyXG4gIEpTX0luc2VydF9Ucmlhbmd1bGFyX1NoZWxsLFxyXG4gIEpTX0luc2VydF9NZXNoLFxyXG4gIEpTX0VkaXRfTWVzaF9Qb2ludHMsXHJcbiAgSlNfU2hvd19NZXNoX1NpemUsXHJcbiAgSlNfU2hvd19NZXNoLFxyXG4gIEpTX0luc2VydF9WZWN0b3JfVGV4dCxcclxuICBKU19JbnNlcnRfUGFyYW1ldHJpY19HZW9tZXRyeSxcclxuICBKU19FZGl0X1BhcmFtZXRyaWNfR2VvbWV0cnksXHJcbiAgSlNfU2hvd19QYXJhbWV0cmljX0dlb21ldHJ5LFxyXG4gIEpTX0luc2VydF9QYXJhbWV0cmljX0dlb21ldHJpZXMsXHJcbiAgSlNfSW5zZXJ0X0xpZ2h0LFxyXG4gIEpTX0VkaXRfTGlnaHQsXHJcbiAgSlNfU2hvd19MaWdodCxcclxuICBKU19JbnNlcnRfSW1hZ2UsXHJcbiAgSlNfU2V0X0ltYWdlX09wdGlvbnMsXHJcbiAgSlNfVW5TZXRfT25lX0ltYWdlX09wdGlvbixcclxuICBKU19TaG93X0ltYWdlX1Bvc2l0aW9uLFxyXG4gIEpTX1Nob3dfSW1hZ2VfU2l6ZSxcclxuICBKU19TaG93X0ltYWdlX0RhdGEsXHJcbiAgSlNfU2hvd19JbWFnZV9PcHRpb25zLFxyXG4gIEpTX1Nob3dfT25lX0ltYWdlX09wdGlvbixcclxuICBKU19TaG93X0ltYWdlLFxyXG4gIEpTX0luc2VydF9DdXR0aW5nX1BsYW5lcyxcclxuICBKU19FZGl0X0N1dHRpbmdfUGxhbmVzLFxyXG4gIEpTX1Nob3dfQ3V0dGluZ19QbGFuZXMsXHJcbiAgSlNfU2hvd19HZW9tZXRyeV9WZXJ0aWNlc19Qb3NpdGlvbl9CeV9JbmRleGVzLFxyXG4gIEpTX1Nob3dfR2VvbWV0cnlfRWxlbWVudF9UeXBlLFxyXG4gIEpTX1NldF9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyxcclxuICBKU19TaG93X0dlb21ldHJ5X1RleHR1cmVfRGltZW5zaW9uLFxyXG4gIEpTX1Nob3dfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMsXHJcbiAgSlNfVW5TZXRfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMsXHJcbiAgSlNfQ29tcHV0ZV9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyxcclxuICBKU19TZXRfR2VvbWV0cnlfTm9ybWFscyxcclxuICBKU19TaG93X0dlb21ldHJ5X05vcm1hbHMsXHJcbiAgSlNfVW5TZXRfR2VvbWV0cnlfTm9ybWFscyxcclxuICBKU19Db21wdXRlX0dlb21ldHJ5X1Rlc3NlbGxhdGVfRGF0YSxcclxuICBKU19Db21wdXRlX0dlb21ldHJ5X0RhdGEsXHJcbiAgSlNfTWVyZ2VfU2hlbGwsXHJcbiAgSlNfRXh0cnVkZV9CeV9TaGVsbCxcclxuICBKU19Td2VlcF9CeV9TaGVsbCxcclxuICBKU19EU3dlZXBfQnlfU2hlbGwsXHJcbiAgSlNfREV4dHJ1ZGVfQnlfU2hlbGwsXHJcbiAgSlNfUm90YXRlX0J5X1NoZWxsLFxyXG4gIEpTX0RSb3RhdGVfQnlfU2hlbGwsXHJcbiAgSlNfQ29tcHV0ZV9SYXlfVGVzdCxcclxuICBKU19Db21wdXRlX0dlb21ldHJ5X1JheV9UZXN0LFxyXG4gIEpTX0NvbXB1dGVfQm94X1Rlc3QsXHJcbiAgSlNfQ29tcHV0ZV9Qb2x5Z29uX0FyZWEsXHJcbiAgSlNfQ29tcHV0ZV9BcmVhLFxyXG4gIEpTX0NvbXB1dGVfVm9sdW1lLFxyXG4gIEpTX0lzX1NvbGlkX0dlb21ldHJ5LFxyXG4gIEpTX0NvbXB1dGVfR2VvbWV0cnlfRGlzdGFuY2UsXHJcbiAgSlNfU2VnbWVudF9Ub19TdHJlYW0sXHJcbiAgSlNfU2VnbWVudF9Ub19TdHJlYW1fQnlfS2V5LFxyXG4gIEpTX1NlZ21lbnRfVG9fU3RyZWFtX1dpdGhfQ29tcHJlc3Npb24sXHJcbiAgSlNfU2VnbWVudF9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbl9CeV9LZXksXHJcbiAgSlNfU3RyZWFtX1RvX1NlZ21lbnQsXHJcbiAgSlNfU3RyZWFtX1RvX1NlZ21lbnRfQnlfS2V5LFxyXG4gIEpTX1N0cmVhbV9Ub19TZWdtZW50X0J5X0tleV9UdCxcclxuICBKU19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbl9Ub19TZWdtZW50X0J5X0tleSxcclxuICBKU19TZWdtZW50X0RhdGFfVG9fU3RyZWFtLFxyXG4gIEpTX1N0cmVhbV9Ub19TZWdtZW50X0RhdGEsXHJcbiAgSlNfR2VvbWV0cnlfRGF0YV9Ub19TdHJlYW0sXHJcbiAgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGEsXHJcbiAgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5LFxyXG4gIEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXMsXHJcbiAgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5c19UdCxcclxuICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9XaXRoX0NvbXByZXNzaW9uLFxyXG4gIEpTX0NvcHlfU2VnbWVudF9CeV9LZXksXHJcbiAgSlNfU2hvd19EYXRhYmFzZV9JbmZvLFxyXG4gIEpTX1Nob3dfQWxsb2NhdGVkX01lbW9yeV9TaXplLFxyXG4gIEpTX0V4ZWN1dGVfVGFza19Qb3N0X1Byb2Nlc3NpbmcsXHJcbiAgSlNfQ3JlYXRlX1RleHR1cmUsXHJcbiAgSlNfQm9vbGVhbl9JbnRlcnNlY3Rpb25fR3JhcGgsXHJcbiAgSlNfQm9vbGVhbl9JbnRlcnNlY3RfUG9seWxpbmVfUG9seWdvbl9YeSxcclxuICBKU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5Z29uX1BvbHlnb25fWHksXHJcbiAgSlNfQm9vbGVhbl9JbnRlcnNlY3RfR3JhcGhfUG9seWdvbl9YeSxcclxuICBKU19Cb29sZWFuX1N1YnRyYWN0X1BvbHlnb25fUG9seWdvbl9YeSxcclxuICBKU19Cb29sZWFuX0N1dF9Qb2x5Z29uX1BvbHlnb25fWHksXHJcbiAgSlNfQm9vbGVhbl9TdWJ0cmFjdCxcclxuICBKU19GZWF0dXJlX0V4dHJ1ZGUsXHJcbiAgSlNfUGxhbmFyX1BvbHlsaW5lX09mZnNldCxcclxufTtcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./packages/longan/src/longan/gs.viewer.ts\n");
5627
+ eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;__webpack_require__(/*! core-js/modules/es.array.iterator.js */ \"./node_modules/core-js/modules/es.array.iterator.js\");\n__webpack_require__(/*! core-js/modules/es.array-buffer.slice.js */ \"./node_modules/core-js/modules/es.array-buffer.slice.js\");\n__webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.int32-array.js */ \"./node_modules/core-js/modules/es.typed-array.int32-array.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.at.js */ \"./node_modules/core-js/modules/es.typed-array.at.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.copy-within.js */ \"./node_modules/core-js/modules/es.typed-array.copy-within.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.every.js */ \"./node_modules/core-js/modules/es.typed-array.every.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.fill.js */ \"./node_modules/core-js/modules/es.typed-array.fill.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.filter.js */ \"./node_modules/core-js/modules/es.typed-array.filter.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.find.js */ \"./node_modules/core-js/modules/es.typed-array.find.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.find-index.js */ \"./node_modules/core-js/modules/es.typed-array.find-index.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.find-last.js */ \"./node_modules/core-js/modules/es.typed-array.find-last.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.find-last-index.js */ \"./node_modules/core-js/modules/es.typed-array.find-last-index.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.for-each.js */ \"./node_modules/core-js/modules/es.typed-array.for-each.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.includes.js */ \"./node_modules/core-js/modules/es.typed-array.includes.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.index-of.js */ \"./node_modules/core-js/modules/es.typed-array.index-of.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.iterator.js */ \"./node_modules/core-js/modules/es.typed-array.iterator.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.join.js */ \"./node_modules/core-js/modules/es.typed-array.join.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.last-index-of.js */ \"./node_modules/core-js/modules/es.typed-array.last-index-of.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.map.js */ \"./node_modules/core-js/modules/es.typed-array.map.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.reduce.js */ \"./node_modules/core-js/modules/es.typed-array.reduce.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.reduce-right.js */ \"./node_modules/core-js/modules/es.typed-array.reduce-right.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.reverse.js */ \"./node_modules/core-js/modules/es.typed-array.reverse.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.set.js */ \"./node_modules/core-js/modules/es.typed-array.set.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.slice.js */ \"./node_modules/core-js/modules/es.typed-array.slice.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.some.js */ \"./node_modules/core-js/modules/es.typed-array.some.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.sort.js */ \"./node_modules/core-js/modules/es.typed-array.sort.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.subarray.js */ \"./node_modules/core-js/modules/es.typed-array.subarray.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.to-locale-string.js */ \"./node_modules/core-js/modules/es.typed-array.to-locale-string.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.to-string.js */ \"./node_modules/core-js/modules/es.typed-array.to-string.js\");\n__webpack_require__(/*! core-js/modules/esnext.typed-array.to-reversed.js */ \"./node_modules/core-js/modules/esnext.typed-array.to-reversed.js\");\n__webpack_require__(/*! core-js/modules/esnext.typed-array.to-sorted.js */ \"./node_modules/core-js/modules/esnext.typed-array.to-sorted.js\");\n__webpack_require__(/*! core-js/modules/esnext.typed-array.with.js */ \"./node_modules/core-js/modules/esnext.typed-array.with.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.float32-array.js */ \"./node_modules/core-js/modules/es.typed-array.float32-array.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.float64-array.js */ \"./node_modules/core-js/modules/es.typed-array.float64-array.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.int8-array.js */ \"./node_modules/core-js/modules/es.typed-array.int8-array.js\");\n__webpack_require__(/*! core-js/modules/es.typed-array.uint8-array.js */ \"./node_modules/core-js/modules/es.typed-array.uint8-array.js\");\n__webpack_require__(/*! core-js/modules/es.array-buffer.constructor.js */ \"./node_modules/core-js/modules/es.array-buffer.constructor.js\");\n__webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");\n__webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n__webpack_require__(/*! core-js/modules/es.number.constructor.js */ \"./node_modules/core-js/modules/es.number.constructor.js\");\n__webpack_require__(/*! core-js/modules/es.json.stringify.js */ \"./node_modules/core-js/modules/es.json.stringify.js\");\n__webpack_require__(/*! core-js/modules/es.array.slice.js */ \"./node_modules/core-js/modules/es.array.slice.js\");\n__webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ \"./node_modules/core-js/modules/es.regexp.to-string.js\");\n__webpack_require__(/*! core-js/modules/es.number.to-fixed.js */ \"./node_modules/core-js/modules/es.number.to-fixed.js\");\n__webpack_require__(/*! core-js/modules/es.promise.js */ \"./node_modules/core-js/modules/es.promise.js\");\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! tslib */ \"./node_modules/tslib/tslib.es6.js\"), __webpack_require__(/*! ../process */ \"./packages/longan/src/process.ts\"), __webpack_require__(/*! ../utils/cookie */ \"./packages/longan/src/utils/cookie.ts\"), __webpack_require__(/*! ./gs.collections */ \"./packages/longan/src/longan/gs.collections.ts\"), __webpack_require__(/*! ./gs.math */ \"./packages/longan/src/longan/gs.math.ts\"), __webpack_require__(/*! ./idb */ \"./packages/longan/src/longan/idb.ts\"), __webpack_require__(/*! ./segment */ \"./packages/longan/src/longan/segment.ts\"), __webpack_require__(/*! ./utility */ \"./packages/longan/src/longan/utility.ts\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, tslib_1, process_1, cookie_1, gs_collections_1, gs_math_1, idb_1, segment_1, utility_1) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", ({\n value: true\n }));\n exports.JS_Planar_Polyline_Offset = exports.JS_Feature_Extrude = exports.JS_Boolean_Subtract = exports.JS_Boolean_Cut_Polygon_Polygon_Xy = exports.JS_Boolean_Subtract_Polygon_Polygon_Xy = exports.JS_Boolean_Intersect_Graph_Polygon_Xy = exports.JS_Boolean_Intersect_Polygon_Polygon_Xy = exports.JS_Boolean_Intersect_Polyline_Polygon_Xy = exports.JS_Boolean_Intersection_Graph = exports.JS_Create_Texture = exports.JS_Execute_Task_Post_Processing = exports.JS_Show_Allocated_Memory_Size = exports.JS_Show_Database_Info = exports.JS_Copy_Segment_By_Key = exports.JS_Stream_To_Geometry_Data_With_Compression = exports.JS_Stream_To_Geometry_Data_By_Keys_Tt = exports.JS_Stream_To_Geometry_Data_By_Keys = exports.JS_Stream_To_Geometry_Data_By_Key = exports.JS_Stream_To_Geometry_Data = exports.JS_Geometry_Data_To_Stream = exports.JS_Stream_To_Segment_Data = exports.JS_Segment_Data_To_Stream = exports.JS_Stream_With_Compression_To_Segment_By_Key = exports.JS_Stream_To_Segment_By_Key_Tt = exports.JS_Stream_To_Segment_By_Key = exports.JS_Stream_To_Segment = exports.JS_Segment_To_Stream_With_Compression_By_Key = exports.JS_Segment_To_Stream_With_Compression = exports.JS_Segment_To_Stream_By_Key = exports.JS_Segment_To_Stream = exports.JS_Compute_Geometry_Distance = exports.JS_Is_Solid_Geometry = exports.JS_Compute_Volume = exports.JS_Compute_Area = exports.JS_Compute_Polygon_Area = exports.JS_Compute_Box_Test = exports.JS_Compute_Geometry_Ray_Test = exports.JS_Compute_Ray_Test = exports.JS_DRotate_By_Shell = exports.JS_Rotate_By_Shell = exports.JS_DExtrude_By_Shell = exports.JS_DSweep_By_Shell = exports.JS_Sweep_By_Shell = exports.JS_Extrude_By_Shell = exports.JS_Merge_Shell = exports.JS_Compute_Geometry_Data = exports.JS_Compute_Geometry_Tessellate_Data = exports.JS_UnSet_Geometry_Normals = exports.JS_Show_Geometry_Normals = exports.JS_Set_Geometry_Normals = exports.JS_Compute_Geometry_Texture_Coords = exports.JS_UnSet_Geometry_Texture_Coords = exports.JS_Show_Geometry_Texture_Coords = exports.JS_Show_Geometry_Texture_Dimension = exports.JS_Set_Geometry_Texture_Coords = exports.JS_Show_Geometry_Element_Type = exports.JS_Show_Geometry_Vertices_Position_By_Indexes = exports.JS_Show_Cutting_Planes = exports.JS_Edit_Cutting_Planes = exports.JS_Insert_Cutting_Planes = exports.JS_Show_Image = exports.JS_Show_One_Image_Option = exports.JS_Show_Image_Options = exports.JS_Show_Image_Data = exports.JS_Show_Image_Size = exports.JS_Show_Image_Position = exports.JS_UnSet_One_Image_Option = exports.JS_Set_Image_Options = exports.JS_Insert_Image = exports.JS_Show_Light = exports.JS_Edit_Light = exports.JS_Insert_Light = exports.JS_Insert_Parametric_Geometries = exports.JS_Show_Parametric_Geometry = exports.JS_Edit_Parametric_Geometry = exports.JS_Insert_Parametric_Geometry = exports.JS_Insert_Vector_Text = exports.JS_Show_Mesh = exports.JS_Show_Mesh_Size = exports.JS_Edit_Mesh_Points = exports.JS_Insert_Mesh = exports.JS_Insert_Triangular_Shell = exports.JS_Show_Shell = exports.JS_Show_Shell_Size = exports.JS_Edit_Shell = exports.JS_Insert_Shell = exports.JS_Edit_PolyCylinder = exports.JS_Insert_PolyCylinder = exports.JS_Show_Cylinder = exports.JS_Insert_Cylinder = exports.JS_Show_Circle = exports.JS_Insert_Circle = exports.JS_Show_Polyline = exports.JS_Show_Polyline_Count = exports.JS_Insert_Polyline = exports.JS_Show_Line = exports.JS_Edit_Line = exports.JS_Insert_Line = exports.JS_Show_Point_Cloud = exports.JS_Edit_Point_Cloud = exports.JS_Insert_Point_Cloud = exports.JS_Show_Marker = exports.JS_Edit_Marker = exports.JS_Insert_Marker = exports.JS_Resize_By_Key = exports.JS_Image_Exists = exports.JS_Attribute_Exists = exports.JS_Show_One_Text_Font = exports.JS_Show_Text_Font = exports.JS_UnSet_One_Text_Font = exports.JS_UnSet_Text_Font = exports.JS_Set_Text_Font = exports.JS_UnSet_Condition = exports.JS_Show_Condition = exports.JS_Set_Condition = exports.JS_Show_One_Heuristic_Option = exports.JS_Show_Heuristic_Options = exports.JS_UnSet_One_Heuristic_Option = exports.JS_UnSet_Heuristic_Options = exports.JS_Set_One_Heuristic_Option = exports.JS_Set_Heuristic_Options = exports.JS_Show_One_Path_Rendering_Option = exports.JS_Show_One_Default_Rendering_Option = exports.JS_Show_One_Rendering_Option = exports.JS_Show_Rendering_Options = exports.JS_UnSet_One_Rendering_Option = exports.JS_UnSet_Rendering_Options = exports.JS_Set_Rendering_Options = exports.JS_UnSet_ModellingMatrix = exports.JS_Show_Path_ModellingMatrix = exports.JS_Show_ModellingMatrix = exports.JS_Append_ModellingMatrix = exports.JS_Set_ModellingMatrix = exports.JS_Show_One_Selectability = exports.JS_Show_Selectability = exports.JS_UnSet_One_Selectability = exports.JS_UnSet_Selectability = exports.JS_Set_Selectability = exports.JS_Show_One_Visibility = exports.JS_Show_Visibility = exports.JS_UnSet_One_Visibility = exports.JS_UnSet_Visibility = exports.JS_Set_Visibility = exports.JS_UnSet_Geometry_Color = exports.JS_Show_Geometry_Color_By_Value = exports.JS_Set_Geometry_Color_By_Value = exports.JS_Set_Geometry_Color = exports.JS_Show_Color_By_Value = exports.JS_Show_One_Color = exports.JS_Show_Color = exports.JS_UnSet_One_Color = exports.JS_UnSet_Color = exports.JS_Set_Color = exports.JS_UnSet_Camera = exports.JS_Zoom_Camera = exports.JS_Roll_Camera = exports.JS_Dolly_Camera = exports.JS_Show_Path_Camera_Target = exports.JS_Show_Path_Camera_Position = exports.JS_Show_Camera_View_Matrix = exports.JS_Show_Camera_Projection_Matrix = exports.JS_Show_Camera_Projection = exports.JS_Show_Camera_Extent = exports.JS_Show_Camera_Field = exports.JS_Show_Camera_Up = exports.JS_Show_Camera_Target = exports.JS_Show_Camera_Position = exports.JS_Show_Camera = exports.JS_Keep_Camera_Ratio = exports.JS_Set_Camera_Projection = exports.JS_Set_Camera_Extent = exports.JS_Set_Camera_Field = exports.JS_Set_Camera_Up = exports.JS_Set_Camera_Target = exports.JS_Set_Camera_Position = exports.JS_Set_Camera = exports.JS_Set_Viewport = exports.JS_Show_One_Shader = exports.JS_Show_Shader = exports.JS_UnSet_Shader = exports.JS_Set_Shader = exports.JS_Show_One_Driver_Option = exports.JS_Show_Driver_Options = exports.JS_Set_Driver_Options = exports.JS_Set_Driver_Configs = exports.JS_Clear_Font_Library = exports.JS_Remove_Font_Library = exports.JS_Font_Library_Exists = exports.JS_Add_Font_Library = exports.JS_Show_Collision_Type = exports.JS_Show_Collision_Position = exports.JS_Show_Collision_Path_By_Keys = exports.JS_Show_Collision_Paths = exports.JS_Show_Collision_Elements = exports.JS_Show_Collision_Count = exports.JS_Show_Collision_Status = exports.JS_Compute_Collision_By_Key_Tt = exports.JS_Compute_Collision_By_Keys_Tt = exports.JS_Compute_Collision_By_Key = exports.JS_Compute_Collision_By_Keys = exports.JS_Show_Selection_Test_Info = exports.JS_Show_Selection_Indexes = exports.JS_Show_Selection_Param = exports.JS_Show_Selection_Position = exports.JS_Show_Selection_Path_By_Keys = exports.JS_Show_Selection_Path = exports.JS_Show_Selection_Element = exports.JS_Show_Selection_Count = exports.JS_Compute_Selection_By_Area = exports.JS_Compute_Selection_By_Key = exports.JS_Show_Key_Index = exports.JS_Set_Key_Index = exports.JS_Show_Key_By_Id = exports.JS_Show_Properties = exports.JS_Clear_Properties = exports.JS_Remove_Property = exports.JS_Property_Exists = exports.JS_Show_Property_String = exports.JS_Show_Property_Double = exports.JS_Show_Property_Integer = exports.JS_Show_Property_Boolean = exports.JS_Show_Property_Type = exports.JS_Add_Property_Json = exports.JS_Add_Property_String = exports.JS_Add_Property_Double = exports.JS_Add_Property_Integer = exports.JS_Add_Property_Boolean = exports.JS_Rename_Segment = exports.JS_Move_Key_By_Key = exports.JS_Move_Key = exports.JS_Segment_Exists = exports.JS_Show_Segment_Path = exports.JS_Show_Segment_Name = exports.JS_Show_Style_Segment = exports.JS_Show_Style = exports.JS_Show_Style_List = exports.JS_Show_Style_Count = exports.JS_Show_Include_Segment = exports.JS_Show_Include = exports.JS_Show_Include_List = exports.JS_Show_Include_Count = exports.JS_Show_All_Subsegment_List = exports.JS_Show_All_Subsegment_Count = exports.JS_Show_Subsegment_List = exports.JS_Show_Subsegment_Count = exports.JS_Show_Geometry_List = exports.JS_Show_Geometry_Count = exports.JS_Show_Attribute_List = exports.JS_Show_Attribute_Count = exports.JS_Compute_Visible_By_Key = exports.JS_Clear_Segment_Boundingbox_By_Key = exports.JS_Compute_Segment_Boundingbox_By_Key = exports.JS_Compute_View_Boundingboxes_By_Keys = exports.JS_Compute_View_Boundingbox_By_Keys = exports.JS_Compute_View_Boundingbox_By_Key = exports.JS_Compute_Boundingbox_With_Visibility_By_Key = exports.JS_Compute_Boundingbox_By_Key = exports.JS_Show_BoundingBox_By_Key = exports.JS_Compute_Coordinates_By_Path = exports.JS_Compute_Coordinates_By_Key = exports.JS_Compute_Path = exports.JS_Show_Owner_By_Key = exports.JS_Show_Key_Tag = exports.JS_Show_Key_Type = exports.JS_Asyn_Buffer_Geometry_By_Key_Tt = exports.JS_Asyn_Buffer_Geometry_By_Key = exports.JS_Show_Asyn_Buffer_Geometry_Keys = exports.JS_Show_Asyn_Remove_Geometry_Data_Keys = exports.JS_Show_Asyn_Geometry_Data_Keys = exports.JS_Asyn_Render_View_With_Time_By_Key = exports.JS_Asyn_Render_View_By_Key = exports.JS_Asyn_Update_View_By_Key_Tt = exports.JS_Asyn_Update_View_By_Key = exports.JS_Asyn_Update_Camera_By_Key = exports.JS_Asyn_Need_Update_View_By_Key = exports.JS_Asyn_Update_Geometry_Data_By_Key_Tt = exports.JS_Asyn_Update_Geometry_Data_By_Key = exports.JS_Update_View_Display_With_Time_By_Key = exports.JS_Update_View_Display_With_Framerate_By_Key = exports.JS_Update_View_Display_By_Key = exports.JS_Update_Display = exports.JS_Make_Context_Current = exports.JS_Conditional_Style_By_Key = exports.JS_Style_Segment_By_Key = exports.JS_Conditional_Include_By_Key = exports.JS_Include_Segment_By_Key = exports.JS_Clear_All_By_Key = exports.JS_Clear_All = exports.JS_Clear_Subsegments_By_Key = exports.JS_Clear_Subsegments = exports.JS_Clear_Styles_By_Key = exports.JS_Clear_Styles = exports.JS_Clear_Includes_By_Key = exports.JS_Clear_Includes = exports.JS_Clear_Attributes_By_Key = exports.JS_Clear_Attributes = exports.JS_Clear_Geometry_By_Key = exports.JS_Clear_Geometry = exports.JS_Delete_By_Key = exports.JS_Delete_Segment_By_Key = exports.JS_Delete_Segment = exports.JS_Close_Segment = exports.JS_Open_Segment_By_Key = exports.JS_Open_Segment = exports.JS_Fina_Multithreading_Services = exports.JS_Init_Multithreading_Services = exports.JS_Fina_Database = exports.JS_Init_Database = exports.JS_Init_Apis = exports.GsWebGLUtility = exports.ViewerEvent = exports.UpdateInfo = exports.UpdateDisplayType = exports.ThreadPromise = exports.Viewer = exports.GLTypes = exports.CollisionType = exports.LightingMode = exports.TextAlignment = exports.FontUnitsType = exports.AreaSelectionType = exports.UpdateType = exports.CoordinateSystem = exports.ViewMode = exports.EdgeType = exports.VertexType = exports.ElementType = exports.ObjectType = exports.CameraChangeType = void 0;\n idb_1 = tslib_1.__importDefault(idb_1);\n var JS_Init_Database = window.JS_Init_Database;\n exports.JS_Init_Database = JS_Init_Database;\n var JS_Fina_Database = window.JS_Fina_Database;\n exports.JS_Fina_Database = JS_Fina_Database;\n var JS_Init_Multithreading_Services = window.JS_Init_Multithreading_Services;\n exports.JS_Init_Multithreading_Services = JS_Init_Multithreading_Services;\n var JS_Fina_Multithreading_Services = window.JS_Fina_Multithreading_Services;\n exports.JS_Fina_Multithreading_Services = JS_Fina_Multithreading_Services;\n var JS_Open_Segment = window.JS_Open_Segment;\n exports.JS_Open_Segment = JS_Open_Segment;\n var JS_Open_Segment_By_Key = window.JS_Open_Segment_By_Key;\n exports.JS_Open_Segment_By_Key = JS_Open_Segment_By_Key;\n var JS_Close_Segment = window.JS_Close_Segment;\n exports.JS_Close_Segment = JS_Close_Segment;\n var JS_Delete_Segment = window.JS_Delete_Segment;\n exports.JS_Delete_Segment = JS_Delete_Segment;\n var JS_Delete_Segment_By_Key = window.JS_Delete_Segment_By_Key;\n exports.JS_Delete_Segment_By_Key = JS_Delete_Segment_By_Key;\n var JS_Delete_By_Key = window.JS_Delete_By_Key;\n exports.JS_Delete_By_Key = JS_Delete_By_Key;\n var JS_Clear_Geometry = window.JS_Clear_Geometry;\n exports.JS_Clear_Geometry = JS_Clear_Geometry;\n var JS_Clear_Geometry_By_Key = window.JS_Clear_Geometry_By_Key;\n exports.JS_Clear_Geometry_By_Key = JS_Clear_Geometry_By_Key;\n var JS_Clear_Attributes = window.JS_Clear_Attributes;\n exports.JS_Clear_Attributes = JS_Clear_Attributes;\n var JS_Clear_Attributes_By_Key = window.JS_Clear_Attributes_By_Key;\n exports.JS_Clear_Attributes_By_Key = JS_Clear_Attributes_By_Key;\n var JS_Clear_Includes = window.JS_Clear_Includes;\n exports.JS_Clear_Includes = JS_Clear_Includes;\n var JS_Clear_Includes_By_Key = window.JS_Clear_Includes_By_Key;\n exports.JS_Clear_Includes_By_Key = JS_Clear_Includes_By_Key;\n var JS_Clear_Styles = window.JS_Clear_Styles;\n exports.JS_Clear_Styles = JS_Clear_Styles;\n var JS_Clear_Styles_By_Key = window.JS_Clear_Styles_By_Key;\n exports.JS_Clear_Styles_By_Key = JS_Clear_Styles_By_Key;\n var JS_Clear_Subsegments = window.JS_Clear_Subsegments;\n exports.JS_Clear_Subsegments = JS_Clear_Subsegments;\n var JS_Clear_Subsegments_By_Key = window.JS_Clear_Subsegments_By_Key;\n exports.JS_Clear_Subsegments_By_Key = JS_Clear_Subsegments_By_Key;\n var JS_Clear_All = window.JS_Clear_All;\n exports.JS_Clear_All = JS_Clear_All;\n var JS_Clear_All_By_Key = window.JS_Clear_All_By_Key;\n exports.JS_Clear_All_By_Key = JS_Clear_All_By_Key;\n var JS_Include_Segment_By_Key = window.JS_Include_Segment_By_Key;\n exports.JS_Include_Segment_By_Key = JS_Include_Segment_By_Key;\n var JS_Conditional_Include_By_Key = window.JS_Conditional_Include_By_Key;\n exports.JS_Conditional_Include_By_Key = JS_Conditional_Include_By_Key;\n var JS_Style_Segment_By_Key = window.JS_Style_Segment_By_Key;\n exports.JS_Style_Segment_By_Key = JS_Style_Segment_By_Key;\n var JS_Conditional_Style_By_Key = window.JS_Conditional_Style_By_Key;\n exports.JS_Conditional_Style_By_Key = JS_Conditional_Style_By_Key;\n var JS_Make_Context_Current = window.JS_Make_Context_Current;\n exports.JS_Make_Context_Current = JS_Make_Context_Current;\n var JS_Update_Display = window.JS_Update_Display;\n exports.JS_Update_Display = JS_Update_Display;\n var JS_Update_View_Display_By_Key = window.JS_Update_View_Display_By_Key;\n exports.JS_Update_View_Display_By_Key = JS_Update_View_Display_By_Key;\n var JS_Update_View_Display_With_Framerate_By_Key = window.JS_Update_View_Display_With_Framerate_By_Key;\n exports.JS_Update_View_Display_With_Framerate_By_Key = JS_Update_View_Display_With_Framerate_By_Key;\n var JS_Update_View_Display_With_Time_By_Key = window.JS_Update_View_Display_With_Time_By_Key;\n exports.JS_Update_View_Display_With_Time_By_Key = JS_Update_View_Display_With_Time_By_Key;\n var JS_Asyn_Update_Geometry_Data_By_Key = window.JS_Asyn_Update_Geometry_Data_By_Key;\n exports.JS_Asyn_Update_Geometry_Data_By_Key = JS_Asyn_Update_Geometry_Data_By_Key;\n var JS_Asyn_Update_Geometry_Data_By_Key_Tt = window.JS_Asyn_Update_Geometry_Data_By_Key_Tt;\n exports.JS_Asyn_Update_Geometry_Data_By_Key_Tt = JS_Asyn_Update_Geometry_Data_By_Key_Tt;\n var JS_Asyn_Need_Update_View_By_Key = window.JS_Asyn_Need_Update_View_By_Key;\n exports.JS_Asyn_Need_Update_View_By_Key = JS_Asyn_Need_Update_View_By_Key;\n var JS_Asyn_Update_Camera_By_Key = window.JS_Asyn_Update_Camera_By_Key;\n exports.JS_Asyn_Update_Camera_By_Key = JS_Asyn_Update_Camera_By_Key;\n var JS_Asyn_Update_View_By_Key = window.JS_Asyn_Update_View_By_Key;\n exports.JS_Asyn_Update_View_By_Key = JS_Asyn_Update_View_By_Key;\n var JS_Asyn_Update_View_By_Key_Tt = window.JS_Asyn_Update_View_By_Key_Tt;\n exports.JS_Asyn_Update_View_By_Key_Tt = JS_Asyn_Update_View_By_Key_Tt;\n var JS_Asyn_Render_View_By_Key = window.JS_Asyn_Render_View_By_Key;\n exports.JS_Asyn_Render_View_By_Key = JS_Asyn_Render_View_By_Key;\n var JS_Asyn_Render_View_With_Time_By_Key = window.JS_Asyn_Render_View_With_Time_By_Key;\n exports.JS_Asyn_Render_View_With_Time_By_Key = JS_Asyn_Render_View_With_Time_By_Key;\n var JS_Show_Asyn_Geometry_Data_Keys = window.JS_Show_Asyn_Geometry_Data_Keys;\n exports.JS_Show_Asyn_Geometry_Data_Keys = JS_Show_Asyn_Geometry_Data_Keys;\n var JS_Show_Asyn_Remove_Geometry_Data_Keys = window.JS_Show_Asyn_Remove_Geometry_Data_Keys;\n exports.JS_Show_Asyn_Remove_Geometry_Data_Keys = JS_Show_Asyn_Remove_Geometry_Data_Keys;\n var JS_Show_Asyn_Buffer_Geometry_Keys = window.JS_Show_Asyn_Buffer_Geometry_Keys;\n exports.JS_Show_Asyn_Buffer_Geometry_Keys = JS_Show_Asyn_Buffer_Geometry_Keys;\n var JS_Asyn_Buffer_Geometry_By_Key = window.JS_Asyn_Buffer_Geometry_By_Key;\n exports.JS_Asyn_Buffer_Geometry_By_Key = JS_Asyn_Buffer_Geometry_By_Key;\n var JS_Asyn_Buffer_Geometry_By_Key_Tt = window.JS_Asyn_Buffer_Geometry_By_Key_Tt;\n exports.JS_Asyn_Buffer_Geometry_By_Key_Tt = JS_Asyn_Buffer_Geometry_By_Key_Tt;\n var JS_Show_Asyn_Unbuffer_Geometry_Keys = window.JS_Show_Asyn_Unbuffer_Geometry_Keys;\n var JS_Asyn_Unbuffer_Geometry_By_Key = window.JS_Asyn_Unbuffer_Geometry_By_Key;\n var JS_Show_Key_Type = window.JS_Show_Key_Type;\n exports.JS_Show_Key_Type = JS_Show_Key_Type;\n var JS_Show_Owner_By_Key = window.JS_Show_Owner_By_Key;\n exports.JS_Show_Owner_By_Key = JS_Show_Owner_By_Key;\n var JS_Compute_Path = window.JS_Compute_Path;\n exports.JS_Compute_Path = JS_Compute_Path;\n var JS_Compute_Coordinates_By_Key = null;\n exports.JS_Compute_Coordinates_By_Key = JS_Compute_Coordinates_By_Key;\n var JS_Compute_Coordinates_By_Path = window.JS_Compute_Coordinates_By_Path;\n exports.JS_Compute_Coordinates_By_Path = JS_Compute_Coordinates_By_Path;\n var JS_DCompute_Coordinates_By_Key = window.JS_DCompute_Coordinates_By_Key;\n var JS_Compute_Boundingbox_By_Key = window.JS_Compute_Boundingbox_By_Key;\n exports.JS_Compute_Boundingbox_By_Key = JS_Compute_Boundingbox_By_Key;\n var JS_Compute_Boundingbox_With_Visibility_By_Key = null;\n exports.JS_Compute_Boundingbox_With_Visibility_By_Key = JS_Compute_Boundingbox_With_Visibility_By_Key;\n var JS_Compute_View_Boundingbox_By_Key = null;\n exports.JS_Compute_View_Boundingbox_By_Key = JS_Compute_View_Boundingbox_By_Key;\n var JS_Compute_View_Boundingbox_By_Keys = window.JS_Compute_View_Boundingbox_By_Keys;\n exports.JS_Compute_View_Boundingbox_By_Keys = JS_Compute_View_Boundingbox_By_Keys;\n var JS_Compute_View_Boundingboxes_By_Keys = window.JS_Compute_View_Boundingboxes_By_Keys;\n exports.JS_Compute_View_Boundingboxes_By_Keys = JS_Compute_View_Boundingboxes_By_Keys;\n var JS_Compute_Segment_Boundingbox_By_Key = window.JS_Compute_Segment_Boundingbox_By_Key;\n exports.JS_Compute_Segment_Boundingbox_By_Key = JS_Compute_Segment_Boundingbox_By_Key;\n var JS_Clear_Segment_Boundingbox_By_Key = window.JS_Clear_Segment_Boundingbox_By_Key;\n exports.JS_Clear_Segment_Boundingbox_By_Key = JS_Clear_Segment_Boundingbox_By_Key;\n var JS_Show_BoundingBox_By_Key = window.JS_Show_BoundingBox_By_Key;\n exports.JS_Show_BoundingBox_By_Key = JS_Show_BoundingBox_By_Key;\n var JS_Compute_Visible_By_Key = window.JS_Compute_Visible_By_Key;\n exports.JS_Compute_Visible_By_Key = JS_Compute_Visible_By_Key;\n var JS_Show_Attribute_Count = window.JS_Show_Attribute_Count;\n exports.JS_Show_Attribute_Count = JS_Show_Attribute_Count;\n var JS_Show_Attribute_List = window.JS_Show_Attribute_List;\n exports.JS_Show_Attribute_List = JS_Show_Attribute_List;\n var JS_Show_Geometry_Count = window.JS_Show_Geometry_Count;\n exports.JS_Show_Geometry_Count = JS_Show_Geometry_Count;\n var JS_Show_Geometry_List = window.JS_Show_Geometry_List;\n exports.JS_Show_Geometry_List = JS_Show_Geometry_List;\n var JS_Show_Subsegment_Count = window.JS_Show_Subsegment_Count;\n exports.JS_Show_Subsegment_Count = JS_Show_Subsegment_Count;\n var JS_Show_Subsegment_List = window.JS_Show_Subsegment_List;\n exports.JS_Show_Subsegment_List = JS_Show_Subsegment_List;\n var JS_Show_All_Subsegment_Count = window.JS_Show_All_Subsegment_Count;\n exports.JS_Show_All_Subsegment_Count = JS_Show_All_Subsegment_Count;\n var JS_Show_All_Subsegment_List = window.JS_Show_All_Subsegment_List;\n exports.JS_Show_All_Subsegment_List = JS_Show_All_Subsegment_List;\n var JS_Show_Include_Count = window.JS_Show_Include_Count;\n exports.JS_Show_Include_Count = JS_Show_Include_Count;\n var JS_Show_Include_List = window.JS_Show_Include_List;\n exports.JS_Show_Include_List = JS_Show_Include_List;\n var JS_Show_Include = window.JS_Show_Include;\n exports.JS_Show_Include = JS_Show_Include;\n var JS_Show_Include_Segment = window.JS_Show_Include_Segment;\n exports.JS_Show_Include_Segment = JS_Show_Include_Segment;\n var JS_Show_Style_Count = window.JS_Show_Style_Count;\n exports.JS_Show_Style_Count = JS_Show_Style_Count;\n var JS_Show_Style_List = window.JS_Show_Style_List;\n exports.JS_Show_Style_List = JS_Show_Style_List;\n var JS_Show_Style = window.JS_Show_Style;\n exports.JS_Show_Style = JS_Show_Style;\n var JS_Show_Style_Segment = window.JS_Show_Style_Segment;\n exports.JS_Show_Style_Segment = JS_Show_Style_Segment;\n var JS_Show_Segment_Name = window.JS_Show_Segment_Name;\n exports.JS_Show_Segment_Name = JS_Show_Segment_Name;\n var JS_Show_Segment_Path = window.JS_Show_Segment_Path;\n exports.JS_Show_Segment_Path = JS_Show_Segment_Path;\n var JS_Segment_Exists = window.JS_Segment_Exists;\n exports.JS_Segment_Exists = JS_Segment_Exists;\n var JS_Move_Key = window.JS_Move_Key;\n exports.JS_Move_Key = JS_Move_Key;\n var JS_Move_Key_By_Key = window.JS_Move_Key_By_Key;\n exports.JS_Move_Key_By_Key = JS_Move_Key_By_Key;\n var JS_Rename_Segment = window.JS_Rename_Segment;\n exports.JS_Rename_Segment = JS_Rename_Segment;\n var JS_Add_Property_Boolean = window.JS_Add_Property_Boolean;\n exports.JS_Add_Property_Boolean = JS_Add_Property_Boolean;\n var JS_Add_Property_Integer = window.JS_Add_Property_Integer;\n exports.JS_Add_Property_Integer = JS_Add_Property_Integer;\n var JS_Add_Property_Double = window.JS_Add_Property_Double;\n exports.JS_Add_Property_Double = JS_Add_Property_Double;\n var JS_Add_Property_String = window.JS_Add_Property_String;\n exports.JS_Add_Property_String = JS_Add_Property_String;\n var JS_Add_Property_Json = window.JS_Add_Property_Json;\n exports.JS_Add_Property_Json = JS_Add_Property_Json;\n var JS_Show_Property_Type = window.JS_Show_Property_Type;\n exports.JS_Show_Property_Type = JS_Show_Property_Type;\n var JS_Show_Property_Boolean = window.JS_Show_Property_Boolean;\n exports.JS_Show_Property_Boolean = JS_Show_Property_Boolean;\n var JS_Show_Property_Integer = window.JS_Show_Property_Integer;\n exports.JS_Show_Property_Integer = JS_Show_Property_Integer;\n var JS_Show_Property_Double = window.JS_Show_Property_Double;\n exports.JS_Show_Property_Double = JS_Show_Property_Double;\n var JS_Show_Property_String = window.JS_Show_Property_String;\n exports.JS_Show_Property_String = JS_Show_Property_String;\n var JS_Property_Exists = window.JS_Property_Exists;\n exports.JS_Property_Exists = JS_Property_Exists;\n var _JS_Remove_Property = window.JS_Remove_Property;\n exports.JS_Remove_Property = _JS_Remove_Property;\n var JS_Clear_Properties = window.JS_Clear_Properties;\n exports.JS_Clear_Properties = JS_Clear_Properties;\n var JS_Show_Properties = window.JS_Show_Properties;\n exports.JS_Show_Properties = JS_Show_Properties;\n var JS_Show_Key_By_Id = window.JS_Show_Key_By_Id;\n exports.JS_Show_Key_By_Id = JS_Show_Key_By_Id;\n var JS_Set_Key_Index = window.JS_Set_Key_Index;\n exports.JS_Set_Key_Index = JS_Set_Key_Index;\n var JS_Show_Key_Index = window.JS_Show_Key_Index;\n exports.JS_Show_Key_Index = JS_Show_Key_Index;\n var JS_Show_Key_Tag = window.JS_Show_Key_Tag;\n exports.JS_Show_Key_Tag = JS_Show_Key_Tag;\n var JS_Compute_Selection_By_Key = window.JS_Compute_Selection_By_Key;\n exports.JS_Compute_Selection_By_Key = JS_Compute_Selection_By_Key;\n var JS_Compute_Selection_By_Area = window.JS_Compute_Selection_By_Area;\n exports.JS_Compute_Selection_By_Area = JS_Compute_Selection_By_Area;\n var JS_Show_Selection_Count = window.JS_Show_Selection_Count;\n exports.JS_Show_Selection_Count = JS_Show_Selection_Count;\n var JS_Show_Selection_Element = window.JS_Show_Selection_Element;\n exports.JS_Show_Selection_Element = JS_Show_Selection_Element;\n var JS_Show_Selection_Path = window.JS_Show_Selection_Path;\n exports.JS_Show_Selection_Path = JS_Show_Selection_Path;\n var JS_Show_Selection_Path_By_Keys = window.JS_Show_Selection_Path_By_Keys;\n exports.JS_Show_Selection_Path_By_Keys = JS_Show_Selection_Path_By_Keys;\n var JS_Show_Selection_Position = window.JS_Show_Selection_Position;\n exports.JS_Show_Selection_Position = JS_Show_Selection_Position;\n var JS_Show_Selection_Param = window.JS_Show_Selection_Param;\n exports.JS_Show_Selection_Param = JS_Show_Selection_Param;\n var JS_Show_Selection_Indexes = window.JS_Show_Selection_Indexes;\n exports.JS_Show_Selection_Indexes = JS_Show_Selection_Indexes;\n var JS_Show_Selection_Test_Info = window.JS_Show_Selection_Test_Info;\n exports.JS_Show_Selection_Test_Info = JS_Show_Selection_Test_Info;\n var JS_Compute_Collision_By_Keys = window.JS_Compute_Collision_By_Keys;\n exports.JS_Compute_Collision_By_Keys = JS_Compute_Collision_By_Keys;\n var JS_Compute_Collision_By_Key = window.JS_Compute_Collision_By_Key;\n exports.JS_Compute_Collision_By_Key = JS_Compute_Collision_By_Key;\n var JS_Compute_Collision_By_Key_Tt = window.JS_Compute_Collision_By_Key_Tt;\n exports.JS_Compute_Collision_By_Key_Tt = JS_Compute_Collision_By_Key_Tt;\n var JS_Compute_Collision_By_Keys_Tt = window.JS_Compute_Collision_By_Keys_Tt;\n exports.JS_Compute_Collision_By_Keys_Tt = JS_Compute_Collision_By_Keys_Tt;\n var JS_Show_Collision_Status = window.JS_Show_Collision_Status;\n exports.JS_Show_Collision_Status = JS_Show_Collision_Status;\n var JS_Show_Collision_Count = window.JS_Show_Collision_Count;\n exports.JS_Show_Collision_Count = JS_Show_Collision_Count;\n var JS_Show_Collision_Elements = window.JS_Show_Collision_Elements;\n exports.JS_Show_Collision_Elements = JS_Show_Collision_Elements;\n var JS_Show_Collision_Paths = window.JS_Show_Collision_Paths;\n exports.JS_Show_Collision_Paths = JS_Show_Collision_Paths;\n var JS_Show_Collision_Path_By_Keys = window.JS_Show_Collision_Path_By_Keys;\n exports.JS_Show_Collision_Path_By_Keys = JS_Show_Collision_Path_By_Keys;\n var JS_Show_Collision_Position = window.JS_Show_Collision_Position;\n exports.JS_Show_Collision_Position = JS_Show_Collision_Position;\n var JS_Show_Collision_Type = window.JS_Show_Collision_Type;\n exports.JS_Show_Collision_Type = JS_Show_Collision_Type;\n var JS_Add_Font_Library = window.JS_Add_Font_Library;\n exports.JS_Add_Font_Library = JS_Add_Font_Library;\n var JS_Font_Library_Exists = window.JS_Font_Library_Exists;\n exports.JS_Font_Library_Exists = JS_Font_Library_Exists;\n var JS_Remove_Font_Library = window.JS_Remove_Font_Library;\n exports.JS_Remove_Font_Library = JS_Remove_Font_Library;\n var JS_Clear_Font_Library = window.JS_Clear_Font_Library;\n exports.JS_Clear_Font_Library = JS_Clear_Font_Library;\n var JS_Set_Driver_Configs = window.JS_Set_Driver_Configs;\n exports.JS_Set_Driver_Configs = JS_Set_Driver_Configs;\n var JS_Set_Driver_Options = window.JS_Set_Driver_Options;\n exports.JS_Set_Driver_Options = JS_Set_Driver_Options;\n var JS_Show_Driver_Options = window.JS_Show_Driver_Options;\n exports.JS_Show_Driver_Options = JS_Show_Driver_Options;\n var JS_Show_One_Driver_Option = window.JS_Show_One_Driver_Option;\n exports.JS_Show_One_Driver_Option = JS_Show_One_Driver_Option;\n var JS_Set_Shader = window.JS_Set_Shader;\n exports.JS_Set_Shader = JS_Set_Shader;\n var JS_Show_Shader = window.JS_Show_Shader;\n exports.JS_Show_Shader = JS_Show_Shader;\n var JS_Show_One_Shader = window.JS_Show_One_Shader;\n exports.JS_Show_One_Shader = JS_Show_One_Shader;\n var JS_UnSet_Shader = window.JS_UnSet_Shader;\n exports.JS_UnSet_Shader = JS_UnSet_Shader;\n var JS_Set_Viewport = window.JS_Set_Viewport;\n exports.JS_Set_Viewport = JS_Set_Viewport;\n var JS_Set_Camera = window.JS_Set_Camera;\n exports.JS_Set_Camera = JS_Set_Camera;\n var JS_Set_Camera_Position = window.JS_Set_Camera_Position;\n exports.JS_Set_Camera_Position = JS_Set_Camera_Position;\n var JS_Set_Camera_Target = window.JS_Set_Camera_Target;\n exports.JS_Set_Camera_Target = JS_Set_Camera_Target;\n var JS_Set_Camera_Up = window.JS_Set_Camera_Up;\n exports.JS_Set_Camera_Up = JS_Set_Camera_Up;\n var JS_Set_Camera_Field = window.JS_Set_Camera_Field;\n exports.JS_Set_Camera_Field = JS_Set_Camera_Field;\n var JS_Set_Camera_Extent = window.JS_Set_Camera_Extent;\n exports.JS_Set_Camera_Extent = JS_Set_Camera_Extent;\n var JS_Set_Camera_Projection = window.JS_Set_Camera_Projection;\n exports.JS_Set_Camera_Projection = JS_Set_Camera_Projection;\n var JS_Keep_Camera_Ratio = window.JS_Keep_Camera_Ratio;\n exports.JS_Keep_Camera_Ratio = JS_Keep_Camera_Ratio;\n var JS_Show_Camera = window.JS_Show_Camera;\n exports.JS_Show_Camera = JS_Show_Camera;\n var JS_Show_Camera_Position = window.JS_Show_Camera_Position;\n exports.JS_Show_Camera_Position = JS_Show_Camera_Position;\n var JS_Show_Camera_Target = window.JS_Show_Camera_Target;\n exports.JS_Show_Camera_Target = JS_Show_Camera_Target;\n var JS_Show_Camera_Up = window.JS_Show_Camera_Up;\n exports.JS_Show_Camera_Up = JS_Show_Camera_Up;\n var JS_Show_Camera_Field = window.JS_Show_Camera_Field;\n exports.JS_Show_Camera_Field = JS_Show_Camera_Field;\n var JS_Show_Camera_Extent = window.JS_Show_Camera_Extent;\n exports.JS_Show_Camera_Extent = JS_Show_Camera_Extent;\n var JS_Show_Camera_Projection = window.JS_Show_Camera_Projection;\n exports.JS_Show_Camera_Projection = JS_Show_Camera_Projection;\n var JS_Show_Camera_Projection_Matrix = window.JS_Show_Camera_Projection_Matrix;\n exports.JS_Show_Camera_Projection_Matrix = JS_Show_Camera_Projection_Matrix;\n var JS_Show_Camera_View_Matrix = window.JS_Show_Camera_View_Matrix;\n exports.JS_Show_Camera_View_Matrix = JS_Show_Camera_View_Matrix;\n var JS_Show_Path_Camera_Position = window.JS_Show_Path_Camera_Position;\n exports.JS_Show_Path_Camera_Position = JS_Show_Path_Camera_Position;\n var JS_Show_Path_Camera_Target = window.JS_Show_Path_Camera_Target;\n exports.JS_Show_Path_Camera_Target = JS_Show_Path_Camera_Target;\n var JS_Dolly_Camera = window.JS_Dolly_Camera;\n exports.JS_Dolly_Camera = JS_Dolly_Camera;\n var JS_Roll_Camera = window.JS_Roll_Camera;\n exports.JS_Roll_Camera = JS_Roll_Camera;\n var JS_Zoom_Camera = window.JS_Zoom_Camera;\n exports.JS_Zoom_Camera = JS_Zoom_Camera;\n var JS_UnSet_Camera = window.JS_UnSet_Camera;\n exports.JS_UnSet_Camera = JS_UnSet_Camera;\n var JS_Set_Color = window.JS_Set_Color;\n exports.JS_Set_Color = JS_Set_Color;\n var JS_UnSet_Color = window.JS_UnSet_Color;\n exports.JS_UnSet_Color = JS_UnSet_Color;\n var JS_UnSet_One_Color = window.JS_UnSet_One_Color;\n exports.JS_UnSet_One_Color = JS_UnSet_One_Color;\n var JS_Show_Color = window.JS_Show_Color;\n exports.JS_Show_Color = JS_Show_Color;\n var JS_Show_One_Color = window.JS_Show_One_Color;\n exports.JS_Show_One_Color = JS_Show_One_Color;\n var JS_Show_Color_By_Value = window.JS_Show_Color_By_Value;\n exports.JS_Show_Color_By_Value = JS_Show_Color_By_Value;\n var JS_Set_Geometry_Color = window.JS_Set_Geometry_Color;\n exports.JS_Set_Geometry_Color = JS_Set_Geometry_Color;\n var JS_Set_Geometry_Color_By_Value = window.JS_Set_Geometry_Color_By_Value;\n exports.JS_Set_Geometry_Color_By_Value = JS_Set_Geometry_Color_By_Value;\n var JS_Show_Geometry_Color_By_Value = window.JS_Show_Geometry_Color_By_Value;\n exports.JS_Show_Geometry_Color_By_Value = JS_Show_Geometry_Color_By_Value;\n var JS_UnSet_Geometry_Color = window.JS_UnSet_Geometry_Color;\n exports.JS_UnSet_Geometry_Color = JS_UnSet_Geometry_Color;\n var JS_Set_Visibility = window.JS_Set_Visibility;\n exports.JS_Set_Visibility = JS_Set_Visibility;\n var JS_UnSet_Visibility = window.JS_UnSet_Visibility;\n exports.JS_UnSet_Visibility = JS_UnSet_Visibility;\n var JS_UnSet_One_Visibility = window.JS_UnSet_One_Visibility;\n exports.JS_UnSet_One_Visibility = JS_UnSet_One_Visibility;\n var JS_Show_Visibility = window.JS_Show_Visibility;\n exports.JS_Show_Visibility = JS_Show_Visibility;\n var JS_Show_One_Visibility = window.JS_Show_One_Visibility;\n exports.JS_Show_One_Visibility = JS_Show_One_Visibility;\n var JS_Set_Selectability = window.JS_Set_Selectability;\n exports.JS_Set_Selectability = JS_Set_Selectability;\n var JS_UnSet_Selectability = window.JS_UnSet_Selectability;\n exports.JS_UnSet_Selectability = JS_UnSet_Selectability;\n var JS_UnSet_One_Selectability = window.JS_UnSet_One_Selectability;\n exports.JS_UnSet_One_Selectability = JS_UnSet_One_Selectability;\n var JS_Show_Selectability = window.JS_Show_Selectability;\n exports.JS_Show_Selectability = JS_Show_Selectability;\n var JS_Show_One_Selectability = window.JS_Show_One_Selectability;\n exports.JS_Show_One_Selectability = JS_Show_One_Selectability;\n var JS_Set_ModellingMatrix = window.JS_Set_ModellingMatrix;\n exports.JS_Set_ModellingMatrix = JS_Set_ModellingMatrix;\n var JS_Append_ModellingMatrix = window.JS_Append_ModellingMatrix;\n exports.JS_Append_ModellingMatrix = JS_Append_ModellingMatrix;\n var JS_Show_ModellingMatrix = window.JS_Show_ModellingMatrix;\n exports.JS_Show_ModellingMatrix = JS_Show_ModellingMatrix;\n var JS_Show_Path_ModellingMatrix = window.JS_Show_Path_ModellingMatrix;\n exports.JS_Show_Path_ModellingMatrix = JS_Show_Path_ModellingMatrix;\n var JS_UnSet_ModellingMatrix = window.JS_UnSet_ModellingMatrix;\n exports.JS_UnSet_ModellingMatrix = JS_UnSet_ModellingMatrix;\n var JS_Set_Rendering_Options = window.JS_Set_Rendering_Options;\n exports.JS_Set_Rendering_Options = JS_Set_Rendering_Options;\n var JS_UnSet_Rendering_Options = window.JS_UnSet_Rendering_Options;\n exports.JS_UnSet_Rendering_Options = JS_UnSet_Rendering_Options;\n var JS_UnSet_One_Rendering_Option = window.JS_UnSet_One_Rendering_Option;\n exports.JS_UnSet_One_Rendering_Option = JS_UnSet_One_Rendering_Option;\n var JS_Show_Rendering_Options = window.JS_Show_Rendering_Options;\n exports.JS_Show_Rendering_Options = JS_Show_Rendering_Options;\n var JS_Show_One_Rendering_Option = window.JS_Show_One_Rendering_Option;\n exports.JS_Show_One_Rendering_Option = JS_Show_One_Rendering_Option;\n var JS_Show_One_Default_Rendering_Option = window.JS_Show_One_Default_Rendering_Option;\n exports.JS_Show_One_Default_Rendering_Option = JS_Show_One_Default_Rendering_Option;\n var JS_Show_One_Path_Rendering_Option = window.JS_Show_One_Path_Rendering_Option;\n exports.JS_Show_One_Path_Rendering_Option = JS_Show_One_Path_Rendering_Option;\n var JS_Set_Heuristic_Options = window.JS_Set_Heuristic_Options;\n exports.JS_Set_Heuristic_Options = JS_Set_Heuristic_Options;\n var JS_Set_One_Heuristic_Option = window.JS_Set_One_Heuristic_Option;\n exports.JS_Set_One_Heuristic_Option = JS_Set_One_Heuristic_Option;\n var JS_UnSet_Heuristic_Options = window.JS_UnSet_Heuristic_Options;\n exports.JS_UnSet_Heuristic_Options = JS_UnSet_Heuristic_Options;\n var JS_UnSet_One_Heuristic_Option = window.JS_UnSet_One_Heuristic_Option;\n exports.JS_UnSet_One_Heuristic_Option = JS_UnSet_One_Heuristic_Option;\n var JS_Show_Heuristic_Options = window.JS_Show_Heuristic_Options;\n exports.JS_Show_Heuristic_Options = JS_Show_Heuristic_Options;\n var JS_Show_One_Heuristic_Option = window.JS_Show_One_Heuristic_Option;\n exports.JS_Show_One_Heuristic_Option = JS_Show_One_Heuristic_Option;\n var JS_Set_Condition = window.JS_Set_Condition;\n exports.JS_Set_Condition = JS_Set_Condition;\n var JS_Show_Condition = window.JS_Show_Condition;\n exports.JS_Show_Condition = JS_Show_Condition;\n var JS_UnSet_Condition = window.JS_UnSet_Condition;\n exports.JS_UnSet_Condition = JS_UnSet_Condition;\n var JS_Set_Text_Font = window.JS_Set_Text_Font;\n exports.JS_Set_Text_Font = JS_Set_Text_Font;\n var JS_UnSet_Text_Font = window.JS_UnSet_Text_Font;\n exports.JS_UnSet_Text_Font = JS_UnSet_Text_Font;\n var JS_UnSet_One_Text_Font = window.JS_UnSet_One_Text_Font;\n exports.JS_UnSet_One_Text_Font = JS_UnSet_One_Text_Font;\n var JS_Show_Text_Font = window.JS_Show_Text_Font;\n exports.JS_Show_Text_Font = JS_Show_Text_Font;\n var JS_Show_One_Text_Font = window.JS_Show_One_Text_Font;\n exports.JS_Show_One_Text_Font = JS_Show_One_Text_Font;\n var JS_Attribute_Exists = window.JS_Attribute_Exists;\n exports.JS_Attribute_Exists = JS_Attribute_Exists;\n var JS_Image_Exists = window.JS_Image_Exists;\n exports.JS_Image_Exists = JS_Image_Exists;\n var JS_Resize_By_Key = window.JS_Resize_By_Key;\n exports.JS_Resize_By_Key = JS_Resize_By_Key;\n var JS_Insert_Marker = window.JS_Insert_Marker;\n exports.JS_Insert_Marker = JS_Insert_Marker;\n var JS_Edit_Marker = window.JS_Edit_Marker;\n exports.JS_Edit_Marker = JS_Edit_Marker;\n var JS_Show_Marker = window.JS_Show_Marker;\n exports.JS_Show_Marker = JS_Show_Marker;\n var JS_Insert_Point_Cloud = window.JS_Insert_Point_Cloud;\n exports.JS_Insert_Point_Cloud = JS_Insert_Point_Cloud;\n var JS_Edit_Point_Cloud = window.JS_Edit_Point_Cloud;\n exports.JS_Edit_Point_Cloud = JS_Edit_Point_Cloud;\n var JS_Show_Point_Cloud = window.JS_Show_Point_Cloud;\n exports.JS_Show_Point_Cloud = JS_Show_Point_Cloud;\n var JS_Insert_Line = window.JS_Insert_Line;\n exports.JS_Insert_Line = JS_Insert_Line;\n var JS_Show_Line = window.JS_Show_Line;\n exports.JS_Show_Line = JS_Show_Line;\n var JS_Edit_Line = window.JS_Edit_Line;\n exports.JS_Edit_Line = JS_Edit_Line;\n var JS_Insert_Polyline = window.JS_Insert_Polyline;\n exports.JS_Insert_Polyline = JS_Insert_Polyline;\n var JS_Show_Polyline_Count = window.JS_Show_Polyline_Count;\n exports.JS_Show_Polyline_Count = JS_Show_Polyline_Count;\n var JS_Show_Polyline = window.JS_Show_Polyline;\n exports.JS_Show_Polyline = JS_Show_Polyline;\n var JS_Insert_Circle = window.JS_Insert_Circle;\n exports.JS_Insert_Circle = JS_Insert_Circle;\n var JS_Show_Circle = window.JS_Show_Circle;\n exports.JS_Show_Circle = JS_Show_Circle;\n var JS_Insert_Cylinder = window.JS_Insert_Cylinder;\n exports.JS_Insert_Cylinder = JS_Insert_Cylinder;\n var JS_Show_Cylinder = window.JS_Show_Cylinder;\n exports.JS_Show_Cylinder = JS_Show_Cylinder;\n var JS_Insert_PolyCylinder = window.JS_Insert_PolyCylinder;\n exports.JS_Insert_PolyCylinder = JS_Insert_PolyCylinder;\n var JS_Edit_PolyCylinder = window.JS_Edit_PolyCylinder;\n exports.JS_Edit_PolyCylinder = JS_Edit_PolyCylinder;\n var JS_Insert_Shell = window.JS_Insert_Shell;\n exports.JS_Insert_Shell = JS_Insert_Shell;\n var JS_Edit_Shell = window.JS_Edit_Shell;\n exports.JS_Edit_Shell = JS_Edit_Shell;\n var JS_Show_Shell_Size = window.JS_Show_Shell_Size;\n exports.JS_Show_Shell_Size = JS_Show_Shell_Size;\n var JS_Show_Shell = window.JS_Show_Shell;\n exports.JS_Show_Shell = JS_Show_Shell;\n var JS_Insert_Triangular_Shell = window.JS_Insert_Triangular_Shell;\n exports.JS_Insert_Triangular_Shell = JS_Insert_Triangular_Shell;\n var JS_Insert_Mesh = window.JS_Insert_Mesh;\n exports.JS_Insert_Mesh = JS_Insert_Mesh;\n var JS_Edit_Mesh_Points = window.JS_Edit_Mesh_Points;\n exports.JS_Edit_Mesh_Points = JS_Edit_Mesh_Points;\n var JS_Show_Mesh_Size = window.JS_Show_Mesh_Size;\n exports.JS_Show_Mesh_Size = JS_Show_Mesh_Size;\n var JS_Show_Mesh = window.JS_Show_Mesh;\n exports.JS_Show_Mesh = JS_Show_Mesh;\n var JS_Insert_Vector_Text = window.JS_Insert_Vector_Text;\n exports.JS_Insert_Vector_Text = JS_Insert_Vector_Text;\n var JS_Insert_Parametric_Geometry = window.JS_Insert_Parametric_Geometry;\n exports.JS_Insert_Parametric_Geometry = JS_Insert_Parametric_Geometry;\n var JS_Insert_Parametric_Geometries = window.JS_Insert_Parametric_Geometries;\n exports.JS_Insert_Parametric_Geometries = JS_Insert_Parametric_Geometries;\n var JS_Edit_Parametric_Geometry = null;\n exports.JS_Edit_Parametric_Geometry = JS_Edit_Parametric_Geometry;\n var JS_Show_Parametric_Geometry = null;\n exports.JS_Show_Parametric_Geometry = JS_Show_Parametric_Geometry;\n var JS_Insert_Light = window.JS_Insert_Light;\n exports.JS_Insert_Light = JS_Insert_Light;\n var JS_Edit_Light = window.JS_Edit_Light;\n exports.JS_Edit_Light = JS_Edit_Light;\n var JS_Show_Light = window.JS_Show_Light;\n exports.JS_Show_Light = JS_Show_Light;\n var JS_Insert_Image = window.JS_Insert_Image;\n exports.JS_Insert_Image = JS_Insert_Image;\n var JS_Set_Image_Options = window.JS_Set_Image_Options;\n exports.JS_Set_Image_Options = JS_Set_Image_Options;\n var JS_UnSet_One_Image_Option = window.JS_UnSet_One_Image_Option;\n exports.JS_UnSet_One_Image_Option = JS_UnSet_One_Image_Option;\n var JS_Show_Image_Position = window.JS_Show_Image_Position;\n exports.JS_Show_Image_Position = JS_Show_Image_Position;\n var JS_Show_Image_Size = window.JS_Show_Image_Size;\n exports.JS_Show_Image_Size = JS_Show_Image_Size;\n var JS_Show_Image_Data = window.JS_Show_Image_Data;\n exports.JS_Show_Image_Data = JS_Show_Image_Data;\n var JS_Show_Image_Options = window.JS_Show_Image_Options;\n exports.JS_Show_Image_Options = JS_Show_Image_Options;\n var JS_Show_One_Image_Option = window.JS_Show_One_Image_Option;\n exports.JS_Show_One_Image_Option = JS_Show_One_Image_Option;\n var JS_Show_Image = window.JS_Show_Image;\n exports.JS_Show_Image = JS_Show_Image;\n var JS_Insert_Cutting_Planes = window.JS_Insert_Cutting_Planes;\n exports.JS_Insert_Cutting_Planes = JS_Insert_Cutting_Planes;\n var JS_Edit_Cutting_Planes = window.JS_Edit_Cutting_Planes;\n exports.JS_Edit_Cutting_Planes = JS_Edit_Cutting_Planes;\n var JS_Show_Cutting_Planes = window.JS_Show_Cutting_Planes;\n exports.JS_Show_Cutting_Planes = JS_Show_Cutting_Planes;\n var JS_Show_Geometry_Vertices_Position_By_Indexes = window.JS_Show_Geometry_Vertices_Position_By_Indexes;\n exports.JS_Show_Geometry_Vertices_Position_By_Indexes = JS_Show_Geometry_Vertices_Position_By_Indexes;\n var JS_Show_Geometry_Element_Type = window.JS_Show_Geometry_Element_Type;\n exports.JS_Show_Geometry_Element_Type = JS_Show_Geometry_Element_Type;\n var JS_Set_Geometry_Texture_Coords = window.JS_Set_Geometry_Texture_Coords;\n exports.JS_Set_Geometry_Texture_Coords = JS_Set_Geometry_Texture_Coords;\n var JS_Show_Geometry_Texture_Dimension = window.JS_Show_Geometry_Texture_Dimension;\n exports.JS_Show_Geometry_Texture_Dimension = JS_Show_Geometry_Texture_Dimension;\n var JS_Show_Geometry_Texture_Coords = window.JS_Show_Geometry_Texture_Coords;\n exports.JS_Show_Geometry_Texture_Coords = JS_Show_Geometry_Texture_Coords;\n var JS_UnSet_Geometry_Texture_Coords = window.JS_UnSet_Geometry_Texture_Coords;\n exports.JS_UnSet_Geometry_Texture_Coords = JS_UnSet_Geometry_Texture_Coords;\n var JS_Compute_Geometry_Texture_Coords = window.JS_Compute_Geometry_Texture_Coords;\n exports.JS_Compute_Geometry_Texture_Coords = JS_Compute_Geometry_Texture_Coords;\n var JS_Set_Geometry_Normals = window.JS_Set_Geometry_Normals;\n exports.JS_Set_Geometry_Normals = JS_Set_Geometry_Normals;\n var JS_Show_Geometry_Normals = window.JS_Show_Geometry_Normals;\n exports.JS_Show_Geometry_Normals = JS_Show_Geometry_Normals;\n var JS_UnSet_Geometry_Normals = window.JS_UnSet_Geometry_Normals;\n exports.JS_UnSet_Geometry_Normals = JS_UnSet_Geometry_Normals;\n var JS_Compute_Geometry_Tessellate_Data = window.JS_Compute_Geometry_Tessellate_Data;\n exports.JS_Compute_Geometry_Tessellate_Data = JS_Compute_Geometry_Tessellate_Data;\n var JS_Compute_Geometry_Data = window.JS_Compute_Geometry_Data;\n exports.JS_Compute_Geometry_Data = JS_Compute_Geometry_Data;\n var JS_Merge_Shell = window.JS_Merge_Shell;\n exports.JS_Merge_Shell = JS_Merge_Shell;\n var JS_Extrude_By_Shell = window.JS_Extrude_By_Shell;\n exports.JS_Extrude_By_Shell = JS_Extrude_By_Shell;\n var JS_Sweep_By_Shell = window.JS_Sweep_By_Shell;\n exports.JS_Sweep_By_Shell = JS_Sweep_By_Shell;\n var JS_DSweep_By_Shell = window.JS_DSweep_By_Shell;\n exports.JS_DSweep_By_Shell = JS_DSweep_By_Shell;\n var JS_DExtrude_By_Shell = window.JS_DExtrude_By_Shell;\n exports.JS_DExtrude_By_Shell = JS_DExtrude_By_Shell;\n var JS_Rotate_By_Shell = window.JS_Rotate_By_Shell;\n exports.JS_Rotate_By_Shell = JS_Rotate_By_Shell;\n var JS_DRotate_By_Shell = window.JS_DRotate_By_Shell;\n exports.JS_DRotate_By_Shell = JS_DRotate_By_Shell;\n var JS_Compute_Ray_Test = window.JS_Compute_Ray_Test;\n exports.JS_Compute_Ray_Test = JS_Compute_Ray_Test;\n var JS_Compute_Geometry_Ray_Test = window.JS_Compute_Geometry_Ray_Test;\n exports.JS_Compute_Geometry_Ray_Test = JS_Compute_Geometry_Ray_Test;\n var JS_Compute_Box_Test = window.JS_Compute_Box_Test;\n exports.JS_Compute_Box_Test = JS_Compute_Box_Test;\n var JS_Compute_Polygon_Area = window.JS_Compute_Polygon_Area;\n exports.JS_Compute_Polygon_Area = JS_Compute_Polygon_Area;\n var JS_Compute_Area = window.JS_Compute_Area;\n exports.JS_Compute_Area = JS_Compute_Area;\n var JS_Compute_Volume = window.JS_Compute_Volume;\n exports.JS_Compute_Volume = JS_Compute_Volume;\n var JS_Is_Solid_Geometry = window.JS_Is_Solid_Geometry;\n exports.JS_Is_Solid_Geometry = JS_Is_Solid_Geometry;\n var JS_Compute_Geometry_Distance = window.JS_Compute_Geometry_Distance;\n exports.JS_Compute_Geometry_Distance = JS_Compute_Geometry_Distance;\n var JS_Segment_To_Stream = window.JS_Segment_To_Stream;\n exports.JS_Segment_To_Stream = JS_Segment_To_Stream;\n var JS_Segment_To_Stream_By_Key = window.JS_Segment_To_Stream_By_Key;\n exports.JS_Segment_To_Stream_By_Key = JS_Segment_To_Stream_By_Key;\n var JS_Segment_To_Stream_With_Compression = window.JS_Segment_To_Stream_With_Compression;\n exports.JS_Segment_To_Stream_With_Compression = JS_Segment_To_Stream_With_Compression;\n var JS_Segment_To_Stream_With_Compression_By_Key = window.JS_Segment_To_Stream_With_Compression_By_Key;\n exports.JS_Segment_To_Stream_With_Compression_By_Key = JS_Segment_To_Stream_With_Compression_By_Key;\n var JS_Stream_To_Segment = window.JS_Stream_To_Segment;\n exports.JS_Stream_To_Segment = JS_Stream_To_Segment;\n var JS_Stream_To_Segment_By_Key = window.JS_Stream_To_Segment_By_Key;\n exports.JS_Stream_To_Segment_By_Key = JS_Stream_To_Segment_By_Key;\n var JS_Stream_To_Segment_By_Key_Tt = window.JS_Stream_To_Segment_By_Key_Tt;\n exports.JS_Stream_To_Segment_By_Key_Tt = JS_Stream_To_Segment_By_Key_Tt;\n var JS_Stream_With_Compression_To_Segment_By_Key = window.JS_Stream_With_Compression_To_Segment_By_Key;\n exports.JS_Stream_With_Compression_To_Segment_By_Key = JS_Stream_With_Compression_To_Segment_By_Key;\n var JS_Segment_Data_To_Stream = window.JS_Segment_Data_To_Stream;\n exports.JS_Segment_Data_To_Stream = JS_Segment_Data_To_Stream;\n var JS_Stream_To_Segment_Data = window.JS_Stream_To_Segment_Data;\n exports.JS_Stream_To_Segment_Data = JS_Stream_To_Segment_Data;\n var JS_Geometry_Data_To_Stream = window.JS_Geometry_Data_To_Stream;\n exports.JS_Geometry_Data_To_Stream = JS_Geometry_Data_To_Stream;\n var JS_Geometry_Data_To_Stream_With_Compression = window.JS_Geometry_Data_To_Stream_With_Compression;\n var JS_Stream_To_Geometry_Data = window.JS_Stream_To_Geometry_Data;\n exports.JS_Stream_To_Geometry_Data = JS_Stream_To_Geometry_Data;\n var JS_Stream_To_Geometry_Data_By_Key = window.JS_Stream_To_Geometry_Data_By_Key;\n exports.JS_Stream_To_Geometry_Data_By_Key = JS_Stream_To_Geometry_Data_By_Key;\n var JS_Stream_To_Geometry_Data_By_Keys = window.JS_Stream_To_Geometry_Data_By_Keys;\n exports.JS_Stream_To_Geometry_Data_By_Keys = JS_Stream_To_Geometry_Data_By_Keys;\n var JS_Stream_To_Geometry_Data_By_Keys_Tt = window.JS_Stream_To_Geometry_Data_By_Keys_Tt;\n exports.JS_Stream_To_Geometry_Data_By_Keys_Tt = JS_Stream_To_Geometry_Data_By_Keys_Tt;\n var JS_Stream_To_Geometry_Data_With_Compression = window.JS_Stream_To_Geometry_Data_With_Compression;\n exports.JS_Stream_To_Geometry_Data_With_Compression = JS_Stream_To_Geometry_Data_With_Compression;\n var JS_Copy_Segment_By_Key = window.JS_Copy_Segment_By_Key;\n exports.JS_Copy_Segment_By_Key = JS_Copy_Segment_By_Key;\n var JS_Show_Database_Info = window.JS_Show_Database_Info;\n exports.JS_Show_Database_Info = JS_Show_Database_Info;\n var JS_Show_Allocated_Memory_Size = window.JS_Show_Allocated_Memory_Size;\n exports.JS_Show_Allocated_Memory_Size = JS_Show_Allocated_Memory_Size;\n var JS_Execute_Task_Post_Processing = window.JS_Execute_Task_Post_Processing;\n exports.JS_Execute_Task_Post_Processing = JS_Execute_Task_Post_Processing;\n var JS_Create_Texture = window.JS_Create_Texture;\n exports.JS_Create_Texture = JS_Create_Texture;\n var JS_Boolean_Intersection_Graph = window.JS_Boolean_Intersection_Graph;\n exports.JS_Boolean_Intersection_Graph = JS_Boolean_Intersection_Graph;\n var JS_Boolean_Intersect_Polyline_Polygon_Xy = window.JS_Boolean_Intersect_Polyline_Polygon_Xy;\n exports.JS_Boolean_Intersect_Polyline_Polygon_Xy = JS_Boolean_Intersect_Polyline_Polygon_Xy;\n var JS_Boolean_Intersect_Polygon_Polygon_Xy = window.JS_Boolean_Intersect_Polygon_Polygon_Xy;\n exports.JS_Boolean_Intersect_Polygon_Polygon_Xy = JS_Boolean_Intersect_Polygon_Polygon_Xy;\n var JS_Boolean_Intersect_Graph_Polygon_Xy = window.JS_Boolean_Intersect_Graph_Polygon_Xy;\n exports.JS_Boolean_Intersect_Graph_Polygon_Xy = JS_Boolean_Intersect_Graph_Polygon_Xy;\n var JS_Boolean_Subtract_Polygon_Polygon_Xy = window.JS_Boolean_Subtract_Polygon_Polygon_Xy;\n exports.JS_Boolean_Subtract_Polygon_Polygon_Xy = JS_Boolean_Subtract_Polygon_Polygon_Xy;\n var JS_Boolean_Cut_Polygon_Polygon_Xy = window.JS_Boolean_Cut_Polygon_Polygon_Xy;\n exports.JS_Boolean_Cut_Polygon_Polygon_Xy = JS_Boolean_Cut_Polygon_Polygon_Xy;\n var JS_Boolean_Subtract = window.JS_Boolean_Subtract;\n exports.JS_Boolean_Subtract = JS_Boolean_Subtract;\n var JS_Feature_Extrude = window.JS_Feature_Extrude;\n exports.JS_Feature_Extrude = JS_Feature_Extrude;\n var JS_Planar_Polyline_Offset = window.JS_Planar_Polyline_Offset;\n exports.JS_Planar_Polyline_Offset = JS_Planar_Polyline_Offset;\n var JS_Init_Apis = function JS_Init_Apis() {\n if (!JS_Init_Database) {\n window.JS_Init_Database = exports.JS_Init_Database = JS_Init_Database = _GS_Init_Database;\n window.JS_Fina_Database = exports.JS_Fina_Database = JS_Fina_Database = _GS_Fina_Database;\n window.JS_Init_Multithreading_Services = exports.JS_Init_Multithreading_Services = JS_Init_Multithreading_Services = _GS_Init_Multithreading_Services;\n window.JS_Fina_Multithreading_Services = exports.JS_Fina_Multithreading_Services = JS_Fina_Multithreading_Services = _GS_Fina_Multithreading_Services;\n window.JS_Open_Segment = exports.JS_Open_Segment = JS_Open_Segment = function JS_Open_Segment(name) {\n var ptr_name = allocateUTF8(name);\n var key = _GS_Open_Segment(ptr_name);\n _free(ptr_name);\n return key;\n };\n window.JS_Open_Segment_By_Key = exports.JS_Open_Segment_By_Key = JS_Open_Segment_By_Key = _GS_Open_Segment_By_Key;\n window.JS_Close_Segment = exports.JS_Close_Segment = JS_Close_Segment = _GS_Close_Segment;\n window.JS_Delete_Segment = exports.JS_Delete_Segment = JS_Delete_Segment = function JS_Delete_Segment(name) {\n var ptr_name = allocateUTF8(name);\n _GS_Delete_Segment(ptr_name);\n _free(ptr_name);\n };\n window.JS_Delete_By_Key = exports.JS_Delete_By_Key = JS_Delete_By_Key = _GS_Delete_By_Key;\n window.JS_Clear_Geometry = exports.JS_Clear_Geometry = JS_Clear_Geometry = _GS_Clear_Geometry;\n window.JS_Clear_Geometry_By_Key = exports.JS_Clear_Geometry_By_Key = JS_Clear_Geometry_By_Key = _GS_Clear_Geometry_By_Key;\n window.JS_Clear_Attributes = exports.JS_Clear_Attributes = JS_Clear_Attributes = _GS_Clear_Attributes;\n window.JS_Clear_Attributes_By_Key = exports.JS_Clear_Attributes_By_Key = JS_Clear_Attributes_By_Key = _GS_Clear_Attributes_By_Key;\n window.JS_Clear_Includes = exports.JS_Clear_Includes = JS_Clear_Includes = _GS_Clear_Includes;\n window.JS_Clear_Includes_By_Key = exports.JS_Clear_Includes_By_Key = JS_Clear_Includes_By_Key = _GS_Clear_Includes_By_Key;\n window.JS_Clear_Styles = exports.JS_Clear_Styles = JS_Clear_Styles = _GS_Clear_Styles;\n window.JS_Clear_Styles_By_Key = exports.JS_Clear_Styles_By_Key = JS_Clear_Styles_By_Key = _GS_Clear_Styles_By_Key;\n window.JS_Clear_Subsegments = exports.JS_Clear_Subsegments = JS_Clear_Subsegments = _GS_Clear_Subsegments;\n window.JS_Clear_Subsegments_By_Key = exports.JS_Clear_Subsegments_By_Key = JS_Clear_Subsegments_By_Key = _GS_Clear_Subsegments_By_Key;\n window.JS_Clear_All = exports.JS_Clear_All = JS_Clear_All = _GS_Clear_All;\n window.JS_Clear_All_By_Key = exports.JS_Clear_All_By_Key = JS_Clear_All_By_Key = _GS_Clear_All_By_Key;\n window.JS_Include_Segment_By_Key = exports.JS_Include_Segment_By_Key = JS_Include_Segment_By_Key = _GS_Include_Segment_By_Key;\n window.JS_Conditional_Include_By_Key = exports.JS_Conditional_Include_By_Key = JS_Conditional_Include_By_Key = function JS_Conditional_Include_By_Key(key, conditions) {\n var ptr = allocateUTF8(conditions);\n _GS_Conditional_Include_By_Key(key, ptr);\n _free(ptr);\n };\n window.JS_Style_Segment_By_Key = exports.JS_Style_Segment_By_Key = JS_Style_Segment_By_Key = _GS_Style_Segment_By_Key;\n window.JS_Conditional_Style_By_Key = exports.JS_Conditional_Style_By_Key = JS_Conditional_Style_By_Key = function JS_Conditional_Style_By_Key(key, conditions) {\n var ptr = allocateUTF8(conditions);\n _GS_Conditional_Style_By_Key(key, ptr);\n _free(ptr);\n };\n window.JS_Show_Key_Type = exports.JS_Show_Key_Type = JS_Show_Key_Type = function JS_Show_Key_Type(key) {\n var ptr = Module._malloc(4);\n _GS_Show_Key_Type(key, ptr);\n var type = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return type;\n };\n window.JS_Make_Context_Current = exports.JS_Make_Context_Current = JS_Make_Context_Current = _GS_Make_Context_Current;\n window.JS_Update_Display = exports.JS_Update_Display = JS_Update_Display = _GS_Update_Display;\n window.JS_Update_View_Display_By_Key = exports.JS_Update_View_Display_By_Key = JS_Update_View_Display_By_Key = _GS_Update_View_Display_By_Key;\n window.JS_Update_View_Display_With_Framerate_By_Key = exports.JS_Update_View_Display_With_Framerate_By_Key = JS_Update_View_Display_With_Framerate_By_Key = _GS_Update_View_Display_With_Framerate_By_Key;\n window.JS_Update_View_Display_With_Time_By_Key = exports.JS_Update_View_Display_With_Time_By_Key = JS_Update_View_Display_With_Time_By_Key = _GS_Update_View_Display_With_Time_By_Key;\n window.JS_Asyn_Update_Geometry_Data_By_Key = exports.JS_Asyn_Update_Geometry_Data_By_Key = JS_Asyn_Update_Geometry_Data_By_Key = _GS_Asyn_Update_Geometry_Data_By_Key;\n window.JS_Asyn_Update_Geometry_Data_By_Key_Tt = exports.JS_Asyn_Update_Geometry_Data_By_Key_Tt = JS_Asyn_Update_Geometry_Data_By_Key_Tt = _GS_Asyn_Update_Geometry_Data_By_Key_Tt;\n window.JS_Asyn_Need_Update_View_By_Key = exports.JS_Asyn_Need_Update_View_By_Key = JS_Asyn_Need_Update_View_By_Key = _GS_Asyn_Need_Update_View_By_Key;\n window.JS_Asyn_Update_Camera_By_Key = exports.JS_Asyn_Update_Camera_By_Key = JS_Asyn_Update_Camera_By_Key = _GS_Asyn_Update_Camera_By_Key;\n window.JS_Asyn_Update_View_By_Key = exports.JS_Asyn_Update_View_By_Key = JS_Asyn_Update_View_By_Key = _GS_Asyn_Update_View_By_Key;\n window.JS_Asyn_Update_View_By_Key_Tt = exports.JS_Asyn_Update_View_By_Key_Tt = JS_Asyn_Update_View_By_Key_Tt = function JS_Asyn_Update_View_By_Key_Tt(view_key) {\n var result = _GS_Asyn_Update_View_By_Key_Tt(view_key);\n if (result) {\n return true;\n } else {\n return false;\n }\n };\n window.JS_Asyn_Render_View_By_Key = exports.JS_Asyn_Render_View_By_Key = JS_Asyn_Render_View_By_Key = _GS_Asyn_Render_View_By_Key;\n window.JS_Asyn_Render_View_With_Time_By_Key = exports.JS_Asyn_Render_View_With_Time_By_Key = JS_Asyn_Render_View_With_Time_By_Key = _GS_Asyn_Render_View_With_Time_By_Key;\n window.JS_Show_Asyn_Geometry_Data_Keys = exports.JS_Show_Asyn_Geometry_Data_Keys = JS_Show_Asyn_Geometry_Data_Keys = function JS_Show_Asyn_Geometry_Data_Keys(view_key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Asyn_Geometry_Data_Count(view_key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Asyn_Geometry_Data_Keys(view_key, ptr_list);\n result = new Int32Array(count);\n result.set(Module.HEAP32.subarray(ptr_list / 4, ptr_list / 4 + count));\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n Module._free(ptr_count);\n return result;\n };\n window.JS_Show_Asyn_Remove_Geometry_Data_Keys = exports.JS_Show_Asyn_Remove_Geometry_Data_Keys = JS_Show_Asyn_Remove_Geometry_Data_Keys = function JS_Show_Asyn_Remove_Geometry_Data_Keys(view_key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Asyn_Geometry_Data_Count(view_key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Asyn_Remove_Geometry_Data_Keys(view_key, ptr_list);\n result = new Int32Array(count);\n result.set(Module.HEAP32.subarray(ptr_list / 4, ptr_list / 4 + count));\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n Module._free(ptr_count);\n return result;\n };\n window.JS_Show_Asyn_Buffer_Geometry_Keys = exports.JS_Show_Asyn_Buffer_Geometry_Keys = JS_Show_Asyn_Buffer_Geometry_Keys = function JS_Show_Asyn_Buffer_Geometry_Keys(view_key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Asyn_Buffer_Geometry_Count(view_key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Asyn_Buffer_Geometry_Keys(view_key, ptr_list);\n result = new Int32Array(count);\n result.set(Module.HEAP32.subarray(ptr_list / 4, ptr_list / 4 + count));\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n Module._free(ptr_count);\n return result;\n };\n window.JS_Asyn_Buffer_Geometry_By_Key = exports.JS_Asyn_Buffer_Geometry_By_Key = JS_Asyn_Buffer_Geometry_By_Key = function JS_Asyn_Buffer_Geometry_By_Key(view_key, geom_keys) {\n if (geom_keys && geom_keys.length > 0) {\n var ptr_keys = Module._malloc(4 * geom_keys.length);\n Module.HEAP32.set(geom_keys, ptr_keys / 4);\n _GS_Asyn_Buffer_Geometry_By_Key(view_key, ptr_keys, geom_keys.length);\n Module._free(ptr_keys);\n }\n };\n exports.JS_Asyn_Buffer_Geometry_By_Key_Tt = JS_Asyn_Buffer_Geometry_By_Key_Tt = function JS_Asyn_Buffer_Geometry_By_Key_Tt(view_key, geom_keys, no) {\n if (geom_keys && geom_keys.length > 0) {\n var ptr_keys = Module._malloc(4 * geom_keys.length);\n Module.HEAP32.set(geom_keys, ptr_keys / 4);\n _GS_Asyn_Buffer_Geometry_By_Key_Tt(view_key, ptr_keys, geom_keys.length, no);\n Module._free(ptr_keys);\n }\n };\n window.JS_Asyn_Buffer_Geometry_By_Key_Tt = exports.JS_Asyn_Buffer_Geometry_By_Key_Tt = JS_Asyn_Buffer_Geometry_By_Key_Tt = function JS_Asyn_Buffer_Geometry_By_Key_Tt(view_key, geom_keys, no) {\n if (geom_keys && geom_keys.length > 0) {\n var ptr_keys = Module._malloc(4 * geom_keys.length);\n Module.HEAP32.set(geom_keys, ptr_keys / 4);\n _GS_Asyn_Buffer_Geometry_By_Key_Tt(view_key, ptr_keys, geom_keys.length, no);\n Module._free(ptr_keys);\n }\n };\n window.JS_Show_Asyn_Unbuffer_Geometry_Keys = JS_Show_Asyn_Unbuffer_Geometry_Keys = function JS_Show_Asyn_Unbuffer_Geometry_Keys(view_key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Asyn_Unbuffer_Geometry_Count(view_key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Asyn_Unbuffer_Geometry_Keys(view_key, ptr_list);\n result = new Int32Array(count);\n result.set(Module.HEAP32.subarray(ptr_list / 4, ptr_list / 4 + count));\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n Module._free(ptr_count);\n return result;\n };\n window.JS_Asyn_Unbuffer_Geometry_By_Key = JS_Asyn_Unbuffer_Geometry_By_Key = function JS_Asyn_Unbuffer_Geometry_By_Key(view_key, geom_keys) {\n if (geom_keys && geom_keys.length > 0) {\n var ptr_keys = Module._malloc(4 * geom_keys.length);\n Module.HEAP32.set(geom_keys, ptr_keys / 4);\n _GS_Asyn_Unbuffer_Geometry_By_Key(view_key, ptr_keys, geom_keys.length);\n Module._free(ptr_keys);\n }\n };\n window.JS_Show_Owner_By_Key = exports.JS_Show_Owner_By_Key = JS_Show_Owner_By_Key = _GS_Show_Owner_By_Key;\n window.JS_Compute_Path = exports.JS_Compute_Path = JS_Compute_Path = function JS_Compute_Path(start_key, end_key, count, path) {\n var ptr_count = Module._malloc(4);\n var ptr_path = Module._malloc(4 * 512);\n _GS_Compute_Path(start_key, end_key, ptr_count, ptr_path);\n var co = Module.HEAP32[ptr_count / 4];\n var pa = new Float32Array(co);\n for (var i = 0; i < co; i++) {\n pa[i] = Module.HEAP32[ptr_count / 4 + i];\n }\n Module._free(ptr_count);\n Module._free(ptr_path);\n return pa;\n };\n window.JS_Compute_Coordinates_By_Key = exports.JS_Compute_Coordinates_By_Key = JS_Compute_Coordinates_By_Key = function JS_Compute_Coordinates_By_Key(key, in_coordinate, in_position, out_coordinate) {\n var ptr_ic = allocateUTF8(in_coordinate);\n var ptr_oc = allocateUTF8(out_coordinate);\n var ptr_ip = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_ip / 4] = in_position[0];\n Module.HEAPF32[ptr_ip / 4 + 1] = in_position[1];\n Module.HEAPF32[ptr_ip / 4 + 2] = in_position[2];\n var ptr_op = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_op / 4] = 0;\n Module.HEAPF32[ptr_op / 4 + 1] = 0;\n Module.HEAPF32[ptr_op / 4 + 2] = 0;\n _GS_Compute_Coordinates_By_Key(key, ptr_ic, ptr_ip, ptr_oc, ptr_op);\n var out_position = new Float32Array(3);\n out_position[0] = Module.HEAPF32[ptr_op / 4];\n out_position[1] = Module.HEAPF32[ptr_op / 4 + 1];\n out_position[2] = Module.HEAPF32[ptr_op / 4 + 2];\n _free(ptr_ic);\n _free(ptr_oc);\n Module._free(ptr_ip);\n Module._free(ptr_op);\n return out_position;\n };\n window.JS_Compute_Coordinates_By_Path = exports.JS_Compute_Coordinates_By_Path = JS_Compute_Coordinates_By_Path = function JS_Compute_Coordinates_By_Path(path, in_coordinate, in_position, out_coordinate) {\n var pcount = path.length;\n var ptr_path = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAP32[ptr_path / 4 + i] = path[i];\n }\n var ptr_ic = allocateUTF8(in_coordinate);\n var ptr_oc = allocateUTF8(out_coordinate);\n var ptr_ip = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_ip / 4] = in_position[0];\n Module.HEAPF32[ptr_ip / 4 + 1] = in_position[1];\n Module.HEAPF32[ptr_ip / 4 + 2] = in_position[2];\n var ptr_op = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_op / 4] = 0;\n Module.HEAPF32[ptr_op / 4 + 1] = 0;\n Module.HEAPF32[ptr_op / 4 + 2] = 0;\n _GS_Compute_Coordinates_By_Path(ptr_path, pcount, ptr_ic, ptr_ip, ptr_oc, ptr_op);\n var out_position = new Float32Array(3);\n out_position[0] = Module.HEAPF32[ptr_op / 4];\n out_position[1] = Module.HEAPF32[ptr_op / 4 + 1];\n out_position[2] = Module.HEAPF32[ptr_op / 4 + 2];\n _free(ptr_ic);\n _free(ptr_oc);\n Module._free(ptr_ip);\n Module._free(ptr_op);\n Module._free(ptr_path);\n return out_position;\n };\n window.JS_DCompute_Coordinates_By_Key = JS_DCompute_Coordinates_By_Key = function JS_DCompute_Coordinates_By_Key(key, in_coordinate, in_positions, out_coordinate) {\n var count = in_positions.length / 3;\n var ptr_ic = allocateUTF8(in_coordinate);\n var ptr_oc = allocateUTF8(out_coordinate);\n var ptr_ip = Module._malloc(8 * 3 * count);\n Module.HEAPF64.set(new Float64Array(in_positions), ptr_ip / 8);\n var ptr_op = Module._malloc(8 * 3 * count);\n _GS_DCompute_Coordinates_By_Key(key, ptr_ic, ptr_ip, ptr_oc, ptr_op, count);\n var out_positions = new Float64Array(3 * count);\n out_positions.set(Module.HEAPF64.subarray(ptr_op / 8, ptr_op / 8 + 3 * count));\n _free(ptr_ic);\n _free(ptr_oc);\n Module._free(ptr_ip);\n Module._free(ptr_op);\n return out_positions;\n };\n window.JS_Compute_Boundingbox_By_Key = exports.JS_Compute_Boundingbox_By_Key = JS_Compute_Boundingbox_By_Key = function JS_Compute_Boundingbox_By_Key(key) {\n var ptr_min = Module._malloc(4 * 3);\n var ptr_max = Module._malloc(4 * 3);\n _GS_Compute_Boundingbox_By_Key(key, ptr_min, ptr_max);\n var bb = new Float32Array(6);\n bb[0] = Module.HEAPF32[ptr_min / 4];\n bb[1] = Module.HEAPF32[ptr_min / 4 + 1];\n bb[2] = Module.HEAPF32[ptr_min / 4 + 2];\n bb[3] = Module.HEAPF32[ptr_max / 4];\n bb[4] = Module.HEAPF32[ptr_max / 4 + 1];\n bb[5] = Module.HEAPF32[ptr_max / 4 + 2];\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n window.JS_Compute_Boundingbox_With_Visibility_By_Key = exports.JS_Compute_Boundingbox_With_Visibility_By_Key = JS_Compute_Boundingbox_With_Visibility_By_Key = function JS_Compute_Boundingbox_With_Visibility_By_Key(key, element_types) {\n var ptr_min = Module._malloc(4 * 3);\n var ptr_max = Module._malloc(4 * 3);\n _GS_Compute_Boundingbox_With_Visibility_By_Key(key, element_types, ptr_min, ptr_max);\n var bb = new Float32Array(6);\n bb[0] = Module.HEAPF32[ptr_min / 4];\n bb[1] = Module.HEAPF32[ptr_min / 4 + 1];\n bb[2] = Module.HEAPF32[ptr_min / 4 + 2];\n bb[3] = Module.HEAPF32[ptr_max / 4];\n bb[4] = Module.HEAPF32[ptr_max / 4 + 1];\n bb[5] = Module.HEAPF32[ptr_max / 4 + 2];\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n window.JS_Compute_View_Boundingbox_By_Key = exports.JS_Compute_View_Boundingbox_By_Key = JS_Compute_View_Boundingbox_By_Key = function JS_Compute_View_Boundingbox_By_Key(seg_key, key) {\n var ptr_min = Module._malloc(4 * 3);\n var ptr_max = Module._malloc(4 * 3);\n _GS_Compute_View_Boundingbox_By_Key(seg_key, key, ptr_min, ptr_max);\n var bb = new Float32Array(6);\n bb[0] = Module.HEAPF32[ptr_min / 4];\n bb[1] = Module.HEAPF32[ptr_min / 4 + 1];\n bb[2] = Module.HEAPF32[ptr_min / 4 + 2];\n bb[3] = Module.HEAPF32[ptr_max / 4];\n bb[4] = Module.HEAPF32[ptr_max / 4 + 1];\n bb[5] = Module.HEAPF32[ptr_max / 4 + 2];\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n window.JS_Compute_View_Boundingbox_By_Keys = exports.JS_Compute_View_Boundingbox_By_Keys = JS_Compute_View_Boundingbox_By_Keys = function JS_Compute_View_Boundingbox_By_Keys(seg_key, keys) {\n var ptr_min = Module._malloc(4 * 3);\n var ptr_max = Module._malloc(4 * 3);\n var ptr_keys = Module._malloc(4 * keys.length);\n Module.HEAP32.set(keys, ptr_keys / 4);\n _GS_Compute_View_Boundingbox_By_Keys(seg_key, ptr_keys, keys.length, ptr_min, ptr_max);\n var bb = new Float32Array(6);\n bb[0] = Module.HEAPF32[ptr_min / 4];\n bb[1] = Module.HEAPF32[ptr_min / 4 + 1];\n bb[2] = Module.HEAPF32[ptr_min / 4 + 2];\n bb[3] = Module.HEAPF32[ptr_max / 4];\n bb[4] = Module.HEAPF32[ptr_max / 4 + 1];\n bb[5] = Module.HEAPF32[ptr_max / 4 + 2];\n Module._free(ptr_keys);\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n window.JS_Compute_View_Boundingboxes_By_Keys = exports.JS_Compute_View_Boundingboxes_By_Keys = JS_Compute_View_Boundingboxes_By_Keys = function JS_Compute_View_Boundingboxes_By_Keys(seg_key, keys) {\n var ptr_min = Module._malloc(4 * 3 * keys.length);\n var ptr_max = Module._malloc(4 * 3 * keys.length);\n var ptr_keys = Module._malloc(4 * keys.length);\n Module.HEAP32.set(keys, ptr_keys / 4);\n _GS_Compute_View_Boundingboxes_By_Keys(seg_key, ptr_keys, keys.length, ptr_min, ptr_max);\n var bb = new Float32Array(6 * keys.length);\n for (var i = 0; i < keys.length; i++) {\n bb[i * 6] = Module.HEAPF32[ptr_min / 4 + i * 3];\n bb[i * 6 + 1] = Module.HEAPF32[ptr_min / 4 + i * 3 + 1];\n bb[i * 6 + 2] = Module.HEAPF32[ptr_min / 4 + i * 3 + 2];\n bb[i * 6 + 3] = Module.HEAPF32[ptr_max / 4 + i * 3];\n bb[i * 6 + 4] = Module.HEAPF32[ptr_max / 4 + i * 3 + 1];\n bb[i * 6 + 5] = Module.HEAPF32[ptr_max / 4 + i * 3 + 2];\n }\n Module._free(ptr_keys);\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n exports.JS_Compute_Segment_Boundingbox_By_Key = JS_Compute_Segment_Boundingbox_By_Key = _GS_Compute_Segment_Boundingbox_By_Key;\n window.JS_Clear_Segment_Boundingbox_By_Key = exports.JS_Clear_Segment_Boundingbox_By_Key = JS_Clear_Segment_Boundingbox_By_Key = _GS_Clear_Segment_Boundingbox_By_Key;\n window.JS_Show_BoundingBox_By_Key = exports.JS_Show_BoundingBox_By_Key = JS_Show_BoundingBox_By_Key = function JS_Show_BoundingBox_By_Key(key) {\n var ptr_min = Module._malloc(4 * 3);\n var ptr_max = Module._malloc(4 * 3);\n _GS_Show_BoundingBox_By_Key(key, ptr_min, ptr_max);\n var bb = new Float32Array(6);\n bb[0] = Module.HEAPF32[ptr_min / 4];\n bb[1] = Module.HEAPF32[ptr_min / 4 + 1];\n bb[2] = Module.HEAPF32[ptr_min / 4 + 2];\n bb[3] = Module.HEAPF32[ptr_max / 4];\n bb[4] = Module.HEAPF32[ptr_max / 4 + 1];\n bb[5] = Module.HEAPF32[ptr_max / 4 + 2];\n Module._free(ptr_min);\n Module._free(ptr_max);\n return bb;\n };\n window.JS_Compute_Visible_By_Key = exports.JS_Compute_Visible_By_Key = JS_Compute_Visible_By_Key = function JS_Compute_Visible_By_Key(display_key, start_key, num) {\n var ptr_count = Module._malloc(4);\n var ptr_keys = null;\n if (num) {\n ptr_keys = Module._malloc(4 * num);\n } else {\n ptr_keys = Module._malloc(4 * 1024);\n }\n _GS_Compute_Visible_By_Key(display_key, start_key, ptr_count, ptr_keys);\n var count = Module.HEAP32[ptr_count / 4];\n var keys = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n keys[i] = Module.HEAP32[ptr_keys / 4 + i];\n }\n Module._free(ptr_count);\n Module._free(ptr_keys);\n return keys;\n };\n window.JS_Show_Attribute_Count = exports.JS_Show_Attribute_Count = JS_Show_Attribute_Count = function JS_Show_Attribute_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Attribute_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Attribute_List = exports.JS_Show_Attribute_List = JS_Show_Attribute_List = function JS_Show_Attribute_List() {\n var ptr = Module._malloc(4);\n _GS_Show_Attribute_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Attribute_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_Geometry_Count = exports.JS_Show_Geometry_Count = JS_Show_Geometry_Count = function JS_Show_Geometry_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Geometry_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Geometry_List = exports.JS_Show_Geometry_List = JS_Show_Geometry_List = function JS_Show_Geometry_List() {\n var ptr = Module._malloc(4);\n _GS_Show_Geometry_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Geometry_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_Subsegment_Count = exports.JS_Show_Subsegment_Count = JS_Show_Subsegment_Count = function JS_Show_Subsegment_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Subsegment_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Subsegment_List = exports.JS_Show_Subsegment_List = JS_Show_Subsegment_List = function JS_Show_Subsegment_List() {\n var ptr = Module._malloc(4);\n _GS_Show_Subsegment_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Subsegment_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_All_Subsegment_Count = exports.JS_Show_All_Subsegment_Count = JS_Show_All_Subsegment_Count = function JS_Show_All_Subsegment_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_All_Subsegment_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_All_Subsegment_List = exports.JS_Show_All_Subsegment_List = JS_Show_All_Subsegment_List = function JS_Show_All_Subsegment_List() {\n var ptr = Module._malloc(4);\n _GS_Show_All_Subsegment_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_All_Subsegment_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_Include_Count = exports.JS_Show_Include_Count = JS_Show_Include_Count = function JS_Show_Include_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Include_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Include_List = exports.JS_Show_Include_List = JS_Show_Include_List = function JS_Show_Include_List() {\n var ptr = Module._malloc(4);\n _GS_Show_Include_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Include_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_Include = exports.JS_Show_Include = JS_Show_Include = function JS_Show_Include(index) {\n var ptr = Module._malloc(4);\n _GS_Show_Include(index, ptr);\n var key = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return key;\n };\n window.JS_Show_Include_Segment = exports.JS_Show_Include_Segment = JS_Show_Include_Segment = function JS_Show_Include_Segment(key) {\n var ptr = Module._malloc(4);\n var ptr_cd = Module._malloc(256);\n _GS_Show_Include_Segment(key, ptr, ptr_cd);\n var include_key = Module.HEAP32[ptr / 4];\n var condition = UTF8ToString(ptr_cd);\n Module._free(ptr);\n Module._free(ptr_cd);\n return {\n key: include_key,\n condition: condition\n };\n };\n window.JS_Show_Style_Count = exports.JS_Show_Style_Count = JS_Show_Style_Count = function JS_Show_Style_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Style_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Style_List = exports.JS_Show_Style_List = JS_Show_Style_List = function JS_Show_Style_List() {\n var ptr = Module._malloc(4);\n _GS_Show_Style_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n var result;\n if (count > 0) {\n var ptr_list = Module._malloc(4 * count);\n _GS_Show_Style_List(ptr_list);\n result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_list / 4 + i];\n }\n Module._free(ptr_list);\n } else {\n result = new Int32Array(0);\n }\n return result;\n };\n window.JS_Show_Style = exports.JS_Show_Style = JS_Show_Style = function JS_Show_Style(index) {\n var ptr = Module._malloc(4);\n _GS_Show_Style(index, ptr);\n var key = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return key;\n };\n window.JS_Show_Style_Segment = exports.JS_Show_Style_Segment = JS_Show_Style_Segment = function JS_Show_Style_Segment(key) {\n var ptr = Module._malloc(4);\n var ptr_cd = Module._malloc(256);\n _GS_Show_Style_Segment(key, ptr, ptr_cd);\n var style_key = Module.HEAP32[ptr / 4];\n var condition = UTF8ToString(ptr_cd);\n Module._free(ptr);\n Module._free(ptr_cd);\n return {\n key: style_key,\n condition: condition\n };\n };\n window.JS_Compute_Selection_By_Key = exports.JS_Compute_Selection_By_Key = JS_Compute_Selection_By_Key = _GS_Compute_Selection_By_Key;\n window.JS_Compute_Selection_By_Area = exports.JS_Compute_Selection_By_Area = JS_Compute_Selection_By_Area = _GS_Compute_Selection_By_Area;\n window.JS_Show_Selection_Count = exports.JS_Show_Selection_Count = JS_Show_Selection_Count = function JS_Show_Selection_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Selection_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Selection_Element = exports.JS_Show_Selection_Element = JS_Show_Selection_Element = function JS_Show_Selection_Element(index) {\n var ptr = Module._malloc(4);\n _GS_Show_Selection_Element(index, ptr);\n var key = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return key;\n };\n window.JS_Show_Selection_Path = exports.JS_Show_Selection_Path = JS_Show_Selection_Path = function JS_Show_Selection_Path(index) {\n var ptr_path = Module._malloc(4096);\n _GS_Show_Selection_Path(index, ptr_path);\n var path = UTF8ToString(ptr_path);\n Module._free(ptr_path);\n return path;\n };\n window.JS_Show_Selection_Path_By_Keys = exports.JS_Show_Selection_Path_By_Keys = JS_Show_Selection_Path_By_Keys = function JS_Show_Selection_Path_By_Keys(index) {\n var ptr_count = Module._malloc(4);\n var ptr_keys = Module._malloc(4 * 512);\n _GS_Show_Selection_Path_By_Keys(index, ptr_count, ptr_keys);\n var count = Module.HEAP32[ptr_count / 4];\n var result = new Int32Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = Module.HEAP32[ptr_keys / 4 + i];\n }\n Module._free(ptr_count);\n Module._free(ptr_keys);\n return result;\n };\n window.JS_Show_Selection_Position = exports.JS_Show_Selection_Position = JS_Show_Selection_Position = function JS_Show_Selection_Position(index) {\n var ptr_value = Module._malloc(4 * 6);\n _GS_Show_Selection_Position_By_Value(index, ptr_value);\n var pos = new Float32Array(6);\n pos[0] = Module.HEAPF32[ptr_value / 4];\n pos[1] = Module.HEAPF32[ptr_value / 4 + 1];\n pos[2] = Module.HEAPF32[ptr_value / 4 + 2];\n pos[3] = Module.HEAPF32[ptr_value / 4 + 3];\n pos[4] = Module.HEAPF32[ptr_value / 4 + 4];\n pos[5] = Module.HEAPF32[ptr_value / 4 + 5];\n Module._free(ptr_value);\n return pos;\n };\n window.JS_Show_Selection_Param = exports.JS_Show_Selection_Param = JS_Show_Selection_Param = function JS_Show_Selection_Param(index) {\n var ptr_value = Module._malloc(4);\n _GS_Show_Selection_Param(index, ptr_value);\n var param = Module.HEAPF32[ptr_value / 4];\n Module._free(ptr_value);\n return param;\n };\n window.JS_Show_Selection_Indexes = exports.JS_Show_Selection_Indexes = JS_Show_Selection_Indexes = function JS_Show_Selection_Indexes(index) {\n var ptr_value = Module._malloc(4 * 6);\n _GS_Show_Selection_Indexes(index, ptr_value);\n var idx = new Int32Array(6);\n idx[0] = Module.HEAP32[ptr_value / 4];\n idx[1] = Module.HEAP32[ptr_value / 4 + 1];\n idx[2] = Module.HEAP32[ptr_value / 4 + 2];\n idx[3] = Module.HEAP32[ptr_value / 4 + 3];\n idx[4] = Module.HEAP32[ptr_value / 4 + 4];\n idx[5] = Module.HEAP32[ptr_value / 4 + 5];\n Module._free(ptr_value);\n return idx;\n };\n window.JS_Show_Selection_Test_Info = exports.JS_Show_Selection_Test_Info = JS_Show_Selection_Test_Info = function JS_Show_Selection_Test_Info(index) {\n var ptr_value = Module._malloc(4 * 15);\n _GS_Show_Selection_Test_Info(index, ptr_value);\n var pos = new Float32Array(15);\n pos[0] = Module.HEAPF32[ptr_value / 4];\n pos[1] = Module.HEAPF32[ptr_value / 4 + 1];\n pos[2] = Module.HEAPF32[ptr_value / 4 + 2];\n pos[3] = Module.HEAPF32[ptr_value / 4 + 3];\n pos[4] = Module.HEAPF32[ptr_value / 4 + 4];\n pos[5] = Module.HEAPF32[ptr_value / 4 + 5];\n pos[6] = Module.HEAPF32[ptr_value / 4 + 6];\n pos[7] = Module.HEAPF32[ptr_value / 4 + 7];\n pos[8] = Module.HEAPF32[ptr_value / 4 + 8];\n pos[9] = Module.HEAPF32[ptr_value / 4 + 9];\n pos[10] = Module.HEAPF32[ptr_value / 4 + 10];\n pos[11] = Module.HEAPF32[ptr_value / 4 + 11];\n pos[12] = Module.HEAPF32[ptr_value / 4 + 12];\n pos[13] = Module.HEAPF32[ptr_value / 4 + 13];\n pos[14] = Module.HEAPF32[ptr_value / 4 + 14];\n Module._free(ptr_value);\n return pos;\n };\n window.JS_Compute_Collision_By_Key = exports.JS_Compute_Collision_By_Key = JS_Compute_Collision_By_Key = function JS_Compute_Collision_By_Key(viewKey, oneKey, twoKey, type, options) {\n var ptr_options = null;\n if (options) {\n ptr_options = allocateUTF8(options);\n }\n var count = _GS_Compute_Collision_By_Key(viewKey, oneKey, twoKey, type, ptr_options);\n if (ptr_options) {\n _free(ptr_options);\n }\n return count;\n };\n window.JS_Compute_Collision_By_Keys = exports.JS_Compute_Collision_By_Keys = JS_Compute_Collision_By_Keys = function JS_Compute_Collision_By_Keys(view_key, oneKeys, twoKeys, type) {\n if (oneKeys.length > 0 && twoKeys.length > 0) {\n var ptr_one_keys = Module._malloc(4 * oneKeys.length);\n Module.HEAP32.set(oneKeys, ptr_one_keys / 4);\n var ptr_two_keys = Module._malloc(4 * twoKeys.length);\n Module.HEAP32.set(twoKeys, ptr_two_keys / 4);\n var count = _GS_Compute_Collision_By_Keys(view_key, ptr_one_keys, oneKeys.length, ptr_two_keys, twoKeys.length, type);\n Module._free(ptr_one_keys);\n Module._free(ptr_two_keys);\n return count;\n } else {\n return -1;\n }\n };\n window.JS_Compute_Collision_By_Keys_Tt = exports.JS_Compute_Collision_By_Keys_Tt = JS_Compute_Collision_By_Keys_Tt = function JS_Compute_Collision_By_Keys_Tt(view_key, oneKeys, twoKeys, type) {\n if (oneKeys.length > 0 && twoKeys.length > 0) {\n var ptr_one_keys = Module._malloc(4 * oneKeys.length);\n for (var i = 0; i < oneKeys.length; i++) {\n Module.HEAP32[ptr_one_keys / 4 + i] = oneKeys[i];\n }\n var ptr_two_keys = Module._malloc(4 * twoKeys.length);\n for (var i = 0; i < twoKeys.length; i++) {\n Module.HEAP32[ptr_two_keys / 4 + i] = twoKeys[i];\n }\n var count = _GS_Compute_Collision_By_Keys_Tt(view_key, ptr_one_keys, oneKeys.length, ptr_two_keys, twoKeys.length, type);\n Module._free(ptr_one_keys);\n Module._free(ptr_two_keys);\n return count;\n } else {\n return -1;\n }\n };\n window.JS_Compute_Collision_By_Key_Tt = exports.JS_Compute_Collision_By_Key_Tt = JS_Compute_Collision_By_Key_Tt = function JS_Compute_Collision_By_Key_Tt(viewkey, oneKey, twoKey, type, no, options) {\n var ptr_options = null;\n if (options) {\n ptr_options = allocateUTF8(options);\n }\n var count = _GS_Compute_Collision_By_Key_Tt(viewkey, oneKey, twoKey, type, no, ptr_options);\n if (ptr_options) {\n _free(ptr_options);\n }\n return count;\n };\n window.JS_Show_Collision_Status = exports.JS_Show_Collision_Status = JS_Show_Collision_Status = function JS_Show_Collision_Status() {\n var ptrTotal = Module._malloc(4);\n var ptrCurrent = Module._malloc(4);\n _GS_Show_Collision_Status(ptrTotal, ptrCurrent);\n var total = Module.HEAP32[ptrTotal / 4];\n var current = Module.HEAP32[ptrCurrent / 4];\n Module._free(ptrTotal);\n Module._free(ptrCurrent);\n return [total, current];\n };\n window.JS_Show_Collision_Count = exports.JS_Show_Collision_Count = JS_Show_Collision_Count = function JS_Show_Collision_Count() {\n var ptr = Module._malloc(4);\n _GS_Show_Collision_Count(ptr);\n var count = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return count;\n };\n window.JS_Show_Collision_Elements = exports.JS_Show_Collision_Elements = JS_Show_Collision_Elements = function JS_Show_Collision_Elements(index) {\n var ptr_seg_one = Module._malloc(4);\n var ptr_seg_two = Module._malloc(4);\n var ptr_geom_one = Module._malloc(4);\n var ptr_geom_two = Module._malloc(4);\n _GS_Show_Collision_Elements(index, ptr_seg_one, ptr_seg_two, ptr_geom_one, ptr_geom_two);\n var key_seg_one = Module.HEAP32[ptr_seg_one / 4];\n var key_seg_two = Module.HEAP32[ptr_seg_two / 4];\n var key_geom_one = Module.HEAP32[ptr_geom_one / 4];\n var key_geom_two = Module.HEAP32[ptr_geom_two / 4];\n Module._free(ptr_seg_one);\n Module._free(ptr_seg_two);\n Module._free(ptr_geom_one);\n Module._free(ptr_geom_two);\n return new Int32Array([key_seg_one, key_seg_two, key_geom_one, key_geom_two]);\n };\n window.JS_Show_Collision_Paths = exports.JS_Show_Collision_Paths = JS_Show_Collision_Paths = function JS_Show_Collision_Paths(index) {\n var ptr_path_one = Module._malloc(1024);\n var ptr_path_two = Module._malloc(1024);\n _GS_Show_Collision_Paths(index, ptr_path_one, ptr_path_two);\n var path_one = UTF8ToString(ptr_path_one);\n var path_two = UTF8ToString(ptr_path_two);\n Module._free(ptr_path_one);\n Module._free(ptr_path_two);\n return [path_one, path_two];\n };\n window.JS_Show_Collision_Path_By_Keys = exports.JS_Show_Collision_Path_By_Keys = JS_Show_Collision_Path_By_Keys = function JS_Show_Collision_Path_By_Keys(index) {\n var ptr_count_one = Module._malloc(4);\n var ptr_keys_one = Module._malloc(4 * 512);\n var ptr_count_two = Module._malloc(4);\n var ptr_keys_two = Module._malloc(4 * 512);\n _GS_Show_Collision_Path_By_Keys(index, ptr_count_one, ptr_keys_one, ptr_count_two, ptr_keys_two);\n var count_one = Module.HEAP32[ptr_count_one / 4];\n var result_one = new Int32Array(count_one);\n var count_two = Module.HEAP32[ptr_count_two / 4];\n var result_two = new Int32Array(count_two);\n for (var i = 0; i < count_one; i++) {\n result_one[i] = Module.HEAP32[ptr_keys_one / 4 + i];\n }\n for (var i = 0; i < count_two; i++) {\n result_two[i] = Module.HEAP32[ptr_keys_two / 4 + i];\n }\n Module._free(ptr_count_one);\n Module._free(ptr_keys_one);\n Module._free(ptr_count_two);\n Module._free(ptr_keys_two);\n return [result_one, result_two];\n };\n window.JS_Show_Collision_Position = exports.JS_Show_Collision_Position = JS_Show_Collision_Position = function JS_Show_Collision_Position(index) {\n var ptr_value = Module._malloc(4 * 6);\n _GS_Show_Collision_Position(index, ptr_value);\n var pos = new Float32Array(3);\n pos[0] = Module.HEAPF32[ptr_value / 4];\n pos[1] = Module.HEAPF32[ptr_value / 4 + 1];\n pos[2] = Module.HEAPF32[ptr_value / 4 + 2];\n Module._free(ptr_value);\n return pos;\n };\n window.JS_Show_Collision_Type = exports.JS_Show_Collision_Type = JS_Show_Collision_Type = function JS_Show_Collision_Type(index) {\n var ptr = Module._malloc(4);\n _GS_Show_Collision_Type(index, ptr);\n var type = Module.HEAP32[ptr / 4];\n Module._free(ptr);\n return type;\n };\n window.JS_Show_Segment_Name = exports.JS_Show_Segment_Name = JS_Show_Segment_Name = function JS_Show_Segment_Name(key) {\n var ptr_name = Module._malloc(256);\n _GS_Show_Segment_Name(key, ptr_name);\n var name = UTF8ToString(ptr_name);\n Module._free(ptr_name);\n return name;\n };\n window.JS_Show_Segment_Path = exports.JS_Show_Segment_Path = JS_Show_Segment_Path = function JS_Show_Segment_Path(key) {\n var ptr_path = Module._malloc(1024);\n _GS_Show_Segment_Path(key, ptr_path);\n var path = UTF8ToString(ptr_path);\n Module._free(ptr_path);\n return path;\n };\n window.JS_Segment_Exists = exports.JS_Segment_Exists = JS_Segment_Exists = function JS_Segment_Exists(name) {\n var ptr = allocateUTF8(name);\n var result = _GS_Segment_Exists(ptr);\n _free(ptr);\n return result;\n };\n window.JS_Move_Key = exports.JS_Move_Key = JS_Move_Key = function JS_Move_Key(key, new_owner_path) {\n var ptr = allocateUTF8(new_owner_path);\n _GS_Move_Key(key, ptr);\n _free(ptr);\n };\n window.JS_Rename_Segment = exports.JS_Rename_Segment = JS_Rename_Segment = function JS_Rename_Segment(name) {\n var ptr = allocateUTF8(name);\n var result = _GS_Rename_Segment(ptr);\n _free(ptr);\n return result;\n };\n window.JS_Move_Key_By_Key = exports.JS_Move_Key_By_Key = JS_Move_Key_By_Key = _GS_Move_Key_By_Key;\n window.JS_Add_Font_Library = exports.JS_Add_Font_Library = JS_Add_Font_Library = function JS_Add_Font_Library(name, data) {\n var ptr_name = allocateUTF8(name);\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Add_Font_Library(ptr_name, ptr_data, data.byteLength);\n Module._free(ptr_data);\n _free(ptr_name);\n array = null;\n };\n window.JS_Font_Library_Exists = exports.JS_Font_Library_Exists = JS_Font_Library_Exists = function JS_Font_Library_Exists(name) {\n var result = false;\n var ptr_name = allocateUTF8(name);\n result = _GS_Font_Library_Exists(ptr_name);\n _free(ptr_name);\n return result;\n };\n window.JS_Remove_Font_Library = exports.JS_Remove_Font_Library = JS_Remove_Font_Library = function JS_Remove_Font_Library(name) {\n var result = false;\n var ptr_name = allocateUTF8(name);\n result = _GS_Remove_Font_Library(ptr_name);\n _free(ptr_name);\n return result;\n };\n window.JS_Clear_Font_Library = _GS_Clear_Font_Library;\n window.JS_Set_Driver_Configs = exports.JS_Set_Driver_Configs = JS_Set_Driver_Configs = function JS_Set_Driver_Configs(configs) {\n var ptr_configs = allocateUTF8(configs);\n _GS_Set_Driver_Configs(ptr_configs);\n _free(ptr_configs);\n };\n window.JS_Add_Property_Boolean = exports.JS_Add_Property_Boolean = JS_Add_Property_Boolean = function JS_Add_Property_Boolean(key, name, value) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(4);\n if (value) {\n Module.HEAP32[ptr_value / 4] = 1;\n } else {\n Module.HEAP32[ptr_value / 4] = 0;\n }\n _GS_Add_Property_Boolean(key, ptr, ptr_value);\n _free(ptr);\n Module._free(ptr_value);\n };\n window.JS_Add_Property_Integer = exports.JS_Add_Property_Integer = JS_Add_Property_Integer = function JS_Add_Property_Integer(key, name, value) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(4);\n Module.HEAP32[ptr_value / 4] = value;\n _GS_Add_Property_Integer(key, ptr, ptr_value);\n _free(ptr);\n Module._free(ptr_value);\n };\n window.JS_Add_Property_Double = exports.JS_Add_Property_Double = JS_Add_Property_Double = function JS_Add_Property_Double(key, name, value) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(8);\n Module.HEAPF64[ptr_value / 8] = value;\n _GS_Add_Property_Double_By_Pointer(key, ptr, ptr_value);\n _free(ptr);\n Module._free(ptr_value);\n };\n window.JS_Add_Property_String = exports.JS_Add_Property_String = JS_Add_Property_String = function JS_Add_Property_String(key, name, value) {\n var ptr = allocateUTF8(name);\n var ptr_value = allocateUTF8(value);\n _GS_Add_Property_String(key, ptr, ptr_value);\n _free(ptr);\n _free(ptr_value);\n };\n window.JS_Add_Property_Json = exports.JS_Add_Property_Json = JS_Add_Property_Json = function JS_Add_Property_Json(key, name, value) {\n var ptr = allocateUTF8(name);\n var ptr_value = allocateUTF8(value);\n _GS_Add_Property_Json(key, ptr, ptr_value);\n _free(ptr);\n _free(ptr_value);\n };\n window.JS_Show_Property_Type = exports.JS_Show_Property_Type = JS_Show_Property_Type = function JS_Show_Property_Type(key, name) {\n var ptr = allocateUTF8(name);\n var ptr_type = Module._malloc(4);\n _GS_Show_Property_Type(key, ptr, ptr_type);\n var type = Module.HEAP32[ptr_type / 4];\n _free(ptr);\n _free(ptr_type);\n return type;\n };\n window.JS_Show_Property_Boolean = exports.JS_Show_Property_Boolean = JS_Show_Property_Boolean = function JS_Show_Property_Boolean(key, name) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(4);\n _GS_Show_Property_Boolean(key, ptr, ptr_value);\n var value = Module.HEAP32[ptr_value / 4];\n _free(ptr);\n _free(ptr_value);\n if (value == 1) {\n return true;\n } else {\n return false;\n }\n };\n window.JS_Show_Property_Integer = exports.JS_Show_Property_Integer = JS_Show_Property_Integer = function JS_Show_Property_Integer(key, name) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(4);\n _GS_Show_Property_Integer(key, ptr, ptr_value);\n var value = Module.HEAP32[ptr_value / 4];\n _free(ptr);\n _free(ptr_value);\n return value;\n };\n window.JS_Show_Property_Double = exports.JS_Show_Property_Double = JS_Show_Property_Double = function JS_Show_Property_Double(key, name) {\n var ptr = allocateUTF8(name);\n var ptr_value = Module._malloc(8);\n _GS_Show_Property_Double(key, ptr, ptr_value);\n var value = Module.HEAPF64[ptr_value / 8];\n _free(ptr);\n _free(ptr_value);\n return value;\n };\n window.JS_Show_Property_String = exports.JS_Show_Property_String = JS_Show_Property_String = function JS_Show_Property_String(key, name) {\n var result = null;\n var ptr = allocateUTF8(name);\n var ptr_len = Module._malloc(4);\n _GS_Show_Property_String_Length(key, ptr, ptr_len);\n var len = Module.HEAP32[ptr_len / 4];\n if (len > 0) {\n var ptr_value = Module._malloc(len + 1);\n _GS_Show_Property_String(key, ptr, ptr_value);\n result = UTF8ToString(ptr_value);\n Module._free(ptr_value);\n }\n _free(ptr);\n Module._free(ptr_len);\n return result;\n };\n window.JS_Property_Exists = exports.JS_Property_Exists = JS_Property_Exists = function JS_Property_Exists(key, name) {\n var ptr = allocateUTF8(name);\n var result = _GS_Property_Exists(key, ptr);\n _free(ptr);\n return result;\n };\n window.JS_Remove_Property = exports.JS_Remove_Property = _JS_Remove_Property = function JS_Remove_Property(key, name) {\n var ptr = allocateUTF8(name);\n _JS_Remove_Property(key, ptr);\n _free(ptr);\n };\n window.JS_Clear_Properties = exports.JS_Clear_Properties = JS_Clear_Properties = _GS_Clear_Properties;\n window.JS_Show_Properties = exports.JS_Show_Properties = JS_Show_Properties = function JS_Show_Properties(key) {\n var result = new gs_collections_1.StringKeyList();\n var ptr_count = Module._malloc(4);\n _GS_Show_Property_Count(key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n for (var i = 0; i < count; i++) {\n var ptr_type = Module._malloc(4);\n var ptr_name_len = Module._malloc(4);\n var ptr_value_len = Module._malloc(4);\n _GS_Show_Property_Type_By_Index(key, i, ptr_type);\n _GS_Show_Property_Length_By_Index(key, i, ptr_name_len, ptr_value_len);\n var type = Module.HEAP32[ptr_type / 4];\n var name_len = Module.HEAP32[ptr_name_len / 4];\n var value_len = Module.HEAP32[ptr_value_len / 4];\n if (type == 1) {\n var ptr_name = Module._malloc(name_len + 1);\n var ptr_value = Module._malloc(4);\n _GS_Show_Property_By_Index(key, i, ptr_name, ptr_value);\n var name = UTF8ToString(ptr_name);\n var value = Module.HEAP32[ptr_value / 4];\n result.add(name, value);\n Module._free(ptr_name);\n Module._free(ptr_value);\n } else if (type == 2) {\n var ptr_name = Module._malloc(name_len + 1);\n var ptr_value = Module._malloc(4);\n _GS_Show_Property_By_Index(key, i, ptr_name, ptr_value);\n var name = UTF8ToString(ptr_name);\n var value = Module.HEAP32[ptr_value / 4];\n result.add(name, value);\n Module._free(ptr_name);\n Module._free(ptr_value);\n } else if (type == 3) {\n var ptr_name = Module._malloc(name_len + 1);\n var ptr_value = Module._malloc(8);\n _GS_Show_Property_By_Index(key, i, ptr_name, ptr_value);\n var name = UTF8ToString(ptr_name);\n var value = Module.HEAPF64[ptr_value / 8];\n result.add(name, value);\n Module._free(ptr_name);\n Module._free(ptr_value);\n } else if (type == 4 || type == 5) {\n var ptr_name = Module._malloc(name_len + 1);\n var ptr_value = Module._malloc(value_len + 1);\n _GS_Show_Property_By_Index(key, i, ptr_name, ptr_value);\n var name = UTF8ToString(ptr_name);\n var value = UTF8ToString(ptr_value);\n result.add(name, value);\n Module._free(ptr_name);\n Module._free(ptr_value);\n }\n Module._free(ptr_type);\n Module._free(ptr_name_len);\n Module._free(ptr_value_len);\n }\n Module._free(ptr_count);\n return result;\n };\n window.JS_Show_Key_By_Id = exports.JS_Show_Key_By_Id = JS_Show_Key_By_Id = function JS_Show_Key_By_Id(id) {\n var ptr = allocateUTF8(id);\n var key = _GS_Show_Key_By_Id(ptr);\n _free(ptr);\n return key;\n };\n window.JS_Set_Key_Index = exports.JS_Set_Key_Index = JS_Set_Key_Index = _GS_Set_Key_Index;\n window.JS_Show_Key_Index = exports.JS_Show_Key_Index = JS_Show_Key_Index = function JS_Show_Key_Index(key) {\n var ptr_index = Module._malloc(4);\n _GS_Show_Key_Index(key, ptr_index);\n var index = Module.HEAP32[ptr_index / 4];\n Module._free(ptr_index);\n return index;\n };\n window.JS_Show_Key_Tag = exports.JS_Show_Key_Tag = JS_Show_Key_Tag = function JS_Show_Key_Tag(key) {\n var result = null;\n var ptr_tag = Module._malloc(512);\n if (_GS_Show_Key_Tag(key, ptr_tag)) {\n result = UTF8ToString(ptr_tag);\n }\n Module._free(ptr_tag);\n return result;\n };\n window.JS_Set_Driver_Options = exports.JS_Set_Driver_Options = JS_Set_Driver_Options = function JS_Set_Driver_Options(options) {\n var ptr_options = allocateUTF8(options);\n _GS_Set_Driver_Options(ptr_options);\n _free(ptr_options);\n };\n window.JS_Show_Driver_Options = exports.JS_Show_Driver_Options = JS_Show_Driver_Options = function JS_Show_Driver_Options() {\n var ptr_ro = Module._malloc(512);\n _GS_Show_Driver_Options(ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_ro);\n return ro;\n };\n window.JS_Show_One_Driver_Option = exports.JS_Show_One_Driver_Option = JS_Show_One_Driver_Option = function JS_Show_One_Driver_Option(name) {\n var ptr = allocateUTF8(name);\n var ptr_ro = Module._malloc(512);\n _GS_Show_One_Driver_Option(ptr, ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_ro);\n _free(ptr);\n return ro;\n };\n window.JS_Set_Shader = exports.JS_Set_Shader = JS_Set_Shader = function JS_Set_Shader(shader) {\n var ptr_shader = allocateUTF8(shader);\n _GS_Set_Shader(ptr_shader);\n _free(ptr_shader);\n };\n window.JS_Show_Shader = exports.JS_Show_Shader = JS_Show_Shader = function JS_Show_Shader() {\n var ptr_sh = Module._malloc(20400);\n _GS_Show_Shader(ptr_sh);\n var sh = UTF8ToString(ptr_sh);\n Module._free(ptr_sh);\n return sh;\n };\n window.JS_Show_One_Shader = exports.JS_Show_One_Shader = JS_Show_One_Shader = function JS_Show_One_Shader(name) {\n var ptr = allocateUTF8(name);\n var ptr_sh = Module._malloc(20400);\n var succeed = _GS_Show_One_Shader(ptr, ptr_sh);\n var sh = null;\n if (succeed) {\n var sh_1 = UTF8ToString(ptr_sh);\n }\n Module._free(ptr_sh);\n _free(ptr);\n return sh;\n };\n window.JS_UnSet_Shader = exports.JS_UnSet_Shader = JS_UnSet_Shader = _GS_UnSet_Shader;\n window.JS_Set_Viewport = exports.JS_Set_Viewport = JS_Set_Viewport = function JS_Set_Viewport(x, y, width, height, type) {\n var ptr_type = allocateUTF8(type);\n _GS_Set_Viewport(x, y, width, height, ptr_type);\n _free(ptr_type);\n };\n window.JS_Set_Camera = exports.JS_Set_Camera = JS_Set_Camera = function JS_Set_Camera(pos, tar, up, width, height, projection) {\n var ptr_pos = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_pos / 8] = pos[0];\n Module.HEAPF64[ptr_pos / 8 + 1] = pos[1];\n Module.HEAPF64[ptr_pos / 8 + 2] = pos[2];\n var ptr_tar = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_tar / 8] = tar[0];\n Module.HEAPF64[ptr_tar / 8 + 1] = tar[1];\n Module.HEAPF64[ptr_tar / 8 + 2] = tar[2];\n var ptr_up = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_up / 8] = up[0];\n Module.HEAPF64[ptr_up / 8 + 1] = up[1];\n Module.HEAPF64[ptr_up / 8 + 2] = up[2];\n var ptr_proj = allocateUTF8(projection);\n _GS_Set_Camera(ptr_pos, ptr_tar, ptr_up, width, height, ptr_proj);\n Module._free(ptr_pos);\n Module._free(ptr_tar);\n Module._free(ptr_up);\n _free(ptr_proj);\n };\n window.JS_Set_Camera_Position = exports.JS_Set_Camera_Position = JS_Set_Camera_Position = function JS_Set_Camera_Position(pos) {\n var ptr_pos = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_pos / 8] = pos[0];\n Module.HEAPF64[ptr_pos / 8 + 1] = pos[1];\n Module.HEAPF64[ptr_pos / 8 + 2] = pos[2];\n _GS_Set_Camera_Position(ptr_pos);\n Module._free(ptr_pos);\n };\n window.JS_Set_Camera_Target = exports.JS_Set_Camera_Target = JS_Set_Camera_Target = function JS_Set_Camera_Target(tar) {\n var ptr_tar = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_tar / 8] = tar[0];\n Module.HEAPF64[ptr_tar / 8 + 1] = tar[1];\n Module.HEAPF64[ptr_tar / 8 + 2] = tar[2];\n _GS_Set_Camera_Target(ptr_tar);\n Module._free(ptr_tar);\n };\n window.JS_Set_Camera_Up = exports.JS_Set_Camera_Up = JS_Set_Camera_Up = function JS_Set_Camera_Up(up) {\n var ptr_up = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_up / 8] = up[0];\n Module.HEAPF64[ptr_up / 8 + 1] = up[1];\n Module.HEAPF64[ptr_up / 8 + 2] = up[2];\n _GS_Set_Camera_Up(ptr_up);\n Module._free(ptr_up);\n };\n window.JS_Set_Camera_Field = exports.JS_Set_Camera_Field = JS_Set_Camera_Field = _GS_Set_Camera_Field;\n window.JS_Set_Camera_Extent = exports.JS_Set_Camera_Extent = JS_Set_Camera_Extent = _GS_Set_Camera_Extent;\n window.JS_Set_Camera_Projection = exports.JS_Set_Camera_Projection = JS_Set_Camera_Projection = function JS_Set_Camera_Projection(projection) {\n var ptr_proj = allocateUTF8(projection);\n _GS_Set_Camera_Projection(ptr_proj);\n _free(ptr_proj);\n };\n window.JS_Keep_Camera_Ratio = exports.JS_Keep_Camera_Ratio = JS_Keep_Camera_Ratio = _GS_Keep_Camera_Ratio;\n window.JS_Show_Camera = exports.JS_Show_Camera = JS_Show_Camera = function JS_Show_Camera() {\n var ptr_pos = Module._malloc(8 * 3);\n var ptr_tar = Module._malloc(8 * 3);\n var ptr_up = Module._malloc(8 * 3);\n var ptr_width = Module._malloc(8);\n var ptr_height = Module._malloc(8);\n var ptr_proj = Module._malloc(64);\n _GS_Show_Camera(ptr_pos, ptr_tar, ptr_up, ptr_width, ptr_height, ptr_proj);\n var camera = {};\n var pos = new Float64Array(3);\n pos[0] = Module.HEAPF64[ptr_pos / 8];\n pos[1] = Module.HEAPF64[ptr_pos / 8 + 1];\n pos[2] = Module.HEAPF64[ptr_pos / 8 + 2];\n camera.position = pos;\n var tar = new Float64Array(3);\n tar[0] = Module.HEAPF64[ptr_tar / 8];\n tar[1] = Module.HEAPF64[ptr_tar / 8 + 1];\n tar[2] = Module.HEAPF64[ptr_tar / 8 + 2];\n camera.target = tar;\n var up = new Float64Array(3);\n up[0] = Module.HEAPF64[ptr_up / 8];\n up[1] = Module.HEAPF64[ptr_up / 8 + 1];\n up[2] = Module.HEAPF64[ptr_up / 8 + 2];\n camera.up = up;\n camera.width = Module.HEAPF64[ptr_width / 8];\n camera.height = Module.HEAPF64[ptr_height / 8];\n camera.projection = UTF8ToString(ptr_proj);\n Module._free(ptr_pos);\n Module._free(ptr_tar);\n Module._free(ptr_up);\n Module._free(ptr_width);\n Module._free(ptr_height);\n Module._free(ptr_proj);\n return camera;\n };\n window.JS_Show_Camera_Position = exports.JS_Show_Camera_Position = JS_Show_Camera_Position = function JS_Show_Camera_Position() {\n var ptr_pos = Module._malloc(8 * 3);\n _GS_Show_Camera_Position(ptr_pos);\n var pos = new Float64Array(3);\n pos[0] = Module.HEAPF64[ptr_pos / 8];\n pos[1] = Module.HEAPF64[ptr_pos / 8 + 1];\n pos[2] = Module.HEAPF64[ptr_pos / 8 + 2];\n Module._free(ptr_pos);\n return pos;\n };\n window.JS_Show_Camera_Target = exports.JS_Show_Camera_Target = JS_Show_Camera_Target = function JS_Show_Camera_Target() {\n var ptr_tar = Module._malloc(8 * 3);\n _GS_Show_Camera_Target(ptr_tar);\n var tar = new Float64Array(3);\n tar[0] = Module.HEAPF64[ptr_tar / 8];\n tar[1] = Module.HEAPF64[ptr_tar / 8 + 1];\n tar[2] = Module.HEAPF64[ptr_tar / 8 + 2];\n Module._free(ptr_tar);\n return tar;\n };\n window.JS_Show_Camera_Up = exports.JS_Show_Camera_Up = JS_Show_Camera_Up = function JS_Show_Camera_Up() {\n var ptr_up = Module._malloc(8 * 3);\n _GS_Show_Camera_Up(ptr_up);\n var up = new Float64Array(3);\n up[0] = Module.HEAPF64[ptr_up / 8];\n up[1] = Module.HEAPF64[ptr_up / 8 + 1];\n up[2] = Module.HEAPF64[ptr_up / 8 + 2];\n Module._free(ptr_up);\n return up;\n };\n window.JS_Show_Camera_Field = exports.JS_Show_Camera_Field = JS_Show_Camera_Field = function JS_Show_Camera_Field() {\n var ptr_width = Module._malloc(8);\n var ptr_height = Module._malloc(8);\n var field = new Float64Array(2);\n _GS_Show_Camera_Field(ptr_width, ptr_height);\n field[0] = Module.HEAPF64[ptr_width / 8];\n field[1] = Module.HEAPF64[ptr_height / 8];\n Module._free(ptr_width);\n Module._free(ptr_height);\n return field;\n };\n window.JS_Show_Camera_Extent = exports.JS_Show_Camera_Extent = JS_Show_Camera_Extent = function JS_Show_Camera_Extent() {\n var ptr_near = Module._malloc(8);\n var ptr_far = Module._malloc(8);\n var extent = new Float64Array(2);\n _GS_Show_Camera_Extent(ptr_near, ptr_far);\n extent[0] = Module.HEAPF64[ptr_near / 8];\n extent[1] = Module.HEAPF64[ptr_far / 8];\n Module._free(ptr_near);\n Module._free(ptr_far);\n return extent;\n };\n window.JS_Show_Camera_Projection = exports.JS_Show_Camera_Projection = JS_Show_Camera_Projection = function JS_Show_Camera_Projection() {\n var ptr_proj = Module._malloc(64);\n _GS_Show_Camera_Projection(ptr_proj);\n var projection = UTF8ToString(ptr_proj);\n Module._free(ptr_proj);\n return projection;\n };\n window.JS_Show_Camera_Projection_Matrix = exports.JS_Show_Camera_Projection_Matrix = JS_Show_Camera_Projection_Matrix = function JS_Show_Camera_Projection_Matrix() {\n var ptr_mat = Module._malloc(4 * 16);\n _GS_Show_Camera_Projection_Matrix(ptr_mat);\n var mat = new Float32Array(16);\n for (var i = 0; i < 16; i++) {\n mat[i] = Module.HEAPF32[ptr_mat / 4 + i];\n }\n Module._free(ptr_mat);\n return mat;\n };\n window.JS_Show_Camera_View_Matrix = exports.JS_Show_Camera_View_Matrix = JS_Show_Camera_View_Matrix = function JS_Show_Camera_View_Matrix() {\n var ptr_mat = Module._malloc(4 * 16);\n _GS_Show_Camera_View_Matrix(ptr_mat);\n var mat = new Float32Array(16);\n for (var i = 0; i < 16; i++) {\n mat[i] = Module.HEAPF32[ptr_mat / 4 + i];\n }\n Module._free(ptr_mat);\n return mat;\n };\n window.JS_Show_Path_Camera_Position = exports.JS_Show_Path_Camera_Position = JS_Show_Path_Camera_Position = function JS_Show_Path_Camera_Position(path) {\n var pcount = path.length;\n var ptr_path = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAP32[ptr_path / 4 + i] = path[i];\n }\n var ptr_pos = Module._malloc(8 * 3);\n _GS_Show_Path_Camera_Position(ptr_path, pcount, ptr_pos);\n var pos = new Float64Array(3);\n pos[0] = Module.HEAPF64[ptr_pos / 8];\n pos[1] = Module.HEAPF64[ptr_pos / 8 + 1];\n pos[2] = Module.HEAPF64[ptr_pos / 8 + 2];\n Module._free(ptr_pos);\n Module._free(ptr_path);\n return pos;\n };\n window.JS_Show_Path_Camera_Target = exports.JS_Show_Path_Camera_Target = JS_Show_Path_Camera_Target = function JS_Show_Path_Camera_Target(path) {\n var pcount = path.length;\n var ptr_path = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAP32[ptr_path / 4 + i] = path[i];\n }\n var ptr_pos = Module._malloc(8 * 3);\n _GS_Show_Path_Camera_Target(ptr_path, pcount, ptr_pos);\n var pos = new Float64Array(3);\n pos[0] = Module.HEAPF64[ptr_pos / 8];\n pos[1] = Module.HEAPF64[ptr_pos / 8 + 1];\n pos[2] = Module.HEAPF64[ptr_pos / 8 + 2];\n Module._free(ptr_pos);\n Module._free(ptr_path);\n return pos;\n };\n window.JS_Dolly_Camera = exports.JS_Dolly_Camera = JS_Dolly_Camera = _GS_Dolly_Camera;\n window.JS_Roll_Camera = exports.JS_Roll_Camera = JS_Roll_Camera = function JS_Roll_Camera(start, end) {\n var ptr_start = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_start / 8] = start[0];\n Module.HEAPF64[ptr_start / 8 + 1] = start[1];\n Module.HEAPF64[ptr_start / 8 + 2] = start[2];\n var ptr_end = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_end / 8] = end[0];\n Module.HEAPF64[ptr_end / 8 + 1] = end[1];\n Module.HEAPF64[ptr_end / 8 + 2] = end[2];\n _GS_Roll_Camera(ptr_start, ptr_end);\n Module._free(ptr_start);\n Module._free(ptr_end);\n };\n window.JS_Zoom_Camera = exports.JS_Zoom_Camera = JS_Zoom_Camera = _GS_Zoom_Camera;\n window.JS_UnSet_Camera = exports.JS_UnSet_Camera = JS_UnSet_Camera = _GS_UnSet_Camera;\n window.JS_Set_Color = exports.JS_Set_Color = JS_Set_Color = function JS_Set_Color(options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Color(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Color = exports.JS_UnSet_Color = JS_UnSet_Color = _GS_UnSet_Color;\n window.JS_UnSet_One_Color = exports.JS_UnSet_One_Color = JS_UnSet_One_Color = function JS_UnSet_One_Color(name) {\n var ptr_name = allocateUTF8(name);\n _GS_UnSet_One_Color(ptr_name);\n _free(ptr_name);\n };\n window.JS_Show_Color = exports.JS_Show_Color = JS_Show_Color = function JS_Show_Color() {\n var ptr_colors = Module._malloc(512);\n _GS_Show_Color(ptr_colors);\n var color = UTF8ToString(ptr_colors);\n Module._free(ptr_colors);\n return color;\n };\n window.JS_Show_One_Color = exports.JS_Show_One_Color = JS_Show_One_Color = function JS_Show_One_Color(name) {\n var ptr_name = allocateUTF8(name);\n var ptr_colors = Module._malloc(512);\n var color = null;\n if (_GS_Show_One_Color(ptr_name, ptr_colors)) {\n color = UTF8ToString(ptr_colors);\n }\n Module._free(ptr_colors);\n _free(ptr_name);\n return color;\n };\n window.JS_Show_Color_By_Value = exports.JS_Show_Color_By_Value = JS_Show_Color_By_Value = function JS_Show_Color_By_Value(name) {\n var ptr_name = allocateUTF8(name);\n var ptr_values = Module._malloc(4 * 4);\n if (_GS_Show_Color_By_Value(ptr_name, ptr_values)) {\n var values = new Float32Array(4);\n values[0] = Module.HEAPF32[ptr_values / 4];\n values[1] = Module.HEAPF32[ptr_values / 4 + 1];\n values[2] = Module.HEAPF32[ptr_values / 4 + 2];\n values[3] = Module.HEAPF32[ptr_values / 4 + 3];\n Module._free(ptr_values);\n _free(ptr_name);\n return values;\n }\n return null;\n };\n window.JS_Set_Geometry_Color = exports.JS_Set_Geometry_Color = JS_Set_Geometry_Color = function JS_Set_Geometry_Color(key, options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Geometry_Color(key, ptr);\n _free(ptr);\n };\n window.JS_Set_Geometry_Color_By_Value = exports.JS_Set_Geometry_Color_By_Value = JS_Set_Geometry_Color_By_Value = function JS_Set_Geometry_Color_By_Value(key, type, offset, value) {\n var ptr_type = allocateUTF8(type);\n var ptr_value = Module._malloc(value.length * 4);\n var len = value.length;\n for (var i = 0; i < len; i++) {\n Module.HEAPF32[ptr_value / 4 + i] = value[i];\n }\n _GS_Set_Geometry_Color_By_Value(key, ptr_type, offset, value.length / 4, ptr_value);\n Module._free(ptr_value);\n _free(ptr_type);\n };\n window.JS_Show_Geometry_Color_By_Value = exports.JS_Show_Geometry_Color_By_Value = JS_Show_Geometry_Color_By_Value = function JS_Show_Geometry_Color_By_Value(key, type, offset) {\n var value = null;\n var pcount = 0;\n var key_type = JS_Show_Key_Type(key);\n if (key_type == 103 || key_type == 107) {\n var shell_size = JS_Show_Shell_Size(key);\n pcount = shell_size.pos;\n } else if (key_type == 104) {\n var mesh_size = JS_Show_Mesh_Size(key);\n pcount = mesh_size.row * mesh_size.col;\n }\n var ptr_type = allocateUTF8(type);\n var ptr_color_type = Module._malloc(4);\n _GS_Show_Geometry_Color_Type(key, ptr_type, ptr_color_type);\n var color_type = Module.HEAP32[ptr_color_type / 4];\n if (pcount > 0 && color_type > 0) {\n if (color_type == 1) {\n pcount = 1;\n }\n var ptr_value = Module._malloc(pcount * 4);\n if (_GS_Show_Geometry_Color_By_Value(key, ptr_type, offset, pcount, ptr_value)) {\n var len = pcount * 4;\n value = new Float32Array(len);\n for (var i = 0; i < len; i++) {\n value[i] = Module.HEAPF32[ptr_value / 4 + i];\n }\n }\n Module._free(ptr_value);\n }\n Module._free(ptr_color_type);\n _free(ptr_type);\n return value;\n };\n window.JS_UnSet_Geometry_Color = exports.JS_UnSet_Geometry_Color = JS_UnSet_Geometry_Color = function JS_UnSet_Geometry_Color(key, type) {\n var ptr_type = allocateUTF8(type);\n _GS_UnSet_Geometry_Color(key, ptr_type);\n _free(ptr_type);\n };\n window.JS_Set_Visibility = exports.JS_Set_Visibility = JS_Set_Visibility = function JS_Set_Visibility(options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Visibility(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Visibility = exports.JS_UnSet_Visibility = JS_UnSet_Visibility = _GS_UnSet_Visibility;\n window.JS_UnSet_One_Visibility = exports.JS_UnSet_One_Visibility = JS_UnSet_One_Visibility = function JS_UnSet_One_Visibility(name) {\n var ptr = allocateUTF8(name);\n _GS_UnSet_One_Visibility(ptr);\n _free(ptr);\n };\n window.JS_Show_Visibility = exports.JS_Show_Visibility = JS_Show_Visibility = function JS_Show_Visibility() {\n var ptr_vi = Module._malloc(512);\n _GS_Show_Visibility(ptr_vi);\n var vi = UTF8ToString(ptr_vi);\n Module._free(ptr_vi);\n return vi;\n };\n window.JS_Show_One_Visibility = exports.JS_Show_One_Visibility = JS_Show_One_Visibility = function JS_Show_One_Visibility(name) {\n var ptr_name = allocateUTF8(name);\n var ptr_vi = Module._malloc(64);\n var result = _GS_Show_One_Visibility(ptr_name, ptr_vi);\n var vi = null;\n if (result) {\n vi = UTF8ToString(ptr_vi);\n }\n _free(ptr_name);\n Module._free(ptr_vi);\n return vi;\n };\n window.JS_Set_Selectability = exports.JS_Set_Selectability = JS_Set_Selectability = function JS_Set_Selectability(options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Selectability(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Selectability = exports.JS_UnSet_Selectability = JS_UnSet_Selectability = _GS_UnSet_Selectability;\n window.JS_UnSet_One_Selectability = exports.JS_UnSet_One_Selectability = JS_UnSet_One_Selectability = function JS_UnSet_One_Selectability(name) {\n var ptr = allocateUTF8(name);\n _GS_UnSet_One_Selectability(ptr);\n _free(ptr);\n };\n window.JS_Show_Selectability = exports.JS_Show_Selectability = JS_Show_Selectability = function JS_Show_Selectability() {\n var ptr_se = Module._malloc(512);\n _GS_Show_Selectability(ptr_se);\n var se = UTF8ToString(ptr_se);\n Module._free(ptr_se);\n return se;\n };\n window.JS_Show_One_Selectability = exports.JS_Show_One_Selectability = JS_Show_One_Selectability = function JS_Show_One_Selectability(name) {\n var ptr_name = allocateUTF8(name);\n var ptr_se = Module._malloc(64);\n var result = _GS_Show_One_Selectability(ptr_name, ptr_se);\n var se = null;\n if (result) {\n se = UTF8ToString(ptr_se);\n }\n _free(ptr_name);\n Module._free(ptr_se);\n return se;\n };\n window.JS_Set_ModellingMatrix = exports.JS_Set_ModellingMatrix = JS_Set_ModellingMatrix = function JS_Set_ModellingMatrix(mm) {\n var ptr_mm = Module._malloc(4 * 16);\n for (var i = 0; i < 16; i++) {\n Module.HEAPF32[ptr_mm / 4 + i] = mm[i];\n }\n _GS_Set_ModellingMatrix(ptr_mm);\n Module._free(ptr_mm);\n };\n window.JS_Append_ModellingMatrix = exports.JS_Append_ModellingMatrix = JS_Append_ModellingMatrix = function JS_Append_ModellingMatrix(mm) {\n var ptr_mm = Module._malloc(4 * 16);\n for (var i = 0; i < 16; i++) {\n Module.HEAPF32[ptr_mm / 4 + i] = mm[i];\n }\n _GS_Append_ModellingMatrix(ptr_mm);\n Module._free(ptr_mm);\n };\n window.JS_Show_ModellingMatrix = exports.JS_Show_ModellingMatrix = JS_Show_ModellingMatrix = function JS_Show_ModellingMatrix() {\n var ptr_mm = Module._malloc(4 * 16);\n _GS_Show_ModellingMatrix(ptr_mm);\n var mm = new Float32Array(16);\n for (var i = 0; i < 16; i++) {\n mm[i] = Module.HEAPF32[ptr_mm / 4 + i];\n }\n Module._free(ptr_mm);\n return mm;\n };\n window.JS_Show_Path_ModellingMatrix = exports.JS_Show_Path_ModellingMatrix = JS_Show_Path_ModellingMatrix = function JS_Show_Path_ModellingMatrix(path) {\n var pcount = path.length;\n var ptr_path = Module._malloc(4 * pcount);\n Module.HEAP32.set(path, ptr_path / 4);\n var ptr_mm = Module._malloc(4 * 16);\n _GS_Show_Path_ModellingMatrix(ptr_path, pcount, ptr_mm);\n var mm = new Float32Array(16);\n for (var i = 0; i < 16; i++) {\n mm[i] = Module.HEAPF32[ptr_mm / 4 + i];\n }\n Module._free(ptr_path);\n Module._free(ptr_mm);\n return mm;\n };\n window.JS_UnSet_ModellingMatrix = exports.JS_UnSet_ModellingMatrix = JS_UnSet_ModellingMatrix = _GS_UnSet_ModellingMatrix;\n window.JS_Set_Rendering_Options = exports.JS_Set_Rendering_Options = JS_Set_Rendering_Options = function JS_Set_Rendering_Options(options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Rendering_Options(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Rendering_Options = exports.JS_UnSet_Rendering_Options = JS_UnSet_Rendering_Options = _GS_UnSet_Rendering_Options;\n window.JS_UnSet_One_Rendering_Option = exports.JS_UnSet_One_Rendering_Option = JS_UnSet_One_Rendering_Option = function JS_UnSet_One_Rendering_Option(option) {\n var ptr = allocateUTF8(option);\n _GS_UnSet_One_Rendering_Option(ptr);\n _free(ptr);\n };\n window.JS_Show_Rendering_Options = exports.JS_Show_Rendering_Options = JS_Show_Rendering_Options = function JS_Show_Rendering_Options() {\n var ptr_ro = Module._malloc(512);\n _GS_Show_Rendering_Options(ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_ro);\n return ro;\n };\n window.JS_Show_One_Rendering_Option = exports.JS_Show_One_Rendering_Option = JS_Show_One_Rendering_Option = function JS_Show_One_Rendering_Option(name) {\n var ptr = allocateUTF8(name);\n var ptr_ro = Module._malloc(512);\n _GS_Show_One_Rendering_Option(ptr, ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_ro);\n _free(ptr);\n return ro;\n };\n window.JS_Show_One_Default_Rendering_Option = exports.JS_Show_One_Default_Rendering_Option = JS_Show_One_Default_Rendering_Option = function JS_Show_One_Default_Rendering_Option(name) {\n var ptr = allocateUTF8(name);\n var ptr_ro = Module._malloc(512);\n _GS_Show_One_Default_Rendering_Option(ptr, ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_ro);\n _free(ptr);\n return ro;\n };\n window.JS_Show_One_Path_Rendering_Option = exports.JS_Show_One_Path_Rendering_Option = JS_Show_One_Path_Rendering_Option = function JS_Show_One_Path_Rendering_Option(path, name) {\n var pcount = path.length;\n var ptr_path = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAP32[ptr_path / 4 + i] = path[i];\n }\n var ptr = allocateUTF8(name);\n var ptr_ro = Module._malloc(512);\n _GS_Show_One_Path_Rendering_Option(ptr_path, pcount, ptr, ptr_ro);\n var ro = UTF8ToString(ptr_ro);\n Module._free(ptr_path);\n Module._free(ptr_ro);\n _free(ptr);\n return ro;\n };\n window.JS_Set_Heuristic_Options = exports.JS_Set_Heuristic_Options = JS_Set_Heuristic_Options = function JS_Set_Heuristic_Options(options) {\n var ptr = allocateUTF8(options);\n _GS_Set_Heuristic_Options(ptr);\n _free(ptr);\n };\n window.JS_Set_One_Heuristic_Option = exports.JS_Set_One_Heuristic_Option = JS_Set_One_Heuristic_Option = function JS_Set_One_Heuristic_Option(name, value) {\n var ptr_name = allocateUTF8(name);\n var ptr_value = allocateUTF8(value);\n _GS_Set_One_Heuristic_Option(ptr_name, ptr_value);\n _free(ptr_name);\n _free(ptr_value);\n };\n window.JS_UnSet_One_Heuristic_Option = exports.JS_UnSet_One_Heuristic_Option = JS_UnSet_One_Heuristic_Option = function JS_UnSet_One_Heuristic_Option(option) {\n var ptr = allocateUTF8(option);\n _GS_UnSet_One_Heuristic_Option(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Heuristic_Options = exports.JS_UnSet_Heuristic_Options = JS_UnSet_Heuristic_Options = _GS_UnSet_Heuristic_Options;\n window.JS_Show_Heuristic_Options = exports.JS_Show_Heuristic_Options = JS_Show_Heuristic_Options = function JS_Show_Heuristic_Options(options) {\n var ptr_ho = Module._malloc(512);\n _GS_Show_Heuristic_Options(ptr_ho);\n var ho = UTF8ToString(ptr_ho);\n Module._free(ptr_ho);\n return ho;\n };\n window.JS_Show_One_Heuristic_Option = exports.JS_Show_One_Heuristic_Option = JS_Show_One_Heuristic_Option = function JS_Show_One_Heuristic_Option(name) {\n var ptr = allocateUTF8(name);\n var ptr_ho = Module._malloc(512);\n _GS_Show_One_Heuristic_Option(ptr, ptr_ho);\n var ho = UTF8ToString(ptr_ho);\n Module._free(ptr_ho);\n _free(ptr);\n return ho;\n };\n window.JS_Set_Condition = exports.JS_Set_Condition = JS_Set_Condition = function JS_Set_Condition(condition) {\n var ptr = allocateUTF8(condition);\n _GS_Set_Condition(ptr);\n _free(ptr);\n };\n window.JS_Show_Condition = exports.JS_Show_Condition = JS_Show_Condition = function JS_Show_Condition() {\n var condition = null;\n if (_GS_Attribute_Exists(ObjectType.TYPE_Condition)) {\n var ptr_condition = Module._malloc(512);\n _GS_Show_Condition(ptr_condition);\n condition = UTF8ToString(ptr_condition);\n Module._free(ptr_condition);\n }\n return condition;\n };\n window.JS_UnSet_Condition = exports.JS_UnSet_Condition = JS_UnSet_Condition = _GS_UnSet_Condition;\n window.JS_Set_Text_Font = exports.JS_Set_Text_Font = JS_Set_Text_Font = function JS_Set_Text_Font(fonts) {\n var ptr = allocateUTF8(fonts);\n _GS_Set_Text_Font(ptr);\n _free(ptr);\n };\n window.JS_UnSet_Text_Font = exports.JS_UnSet_Text_Font = JS_UnSet_Text_Font = _GS_UnSet_Text_Font;\n window.JS_UnSet_One_Text_Font = exports.JS_UnSet_One_Text_Font = JS_UnSet_One_Text_Font = function JS_UnSet_One_Text_Font(name) {\n var ptr = allocateUTF8(name);\n _GS_UnSet_One_Text_Font(ptr);\n _free(ptr);\n };\n window.JS_Show_Text_Font = exports.JS_Show_Text_Font = JS_Show_Text_Font = function JS_Show_Text_Font() {\n var ptr_fonts = Module._malloc(512);\n _GS_Show_Text_Font(ptr_fonts);\n var fonts = UTF8ToString(ptr_fonts);\n Module._free(ptr_fonts);\n return fonts;\n };\n window.JS_Show_One_Text_Font = exports.JS_Show_One_Text_Font = JS_Show_One_Text_Font = function JS_Show_One_Text_Font(name) {\n var ptr_name = allocateUTF8(name);\n var ptr_fonts = Module._malloc(512);\n _GS_Show_One_Text_Font(ptr_name, ptr_fonts);\n var fonts = UTF8ToString(ptr_fonts);\n Module._free(ptr_fonts);\n _free(ptr_name);\n return fonts;\n };\n window.JS_Attribute_Exists = exports.JS_Attribute_Exists = JS_Attribute_Exists = function JS_Attribute_Exists(type) {\n return _GS_Attribute_Exists(type);\n };\n window.JS_Image_Exists = exports.JS_Image_Exists = JS_Image_Exists = function JS_Image_Exists(name) {\n var ptr = allocateUTF8(name);\n var result = _GS_Image_Exists(ptr);\n _free(ptr);\n return result;\n };\n window.JS_Resize_By_Key = exports.JS_Resize_By_Key = JS_Resize_By_Key = _GS_Resize_By_Key;\n window.JS_Insert_Marker = exports.JS_Insert_Marker = JS_Insert_Marker = _GS_Insert_Marker;\n window.JS_Edit_Marker = exports.JS_Edit_Marker = JS_Edit_Marker = _GS_Edit_Marker;\n window.JS_Show_Marker = exports.JS_Show_Marker = JS_Show_Marker = function JS_Show_Marker(key) {\n var ptr_x = Module._malloc(4);\n var ptr_y = Module._malloc(4);\n var ptr_z = Module._malloc(4);\n _GS_Show_Marker(key, ptr_x, ptr_y, ptr_z);\n var pos = new Float32Array(3);\n pos[0] = Module.HEAPF32[ptr_x / 4];\n pos[1] = Module.HEAPF32[ptr_y / 4];\n pos[2] = Module.HEAPF32[ptr_z / 4];\n Module._free(ptr_x);\n Module._free(ptr_y);\n Module._free(ptr_z);\n return pos;\n };\n window.JS_Insert_Point_Cloud = exports.JS_Insert_Point_Cloud = JS_Insert_Point_Cloud = function JS_Insert_Point_Cloud(points) {\n var ptr_points = Module._malloc(4 * points.length);\n Module.HEAPF32.set(points, ptr_points / 4);\n var key = _GS_Insert_Point_Cloud(ptr_points, points.length / 3);\n Module._free(ptr_points);\n return key;\n };\n window.JS_Edit_Point_Cloud = exports.JS_Edit_Point_Cloud = JS_Edit_Point_Cloud = function JS_Edit_Point_Cloud(key, points) {\n var ptr_points = Module._malloc(4 * points.length);\n Module.HEAPF32.set(points, ptr_points / 4);\n _GS_Edit_Point_Cloud(key, ptr_points, points.length / 3);\n Module._free(ptr_points);\n return key;\n };\n window.JS_Show_Point_Cloud = exports.JS_Show_Point_Cloud = JS_Show_Point_Cloud = function JS_Show_Point_Cloud(key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Point_Cloud_Count(key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var ptr_points = Module._malloc(4 * count * 3);\n _GS_Show_Point_Cloud(key, ptr_points, ptr_count);\n var result = new Float32Array(count * 3);\n result.set(Module.HEAPF32.subarray(ptr_points / 4, ptr_points / 4 + count * 3));\n Module._free(ptr_points);\n Module._free(ptr_count);\n return result;\n };\n window.JS_Insert_Line = exports.JS_Insert_Line = JS_Insert_Line = _GS_Insert_Line;\n window.JS_Edit_Line = exports.JS_Edit_Line = JS_Edit_Line = _GS_Edit_Line;\n window.JS_Show_Line = exports.JS_Show_Line = JS_Show_Line = function JS_Show_Line(key) {\n var ptr_x1 = Module._malloc(4);\n var ptr_y1 = Module._malloc(4);\n var ptr_z1 = Module._malloc(4);\n var ptr_x2 = Module._malloc(4);\n var ptr_y2 = Module._malloc(4);\n var ptr_z2 = Module._malloc(4);\n _GS_Show_Line(key, ptr_x1, ptr_y1, ptr_z1, ptr_x2, ptr_y2, ptr_z2);\n var pos = new Float32Array(6);\n pos[0] = Module.HEAPF32[ptr_x1 / 4];\n pos[1] = Module.HEAPF32[ptr_y1 / 4];\n pos[2] = Module.HEAPF32[ptr_z1 / 4];\n pos[3] = Module.HEAPF32[ptr_x2 / 4];\n pos[4] = Module.HEAPF32[ptr_y2 / 4];\n pos[5] = Module.HEAPF32[ptr_z2 / 4];\n Module._free(ptr_x1);\n Module._free(ptr_y1);\n Module._free(ptr_z1);\n Module._free(ptr_x2);\n Module._free(ptr_y2);\n Module._free(ptr_z2);\n return pos;\n };\n window.JS_Insert_Polyline = exports.JS_Insert_Polyline = JS_Insert_Polyline = function JS_Insert_Polyline(points) {\n var num = points.length;\n var ptr_pos = Module._malloc(4 * num);\n for (var i = 0; i < num; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var key = _GS_Insert_Polyline(ptr_pos, num / 3);\n Module._free(ptr_pos);\n return key;\n };\n window.JS_Show_Polyline_Count = exports.JS_Show_Polyline_Count = JS_Show_Polyline_Count = function JS_Show_Polyline_Count(key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Polyline_Count(key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n Module._free(ptr_count);\n return count;\n };\n window.JS_Show_Polyline = exports.JS_Show_Polyline = JS_Show_Polyline = function JS_Show_Polyline(key) {\n var ptr_count = Module._malloc(4);\n _GS_Show_Polyline_Count(key, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n Module._free(ptr_count);\n var len = count * 3;\n var ptr_pos = Module._malloc(4 * len);\n _GS_Show_Polyline(key, count, ptr_pos);\n var pos = new Float32Array(len);\n for (var i = 0; i < len; i++) {\n pos[i] = Module.HEAPF32[ptr_pos / 4 + i];\n }\n Module._free(ptr_pos);\n return pos;\n };\n window.JS_Insert_Circle = exports.JS_Insert_Circle = JS_Insert_Circle = function JS_Insert_Circle(center, radius, normal) {\n var ptr_center = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_center / 4] = center[0];\n Module.HEAPF32[ptr_center / 4 + 1] = center[1];\n Module.HEAPF32[ptr_center / 4 + 2] = center[2];\n var ptr_normal = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_normal / 4] = normal[0];\n Module.HEAPF32[ptr_normal / 4 + 1] = normal[1];\n Module.HEAPF32[ptr_normal / 4 + 2] = normal[2];\n var key = _GS_Insert_Circle(ptr_center, radius, ptr_normal);\n Module._free(ptr_center);\n Module._free(ptr_normal);\n return key;\n };\n window.JS_Show_Circle = exports.JS_Show_Circle = JS_Show_Circle = function JS_Show_Circle(key) {\n var ptr_center = Module._malloc(4 * 3);\n var ptr_normal = Module._malloc(4 * 3);\n var ptr_radius = Module._malloc(4);\n _GS_Show_Circle(key, ptr_center, ptr_radius, ptr_normal);\n var center = new Float32Array(3);\n center[0] = Module.HEAPF32[ptr_center / 4];\n center[1] = Module.HEAPF32[ptr_center / 4 + 1];\n center[2] = Module.HEAPF32[ptr_center / 4 + 2];\n var normal = new Float32Array(3);\n normal[0] = Module.HEAPF32[ptr_normal / 4];\n normal[1] = Module.HEAPF32[ptr_normal / 4 + 1];\n normal[2] = Module.HEAPF32[ptr_normal / 4 + 2];\n var radius = Module.HEAPF32[ptr_radius / 4];\n Module._free(ptr_center);\n Module._free(ptr_normal);\n Module._free(ptr_radius);\n return {\n center: center,\n radius: radius,\n normal: normal\n };\n };\n window.JS_Insert_Cylinder = exports.JS_Insert_Cylinder = JS_Insert_Cylinder = function JS_Insert_Cylinder(start, end, radius, cap) {\n var ptr_start = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_start / 4] = start[0];\n Module.HEAPF32[ptr_start / 4 + 1] = start[1];\n Module.HEAPF32[ptr_start / 4 + 2] = start[2];\n var ptr_end = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_end / 4] = end[0];\n Module.HEAPF32[ptr_end / 4 + 1] = end[1];\n Module.HEAPF32[ptr_end / 4 + 2] = end[2];\n var ptr_cap = allocateUTF8(cap);\n var key = _GS_Insert_Cylinder(ptr_start, ptr_end, radius, ptr_cap);\n Module._free(ptr_start);\n Module._free(ptr_end);\n _free(ptr_cap);\n return key;\n };\n window.JS_Show_Cylinder = exports.JS_Show_Cylinder = JS_Show_Cylinder = function JS_Show_Cylinder(key) {\n var ptr_start = Module._malloc(4 * 3);\n var ptr_end = Module._malloc(4 * 3);\n var ptr_radius = Module._malloc(4);\n var ptr_cap = Module._malloc(16);\n _GS_Show_Cylinder(key, ptr_start, ptr_end, ptr_radius, ptr_cap);\n var start = new Float32Array(3);\n start[0] = Module.HEAPF32[ptr_start / 4];\n start[1] = Module.HEAPF32[ptr_start / 4 + 1];\n start[2] = Module.HEAPF32[ptr_start / 4 + 2];\n var end = new Float32Array(3);\n end[0] = Module.HEAPF32[ptr_end / 4];\n end[1] = Module.HEAPF32[ptr_end / 4 + 1];\n end[2] = Module.HEAPF32[ptr_end / 4 + 2];\n var radius = Module.HEAPF32[ptr_radius / 4];\n var cap = UTF8ToString(ptr_cap);\n Module._free(ptr_start);\n Module._free(ptr_end);\n Module._free(ptr_radius);\n Module._free(ptr_cap);\n return {\n start: start,\n end: end,\n radius: radius,\n cap: cap\n };\n };\n window.JS_Insert_PolyCylinder = exports.JS_Insert_PolyCylinder = JS_Insert_PolyCylinder = function JS_Insert_PolyCylinder(points, radii, cap) {\n var ptr_pos = Module._malloc(4 * points.length);\n for (var i = 0; i < points.length; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var ptr_rad = Module._malloc(4 * radii.length);\n for (var i = 0; i < radii.length; i++) {\n Module.HEAPF32[ptr_rad / 4 + i] = radii[i];\n }\n var ptr_cap = allocateUTF8(cap);\n var key = _GS_Insert_PolyCylinder(ptr_pos, ptr_rad, radii.length, ptr_cap);\n Module._free(ptr_pos);\n Module._free(ptr_rad);\n _free(ptr_cap);\n return key;\n };\n window.JS_Edit_PolyCylinder = exports.JS_Edit_PolyCylinder = JS_Edit_PolyCylinder = function JS_Edit_PolyCylinder(key, points, radii, cap) {\n var ptr_pos = Module._malloc(4 * points.length);\n for (var i = 0; i < points.length; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var ptr_rad = Module._malloc(4 * radii.length);\n for (var i = 0; i < radii.length; i++) {\n Module.HEAPF32[ptr_rad / 4 + i] = radii[i];\n }\n var ptr_cap = allocateUTF8(cap);\n _GS_Edit_PolyCylinder(key, ptr_pos, ptr_rad, radii.length, ptr_cap);\n Module._free(ptr_pos);\n Module._free(ptr_rad);\n _free(ptr_cap);\n return key;\n };\n window.JS_Insert_Shell = exports.JS_Insert_Shell = JS_Insert_Shell = function JS_Insert_Shell(points, indexes) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var key = _GS_Insert_Shell(ptr_pos, pcount / 3, ptr_ind, icount);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n return key;\n };\n window.JS_Edit_Shell = exports.JS_Edit_Shell = JS_Edit_Shell = function JS_Edit_Shell(key, points, indexes) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n _GS_Edit_Shell(key, ptr_pos, pcount / 3, ptr_ind, icount);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n };\n window.JS_Insert_Triangular_Shell = exports.JS_Insert_Triangular_Shell = JS_Insert_Triangular_Shell = function JS_Insert_Triangular_Shell(points, indexes) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var key = _GS_Insert_Triangular_Shell(ptr_pos, pcount / 3, ptr_ind, icount);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n return key;\n };\n window.JS_Show_Shell_Size = exports.JS_Show_Shell_Size = JS_Show_Shell_Size = function JS_Show_Shell_Size(key) {\n var ptr_pos_count = Module._malloc(4);\n var ptr_face_count = Module._malloc(4);\n _GS_Show_Shell_Size(key, ptr_pos_count, ptr_face_count);\n var pos_count = Module.HEAP32[ptr_pos_count / 4];\n var face_count = Module.HEAP32[ptr_face_count / 4];\n Module._free(ptr_pos_count);\n Module._free(ptr_face_count);\n return {\n pos: pos_count,\n face: face_count\n };\n };\n window.JS_Show_Shell = exports.JS_Show_Shell = JS_Show_Shell = function JS_Show_Shell(key) {\n var ptr_pos_count = Module._malloc(4);\n var ptr_face_count = Module._malloc(4);\n _GS_Show_Shell_Size(key, ptr_pos_count, ptr_face_count);\n var pos_count = Module.HEAP32[ptr_pos_count / 4];\n var face_count = Module.HEAP32[ptr_face_count / 4];\n var ptr_pos = Module._malloc(4 * pos_count * 3);\n var ptr_face = Module._malloc(4 * face_count);\n _GS_Show_Shell(key, ptr_pos_count, ptr_pos, ptr_face_count, ptr_face);\n var pos = new Float32Array(pos_count * 3);\n var face = new Int32Array(face_count);\n for (var i = 0; i < pos_count; i++) {\n pos[i * 3] = Module.HEAPF32[ptr_pos / 4 + i * 3];\n pos[i * 3 + 1] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 1];\n pos[i * 3 + 2] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 2];\n }\n for (var i = 0; i < face_count; i++) {\n face[i] = Module.HEAP32[ptr_face / 4 + i];\n }\n Module._free(ptr_pos_count);\n Module._free(ptr_face_count);\n Module._free(ptr_pos);\n Module._free(ptr_face);\n return {\n pos: pos,\n face: face\n };\n };\n window.JS_Insert_Mesh = exports.JS_Insert_Mesh = JS_Insert_Mesh = function JS_Insert_Mesh(row, col, points) {\n var pcount = row * col * 3;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var key = _GS_Insert_Mesh(row, col, ptr_pos);\n Module._free(ptr_pos);\n return key;\n };\n window.JS_Edit_Mesh_Points = exports.JS_Edit_Mesh_Points = JS_Edit_Mesh_Points = function JS_Edit_Mesh_Points(key, points) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n _GS_Edit_Mesh_Points(key, ptr_pos);\n Module._free(ptr_pos);\n return key;\n };\n window.JS_Show_Mesh_Size = exports.JS_Show_Mesh_Size = JS_Show_Mesh_Size = function JS_Show_Mesh_Size(key) {\n var ptr_row_count = Module._malloc(4);\n var ptr_col_count = Module._malloc(4);\n _GS_Show_Mesh_Size(key, ptr_row_count, ptr_col_count);\n var row_count = Module.HEAP32[ptr_row_count / 4];\n var col_count = Module.HEAP32[ptr_col_count / 4];\n Module._free(ptr_row_count);\n Module._free(ptr_col_count);\n return {\n row: row_count,\n col: col_count\n };\n };\n window.JS_Show_Mesh = exports.JS_Show_Mesh = JS_Show_Mesh = function JS_Show_Mesh(key) {\n var ptr_row_count = Module._malloc(4);\n var ptr_col_count = Module._malloc(4);\n _GS_Show_Mesh_Size(key, ptr_row_count, ptr_col_count);\n var row = Module.HEAP32[ptr_row_count / 4];\n var col = Module.HEAP32[ptr_col_count / 4];\n var count = row * col * 3;\n var ptr_pos = Module._malloc(4 * row * col * 3);\n _GS_Show_Mesh(key, ptr_row_count, ptr_col_count, ptr_pos);\n var pos = new Float32Array(row * col * 3);\n for (var i = 0; i < count; i++) {\n pos[i] = Module.HEAPF32[ptr_pos / 4 + i];\n }\n Module._free(ptr_row_count);\n Module._free(ptr_col_count);\n Module._free(ptr_pos);\n return pos;\n };\n window.JS_Insert_Vector_Text = exports.JS_Insert_Vector_Text = JS_Insert_Vector_Text = function JS_Insert_Vector_Text(text, position, x_axis, y_axis, fonts) {\n var ptr_text = allocateUTF8(text);\n var ptr_fonts = null;\n if (fonts) {\n ptr_fonts = allocateUTF8(fonts);\n }\n var ptr_pos = Module._malloc(4 * 3);\n Module.HEAPF32.set(position, ptr_pos / 4);\n var ptr_x = Module._malloc(4 * 3);\n Module.HEAPF32.set(x_axis, ptr_x / 4);\n var ptr_y = Module._malloc(4 * 3);\n Module.HEAPF32.set(y_axis, ptr_y / 4);\n var key = _GS_Insert_Vector_Text(ptr_text, ptr_pos, ptr_x, ptr_y, ptr_fonts);\n Module._free(ptr_pos);\n Module._free(ptr_x);\n Module._free(ptr_y);\n _free(ptr_text);\n if (fonts) {\n _free(ptr_fonts);\n }\n return key;\n };\n window.JS_Insert_Parametric_Geometry = exports.JS_Insert_Parametric_Geometry = JS_Insert_Parametric_Geometry = function JS_Insert_Parametric_Geometry(type, params) {\n var ptr_type = allocateUTF8(type);\n var ptr_params = Module._malloc(8 * params.length);\n Module.HEAPF64.set(params, ptr_params / 8);\n var key = _GS_Insert_Parametric_Geometry(ptr_type, ptr_params, params.length);\n Module._free(ptr_params);\n _free(ptr_type);\n return key;\n };\n window.JS_Edit_Parametric_Geometry = exports.JS_Edit_Parametric_Geometry = JS_Edit_Parametric_Geometry = function JS_Edit_Parametric_Geometry(key, type, params) {\n var ptr_type = allocateUTF8(type);\n var ptr_params = Module._malloc(8 * params.length);\n Module.HEAPF64.set(params, ptr_params / 8);\n _GS_Edit_Parametric_Geometry(key, ptr_type, ptr_params, params.length);\n Module._free(ptr_params);\n _free(ptr_type);\n return key;\n };\n window.JS_Show_Parametric_Geometry = exports.JS_Show_Parametric_Geometry = JS_Show_Parametric_Geometry = function JS_Show_Parametric_Geometry(key) {\n var ptr_type = Module._malloc(8);\n var ptr_params = Module._malloc(8 * 1024);\n var ptr_count = Module._malloc(4);\n _GS_Show_Parametric_Geometry(key, ptr_type, ptr_params, ptr_count);\n var count = Module.HEAP32[ptr_count / 4];\n var type = UTF8ToString(ptr_type);\n var params = new Float64Array(count);\n params.set(Module.HEAPF64.subarray(ptr_params / 8, ptr_params / 8 + count));\n Module._free(ptr_count);\n Module._free(ptr_params);\n Module._free(ptr_type);\n return {\n type: type,\n params: params\n };\n };\n window.JS_Insert_Parametric_Geometries = exports.JS_Insert_Parametric_Geometries = JS_Insert_Parametric_Geometries = function JS_Insert_Parametric_Geometries(type, params, geoCount) {\n var ptr_type = allocateUTF8(type);\n var ptr_params = Module._malloc(8 * params.length);\n Module.HEAPF64.set(params, ptr_params / 8);\n var key = _GS_Insert_Parametric_Geometries(ptr_type, ptr_params, params.length, geoCount);\n Module._free(ptr_params);\n _free(ptr_type);\n return key;\n };\n window.JS_Insert_Light = exports.JS_Insert_Light = JS_Insert_Light = _GS_Insert_Light;\n window.JS_Edit_Light = exports.JS_Edit_Light = JS_Edit_Light = _GS_Edit_Light;\n window.JS_Show_Light = exports.JS_Show_Light = JS_Show_Light = function JS_Show_Light(key) {\n var ptr_x = Module._malloc(4);\n var ptr_y = Module._malloc(4);\n var ptr_z = Module._malloc(4);\n var ptr_b = Module._malloc(4);\n _GS_Show_Light(key, ptr_x, ptr_y, ptr_z, ptr_b);\n var pos = new Float32Array(3);\n pos[0] = Module.HEAPF32[ptr_x / 4];\n pos[1] = Module.HEAPF32[ptr_y / 4];\n pos[2] = Module.HEAPF32[ptr_z / 4];\n var camera_relative = Module.HEAP32[ptr_b / 4];\n Module._free(ptr_x);\n Module._free(ptr_y);\n Module._free(ptr_z);\n Module._free(ptr_b);\n return {\n pos: pos,\n camera_relative: camera_relative == 0 ? false : true\n };\n };\n window.JS_Insert_Image = exports.JS_Insert_Image = JS_Insert_Image = function JS_Insert_Image(x, y, z, width, height, data, options) {\n var ptr_data = null;\n if (data) {\n ptr_data = Module._malloc(data.byteLength);\n var array = new Uint8Array(data);\n Module.HEAP8.set(array, ptr_data);\n } else {\n ptr_data = Module._malloc(4);\n Module.HEAP32[ptr_data / 4] = 0;\n }\n var ptr_options = allocateUTF8(options);\n var key = _GS_Insert_Image(x, y, z, width, height, ptr_data, ptr_options);\n Module._free(ptr_data);\n _free(ptr_options);\n return key;\n };\n window.JS_Set_Image_Options = exports.JS_Set_Image_Options = JS_Set_Image_Options = function JS_Set_Image_Options(key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Set_Image_Options(key, ptr_options);\n _free(ptr_options);\n };\n window.JS_UnSet_One_Image_Option = exports.JS_UnSet_One_Image_Option = JS_UnSet_One_Image_Option = function JS_UnSet_One_Image_Option(key, name) {\n var ptr_name = allocateUTF8(name);\n _GS_UnSet_One_Image_Option(key, ptr_name);\n _free(ptr_name);\n };\n window.JS_Show_Image_Position = exports.JS_Show_Image_Position = JS_Show_Image_Position = function JS_Show_Image_Position(key) {\n var ptr_x = Module._malloc(4);\n var ptr_y = Module._malloc(4);\n var ptr_z = Module._malloc(4);\n _GS_Show_Image_Position(key, ptr_x, ptr_y, ptr_z);\n var pos = new Float32Array(3);\n pos[0] = Module.HEAPF32[ptr_x / 4];\n pos[1] = Module.HEAPF32[ptr_y / 4];\n pos[2] = Module.HEAPF32[ptr_z / 4];\n Module._free(ptr_x);\n Module._free(ptr_y);\n Module._free(ptr_z);\n return pos;\n };\n window.JS_Show_Image_Size = exports.JS_Show_Image_Size = JS_Show_Image_Size = function JS_Show_Image_Size(key) {\n var ptr_width = Module._malloc(4);\n var ptr_height = Module._malloc(4);\n _GS_Show_Image_Size(key, ptr_width, ptr_height);\n var width = Module.HEAP32[ptr_width / 4];\n var height = Module.HEAP32[ptr_height / 4];\n Module._free(ptr_width);\n Module._free(ptr_height);\n return {\n width: width,\n height: height\n };\n };\n window.JS_Show_Image_Data = exports.JS_Show_Image_Data = JS_Show_Image_Data = function JS_Show_Image_Data(key) {\n var ptr_size = Module._malloc(4);\n _GS_Show_Image_Data_Size(key, ptr_size);\n var size = Module.HEAP32[ptr_size / 4];\n Module._free(ptr_size);\n var ptr_data = Module._malloc(size);\n _GS_Show_Image_Data(key, ptr_data);\n var buffer = new ArrayBuffer(size);\n var data = new Uint8Array(buffer);\n data.set(Module.HEAP8.subarray(ptr_data, ptr_data + size));\n Module._free(ptr_data);\n return data;\n };\n window.JS_Show_Image_Options = exports.JS_Show_Image_Options = JS_Show_Image_Options = function JS_Show_Image_Options(key) {\n var ptr_options = Module._malloc(512);\n _GS_Show_Image_Options(key, ptr_options);\n var options = UTF8ToString(ptr_options);\n Module._free(ptr_options);\n return options;\n };\n window.JS_Show_One_Image_Option = exports.JS_Show_One_Image_Option = JS_Show_One_Image_Option = function JS_Show_One_Image_Option(key, name) {\n var ptr_name = allocateUTF8(name);\n var ptr_option = Module._malloc(512);\n _GS_Show_One_Image_Option(key, ptr_name, ptr_option);\n var option = UTF8ToString(ptr_option);\n _free(ptr_name);\n Module._free(ptr_option);\n return option;\n };\n window.JS_Insert_Cutting_Planes = exports.JS_Insert_Cutting_Planes = JS_Insert_Cutting_Planes = function JS_Insert_Cutting_Planes(planes) {\n var ptr_planes = Module._malloc(4 * planes.length * 3);\n for (var i = 0; i < planes.length; i++) {\n Module.HEAPF32[ptr_planes / 4 + i] = planes[i];\n }\n var key = _GS_Insert_Cutting_Planes(ptr_planes, planes.length / 12);\n Module._free(ptr_planes);\n return key;\n };\n window.JS_Edit_Cutting_Planes = exports.JS_Edit_Cutting_Planes = JS_Edit_Cutting_Planes = function JS_Edit_Cutting_Planes(key, planes) {\n var ptr_planes = Module._malloc(4 * planes.length * 3);\n for (var i = 0; i < planes.length; i++) {\n Module.HEAPF32[ptr_planes / 4 + i] = planes[i];\n }\n _GS_Edit_Cutting_Planes(key, ptr_planes, planes.length / 12);\n Module._free(ptr_planes);\n };\n window.JS_Show_Cutting_Planes = exports.JS_Show_Cutting_Planes = JS_Show_Cutting_Planes = function JS_Show_Cutting_Planes(key) {\n var ptr_planes = Module._malloc(4 * 6 * 3 * 4);\n var ptr_count = Module._malloc(4);\n _GS_Show_Cutting_Planes(key, ptr_planes, ptr_count);\n var count = Module.HEAP32[ptr_count / 4] * 4 * 3;\n var planes = new Float32Array(count);\n for (var i = 0; i < count; i++) {\n planes[i] = Module.HEAPF32[ptr_planes / 4 + i];\n }\n Module._free(ptr_count);\n Module._free(ptr_planes);\n return planes;\n };\n window.JS_Show_Geometry_Vertices_Position_By_Indexes = exports.JS_Show_Geometry_Vertices_Position_By_Indexes = JS_Show_Geometry_Vertices_Position_By_Indexes = function JS_Show_Geometry_Vertices_Position_By_Indexes(key, indexes) {\n var icount = indexes.length;\n var ptr_idx = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_idx / 4 + i] = indexes[i];\n }\n var pcount = icount * 3;\n var ptr_pos = Module._malloc(4 * pcount);\n _GS_Show_Geometry_Vertices_Position_By_Indexes(key, ptr_idx, icount, ptr_pos);\n var positions = new Float32Array(pcount);\n for (var i = 0; i < pcount; i++) {\n positions[i] = Module.HEAPF32[ptr_pos / 4 + i];\n }\n Module._free(ptr_idx);\n Module._free(ptr_pos);\n return positions;\n };\n window.JS_Show_Geometry_Element_Type = exports.JS_Show_Geometry_Element_Type = JS_Show_Geometry_Element_Type = function JS_Show_Geometry_Element_Type(key, element_type, indexes) {\n if (element_type == ElementType.ELEMENT_TYPE_Vertex) {\n var ptr_idx = Module._malloc(4);\n Module.HEAP32[ptr_idx / 4] = indexes[0];\n var ptr_type = Module._malloc(4);\n _GS_Show_Geometry_Element_Type(key, element_type, ptr_idx, ptr_type);\n var type = Module.HEAP32[ptr_type / 4];\n Module._free(ptr_idx);\n Module._free(ptr_type);\n return type;\n } else if (element_type == ElementType.ELEMENT_TYPE_Edge) {\n var ptr_idx = Module._malloc(4 * 2);\n Module.HEAP32[ptr_idx / 4] = indexes[0];\n Module.HEAP32[ptr_idx / 4 + 1] = indexes[1];\n var ptr_type = Module._malloc(4);\n _GS_Show_Geometry_Element_Type(key, element_type, ptr_idx, ptr_type);\n var type = Module.HEAP32[ptr_type / 4];\n Module._free(ptr_idx);\n Module._free(ptr_type);\n return type;\n }\n };\n window.JS_Set_Geometry_Texture_Coords = exports.JS_Set_Geometry_Texture_Coords = JS_Set_Geometry_Texture_Coords = function JS_Set_Geometry_Texture_Coords(key, offset, count, value) {\n var pcount = value.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = value[i];\n }\n _GS_Set_Geometry_Texture_Coords(key, offset, count, ptr_pos);\n Module._free(ptr_pos);\n };\n window.JS_Show_Geometry_Texture_Dimension = exports.JS_Show_Geometry_Texture_Dimension = JS_Show_Geometry_Texture_Dimension = function JS_Show_Geometry_Texture_Dimension(key) {\n var ptr_dim = Module._malloc(4);\n _GS_Show_Geometry_Texture_Dimension(key, ptr_dim);\n var dim = Module.HEAP32[ptr_dim / 4];\n Module._free(ptr_dim);\n return dim;\n };\n window.JS_Show_Geometry_Texture_Coords = exports.JS_Show_Geometry_Texture_Coords = JS_Show_Geometry_Texture_Coords = function JS_Show_Geometry_Texture_Coords(key, offset, count) {\n var len = count * 2;\n var ptr_coords = Module._malloc(4 * len);\n _GS_Show_Geometry_Texture_Coords(key, offset, count, ptr_coords);\n var coords = new Float32Array(len);\n for (var i = 0; i < len; i++) {\n coords[i] = Module.HEAPF32[ptr_coords / 4 + i];\n }\n Module._free(ptr_coords);\n return coords;\n };\n window.JS_UnSet_Geometry_Texture_Coords = exports.JS_UnSet_Geometry_Texture_Coords = JS_UnSet_Geometry_Texture_Coords = _GS_UnSet_Geometry_Texture_Coords;\n window.JS_Compute_Geometry_Texture_Coords = exports.JS_Compute_Geometry_Texture_Coords = JS_Compute_Geometry_Texture_Coords = function JS_Compute_Geometry_Texture_Coords(key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Compute_Geometry_Texture_Coords(key, ptr_options);\n _free(ptr_options);\n };\n window.JS_Set_Geometry_Normals = exports.JS_Set_Geometry_Normals = JS_Set_Geometry_Normals = function JS_Set_Geometry_Normals(key, offset, count, value) {\n var pcount = value.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = value[i];\n }\n _GS_Set_Geometry_Normals(key, offset, count, ptr_pos);\n Module._free(ptr_pos);\n };\n window.JS_Show_Geometry_Normals = exports.JS_Show_Geometry_Normals = JS_Show_Geometry_Normals = function JS_Show_Geometry_Normals(key, offset, count) {\n var ptr_normals = Module._malloc(4 * count * 3);\n _GS_Show_Geometry_Normals(key, offset, count, ptr_normals);\n var normals = new Float32Array(count * 3);\n for (var i = 0; i < count; i++) {\n normals[i * 3] = Module.HEAPF32[ptr_normals / 4 + i * 3];\n normals[i * 3 + 1] = Module.HEAPF32[ptr_normals / 4 + i * 3 + 1];\n normals[i * 3 + 2] = Module.HEAPF32[ptr_normals / 4 + i * 3 + 2];\n }\n Module._free(ptr_normals);\n return normals;\n };\n window.JS_UnSet_Geometry_Normals = exports.JS_UnSet_Geometry_Normals = JS_UnSet_Geometry_Normals = _GS_UnSet_Geometry_Normals;\n window.JS_Compute_Geometry_Data = exports.JS_Compute_Geometry_Data = JS_Compute_Geometry_Data = function JS_Compute_Geometry_Data(key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Compute_Geometry_Tessellate_Data(key, ptr_options);\n _free(ptr_options);\n };\n window.JS_Compute_Geometry_Tessellate_Data = exports.JS_Compute_Geometry_Tessellate_Data = JS_Compute_Geometry_Tessellate_Data = function JS_Compute_Geometry_Tessellate_Data(key, image_key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Compute_Geometry_Tessellate_Data(key, ptr_options);\n var ptr_pos_count = Module._malloc(4);\n var ptr_idx_count = Module._malloc(4);\n _GS_Show_Geometry_Tessellate_Data_Count(key, ptr_pos_count, ptr_idx_count);\n var pos_count = Module.HEAP32[ptr_pos_count / 4];\n var idx_count = Module.HEAP32[ptr_idx_count / 4];\n var ptr_pos = Module._malloc(4 * pos_count * 3);\n var ptr_idx = Module._malloc(4 * idx_count);\n var ptr_nor = Module._malloc(4 * pos_count * 3);\n var ptr_tex = Module._malloc(4 * pos_count * 2);\n _GS_Show_Geometry_Tessellate_Data(key, image_key, ptr_pos, ptr_idx, ptr_nor, ptr_tex);\n var pos = new Float32Array(pos_count * 3);\n var idx = new Int32Array(idx_count);\n var nor = new Float32Array(pos_count * 3);\n var tex = new Float32Array(pos_count * 2);\n for (var i = 0; i < pos_count; i++) {\n pos[i * 3] = Module.HEAPF32[ptr_pos / 4 + i * 3];\n pos[i * 3 + 1] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 1];\n pos[i * 3 + 2] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 2];\n }\n for (var i = 0; i < idx_count; i++) {\n idx[i] = Module.HEAP32[ptr_idx / 4 + i];\n }\n for (var i = 0; i < pos_count; i++) {\n nor[i * 3] = Module.HEAPF32[ptr_nor / 4 + i * 3];\n nor[i * 3 + 1] = Module.HEAPF32[ptr_nor / 4 + i * 3 + 1];\n nor[i * 3 + 2] = Module.HEAPF32[ptr_nor / 4 + i * 3 + 2];\n }\n for (var i = 0; i < pos_count; i++) {\n tex[i * 2] = Module.HEAPF32[ptr_tex / 4 + i * 2];\n tex[i * 2 + 1] = Module.HEAPF32[ptr_tex / 4 + i * 2 + 1];\n }\n Module._free(ptr_pos_count);\n Module._free(ptr_idx_count);\n Module._free(ptr_pos);\n Module._free(ptr_idx);\n Module._free(ptr_nor);\n Module._free(ptr_tex);\n _free(ptr_options);\n _GS_Clear_Geometry_Tessellate_Data(key);\n return {\n positions: pos,\n indexes: idx,\n normals: nor,\n texcoords: tex\n };\n };\n window.JS_Merge_Shell = exports.JS_Merge_Shell = JS_Merge_Shell = function JS_Merge_Shell(key, from_key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Compute_Geometry_Texture_Coords(key, ptr_options);\n _free(ptr_options);\n };\n exports.JS_Set_Geometry_Normals = JS_Set_Geometry_Normals = function JS_Set_Geometry_Normals(key, offset, count, value) {\n var pcount = value.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = value[i];\n }\n _GS_Set_Geometry_Normals(key, offset, count, ptr_pos);\n Module._free(ptr_pos);\n };\n exports.JS_Show_Geometry_Normals = JS_Show_Geometry_Normals = function JS_Show_Geometry_Normals(key, offset, count) {\n var ptr_normals = Module._malloc(4 * count * 3);\n _GS_Show_Geometry_Normals(key, offset, count, ptr_normals);\n var normals = new Float32Array(count * 3);\n for (var i = 0; i < count; i++) {\n normals[i * 3] = Module.HEAPF32[ptr_normals / 4 + i * 3];\n normals[i * 3 + 1] = Module.HEAPF32[ptr_normals / 4 + i * 3 + 1];\n normals[i * 3 + 2] = Module.HEAPF32[ptr_normals / 4 + i * 3 + 2];\n }\n Module._free(ptr_normals);\n return normals;\n };\n exports.JS_UnSet_Geometry_Normals = JS_UnSet_Geometry_Normals = _GS_UnSet_Geometry_Normals;\n exports.JS_Compute_Geometry_Tessellate_Data = JS_Compute_Geometry_Tessellate_Data = function JS_Compute_Geometry_Tessellate_Data(key, image_key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Compute_Geometry_Tessellate_Data(key, ptr_options);\n var ptr_pos_count = Module._malloc(4);\n var ptr_idx_count = Module._malloc(4);\n _GS_Show_Geometry_Tessellate_Data_Count(key, ptr_pos_count, ptr_idx_count);\n var pos_count = Module.HEAP32[ptr_pos_count / 4];\n var idx_count = Module.HEAP32[ptr_idx_count / 4];\n var ptr_pos = Module._malloc(4 * pos_count * 3);\n var ptr_idx = Module._malloc(4 * idx_count);\n var ptr_nor = Module._malloc(4 * pos_count * 3);\n var ptr_tex = Module._malloc(4 * pos_count * 2);\n _GS_Show_Geometry_Tessellate_Data(key, image_key, ptr_pos, ptr_idx, ptr_nor, ptr_tex);\n var pos = new Float32Array(pos_count * 3);\n var idx = new Int32Array(idx_count);\n var nor = new Float32Array(pos_count * 3);\n var tex = new Float32Array(pos_count * 2);\n for (var i = 0; i < pos_count; i++) {\n pos[i * 3] = Module.HEAPF32[ptr_pos / 4 + i * 3];\n pos[i * 3 + 1] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 1];\n pos[i * 3 + 2] = Module.HEAPF32[ptr_pos / 4 + i * 3 + 2];\n }\n for (var i = 0; i < idx_count; i++) {\n idx[i] = Module.HEAP32[ptr_idx / 4 + i];\n }\n for (var i = 0; i < pos_count; i++) {\n nor[i * 3] = Module.HEAPF32[ptr_nor / 4 + i * 3];\n nor[i * 3 + 1] = Module.HEAPF32[ptr_nor / 4 + i * 3 + 1];\n nor[i * 3 + 2] = Module.HEAPF32[ptr_nor / 4 + i * 3 + 2];\n }\n for (var i = 0; i < pos_count; i++) {\n tex[i * 2] = Module.HEAPF32[ptr_tex / 4 + i * 2];\n tex[i * 2 + 1] = Module.HEAPF32[ptr_tex / 4 + i * 2 + 1];\n }\n Module._free(ptr_pos_count);\n Module._free(ptr_idx_count);\n Module._free(ptr_pos);\n Module._free(ptr_idx);\n Module._free(ptr_nor);\n Module._free(ptr_tex);\n _free(ptr_options);\n _GS_Clear_Geometry_Tessellate_Data(key);\n return {\n positions: pos,\n indexes: idx,\n normals: nor,\n texcoords: tex\n };\n };\n exports.JS_Merge_Shell = JS_Merge_Shell = function JS_Merge_Shell(key, from_key, options) {\n var ptr_options = allocateUTF8(options);\n _GS_Merge_Shell(key, from_key, ptr_options);\n _free(ptr_options);\n };\n window.JS_Extrude_By_Shell = exports.JS_Extrude_By_Shell = JS_Extrude_By_Shell = function JS_Extrude_By_Shell(points, indexes, normal, options) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var ptr_normal = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_normal / 4] = normal[0];\n Module.HEAPF32[ptr_normal / 4 + 1] = normal[1];\n Module.HEAPF32[ptr_normal / 4 + 2] = normal[2];\n var ptr_options = allocateUTF8(options);\n var key = _GS_Extrude_By_Shell(ptr_pos, pcount / 3, ptr_ind, icount, ptr_normal, ptr_options);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n Module._free(ptr_normal);\n _free(ptr_options);\n return key;\n };\n window.JS_DExtrude_By_Shell = exports.JS_DExtrude_By_Shell = JS_DExtrude_By_Shell = function JS_DExtrude_By_Shell(points, indexes, normal, options) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(8 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF64[ptr_pos / 8 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var ptr_normal = Module._malloc(8 * 3);\n Module.HEAPF64[ptr_normal / 8] = normal[0];\n Module.HEAPF64[ptr_normal / 8 + 1] = normal[1];\n Module.HEAPF64[ptr_normal / 8 + 2] = normal[2];\n var ptr_options = allocateUTF8(options);\n var key = _GS_DExtrude_By_Shell(ptr_pos, pcount / 3, ptr_ind, icount, ptr_normal, ptr_options);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n Module._free(ptr_normal);\n _free(ptr_options);\n return key;\n };\n window.JS_Rotate_By_Shell = exports.JS_Rotate_By_Shell = JS_Rotate_By_Shell = function JS_Rotate_By_Shell(points, indexes, origin, normal, options) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(4 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 4 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var ptr_origin = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_origin / 4] = origin[0];\n Module.HEAPF32[ptr_origin / 4 + 1] = origin[1];\n Module.HEAPF32[ptr_origin / 4 + 2] = origin[2];\n var ptr_normal = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_normal / 4] = normal[0];\n Module.HEAPF32[ptr_normal / 4 + 1] = normal[1];\n Module.HEAPF32[ptr_normal / 4 + 2] = normal[2];\n var ptr_options = allocateUTF8(options);\n var key = _GS_Rotate_By_Shell(ptr_pos, pcount / 3, ptr_ind, icount, ptr_origin, ptr_normal, ptr_options);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n Module._free(ptr_origin);\n Module._free(ptr_normal);\n _free(ptr_options);\n return key;\n };\n window.JS_DRotate_By_Shell = exports.JS_DRotate_By_Shell = JS_DRotate_By_Shell = function JS_DRotate_By_Shell(points, indexes, origin, normal, options) {\n var pcount = points.length;\n var ptr_pos = Module._malloc(8 * pcount);\n for (var i = 0; i < pcount; i++) {\n Module.HEAPF32[ptr_pos / 8 + i] = points[i];\n }\n var icount = indexes.length;\n var ptr_ind = Module._malloc(4 * icount);\n for (var i = 0; i < icount; i++) {\n Module.HEAP32[ptr_ind / 4 + i] = indexes[i];\n }\n var ptr_origin = Module._malloc(8 * 3);\n Module.HEAPF32[ptr_origin / 8] = origin[0];\n Module.HEAPF32[ptr_origin / 8 + 1] = origin[1];\n Module.HEAPF32[ptr_origin / 8 + 2] = origin[2];\n var ptr_normal = Module._malloc(8 * 3);\n Module.HEAPF32[ptr_normal / 8] = normal[0];\n Module.HEAPF32[ptr_normal / 8 + 1] = normal[1];\n Module.HEAPF32[ptr_normal / 8 + 2] = normal[2];\n var ptr_options = allocateUTF8(options);\n var key = _GS_DRotate_By_Shell(ptr_pos, pcount / 3, ptr_ind, icount, ptr_origin, ptr_normal, ptr_options);\n Module._free(ptr_pos);\n Module._free(ptr_ind);\n Module._free(ptr_origin);\n Module._free(ptr_normal);\n _free(ptr_options);\n return key;\n };\n window.JS_Sweep_By_Shell = exports.JS_Sweep_By_Shell = JS_Sweep_By_Shell = function JS_Sweep_By_Shell(points, indexes, path, options) {\n var ptr_points = Module._malloc(4 * points.length);\n Module.HEAPF32.set(points, ptr_points / 4);\n var ptr_indexes = Module._malloc(4 * indexes.length);\n Module.HEAP32.set(indexes, ptr_indexes / 4);\n var ptr_path = Module._malloc(4 * path.length);\n Module.HEAPF32.set(path, ptr_path / 4);\n var ptr_options = allocateUTF8(options);\n var key = _GS_Sweep_By_Shell(ptr_points, points.length / 3, ptr_indexes, indexes.length, ptr_path, path.length / 3, ptr_options);\n Module._free(ptr_points);\n Module._free(ptr_indexes);\n Module._free(ptr_path);\n _free(ptr_options);\n return key;\n };\n window.JS_DSweep_By_Shell = exports.JS_DSweep_By_Shell = JS_DSweep_By_Shell = function JS_DSweep_By_Shell(points, indexes, path, options) {\n var ptr_points = Module._malloc(8 * points.length);\n Module.HEAPF64.set(points, ptr_points / 8);\n var ptr_indexes = Module._malloc(4 * indexes.length);\n Module.HEAP32.set(indexes, ptr_indexes / 4);\n var ptr_path = Module._malloc(8 * path.length);\n Module.HEAPF64.set(path, ptr_path / 8);\n var ptr_options = allocateUTF8(options);\n var key = _GS_DSweep_By_Shell(ptr_points, points.length / 3, ptr_indexes, indexes.length, ptr_path, path.length / 3, ptr_options);\n Module._free(ptr_points);\n Module._free(ptr_indexes);\n Module._free(ptr_path);\n _free(ptr_options);\n return key;\n };\n window.JS_Compute_Ray_Test = exports.JS_Compute_Ray_Test = JS_Compute_Ray_Test = function JS_Compute_Ray_Test(view_key, origin, direct) {\n var ptr_origin = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_origin / 4] = origin[0];\n Module.HEAPF32[ptr_origin / 4 + 1] = origin[1];\n Module.HEAPF32[ptr_origin / 4 + 2] = origin[2];\n var ptr_direct = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_direct / 4] = direct[0];\n Module.HEAPF32[ptr_direct / 4 + 1] = direct[1];\n Module.HEAPF32[ptr_direct / 4 + 2] = direct[2];\n var ptr_position = Module._malloc(4 * 3);\n var position = null;\n if (_GS_Compute_Ray_Test(view_key, ptr_origin, ptr_direct, ptr_position)) {\n position = new Float32Array(3);\n position[0] = Module.HEAPF32[ptr_position / 4];\n position[1] = Module.HEAPF32[ptr_position / 4 + 1];\n position[2] = Module.HEAPF32[ptr_position / 4 + 2];\n }\n Module._free(ptr_origin);\n Module._free(ptr_direct);\n Module._free(ptr_position);\n return position;\n };\n window.JS_Compute_Geometry_Ray_Test = exports.JS_Compute_Geometry_Ray_Test = JS_Compute_Geometry_Ray_Test = function JS_Compute_Geometry_Ray_Test(view_key, geom_key, origin, direct) {\n var ptr_origin = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_origin / 4] = origin[0];\n Module.HEAPF32[ptr_origin / 4 + 1] = origin[1];\n Module.HEAPF32[ptr_origin / 4 + 2] = origin[2];\n var ptr_direct = Module._malloc(4 * 3);\n Module.HEAPF32[ptr_direct / 4] = direct[0];\n Module.HEAPF32[ptr_direct / 4 + 1] = direct[1];\n Module.HEAPF32[ptr_direct / 4 + 2] = direct[2];\n var ptr_position = Module._malloc(4 * 3);\n var position = null;\n if (_GS_Compute_Geometry_Ray_Test(view_key, geom_key, ptr_origin, ptr_direct, ptr_position)) {\n position = new Float32Array(3);\n position[0] = Module.HEAPF32[ptr_position / 4];\n position[1] = Module.HEAPF32[ptr_position / 4 + 1];\n position[2] = Module.HEAPF32[ptr_position / 4 + 2];\n }\n Module._free(ptr_origin);\n Module._free(ptr_direct);\n Module._free(ptr_position);\n return position;\n };\n window.JS_Compute_Box_Test = exports.JS_Compute_Box_Test = JS_Compute_Box_Test = function JS_Compute_Box_Test(view_key, bb) {\n var ptr_bb = Module._malloc(4 * 6);\n Module.HEAPF32.set(bb, ptr_bb / 4);\n var ptr_result = Module._malloc(4 * 6);\n var result = null;\n if (_GS_Compute_Box_Test(view_key, ptr_bb, ptr_result)) {\n result = new Float32Array(6);\n result.set(Module.HEAPF32.subarray(ptr_result / 4, ptr_result / 4 + 6));\n }\n Module._free(ptr_bb);\n Module._free(ptr_result);\n return result;\n };\n window.JS_Compute_Polygon_Area = exports.JS_Compute_Polygon_Area = JS_Compute_Polygon_Area = function JS_Compute_Polygon_Area(points) {\n var ptr_points = Module._malloc(8 * points.length);\n Module.HEAPF64.set(points, ptr_points / 8);\n var ptr_area = Module._malloc(8);\n _GS_Compute_Polygon_Area(ptr_points, points.length / 3, ptr_area);\n var area = Module.HEAPF64[ptr_area / 8];\n Module._free(ptr_points);\n Module._free(ptr_area);\n return area;\n };\n window.JS_Compute_Area = exports.JS_Compute_Area = JS_Compute_Area = function JS_Compute_Area(key) {\n var ptr_area = Module._malloc(8);\n _GS_Compute_Area(key, ptr_area);\n var area = Module.HEAPF64[ptr_area / 8];\n Module._free(ptr_area);\n return area;\n };\n window.JS_Compute_Volume = exports.JS_Compute_Volume = JS_Compute_Volume = function JS_Compute_Volume(key) {\n var ptr_volume = Module._malloc(8);\n _GS_Compute_Volume(key, ptr_volume);\n var volume = Module.HEAPF64[ptr_volume / 8];\n Module._free(ptr_volume);\n return volume;\n };\n window.JS_Is_Solid_Geometry = exports.JS_Is_Solid_Geometry = JS_Is_Solid_Geometry = _GS_Is_Solid_Geometry;\n window.JS_Compute_Geometry_Distance = exports.JS_Compute_Geometry_Distance = JS_Compute_Geometry_Distance = function JS_Compute_Geometry_Distance(geomKey1, geomKey2, path1, path2) {\n var ptr_dist = Module._malloc(4 * 7);\n var ptr_path1 = null;\n var path1_len = 0;\n if (path1) {\n ptr_path1 = Module._malloc(4 * path1.length);\n Module.HEAP32.set(path1, ptr_path1 / 4);\n path1_len = path1.length;\n }\n var ptr_path2 = null;\n var path2_len = 0;\n if (path2) {\n ptr_path2 = Module._malloc(4 * path2.length);\n Module.HEAP32.set(path2, ptr_path2 / 4);\n path2_len = path2.length;\n }\n _GS_Compute_Geometry_Distance(geomKey1, geomKey2, ptr_path1, path1_len, ptr_path2, path2_len, ptr_dist);\n var result = new Float32Array(7);\n result[0] = Module.HEAPF32[ptr_dist / 4];\n result[1] = Module.HEAPF32[ptr_dist / 4 + 1];\n result[2] = Module.HEAPF32[ptr_dist / 4 + 2];\n result[3] = Module.HEAPF32[ptr_dist / 4 + 3];\n result[4] = Module.HEAPF32[ptr_dist / 4 + 4];\n result[5] = Module.HEAPF32[ptr_dist / 4 + 5];\n result[6] = Module.HEAPF32[ptr_dist / 4 + 6];\n Module._free(ptr_dist);\n Module._free(ptr_path1);\n Module._free(ptr_path2);\n return result;\n };\n window.JS_Segment_To_Stream = exports.JS_Segment_To_Stream = JS_Segment_To_Stream = function JS_Segment_To_Stream() {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Segment_To_Stream(ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n Module._free(loca);\n Module._free(ptr_data);\n Module._free(ptr_size);\n return buffer;\n };\n window.JS_Segment_To_Stream_By_Key = exports.JS_Segment_To_Stream_By_Key = JS_Segment_To_Stream_By_Key = function JS_Segment_To_Stream_By_Key(key) {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Segment_To_Stream_By_Key(key, ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n return buffer;\n };\n window.JS_Segment_To_Stream_With_Compression = exports.JS_Segment_To_Stream_With_Compression = JS_Segment_To_Stream_With_Compression = function JS_Segment_To_Stream_With_Compression() {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Segment_To_Stream_With_Compression(ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n Module._free(loca);\n Module._free(ptr_data);\n Module._free(ptr_size);\n return buffer;\n };\n window.JS_Segment_To_Stream_With_Compression_By_Key = exports.JS_Segment_To_Stream_With_Compression_By_Key = JS_Segment_To_Stream_With_Compression_By_Key = function JS_Segment_To_Stream_With_Compression_By_Key(key) {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Segment_To_Stream_With_Compression_By_Key(key, ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n return buffer;\n };\n window.JS_Stream_To_Segment_By_Key = exports.JS_Stream_To_Segment_By_Key = JS_Stream_To_Segment_By_Key = function JS_Stream_To_Segment_By_Key(data, owner_key) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n var key = _GS_Stream_To_Segment_By_Key(ptr_data, data.byteLength, owner_key);\n Module._free(ptr_data);\n array = null;\n return key;\n };\n window.JS_Stream_To_Segment_By_Key_Tt = exports.JS_Stream_To_Segment_By_Key_Tt = JS_Stream_To_Segment_By_Key_Tt = function JS_Stream_To_Segment_By_Key_Tt(data, owner_key, no, view_key) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n var key = _GS_Stream_To_Segment_By_Key_Tt(ptr_data, data.byteLength, owner_key, no, view_key);\n Module._free(ptr_data);\n array = null;\n return key;\n };\n window.JS_Stream_With_Compression_To_Segment_By_Key = exports.JS_Stream_With_Compression_To_Segment_By_Key = JS_Stream_With_Compression_To_Segment_By_Key = function JS_Stream_With_Compression_To_Segment_By_Key(data, owner_key, options) {\n var ptr_data = Module._malloc(data.byteLength);\n var ptr_options = allocateUTF8(options);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n var key = _GS_Stream_With_Compression_To_Segment_By_Key(ptr_data, data.byteLength, owner_key, ptr_options);\n Module._free(ptr_data);\n _free(ptr_options);\n array = null;\n return key;\n };\n window.JS_Segment_Data_To_Stream = exports.JS_Segment_Data_To_Stream = JS_Segment_Data_To_Stream = function JS_Segment_Data_To_Stream() {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Segment_Data_To_Stream(ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n Module._free(loca);\n Module._free(ptr_data);\n Module._free(ptr_size);\n return buffer;\n };\n window.JS_Stream_To_Segment_Data = exports.JS_Stream_To_Segment_Data = JS_Stream_To_Segment_Data = function JS_Stream_To_Segment_Data(data) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n var key = _GS_Stream_To_Segment_Data(ptr_data, data.byteLength);\n Module._free(ptr_data);\n array = null;\n return key;\n };\n window.JS_Geometry_Data_To_Stream = exports.JS_Geometry_Data_To_Stream = JS_Geometry_Data_To_Stream = function JS_Geometry_Data_To_Stream() {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Geometry_Data_To_Stream(ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n Module._free(loca);\n Module._free(ptr_data);\n Module._free(ptr_size);\n return buffer;\n };\n window.JS_Geometry_Data_To_Stream_With_Compression = JS_Geometry_Data_To_Stream_With_Compression = function JS_Geometry_Data_To_Stream_With_Compression() {\n var ptr_data = Module._malloc(4);\n var ptr_size = Module._malloc(4);\n _GS_Geometry_Data_To_Stream_With_Compression(ptr_data, ptr_size);\n var loca = Module.HEAP32[ptr_data / 4];\n var size = Module.HEAP32[ptr_size / 4];\n var buffer = new ArrayBuffer(size);\n var result = new Uint8Array(buffer);\n result.set(Module.HEAP8.subarray(loca, loca + size));\n Module._free(loca);\n Module._free(ptr_data);\n Module._free(ptr_size);\n return buffer;\n };\n window.JS_Stream_To_Geometry_Data = exports.JS_Stream_To_Geometry_Data = JS_Stream_To_Geometry_Data = function JS_Stream_To_Geometry_Data(data) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Stream_To_Geometry_Data(ptr_data, data.byteLength);\n Module._free(ptr_data);\n array = null;\n };\n window.JS_Stream_To_Geometry_Data_By_Key = exports.JS_Stream_To_Geometry_Data_By_Key = JS_Stream_To_Geometry_Data_By_Key = function JS_Stream_To_Geometry_Data_By_Key(key, data) {\n if (data instanceof ArrayBuffer) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Key(key, ptr_data, data.byteLength);\n Module._free(ptr_data);\n array = null;\n } else if (data instanceof Uint8Array) {\n var ptr_data = Module._malloc(data.length);\n Module.HEAP8.set(data, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Key(key, ptr_data, data.length);\n Module._free(ptr_data);\n }\n };\n window.JS_Stream_To_Geometry_Data_By_Keys = exports.JS_Stream_To_Geometry_Data_By_Keys = JS_Stream_To_Geometry_Data_By_Keys = function JS_Stream_To_Geometry_Data_By_Keys(keys, data) {\n if (data instanceof ArrayBuffer) {\n var ptr_keys = Module._malloc(4 * keys.length);\n var ptr_data = Module._malloc(data.byteLength);\n Module.HEAP32.set(keys, ptr_keys / 4);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Keys(ptr_keys, keys.length, ptr_data, data.byteLength);\n Module._free(ptr_keys);\n Module._free(ptr_data);\n array = null;\n } else if (data instanceof Uint8Array) {\n var ptr_keys = Module._malloc(4 * keys.length);\n var ptr_data = Module._malloc(data.length);\n Module.HEAP32.set(keys, ptr_keys / 4);\n Module.HEAP8.set(data, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Keys(ptr_keys, keys.length, ptr_data, data.length);\n Module._free(ptr_keys);\n Module._free(ptr_data);\n }\n };\n window.JS_Stream_To_Geometry_Data_By_Keys_Tt = exports.JS_Stream_To_Geometry_Data_By_Keys_Tt = JS_Stream_To_Geometry_Data_By_Keys_Tt = function JS_Stream_To_Geometry_Data_By_Keys_Tt(keys, data, view_key) {\n if (data instanceof ArrayBuffer) {\n var ptr_keys = Module._malloc(4 * keys.length);\n var ptr_data = Module._malloc(data.byteLength);\n Module.HEAP32.set(keys, ptr_keys / 4);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Keys_Tt(ptr_keys, keys.length, ptr_data, data.byteLength, view_key);\n Module._free(ptr_keys);\n Module._free(ptr_data);\n array = null;\n } else if (data instanceof Uint8Array) {\n var ptr_keys = Module._malloc(4 * keys.length);\n var ptr_data = Module._malloc(data.length);\n Module.HEAP32.set(keys, ptr_keys / 4);\n Module.HEAP8.set(data, ptr_data);\n _GS_Stream_To_Geometry_Data_By_Keys_Tt(ptr_keys, keys.length, ptr_data, data.length, view_key);\n Module._free(ptr_keys);\n Module._free(ptr_data);\n }\n };\n window.JS_Stream_To_Geometry_Data_With_Compression = exports.JS_Stream_To_Geometry_Data_With_Compression = JS_Stream_To_Geometry_Data_With_Compression = function JS_Stream_To_Geometry_Data_With_Compression(data) {\n var ptr_data = Module._malloc(data.byteLength);\n var array = new Int8Array(data);\n Module.HEAP8.set(array, ptr_data);\n _GS_Stream_To_Geometry_Data_With_Compression(ptr_data, data.byteLength);\n Module._free(ptr_data);\n array = null;\n };\n window.JS_Copy_Segment_By_Key = exports.JS_Copy_Segment_By_Key = JS_Copy_Segment_By_Key = _GS_Copy_Segment_By_Key;\n window.JS_Show_Database_Info = exports.JS_Show_Database_Info = JS_Show_Database_Info = function JS_Show_Database_Info(key) {\n var ptr_info = Module._malloc(512);\n _GS_Show_Database_Info(key, ptr_info);\n var info = UTF8ToString(ptr_info);\n Module._free(ptr_info);\n return info;\n };\n window.JS_Show_Allocated_Memory_Size = exports.JS_Show_Allocated_Memory_Size = JS_Show_Allocated_Memory_Size = _GS_Show_Allocated_Memory_Size;\n window.JS_Execute_Task_Post_Processing = exports.JS_Execute_Task_Post_Processing = JS_Execute_Task_Post_Processing = _GS_Execute_Task_Post_Processing;\n window.JS_Create_Texture = exports.JS_Create_Texture = JS_Create_Texture = function JS_Create_Texture(buffer) {\n _glGenTextures(1, buffer);\n if (window.GROWABLE_HEAP_I32) {\n return GL.textures[GROWABLE_HEAP_I32()[buffer >> 2]];\n } else {\n return GL.textures[HEAP32[buffer >> 2]];\n }\n };\n window.JS_Boolean_Intersection_Graph = exports.JS_Boolean_Intersection_Graph = JS_Boolean_Intersection_Graph = function JS_Boolean_Intersection_Graph(points, indexes, root, normal) {\n var result = null;\n var ptr_points = Module._malloc(8 * points.length);\n var ptr_indexes = Module._malloc(4 * indexes.length);\n var ptr_root = Module._malloc(8 * 3);\n var ptr_normal = Module._malloc(8 * 3);\n Module.HEAPF64.set(points, ptr_points / 8);\n Module.HEAP32.set(indexes, ptr_indexes / 4);\n Module.HEAPF64.set(root, ptr_root / 8);\n Module.HEAPF64.set(normal, ptr_normal / 8);\n var ptr_inter_points = Module._malloc(4);\n var ptr_inter_pos_count = Module._malloc(4);\n var ptr_inter_indexes = Module._malloc(4);\n var ptr_inter_idx_count = Module._malloc(4);\n if (_GS_Boolean_Intersection_Graph(ptr_points, ptr_indexes, indexes.length, ptr_root, ptr_normal, ptr_inter_points, ptr_inter_pos_count, ptr_inter_indexes, ptr_inter_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_inter_points / 4];\n var pos_size = Module.HEAP32[ptr_inter_pos_count / 4] * 3;\n var inter_points = new Float64Array(pos_size);\n inter_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_inter_indexes / 4];\n var idx_size = Module.HEAP32[ptr_inter_idx_count / 4];\n var inter_indexes = new Int32Array(idx_size);\n inter_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: inter_points,\n indexes: inter_indexes\n };\n }\n Module._free(ptr_inter_points);\n Module._free(ptr_inter_pos_count);\n Module._free(ptr_inter_indexes);\n Module._free(ptr_inter_idx_count);\n Module._free(ptr_points);\n Module._free(ptr_indexes);\n Module._free(ptr_root);\n Module._free(ptr_normal);\n return result;\n };\n window.JS_Boolean_Intersect_Polyline_Polygon_Xy = exports.JS_Boolean_Intersect_Polyline_Polygon_Xy = JS_Boolean_Intersect_Polyline_Polygon_Xy = function JS_Boolean_Intersect_Polyline_Polygon_Xy(polyline_points, polyline_indexes, tool_points, tool_indexes, result_points) {\n var result = null;\n var ptr_polyline_points = Module._malloc(8 * polyline_points.length);\n var ptr_polyline_indexes = Module._malloc(4 * polyline_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(polyline_points, ptr_polyline_points / 8);\n Module.HEAP32.set(polyline_indexes, ptr_polyline_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Intersect_Polyline_Polygon_Xy(ptr_polyline_points, ptr_polyline_indexes, polyline_indexes.length, ptr_tool_points, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_polyline_points);\n Module._free(ptr_polyline_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n window.JS_Boolean_Intersect_Polygon_Polygon_Xy = exports.JS_Boolean_Intersect_Polygon_Polygon_Xy = JS_Boolean_Intersect_Polygon_Polygon_Xy = function JS_Boolean_Intersect_Polygon_Polygon_Xy(polygon_points, polygon_indexes, tool_points, tool_indexes) {\n var result = null;\n var ptr_polygon_points = Module._malloc(8 * polygon_points.length);\n var ptr_polygon_indexes = Module._malloc(4 * polygon_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(polygon_points, ptr_polygon_points / 8);\n Module.HEAP32.set(polygon_indexes, ptr_polygon_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Intersect_Polygon_Polygon_Xy(ptr_polygon_points, ptr_polygon_indexes, polygon_indexes.length, ptr_tool_points, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_polygon_points);\n Module._free(ptr_polygon_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n window.JS_Boolean_Intersect_Graph_Polygon_Xy = exports.JS_Boolean_Intersect_Graph_Polygon_Xy = JS_Boolean_Intersect_Graph_Polygon_Xy = function JS_Boolean_Intersect_Graph_Polygon_Xy(graph_points, graph_indexes, tool_points, tool_indexes) {\n var result = null;\n var ptr_graph_points = Module._malloc(8 * graph_points.length);\n var ptr_graph_indexes = Module._malloc(4 * graph_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(graph_points, ptr_graph_points / 8);\n Module.HEAP32.set(graph_indexes, ptr_graph_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Intersect_Graph_Polygon_Xy(ptr_graph_points, ptr_graph_indexes, graph_indexes.length, ptr_tool_points, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_graph_points);\n Module._free(ptr_graph_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n window.JS_Boolean_Subtract_Polygon_Polygon_Xy = exports.JS_Boolean_Subtract_Polygon_Polygon_Xy = JS_Boolean_Subtract_Polygon_Polygon_Xy = function JS_Boolean_Subtract_Polygon_Polygon_Xy(polygon_points, polygon_indexes, tool_points, tool_indexes) {\n var result = null;\n var ptr_polygon_points = Module._malloc(8 * polygon_points.length);\n var ptr_polygon_indexes = Module._malloc(4 * polygon_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(polygon_points, ptr_polygon_points / 8);\n Module.HEAP32.set(polygon_indexes, ptr_polygon_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Subtract_Polygon_Polygon_Xy(ptr_polygon_points, ptr_polygon_indexes, polygon_indexes.length, ptr_tool_points, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_polygon_points);\n Module._free(ptr_polygon_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n window.JS_Boolean_Cut_Polygon_Polygon_Xy = exports.JS_Boolean_Cut_Polygon_Polygon_Xy = JS_Boolean_Cut_Polygon_Polygon_Xy = function JS_Boolean_Cut_Polygon_Polygon_Xy(polygon_points, polygon_indexes, tool_points, tool_indexes) {\n var result = null;\n var ptr_polygon_points = Module._malloc(8 * polygon_points.length);\n var ptr_polygon_indexes = Module._malloc(4 * polygon_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(polygon_points, ptr_polygon_points / 8);\n Module.HEAP32.set(polygon_indexes, ptr_polygon_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Cut_Polygon_Polygon_Xy(ptr_polygon_points, ptr_polygon_indexes, polygon_indexes.length, ptr_tool_points, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_polygon_points);\n Module._free(ptr_polygon_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n window.JS_Boolean_Subtract = exports.JS_Boolean_Subtract = JS_Boolean_Subtract = function JS_Boolean_Subtract(blank_points, blank_indexes, tool_points, tool_indexes) {\n var result = null;\n var ptr_blank_points = Module._malloc(8 * blank_points.length);\n var ptr_blank_indexes = Module._malloc(4 * blank_indexes.length);\n var ptr_tool_points = Module._malloc(8 * tool_points.length);\n var ptr_tool_indexes = Module._malloc(4 * tool_indexes.length);\n Module.HEAPF64.set(blank_points, ptr_blank_points / 8);\n Module.HEAP32.set(blank_indexes, ptr_blank_indexes / 4);\n Module.HEAPF64.set(tool_points, ptr_tool_points / 8);\n Module.HEAP32.set(tool_indexes, ptr_tool_indexes / 4);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Boolean_Subtract(ptr_blank_points, blank_points.length / 3, ptr_blank_indexes, blank_indexes.length, ptr_tool_points, tool_points.length / 3, ptr_tool_indexes, tool_indexes.length, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_blank_points);\n Module._free(ptr_blank_indexes);\n Module._free(ptr_tool_points);\n Module._free(ptr_tool_indexes);\n return result;\n };\n }\n };\n exports.JS_Init_Apis = JS_Init_Apis;\n window.JS_Feature_Extrude = exports.JS_Feature_Extrude = JS_Feature_Extrude = function JS_Feature_Extrude(points, indexes, normal, options) {\n var result = null;\n var ptr_points = Module._malloc(8 * points.length);\n var ptr_indexes = Module._malloc(4 * indexes.length);\n var ptr_normal = Module._malloc(8 * 3);\n Module.HEAPF64.set(points, ptr_points / 8);\n Module.HEAP32.set(indexes, ptr_indexes / 4);\n Module.HEAPF64.set(normal, ptr_normal / 8);\n var ptr_options = null;\n if (options) {\n ptr_options = allocateUTF8(options);\n }\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n var ptr_res_indexes = Module._malloc(4);\n var ptr_res_idx_count = Module._malloc(4);\n if (_GS_Feature_Extrude(ptr_points, points.length / 3, ptr_indexes, indexes.length, ptr_normal, ptr_options, ptr_res_points, ptr_res_pos_count, ptr_res_indexes, ptr_res_idx_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n var idx_loca = Module.HEAP32[ptr_res_indexes / 4];\n var idx_size = Module.HEAP32[ptr_res_idx_count / 4];\n var res_indexes = new Int32Array(idx_size);\n res_indexes.set(Module.HEAP32.subarray(idx_loca / 4, idx_loca / 4 + idx_size));\n Module._free(pos_loca);\n Module._free(idx_loca);\n result = {\n positions: res_points,\n indexes: res_indexes\n };\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_res_indexes);\n Module._free(ptr_res_idx_count);\n Module._free(ptr_points);\n Module._free(ptr_indexes);\n Module._free(ptr_normal);\n if (ptr_options) {\n _free(ptr_options);\n }\n return result;\n };\n window.JS_Planar_Polyline_Offset = exports.JS_Planar_Polyline_Offset = JS_Planar_Polyline_Offset = function JS_Planar_Polyline_Offset(points, offset_value) {\n var result = new gs_collections_1.List();\n var ptr_points = Module._malloc(8 * points.length);\n Module.HEAPF64.set(points, ptr_points / 8);\n var ptr_res_points = Module._malloc(4);\n var ptr_res_pos_count = Module._malloc(4);\n if (_GS_Planar_Polyline_Offset(ptr_points, points.length / 3, offset_value, ptr_res_points, ptr_res_pos_count)) {\n var pos_loca = Module.HEAP32[ptr_res_points / 4];\n var pos_size = Module.HEAP32[ptr_res_pos_count / 4] * 3;\n var res_points = new Float64Array(pos_size);\n res_points.set(Module.HEAPF64.subarray(pos_loca / 8, pos_loca / 8 + pos_size));\n result = gs_math_1.DGeometryOperators.createPolylinesBySegments(res_points);\n Module._free(pos_loca);\n }\n Module._free(ptr_res_points);\n Module._free(ptr_res_pos_count);\n Module._free(ptr_points);\n return result;\n };\n var CameraChangeType;\n (function (CameraChangeType) {\n CameraChangeType[CameraChangeType[\"Translate\"] = 1] = \"Translate\";\n CameraChangeType[CameraChangeType[\"Rotate\"] = 2] = \"Rotate\";\n CameraChangeType[CameraChangeType[\"Scale\"] = 4] = \"Scale\";\n })(CameraChangeType = exports.CameraChangeType || (exports.CameraChangeType = {}));\n var ObjectType;\n (function (ObjectType) {\n ObjectType[ObjectType[\"TYPE_Unknown\"] = 0] = \"TYPE_Unknown\";\n ObjectType[ObjectType[\"TYPE_Segment\"] = 1] = \"TYPE_Segment\";\n ObjectType[ObjectType[\"TYPE_Include\"] = 2] = \"TYPE_Include\";\n ObjectType[ObjectType[\"TYPE_Style\"] = 3] = \"TYPE_Style\";\n ObjectType[ObjectType[\"TYPE_Driver\"] = 10] = \"TYPE_Driver\";\n ObjectType[ObjectType[\"TYPE_RenderContext\"] = 11] = \"TYPE_RenderContext\";\n ObjectType[ObjectType[\"TYPE_Color\"] = 12] = \"TYPE_Color\";\n ObjectType[ObjectType[\"TYPE_Shader\"] = 13] = \"TYPE_Shader\";\n ObjectType[ObjectType[\"TYPE_Viewport\"] = 14] = \"TYPE_Viewport\";\n ObjectType[ObjectType[\"TYPE_Camera\"] = 15] = \"TYPE_Camera\";\n ObjectType[ObjectType[\"TYPE_Visibility\"] = 16] = \"TYPE_Visibility\";\n ObjectType[ObjectType[\"TYPE_ModellingMatrix\"] = 17] = \"TYPE_ModellingMatrix\";\n ObjectType[ObjectType[\"TYPE_RenderingOptions\"] = 18] = \"TYPE_RenderingOptions\";\n ObjectType[ObjectType[\"TYPE_Condition\"] = 19] = \"TYPE_Condition\";\n ObjectType[ObjectType[\"TYPE_Selectability\"] = 20] = \"TYPE_Selectability\";\n ObjectType[ObjectType[\"TYPE_Font\"] = 21] = \"TYPE_Font\";\n ObjectType[ObjectType[\"TYPE_HeuristicOptions\"] = 22] = \"TYPE_HeuristicOptions\";\n ObjectType[ObjectType[\"TYPE_Marker\"] = 100] = \"TYPE_Marker\";\n ObjectType[ObjectType[\"TYPE_Line\"] = 101] = \"TYPE_Line\";\n ObjectType[ObjectType[\"TYPE_Polyline\"] = 102] = \"TYPE_Polyline\";\n ObjectType[ObjectType[\"TYPE_Circle\"] = 106] = \"TYPE_Circle\";\n ObjectType[ObjectType[\"TYPE_Shell\"] = 103] = \"TYPE_Shell\";\n ObjectType[ObjectType[\"TYPE_Mesh\"] = 104] = \"TYPE_Mesh\";\n ObjectType[ObjectType[\"TYPE_Cylinder\"] = 105] = \"TYPE_Cylinder\";\n ObjectType[ObjectType[\"TYPE_TriangularShell\"] = 107] = \"TYPE_TriangularShell\";\n ObjectType[ObjectType[\"TYPE_CuttingPlanes\"] = 109] = \"TYPE_CuttingPlanes\";\n ObjectType[ObjectType[\"TYPE_CircularArc\"] = 110] = \"TYPE_CircularArc\";\n ObjectType[ObjectType[\"TYPE_Ellipse\"] = 111] = \"TYPE_Ellipse\";\n ObjectType[ObjectType[\"TYPE_EllipseArc\"] = 112] = \"TYPE_EllipseArc\";\n ObjectType[ObjectType[\"TYPE_PolyCylinder\"] = 113] = \"TYPE_PolyCylinder\";\n ObjectType[ObjectType[\"TYPE_Light\"] = 120] = \"TYPE_Light\";\n ObjectType[ObjectType[\"TYPE_Image\"] = 121] = \"TYPE_Image\";\n ObjectType[ObjectType[\"TYPE_VectorText\"] = 122] = \"TYPE_VectorText\";\n ObjectType[ObjectType[\"TYPE_ParametricGeometry\"] = 123] = \"TYPE_ParametricGeometry\";\n ObjectType[ObjectType[\"TYPE_PointCloud\"] = 124] = \"TYPE_PointCloud\";\n })(ObjectType = exports.ObjectType || (exports.ObjectType = {}));\n var ElementType;\n (function (ElementType) {\n ElementType[ElementType[\"ELEMENT_TYPE_Unknown\"] = 0] = \"ELEMENT_TYPE_Unknown\";\n ElementType[ElementType[\"ELEMENT_TYPE_Vertex\"] = 1] = \"ELEMENT_TYPE_Vertex\";\n ElementType[ElementType[\"ELEMENT_TYPE_Edge\"] = 2] = \"ELEMENT_TYPE_Edge\";\n ElementType[ElementType[\"ELEMENT_TYPE_Marker\"] = 4] = \"ELEMENT_TYPE_Marker\";\n ElementType[ElementType[\"ELEMENT_TYPE_Line\"] = 8] = \"ELEMENT_TYPE_Line\";\n ElementType[ElementType[\"ELEMENT_TYPE_Face\"] = 16] = \"ELEMENT_TYPE_Face\";\n })(ElementType = exports.ElementType || (exports.ElementType = {}));\n var VertexType;\n (function (VertexType) {\n VertexType[VertexType[\"VERTEX_TYPE_None\"] = 0] = \"VERTEX_TYPE_None\";\n VertexType[VertexType[\"VERTEX_TYPE_Inner\"] = 1] = \"VERTEX_TYPE_Inner\";\n VertexType[VertexType[\"VERTEX_TYPE_Border\"] = 2] = \"VERTEX_TYPE_Border\";\n })(VertexType = exports.VertexType || (exports.VertexType = {}));\n var EdgeType;\n (function (EdgeType) {\n EdgeType[EdgeType[\"EDGE_TYPE_None\"] = 0] = \"EDGE_TYPE_None\";\n EdgeType[EdgeType[\"EDGE_TYPE_Inner\"] = 1] = \"EDGE_TYPE_Inner\";\n EdgeType[EdgeType[\"EDGE_TYPE_Border\"] = 2] = \"EDGE_TYPE_Border\";\n })(EdgeType = exports.EdgeType || (exports.EdgeType = {}));\n var ViewMode;\n (function (ViewMode) {\n ViewMode[ViewMode[\"XY\"] = 0] = \"XY\";\n ViewMode[ViewMode[\"YX\"] = 1] = \"YX\";\n ViewMode[ViewMode[\"XZ\"] = 2] = \"XZ\";\n ViewMode[ViewMode[\"ZX\"] = 3] = \"ZX\";\n ViewMode[ViewMode[\"YZ\"] = 4] = \"YZ\";\n ViewMode[ViewMode[\"ZY\"] = 5] = \"ZY\";\n ViewMode[ViewMode[\"Iso\"] = 6] = \"Iso\";\n ViewMode[ViewMode[\"EN\"] = 7] = \"EN\";\n ViewMode[ViewMode[\"NW\"] = 8] = \"NW\";\n ViewMode[ViewMode[\"WS\"] = 9] = \"WS\";\n ViewMode[ViewMode[\"SE\"] = 10] = \"SE\";\n ViewMode[ViewMode[\"TopE\"] = 11] = \"TopE\";\n ViewMode[ViewMode[\"BottomE\"] = 12] = \"BottomE\";\n ViewMode[ViewMode[\"TopN\"] = 13] = \"TopN\";\n ViewMode[ViewMode[\"BottomN\"] = 14] = \"BottomN\";\n ViewMode[ViewMode[\"TopW\"] = 15] = \"TopW\";\n ViewMode[ViewMode[\"BottomW\"] = 16] = \"BottomW\";\n ViewMode[ViewMode[\"TopS\"] = 17] = \"TopS\";\n ViewMode[ViewMode[\"BottomS\"] = 18] = \"BottomS\";\n ViewMode[ViewMode[\"TopEN\"] = 19] = \"TopEN\";\n ViewMode[ViewMode[\"BottomEN\"] = 20] = \"BottomEN\";\n ViewMode[ViewMode[\"TopNW\"] = 21] = \"TopNW\";\n ViewMode[ViewMode[\"BottomNW\"] = 22] = \"BottomNW\";\n ViewMode[ViewMode[\"TopWS\"] = 23] = \"TopWS\";\n ViewMode[ViewMode[\"BottomWS\"] = 24] = \"BottomWS\";\n ViewMode[ViewMode[\"TopSE\"] = 25] = \"TopSE\";\n ViewMode[ViewMode[\"BottomSE\"] = 26] = \"BottomSE\";\n ViewMode[ViewMode[\"YUpIso\"] = 27] = \"YUpIso\";\n })(ViewMode = exports.ViewMode || (exports.ViewMode = {}));\n var CoordinateSystem;\n (function (CoordinateSystem) {\n CoordinateSystem[CoordinateSystem[\"window\"] = 0] = \"window\";\n CoordinateSystem[CoordinateSystem[\"pixels\"] = 1] = \"pixels\";\n CoordinateSystem[CoordinateSystem[\"world\"] = 2] = \"world\";\n CoordinateSystem[CoordinateSystem[\"object\"] = 3] = \"object\";\n CoordinateSystem[CoordinateSystem[\"viewpoint\"] = 4] = \"viewpoint\";\n })(CoordinateSystem = exports.CoordinateSystem || (exports.CoordinateSystem = {}));\n var UpdateType;\n (function (UpdateType) {\n UpdateType[UpdateType[\"Synchronization\"] = 0] = \"Synchronization\";\n UpdateType[UpdateType[\"Asynchronization\"] = 1] = \"Asynchronization\";\n })(UpdateType = exports.UpdateType || (exports.UpdateType = {}));\n var AreaSelectionType;\n (function (AreaSelectionType) {\n AreaSelectionType[AreaSelectionType[\"TouchAndContain\"] = 0] = \"TouchAndContain\";\n AreaSelectionType[AreaSelectionType[\"Contain\"] = 1] = \"Contain\";\n })(AreaSelectionType = exports.AreaSelectionType || (exports.AreaSelectionType = {}));\n var FontUnitsType;\n (function (FontUnitsType) {\n FontUnitsType[FontUnitsType[\"Points\"] = 1] = \"Points\";\n FontUnitsType[FontUnitsType[\"Pixels\"] = 2] = \"Pixels\";\n FontUnitsType[FontUnitsType[\"Object\"] = 3] = \"Object\";\n FontUnitsType[FontUnitsType[\"World\"] = 4] = \"World\";\n FontUnitsType[FontUnitsType[\"Window\"] = 5] = \"Window\";\n })(FontUnitsType = exports.FontUnitsType || (exports.FontUnitsType = {}));\n var TextAlignment;\n (function (TextAlignment) {\n TextAlignment[TextAlignment[\"LeftBottom\"] = 1] = \"LeftBottom\";\n TextAlignment[TextAlignment[\"LeftCenter\"] = 2] = \"LeftCenter\";\n TextAlignment[TextAlignment[\"LeftTop\"] = 3] = \"LeftTop\";\n TextAlignment[TextAlignment[\"CenterBottom\"] = 4] = \"CenterBottom\";\n TextAlignment[TextAlignment[\"CenterCenter\"] = 5] = \"CenterCenter\";\n TextAlignment[TextAlignment[\"CenterTop\"] = 6] = \"CenterTop\";\n TextAlignment[TextAlignment[\"RightBottom\"] = 7] = \"RightBottom\";\n TextAlignment[TextAlignment[\"RightCenter\"] = 8] = \"RightCenter\";\n TextAlignment[TextAlignment[\"RightTop\"] = 9] = \"RightTop\";\n })(TextAlignment = exports.TextAlignment || (exports.TextAlignment = {}));\n var LightingMode;\n (function (LightingMode) {\n LightingMode[LightingMode[\"None\"] = 0] = \"None\";\n LightingMode[LightingMode[\"Phong\"] = 1] = \"Phong\";\n LightingMode[LightingMode[\"BlinnPhong\"] = 2] = \"BlinnPhong\";\n LightingMode[LightingMode[\"Lambert\"] = 3] = \"Lambert\";\n LightingMode[LightingMode[\"HalfLambert\"] = 4] = \"HalfLambert\";\n LightingMode[LightingMode[\"Banded\"] = 5] = \"Banded\";\n LightingMode[LightingMode[\"PBR\"] = 6] = \"PBR\";\n })(LightingMode = exports.LightingMode || (exports.LightingMode = {}));\n var CollisionType;\n (function (CollisionType) {\n CollisionType[CollisionType[\"None\"] = 0] = \"None\";\n CollisionType[CollisionType[\"Intersect\"] = 1] = \"Intersect\";\n CollisionType[CollisionType[\"Touch\"] = 2] = \"Touch\";\n CollisionType[CollisionType[\"Contain\"] = 4] = \"Contain\";\n CollisionType[CollisionType[\"Soft\"] = 8] = \"Soft\";\n })(CollisionType = exports.CollisionType || (exports.CollisionType = {}));\n var GLTypes;\n (function (GLTypes) {\n GLTypes[GLTypes[\"BYTE\"] = 5120] = \"BYTE\";\n GLTypes[GLTypes[\"UNSIGNED_BYTE\"] = 5121] = \"UNSIGNED_BYTE\";\n GLTypes[GLTypes[\"SHORT\"] = 5122] = \"SHORT\";\n GLTypes[GLTypes[\"UNSIGNED_SHORT\"] = 5123] = \"UNSIGNED_SHORT\";\n GLTypes[GLTypes[\"INT\"] = 5124] = \"INT\";\n GLTypes[GLTypes[\"UNSIGNED_INT\"] = 5125] = \"UNSIGNED_INT\";\n GLTypes[GLTypes[\"FLOAT\"] = 5126] = \"FLOAT\";\n GLTypes[GLTypes[\"DOUBLE\"] = 5130] = \"DOUBLE\";\n GLTypes[GLTypes[\"STATIC_DRAW\"] = 35044] = \"STATIC_DRAW\";\n GLTypes[GLTypes[\"DYNAMIC_DRAW\"] = 35048] = \"DYNAMIC_DRAW\";\n })(GLTypes = exports.GLTypes || (exports.GLTypes = {}));\n var Viewer = function () {\n function Viewer(containerId) {\n var _this = this;\n this.maxMemoryFactor = 0.8;\n this._viewKey = -1;\n this._sceneKey = -1;\n this._modelKey = -1;\n this._styleKey = -1;\n this._backgroundKey = -1;\n this._screenKey = -1;\n this._width = 600;\n this._height = 400;\n this._aspectRatio = 1;\n this._cameraOrientationFixed = false;\n this._smoothTransition = true;\n this._smoothTransitionDuration = 500;\n this.sceneCameraChanging = new gs_collections_1.List();\n this.sceneCameraChanged = new gs_collections_1.List();\n this.documentChanged = new gs_collections_1.List();\n this.collisionComputing = new gs_collections_1.List();\n this.collisionComputed = new gs_collections_1.List();\n this.geometryItem = new gs_collections_1.List();\n this.geometryItems = new gs_collections_1.List();\n this.geometryDrawFinish = new gs_collections_1.List();\n this.zoomLimit = 0.000001;\n this.imageUrls = {};\n this._onResize = null;\n this._testGslId = null;\n this._updateType = UpdateType.Synchronization;\n this._running = false;\n this._isBusy = false;\n this._isUpdateTt = false;\n this._isSharedArrayBuffer = false;\n this._isCache = false;\n this._dynamicMemory = segment_1.DynamicMemoryType.None;\n this._currentMemorySize = -1;\n this.xhrList = new gs_collections_1.List();\n this.getAsynGroupGeoDataAction = null;\n this._loadingList = {};\n this._loadingListCount = 0;\n this._bufferVaoNo = 0;\n this._bufferVaoListMapNo = {};\n this._bufferKeyCount = 0;\n this._offset = 0;\n this._geoDataIsCompression = false;\n this._groupSizeLimit = 1024 * 1024;\n this._threadUPVIsRunning = false;\n this._threadUPVIsPreparing = false;\n this._threadUPVCancelled = false;\n this._threadUPVIsAgain = false;\n this._threadUPGDIsRunning = false;\n this._threadUPGDCancelled = false;\n this._threadUPGDIsAgain = false;\n this._threadSTGDIsRunningCount = 0;\n this._streamToSegmentRunningCount = 0;\n this._decodeManagerIsRunning = false;\n this._decodingObjectList = new Array();\n this._renderViewPerGroup = 50;\n this._cacheSegKeys = new Array();\n this._cacheGeometryDataList = new Array();\n this._cacheDataSize = 0;\n this.renderViewAll = false;\n this.comAndUpdGeoIsInterrupted = false;\n this.isGeometryLoading = false;\n this._segmentLoadingCount = 0;\n this.bufferingGeometryCount = 0;\n this.modelDebug = false;\n this.onComputeCollisionFinished = new gs_collections_1.NumberKeyList();\n this.isFixFrameRender = true;\n JS_Init_Apis();\n JS_Init_Database();\n JS_Init_Multithreading_Services(navigator.hardwareConcurrency);\n var vi = this;\n this._onResize = function () {\n vi.updateSize();\n vi.updateDisplay();\n };\n this.createView(containerId);\n Module[\"onTaskProcessingFinished\"] = function (task_id, type, view_key) {\n _this.debugLog(\"type:\" + type);\n var viewer = _this.findViewerByKey(view_key);\n if (viewer) {\n if (type === 1 || type === 2) {\n if (!viewer.isBusy && !viewer.threadIsRunning) {\n JS_Execute_Task_Post_Processing(task_id);\n if (type === 1) {\n viewer.streamToSegmentRunningCount--;\n console.log(\"streamToSegmentRunningCount:\", viewer.streamToSegmentRunningCount);\n }\n if (type === 2) {\n viewer._threadSTGDIsRunningCount--;\n console.log(\"this._threadSTGDIsRunningCount:\", viewer._threadSTGDIsRunningCount);\n }\n } else {\n var timer_1 = setInterval(function () {\n if (viewer.isBusy || viewer.threadIsRunning) {} else {\n JS_Execute_Task_Post_Processing(task_id);\n if (type === 1) {\n viewer.streamToSegmentRunningCount--;\n console.log(\"streamToSegmentRunningCount:\", viewer.streamToSegmentRunningCount);\n }\n if (type === 2) {\n viewer._threadSTGDIsRunningCount--;\n console.log(\"this._threadSTGDIsRunningCount:\", viewer._threadSTGDIsRunningCount);\n }\n clearInterval(timer_1);\n }\n }, 50);\n }\n } else {\n if (!viewer.isBusy) {\n _this.debugLog(\"onTaskProcessingFinished execute \" + \"type:\" + type);\n JS_Execute_Task_Post_Processing(task_id);\n } else {\n var timer_2 = setInterval(function () {\n if (viewer.isBusy) {\n _this.debugLog(\"onTaskProcessingFinished is Busy\");\n } else {\n _this.debugLog(\"onTaskProcessingFinished execute \" + \"type:\" + type + \" id\" + task_id);\n JS_Execute_Task_Post_Processing(task_id);\n clearInterval(timer_2);\n }\n }, 50);\n }\n }\n }\n };\n if (!Module[\"streamToSegmentList\"]) {\n Module[\"streamToSegmentList\"] = new gs_collections_1.NumberKeyList();\n }\n Module[\"afterAsynUpdateView\"] = function (view_key, cancelled) {\n var viewer = _this.findViewerByKey(view_key);\n if (!cancelled) {\n viewer.unBufferAndBufferGeometries(true, viewer._threadPromise, true);\n viewer._threadUPVCancelled = false;\n } else {\n viewer.debugLog(\"AsynUpdateView cancelled\");\n viewer._threadUPVCancelled = true;\n }\n viewer._threadUPVIsRunning = false;\n viewer._threadUPVIsPreparing = false;\n viewer.debugLog(\"JS_Asyn_Update_View_By_Key_Tt_End\");\n if (viewer._threadUPVCancelled) {\n viewer.debugLog(\"JS_Asyn_Update_View_By_Key_Tt_Start_Cancelled\");\n JS_Asyn_Update_View_By_Key_Tt(viewer.viewKey);\n viewer._threadUPVIsRunning = true;\n viewer._threadUPVCancelled = false;\n viewer._threadUPVIsAgain = false;\n } else if (viewer._threadUPVIsAgain) {\n viewer.debugLog(\"JS_Asyn_Update_View_By_Key_Tt_Start_Again\");\n JS_Asyn_Update_View_By_Key_Tt(viewer.viewKey);\n viewer._threadUPVIsRunning = true;\n viewer._threadUPVCancelled = false;\n viewer._threadUPVIsAgain = false;\n }\n };\n Module[\"afterAsynUpdateGeometryData\"] = function (view_key, partial_key, cancelled) {\n var viewer = _this.findViewerByKey(view_key);\n if (!cancelled) {\n viewer._threadUPGDCancelled = false;\n var asynKeys = JS_Show_Asyn_Geometry_Data_Keys(viewer._viewKey);\n viewer.debugLog(\"asynKeysLength:\" + asynKeys.length);\n var memoryIsFree = viewer.ensureMemorySize();\n if (memoryIsFree) {\n viewer.asynLoadGeometries(asynKeys);\n } else {\n console.log(\"memory is full before asynLoadGeometries\");\n }\n viewer.asynRemoveGeometry();\n } else {\n viewer._threadUPGDCancelled = true;\n viewer.debugLog(\"AsynUpdateGeometryData cancelled\");\n }\n viewer._threadUPGDIsRunning = false;\n viewer.debugLog(\"JS_Asyn_Update_Geometry_Data_By_Key_Tt_End\");\n if (viewer._threadUPGDCancelled) {\n viewer.debugLog(\"JS_Asyn_Update_Geometry_Data_By_Key_Tt_Start_Cancelled\");\n JS_Asyn_Update_Geometry_Data_By_Key_Tt(viewer.viewKey, -1);\n viewer._threadUPGDIsRunning = true;\n viewer._threadUPGDCancelled = false;\n viewer._threadUPGDIsAgain = false;\n } else if (viewer._threadUPGDIsAgain) {\n viewer.debugLog(\"JS_Asyn_Update_Geometry_Data_By_Key_Tt_Start_Again\");\n JS_Asyn_Update_Geometry_Data_By_Key_Tt(viewer.viewKey, -1);\n viewer._threadUPGDIsRunning = true;\n viewer._threadUPGDCancelled = false;\n viewer._threadUPGDIsAgain = false;\n }\n };\n Module[\"onImageExternalLoading\"] = function (view_key, image_key, buffer) {\n var viewer = _this.findViewerByKey(view_key);\n var name = JS_Show_One_Image_Option(image_key, \"name\");\n var format = JS_Show_One_Image_Option(image_key, \"format\");\n var id = JS_Show_One_Image_Option(image_key, \"id\");\n if (name) {\n var url = _this.getAsynImageAction.url + id + \"/\" + name + \".\" + format;\n if (viewer.imageUrls[url]) {\n return;\n } else {\n viewer.imageUrls[url] = true;\n }\n var token = (0, cookie_1.getCookie)(\"GsToken\");\n var xhr_1 = new XMLHttpRequest();\n _this.xhrList.add(xhr_1);\n xhr_1.open(\"GET\", url, true);\n xhr_1.setRequestHeader(\"Content-Type\", \"application/json\");\n xhr_1.responseType = \"blob\";\n xhr_1.setRequestHeader(\"Access-Control-Allow-Origin\", \"*\");\n if (token) {\n xhr_1.setRequestHeader(\"Authorization\", token);\n }\n xhr_1.onload = function () {\n _this.xhrList.remove(xhr_1);\n var blob = xhr_1.response;\n createImageBitmap(blob).then(function (image) {\n viewer.makeContextCurrent();\n var gl = viewer.gl;\n var texture = JS_Create_Texture(buffer);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n if (format == \"jpg\" || format == \"jpeg\" || format == \"rgb\") {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image);\n gl.generateMipmap(gl.TEXTURE_2D);\n } else if (format == \"png\" || format == \"rgba\") {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n gl.generateMipmap(gl.TEXTURE_2D);\n } else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, image);\n gl.generateMipmap(gl.TEXTURE_2D);\n }\n gl.bindTexture(gl.TEXTURE_2D, null);\n viewer.updateDisplay();\n });\n };\n xhr_1.send();\n }\n };\n Module[\"onCollisionComputing\"] = function (view_key, total, current) {\n var viewer = vi.findViewerByKey(view_key);\n if (viewer) {\n viewer.collisionComputing.forEach(function (value) {\n value(viewer, total, current);\n });\n }\n };\n Module[\"onCollisionComputed\"] = function (view_key, count) {\n var viewer = vi.findViewerByKey(view_key);\n if (viewer) {\n viewer.collisionComputed.forEach(function (value) {\n value(viewer, count);\n });\n }\n };\n Module[\"onStreamToSegmentFinished\"] = function (key, no) {\n _this.debugLog(\"onStreamToSegmentFinished: \" + key + no);\n var event = Module[\"streamToSegmentList\"].get(no);\n if (event) {\n event(key);\n }\n };\n Module[\"onStreamToGeometryDataFinished\"] = function (count) {\n _this.debugLog(\"onStreamToGeometryDataFinished: \" + count);\n process_1.Process.processList.forEach(function (process) {\n process.viewers.forEach(function (view) {\n var bufferTaskLength = view.aysnTaskManager.getTaskLength(2);\n if (bufferTaskLength === 0) {\n view.computeAndUpdateGeometries(true, null);\n } else {\n view.comAndUpdGeoIsInterrupted = true;\n }\n });\n });\n _this.debugLog(\"JS_Stream_To_Geometry_Data_By_Keys_Tt_End\");\n };\n Module[\"onBufferGeometryFinished\"] = function (no) {\n _this.debugLog(\"onBufferGeometryFinished\");\n JS_Asyn_Render_View_By_Key(_this.viewKey, false);\n };\n Module[\"onComputeCollisionFinished\"] = function (no, items) {\n var event = _this.onComputeCollisionFinished.get(no);\n if (event) {\n event(items);\n }\n };\n }\n Object.defineProperty(Viewer.prototype, \"aspectRatio\", {\n get: function get() {\n return this._aspectRatio;\n },\n set: function set(aspectRatio) {\n this._aspectRatio = aspectRatio;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"geoDataIsCompression\", {\n get: function get() {\n return this._geoDataIsCompression;\n },\n set: function set(value) {\n this._geoDataIsCompression = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"threadIsRunning\", {\n get: function get() {\n return this._threadUPVIsRunning || this._threadUPGDIsRunning;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"renderViewPerGroup\", {\n get: function get() {\n return this._renderViewPerGroup;\n },\n set: function set(value) {\n this._renderViewPerGroup = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"streamToSegmentRunningCount\", {\n get: function get() {\n return this._streamToSegmentRunningCount;\n },\n set: function set(value) {\n this._streamToSegmentRunningCount = value;\n },\n enumerable: false,\n configurable: true\n });\n Viewer.prototype.asynLoadGeometries = function (asynKeys) {\n return tslib_1.__awaiter(this, void 0, void 0, function () {\n var lightModels, idMapKeys, i, modelId, keys;\n return tslib_1.__generator(this, function (_a) {\n if (asynKeys.length > 0) {\n this.isGeometryLoading = true;\n console.log(\"isGeometryLoading:\", this.isGeometryLoading);\n lightModels = this.process.findModelRenderObjects();\n idMapKeys = {};\n this.groupingAsynKeysOfEachLightModel(asynKeys, idMapKeys);\n for (i = 0; i < lightModels.length; i++) {\n modelId = lightModels[i].modelId;\n keys = idMapKeys[modelId];\n if (keys) {\n this.getGeometryDataPerLightModel(lightModels[i], idMapKeys);\n }\n }\n }\n return [2];\n });\n });\n };\n Viewer.prototype.getGeometryDataPerLightModel = function (lightModel, idMapKeys) {\n return tslib_1.__awaiter(this, void 0, void 0, function () {\n var modelId, modelVersion, keys, dictionary_1, cacheDictionary_1, noCacheKeys_1, groupSizeCount_1, groupIds_1, idb, tx, loadingFiltedKeys, _loop_1, this_1, j;\n var _this = this;\n return tslib_1.__generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n modelId = lightModel.modelId;\n modelVersion = lightModel.version;\n keys = idMapKeys[modelId];\n if (!keys) return [3, 3];\n dictionary_1 = {};\n cacheDictionary_1 = {};\n noCacheKeys_1 = new Array();\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n idb = void 0;\n tx = void 0;\n if (!this.isCache) return [3, 2];\n idb = idb_1.default.getInstance(modelId);\n return [4, idb.transaction()];\n case 1:\n tx = _a.sent();\n _a.label = 2;\n case 2:\n loadingFiltedKeys = this.filterLoadingList(keys);\n this._segmentLoadingCount += loadingFiltedKeys.length;\n keys = loadingFiltedKeys;\n _loop_1 = function _loop_1(j) {\n var segKey = keys[j];\n var id = null;\n JS_Open_Segment_By_Key(segKey);\n {\n id = JS_Show_One_Heuristic_Option(\"geometry id\");\n }\n JS_Close_Segment();\n if (id) {\n this_1._loadingList[segKey] = 0;\n this_1._loadingListCount++;\n if (this_1.isCache) {\n tx.store.get(modelId + \"?v=\" + modelVersion + \"_\" + id).then(function (data) {\n if (data) {\n cacheDictionary_1[id] = {\n key: segKey,\n data: data\n };\n JS_Open_Segment_By_Key(segKey);\n {\n JS_Set_One_Heuristic_Option(\"asyn geometry\", \"off\");\n }\n JS_Close_Segment();\n delete _this._loadingList[segKey];\n _this._loadingListCount--;\n if (_this._loadingListCount === 0) {\n console.log(\"获取完全部几何数据\");\n }\n var isLast = false;\n if (j === keys.length - 1) {\n isLast = true;\n }\n _this.asynBatchSetSegmentsDataFromCache(segKey, data, isLast);\n if (j === keys.length - 1 && groupIds_1.length > 0) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n _this.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n }\n } else {\n dictionary_1[id] = segKey;\n noCacheKeys_1.push(segKey);\n var size = null;\n JS_Open_Segment_By_Key(segKey);\n {\n var tempSize = JS_Show_One_Heuristic_Option(\"geometry size\");\n size = Number(tempSize);\n }\n JS_Close_Segment();\n if (size >= _this._groupSizeLimit) {\n if (groupIds_1.length > 0) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n _this.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n }\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n groupIds_1 = id;\n _this.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n } else {\n groupIds_1 = groupIds_1 + id + \",\";\n groupSizeCount_1 += size;\n if (groupSizeCount_1 >= _this._groupSizeLimit) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n _this.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n }\n }\n if (j === keys.length - 1 && groupIds_1.length > 0) {\n if (groupIds_1[groupIds_1.length - 1] === \",\") {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n }\n _this.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n }\n var isLast = false;\n if (j === keys.length - 1) {\n isLast = true;\n }\n _this.asynBatchSetSegmentsDataFromCache(null, null, isLast);\n }\n });\n } else {\n dictionary_1[id] = segKey;\n noCacheKeys_1.push(segKey);\n var size = null;\n JS_Open_Segment_By_Key(segKey);\n {\n var tempSize = JS_Show_One_Heuristic_Option(\"geometry size\");\n size = Number(tempSize);\n }\n JS_Close_Segment();\n if (size >= this_1._groupSizeLimit) {\n if (groupIds_1.length > 0) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n this_1.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n }\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n groupIds_1 = id;\n this_1.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n } else {\n groupIds_1 = groupIds_1 + id + \",\";\n groupSizeCount_1 += size;\n if (groupSizeCount_1 >= this_1._groupSizeLimit) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n this_1.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n }\n }\n if (j === keys.length - 1 && groupIds_1.length > 0) {\n groupIds_1 = groupIds_1.substring(0, groupIds_1.length - 1);\n this_1.asynBatchSetSegmentsData(modelId, [groupIds_1], modelVersion, dictionary_1);\n groupSizeCount_1 = 0;\n groupIds_1 = \"\";\n }\n }\n }\n };\n this_1 = this;\n for (j = 0; j < keys.length; j++) {\n _loop_1(j);\n }\n _a.label = 3;\n case 3:\n return [2];\n }\n });\n });\n };\n Viewer.prototype.filterLoadingList = function (keys) {\n var loadingFiltedKeys = new Array();\n for (var j = 0; j < keys.length; j++) {\n var segKey = keys[j];\n var id = null;\n JS_Open_Segment_By_Key(segKey);\n {\n id = JS_Show_One_Heuristic_Option(\"geometry id\");\n }\n JS_Close_Segment();\n if (id) {\n var res = this._loadingList[segKey];\n if (res !== null && res !== undefined) {\n continue;\n }\n loadingFiltedKeys.push(segKey);\n }\n }\n return loadingFiltedKeys;\n };\n Viewer.prototype.asynBatchSetSegmentsDataFromCache = function (segKey, bytes, isLast) {\n var _this = this;\n if (segKey) {\n this._cacheSegKeys.push(segKey);\n }\n if (bytes) {\n this._cacheGeometryDataList.push(bytes);\n this._cacheDataSize += bytes.length;\n }\n if (this._cacheSegKeys.length > this._renderViewPerGroup || this._cacheDataSize > this._groupSizeLimit * 20 || isLast) {\n var keys_1 = tslib_1.__spreadArray([], tslib_1.__read(this._cacheSegKeys), false);\n if (!keys_1 || keys_1.length === 0) {\n return;\n }\n var allByteLength_1 = 0;\n for (var i = 0; i < this._cacheGeometryDataList.length; i++) {\n allByteLength_1 += this._cacheGeometryDataList[i].length;\n }\n var geometryGrupData_1 = new Uint8Array(allByteLength_1);\n var currentOffset = 0;\n for (var i = 0; i < this._cacheGeometryDataList.length; i++) {\n geometryGrupData_1.set(this._cacheGeometryDataList[i], currentOffset);\n currentOffset += this._cacheGeometryDataList[i].length;\n this._cacheGeometryDataList[i] = null;\n }\n var timer_3 = setInterval(function () {\n if (_this.checkStreamToGeometryDisable()) {} else {\n _this._currentMemorySize += allByteLength_1 * 3;\n var isFree = _this.ensureCurrentMemorySize();\n if (isFree) {\n if (_this.isUpdateTt) {\n var timer_4 = setInterval(function () {\n if (!_this._threadUPVIsRunning) {\n _this.debugLog(\"JS_Stream_To_Geometry_Data_By_Keys_Tt_Start\");\n _this._threadSTGDIsRunningCount++;\n JS_Stream_To_Geometry_Data_By_Keys_Tt(keys_1, geometryGrupData_1, _this.viewKey);\n _this._segmentLoadingCount -= keys_1.length;\n clearInterval(timer_4);\n }\n }, 20);\n } else {\n console.log(\"JS_Stream_To_Geometry_Data_By_Keys\", keys_1.length);\n JS_Stream_To_Geometry_Data_By_Keys(keys_1, geometryGrupData_1);\n _this._segmentLoadingCount -= keys_1.length;\n _this.computeAndUpdateGeometries(true, null);\n }\n } else {\n console.log(\"memory is full from cache\");\n }\n clearInterval(timer_3);\n }\n }, 20);\n this._cacheSegKeys = new Array();\n this._cacheGeometryDataList = new Array();\n this._cacheDataSize = 0;\n }\n };\n Viewer.prototype.findViewerByKey = function (view_key) {\n var viewer = null;\n process_1.Process.processList.forEach(function (process) {\n process.viewers.forEach(function (vi) {\n if (vi.viewKey == view_key) {\n viewer = vi;\n return false;\n }\n });\n if (viewer) {\n return false;\n }\n });\n if (!viewer) {\n console.log(\"找不到viewer\");\n return null;\n }\n return viewer;\n };\n Viewer.prototype.createView = function (containerId) {\n this.container = document.getElementById(containerId);\n this.container.style.overflow = \"hidden\";\n this.canvas = document.createElement(\"canvas\");\n this.canvas.setAttribute(\"id\", \"canvas_\" + containerId);\n this.canvas.style.position = \"absolute\";\n this.canvas.style.left = \"0px\";\n this.canvas.style.right = \"0px\";\n this.canvas.style.zIndex = \"0\";\n this.canvas.style.touchAction = \"none\";\n this.canvas.width = this.container.offsetWidth;\n this.canvas.height = this.container.offsetHeight;\n this.canvas.oncontextmenu = function () {\n return false;\n };\n this.container.appendChild(this.canvas);\n this.container[\"viewer\"] = this;\n this._width = this.container.offsetWidth;\n this._height = this.container.offsetHeight;\n this._aspectRatio = this._width / this._height;\n JS_Open_Segment(\"/driver/emscripten\");\n {\n JS_Set_Driver_Configs(\"driver=emscripten\");\n this._viewKey = JS_Open_Segment(containerId);\n {\n JS_Set_Driver_Options(\"viewer id='#canvas_\" + containerId + \"',selection tolerance=0.005\");\n JS_Set_Shader(\"name=blinn phong\");\n JS_Set_Viewport(0, 0, 1, 1, \"window\");\n JS_Set_Color(\"lights=(r=1,g=1,b=1),ambients=(r=0.5,g=0.5,b=0.5)\");\n JS_Set_Color(\"background=(r=1.0,g=1.0,b=1.0),markers=(r=0.0,g=1.0,b=0.0),lines=(r=0.0,g=1.0,b=0.0),vertices=(r=0.0,g=1.0,b=0.0),edges=(r=0.0,g=1.0,b=0.0),faces=(color=(r=0.0,g=1.0,b=0.27),emissive=(r=0.0,g=0.0,b=0.0),transparency=1.0,metallic=0.1,roughness=0.2,specular=0.5,diffuse=-),cutting faces=(color=(r=1.0,g=0.8,b=0.0),diffuse=-)\");\n JS_Set_Visibility(\"lights=on,cutting planes=off\");\n JS_Set_Rendering_Options(\"marker size=6,vertex size=6,line width=3,edge width=3,mesh line=off,mesh edge=off,cull back face=on,logarithmic depth buffer=off,depth range=(0,1),face offset=(0,0)\");\n JS_Insert_Image(0, 0, 0, 1, 1, new Int8Array([255, 255, 255, 255]), \"name=-,local\");\n this._sceneKey = JS_Open_Segment(\"scene\");\n {\n JS_Set_Camera([0, 0, 5], [0, 0, 0], [0, 1, 0], 2.0, 2.0, \"orthographic\");\n JS_Insert_Light(0, 0.4, 1.5, true);\n JS_Set_ModellingMatrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n }\n JS_Close_Segment();\n this._screenKey = JS_Open_Segment(\"screen\");\n {\n JS_Set_Camera([0, 0, 5], [0, 0, 0], [0, 1, 0], 2.0, 2.0, \"orthographic\");\n JS_Set_ModellingMatrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n JS_Set_Rendering_Options(\"sync update=on,depth range=(0.0, 0.1),screen drawing=on,view frustum culling=off,culling maximum extent=0\");\n JS_Set_Heuristic_Options(\"exclude bounding=on\");\n JS_Set_Visibility(\"lights=off\");\n }\n JS_Close_Segment();\n }\n JS_Close_Segment();\n }\n JS_Close_Segment();\n JS_Open_Segment(\"/include library\");\n {\n this._modelKey = JS_Open_Segment(\"model_\" + containerId);\n JS_Close_Segment();\n }\n JS_Close_Segment();\n JS_Open_Segment(\"/style library\");\n {\n this._styleKey = JS_Open_Segment(\"style_\" + containerId);\n JS_Close_Segment();\n }\n JS_Close_Segment();\n JS_Update_Display();\n this.gl = this.canvas.getContext(\"webgl2\");\n window.addEventListener(\"resize\", this._onResize);\n };\n Viewer.prototype.dispose = function () {\n window.removeEventListener(\"resize\", this._onResize);\n this.xhrList.forEach(function (xhr) {\n xhr.abort();\n });\n this.imageUrls = {};\n if (this._viewKey != -1) {\n JS_Delete_By_Key(this._viewKey);\n this._viewKey = -1;\n }\n if (this._modelKey != -1) {\n JS_Delete_By_Key(this._modelKey);\n this._modelKey = -1;\n }\n if (this._styleKey != -1) {\n JS_Delete_By_Key(this._styleKey);\n this._styleKey = -1;\n }\n this.sceneCameraChanged.clear();\n this.container.removeChild(this.canvas);\n this.canvas = null;\n this.container = null;\n };\n Viewer.prototype.rebind = function (containerId) {\n this.createView(containerId);\n };\n Viewer.prototype.ensureMemorySize = function () {\n var allocated_size = JS_Show_Allocated_Memory_Size();\n this._currentMemorySize = allocated_size;\n if (allocated_size > 2147483648 * this.maxMemoryFactor) {\n return false;\n } else {\n return true;\n }\n };\n Viewer.prototype.ensureCurrentMemorySize = function () {\n if (this._currentMemorySize > 2147483648 * this.maxMemoryFactor) {\n return false;\n } else {\n return true;\n }\n };\n Object.defineProperty(Viewer.prototype, \"viewKey\", {\n get: function get() {\n return this._viewKey;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"sceneKey\", {\n get: function get() {\n return this._sceneKey;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"modelKey\", {\n get: function get() {\n return this._modelKey;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"styleKey\", {\n get: function get() {\n return this._styleKey;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"isBusy\", {\n get: function get() {\n return this._isBusy;\n },\n set: function set(value) {\n this._isBusy = value;\n if (this._isBusy) {}\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"isUpdateTt\", {\n get: function get() {\n return this._isUpdateTt;\n },\n set: function set(value) {\n this._isUpdateTt = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"isSharedArrayBuffer\", {\n get: function get() {\n return this._isSharedArrayBuffer;\n },\n set: function set(value) {\n this._isSharedArrayBuffer = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"isCache\", {\n get: function get() {\n return this._isCache;\n },\n set: function set(value) {\n this._isCache = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"testGslId\", {\n get: function get() {\n return this._testGslId;\n },\n set: function set(value) {\n this._testGslId = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"updateType\", {\n get: function get() {\n return this._updateType;\n },\n set: function set(value) {\n if (value == UpdateType.Asynchronization && this._updateType == UpdateType.Synchronization) {\n this._updateType = value;\n this._running = true;\n } else if (value == UpdateType.Synchronization && this._updateType == UpdateType.Asynchronization) {\n this._updateType = value;\n this._running = false;\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"dynamicMemory\", {\n get: function get() {\n var result = segment_1.DynamicMemoryType.None;\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var dm = JS_Show_One_Rendering_Option(\"dynamic memory\");\n if (dm == \"client\") {\n result = segment_1.DynamicMemoryType.Client;\n } else if (dm == \"server\") {\n result = segment_1.DynamicMemoryType.Server;\n } else {\n result = segment_1.DynamicMemoryType.None;\n }\n }\n JS_Close_Segment();\n return result;\n },\n set: function set(type) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n JS_Set_Rendering_Options(\"dynamic memory=\" + segment_1.DynamicMemoryType[type].toLowerCase());\n }\n JS_Close_Segment();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"dynamicMemoryThreshold\", {\n get: function get() {\n var result = 0.0;\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var dm = JS_Show_One_Rendering_Option(\"dynamic memory threshold\");\n if (dm) {\n result = parseFloat(dm);\n }\n }\n JS_Close_Segment();\n return result;\n },\n set: function set(value) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n JS_Set_Rendering_Options(\"dynamic memory threshold=\" + value);\n }\n JS_Close_Segment();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"lightingMode\", {\n get: function get() {\n var result = LightingMode.None;\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var name = JS_Show_One_Shader(\"name\");\n if (name == \"phong\") {\n result = LightingMode.Phong;\n } else if (name == \"blinn phong\") {\n result = LightingMode.BlinnPhong;\n } else if (name == \"lambert\") {\n result = LightingMode.Lambert;\n } else if (name == \"half lambert\") {\n result = LightingMode.HalfLambert;\n } else if (name == \"banded\") {\n result = LightingMode.Banded;\n } else if (name == \"pbr\") {\n result = LightingMode.PBR;\n }\n }\n JS_Close_Segment();\n return result;\n },\n set: function set(mode) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n if (mode == LightingMode.Phong) {\n JS_Set_Shader(\"name = phong\");\n } else if (mode == LightingMode.BlinnPhong) {\n JS_Set_Shader(\"name = blinn phong\");\n } else if (mode == LightingMode.Lambert) {\n JS_Set_Shader(\"name = lambert\");\n } else if (mode == LightingMode.HalfLambert) {\n JS_Set_Shader(\"name = half lambert\");\n } else if (mode == LightingMode.Banded) {\n JS_Set_Shader(\"name = banded\");\n } else if (mode == LightingMode.PBR) {\n JS_Set_Shader(\"name = pbr\");\n }\n }\n JS_Close_Segment();\n },\n enumerable: false,\n configurable: true\n });\n Viewer.prototype.asynUPGDTaskRun = function () {\n this.debugLog(\"JS_Asyn_Update_Geometry_Data_By_Key_Tt_Start\");\n JS_Asyn_Update_Geometry_Data_By_Key_Tt(this.viewKey, -1);\n this._threadUPGDIsRunning = true;\n };\n Viewer.prototype.makeContextCurrent = function () {\n JS_Make_Context_Current(this._viewKey);\n };\n Viewer.prototype.debugLog = function (mes) {\n if (this.modelDebug) {\n console.log(mes);\n }\n };\n Viewer.prototype.updateDisplaySynced = function () {\n JS_Update_View_Display_By_Key(this._viewKey);\n };\n Viewer.prototype.updateDisplay = function () {\n var _this = this;\n if (this._updateType == UpdateType.Synchronization) {\n JS_Update_View_Display_By_Key(this._viewKey);\n return new ThreadPromise(function (resolve) {\n resolve(new UpdateInfo(_this, UpdateDisplayType.Synchronization));\n });\n } else {\n if (!this.isBusy) {\n this.debugLog(\"not busy\");\n JS_Asyn_Update_Camera_By_Key(this.viewKey);\n if (this.renderViewAll) {\n JS_Asyn_Render_View_By_Key(this._viewKey, false);\n this.renderViewAll = false;\n }\n var lightModels = null;\n if (this.process) {\n lightModels = this.process.findModelRenderObjects();\n }\n if (lightModels) {\n if (lightModels.length === 0) {\n this.debugLog(\"ligthModels length = 0\");\n }\n if (this._isUpdateTt) {\n if (!this._threadUPGDIsRunning && this.streamToSegmentRunningCount === 0) {\n this.asynUPGDTaskRun();\n }\n } else {\n JS_Asyn_Update_Geometry_Data_By_Key(this.viewKey, -1);\n var asynKeys = JS_Show_Asyn_Geometry_Data_Keys(this._viewKey);\n this.asynLoadGeometries(asynKeys);\n if (asynKeys.length <= 0) {\n this.debugLog(\"asynKeys.length = 0\");\n }\n this.asynRemoveGeometry();\n }\n } else {\n this.debugLog(\"lightModels is null\");\n }\n var promise = new ThreadPromise();\n this.computeAndUpdateGeometries(false, promise);\n return promise;\n } else {\n this.debugLog(\"busy\");\n JS_Asyn_Render_View_By_Key(this._viewKey, this.isFixFrameRender);\n return new ThreadPromise(function (resolve) {\n resolve(new UpdateInfo(_this, UpdateDisplayType.Busy));\n });\n }\n }\n };\n Viewer.prototype.asynRemoveGeometry = function () {\n var _this = this;\n this.aysnTaskManager.clearTask(3);\n var removeKeys = JS_Show_Asyn_Remove_Geometry_Data_Keys(this._viewKey);\n var count = removeKeys.length;\n var perGroupLength = 1000;\n var groupCount = 0;\n var group = new Array();\n for (var j = 0; j < count; j++) {\n groupCount++;\n group.push(removeKeys[j]);\n if (groupCount === perGroupLength || j === count - 1) {\n var copyGroup = JSON.parse(JSON.stringify(group));\n groupCount = 0;\n group = new Array();\n this.aysnTaskManager.asynTask(function (keyList) {\n return tslib_1.__awaiter(_this, void 0, void 0, function () {\n var i;\n return tslib_1.__generator(this, function (_a) {\n if (this.isBusy || this.threadIsRunning) {\n return [2, false];\n } else {\n for (i = 0; i < keyList.length; i++) {\n JS_Open_Segment_By_Key(keyList[i]);\n {\n JS_Clear_Geometry();\n JS_Set_One_Heuristic_Option(\"asyn geometry\", \"on\");\n }\n JS_Close_Segment();\n }\n return [2, true];\n }\n return [2];\n });\n });\n }, [copyGroup], 3);\n }\n }\n };\n Viewer.prototype.groupingAsynKeysOfEachLightModel = function (asynKeys, idMapKeys) {\n for (var i = 0; i < asynKeys.length; i++) {\n var key = asynKeys[i];\n var modelId = JS_Show_Key_Tag(key);\n var array = idMapKeys[modelId];\n if (!array) {\n array = new Array();\n }\n array.push(key);\n idMapKeys[modelId] = array;\n }\n };\n Viewer.prototype.asynUpdateView = function () {\n JS_Asyn_Update_View_By_Key(this._viewKey);\n };\n Viewer.prototype.asynBatchSetSegmentsData = function (modelId, groupIdsList, version, dictionary) {\n var _this = this;\n var token = (0, cookie_1.getCookie)(\"GsToken\");\n if (!token) {}\n var _loop_2 = function _loop_2(i) {\n if (this_2.getAsynGroupGeoDataAction) {\n var action = this_2.getAsynGroupGeoDataAction(modelId, version);\n var xhr_2 = new XMLHttpRequest();\n this_2.xhrList.add(xhr_2);\n xhr_2.open(action.httpType, action.url, true);\n xhr_2.setRequestHeader(\"Content-Type\", \"application/json\");\n xhr_2.responseType = \"blob\";\n xhr_2.setRequestHeader(\"Access-Control-Allow-Origin\", \"*\");\n if (token) {\n xhr_2.setRequestHeader(\"Authorization\", token);\n }\n xhr_2.onload = function () {\n _this.xhrList.remove(xhr_2);\n if (xhr_2.status.toString().slice(0, 1) === \"2\") {\n var reader = new FileReader();\n reader.readAsArrayBuffer(xhr_2.response);\n reader.onload = function (e) {\n if (e.target[\"readyState\"] == FileReader.DONE) {\n var blobData = e.target[\"result\"];\n var decodingObject = {\n modelId: modelId,\n version: version,\n data: blobData,\n groupIds: groupIdsList[i],\n dictionary: dictionary\n };\n _this._decodingObjectList.push(decodingObject);\n _this.debugLog(\"decodeMng:\" + _this._decodeManagerIsRunning);\n if (!_this._decodeManagerIsRunning) {\n _this.decodeMngRun();\n }\n }\n };\n } else {\n console.log(\"请求分组几何失败:\", xhr_2.response);\n }\n };\n xhr_2.onerror = function (err) {\n console.log(\"error\", err);\n };\n var strArray = groupIdsList[i].split(\",\");\n xhr_2.send(JSON.stringify({\n ids: strArray\n }));\n } else {\n console.error(\"Viewer.getAsynGroupGeoDataAction 未定义\");\n }\n };\n var this_2 = this;\n for (var i = 0; i < groupIdsList.length; i++) {\n _loop_2(i);\n }\n };\n Viewer.prototype.computeAndUpdateGeometries = function (isStreamToGeometry, promise) {\n this.comAndUpdGeoIsInterrupted = false;\n this.debugLog(\"computeAndUpdateGeometries start\");\n if (!this.isBusy) {\n this.debugLog(\"computeAndUpdateGeometries not busy\");\n if (this._isUpdateTt) {\n this.debugLog(\"computeAndUpdateGeometries updateTt\");\n var viewer_1 = this;\n if (!this._threadUPVIsRunning && !this._threadUPVIsPreparing) {\n var timer_5 = setInterval(function () {\n if (viewer_1.streamToSegmentRunningCount === 0 && viewer_1._threadSTGDIsRunningCount === 0) {\n if (!viewer_1._threadUPVIsRunning) {\n viewer_1._threadPromise = promise;\n viewer_1.debugLog(\"JS_Asyn_Update_View_By_Key_Tt_Start\");\n JS_Asyn_Update_View_By_Key_Tt(viewer_1.viewKey);\n viewer_1._threadUPVIsRunning = true;\n } else {\n viewer_1._threadUPVIsAgain = true;\n }\n clearInterval(timer_5);\n }\n }, 50);\n viewer_1._threadUPVIsPreparing = true;\n }\n } else {\n this.debugLog(\"computeAndUpdateGeometries not updateTt\");\n JS_Asyn_Update_View_By_Key(this.viewKey);\n this.unBufferAndBufferGeometries(isStreamToGeometry, promise, false);\n }\n }\n };\n Viewer.prototype.unBufferAndBufferGeometries = function (isStreamToGeometry, promise, isThread) {\n var unbufferGeomKeys = JS_Show_Asyn_Unbuffer_Geometry_Keys(this.viewKey);\n var filteredGeomKeysUnbuffer = this.filterRepeatKeysUnbuffer(unbufferGeomKeys);\n JS_Asyn_Unbuffer_Geometry_By_Key(this.viewKey, filteredGeomKeysUnbuffer);\n for (var i = 0; i < filteredGeomKeysUnbuffer.length; i++) {\n var key = filteredGeomKeysUnbuffer[i];\n }\n var geomKeys = JS_Show_Asyn_Buffer_Geometry_Keys(this._viewKey);\n var filteredGeomKeys = this.filterRepeatKeysBuffer(geomKeys);\n this.debugLog(\"filteredGeomKeys:\" + filteredGeomKeys.length);\n this.createAndDrawVao(filteredGeomKeys, isStreamToGeometry, promise, isThread);\n };\n Viewer.prototype.createAndDrawVao = function (geomKeys, isStreamToGeometry, promise, isThread) {\n var _this = this;\n if (isStreamToGeometry) {\n this.aysnTaskManager.clearTask(2);\n this.bufferingGeometryCount = 0;\n }\n this.bufferingGeometryCount += geomKeys.length;\n console.log(\"bufferingGeometryCount:\", this.bufferingGeometryCount);\n var count = geomKeys.length;\n var groupCount = 0;\n var group = new Array();\n var _loop_3 = function _loop_3(j) {\n groupCount++;\n group.push(geomKeys[j]);\n if (groupCount === this_3._renderViewPerGroup || j === count - 1) {\n var copyGroup = JSON.parse(JSON.stringify(group));\n groupCount = 0;\n group = new Array();\n this_3._bufferKeyCount += copyGroup.length;\n if (false) {} else {\n var updateInfo_1 = new UpdateInfo(this_3, isThread ? UpdateDisplayType.AsynThreadBufferGeometry : UpdateDisplayType.AsynBufferGeometry);\n this_3.aysnTaskManager.asynTask(function (viewkey, keyList) {\n return tslib_1.__awaiter(_this, void 0, void 0, function () {\n var bufferTaskCount;\n return tslib_1.__generator(this, function (_a) {\n if (this.isBusy || this._threadUPVIsRunning) {\n return [2, false];\n } else {\n JS_Asyn_Buffer_Geometry_By_Key(viewkey, keyList);\n JS_Asyn_Render_View_By_Key(viewkey, false);\n this.bufferingGeometryCount -= keyList.length;\n promise === null || promise === void 0 ? void 0 : promise.resolve(updateInfo_1);\n updateInfo_1._count++;\n bufferTaskCount = this.aysnTaskManager.getTaskLength(2);\n if (bufferTaskCount === 1) {\n if (this.comAndUpdGeoIsInterrupted) {\n this.comAndUpdGeoIsInterrupted = false;\n this.computeAndUpdateGeometries(false, promise);\n } else {\n console.log(\"bufferingGeometryCount1:\", this.bufferingGeometryCount);\n if (this.bufferingGeometryCount === 0 && this._segmentLoadingCount === 0) {\n console.log(\"draw finish\");\n this.geometryDrawFinish.forEach(function (value) {\n value();\n });\n console.log(\"isGeometryLoading1:\", this.isGeometryLoading);\n this.isGeometryLoading = false;\n console.log(\"isGeometryLoading2:\", this.isGeometryLoading);\n }\n }\n }\n return [2, true];\n }\n return [2];\n });\n });\n }, [this_3.viewKey, copyGroup], 2);\n }\n }\n };\n var this_3 = this;\n for (var j = 0; j < count; j++) {\n _loop_3(j);\n }\n if (count === 0) {\n JS_Asyn_Render_View_By_Key(this._viewKey, false);\n promise === null || promise === void 0 ? void 0 : promise.resolve(new UpdateInfo(this, isThread ? UpdateDisplayType.AsynThreadNoneBufferGeometry : UpdateDisplayType.AsynNoneBufferGeometry));\n }\n };\n Viewer.prototype.decodeMngRun = function () {\n if (this._decodingObjectList.length > 0) {\n this.debugLog(\"decoding\");\n this._decodeManagerIsRunning = true;\n var obj = this._decodingObjectList.pop();\n this.AsynDecodeData(obj);\n for (var i = 0; i < this.process.lzmaManager.workers.length; i++) {\n var worker = this.process.lzmaManager.workers[i];\n if (worker.idle) {\n this.decodeMngRun();\n break;\n }\n }\n } else {\n this.debugLog(\"decode all finish\");\n this._decodeManagerIsRunning = false;\n }\n };\n Viewer.prototype.AsynDecodeData = function (obj) {\n var _this = this;\n var modelId = obj.modelId;\n var version = obj.version;\n var blobData = obj.data;\n var group = obj.groupIds;\n var dictionary = obj.dictionary;\n var dataView = new DataView(blobData);\n this._offset = 0;\n var deCodeCount = 0;\n var count = this.dataViewReadInt32(dataView);\n var idArray = group.split(\",\");\n if (count !== idArray.length) {\n console.log(\"返回的二进制数据的几何个数与几何组长度不一致\");\n this.debugLog(\"next decode\");\n this.decodeMngRun();\n return;\n }\n var idb;\n if (this.isCache) {\n idb = idb_1.default.getInstance(modelId);\n }\n var segKeys = new Array();\n var bytesArray = new Array();\n var _loop_4 = function _loop_4(i) {\n var streamLength = this_4.dataViewReadInt32(dataView);\n var compressFlag = 0;\n if (this_4._geoDataIsCompression) {\n compressFlag = this_4.dataViewReadInt32(dataView);\n }\n var id = idArray[i];\n var segKey = dictionary[id];\n var geoStreamData = blobData.slice(this_4._offset, this_4._offset + streamLength);\n this_4._offset += streamLength;\n JS_Open_Segment_By_Key(segKey);\n {\n JS_Set_One_Heuristic_Option(\"asyn geometry\", \"off\");\n if (compressFlag === 1) {\n this_4.process.lzmaManager.decode(geoStreamData).then(function (outstream) {\n deCodeCount++;\n var data = outstream;\n var bytes = data.toUint8Array();\n bytesArray.push(bytes);\n segKeys.push(segKey);\n if (_this.isCache) {\n idb.set(modelId + \"?v=\" + version + \"_\" + id, bytes);\n }\n if (deCodeCount === count) {\n _this.oneGroupDecodeFinish(segKeys, bytesArray);\n }\n }).catch(function (err) {\n console.log(\"decode error:\", err);\n deCodeCount++;\n if (deCodeCount === count) {\n _this.oneGroupDecodeFinish(segKeys, bytesArray);\n }\n });\n } else if (compressFlag === 0) {\n deCodeCount++;\n var bytes = new Uint8Array(geoStreamData);\n bytesArray.push(bytes);\n segKeys.push(segKey);\n if (this_4.isCache) {\n idb.set(modelId + \"?v=\" + version + \"_\" + id, bytes);\n }\n if (deCodeCount === count) {\n this_4.oneGroupDecodeFinish(segKeys, bytesArray);\n }\n }\n }\n JS_Close_Segment();\n delete this_4._loadingList[segKey];\n this_4._loadingListCount--;\n if (this_4._loadingListCount === 0) {\n console.log(\"获取完全部几何数据\");\n }\n };\n var this_4 = this;\n for (var i = 0; i < count; i++) {\n _loop_4(i);\n }\n };\n Viewer.prototype.checkStreamToGeometryDisable = function () {\n if (!this.isUpdateTt) {\n return this.isBusy;\n } else {\n return this.isBusy || this.threadIsRunning;\n }\n };\n Viewer.prototype.oneGroupDecodeFinish = function (segKeys, bytesArray) {\n var _this = this;\n this.debugLog(\"next decode\");\n this.decodeMngRun();\n var self = this;\n var timer = setInterval(function () {\n if (_this.checkStreamToGeometryDisable()) {} else {\n var allByteLength = 0;\n for (var i = 0; i < bytesArray.length; i++) {\n allByteLength += bytesArray[i].length;\n }\n var geometryGrupData_2 = new Uint8Array(allByteLength);\n _this._currentMemorySize += allByteLength * 3;\n var isFree = _this.ensureCurrentMemorySize();\n if (isFree) {\n var currentOffset = 0;\n for (var i = 0; i < bytesArray.length; i++) {\n geometryGrupData_2.set(bytesArray[i], currentOffset);\n currentOffset += bytesArray[i].length;\n }\n if (_this.isUpdateTt) {\n var timer_6 = setInterval(function () {\n if (!_this._threadUPVIsRunning) {\n _this.debugLog(\"JS_Stream_To_Geometry_Data_By_Keys_Tt_Start\");\n _this._threadSTGDIsRunningCount++;\n JS_Stream_To_Geometry_Data_By_Keys_Tt(segKeys, geometryGrupData_2, _this.viewKey);\n _this._segmentLoadingCount -= segKeys.length;\n clearInterval(timer_6);\n }\n }, 20);\n } else {\n JS_Stream_To_Geometry_Data_By_Keys(segKeys, geometryGrupData_2);\n _this._segmentLoadingCount -= segKeys.length;\n _this.computeAndUpdateGeometries(true, null);\n }\n } else {\n console.log(\"_currentMemorySize is full\");\n }\n clearInterval(timer);\n }\n }, 20);\n };\n Viewer.prototype.filterRepeatKeysBuffer = function (geomKeys) {\n var geomKeysCount = geomKeys.length;\n var filteredGeomKeys = new Array();\n for (var i = 0; i < geomKeysCount; i++) {\n var geomKey = geomKeys[i];\n filteredGeomKeys.push(geomKey);\n }\n return filteredGeomKeys;\n };\n Viewer.prototype.filterRepeatKeysUnbuffer = function (geomKeys) {\n var geomKeysCount = geomKeys.length;\n var filteredGeomKeys = new Array();\n for (var i = 0; i < geomKeysCount; i++) {\n var geomKey = geomKeys[i];\n filteredGeomKeys.push(geomKey);\n }\n return filteredGeomKeys;\n };\n Viewer.prototype.getGslId = function (key) {\n var modelId = null;\n modelId = JS_Show_Property_String(key, \"modelId\");\n if (modelId) {\n return modelId;\n } else {\n var owner_key = JS_Show_Owner_By_Key(key);\n if (owner_key !== -1) {\n return this.getGslId(owner_key);\n } else {\n return null;\n }\n }\n };\n Viewer.prototype.dataViewReadInt32 = function (dataView) {\n var resultInt = dataView.getInt32(this._offset);\n this._offset += 4;\n return resultInt;\n };\n Viewer.prototype.updateDisplayWithFramerate = function (framerate, cullingThreshold) {\n JS_Update_View_Display_With_Framerate_By_Key(this._viewKey, framerate, cullingThreshold);\n };\n Viewer.prototype.updateDisplayWithTime = function (time) {\n JS_Update_View_Display_With_Time_By_Key(this._viewKey, time);\n };\n Object.defineProperty(Viewer.prototype, \"width\", {\n get: function get() {\n return this._width;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"height\", {\n get: function get() {\n return this._height;\n },\n enumerable: false,\n configurable: true\n });\n Viewer.prototype.updateSize = function () {\n var _this = this;\n JS_Make_Context_Current(this._viewKey);\n this.canvas.width = this.container.offsetWidth;\n this.canvas.height = this.container.offsetHeight;\n this._width = this.container.offsetWidth;\n this._height = this.container.offsetHeight;\n this._aspectRatio = this._width / this._height;\n JS_Resize_By_Key(this._viewKey);\n this.updateBackgroundColor();\n JS_Update_View_Display_By_Key(this.viewKey);\n setTimeout(function () {\n _this.updateDocument();\n }, 0);\n };\n Viewer.prototype.updateBackgroundColor = function () {\n if (this._backgroundKey != -1) {\n JS_Open_Segment_By_Key(this._backgroundKey);\n {\n var geoms = JS_Show_Geometry_List();\n if (geoms.length > 0 && JS_Show_Key_Type(geoms[0]) == ObjectType.TYPE_Shell) {\n var aspect_ratio = this._aspectRatio;\n var far = -aspect_ratio * 2 + 1.000001;\n var w = 1.0;\n var h = 1.0;\n if (aspect_ratio > 1) {\n w *= aspect_ratio;\n } else {\n h /= aspect_ratio;\n far = -2 + 1.000001;\n }\n JS_Edit_Shell(geoms[0], [-w, -h, far, w, -h, far, w, h, far, -w, h, far], [4, 0, 1, 2, 3]);\n }\n }\n JS_Close_Segment();\n }\n };\n Object.defineProperty(Viewer.prototype, \"cameraOrientationFixed\", {\n get: function get() {\n return this._cameraOrientationFixed;\n },\n set: function set(val) {\n this._cameraOrientationFixed = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"smoothTransition\", {\n get: function get() {\n return this._smoothTransition;\n },\n set: function set(val) {\n this._smoothTransition = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"smoothTransitionDuration\", {\n get: function get() {\n return this._smoothTransitionDuration;\n },\n set: function set(duration) {\n this._smoothTransitionDuration = duration;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"backgroundColor\", {\n get: function get() {\n var colors;\n JS_Open_Segment_By_Key(this._viewKey);\n {\n colors = JS_Show_Color_By_Value(\"background\");\n }\n JS_Close_Segment();\n return colors;\n },\n set: function set(val) {\n if (val) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n if (val.length == 3) {\n if (this._backgroundKey != -1) {\n JS_Delete_By_Key(this._backgroundKey);\n this._backgroundKey = -1;\n }\n JS_Set_Color(\"background=(r=\" + (val[0] / 255.0).toFixed(2) + \",g=\" + (val[1] / 255.0).toFixed(2) + \",b=\" + (val[2] / 255.0).toFixed(2) + \")\");\n } else if (val.length == 4) {\n if (this._backgroundKey != -1) {\n JS_Delete_By_Key(this._backgroundKey);\n this._backgroundKey = -1;\n }\n JS_Set_Color(\"background=(r=\" + (val[0] / 255.0).toFixed(2) + \",g=\" + (val[1] / 255.0).toFixed(2) + \",b=\" + (val[2] / 255.0).toFixed(2) + \",a=\" + val[3].toFixed(2) + \")\");\n } else if (val.length == 6 || val.length == 12) {\n JS_Set_Color(\"background=(r=1.0,g=1.0,b=1.0,a=1.0)\");\n JS_Open_Segment_By_Key(this._viewKey);\n {\n if (this._backgroundKey != -1) {\n JS_Clear_All_By_Key(this._backgroundKey);\n }\n this._backgroundKey = JS_Open_Segment(\"background\");\n {\n JS_Set_Camera([0, 0, 1], [0, 0, 0], [0, 1, 0], 2.0, 2.0, \"orthographic\");\n JS_Set_Camera_Extent(-1, 1);\n JS_Set_ModellingMatrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n JS_Set_Visibility(\"lights=off\");\n JS_Set_Rendering_Options(\"sync update=on\");\n JS_Set_Heuristic_Options(\"exclude bounding=on,exclude segment bounding=on\");\n var aspect_ratio = this._aspectRatio;\n var far = -aspect_ratio * 2 + 1.000001;\n var w = 1.0;\n var h = 1.0;\n if (aspect_ratio > 1) {\n w *= aspect_ratio;\n } else {\n h /= aspect_ratio;\n far = -2 + 1.000001;\n }\n var shellKey = JS_Insert_Shell([-w, -h, far, w, -h, far, w, h, far, -w, h, far], [4, 0, 1, 2, 3]);\n if (val.length == 6) {\n var br = val[0] / 255.0;\n var bg = val[1] / 255.0;\n var bb = val[2] / 255.0;\n var ba = 1.0;\n var tr = val[3] / 255.0;\n var tg = val[4] / 255.0;\n var tb = val[5] / 255.0;\n var ta = 1.0;\n JS_Set_Geometry_Color_By_Value(shellKey, \"face\", 0, [br, bg, bb, ba, br, bg, bb, ba, tr, tg, tb, ta, tr, tg, tb, ta]);\n } else {\n var vals = Array(16);\n for (var i = 0; i < 4; i++) {\n vals[i * 4] = val[i * 3] / 255.0;\n vals[i * 4 + 1] = val[i * 3 + 1] / 255.0;\n vals[i * 4 + 2] = val[i * 3 + 2] / 255.0;\n vals[i * 4 + 3] = 1.0;\n }\n JS_Set_Geometry_Color_By_Value(shellKey, \"face\", 0, vals);\n }\n }\n JS_Close_Segment();\n }\n JS_Close_Segment();\n }\n JS_Update_View_Display_By_Key(this._viewKey);\n this.updateDisplay();\n }\n JS_Close_Segment();\n }\n },\n enumerable: false,\n configurable: true\n });\n Viewer.prototype.imagePathToImageData = function (path) {\n var canvas = document.createElement(\"canvas\");\n var img = document.createElement(\"img\");\n var context = canvas.getContext(\"2d\");\n return new Promise(function (resolve) {\n img.src = path;\n img.crossOrigin = \"*\";\n img.onload = function (e) {\n canvas.width = img.width;\n canvas.height = img.height;\n context.drawImage(img, 0, 0, img.width, img.height);\n var image = context.getImageData(0, 0, img.width, img.height);\n resolve(image);\n };\n });\n };\n Object.defineProperty(Viewer.prototype, \"backgroundImage\", {\n set: function set(imageSrc) {\n var _this = this;\n this.imagePathToImageData(imageSrc).then(function (image) {\n JS_Open_Segment_By_Key(_this._viewKey);\n {\n JS_Set_Color(\"background=(r=1.0,g=1.0,b=1.0,a=1.0)\");\n if (_this._backgroundKey != -1) {\n JS_Clear_All_By_Key(_this._backgroundKey);\n }\n _this._backgroundKey = JS_Open_Segment(\"background\");\n {\n JS_Set_Camera([0, 0, 1], [0, 0, 0], [0, 1, 0], 2.0, 2.0, \"orthographic\");\n JS_Set_Camera_Extent(-1, 1);\n JS_Set_ModellingMatrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n JS_Set_Visibility(\"lights=off\");\n JS_Set_Rendering_Options(\"sync update=on\");\n JS_Set_Heuristic_Options(\"exclude bounding=on,exclude segment bounding=on\");\n var aspect_ratio = _this._aspectRatio;\n var far = -aspect_ratio * 2 + 1.000001;\n var w = 1.0;\n var h = 1.0;\n if (aspect_ratio > 1) {\n w *= aspect_ratio;\n } else {\n h /= aspect_ratio;\n far = -2 + 1.000001;\n }\n var shellKey = JS_Insert_Shell([-w, -h, far, w, -h, far, w, h, far, -w, h, far], [4, 0, 1, 2, 3]);\n JS_Set_Geometry_Texture_Coords(shellKey, 0, 4, [0, 0, 1, 0, 1, 1, 0, 1]);\n JS_Insert_Image(0, 0, 0, image.width, image.height, image.data, \"name='background',local,format=rgba\");\n JS_Set_Color(\"face diffuse='background'\");\n }\n JS_Close_Segment();\n }\n JS_Close_Segment();\n JS_Update_View_Display_By_Key(_this._viewKey);\n JS_Update_View_Display_By_Key(_this._viewKey);\n _this.updateDisplay();\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"selectionTolerance\", {\n get: function get() {\n var result = 0.0;\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var option = JS_Show_One_Driver_Option(\"selection tolerance\");\n result = parseFloat(option);\n }\n JS_Close_Segment();\n }\n return result;\n },\n set: function set(value) {\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n JS_Set_Driver_Options(\"selection tolerance=\" + value.toString());\n }\n JS_Close_Segment();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"collisionTolerance\", {\n get: function get() {\n var result = 0.0;\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var option = JS_Show_One_Driver_Option(\"collision tolerance\");\n result = parseFloat(option);\n }\n JS_Close_Segment();\n }\n return result;\n },\n set: function set(value) {\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n JS_Set_Driver_Options(\"collision tolerance=\" + value.toString());\n }\n JS_Close_Segment();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Viewer.prototype, \"softCollisionDistance\", {\n get: function get() {\n var result = 0.0;\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n var option = JS_Show_One_Driver_Option(\"soft collision distance\");\n result = parseFloat(option);\n }\n JS_Close_Segment();\n }\n return result;\n },\n set: function set(value) {\n if (this._viewKey != -1) {\n JS_Open_Segment_By_Key(this._viewKey);\n {\n JS_Set_Driver_Options(\"soft collision distance=\" + value.toString());\n }\n JS_Close_Segment();\n }\n },\n enumerable: false,\n configurable: true\n });\n Viewer.prototype.exeSceneCameraChanging = function (type) {\n var self = this;\n this.updateCameraNearFar();\n this.sceneCameraChanging.forEach(function (value) {\n value(self, type);\n });\n };\n Viewer.prototype.exeSceneCameraChanged = function (type) {\n var self = this;\n this.sceneCameraChanged.forEach(function (value) {\n value(self, type);\n });\n this.updateDocument();\n };\n Viewer.prototype.updateDocument = function () {\n this.documentChanged.forEach(function (value) {\n value(self);\n });\n };\n Viewer.prototype.updateCameraNearFar = function () {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n var camera = JS_Show_Camera();\n if (camera.projection === \"perspective\") {\n var bb = void 0;\n if (this.process && this.process.renderObject) {\n var model = this.process.renderObject;\n if (model && model.properties && model.properties.boundingBox) {\n bb = model.properties.boundingBox;\n var bb2 = JS_Compute_Boundingbox_By_Key(this.sceneKey);\n gs_math_1.BoundingBox.extend(bb, bb2);\n } else {\n bb = JS_Compute_Boundingbox_By_Key(this.sceneKey);\n }\n } else {\n bb = JS_Compute_Boundingbox_By_Key(this.sceneKey);\n }\n var min = new Float64Array([bb[0], bb[1], bb[2]]);\n var max = new Float64Array([bb[3], bb[4], bb[5]]);\n (0, utility_1.CalculateNearFar)(camera, min, max);\n }\n }\n JS_Close_Segment();\n };\n Viewer.prototype.internalFitWorld = function (type) {\n if (this._sceneKey != -1) {\n var center = new Float32Array(3);\n var min = new Float32Array(3);\n var max = new Float32Array(3);\n if (type) {\n var bb = JS_Compute_Boundingbox_With_Visibility_By_Key(this._sceneKey, ElementType.ELEMENT_TYPE_Face);\n min[0] = bb[0];\n min[1] = bb[1];\n min[2] = bb[2];\n max[0] = bb[3];\n max[1] = bb[4];\n max[2] = bb[5];\n } else {\n var bb = JS_Compute_Boundingbox_By_Key(this._sceneKey);\n min[0] = bb[0];\n min[1] = bb[1];\n min[2] = bb[2];\n max[0] = bb[3];\n max[1] = bb[4];\n max[2] = bb[5];\n }\n if (max[0] > min[0] || max[1] > min[1] || max[2] > min[2]) {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n var diagonalVector = gs_math_1.Point.subtract(max, min);\n var diagonalLength = gs_math_1.Vector.module(diagonalVector);\n center[0] = 0.5 * (min[0] + max[0]);\n center[1] = 0.5 * (min[1] + max[1]);\n center[2] = 0.5 * (min[2] + max[2]);\n var camera = JS_Show_Camera();\n var new_position = null;\n var new_target = new Float64Array(center);\n var new_width = 2.0;\n var new_height = 2.0;\n var viewingVector = gs_math_1.DPoint.subtract(camera.position, camera.target);\n gs_math_1.DVector.normalize(viewingVector);\n if (diagonalLength != 0) {\n new_position = new Float64Array(3);\n new_position[0] = center[0] + 2.5 * viewingVector[0] * diagonalLength;\n new_position[1] = center[1] + 2.5 * viewingVector[1] * diagonalLength;\n new_position[2] = center[2] + 2.5 * viewingVector[2] * diagonalLength;\n new_width = diagonalLength;\n new_height = diagonalLength;\n } else {\n new_position = camera.pos;\n new_width = camera.width;\n new_height = camera.height;\n }\n var maxZoomLevel = this.zoomLimit;\n if (new_width < maxZoomLevel) {\n new_width = maxZoomLevel;\n }\n if (new_height < maxZoomLevel) {\n new_height = maxZoomLevel;\n }\n if (camera.projection == \"perspective\") {\n new_width *= 2.0;\n new_height *= 2.0;\n }\n JS_Set_Camera(new_position, new_target, camera.up, new_width, new_height, camera.projection);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {\n JS_Keep_Camera_Ratio(1);\n JS_Set_Camera_Extent(1, diagonalLength * 10);\n }\n }\n JS_Close_Segment();\n }\n }\n };\n Viewer.prototype.internalFitWorldByBB = function (bb) {\n if (this._sceneKey != -1) {\n var center = new Float32Array(3);\n var min = new Float32Array(3);\n var max = new Float32Array(3);\n min[0] = bb[0];\n min[1] = bb[1];\n min[2] = bb[2];\n max[0] = bb[3];\n max[1] = bb[4];\n max[2] = bb[5];\n if (max[0] > min[0] || max[1] > min[1] || max[2] > min[2]) {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n var diagonalVector = gs_math_1.Point.subtract(max, min);\n var diagonalLength = gs_math_1.Vector.module(diagonalVector);\n center[0] = 0.5 * (min[0] + max[0]);\n center[1] = 0.5 * (min[1] + max[1]);\n center[2] = 0.5 * (min[2] + max[2]);\n var camera = JS_Show_Camera();\n var new_position = null;\n var new_target = new Float64Array(center);\n var new_width = 2.0;\n var new_height = 2.0;\n var viewingVector = gs_math_1.DPoint.subtract(camera.position, camera.target);\n gs_math_1.DVector.normalize(viewingVector);\n if (diagonalLength != 0) {\n new_position = new Float64Array(3);\n new_position[0] = center[0] + 2.5 * viewingVector[0] * diagonalLength;\n new_position[1] = center[1] + 2.5 * viewingVector[1] * diagonalLength;\n new_position[2] = center[2] + 2.5 * viewingVector[2] * diagonalLength;\n new_width = diagonalLength;\n new_height = diagonalLength;\n } else {\n new_position = camera.pos;\n new_width = camera.width;\n new_height = camera.height;\n }\n var maxZoomLevel = this.zoomLimit;\n if (new_width < maxZoomLevel) {\n new_width = maxZoomLevel;\n }\n if (new_height < maxZoomLevel) {\n new_height = maxZoomLevel;\n }\n if (camera.projection == \"perspective\") {\n new_width *= 2.0;\n new_height *= 2.0;\n }\n JS_Set_Camera(new_position, new_target, camera.up, new_width, new_height, camera.projection);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {\n JS_Keep_Camera_Ratio(1);\n JS_Set_Camera_Extent(1, diagonalLength * 10);\n }\n }\n JS_Close_Segment();\n }\n }\n };\n Viewer.prototype.fitWorld = function (type) {\n if (this._sceneKey != -1) {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n var camera = JS_Show_Camera();\n var co = camera.position;\n var to = camera.target;\n var uo = camera.up;\n var widtho = camera.width;\n var heighto = camera.height;\n this.internalFitWorld(type);\n if (this._smoothTransition) {\n var camera_1 = JS_Show_Camera();\n var cn = camera_1.position;\n var tn = camera_1.target;\n var un = camera_1.up;\n var widthn = camera_1.width;\n var heightn = camera_1.height;\n GsWebGLUtility.smoothTransitionD(co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, this);\n } else {\n var viewer = this;\n this.exeSceneCameraChanging(CameraChangeType.Rotate);\n this.updateDisplay();\n this.exeSceneCameraChanged(CameraChangeType.Rotate);\n }\n }\n JS_Close_Segment();\n }\n };\n Viewer.prototype.locateWorld = function (key) {\n if (this._sceneKey != -1) {\n var center = new Float32Array(3);\n var min = new Float32Array(3);\n var max = new Float32Array(3);\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n var bb = JS_Compute_View_Boundingbox_By_Key(this._viewKey, key);\n if (bb[0] === 1 && bb[1] === 1 && bb[2] === 1 && bb[3] === -1 && bb[4] === -1 && bb[5] === -1) {\n console.log(\"boundingBox为-1---1\");\n } else {\n min[0] = bb[0];\n min[1] = bb[1];\n min[2] = bb[2];\n max[0] = bb[3];\n max[1] = bb[4];\n max[2] = bb[5];\n if (min[0] > max[0]) {\n var tmp = void 0;\n tmp = min[0];\n min[0] = max[0];\n max[0] = tmp;\n }\n if (min[1] > max[1]) {\n var tmp = void 0;\n tmp = min[1];\n min[1] = max[1];\n max[1] = tmp;\n }\n if (min[2] > max[2]) {\n var tmp = void 0;\n tmp = min[2];\n min[2] = max[2];\n max[2] = tmp;\n }\n var diagonalVector = new Float32Array([max[0] - min[0], max[1] - min[1], max[2] - min[2]]);\n var diagonalLength = gs_math_1.Vector.module(diagonalVector);\n center[0] = 0.5 * (min[0] + max[0]);\n center[1] = 0.5 * (min[1] + max[1]);\n center[2] = 0.5 * (min[2] + max[2]);\n var camera = JS_Show_Camera();\n var co = camera.position;\n var to = camera.target;\n var uo = camera.up;\n var widtho = camera.width;\n var heighto = camera.height;\n var cn = new Float64Array(3);\n var tn = new Float64Array(3);\n var un = new Float64Array(3);\n var widthn = void 0,\n heightn = void 0;\n if (diagonalLength != 0) {\n tn[0] = center[0];\n tn[1] = center[1];\n tn[2] = center[2];\n var viewingVector = new Float64Array([co[0] - to[0], co[1] - to[1], co[2] - to[2]]);\n gs_math_1.DVector.normalize(viewingVector);\n cn[0] = center[0] + 2.5 * viewingVector[0] * diagonalLength;\n cn[1] = center[1] + 2.5 * viewingVector[1] * diagonalLength;\n cn[2] = center[2] + 2.5 * viewingVector[2] * diagonalLength;\n widthn = diagonalLength;\n heightn = diagonalLength;\n un = uo;\n } else {\n tn[0] = center[0];\n tn[1] = center[1];\n tn[2] = center[2];\n cn = co;\n un = uo;\n widthn = widtho;\n heightn = heighto;\n }\n var maxZoomLevel = this.zoomLimit;\n if (widthn < maxZoomLevel) {\n widthn = maxZoomLevel;\n }\n if (heightn < maxZoomLevel) {\n heightn = maxZoomLevel;\n }\n if (camera.projection == \"perspective\") {\n widthn *= 2.0;\n heightn *= 2.0;\n }\n JS_Set_Camera(cn, tn, un, widthn, heightn, camera.projection);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n if (this._smoothTransition) {\n var camera_2 = JS_Show_Camera();\n cn = camera_2.position;\n tn = camera_2.target;\n un = camera_2.up;\n widthn = camera_2.width;\n heightn = camera_2.height;\n GsWebGLUtility.smoothTransitionD(co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, this);\n }\n }\n }\n JS_Close_Segment();\n }\n };\n Viewer.prototype.locateWorldByData = function (target, min, max) {\n if (this._sceneKey != -1) {\n var center = new Float32Array(3);\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n if (min[0] > max[0]) {\n var tmp = void 0;\n tmp = min[0];\n min[0] = max[0];\n max[0] = tmp;\n }\n if (min[1] > max[1]) {\n var tmp = void 0;\n tmp = min[1];\n min[1] = max[1];\n max[1] = tmp;\n }\n if (min[2] > max[2]) {\n var tmp = void 0;\n tmp = min[2];\n min[2] = max[2];\n max[2] = tmp;\n }\n var diagonalVector = new Float32Array([max[0] - min[0], max[1] - min[1], max[2] - min[2]]);\n var diagonalLength = gs_math_1.Vector.module(diagonalVector);\n center[0] = 0.5 * (min[0] + max[0]);\n center[1] = 0.5 * (min[1] + max[1]);\n center[2] = 0.5 * (min[2] + max[2]);\n var offset = new Float32Array([target[0] - center[0], target[1] - center[1], target[2] - center[2]]);\n center = target;\n diagonalLength += gs_math_1.Vector.module(offset);\n var camera = JS_Show_Camera();\n var co = camera.position;\n var to = camera.target;\n var uo = camera.up;\n var widtho = camera.width;\n var heighto = camera.height;\n var cn = new Float64Array(3);\n var tn = new Float64Array(3);\n var un = new Float64Array(3);\n var widthn = void 0,\n heightn = void 0;\n if (diagonalLength != 0) {\n tn[0] = center[0];\n tn[1] = center[1];\n tn[2] = center[2];\n var viewingVector = new Float64Array([co[0] - to[0], co[1] - to[1], co[2] - to[2]]);\n gs_math_1.DVector.normalize(viewingVector);\n cn[0] = center[0] + 2.5 * viewingVector[0] * diagonalLength;\n cn[1] = center[1] + 2.5 * viewingVector[1] * diagonalLength;\n cn[2] = center[2] + 2.5 * viewingVector[2] * diagonalLength;\n widthn = diagonalLength;\n heightn = diagonalLength;\n un = uo;\n } else {\n tn[0] = center[0];\n tn[1] = center[1];\n tn[2] = center[2];\n cn = co;\n un = uo;\n widthn = widtho;\n heightn = heighto;\n }\n var maxZoomLevel = this.zoomLimit;\n if (widthn < maxZoomLevel) {\n widthn = maxZoomLevel;\n }\n if (heightn < maxZoomLevel) {\n heightn = maxZoomLevel;\n }\n JS_Set_Camera(cn, tn, un, widthn, heightn, camera.projection);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {\n JS_Keep_Camera_Ratio(2.0);\n }\n this.exeSceneCameraChanging(CameraChangeType.Rotate);\n if (this._smoothTransition) {\n var camera_3 = JS_Show_Camera();\n cn = camera_3.position;\n tn = camera_3.target;\n un = camera_3.up;\n widthn = camera_3.width;\n heightn = camera_3.height;\n GsWebGLUtility.smoothTransitionD(co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, this);\n }\n }\n JS_Close_Segment();\n }\n };\n Viewer.prototype.setViewMode = function (mode, fitWorld, bb) {\n if (this._cameraOrientationFixed) {\n return;\n }\n var camera;\n var co;\n var to;\n var uo;\n var widtho;\n var heighto;\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n camera = JS_Show_Camera();\n co = camera.position;\n to = camera.target;\n uo = camera.up;\n widtho = camera.width;\n heighto = camera.height;\n if (fitWorld) {\n if (bb) {\n this.internalFitWorldByBB(bb);\n } else {\n this.internalFitWorld();\n }\n }\n camera = JS_Show_Camera();\n var target = camera.target;\n var position = camera.position;\n var view = gs_math_1.DPoint.subtract(position, target);\n var length = gs_math_1.DVector.module(view);\n switch (mode) {\n case ViewMode.XY:\n {\n position[0] = target[0];\n position[1] = target[1];\n position[2] = target[2] + length;\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 1.0, 0.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.YX:\n {\n position[0] = target[0];\n position[1] = target[1];\n position[2] = target[2] - length;\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 1.0, 0.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.XZ:\n {\n position[0] = target[0];\n position[1] = target[1] - length;\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.ZX:\n {\n position[0] = target[0];\n position[1] = target[1] + length;\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.YZ:\n {\n position[0] = target[0] + length;\n position[1] = target[1];\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.ZY:\n {\n position[0] = target[0] - length;\n position[1] = target[1];\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.Iso:\n {\n var newLen = length * 0.5774;\n position[0] = target[0] + newLen;\n position[1] = target[1] - newLen;\n position[2] = target[2] + newLen;\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.YUpIso:\n {\n var newLen = length * 0.5774;\n position[0] = target[0] + newLen;\n position[1] = target[1] + newLen;\n position[2] = target[2] + newLen;\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.EN:\n {\n position[0] = target[0] - length / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0);\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.NW:\n {\n position[0] = target[0] + length / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0);\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.WS:\n {\n position[0] = target[0] + length / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0);\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.SE:\n {\n position[0] = target[0] - length / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0);\n position[2] = target[2];\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopE:\n {\n position[0] = target[0] - length / Math.sqrt(2.0);\n position[1] = target[1];\n position[2] = target[2] + length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomE:\n {\n position[0] = target[0] - length / Math.sqrt(2.0);\n position[1] = target[1];\n position[2] = target[2] - length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopN:\n {\n position[0] = target[0];\n position[1] = target[1] + length / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomN:\n {\n position[0] = target[0];\n position[1] = target[1] + length / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopW:\n {\n position[0] = target[0] + length / Math.sqrt(2.0);\n position[1] = target[1];\n position[2] = target[2] + length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomW:\n {\n position[0] = target[0] + length / Math.sqrt(2.0);\n position[1] = target[1];\n position[2] = target[2] - length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopS:\n {\n position[0] = target[0];\n position[1] = target[1] - length / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomS:\n {\n position[0] = target[0];\n position[1] = target[1] - length / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopEN:\n {\n position[0] = target[0] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomEN:\n {\n position[0] = target[0] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopNW:\n {\n position[0] = target[0] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomNW:\n {\n position[0] = target[0] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopWS:\n {\n position[0] = target[0] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomWS:\n {\n position[0] = target[0] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.TopSE:\n {\n position[0] = target[0] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] + length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n case ViewMode.BottomSE:\n {\n position[0] = target[0] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[1] = target[1] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n position[2] = target[2] - length / Math.sqrt(2.0) / Math.sqrt(2.0);\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up([0.0, 0.0, 1.0]);\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n }\n break;\n default:\n break;\n }\n }\n JS_Close_Segment();\n if (this._smoothTransition) {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n camera = JS_Show_Camera();\n }\n JS_Close_Segment();\n var cn = camera.position;\n var tn = camera.target;\n var un = camera.up;\n var widthn = camera.width;\n var heightn = camera.height;\n GsWebGLUtility.smoothTransitionD(co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, this);\n } else {\n var viewer = this;\n this.exeSceneCameraChanging(CameraChangeType.Rotate | CameraChangeType.Scale);\n viewer.updateDisplay();\n this.exeSceneCameraChanged(CameraChangeType.Rotate | CameraChangeType.Scale);\n }\n };\n Viewer.prototype.setSceneCamera = function (positin, target, up, width, height) {\n var camera;\n var co;\n var to;\n var uo;\n var widtho;\n var heighto;\n var proj;\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n camera = JS_Show_Camera();\n co = camera.position;\n to = camera.target;\n uo = camera.up;\n widtho = camera.width;\n heighto = camera.height;\n proj = camera.projection;\n }\n JS_Close_Segment();\n if (this._smoothTransition) {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n if (width && height) {\n JS_Set_Camera(positin, target, up, width, height, proj);\n } else {\n JS_Set_Camera(positin, target, up, widtho, heighto, proj);\n }\n if (camera.projection == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else if (camera.projection == \"perspective\") {}\n camera = JS_Show_Camera();\n }\n JS_Close_Segment();\n var cn = camera.position;\n var tn = camera.target;\n var un = camera.up;\n var widthn = camera.width;\n var heightn = camera.height;\n GsWebGLUtility.smoothTransitionD(co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, this);\n } else {\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n if (width && height) {\n JS_Set_Camera(positin, target, up, width, height, proj);\n } else {\n JS_Set_Camera(positin, target, up, widtho, heighto, proj);\n }\n if (proj == \"orthographic\") {\n JS_Keep_Camera_Ratio(2.5);\n } else {}\n camera = JS_Show_Camera();\n }\n JS_Close_Segment();\n var viewer = this;\n this.exeSceneCameraChanging(CameraChangeType.Rotate | CameraChangeType.Scale);\n viewer.updateDisplay();\n }\n };\n Viewer.prototype.convertCoordinate = function (in_coords, out_coords, in_pos) {\n return JS_Compute_Coordinates_By_Key(this._sceneKey, CoordinateSystem[in_coords].toLowerCase(), in_pos, CoordinateSystem[out_coords].toLowerCase());\n };\n Viewer.prototype.convertDCoordinate = function (in_coords, out_coords, in_pos) {\n return JS_DCompute_Coordinates_By_Key(this._sceneKey, CoordinateSystem[in_coords].toLowerCase(), in_pos, CoordinateSystem[out_coords].toLowerCase());\n };\n Viewer.prototype.selectPositionByPoint = function (winPos) {\n var count = JS_Compute_Selection_By_Key(this._viewKey, this._sceneKey, winPos[0], winPos[1]);\n if (count > 0) {\n var selectedPos = null;\n for (var i = 0; i < count; i++) {\n if (selectedPos == null) {\n selectedPos = JS_Show_Selection_Position(i);\n } else {\n var newPos = JS_Show_Selection_Position(i);\n if (newPos[2] < selectedPos[2]) {\n selectedPos = newPos;\n }\n }\n }\n return selectedPos;\n }\n return null;\n };\n Viewer.prototype.computePerspectiveNearWorldPos = function (pixel) {\n var camera = null;\n var extent = null;\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n camera = JS_Show_Camera();\n extent = JS_Show_Camera_Extent();\n }\n JS_Close_Segment();\n if (camera.projection == \"perspective\") {\n var cameraPosition = camera.position;\n var cameraTarget = camera.target;\n var cameraUp = camera.up;\n var cameraView = gs_math_1.DPoint.subtract(cameraPosition, cameraTarget);\n gs_math_1.DVector.normalize(cameraView);\n var xAxis = gs_math_1.DVector.cross(cameraUp, cameraView);\n gs_math_1.DVector.reverse(cameraView);\n var wcs = new gs_math_1.DWcs(gs_math_1.DGeometryOperators.distancePoint(cameraPosition, cameraView, extent[0]), xAxis, cameraUp);\n var lenPerPixel = 2 * Math.tan(Math.PI / 12) * extent[0] / this.height;\n var pixelPos = new Float64Array(3);\n pixelPos[0] = pixel[0] - this.width / 2;\n pixelPos[1] = this.height / 2 - pixel[1];\n pixelPos[2] = 0;\n var localWorldPos = new Float64Array([pixelPos[0] * lenPerPixel, pixelPos[1] * lenPerPixel, pixelPos[2]]);\n var worldPos = wcs.toModelPoint(localWorldPos);\n return worldPos;\n }\n return null;\n };\n Viewer.prototype.computeNearPlaneWorldPos = function (pixel) {\n var camera = null;\n var extent = null;\n JS_Open_Segment_By_Key(this._sceneKey);\n {\n camera = JS_Show_Camera();\n extent = JS_Show_Camera_Extent();\n }\n JS_Close_Segment();\n if (camera.projection == \"orthographic\") {\n var out_pos = JS_Compute_Coordinates_By_Key(this._sceneKey, \"pixels\", pixel, \"world\");\n var pos = new Float64Array(out_pos);\n var cameraPosition = camera.position;\n var cameraTarget = camera.target;\n var direct = gs_math_1.DPoint.subtract(cameraPosition, cameraTarget);\n gs_math_1.DVector.normalize(direct);\n return gs_math_1.DGeometryOperators.projectPointToPlane(pos, cameraPosition, direct);\n } else if (camera.projection == \"perspective\") {\n var cameraPosition = camera.position;\n var cameraTarget = camera.target;\n var cameraUp = camera.up;\n var cameraView = gs_math_1.DPoint.subtract(cameraPosition, cameraTarget);\n gs_math_1.DVector.normalize(cameraView);\n var xAxis = gs_math_1.DVector.cross(cameraUp, cameraView);\n gs_math_1.DVector.reverse(cameraView);\n var wcs = new gs_math_1.DWcs(gs_math_1.DGeometryOperators.distancePoint(cameraPosition, cameraView, extent[0]), xAxis, cameraUp);\n var lenPerPixel = 2 * Math.tan(Math.PI / 12) * extent[0] / this.height;\n var pixelPos = new Float64Array(3);\n pixelPos[0] = pixel[0] - this.width / 2;\n pixelPos[1] = this.height / 2 - pixel[1];\n pixelPos[2] = 0;\n var localWorldPos = new Float64Array([pixelPos[0] * lenPerPixel, pixelPos[1] * lenPerPixel, pixelPos[2]]);\n var worldPos = wcs.toModelPoint(localWorldPos);\n return worldPos;\n }\n return null;\n };\n return Viewer;\n }();\n exports.Viewer = Viewer;\n var ThreadPromise = function () {\n function ThreadPromise(event) {\n this._resolve = null;\n this._reject = null;\n this._event = null;\n if (event) {\n this._event = event;\n }\n }\n ThreadPromise.prototype.then = function (resolve, reject) {\n this._resolve = resolve;\n this._reject = reject;\n if (this._event) {\n this._event(this._resolve, this._reject);\n }\n };\n ThreadPromise.prototype.resolve = function (value) {\n if (this._resolve) {\n this._resolve(value);\n }\n };\n ThreadPromise.prototype.reject = function (reason) {\n if (this._reject) {\n this._reject(reason);\n }\n };\n return ThreadPromise;\n }();\n exports.ThreadPromise = ThreadPromise;\n var UpdateDisplayType;\n (function (UpdateDisplayType) {\n UpdateDisplayType[UpdateDisplayType[\"Synchronization\"] = 0] = \"Synchronization\";\n UpdateDisplayType[UpdateDisplayType[\"Busy\"] = 1] = \"Busy\";\n UpdateDisplayType[UpdateDisplayType[\"AsynBufferGeometry\"] = 2] = \"AsynBufferGeometry\";\n UpdateDisplayType[UpdateDisplayType[\"AsynNoneBufferGeometry\"] = 3] = \"AsynNoneBufferGeometry\";\n UpdateDisplayType[UpdateDisplayType[\"AsynThreadBufferGeometry\"] = 4] = \"AsynThreadBufferGeometry\";\n UpdateDisplayType[UpdateDisplayType[\"AsynThreadNoneBufferGeometry\"] = 5] = \"AsynThreadNoneBufferGeometry\";\n })(UpdateDisplayType = exports.UpdateDisplayType || (exports.UpdateDisplayType = {}));\n var UpdateInfo = function () {\n function UpdateInfo(viewer, type) {\n this._count = 0;\n this._viewer = viewer;\n this._type = type;\n }\n Object.defineProperty(UpdateInfo.prototype, \"viewer\", {\n get: function get() {\n return this._viewer;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(UpdateInfo.prototype, \"type\", {\n get: function get() {\n return this._type;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(UpdateInfo.prototype, \"count\", {\n get: function get() {\n return this._count;\n },\n enumerable: false,\n configurable: true\n });\n return UpdateInfo;\n }();\n exports.UpdateInfo = UpdateInfo;\n var ViewerEvent = function () {\n function ViewerEvent(viewer, e) {\n this.viewer = viewer;\n this.uiEvent = e;\n }\n ViewerEvent.prototype.mouseEvent = function () {\n return this.uiEvent;\n };\n ViewerEvent.prototype.wheelEvent = function () {\n return this.uiEvent;\n };\n ViewerEvent.prototype.touchEvent = function () {\n return this.uiEvent;\n };\n ViewerEvent.prototype.mousePixelPos = function () {\n var mouseEvent = this.mouseEvent();\n return new Float32Array([mouseEvent.offsetX, mouseEvent.offsetY, 0]);\n };\n ViewerEvent.prototype.mouseWorldPos = function () {\n var mouseEvent = this.mouseEvent();\n var pixelPos = [mouseEvent.offsetX, mouseEvent.offsetY, -1];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.mouseFarWorldPos = function () {\n var mouseEvent = this.mouseEvent();\n var pixelPos = [mouseEvent.offsetX, mouseEvent.offsetY, 1];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.mouseZWorldPos = function (z) {\n var mouseEvent = this.mouseEvent();\n var pixelPos = [mouseEvent.offsetX, mouseEvent.offsetY, z];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.mouseWorldRay = function () {\n var ray = null;\n JS_Open_Segment_By_Key(this.viewer.sceneKey);\n {\n var camera = JS_Show_Camera();\n if (camera.projection == \"orthographic\") {\n ray = gs_math_1.Point.subtract(camera.target, camera.position);\n gs_math_1.Vector.normalize(ray);\n } else if (camera.projection == \"perspective\") {\n var mouseEvent = this.mouseEvent();\n var pixelPos = new Float32Array([mouseEvent.offsetX, mouseEvent.offsetY, -1]);\n var nearPos = this.viewer.computePerspectiveNearWorldPos(pixelPos);\n ray = gs_math_1.DPoint.subtract(nearPos, camera.position);\n gs_math_1.DVector.normalize(ray);\n return new Float32Array(ray);\n }\n }\n JS_Close_Segment();\n return ray;\n };\n ViewerEvent.prototype.mouseViewpointPos = function () {\n return new Float32Array([0, 0, 0]);\n };\n ViewerEvent.prototype.mouseWindowPos = function () {\n var mouseEvent = this.mouseEvent();\n var pixelPos = [mouseEvent.offsetX, mouseEvent.offsetY, -1];\n var windowPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"window\");\n return windowPos;\n };\n ViewerEvent.prototype.mouseUnitWindowPos = function () {\n var viewer = this.viewer;\n var mouseEvent = this.mouseEvent();\n var pixelPos = [mouseEvent.offsetX, mouseEvent.offsetY, -1];\n var windowPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"window\");\n var x = windowPos[0];\n var y = windowPos[1];\n if (viewer.aspectRatio > 1) {\n x *= viewer.aspectRatio;\n } else if (viewer.aspectRatio < 1) {\n y /= viewer.aspectRatio;\n }\n return new Float32Array([x, y, 0]);\n };\n ViewerEvent.prototype.getElementPos = function (element) {\n var actualTop = element.offsetTop;\n var actualLeft = element.offsetLeft;\n var current = element.offsetParent;\n while (current !== null) {\n actualTop += current.offsetTop;\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n return {\n top: actualTop,\n left: actualLeft\n };\n };\n ViewerEvent.prototype.touchWorldPos = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[0].clientX - left, touchEvent.touches[0].clientY - top, -1];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.touchWorldPos1 = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[1].clientX - left, touchEvent.touches[1].clientY - top, -1];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.touchWorldPos2 = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[2].clientX - left, touchEvent.touches[2].clientY - top, -1];\n var worldPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"world\");\n return worldPos;\n };\n ViewerEvent.prototype.touchWindowPos = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[0].clientX - left, touchEvent.touches[0].clientY - top, -1];\n var windowPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"window\");\n return windowPos;\n };\n ViewerEvent.prototype.touchWindowPos1 = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[1].clientX - left, touchEvent.touches[1].clientY - top, -1];\n var windowPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"window\");\n return windowPos;\n };\n ViewerEvent.prototype.touchUnitWindowPos = function () {\n var viewer = this.viewer;\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n var pixelPos = [touchEvent.touches[0].clientX - left, touchEvent.touches[0].clientY - top, -1];\n var windowPos = JS_Compute_Coordinates_By_Key(this.viewer.sceneKey, \"pixels\", pixelPos, \"window\");\n var x = windowPos[0];\n var y = windowPos[1];\n if (viewer.aspectRatio > 1) {\n x *= viewer.aspectRatio;\n } else if (viewer.aspectRatio < 1) {\n y /= viewer.aspectRatio;\n }\n return new Float32Array([x, y, 0]);\n };\n ViewerEvent.prototype.touchPixelPos = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n return new Float32Array([touchEvent.touches[0].clientX - left, touchEvent.touches[0].clientY - top, 0]);\n };\n ViewerEvent.prototype.touchPixelPos1 = function () {\n var touchEvent = this.touchEvent();\n var _a = this.getElementPos(touchEvent.target),\n top = _a.top,\n left = _a.left;\n return new Float32Array([touchEvent.touches[1].clientX - left, touchEvent.touches[1].clientY - top, 0]);\n };\n return ViewerEvent;\n }();\n exports.ViewerEvent = ViewerEvent;\n var GsWebGLUtility = function () {\n function GsWebGLUtility() {}\n GsWebGLUtility.smoothTransition = function (co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, vi) {\n var camera = {\n position: new Float32Array(3),\n target: new Float32Array(3),\n up: new Float32Array(3),\n width: 0,\n height: 0,\n projection: \"\"\n };\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n camera = JS_Show_Camera();\n }\n JS_Close_Segment();\n var X = 0;\n var Y = 1;\n var Z = 2;\n if (gs_math_1.Tolerance.sameValueFloatArray(co, cn) && gs_math_1.Tolerance.sameValueFloatArray(to, tn) && gs_math_1.Tolerance.sameValueFloatArray(uo, un) && gs_math_1.Tolerance.sameValue(widtho, widthn) && gs_math_1.Tolerance.sameValue(heighto, heightn)) {\n return;\n }\n var matrix_old = new Float32Array(16);\n var matrix_new = new Float32Array(16);\n var view_vector_old = new Float32Array([to[X] - co[X], to[Y] - co[Y], to[Z] - co[Z]]);\n var view_vector_new = new Float32Array([tn[X] - cn[X], tn[Y] - cn[Y], tn[Z] - cn[Z]]);\n var length = gs_math_1.Vector.module(view_vector_old);\n var length_delta = gs_math_1.Vector.module(view_vector_new) - length;\n gs_math_1.Vector.normalize(view_vector_old);\n gs_math_1.Vector.normalize(view_vector_new);\n var need_rotation = true;\n var rotation_delta = new Float32Array([view_vector_old[0] - view_vector_new[0], view_vector_old[1] - view_vector_new[1], view_vector_old[2] - view_vector_new[2]]);\n var up_delta = new Float32Array([un[X] - uo[X], un[Y] - uo[Y], un[Z] - uo[Z]]);\n if (gs_math_1.Vector.module(rotation_delta) < 0.0001 && gs_math_1.Vector.module(up_delta) < 0.0001) {\n need_rotation = false;\n }\n var translation = new Float32Array(3);\n var position_move_delta = new Float32Array(3);\n if (need_rotation) {\n GsWebGLUtility.GetMatrixFromCamera(to, co, uo, translation, matrix_old);\n GsWebGLUtility.GetMatrixFromCamera(tn, cn, un, translation, matrix_new);\n } else {\n position_move_delta[X] = cn[X] - co[X];\n position_move_delta[Y] = cn[Y] - co[Y];\n position_move_delta[Z] = cn[Z] - co[Z];\n }\n var matrix_interim = new Float32Array(16);\n var quat_old = new Float32Array(4);\n var quat_new = new Float32Array(4);\n var quat_interim = new Float32Array(4);\n if (need_rotation) {\n GsWebGLUtility.MatrixToQuaternion(matrix_old, quat_old);\n GsWebGLUtility.MatrixToQuaternion(matrix_new, quat_new);\n }\n var target_move_delta = new Float32Array([tn[X] - to[X], tn[Y] - to[Y], tn[Z] - to[Z]]);\n var field_width_delta = widthn - widtho;\n var field_height_delta = heightn - heighto;\n var dot1, dot2;\n if (need_rotation) {\n dot1 = (quat_old[0] - quat_new[0]) * (quat_old[0] - quat_new[0]) + (quat_old[1] - quat_new[1]) * (quat_old[1] - quat_new[1]) + (quat_old[2] - quat_new[2]) * (quat_old[2] - quat_new[2]) + (quat_old[3] - quat_new[3]) * (quat_old[3] - quat_new[3]);\n dot2 = (quat_old[0] + quat_new[0]) * (quat_old[0] + quat_new[0]) + (quat_old[1] + quat_new[1]) * (quat_old[1] + quat_new[1]) + (quat_old[2] + quat_new[2]) * (quat_old[2] + quat_new[2]) + (quat_old[3] + quat_new[3]) * (quat_old[3] + quat_new[3]);\n if (dot2 < dot1) {\n quat_new[0] = -quat_new[0];\n quat_new[1] = -quat_new[1];\n quat_new[2] = -quat_new[2];\n quat_new[3] = -quat_new[3];\n }\n }\n var position = new Float32Array(3);\n var up_vector = new Float32Array(3);\n var total_duration = vi._smoothTransitionDuration;\n var q, current_time;\n var total_time_start = Date.now();\n total_time_start -= 100;\n function tick() {\n current_time = Date.now();\n q = (current_time - total_time_start) / total_duration;\n if (q >= 1.0) {\n q = 1.0;\n }\n q = GsWebGLUtility.EaseInEaseOut(q, 0.49, 0.02, 0.49);\n if (q < 0) {\n q = 0;\n }\n if (need_rotation) {\n var to2 = new Float32Array([to[X] + q * target_move_delta[X], to[Y] + q * target_move_delta[Y], to[Z] + q * target_move_delta[Z]]);\n GsWebGLUtility.TransitionQuaternion(quat_old, quat_new, q, quat_interim);\n GsWebGLUtility.QuaternionToMatrix(quat_interim, matrix_interim);\n position[X] = to2[X] - matrix_interim[8] * (length + length_delta * q);\n position[Y] = to2[Y] - matrix_interim[9] * (length + length_delta * q);\n position[Z] = to2[Z] - matrix_interim[10] * (length + length_delta * q);\n up_vector[X] = matrix_interim[4];\n up_vector[Y] = matrix_interim[5];\n up_vector[Z] = matrix_interim[6];\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up(up_vector);\n }\n JS_Close_Segment();\n } else {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Position(new Float32Array([co[X] + q * position_move_delta[X], co[Y] + q * position_move_delta[Y], co[Z] + q * position_move_delta[Z]]));\n }\n JS_Close_Segment();\n }\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Target(new Float32Array([to[X] + q * target_move_delta[X], to[Y] + q * target_move_delta[Y], to[Z] + q * target_move_delta[Z]]));\n }\n JS_Close_Segment();\n var fw = widtho + q * field_width_delta;\n var fh = heighto + q * field_height_delta;\n if (fw > 0.00001 && fh > 0.00001) {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Field(fw, fh);\n }\n JS_Close_Segment();\n q = (current_time - total_time_start) / total_duration;\n vi.updateDisplay();\n }\n if (q < 1.0 - GsWebGLUtility.EPSILON) {\n requestAnimationFrame(tick);\n } else {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera(cn, tn, un, widthn, heightn, camera.projection);\n }\n JS_Close_Segment();\n vi.sceneCameraChanged.forEach(function (value) {\n value(vi, CameraChangeType.Rotate | CameraChangeType.Scale);\n });\n requestAnimationFrame(function () {\n vi.updateDisplay();\n });\n }\n }\n requestAnimationFrame(tick);\n };\n GsWebGLUtility.smoothTransitionD = function (co, to, uo, widtho, heighto, cn, tn, un, widthn, heightn, vi) {\n vi.isBusy = true;\n var camera;\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n camera = JS_Show_Camera();\n }\n JS_Close_Segment();\n var X = 0;\n var Y = 1;\n var Z = 2;\n if (gs_math_1.DTolerance.sameValueFloatArray(co, cn) && gs_math_1.DTolerance.sameValueFloatArray(to, tn) && gs_math_1.DTolerance.sameValueFloatArray(uo, un) && gs_math_1.DTolerance.sameValue(widtho, widthn) && gs_math_1.DTolerance.sameValue(heighto, heightn)) {\n vi.isBusy = false;\n vi.updateDisplay();\n return;\n }\n var matrix_old = new Float64Array(16);\n var matrix_new = new Float64Array(16);\n var view_vector_old = new Float64Array([to[X] - co[X], to[Y] - co[Y], to[Z] - co[Z]]);\n var view_vector_new = new Float64Array([tn[X] - cn[X], tn[Y] - cn[Y], tn[Z] - cn[Z]]);\n var length = gs_math_1.DVector.module(view_vector_old);\n var length_delta = gs_math_1.DVector.module(view_vector_new) - length;\n gs_math_1.DVector.normalize(view_vector_old);\n gs_math_1.DVector.normalize(view_vector_new);\n var need_rotation = true;\n var rotation_delta = new Float64Array([view_vector_old[0] - view_vector_new[0], view_vector_old[1] - view_vector_new[1], view_vector_old[2] - view_vector_new[2]]);\n var up_delta = new Float64Array([un[X] - uo[X], un[Y] - uo[Y], un[Z] - uo[Z]]);\n if (gs_math_1.DVector.module(rotation_delta) < 0.0001 && gs_math_1.DVector.module(up_delta) < 0.0001) {\n need_rotation = false;\n }\n var translation = new Float64Array(3);\n var position_move_delta = new Float64Array(3);\n if (need_rotation) {\n GsWebGLUtility.GetMatrixFromCameraD(to, co, uo, translation, matrix_old);\n GsWebGLUtility.GetMatrixFromCameraD(tn, cn, un, translation, matrix_new);\n } else {\n position_move_delta[X] = cn[X] - co[X];\n position_move_delta[Y] = cn[Y] - co[Y];\n position_move_delta[Z] = cn[Z] - co[Z];\n }\n var matrix_interim = new Float64Array(16);\n var quat_old = new Float64Array(4);\n var quat_new = new Float64Array(4);\n var quat_interim = new Float64Array(4);\n if (need_rotation) {\n GsWebGLUtility.MatrixToQuaternionD(matrix_old, quat_old);\n GsWebGLUtility.MatrixToQuaternionD(matrix_new, quat_new);\n }\n var target_move_delta = new Float64Array([tn[X] - to[X], tn[Y] - to[Y], tn[Z] - to[Z]]);\n var field_width_delta = widthn - widtho;\n var field_height_delta = heightn - heighto;\n var dot1, dot2;\n if (need_rotation) {\n dot1 = (quat_old[0] - quat_new[0]) * (quat_old[0] - quat_new[0]) + (quat_old[1] - quat_new[1]) * (quat_old[1] - quat_new[1]) + (quat_old[2] - quat_new[2]) * (quat_old[2] - quat_new[2]) + (quat_old[3] - quat_new[3]) * (quat_old[3] - quat_new[3]);\n dot2 = (quat_old[0] + quat_new[0]) * (quat_old[0] + quat_new[0]) + (quat_old[1] + quat_new[1]) * (quat_old[1] + quat_new[1]) + (quat_old[2] + quat_new[2]) * (quat_old[2] + quat_new[2]) + (quat_old[3] + quat_new[3]) * (quat_old[3] + quat_new[3]);\n if (dot2 < dot1) {\n quat_new[0] = -quat_new[0];\n quat_new[1] = -quat_new[1];\n quat_new[2] = -quat_new[2];\n quat_new[3] = -quat_new[3];\n }\n }\n var position = new Float64Array(3);\n var up_vector = new Float64Array(3);\n var total_duration = vi._smoothTransitionDuration;\n var q, current_time;\n var total_time_start = Date.now();\n total_time_start -= 100;\n function tick() {\n current_time = Date.now();\n q = (current_time - total_time_start) / total_duration;\n if (q >= 1.0) {\n q = 1.0;\n }\n q = GsWebGLUtility.EaseInEaseOut(q, 0.49, 0.02, 0.49);\n if (q < 0) {\n q = 0;\n }\n if (need_rotation) {\n var to2 = new Float64Array([to[X] + q * target_move_delta[X], to[Y] + q * target_move_delta[Y], to[Z] + q * target_move_delta[Z]]);\n GsWebGLUtility.TransitionQuaternionD(quat_old, quat_new, q, quat_interim);\n GsWebGLUtility.QuaternionToMatrixD(quat_interim, matrix_interim);\n position[X] = to2[X] - matrix_interim[8] * (length + length_delta * q);\n position[Y] = to2[Y] - matrix_interim[9] * (length + length_delta * q);\n position[Z] = to2[Z] - matrix_interim[10] * (length + length_delta * q);\n up_vector[X] = matrix_interim[4];\n up_vector[Y] = matrix_interim[5];\n up_vector[Z] = matrix_interim[6];\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Position(position);\n JS_Set_Camera_Up(up_vector);\n }\n JS_Close_Segment();\n } else {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Position(new Float64Array([co[X] + q * position_move_delta[X], co[Y] + q * position_move_delta[Y], co[Z] + q * position_move_delta[Z]]));\n }\n JS_Close_Segment();\n }\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Target(new Float64Array([to[X] + q * target_move_delta[X], to[Y] + q * target_move_delta[Y], to[Z] + q * target_move_delta[Z]]));\n }\n JS_Close_Segment();\n var fw = widtho + q * field_width_delta;\n var fh = heighto + q * field_height_delta;\n if (fw > 0.00001 && fh > 0.00001) {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Field(fw, fh);\n }\n JS_Close_Segment();\n q = (current_time - total_time_start) / total_duration;\n vi.exeSceneCameraChanging(CameraChangeType.Scale | CameraChangeType.Rotate | CameraChangeType.Translate);\n vi.updateDisplay();\n vi.exeSceneCameraChanged(CameraChangeType.Scale | CameraChangeType.Rotate | CameraChangeType.Translate);\n }\n if (q < 1.0 - GsWebGLUtility.EPSILON) {\n requestAnimationFrame(tick);\n } else {\n JS_Open_Segment_By_Key(vi._sceneKey);\n {\n JS_Set_Camera_Position(cn);\n JS_Set_Camera_Target(tn);\n JS_Set_Camera_Up(un);\n JS_Set_Camera_Field(widthn, heightn);\n }\n JS_Close_Segment();\n vi.exeSceneCameraChanging(CameraChangeType.Rotate | CameraChangeType.Scale);\n requestAnimationFrame(function () {\n vi.updateDisplay();\n });\n vi.exeSceneCameraChanged(CameraChangeType.Rotate | CameraChangeType.Scale);\n vi.isBusy = false;\n }\n }\n requestAnimationFrame(tick);\n };\n GsWebGLUtility.GetMatrixFromCamera = function (target, position, up_vector, translation, matrix) {\n var view_vector = new Float32Array([target[0] - position[0], target[1] - position[1], target[2] - position[2]]);\n gs_math_1.Vector.normalize(view_vector);\n gs_math_1.Vector.normalize(up_vector);\n var cross1 = gs_math_1.Vector.cross(up_vector, view_vector);\n matrix[0] = cross1[0];\n matrix[1] = cross1[1];\n matrix[2] = cross1[2];\n matrix[3] = 0.0;\n var cross2 = gs_math_1.Vector.cross(view_vector, cross1);\n matrix[4] = cross2[0];\n matrix[5] = cross2[1];\n matrix[6] = cross2[2];\n matrix[7] = 0.0;\n matrix[8] = view_vector[0];\n matrix[9] = view_vector[1];\n matrix[10] = view_vector[2];\n matrix[11] = 0.0;\n matrix[12] = translation[0];\n matrix[13] = translation[1];\n matrix[14] = translation[2];\n matrix[15] = 1.0;\n };\n GsWebGLUtility.GetMatrixFromCameraD = function (target, position, up_vector, translation, matrix) {\n var view_vector = new Float64Array([target[0] - position[0], target[1] - position[1], target[2] - position[2]]);\n gs_math_1.DVector.normalize(view_vector);\n gs_math_1.DVector.normalize(up_vector);\n var cross1 = gs_math_1.DVector.cross(up_vector, view_vector);\n matrix[0] = cross1[0];\n matrix[1] = cross1[1];\n matrix[2] = cross1[2];\n matrix[3] = 0.0;\n var cross2 = gs_math_1.DVector.cross(view_vector, cross1);\n matrix[4] = cross2[0];\n matrix[5] = cross2[1];\n matrix[6] = cross2[2];\n matrix[7] = 0.0;\n matrix[8] = view_vector[0];\n matrix[9] = view_vector[1];\n matrix[10] = view_vector[2];\n matrix[11] = 0.0;\n matrix[12] = translation[0];\n matrix[13] = translation[1];\n matrix[14] = translation[2];\n matrix[15] = 1.0;\n };\n GsWebGLUtility.MatrixToQuaternion = function (matrix, quaternion) {\n var tr, s;\n var i, j, k;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n tr = matrix[0] + matrix[5] + matrix[10];\n if (tr > 0.0) {\n s = Math.sqrt(tr + 1.0);\n quaternion[W] = s * 0.5;\n s = 0.5 / s;\n quaternion[X] = (matrix[6] - matrix[9]) * s;\n quaternion[Y] = (matrix[8] - matrix[2]) * s;\n quaternion[Z] = (matrix[1] - matrix[4]) * s;\n } else {\n i = X;\n if (matrix[Y * 4 + Y] > matrix[X * 4 + X]) {\n i = Y;\n }\n if (matrix[Z * 4 + Z] > matrix[i * 4 + i]) {\n i = Z;\n }\n var nxt = new Int32Array([Y, Z, X]);\n j = nxt[i];\n k = nxt[j];\n s = Math.sqrt(matrix[i * 4 + i] - (matrix[j * 4 + j] + matrix[k * 4 + k]) + 1.0);\n quaternion[i] = s * 0.5;\n s = 0.5 / s;\n quaternion[W] = (matrix[j * 4 + k] - matrix[k * 4 + j]) * s;\n quaternion[j] = (matrix[i * 4 + j] + matrix[j * 4 + i]) * s;\n quaternion[k] = (matrix[i * 4 + k] + matrix[k * 4 + i]) * s;\n }\n };\n GsWebGLUtility.MatrixToQuaternionD = function (matrix, quaternion) {\n var tr, s;\n var i, j, k;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n tr = matrix[0] + matrix[5] + matrix[10];\n if (tr > 0.0) {\n s = Math.sqrt(tr + 1.0);\n quaternion[W] = s * 0.5;\n s = 0.5 / s;\n quaternion[X] = (matrix[6] - matrix[9]) * s;\n quaternion[Y] = (matrix[8] - matrix[2]) * s;\n quaternion[Z] = (matrix[1] - matrix[4]) * s;\n } else {\n i = X;\n if (matrix[Y * 4 + Y] > matrix[X * 4 + X]) {\n i = Y;\n }\n if (matrix[Z * 4 + Z] > matrix[i * 4 + i]) {\n i = Z;\n }\n var nxt = new Int32Array([Y, Z, X]);\n j = nxt[i];\n k = nxt[j];\n s = Math.sqrt(matrix[i * 4 + i] - (matrix[j * 4 + j] + matrix[k * 4 + k]) + 1.0);\n quaternion[i] = s * 0.5;\n s = 0.5 / s;\n quaternion[W] = (matrix[j * 4 + k] - matrix[k * 4 + j]) * s;\n quaternion[j] = (matrix[i * 4 + j] + matrix[j * 4 + i]) * s;\n quaternion[k] = (matrix[i * 4 + k] + matrix[k * 4 + i]) * s;\n }\n };\n GsWebGLUtility.PA = function (t, m, a) {\n return t * t * 0.5 * m / a;\n };\n GsWebGLUtility.PB = function (t, m, a) {\n return GsWebGLUtility.PA(a, m, a) + (t - a) * m;\n };\n GsWebGLUtility.PC = function (t, m, a, b, c) {\n return GsWebGLUtility.PB(a + b, m, a) + (t - (a + b)) * m * (1.0 - 0.5 * (t - (a + b)) / c);\n };\n GsWebGLUtility.EaseInEaseOut = function (t, a, b, c) {\n var res;\n var m = 2.0 / (a + 2.0 * b + c);\n if (t <= a) {\n res = GsWebGLUtility.PA(t, m, a);\n } else if (t >= a && t <= a + b) {\n res = GsWebGLUtility.PB(t, m, a);\n } else {\n res = GsWebGLUtility.PC(t, m, a, b, c);\n }\n if (res > 1.0) {\n res = 1.0;\n }\n return res;\n };\n GsWebGLUtility.H_ACOS = function (x) {\n return x < -1 ? Math.PI : x > 1 ? 0 : Math.acos(x);\n };\n GsWebGLUtility.H_ASIN = function (x) {\n return x < -1 ? -Math.PI / 2 : x > 1 ? Math.PI / 2 : Math.asin(x);\n };\n GsWebGLUtility.TransitionQuaternion = function (quat_old, quat_new, t, qt) {\n var omega, cosom, sinom, sclp, sclq;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n cosom = quat_old[X] * quat_new[X] + quat_old[Y] * quat_new[Y] + quat_old[Z] * quat_new[Z] + quat_old[W] * quat_new[W];\n if (1.0 + cosom > GsWebGLUtility.EPSILON) {\n if (1.0 - cosom > GsWebGLUtility.EPSILON) {\n omega = GsWebGLUtility.H_ACOS(cosom);\n sinom = Math.sin(omega);\n sclp = Math.sin((1.0 - t) * omega) / sinom;\n sclq = Math.sin(t * omega) / sinom;\n } else {\n sclp = 1.0 - t;\n sclq = t;\n }\n for (var i = 0; i < 4; i++) {\n qt[i] = sclp * quat_old[i] + sclq * quat_new[i];\n }\n } else {\n qt[X] = -quat_old[Y];\n qt[Y] = quat_old[X];\n qt[Z] = -quat_old[W];\n qt[W] = quat_old[Z];\n sclp = Math.sin((1.0 - t) * Math.PI / 2);\n sclq = Math.sin(t * Math.PI / 2);\n for (var i = 0; i < 3; i++) {\n qt[i] = sclp * quat_old[i] + sclq * qt[i];\n }\n }\n };\n GsWebGLUtility.TransitionQuaternionD = function (quat_old, quat_new, t, qt) {\n var omega, cosom, sinom, sclp, sclq;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n cosom = quat_old[X] * quat_new[X] + quat_old[Y] * quat_new[Y] + quat_old[Z] * quat_new[Z] + quat_old[W] * quat_new[W];\n if (1.0 + cosom > GsWebGLUtility.EPSILON) {\n if (1.0 - cosom > GsWebGLUtility.EPSILON) {\n omega = GsWebGLUtility.H_ACOS(cosom);\n sinom = Math.sin(omega);\n sclp = Math.sin((1.0 - t) * omega) / sinom;\n sclq = Math.sin(t * omega) / sinom;\n } else {\n sclp = 1.0 - t;\n sclq = t;\n }\n for (var i = 0; i < 4; i++) {\n qt[i] = sclp * quat_old[i] + sclq * quat_new[i];\n }\n } else {\n qt[X] = -quat_old[Y];\n qt[Y] = quat_old[X];\n qt[Z] = -quat_old[W];\n qt[W] = quat_old[Z];\n sclp = Math.sin((1.0 - t) * Math.PI / 2);\n sclq = Math.sin(t * Math.PI / 2);\n for (var i = 0; i < 3; i++) {\n qt[i] = sclp * quat_old[i] + sclq * qt[i];\n }\n }\n };\n GsWebGLUtility.QuaternionToMatrix = function (quaternion, matrix) {\n var s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n s = 2.0 / (quaternion[X] * quaternion[X] + quaternion[Y] * quaternion[Y] + quaternion[Z] * quaternion[Z] + quaternion[W] * quaternion[W]);\n xs = quaternion[X] * s;\n ys = quaternion[Y] * s;\n zs = quaternion[Z] * s;\n wx = quaternion[W] * xs;\n wy = quaternion[W] * ys;\n wz = quaternion[W] * zs;\n xx = quaternion[X] * xs;\n xy = quaternion[X] * ys;\n xz = quaternion[X] * zs;\n yy = quaternion[Y] * ys;\n yz = quaternion[Y] * zs;\n zz = quaternion[Z] * zs;\n matrix[0] = 1.0 - (yy + zz);\n matrix[1] = xy + wz;\n matrix[2] = xz - wy;\n matrix[3] = 0.0;\n matrix[4] = xy - wz;\n matrix[5] = 1.0 - (xx + zz);\n matrix[6] = yz + wx;\n matrix[7] = 0.0;\n matrix[8] = xz + wy;\n matrix[9] = yz - wx;\n matrix[10] = 1.0 - (xx + yy);\n matrix[11] = 0.0;\n matrix[12] = 0.0;\n matrix[13] = 0.0;\n matrix[14] = 0.0;\n matrix[15] = 1.0;\n };\n GsWebGLUtility.QuaternionToMatrixD = function (quaternion, matrix) {\n var s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;\n var X = 0;\n var Y = 1;\n var Z = 2;\n var W = 3;\n s = 2.0 / (quaternion[X] * quaternion[X] + quaternion[Y] * quaternion[Y] + quaternion[Z] * quaternion[Z] + quaternion[W] * quaternion[W]);\n xs = quaternion[X] * s;\n ys = quaternion[Y] * s;\n zs = quaternion[Z] * s;\n wx = quaternion[W] * xs;\n wy = quaternion[W] * ys;\n wz = quaternion[W] * zs;\n xx = quaternion[X] * xs;\n xy = quaternion[X] * ys;\n xz = quaternion[X] * zs;\n yy = quaternion[Y] * ys;\n yz = quaternion[Y] * zs;\n zz = quaternion[Z] * zs;\n matrix[0] = 1.0 - (yy + zz);\n matrix[1] = xy + wz;\n matrix[2] = xz - wy;\n matrix[3] = 0.0;\n matrix[4] = xy - wz;\n matrix[5] = 1.0 - (xx + zz);\n matrix[6] = yz + wx;\n matrix[7] = 0.0;\n matrix[8] = xz + wy;\n matrix[9] = yz - wx;\n matrix[10] = 1.0 - (xx + yy);\n matrix[11] = 0.0;\n matrix[12] = 0.0;\n matrix[13] = 0.0;\n matrix[14] = 0.0;\n matrix[15] = 1.0;\n };\n GsWebGLUtility.browserType = function () {\n var explorer = window.navigator.userAgent,\n compare = function compare(s) {\n return explorer.indexOf(s) >= 0;\n },\n ie11 = function () {\n return \"ActiveXObject\" in window;\n }();\n if (compare(\"MSIE\") || ie11) {\n return \"ie\";\n } else if (compare(\"Edge\") && !ie11) {\n return \"Edge\";\n } else if (compare(\"Firefox\") && !ie11) {\n return \"Firefox\";\n } else if (compare(\"Chrome\") && !ie11) {\n return \"Chrome\";\n } else if (compare(\"Opera\") && !ie11) {\n return \"Opera\";\n } else if (compare(\"Safari\") && !ie11) {\n return \"Safari\";\n }\n };\n GsWebGLUtility.EPSILON = 0.00001;\n return GsWebGLUtility;\n }();\n exports.GsWebGLUtility = GsWebGLUtility;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wYWNrYWdlcy9sb25nYW4vc3JjL2xvbmdhbi9ncy52aWV3ZXIudHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBO0FBbW5ZQTtBQWxuWUE7QUFtbllBO0FBbG5ZQTtBQW1uWUE7QUFqbllBO0FBa25ZQTtBQWhuWUE7QUFpbllBO0FBaG5ZQTtBQWluWUE7QUFobllBO0FBaW5ZQTtBQWhuWUE7QUFpbllBO0FBaG5ZQTtBQWluWUE7QUFobllBO0FBaW5ZQTtBQWhuWUE7QUFpbllBO0FBaG5ZQTtBQWluWUE7QUFobllBO0FBaW5ZQTtBQWhuWUE7QUFpbllBO0FBaG5ZQTtBQWluWUE7QUFobllBO0FBaW5ZQTtBQWhuWUE7QUFpbllBO0FBaG5ZQTtBQWluWUE7QUFobllBO0FBaW5ZQTtBQWhuWUE7QUFpbllBO0FBaG5ZQTtBQWluWUE7QUFobllBO0FBaW5ZQTtBQWhuWUE7QUFpbllBO0FBaG5ZQTtBQWluWUE7QUEvbVlBO0FBZ25ZQTtBQS9tWUE7QUFnbllBO0FBL21ZQTtBQWduWUE7QUEvbVlBO0FBZ25ZQTtBQS9tWUE7QUFnbllBO0FBOW1ZQTtBQSttWUE7QUE3bVlBO0FBOG1ZQTtBQTVtWUE7QUE2bVlBO0FBM21ZQTtBQTZtWUE7QUExbVlBO0FBNm1ZQTtBQTNtWUE7QUE0bVlBO0FBM21ZQTtBQTRtWUE7QUEzbVlBO0FBNG1ZQTtBQTFtWUE7QUEybVlBO0FBMW1ZQTtBQTJtWUE7QUF6bVlBO0FBMG1ZQTtBQXhtWUE7QUF5bVlBO0FBdm1ZQTtBQXdtWUE7QUF0bVlBO0FBdW1ZQTtBQXJtWUE7QUFzbVlBO0FBbm1ZQTtBQUVBO0FBRUE7QUFrbVlBO0FBam1ZQTtBQW1tWUE7QUFsbVlBO0FBbW1ZQTtBQWxtWUE7QUFtbVlBO0FBN2xZQTtBQThsWUE7QUE1bFlBO0FBRUE7QUE0bFlBO0FBMWxZQTtBQTJsWUE7QUF2bFlBO0FBd2xZQTtBQXBsWUE7QUFxbFlBO0FBbmxZQTtBQW9sWUE7QUFsbFlBO0FBbWxZQTtBQWpsWUE7QUFrbFlBO0FBaGxZQTtBQXlrWUE7QUF4a1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWlsWUE7QUFobFlBO0FBaWxZQTtBQWhsWUE7QUFpbFlBO0FBaGxZQTtBQWlsWUE7QUFobFlBO0FBaWxZQTtBQWhsWUE7QUFpbFlBO0FBaGxZQTtBQWlsWUE7QUFobFlBO0FBaWxZQTtBQWhsWUE7QUEyaFlBO0FBMWhZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBL2tZQTtBQWdsWUE7QUEva1lBO0FBZ2xZQTtBQS9rWUE7QUFnbFlBO0FBOWtZQTtBQStrWUE7QUE5a1lBO0FBK2tZQTtBQTlrWUE7QUEra1lBO0FBOWtZQTtBQStrWUE7QUE5a1lBO0FBK2tZQTtBQXprWUE7QUEwa1lBO0FBbmtZQTtBQXFrWUE7QUE3allBO0FBNGpZQTtBQXRqWUE7QUF3allBO0FBdmpZQTtBQXdqWUE7QUF0allBO0FBdWpZQTtBQXJqWUE7QUFzallBO0FBcmpZQTtBQXNqWUE7QUFuallBO0FBb2pZQTtBQWpqWUE7QUFrallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWlqWUE7QUFoallBO0FBaWpZQTtBQWhqWUE7QUE4aVlBO0FBN2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQS9pWUE7QUFnallBO0FBL2lZQTtBQWdqWUE7QUEvaVlBO0FBZ2pZQTtBQTlpWUE7QUEraVlBO0FBOWlZQTtBQStpWUE7QUE5aVlBO0FBK2lZQTtBQTlpWUE7QUEraVlBO0FBOWlZQTtBQStpWUE7QUE5aVlBO0FBK2lZQTtBQTlpWUE7QUEraVlBO0FBOWlZQTtBQStpWUE7QUE5aVlBO0FBK2lZQTtBQTlpWUE7QUEraVlBO0FBOWlZQTtBQStpWUE7QUE5aVlBO0FBK2lZQTtBQTlpWUE7QUEraVlBO0FBOWlZQTtBQStpWUE7QUE5aVlBO0FBK2lZQTtBQTdpWUE7QUE4aVlBO0FBNWlZQTtBQTZpWUE7QUE1aVlBO0FBNmlZQTtBQTVpWUE7QUE2aVlBO0FBNWlZQTtBQTZpWUE7QUE1aVlBO0FBNmlZQTtBQTVpWUE7QUE2aVlBO0FBNWlZQTtBQTZpWUE7QUE1aVlBO0FBNmlZQTtBQTVpWUE7QUE2aVlBO0FBNWlZQTtBQTZpWUE7QUE1aVlBO0FBNmlZQTtBQTVpWUE7QUE2aVlBO0FBNWlZQTtBQTZpWUE7QUE1aVlBO0FBNmlZQTtBQTVpWUE7QUE2aVlBO0FBNWlZQTtBQTZpWUE7QUE1aVlBO0FBNmlZQTtBQTVpWUE7QUE2aVlBO0FBNWlZQTtBQTZpWUE7QUEzaVlBO0FBNGlZQTtBQTNpWUE7QUE0aVlBO0FBM2lZQTtBQTRpWUE7QUExaVlBO0FBMmlZQTtBQXppWUE7QUEwaVlBO0FBemlZQTtBQTBpWUE7QUF6aVlBO0FBMGlZQTtBQXppWUE7QUEwaVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUEwaVlBO0FBemlZQTtBQXdpWUE7QUF2aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBeGlZQTtBQXlpWUE7QUF4aVlBO0FBeWlZQTtBQXhpWUE7QUF5aVlBO0FBcmlZQTtBQXdpWUE7QUFsaVlBO0FBZ2lZQTtBQTNoWUE7QUE0aFlBO0FBeGhZQTtBQTBoWUE7QUF6aFlBO0FBMGhZQTtBQXpoWUE7QUEwaFlBO0FBemhZQTtBQTBoWUE7QUF6aFlBO0FBMGhZQTtBQXpoWUE7QUEwaFlBO0FBemhZQTtBQTBoWUE7QUF6aFlBO0FBMGhZQTtBQXpoWUE7QUEwaFlBO0FBemhZQTtBQTBoWUE7QUF6aFlBO0FBMGhZQTtBQXpoWUE7QUEwaFlBO0FBemhZQTtBQTBoWUE7QUF6aFlBO0FBMGhZQTtBQXpoWUE7QUEwaFlBO0FBemhZQTtBQTBoWUE7QUF4aFlBO0FBeWhZQTtBQXZoWUE7QUF3aFlBO0FBdGhZQTtBQXVoWUE7QUFyaFlBO0FBc2hZQTtBQXBoWUE7QUFxaFlBO0FBbmhZQTtBQW9oWUE7QUFsaFlBO0FBbWhZQTtBQWxoWUE7QUFtaFlBO0FBOWdZQTtBQStnWUE7QUE3Z1lBO0FBOGdZQTtBQXBnWUE7QUFxZ1lBO0FBcGdZQTtBQXFnWUE7QUFuZ1lBO0FBb2dZQTtBQW5nWUE7QUFvZ1lBO0FBbmdZQTtBQW9nWUE7QUFuZ1lBO0FBb2dZQTtBQW5nWUE7QUFvZ1lBO0FBbmdZQTtBQW9nWUE7QUFsZ1lBO0FBbWdZQTtBQTkvWEE7QUErL1hBO0FBei9YQTtBQTAvWEE7QUF4L1hBO0FBeS9YQTtBQXgvWEE7QUF5L1hBO0FBeC9YQTtBQXkvWEE7QUF4L1hBO0FBeS9YQTtBQXYvWEE7QUF3L1hBO0FBai9YQTtBQWsvWEE7QUFqL1hBO0FBay9YQTtBQWovWEE7QUFrL1hBO0FBaC9YQTtBQWkvWEE7QUEvK1hBO0FBZy9YQTtBQS8rWEE7QUFnL1hBO0FBLytYQTtBQWcvWEE7QUE5K1hBO0FBKytYQTtBQTcrWEE7QUE4K1hBO0FBNytYQTtBQTgrWEE7QUE3K1hBO0FBOCtYQTtBQTcrWEE7QUFFQTtBQTQrWEE7QUEzK1hBO0FBNCtYQTtBQTErWEE7QUEyK1hBO0FBeitYQTtBQTArWEE7QUF4K1hBO0FBeStYQTtBQXYrWEE7QUF3K1hBO0FBdCtYQTtBQXUrWEE7QUF0K1hBO0FBdStYQTtBQXIrWEE7QUFzK1hBO0FBbitYQTtBQW8rWEE7QUFqK1hBO0FBaytYQTtBQWgrWEE7QUFpK1hBO0FBLzlYQTtBQWcrWEE7QUF4OVhBO0FBeTlYQTtBQWo5WEE7QUFrOVhBO0FBMThYQTtBQTI4WEE7QUFsOFhBO0FBbThYQTtBQTM3WEE7QUE0N1hBO0FBcDdYQTtBQXE3WEE7QUFoN1hBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFHQTtBQUdBO0FBSUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBSUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBSUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFPQTs7QUFFQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFPQTs7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFNQTs7QUFFQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFTQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFPQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBUUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBUUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTs7QUFFQTtBQU9BO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBU0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBOztBQUlBO0FBU0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBU0E7QUFDQTtBQUNBOztBQUVBO0FBU0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFRQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQVNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7O0FBR0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFRQTtBQUNBO0FBQ0E7QUFVQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7OztBQUlBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUVBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQVNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFPQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFPQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQU9BO0FBRUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFTQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQVNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQVVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQVVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFPQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBTUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQU9BO0FBRUE7QUFFQTtBQUVBO0FBUUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFPQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOztBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7O0FBRUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBUUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBUUE7QUFDQTs7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBcWtOQTtBQW5rTkE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUVBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQXlNQTtBQUFBO0FBcE1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUlBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBUUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUtBO0FBR0E7QUFFQTtBQUVBO0FBSUE7QUFLQTtBQUtBO0FBSUE7QUFLQTtBQUVBO0FBVUE7QUFFQTtBQXVDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFNQTtBQUVBO0FBQ0E7O0FBS0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7O0FBTUE7QUFFQTtBQUNBOztBQU1BOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBRUE7QUFDQTs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBS0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUdBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQStDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQVFBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBcURBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFHQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQTFkQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBMGJBOzs7O0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7OztBQUlBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFVQTtBQUVBO0FBQ0E7QUFDQTtBQUdBOztBQUFBOzs7QUFJQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUdBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUdBO0FBQ0E7QUFHQTtBQUNBOztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQU9BO0FBQ0E7OztBQUtBO0FBQ0E7QUFDQTs7QUFFQTtBQU9BO0FBQ0E7O0FBSUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUdBO0FBQ0E7QUFHQTtBQUNBOztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQU9BO0FBQ0E7OztBQUtBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7Ozs7OztBQXpOQTtBQUFBOzs7Ozs7OztBQStOQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTs7O0FBSUE7QUFDQTtBQVFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUtBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUtBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQU1BOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7QUFFQTtBQUNBOztBQUdBOztBQUdBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBSUE7QUFVQTtBQUNBO0FBQ0E7QUFRQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFHQTtBQUdBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBR0E7QUFFQTtBQUVBO0FBMEhBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFNQTs7OztBQVVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQWlDQTtBQUlBO0FBRUE7O0FBRUE7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBQ0E7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBcUJBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUlBOztBQUVBO0FBQ0E7QUFDQTs7QUFJQTtBQUNBO0FBSUE7O0FBRUE7QUFHQTtBQUdBO0FBR0E7QUFFQTtBQUNBOztBQUdBOztBQUVBO0FBQ0E7O0FBTUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUVBO0FBQUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWNBO0FBQ0E7OztBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7O0FBR0E7Ozs7O0FBRUE7OztBQU1BO0FBTUE7QUFJQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTs7QUFFQTtBQUVBO0FBRUE7QUFHQTtBQUtBO0FBQUE7QUFNQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOzs7O0FBakRBO0FBQUE7O0FBb0RBO0FBR0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBOztBQUVBO0FBQ0E7O0FBZ0JBO0FBQ0E7QUFHQTtBQUVBOzs7QUFHQTtBQUdBO0FBS0E7QUFHQTtBQUVBO0FBRUE7QUFDQTs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQU1BO0FBR0E7QUFBQTtBQU1BO0FBQ0E7QUFDQTs7QUFJQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBWUE7QUFRQTtBQUNBOzs7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFpQkE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTs7OztBQVFBOzs7OztBQUVBOzs7OztBQXZHQTtBQUFBOztBQStHQTtBQUNBO0FBRUE7O0FBU0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFJQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFHQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBRUE7QUFJQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTs7QUFLQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFLQTtBQUNBOzs7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTs7OztBQXpFQTtBQUFBOztBQTZFQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQVNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBOztBQUdBOztBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFJQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUlBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTs7O0FBT0E7O0FBRUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQVNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBV0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7O0FBRUE7O0FBR0E7QUFDQTs7QUFFQTs7QUFFQTs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBS0E7QUFPQTtBQVNBOztBQUVBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOzs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7OztBQW9EQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBR0E7QUFTQTtBQVVBO0FBQ0E7QUFrQkE7QUFFQTs7O0FBS0E7OztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBOztBQUdBO0FBU0E7QUFVQTtBQUNBO0FBa0JBO0FBRUE7OztBQUtBOzs7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBYUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBUUE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBTUE7QUFJQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFnQkE7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBUUE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBTUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBTUE7QUFJQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFlQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBRUE7QUFDQTtBQUFBOztBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFhQTtBQUNBO0FBRUE7QUFHQTtBQUNBOztBQXdCQTtBQUVBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUlBOztBQUVBO0FBRUE7QUFFQTtBQUdBOztBQUtBO0FBRUE7QUFrQkE7QUFNQTtBQUVBO0FBS0E7QUFNQTtBQUVBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFLQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUVBOztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUVBOztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBOThJQTtBQWc5SUE7QUFRQTtBQVBBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQXZDQTtBQXlDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQWtCQTtBQWRBO0FBZUE7QUFDQTtBQUNBO0FBZkE7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQUE7QUFDQTtBQUNBOzs7O0FBTUE7QUFBQTtBQXRCQTtBQXdCQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQU1BO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQU1BO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQU1BO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQU1BO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBS0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBcFNBO0FBaXVCQTtBQUFBO0FBR0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFPQTs7QUFHQTtBQUNBO0FBQ0E7QUFLQTtBQU1BO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQU1BO0FBTUE7QUFJQTs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFNQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBTUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFJQTtBQUNBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBUUE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBS0E7QUFNQTtBQUNBO0FBQ0E7O0FBUUE7O0FBU0E7QUFDQTtBQUNBOztBQVFBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFNQTs7QUFjQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQU9BO0FBRUE7QUFjQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFPQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBS0E7QUFNQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFNQTtBQU1BO0FBSUE7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBTUE7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQU1BO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBSUE7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQVFBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUtBO0FBTUE7QUFDQTtBQUNBOztBQVFBOztBQVNBO0FBQ0E7QUFDQTs7QUFRQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBR0E7QUFNQTtBQUVBOztBQWtCQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFHQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7O0FBR0E7QUFFQTtBQU9BO0FBRUE7QUFPQTtBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBT0E7QUFNQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUdBO0FBRUE7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUVBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFuaUNBO0FBb2lDQTtBQUFBO0FBcmlDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2JpbWxpZ2h0LXBsYXRmb3JtLy4vcGFja2FnZXMvbG9uZ2FuL3NyYy9sb25nYW4vZ3Mudmlld2VyLnRzPzJhOWEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aCA9IFwiLi9sb25nYW4uZC50c1wiIC8+XHJcbi8vIGltcG9ydCBcIi4vbG9uZ2FuLmQudHNcIlxyXG5pbXBvcnQgeyBBeXNuVGFza01hbmFnZXIgfSBmcm9tIFwiLi4vbWFuYWdlcnMvYXN5blRhc2tNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFByb2Nlc3MgfSBmcm9tIFwiLi4vcHJvY2Vzc1wiO1xyXG5pbXBvcnQgeyBnZXRDb29raWUgfSBmcm9tIFwiLi4vdXRpbHMvY29va2llXCI7XHJcbmltcG9ydCB7IExpc3QsIE51bWJlcktleUxpc3QsIFN0cmluZ0tleUxpc3QgfSBmcm9tIFwiLi9ncy5jb2xsZWN0aW9uc1wiO1xyXG5pbXBvcnQge1xyXG4gIEJvdW5kaW5nQm94LFxyXG4gIERHZW9tZXRyeU9wZXJhdG9ycyxcclxuICBEUG9pbnQsXHJcbiAgRFRvbGVyYW5jZSxcclxuICBEVmVjdG9yLFxyXG4gIERXY3MsXHJcbiAgUG9pbnQsXHJcbiAgVG9sZXJhbmNlLFxyXG4gIFZlY3RvcixcclxufSBmcm9tIFwiLi9ncy5tYXRoXCI7XHJcbmltcG9ydCBJREIgZnJvbSBcIi4vaWRiXCI7XHJcbmltcG9ydCB7IER5bmFtaWNNZW1vcnlUeXBlIH0gZnJvbSBcIi4vc2VnbWVudFwiO1xyXG5pbXBvcnQgeyBDYWxjdWxhdGVOZWFyRmFyIH0gZnJvbSBcIi4vdXRpbGl0eVwiO1xyXG5cclxuaW50ZXJmYWNlIERlY29kaW5nT2JqZWN0IHtcclxuICBtb2RlbElkOiBzdHJpbmc7XHJcbiAgdmVyc2lvbjogbnVtYmVyO1xyXG4gIGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyOyAvL+e7hOeahOWHoOS9leaVsOaNrua1gS5cclxuICBncm91cElkczogc3RyaW5nOyAvL+e7hOeahGlk5YiX6KGoXHJcbiAgZGljdGlvbmFyeTogeyBbaWQ6IHN0cmluZ106IG51bWJlciB9OyAvL2lk5ZKMc2VnS2V555qE5a2X5YW4XHJcbn1cclxuXHJcbmxldCBKU19Jbml0X0RhdGFiYXNlID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luaXRfRGF0YWJhc2U7XHJcbmxldCBKU19GaW5hX0RhdGFiYXNlID0gKHdpbmRvdyBhcyBhbnkpLkpTX0ZpbmFfRGF0YWJhc2U7XHJcbmxldCBKU19Jbml0X011bHRpdGhyZWFkaW5nX1NlcnZpY2VzID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0luaXRfTXVsdGl0aHJlYWRpbmdfU2VydmljZXM7XHJcbmxldCBKU19GaW5hX011bHRpdGhyZWFkaW5nX1NlcnZpY2VzID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0ZpbmFfTXVsdGl0aHJlYWRpbmdfU2VydmljZXM7XHJcbmxldCBKU19PcGVuX1NlZ21lbnQgPSAod2luZG93IGFzIGFueSkuSlNfT3Blbl9TZWdtZW50O1xyXG5sZXQgSlNfT3Blbl9TZWdtZW50X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19PcGVuX1NlZ21lbnRfQnlfS2V5O1xyXG5sZXQgSlNfQ2xvc2VfU2VnbWVudCA9ICh3aW5kb3cgYXMgYW55KS5KU19DbG9zZV9TZWdtZW50O1xyXG5sZXQgSlNfRGVsZXRlX1NlZ21lbnQgPSAod2luZG93IGFzIGFueSkuSlNfRGVsZXRlX1NlZ21lbnQ7XHJcbmxldCBKU19EZWxldGVfU2VnbWVudF9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfRGVsZXRlX1NlZ21lbnRfQnlfS2V5O1xyXG5sZXQgSlNfRGVsZXRlX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19EZWxldGVfQnlfS2V5O1xyXG5sZXQgSlNfQ2xlYXJfR2VvbWV0cnkgPSAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfR2VvbWV0cnk7XHJcbmxldCBKU19DbGVhcl9HZW9tZXRyeV9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfR2VvbWV0cnlfQnlfS2V5O1xyXG5sZXQgSlNfQ2xlYXJfQXR0cmlidXRlcyA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9BdHRyaWJ1dGVzO1xyXG5sZXQgSlNfQ2xlYXJfQXR0cmlidXRlc19CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfQXR0cmlidXRlc19CeV9LZXk7XHJcbmxldCBKU19DbGVhcl9JbmNsdWRlcyA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9JbmNsdWRlcztcclxubGV0IEpTX0NsZWFyX0luY2x1ZGVzX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9JbmNsdWRlc19CeV9LZXk7XHJcbmxldCBKU19DbGVhcl9TdHlsZXMgPSAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfU3R5bGVzO1xyXG5sZXQgSlNfQ2xlYXJfU3R5bGVzX0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9TdHlsZXNfQnlfS2V5O1xyXG5sZXQgSlNfQ2xlYXJfU3Vic2VnbWVudHMgPSAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfU3Vic2VnbWVudHM7XHJcbmxldCBKU19DbGVhcl9TdWJzZWdtZW50c19CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfU3Vic2VnbWVudHNfQnlfS2V5O1xyXG5sZXQgSlNfQ2xlYXJfQWxsID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0FsbDtcclxubGV0IEpTX0NsZWFyX0FsbF9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfQWxsX0J5X0tleTtcclxubGV0IEpTX0luY2x1ZGVfU2VnbWVudF9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfSW5jbHVkZV9TZWdtZW50X0J5X0tleTtcclxubGV0IEpTX0NvbmRpdGlvbmFsX0luY2x1ZGVfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0NvbmRpdGlvbmFsX0luY2x1ZGVfQnlfS2V5O1xyXG5sZXQgSlNfU3R5bGVfU2VnbWVudF9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfU3R5bGVfU2VnbWVudF9CeV9LZXk7XHJcbmxldCBKU19Db25kaXRpb25hbF9TdHlsZV9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfQ29uZGl0aW9uYWxfU3R5bGVfQnlfS2V5O1xyXG5sZXQgSlNfTWFrZV9Db250ZXh0X0N1cnJlbnQgPSAod2luZG93IGFzIGFueSkuSlNfTWFrZV9Db250ZXh0X0N1cnJlbnQ7XHJcbmxldCBKU19VcGRhdGVfRGlzcGxheSA9ICh3aW5kb3cgYXMgYW55KS5KU19VcGRhdGVfRGlzcGxheTtcclxubGV0IEpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5O1xyXG5sZXQgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9XaXRoX0ZyYW1lcmF0ZV9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9XaXRoX0ZyYW1lcmF0ZV9CeV9LZXk7XHJcbmxldCBKU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfVGltZV9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9XaXRoX1RpbWVfQnlfS2V5O1xyXG5sZXQgSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXk7XHJcbmxldCBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleV9UdCA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleV9UdDtcclxuLy8gbGV0IEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9CeV9LZXk7XHJcbmxldCBKU19Bc3luX05lZWRfVXBkYXRlX1ZpZXdfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0FzeW5fTmVlZF9VcGRhdGVfVmlld19CeV9LZXk7XHJcbmxldCBKU19Bc3luX1VwZGF0ZV9DYW1lcmFfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0FzeW5fVXBkYXRlX0NhbWVyYV9CeV9LZXk7XHJcbmxldCBKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleTtcclxubGV0IEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5X1R0ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5X1R0O1xyXG5sZXQgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXk7XHJcbmxldCBKU19Bc3luX1JlbmRlcl9WaWV3X1dpdGhfVGltZV9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQXN5bl9SZW5kZXJfVmlld19XaXRoX1RpbWVfQnlfS2V5O1xyXG5sZXQgSlNfU2hvd19Bc3luX0dlb21ldHJ5X0RhdGFfS2V5cyA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0FzeW5fR2VvbWV0cnlfRGF0YV9LZXlzO1xyXG5sZXQgSlNfU2hvd19Bc3luX1JlbW92ZV9HZW9tZXRyeV9EYXRhX0tleXMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19Bc3luX1JlbW92ZV9HZW9tZXRyeV9EYXRhX0tleXM7XHJcbmxldCBKU19TaG93X0FzeW5fQnVmZmVyX0dlb21ldHJ5X0tleXMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9LZXlzO1xyXG5sZXQgSlNfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0FzeW5fQnVmZmVyX0dlb21ldHJ5X0J5X0tleTtcclxubGV0IEpTX0FzeW5fQnVmZmVyX0dlb21ldHJ5X0J5X0tleV9UdCA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXlfVHQ7XHJcblxyXG5sZXQgSlNfU2hvd19Bc3luX1VuYnVmZmVyX0dlb21ldHJ5X0tleXMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19Bc3luX1VuYnVmZmVyX0dlb21ldHJ5X0tleXM7XHJcbmxldCBKU19Bc3luX1VuYnVmZmVyX0dlb21ldHJ5X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Bc3luX1VuYnVmZmVyX0dlb21ldHJ5X0J5X0tleTtcclxubGV0IEpTX1Nob3dfS2V5X1R5cGUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19LZXlfVHlwZTtcclxubGV0IEpTX1Nob3dfT3duZXJfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT3duZXJfQnlfS2V5O1xyXG5sZXQgSlNfQ29tcHV0ZV9QYXRoID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfUGF0aDtcclxubGV0IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5OiAoXHJcbiAga2V5OiBudW1iZXIsXHJcbiAgaW5fY29vcmRpbmF0ZTogc3RyaW5nLFxyXG4gIGluX3Bvc2l0aW9uOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICBvdXRfY29vcmRpbmF0ZTogc3RyaW5nXHJcbikgPT4gRmxvYXQzMkFycmF5ID0gbnVsbDtcclxubGV0IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfUGF0aCA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X1BhdGg7XHJcbmxldCBKU19EQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfRENvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5O1xyXG5sZXQgSlNfQ29tcHV0ZV9Cb3VuZGluZ2JveF9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQ29tcHV0ZV9Cb3VuZGluZ2JveF9CeV9LZXk7XHJcbmxldCBKU19Db21wdXRlX0JvdW5kaW5nYm94X1dpdGhfVmlzaWJpbGl0eV9CeV9LZXk6IChcclxuICBrZXk6IG51bWJlcixcclxuICBlbGVtZW50X3R5cGVzOiBFbGVtZW50VHlwZVxyXG4pID0+IEZsb2F0MzJBcnJheSA9IG51bGw7XHJcbmxldCBKU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hfQnlfS2V5OiAoXHJcbiAgc2VnX2tleTogbnVtYmVyLFxyXG4gIGtleTogbnVtYmVyXHJcbikgPT4gRmxvYXQzMkFycmF5ID0gbnVsbDtcclxubGV0IEpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveF9CeV9LZXlzID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveF9CeV9LZXlzO1xyXG5sZXQgSlNfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94ZXNfQnlfS2V5cyA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hlc19CeV9LZXlzO1xyXG5sZXQgSlNfQ29tcHV0ZV9TZWdtZW50X0JvdW5kaW5nYm94X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Db21wdXRlX1NlZ21lbnRfQm91bmRpbmdib3hfQnlfS2V5O1xyXG5sZXQgSlNfQ2xlYXJfU2VnbWVudF9Cb3VuZGluZ2JveF9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQ2xlYXJfU2VnbWVudF9Cb3VuZGluZ2JveF9CeV9LZXk7XHJcbmxldCBKU19TaG93X0JvdW5kaW5nQm94X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0JvdW5kaW5nQm94X0J5X0tleTtcclxubGV0IEpTX0NvbXB1dGVfVmlzaWJsZV9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9WaXNpYmxlX0J5X0tleTtcclxubGV0IEpTX1Nob3dfQXR0cmlidXRlX0NvdW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQXR0cmlidXRlX0NvdW50O1xyXG5sZXQgSlNfU2hvd19BdHRyaWJ1dGVfTGlzdCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0F0dHJpYnV0ZV9MaXN0O1xyXG5sZXQgSlNfU2hvd19HZW9tZXRyeV9Db3VudCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0dlb21ldHJ5X0NvdW50O1xyXG5sZXQgSlNfU2hvd19HZW9tZXRyeV9MaXN0ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfR2VvbWV0cnlfTGlzdDtcclxubGV0IEpTX1Nob3dfU3Vic2VnbWVudF9Db3VudCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1N1YnNlZ21lbnRfQ291bnQ7XHJcbmxldCBKU19TaG93X1N1YnNlZ21lbnRfTGlzdCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1N1YnNlZ21lbnRfTGlzdDtcclxubGV0IEpTX1Nob3dfQWxsX1N1YnNlZ21lbnRfQ291bnQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19BbGxfU3Vic2VnbWVudF9Db3VudDtcclxubGV0IEpTX1Nob3dfQWxsX1N1YnNlZ21lbnRfTGlzdCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0FsbF9TdWJzZWdtZW50X0xpc3Q7XHJcbmxldCBKU19TaG93X0luY2x1ZGVfQ291bnQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbmNsdWRlX0NvdW50O1xyXG5sZXQgSlNfU2hvd19JbmNsdWRlX0xpc3QgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbmNsdWRlX0xpc3Q7XHJcbmxldCBKU19TaG93X0luY2x1ZGUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbmNsdWRlO1xyXG5sZXQgSlNfU2hvd19JbmNsdWRlX1NlZ21lbnQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbmNsdWRlX1NlZ21lbnQ7XHJcbmxldCBKU19TaG93X1N0eWxlX0NvdW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3R5bGVfQ291bnQ7XHJcbmxldCBKU19TaG93X1N0eWxlX0xpc3QgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TdHlsZV9MaXN0O1xyXG5sZXQgSlNfU2hvd19TdHlsZSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1N0eWxlO1xyXG5sZXQgSlNfU2hvd19TdHlsZV9TZWdtZW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3R5bGVfU2VnbWVudDtcclxubGV0IEpTX1Nob3dfU2VnbWVudF9OYW1lID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VnbWVudF9OYW1lO1xyXG5sZXQgSlNfU2hvd19TZWdtZW50X1BhdGggPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWdtZW50X1BhdGg7XHJcbmxldCBKU19TZWdtZW50X0V4aXN0cyA9ICh3aW5kb3cgYXMgYW55KS5KU19TZWdtZW50X0V4aXN0cztcclxubGV0IEpTX01vdmVfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX01vdmVfS2V5O1xyXG5sZXQgSlNfTW92ZV9LZXlfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX01vdmVfS2V5X0J5X0tleTtcclxubGV0IEpTX1JlbmFtZV9TZWdtZW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1JlbmFtZV9TZWdtZW50O1xyXG5sZXQgSlNfQWRkX1Byb3BlcnR5X0Jvb2xlYW4gPSAod2luZG93IGFzIGFueSkuSlNfQWRkX1Byb3BlcnR5X0Jvb2xlYW47XHJcbmxldCBKU19BZGRfUHJvcGVydHlfSW50ZWdlciA9ICh3aW5kb3cgYXMgYW55KS5KU19BZGRfUHJvcGVydHlfSW50ZWdlcjtcclxubGV0IEpTX0FkZF9Qcm9wZXJ0eV9Eb3VibGUgPSAod2luZG93IGFzIGFueSkuSlNfQWRkX1Byb3BlcnR5X0RvdWJsZTtcclxubGV0IEpTX0FkZF9Qcm9wZXJ0eV9TdHJpbmcgPSAod2luZG93IGFzIGFueSkuSlNfQWRkX1Byb3BlcnR5X1N0cmluZztcclxubGV0IEpTX0FkZF9Qcm9wZXJ0eV9Kc29uID0gKHdpbmRvdyBhcyBhbnkpLkpTX0FkZF9Qcm9wZXJ0eV9Kc29uO1xyXG5sZXQgSlNfU2hvd19Qcm9wZXJ0eV9UeXBlID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUHJvcGVydHlfVHlwZTtcclxubGV0IEpTX1Nob3dfUHJvcGVydHlfQm9vbGVhbiA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Byb3BlcnR5X0Jvb2xlYW47XHJcbmxldCBKU19TaG93X1Byb3BlcnR5X0ludGVnZXIgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qcm9wZXJ0eV9JbnRlZ2VyO1xyXG5sZXQgSlNfU2hvd19Qcm9wZXJ0eV9Eb3VibGUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qcm9wZXJ0eV9Eb3VibGU7XHJcbmxldCBKU19TaG93X1Byb3BlcnR5X1N0cmluZyA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Byb3BlcnR5X1N0cmluZztcclxubGV0IEpTX1Byb3BlcnR5X0V4aXN0cyA9ICh3aW5kb3cgYXMgYW55KS5KU19Qcm9wZXJ0eV9FeGlzdHM7XHJcbmxldCBKU19SZW1vdmVfUHJvcGVydHkgPSAod2luZG93IGFzIGFueSkuSlNfUmVtb3ZlX1Byb3BlcnR5O1xyXG5sZXQgSlNfQ2xlYXJfUHJvcGVydGllcyA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9Qcm9wZXJ0aWVzO1xyXG5sZXQgSlNfU2hvd19Qcm9wZXJ0aWVzID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUHJvcGVydGllcztcclxubGV0IEpTX1Nob3dfS2V5X0J5X0lkID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfS2V5X0J5X0lkO1xyXG5sZXQgSlNfU2V0X0tleV9JbmRleCA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfS2V5X0luZGV4O1xyXG5sZXQgSlNfU2hvd19LZXlfSW5kZXggPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19LZXlfSW5kZXg7XHJcbmxldCBKU19TaG93X0tleV9UYWcgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19LZXlfVGFnO1xyXG5sZXQgSlNfQ29tcHV0ZV9TZWxlY3Rpb25fQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfU2VsZWN0aW9uX0J5X0tleTtcclxubGV0IEpTX0NvbXB1dGVfU2VsZWN0aW9uX0J5X0FyZWEgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9TZWxlY3Rpb25fQnlfQXJlYTtcclxubGV0IEpTX1Nob3dfU2VsZWN0aW9uX0NvdW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX0NvdW50O1xyXG5sZXQgSlNfU2hvd19TZWxlY3Rpb25fRWxlbWVudCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NlbGVjdGlvbl9FbGVtZW50O1xyXG5sZXQgSlNfU2hvd19TZWxlY3Rpb25fUGF0aCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NlbGVjdGlvbl9QYXRoO1xyXG5sZXQgSlNfU2hvd19TZWxlY3Rpb25fUGF0aF9CeV9LZXlzID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1Nob3dfU2VsZWN0aW9uX1BhdGhfQnlfS2V5cztcclxubGV0IEpTX1Nob3dfU2VsZWN0aW9uX1Bvc2l0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX1Bvc2l0aW9uO1xyXG5sZXQgSlNfU2hvd19TZWxlY3Rpb25fUGFyYW0gPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3Rpb25fUGFyYW07XHJcbmxldCBKU19TaG93X1NlbGVjdGlvbl9JbmRleGVzID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX0luZGV4ZXM7XHJcbmxldCBKU19TaG93X1NlbGVjdGlvbl9UZXN0X0luZm8gPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3Rpb25fVGVzdF9JbmZvO1xyXG5sZXQgSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5czogKFxyXG4gIHZpZXdLZXk6IG51bWJlcixcclxuICBvbmVLZXlzOiBJbnQzMkFycmF5LFxyXG4gIHR3b0tleXM6IEludDMyQXJyYXksXHJcbiAgdHlwZTogQ29sbGlzaW9uVHlwZVxyXG4pID0+IG51bWJlciA9ICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlzO1xyXG5sZXQgSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5OiAoXHJcbiAgdmlld0tleTogbnVtYmVyLFxyXG4gIG9uZUtleTogbnVtYmVyLFxyXG4gIHR3b0tleTogbnVtYmVyLFxyXG4gIHR5cGU6IENvbGxpc2lvblR5cGUsXHJcbiAgb3B0aW9uczogc3RyaW5nXHJcbikgPT4gbnVtYmVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleTtcclxubGV0IEpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleV9UdDogKFxyXG4gIHZpZXdrZXk6IG51bWJlcixcclxuICBvbmVLZXk6IG51bWJlcixcclxuICB0d29LZXk6IG51bWJlcixcclxuICB0eXBlOiBDb2xsaXNpb25UeXBlLFxyXG4gIG5vOiBudW1iZXIsXHJcbiAgb3B0aW9uczogc3RyaW5nXHJcbikgPT4gdm9pZCA9ICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlfVHQ7XHJcbmxldCBKU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlzX1R0OiAoXHJcbiAgdmlld19rZXk6IG51bWJlcixcclxuICBvbmVLZXlzOiBJbnQzMkFycmF5LFxyXG4gIHR3b0tleXM6IEludDMyQXJyYXksXHJcbiAgdHlwZTogQ29sbGlzaW9uVHlwZVxyXG4pID0+IG51bWJlciA9ICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlzX1R0O1xyXG5sZXQgSlNfU2hvd19Db2xsaXNpb25fU3RhdHVzID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ29sbGlzaW9uX1N0YXR1cztcclxubGV0IEpTX1Nob3dfQ29sbGlzaW9uX0NvdW50OiAoKSA9PiBudW1iZXIgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19Db2xsaXNpb25fQ291bnQ7XHJcbmxldCBKU19TaG93X0NvbGxpc2lvbl9FbGVtZW50czogKGluZGV4OiBudW1iZXIpID0+IEludDMyQXJyYXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19Db2xsaXNpb25fRWxlbWVudHM7XHJcbmxldCBKU19TaG93X0NvbGxpc2lvbl9QYXRocyA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbGxpc2lvbl9QYXRocztcclxubGV0IEpTX1Nob3dfQ29sbGlzaW9uX1BhdGhfQnlfS2V5czogKGluZGV4OiBudW1iZXIpID0+IEludDMyQXJyYXlbXSA9IChcclxuICB3aW5kb3cgYXMgYW55XHJcbikuSlNfU2hvd19Db2xsaXNpb25fUGF0aF9CeV9LZXlzO1xyXG5sZXQgSlNfU2hvd19Db2xsaXNpb25fUG9zaXRpb246IChpbmRleDogbnVtYmVyKSA9PiBGbG9hdDMyQXJyYXkgPSAoXHJcbiAgd2luZG93IGFzIGFueVxyXG4pLkpTX1Nob3dfQ29sbGlzaW9uX1Bvc2l0aW9uO1xyXG5sZXQgSlNfU2hvd19Db2xsaXNpb25fVHlwZTogKGluZGV4OiBudW1iZXIpID0+IG51bWJlciA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0NvbGxpc2lvbl9UeXBlO1xyXG5cclxubGV0IEpTX0FkZF9Gb250X0xpYnJhcnkgPSAod2luZG93IGFzIGFueSkuSlNfQWRkX0ZvbnRfTGlicmFyeTtcclxubGV0IEpTX0ZvbnRfTGlicmFyeV9FeGlzdHMgPSAod2luZG93IGFzIGFueSkuSlNfRm9udF9MaWJyYXJ5X0V4aXN0cztcclxubGV0IEpTX1JlbW92ZV9Gb250X0xpYnJhcnkgPSAod2luZG93IGFzIGFueSkuSlNfUmVtb3ZlX0ZvbnRfTGlicmFyeTtcclxubGV0IEpTX0NsZWFyX0ZvbnRfTGlicmFyeSA9ICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9Gb250X0xpYnJhcnk7XHJcbmxldCBKU19TZXRfRHJpdmVyX0NvbmZpZ3MgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X0RyaXZlcl9Db25maWdzO1xyXG5sZXQgSlNfU2V0X0RyaXZlcl9PcHRpb25zID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9Ecml2ZXJfT3B0aW9ucztcclxubGV0IEpTX1Nob3dfRHJpdmVyX09wdGlvbnMgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19Ecml2ZXJfT3B0aW9ucztcclxubGV0IEpTX1Nob3dfT25lX0RyaXZlcl9PcHRpb24gPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfRHJpdmVyX09wdGlvbjtcclxubGV0IEpTX1NldF9TaGFkZXIgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X1NoYWRlcjtcclxubGV0IEpTX1Nob3dfU2hhZGVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2hhZGVyO1xyXG5sZXQgSlNfU2hvd19PbmVfU2hhZGVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX1NoYWRlcjtcclxubGV0IEpTX1VuU2V0X1NoYWRlciA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9TaGFkZXI7XHJcbmxldCBKU19TZXRfVmlld3BvcnQgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X1ZpZXdwb3J0O1xyXG5sZXQgSlNfU2V0X0NhbWVyYSA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ2FtZXJhO1xyXG5sZXQgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ2FtZXJhX1Bvc2l0aW9uO1xyXG5sZXQgSlNfU2V0X0NhbWVyYV9UYXJnZXQgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X0NhbWVyYV9UYXJnZXQ7XHJcbmxldCBKU19TZXRfQ2FtZXJhX1VwID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmFfVXA7XHJcbmxldCBKU19TZXRfQ2FtZXJhX0ZpZWxkID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmFfRmllbGQ7XHJcbmxldCBKU19TZXRfQ2FtZXJhX0V4dGVudCA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ2FtZXJhX0V4dGVudDtcclxubGV0IEpTX1NldF9DYW1lcmFfUHJvamVjdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ2FtZXJhX1Byb2plY3Rpb247XHJcbmxldCBKU19LZWVwX0NhbWVyYV9SYXRpbyA9ICh3aW5kb3cgYXMgYW55KS5KU19LZWVwX0NhbWVyYV9SYXRpbztcclxubGV0IEpTX1Nob3dfQ2FtZXJhID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2FtZXJhO1xyXG5sZXQgSlNfU2hvd19DYW1lcmFfUG9zaXRpb24gPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfUG9zaXRpb247XHJcbmxldCBKU19TaG93X0NhbWVyYV9UYXJnZXQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfVGFyZ2V0O1xyXG5sZXQgSlNfU2hvd19DYW1lcmFfVXAgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfVXA7XHJcbmxldCBKU19TaG93X0NhbWVyYV9GaWVsZCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9GaWVsZDtcclxubGV0IEpTX1Nob3dfQ2FtZXJhX0V4dGVudCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9FeHRlbnQ7XHJcbmxldCBKU19TaG93X0NhbWVyYV9Qcm9qZWN0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2FtZXJhX1Byb2plY3Rpb247XHJcbmxldCBKU19TaG93X0NhbWVyYV9Qcm9qZWN0aW9uX01hdHJpeCA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0NhbWVyYV9Qcm9qZWN0aW9uX01hdHJpeDtcclxubGV0IEpTX1Nob3dfQ2FtZXJhX1ZpZXdfTWF0cml4ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2FtZXJhX1ZpZXdfTWF0cml4O1xyXG5sZXQgSlNfU2hvd19QYXRoX0NhbWVyYV9Qb3NpdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1BhdGhfQ2FtZXJhX1Bvc2l0aW9uO1xyXG5sZXQgSlNfU2hvd19QYXRoX0NhbWVyYV9UYXJnZXQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19QYXRoX0NhbWVyYV9UYXJnZXQ7XHJcbmxldCBKU19Eb2xseV9DYW1lcmEgPSAod2luZG93IGFzIGFueSkuSlNfRG9sbHlfQ2FtZXJhO1xyXG5sZXQgSlNfUm9sbF9DYW1lcmEgPSAod2luZG93IGFzIGFueSkuSlNfUm9sbF9DYW1lcmE7XHJcbmxldCBKU19ab29tX0NhbWVyYSA9ICh3aW5kb3cgYXMgYW55KS5KU19ab29tX0NhbWVyYTtcclxubGV0IEpTX1VuU2V0X0NhbWVyYSA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9DYW1lcmE7XHJcbmxldCBKU19TZXRfQ29sb3IgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X0NvbG9yO1xyXG5sZXQgSlNfVW5TZXRfQ29sb3IgPSAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfQ29sb3I7XHJcbmxldCBKU19VblNldF9PbmVfQ29sb3IgPSAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfT25lX0NvbG9yO1xyXG5sZXQgSlNfU2hvd19Db2xvciA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbG9yO1xyXG5sZXQgSlNfU2hvd19PbmVfQ29sb3IgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfQ29sb3I7XHJcbmxldCBKU19TaG93X0NvbG9yX0J5X1ZhbHVlID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ29sb3JfQnlfVmFsdWU7XHJcbmxldCBKU19TZXRfR2VvbWV0cnlfQ29sb3IgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X0dlb21ldHJ5X0NvbG9yO1xyXG5sZXQgSlNfU2V0X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1NldF9HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZTtcclxubGV0IEpTX1Nob3dfR2VvbWV0cnlfQ29sb3JfQnlfVmFsdWUgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZTtcclxubGV0IEpTX1VuU2V0X0dlb21ldHJ5X0NvbG9yID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X0dlb21ldHJ5X0NvbG9yO1xyXG5sZXQgSlNfU2V0X1Zpc2liaWxpdHkgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X1Zpc2liaWxpdHk7XHJcbmxldCBKU19VblNldF9WaXNpYmlsaXR5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X1Zpc2liaWxpdHk7XHJcbmxldCBKU19VblNldF9PbmVfVmlzaWJpbGl0eSA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9PbmVfVmlzaWJpbGl0eTtcclxubGV0IEpTX1Nob3dfVmlzaWJpbGl0eSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Zpc2liaWxpdHk7XHJcbmxldCBKU19TaG93X09uZV9WaXNpYmlsaXR5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX1Zpc2liaWxpdHk7XHJcbmxldCBKU19TZXRfU2VsZWN0YWJpbGl0eSA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfU2VsZWN0YWJpbGl0eTtcclxubGV0IEpTX1VuU2V0X1NlbGVjdGFiaWxpdHkgPSAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfU2VsZWN0YWJpbGl0eTtcclxubGV0IEpTX1VuU2V0X09uZV9TZWxlY3RhYmlsaXR5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X09uZV9TZWxlY3RhYmlsaXR5O1xyXG5sZXQgSlNfU2hvd19TZWxlY3RhYmlsaXR5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0YWJpbGl0eTtcclxubGV0IEpTX1Nob3dfT25lX1NlbGVjdGFiaWxpdHkgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfU2VsZWN0YWJpbGl0eTtcclxubGV0IEpTX1NldF9Nb2RlbGxpbmdNYXRyaXggPSAod2luZG93IGFzIGFueSkuSlNfU2V0X01vZGVsbGluZ01hdHJpeDtcclxubGV0IEpTX0FwcGVuZF9Nb2RlbGxpbmdNYXRyaXggPSAod2luZG93IGFzIGFueSkuSlNfQXBwZW5kX01vZGVsbGluZ01hdHJpeDtcclxubGV0IEpTX1Nob3dfTW9kZWxsaW5nTWF0cml4ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfTW9kZWxsaW5nTWF0cml4O1xyXG5sZXQgSlNfU2hvd19QYXRoX01vZGVsbGluZ01hdHJpeCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1BhdGhfTW9kZWxsaW5nTWF0cml4O1xyXG5sZXQgSlNfVW5TZXRfTW9kZWxsaW5nTWF0cml4ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X01vZGVsbGluZ01hdHJpeDtcclxubGV0IEpTX1NldF9SZW5kZXJpbmdfT3B0aW9ucyA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfUmVuZGVyaW5nX09wdGlvbnM7XHJcbmxldCBKU19VblNldF9SZW5kZXJpbmdfT3B0aW9ucyA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9SZW5kZXJpbmdfT3B0aW9ucztcclxubGV0IEpTX1VuU2V0X09uZV9SZW5kZXJpbmdfT3B0aW9uID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1VuU2V0X09uZV9SZW5kZXJpbmdfT3B0aW9uO1xyXG5sZXQgSlNfU2hvd19SZW5kZXJpbmdfT3B0aW9ucyA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1JlbmRlcmluZ19PcHRpb25zO1xyXG5sZXQgSlNfU2hvd19PbmVfUmVuZGVyaW5nX09wdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X09uZV9SZW5kZXJpbmdfT3B0aW9uO1xyXG5sZXQgSlNfU2hvd19PbmVfRGVmYXVsdF9SZW5kZXJpbmdfT3B0aW9uID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1Nob3dfT25lX0RlZmF1bHRfUmVuZGVyaW5nX09wdGlvbjtcclxubGV0IEpTX1Nob3dfT25lX1BhdGhfUmVuZGVyaW5nX09wdGlvbiA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X09uZV9QYXRoX1JlbmRlcmluZ19PcHRpb247XHJcbmxldCBKU19TZXRfSGV1cmlzdGljX09wdGlvbnMgPSAod2luZG93IGFzIGFueSkuSlNfU2V0X0hldXJpc3RpY19PcHRpb25zO1xyXG5sZXQgSlNfU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9PbmVfSGV1cmlzdGljX09wdGlvbjtcclxubGV0IEpTX1VuU2V0X0hldXJpc3RpY19PcHRpb25zID0gKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X0hldXJpc3RpY19PcHRpb25zO1xyXG5sZXQgSlNfVW5TZXRfT25lX0hldXJpc3RpY19PcHRpb24gPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfVW5TZXRfT25lX0hldXJpc3RpY19PcHRpb247XHJcbmxldCBKU19TaG93X0hldXJpc3RpY19PcHRpb25zID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSGV1cmlzdGljX09wdGlvbnM7XHJcbmxldCBKU19TaG93X09uZV9IZXVyaXN0aWNfT3B0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX0hldXJpc3RpY19PcHRpb247XHJcbmxldCBKU19TZXRfQ29uZGl0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9Db25kaXRpb247XHJcbmxldCBKU19TaG93X0NvbmRpdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbmRpdGlvbjtcclxubGV0IEpTX1VuU2V0X0NvbmRpdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9Db25kaXRpb247XHJcbmxldCBKU19TZXRfVGV4dF9Gb250ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9UZXh0X0ZvbnQ7XHJcbmxldCBKU19VblNldF9UZXh0X0ZvbnQgPSAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfVGV4dF9Gb250O1xyXG5sZXQgSlNfVW5TZXRfT25lX1RleHRfRm9udCA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9PbmVfVGV4dF9Gb250O1xyXG5sZXQgSlNfU2hvd19UZXh0X0ZvbnQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19UZXh0X0ZvbnQ7XHJcbmxldCBKU19TaG93X09uZV9UZXh0X0ZvbnQgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19PbmVfVGV4dF9Gb250O1xyXG5sZXQgSlNfQXR0cmlidXRlX0V4aXN0cyA9ICh3aW5kb3cgYXMgYW55KS5KU19BdHRyaWJ1dGVfRXhpc3RzO1xyXG5sZXQgSlNfSW1hZ2VfRXhpc3RzID0gKHdpbmRvdyBhcyBhbnkpLkpTX0ltYWdlX0V4aXN0cztcclxubGV0IEpTX1Jlc2l6ZV9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfUmVzaXplX0J5X0tleTtcclxubGV0IEpTX0luc2VydF9NYXJrZXIgPSAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X01hcmtlcjtcclxubGV0IEpTX0VkaXRfTWFya2VyID0gKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfTWFya2VyO1xyXG5sZXQgSlNfU2hvd19NYXJrZXIgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19NYXJrZXI7XHJcbmxldCBKU19JbnNlcnRfUG9pbnRfQ2xvdWQgPSAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X1BvaW50X0Nsb3VkO1xyXG5sZXQgSlNfRWRpdF9Qb2ludF9DbG91ZCA9ICh3aW5kb3cgYXMgYW55KS5KU19FZGl0X1BvaW50X0Nsb3VkO1xyXG5sZXQgSlNfU2hvd19Qb2ludF9DbG91ZCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1BvaW50X0Nsb3VkO1xyXG5sZXQgSlNfSW5zZXJ0X0xpbmUgPSAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X0xpbmU7XHJcbmxldCBKU19TaG93X0xpbmUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19MaW5lO1xyXG5sZXQgSlNfRWRpdF9MaW5lID0gKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfTGluZTtcclxubGV0IEpTX0luc2VydF9Qb2x5bGluZSA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfUG9seWxpbmU7XHJcbmxldCBKU19TaG93X1BvbHlsaW5lX0NvdW50ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUG9seWxpbmVfQ291bnQ7XHJcbmxldCBKU19TaG93X1BvbHlsaW5lID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUG9seWxpbmU7XHJcbmxldCBKU19JbnNlcnRfQ2lyY2xlID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9DaXJjbGU7XHJcbmxldCBKU19TaG93X0NpcmNsZSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NpcmNsZTtcclxubGV0IEpTX0luc2VydF9DeWxpbmRlciA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfQ3lsaW5kZXI7XHJcbmxldCBKU19TaG93X0N5bGluZGVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ3lsaW5kZXI7XHJcbmxldCBKU19JbnNlcnRfUG9seUN5bGluZGVyID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9Qb2x5Q3lsaW5kZXI7XHJcbmxldCBKU19FZGl0X1BvbHlDeWxpbmRlciA9ICh3aW5kb3cgYXMgYW55KS5KU19FZGl0X1BvbHlDeWxpbmRlcjtcclxubGV0IEpTX0luc2VydF9TaGVsbCA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfU2hlbGw7XHJcbmxldCBKU19FZGl0X1NoZWxsID0gKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfU2hlbGw7XHJcbmxldCBKU19TaG93X1NoZWxsX1NpemUgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19TaGVsbF9TaXplO1xyXG5sZXQgSlNfU2hvd19TaGVsbCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NoZWxsO1xyXG5sZXQgSlNfSW5zZXJ0X1RyaWFuZ3VsYXJfU2hlbGwgPSAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X1RyaWFuZ3VsYXJfU2hlbGw7XHJcbmxldCBKU19JbnNlcnRfTWVzaCA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfTWVzaDtcclxubGV0IEpTX0VkaXRfTWVzaF9Qb2ludHMgPSAod2luZG93IGFzIGFueSkuSlNfRWRpdF9NZXNoX1BvaW50cztcclxubGV0IEpTX1Nob3dfTWVzaF9TaXplID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfTWVzaF9TaXplO1xyXG5sZXQgSlNfU2hvd19NZXNoID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfTWVzaDtcclxubGV0IEpTX0luc2VydF9WZWN0b3JfVGV4dCA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfVmVjdG9yX1RleHQ7XHJcbmxldCBKU19JbnNlcnRfUGFyYW1ldHJpY19HZW9tZXRyeTogKFxyXG4gIHR5cGU6IHN0cmluZyxcclxuICBwYXJhbXM6IEZsb2F0NjRBcnJheVxyXG4pID0+IG51bWJlciA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfUGFyYW1ldHJpY19HZW9tZXRyeTtcclxubGV0IEpTX0luc2VydF9QYXJhbWV0cmljX0dlb21ldHJpZXM6IChcclxuICB0eXBlOiBzdHJpbmcsXHJcbiAgcGFyYW1zOiBGbG9hdDY0QXJyYXksXHJcbiAgZ2VvQ291bnQ6IG51bWJlclxyXG4pID0+IG51bWJlciA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfUGFyYW1ldHJpY19HZW9tZXRyaWVzO1xyXG5cclxubGV0IEpTX0VkaXRfUGFyYW1ldHJpY19HZW9tZXRyeTogKFxyXG4gIGtleTogbnVtYmVyLFxyXG4gIHR5cGU6IHN0cmluZyxcclxuICBwYXJhbXM6IEZsb2F0NjRBcnJheVxyXG4pID0+IG51bWJlciA9IG51bGw7XHJcbmxldCBKU19TaG93X1BhcmFtZXRyaWNfR2VvbWV0cnk6IChrZXk6IG51bWJlcikgPT4ge1xyXG4gIHR5cGU6IHN0cmluZztcclxuICBwYXJhbXM6IEZsb2F0NjRBcnJheTtcclxufSA9IG51bGw7XHJcbmxldCBKU19JbnNlcnRfTGlnaHQgPSAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X0xpZ2h0O1xyXG5sZXQgSlNfRWRpdF9MaWdodCA9ICh3aW5kb3cgYXMgYW55KS5KU19FZGl0X0xpZ2h0O1xyXG5sZXQgSlNfU2hvd19MaWdodCA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0xpZ2h0O1xyXG5sZXQgSlNfSW5zZXJ0X0ltYWdlID0gKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9JbWFnZTtcclxubGV0IEpTX1NldF9JbWFnZV9PcHRpb25zID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9JbWFnZV9PcHRpb25zO1xyXG5sZXQgSlNfVW5TZXRfT25lX0ltYWdlX09wdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9PbmVfSW1hZ2VfT3B0aW9uO1xyXG5sZXQgSlNfU2hvd19JbWFnZV9Qb3NpdGlvbiA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0ltYWdlX1Bvc2l0aW9uO1xyXG5sZXQgSlNfU2hvd19JbWFnZV9TaXplID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSW1hZ2VfU2l6ZTtcclxubGV0IEpTX1Nob3dfSW1hZ2VfRGF0YSA9ICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0ltYWdlX0RhdGE7XHJcbmxldCBKU19TaG93X0ltYWdlX09wdGlvbnMgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbWFnZV9PcHRpb25zO1xyXG5sZXQgSlNfU2hvd19PbmVfSW1hZ2VfT3B0aW9uID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX0ltYWdlX09wdGlvbjtcclxubGV0IEpTX1Nob3dfSW1hZ2UgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbWFnZTtcclxubGV0IEpTX0luc2VydF9DdXR0aW5nX1BsYW5lcyA9ICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfQ3V0dGluZ19QbGFuZXM7XHJcbmxldCBKU19FZGl0X0N1dHRpbmdfUGxhbmVzID0gKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfQ3V0dGluZ19QbGFuZXM7XHJcbmxldCBKU19TaG93X0N1dHRpbmdfUGxhbmVzID0gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ3V0dGluZ19QbGFuZXM7XHJcbmxldCBKU19TaG93X0dlb21ldHJ5X1ZlcnRpY2VzX1Bvc2l0aW9uX0J5X0luZGV4ZXMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19HZW9tZXRyeV9WZXJ0aWNlc19Qb3NpdGlvbl9CeV9JbmRleGVzO1xyXG5sZXQgSlNfU2hvd19HZW9tZXRyeV9FbGVtZW50X1R5cGUgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19HZW9tZXRyeV9FbGVtZW50X1R5cGU7XHJcbmxldCBKU19TZXRfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2V0X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzO1xyXG5sZXQgSlNfU2hvd19HZW9tZXRyeV9UZXh0dXJlX0RpbWVuc2lvbiA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0dlb21ldHJ5X1RleHR1cmVfRGltZW5zaW9uO1xyXG5sZXQgSlNfU2hvd19HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TaG93X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzO1xyXG5sZXQgSlNfVW5TZXRfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfVW5TZXRfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHM7XHJcbmxldCBKU19Db21wdXRlX0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0NvbXB1dGVfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHM7XHJcbmxldCBKU19TZXRfR2VvbWV0cnlfTm9ybWFscyA9ICh3aW5kb3cgYXMgYW55KS5KU19TZXRfR2VvbWV0cnlfTm9ybWFscztcclxubGV0IEpTX1Nob3dfR2VvbWV0cnlfTm9ybWFsczogKFxyXG4gIGtleTogbnVtYmVyLFxyXG4gIG9mZnNldDogbnVtYmVyLFxyXG4gIGNvdW50OiBudW1iZXJcclxuKSA9PiBGbG9hdDMyQXJyYXkgPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19HZW9tZXRyeV9Ob3JtYWxzO1xyXG5sZXQgSlNfVW5TZXRfR2VvbWV0cnlfTm9ybWFscyA9ICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9HZW9tZXRyeV9Ob3JtYWxzO1xyXG5cclxubGV0IEpTX0NvbXB1dGVfR2VvbWV0cnlfVGVzc2VsbGF0ZV9EYXRhOiAoXHJcbiAga2V5OiBudW1iZXIsXHJcbiAgaW1hZ2Vfa2V5OiBudW1iZXIsXHJcbiAgb3B0aW9uczogc3RyaW5nXHJcbikgPT4ge1xyXG4gIHBvc2l0aW9uczogRmxvYXQzMkFycmF5O1xyXG4gIGluZGV4ZXM6IEludDMyQXJyYXk7XHJcbiAgbm9ybWFsczogRmxvYXQzMkFycmF5O1xyXG4gIHRleGNvb3JkczogRmxvYXQzMkFycmF5O1xyXG59ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfR2VvbWV0cnlfVGVzc2VsbGF0ZV9EYXRhO1xyXG5sZXQgSlNfQ29tcHV0ZV9HZW9tZXRyeV9EYXRhID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfR2VvbWV0cnlfRGF0YTtcclxubGV0IEpTX01lcmdlX1NoZWxsID0gKHdpbmRvdyBhcyBhbnkpLkpTX01lcmdlX1NoZWxsO1xyXG5cclxubGV0IEpTX0V4dHJ1ZGVfQnlfU2hlbGwgPSAod2luZG93IGFzIGFueSkuSlNfRXh0cnVkZV9CeV9TaGVsbDtcclxubGV0IEpTX1N3ZWVwX0J5X1NoZWxsID0gKHdpbmRvdyBhcyBhbnkpLkpTX1N3ZWVwX0J5X1NoZWxsO1xyXG5sZXQgSlNfRFN3ZWVwX0J5X1NoZWxsID0gKHdpbmRvdyBhcyBhbnkpLkpTX0RTd2VlcF9CeV9TaGVsbDtcclxubGV0IEpTX0RFeHRydWRlX0J5X1NoZWxsID0gKHdpbmRvdyBhcyBhbnkpLkpTX0RFeHRydWRlX0J5X1NoZWxsO1xyXG5sZXQgSlNfUm90YXRlX0J5X1NoZWxsID0gKHdpbmRvdyBhcyBhbnkpLkpTX1JvdGF0ZV9CeV9TaGVsbDtcclxubGV0IEpTX0RSb3RhdGVfQnlfU2hlbGwgPSAod2luZG93IGFzIGFueSkuSlNfRFJvdGF0ZV9CeV9TaGVsbDtcclxuXHJcbmxldCBKU19Db21wdXRlX1JheV9UZXN0OiAoXHJcbiAgdmlld19rZXk6IG51bWJlcixcclxuICBvcmlnaW46IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gIGRpcmVjdDogQXJyYXlMaWtlPG51bWJlcj5cclxuKSA9PiBGbG9hdDMyQXJyYXkgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9SYXlfVGVzdDtcclxubGV0IEpTX0NvbXB1dGVfR2VvbWV0cnlfUmF5X1Rlc3Q6IChcclxuICB2aWV3X2tleTogbnVtYmVyLFxyXG4gIGdlb21fa2V5OiBudW1iZXIsXHJcbiAgb3JpZ2luOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICBkaXJlY3Q6IEFycmF5TGlrZTxudW1iZXI+XHJcbikgPT4gRmxvYXQzMkFycmF5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfR2VvbWV0cnlfUmF5X1Rlc3Q7XHJcbmxldCBKU19Db21wdXRlX0JveF9UZXN0ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQm94X1Rlc3Q7XHJcblxyXG5sZXQgSlNfQ29tcHV0ZV9Qb2x5Z29uX0FyZWEgPSAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Qb2x5Z29uX0FyZWE7XHJcbmxldCBKU19Db21wdXRlX0FyZWE6IChrZXk6IG51bWJlcikgPT4gYW55ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQXJlYTtcclxubGV0IEpTX0NvbXB1dGVfVm9sdW1lOiAoa2V5OiBudW1iZXIpID0+IGFueSA9ICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX1ZvbHVtZTtcclxubGV0IEpTX0lzX1NvbGlkX0dlb21ldHJ5OiAoa2V5OiBudW1iZXIpID0+IGJvb2xlYW4gPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfSXNfU29saWRfR2VvbWV0cnk7XHJcbmxldCBKU19Db21wdXRlX0dlb21ldHJ5X0Rpc3RhbmNlOiAoXHJcbiAgZ2VvbUtleTE6IG51bWJlcixcclxuICBnZW9tS2V5MjogbnVtYmVyLFxyXG4gIHBhdGgxOiBJbnQzMkFycmF5LFxyXG4gIHBhdGgyOiBJbnQzMkFycmF5XHJcbikgPT4gRmxvYXQzMkFycmF5ID0gKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfR2VvbWV0cnlfRGlzdGFuY2U7XHJcblxyXG5sZXQgSlNfU2VnbWVudF9Ub19TdHJlYW0gPSAod2luZG93IGFzIGFueSkuSlNfU2VnbWVudF9Ub19TdHJlYW07XHJcbmxldCBKU19TZWdtZW50X1RvX1N0cmVhbV9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfU2VnbWVudF9Ub19TdHJlYW1fQnlfS2V5O1xyXG5sZXQgSlNfU2VnbWVudF9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbiA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uO1xyXG5sZXQgSlNfU2VnbWVudF9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbl9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2VnbWVudF9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbl9CeV9LZXk7XHJcbmxldCBKU19TdHJlYW1fVG9fU2VnbWVudCA9ICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fVG9fU2VnbWVudDtcclxubGV0IEpTX1N0cmVhbV9Ub19TZWdtZW50X0J5X0tleSA9ICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fVG9fU2VnbWVudF9CeV9LZXk7XHJcbmxldCBKU19TdHJlYW1fVG9fU2VnbWVudF9CeV9LZXlfVHQgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU3RyZWFtX1RvX1NlZ21lbnRfQnlfS2V5X1R0O1xyXG5sZXQgSlNfU3RyZWFtX1dpdGhfQ29tcHJlc3Npb25fVG9fU2VnbWVudF9CeV9LZXkgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU3RyZWFtX1dpdGhfQ29tcHJlc3Npb25fVG9fU2VnbWVudF9CeV9LZXk7XHJcbmxldCBKU19TZWdtZW50X0RhdGFfVG9fU3RyZWFtID0gKHdpbmRvdyBhcyBhbnkpLkpTX1NlZ21lbnRfRGF0YV9Ub19TdHJlYW07XHJcbmxldCBKU19TdHJlYW1fVG9fU2VnbWVudF9EYXRhID0gKHdpbmRvdyBhcyBhbnkpLkpTX1N0cmVhbV9Ub19TZWdtZW50X0RhdGE7XHJcbmxldCBKU19HZW9tZXRyeV9EYXRhX1RvX1N0cmVhbSA9ICh3aW5kb3cgYXMgYW55KS5KU19HZW9tZXRyeV9EYXRhX1RvX1N0cmVhbTtcclxubGV0IEpTX0dlb21ldHJ5X0RhdGFfVG9fU3RyZWFtX1dpdGhfQ29tcHJlc3Npb24gPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfR2VvbWV0cnlfRGF0YV9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbjtcclxubGV0IEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhID0gKHdpbmRvdyBhcyBhbnkpLkpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhO1xyXG5sZXQgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5ID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleTtcclxubGV0IEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXMgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5cztcclxubGV0IEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXNfVHQgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5c19UdDtcclxubGV0IEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX1dpdGhfQ29tcHJlc3Npb24gPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfV2l0aF9Db21wcmVzc2lvbjtcclxubGV0IEpTX0NvcHlfU2VnbWVudF9CeV9LZXkgPSAod2luZG93IGFzIGFueSkuSlNfQ29weV9TZWdtZW50X0J5X0tleTtcclxuXHJcbmxldCBKU19TaG93X0RhdGFiYXNlX0luZm8gPSAod2luZG93IGFzIGFueSkuSlNfU2hvd19EYXRhYmFzZV9JbmZvO1xyXG5sZXQgSlNfU2hvd19BbGxvY2F0ZWRfTWVtb3J5X1NpemUgPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfU2hvd19BbGxvY2F0ZWRfTWVtb3J5X1NpemU7XHJcbmxldCBKU19FeGVjdXRlX1Rhc2tfUG9zdF9Qcm9jZXNzaW5nID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0V4ZWN1dGVfVGFza19Qb3N0X1Byb2Nlc3Npbmc7XHJcblxyXG5sZXQgSlNfQ3JlYXRlX1RleHR1cmU6IChidWZmZXI6IG51bWJlcikgPT4gV2ViR0xUZXh0dXJlID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0NyZWF0ZV9UZXh0dXJlO1xyXG5cclxubGV0IEpTX0Jvb2xlYW5fSW50ZXJzZWN0aW9uX0dyYXBoID0gKHdpbmRvdyBhcyBhbnkpXHJcbiAgLkpTX0Jvb2xlYW5fSW50ZXJzZWN0aW9uX0dyYXBoO1xyXG5sZXQgSlNfQm9vbGVhbl9JbnRlcnNlY3RfUG9seWxpbmVfUG9seWdvbl9YeSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5bGluZV9Qb2x5Z29uX1h5O1xyXG5sZXQgSlNfQm9vbGVhbl9JbnRlcnNlY3RfUG9seWdvbl9Qb2x5Z29uX1h5OiAoXHJcbiAgcG9seWdvbl9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICBwb2x5Z29uX2luZGV4ZXM6IEludDMyQXJyYXksXHJcbiAgdG9vbF9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICB0b29sX2luZGV4ZXM6IEludDMyQXJyYXlcclxuICAvLyByZXN1bHRfcG9pbnRzOiBGbG9hdDY0QXJyYXlcclxuKSA9PiB7IHBvc2l0aW9uczogRmxvYXQ2NEFycmF5OyBpbmRleGVzOiBJbnQzMkFycmF5IH0gPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQm9vbGVhbl9JbnRlcnNlY3RfUG9seWdvbl9Qb2x5Z29uX1h5O1xyXG5sZXQgSlNfQm9vbGVhbl9JbnRlcnNlY3RfR3JhcGhfUG9seWdvbl9YeTogKFxyXG4gIGdyYXBoX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIGdyYXBoX2luZGV4ZXM6IEludDMyQXJyYXksXHJcbiAgdG9vbF9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICB0b29sX2luZGV4ZXM6IEludDMyQXJyYXlcclxuICAvLyByZXN1bHRfcG9pbnRzOiBGbG9hdDY0QXJyYXlcclxuKSA9PiB7IHBvc2l0aW9uczogRmxvYXQ2NEFycmF5OyBpbmRleGVzOiBJbnQzMkFycmF5IH0gPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQm9vbGVhbl9JbnRlcnNlY3RfR3JhcGhfUG9seWdvbl9YeTtcclxubGV0IEpTX0Jvb2xlYW5fU3VidHJhY3RfUG9seWdvbl9Qb2x5Z29uX1h5OiAoXHJcbiAgcG9seWdvbl9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICBwb2x5Z29uX2luZGV4ZXM6IEludDMyQXJyYXksXHJcbiAgdG9vbF9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICB0b29sX2luZGV4ZXM6IEludDMyQXJyYXlcclxuICAvLyByZXN1bHRfcG9pbnRzOiBGbG9hdDY0QXJyYXlcclxuKSA9PiB7IHBvc2l0aW9uczogRmxvYXQ2NEFycmF5OyBpbmRleGVzOiBJbnQzMkFycmF5IH0gPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQm9vbGVhbl9TdWJ0cmFjdF9Qb2x5Z29uX1BvbHlnb25fWHk7XHJcbmxldCBKU19Cb29sZWFuX0N1dF9Qb2x5Z29uX1BvbHlnb25fWHk6IChcclxuICBwb2x5Z29uX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIHBvbHlnb25faW5kZXhlczogSW50MzJBcnJheSxcclxuICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIHRvb2xfaW5kZXhlczogSW50MzJBcnJheVxyXG4gIC8vIHJlc3VsdF9wb2ludHM6IEZsb2F0NjRBcnJheVxyXG4pID0+IHsgcG9zaXRpb25zOiBGbG9hdDY0QXJyYXk7IGluZGV4ZXM6IEludDMyQXJyYXkgfSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19Cb29sZWFuX0N1dF9Qb2x5Z29uX1BvbHlnb25fWHk7XHJcblxyXG5sZXQgSlNfQm9vbGVhbl9TdWJ0cmFjdDogKFxyXG4gIGJsYW5rX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIGJsYW5rX2luZGV4ZXM6IEludDMyQXJyYXksXHJcbiAgdG9vbF9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICB0b29sX2luZGV4ZXM6IEludDMyQXJyYXlcclxuKSA9PiB7IHBvc2l0aW9uczogRmxvYXQ2NEFycmF5OyBpbmRleGVzOiBJbnQzMkFycmF5IH0gPSAod2luZG93IGFzIGFueSlcclxuICAuSlNfQm9vbGVhbl9TdWJ0cmFjdDtcclxuXHJcbmxldCBKU19GZWF0dXJlX0V4dHJ1ZGU6IChcclxuICBwb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICBpbmRleGVzOiBJbnQzMkFycmF5LFxyXG4gIG5vcm1hbDogRmxvYXQ2NEFycmF5LFxyXG4gIG9wdGlvbnM6IHN0cmluZ1xyXG4pID0+IHsgcG9zaXRpb25zOiBGbG9hdDY0QXJyYXk7IGluZGV4ZXM6IEludDMyQXJyYXkgfSA9ICh3aW5kb3cgYXMgYW55KVxyXG4gIC5KU19GZWF0dXJlX0V4dHJ1ZGU7XHJcblxyXG5sZXQgSlNfUGxhbmFyX1BvbHlsaW5lX09mZnNldDogKFxyXG4gIHBvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gIG9mZnNldF92YWx1ZTogbnVtYmVyXHJcbikgPT4gTGlzdDxGbG9hdDY0QXJyYXk+ID0gKHdpbmRvdyBhcyBhbnkpLkpTX1BsYW5hcl9Qb2x5bGluZV9PZmZzZXQ7XHJcblxyXG5sZXQgSlNfSW5pdF9BcGlzID0gZnVuY3Rpb24gKCkge1xyXG4gIC8vIHJlcXVpcmUoXCIuLi8uLi8uLi9wdWJsaWMvanMvbG9uZ2FuL2xvbmdhbi5qc1wiKVxyXG4gIGlmICghSlNfSW5pdF9EYXRhYmFzZSkge1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luaXRfRGF0YWJhc2UgPSBKU19Jbml0X0RhdGFiYXNlID0gX0dTX0luaXRfRGF0YWJhc2U7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRmluYV9EYXRhYmFzZSA9IEpTX0ZpbmFfRGF0YWJhc2UgPSBfR1NfRmluYV9EYXRhYmFzZTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Jbml0X011bHRpdGhyZWFkaW5nX1NlcnZpY2VzID1cclxuICAgICAgSlNfSW5pdF9NdWx0aXRocmVhZGluZ19TZXJ2aWNlcyA9IF9HU19Jbml0X011bHRpdGhyZWFkaW5nX1NlcnZpY2VzO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0ZpbmFfTXVsdGl0aHJlYWRpbmdfU2VydmljZXMgPVxyXG4gICAgICBKU19GaW5hX011bHRpdGhyZWFkaW5nX1NlcnZpY2VzID0gX0dTX0ZpbmFfTXVsdGl0aHJlYWRpbmdfU2VydmljZXM7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfT3Blbl9TZWdtZW50ID0gSlNfT3Blbl9TZWdtZW50ID0gZnVuY3Rpb24gKFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX25hbWUgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCBrZXkgPSBfR1NfT3Blbl9TZWdtZW50KHB0cl9uYW1lKTtcclxuICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19PcGVuX1NlZ21lbnRfQnlfS2V5ID0gSlNfT3Blbl9TZWdtZW50X0J5X0tleSA9XHJcbiAgICAgIF9HU19PcGVuX1NlZ21lbnRfQnlfS2V5O1xyXG5cclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DbG9zZV9TZWdtZW50ID0gSlNfQ2xvc2VfU2VnbWVudCA9IF9HU19DbG9zZV9TZWdtZW50O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0RlbGV0ZV9TZWdtZW50ID0gSlNfRGVsZXRlX1NlZ21lbnQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfbmFtZSA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgX0dTX0RlbGV0ZV9TZWdtZW50KHB0cl9uYW1lKTtcclxuICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19EZWxldGVfQnlfS2V5ID0gSlNfRGVsZXRlX0J5X0tleSA9IF9HU19EZWxldGVfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0dlb21ldHJ5ID0gSlNfQ2xlYXJfR2VvbWV0cnkgPSBfR1NfQ2xlYXJfR2VvbWV0cnk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfR2VvbWV0cnlfQnlfS2V5ID0gSlNfQ2xlYXJfR2VvbWV0cnlfQnlfS2V5ID1cclxuICAgICAgX0dTX0NsZWFyX0dlb21ldHJ5X0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9BdHRyaWJ1dGVzID0gSlNfQ2xlYXJfQXR0cmlidXRlcyA9XHJcbiAgICAgIF9HU19DbGVhcl9BdHRyaWJ1dGVzO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0F0dHJpYnV0ZXNfQnlfS2V5ID0gSlNfQ2xlYXJfQXR0cmlidXRlc19CeV9LZXkgPVxyXG4gICAgICBfR1NfQ2xlYXJfQXR0cmlidXRlc19CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfSW5jbHVkZXMgPSBKU19DbGVhcl9JbmNsdWRlcyA9IF9HU19DbGVhcl9JbmNsdWRlcztcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9JbmNsdWRlc19CeV9LZXkgPSBKU19DbGVhcl9JbmNsdWRlc19CeV9LZXkgPVxyXG4gICAgICBfR1NfQ2xlYXJfSW5jbHVkZXNfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX1N0eWxlcyA9IEpTX0NsZWFyX1N0eWxlcyA9IF9HU19DbGVhcl9TdHlsZXM7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfU3R5bGVzX0J5X0tleSA9IEpTX0NsZWFyX1N0eWxlc19CeV9LZXkgPVxyXG4gICAgICBfR1NfQ2xlYXJfU3R5bGVzX0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9TdWJzZWdtZW50cyA9IEpTX0NsZWFyX1N1YnNlZ21lbnRzID1cclxuICAgICAgX0dTX0NsZWFyX1N1YnNlZ21lbnRzO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX1N1YnNlZ21lbnRzX0J5X0tleSA9IEpTX0NsZWFyX1N1YnNlZ21lbnRzX0J5X0tleSA9XHJcbiAgICAgIF9HU19DbGVhcl9TdWJzZWdtZW50c19CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfQWxsID0gSlNfQ2xlYXJfQWxsID0gX0dTX0NsZWFyX0FsbDtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DbGVhcl9BbGxfQnlfS2V5ID0gSlNfQ2xlYXJfQWxsX0J5X0tleSA9XHJcbiAgICAgIF9HU19DbGVhcl9BbGxfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luY2x1ZGVfU2VnbWVudF9CeV9LZXkgPSBKU19JbmNsdWRlX1NlZ21lbnRfQnlfS2V5ID1cclxuICAgICAgX0dTX0luY2x1ZGVfU2VnbWVudF9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29uZGl0aW9uYWxfSW5jbHVkZV9CeV9LZXkgPVxyXG4gICAgICBKU19Db25kaXRpb25hbF9JbmNsdWRlX0J5X0tleSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlcixcclxuICAgICAgICBjb25kaXRpb25zOiBzdHJpbmdcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChjb25kaXRpb25zKTtcclxuICAgICAgICBfR1NfQ29uZGl0aW9uYWxfSW5jbHVkZV9CeV9LZXkoa2V5LCBwdHIpO1xyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU3R5bGVfU2VnbWVudF9CeV9LZXkgPSBKU19TdHlsZV9TZWdtZW50X0J5X0tleSA9XHJcbiAgICAgIF9HU19TdHlsZV9TZWdtZW50X0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db25kaXRpb25hbF9TdHlsZV9CeV9LZXkgPSBKU19Db25kaXRpb25hbF9TdHlsZV9CeV9LZXkgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIsIGNvbmRpdGlvbnM6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgoY29uZGl0aW9ucyk7XHJcbiAgICAgICAgX0dTX0NvbmRpdGlvbmFsX1N0eWxlX0J5X0tleShrZXksIHB0cik7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0tleV9UeXBlID0gSlNfU2hvd19LZXlfVHlwZSA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IG51bWJlciB7XHJcbiAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0tleV9UeXBlKGtleSwgcHRyKTtcclxuXHJcbiAgICAgIGxldCB0eXBlID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgcmV0dXJuIHR5cGU7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX01ha2VfQ29udGV4dF9DdXJyZW50ID0gSlNfTWFrZV9Db250ZXh0X0N1cnJlbnQgPVxyXG4gICAgICBfR1NfTWFrZV9Db250ZXh0X0N1cnJlbnQ7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVXBkYXRlX0Rpc3BsYXkgPSBKU19VcGRhdGVfRGlzcGxheSA9IF9HU19VcGRhdGVfRGlzcGxheTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VcGRhdGVfVmlld19EaXNwbGF5X0J5X0tleSA9XHJcbiAgICAgIEpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5ID0gX0dTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfV2l0aF9GcmFtZXJhdGVfQnlfS2V5ID1cclxuICAgICAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9XaXRoX0ZyYW1lcmF0ZV9CeV9LZXkgPVxyXG4gICAgICAgIF9HU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfRnJhbWVyYXRlX0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfVGltZV9CeV9LZXkgPVxyXG4gICAgICBKU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfVGltZV9CeV9LZXkgPVxyXG4gICAgICAgIF9HU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfVGltZV9CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXkgPVxyXG4gICAgICBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleSA9XHJcbiAgICAgICAgX0dTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0ID1cclxuICAgICAgSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHQgPVxyXG4gICAgICAgIF9HU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleV9UdDtcclxuICAgIC8vICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9CeV9LZXkgPSBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9CeV9LZXkgPSBfR1NfQXN5bl9VcGRhdGVfR2VvbWV0cnlfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0FzeW5fTmVlZF9VcGRhdGVfVmlld19CeV9LZXkgPVxyXG4gICAgICBKU19Bc3luX05lZWRfVXBkYXRlX1ZpZXdfQnlfS2V5ID0gX0dTX0FzeW5fTmVlZF9VcGRhdGVfVmlld19CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXN5bl9VcGRhdGVfQ2FtZXJhX0J5X0tleSA9XHJcbiAgICAgIEpTX0FzeW5fVXBkYXRlX0NhbWVyYV9CeV9LZXkgPSBfR1NfQXN5bl9VcGRhdGVfQ2FtZXJhX0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleSA9IEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5ID1cclxuICAgICAgX0dTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5X1R0ID1cclxuICAgICAgSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHQgPSBmdW5jdGlvbiAodmlld19rZXk6IG51bWJlcikge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBfR1NfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHQodmlld19rZXkpO1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0FzeW5fUmVuZGVyX1ZpZXdfQnlfS2V5ID0gSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkgPVxyXG4gICAgICBfR1NfQXN5bl9SZW5kZXJfVmlld19CeV9LZXk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXN5bl9SZW5kZXJfVmlld19XaXRoX1RpbWVfQnlfS2V5ID1cclxuICAgICAgSlNfQXN5bl9SZW5kZXJfVmlld19XaXRoX1RpbWVfQnlfS2V5ID1cclxuICAgICAgICBfR1NfQXN5bl9SZW5kZXJfVmlld19XaXRoX1RpbWVfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQXN5bl9HZW9tZXRyeV9EYXRhX0tleXMgPVxyXG4gICAgICBKU19TaG93X0FzeW5fR2VvbWV0cnlfRGF0YV9LZXlzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXJcclxuICAgICAgKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X0FzeW5fR2VvbWV0cnlfRGF0YV9Db3VudCh2aWV3X2tleSwgcHRyX2NvdW50KTtcclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfbGlzdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBjb3VudCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19Bc3luX0dlb21ldHJ5X0RhdGFfS2V5cyh2aWV3X2tleSwgcHRyX2xpc3QpO1xyXG5cclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KGNvdW50KTtcclxuXHJcbiAgICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIC8vICAgcmVzdWx0W2ldID0gTW9kdWxlLkhFQVAzMltwdHJfbGlzdCAvIDQgKyBpXTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkocHRyX2xpc3QgLyA0LCBwdHJfbGlzdCAvIDQgKyBjb3VudClcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9saXN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvdW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0FzeW5fUmVtb3ZlX0dlb21ldHJ5X0RhdGFfS2V5cyA9XHJcbiAgICAgIEpTX1Nob3dfQXN5bl9SZW1vdmVfR2VvbWV0cnlfRGF0YV9LZXlzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXJcclxuICAgICAgKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X0FzeW5fR2VvbWV0cnlfRGF0YV9Db3VudCh2aWV3X2tleSwgcHRyX2NvdW50KTtcclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfbGlzdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBjb3VudCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19Bc3luX1JlbW92ZV9HZW9tZXRyeV9EYXRhX0tleXModmlld19rZXksIHB0cl9saXN0KTtcclxuXHJcbiAgICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheShjb3VudCk7XHJcblxyXG4gICAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAvLyAgIHJlc3VsdFtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2xpc3QgLyA0ICsgaV07XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICByZXN1bHQuc2V0KFxyXG4gICAgICAgICAgICBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KHB0cl9saXN0IC8gNCwgcHRyX2xpc3QgLyA0ICsgY291bnQpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbGlzdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb3VudCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9LZXlzID1cclxuICAgICAgSlNfU2hvd19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9LZXlzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXJcclxuICAgICAgKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X0FzeW5fQnVmZmVyX0dlb21ldHJ5X0NvdW50KHZpZXdfa2V5LCBwdHJfY291bnQpO1xyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNF07XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9saXN0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIGNvdW50KTtcclxuICAgICAgICAgIF9HU19TaG93X0FzeW5fQnVmZmVyX0dlb21ldHJ5X0tleXModmlld19rZXksIHB0cl9saXN0KTtcclxuXHJcbiAgICAgICAgICByZXN1bHQgPSBuZXcgSW50MzJBcnJheShjb3VudCk7XHJcbiAgICAgICAgICByZXN1bHQuc2V0KFxyXG4gICAgICAgICAgICBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KHB0cl9saXN0IC8gNCwgcHRyX2xpc3QgLyA0ICsgY291bnQpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbGlzdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb3VudCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5ID1cclxuICAgICAgSlNfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5ID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXIsXHJcbiAgICAgICAgZ2VvbV9rZXlzOiBJbnQzMkFycmF5XHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChnZW9tX2tleXMgJiYgZ2VvbV9rZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBnZW9tX2tleXMubGVuZ3RoKTtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KGdlb21fa2V5cywgcHRyX2tleXMgLyA0KTtcclxuXHJcbiAgICAgICAgICBfR1NfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5KHZpZXdfa2V5LCBwdHJfa2V5cywgZ2VvbV9rZXlzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9rZXlzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICBKU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXlfVHQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHZpZXdfa2V5OiBudW1iZXIsXHJcbiAgICAgIGdlb21fa2V5czogSW50MzJBcnJheSxcclxuICAgICAgbm86IG51bWJlclxyXG4gICAgKSB7XHJcbiAgICAgIGlmIChnZW9tX2tleXMgJiYgZ2VvbV9rZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgcHRyX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICogZ2VvbV9rZXlzLmxlbmd0aCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoZ2VvbV9rZXlzLCBwdHJfa2V5cyAvIDQpO1xyXG5cclxuICAgICAgICBfR1NfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5X1R0KFxyXG4gICAgICAgICAgdmlld19rZXksXHJcbiAgICAgICAgICBwdHJfa2V5cyxcclxuICAgICAgICAgIGdlb21fa2V5cy5sZW5ndGgsXHJcbiAgICAgICAgICBub1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5cyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5X1R0ID1cclxuICAgICAgSlNfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5X1R0ID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXIsXHJcbiAgICAgICAgZ2VvbV9rZXlzOiBJbnQzMkFycmF5LFxyXG4gICAgICAgIG5vOiBudW1iZXJcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKGdlb21fa2V5cyAmJiBnZW9tX2tleXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGdlb21fa2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoZ2VvbV9rZXlzLCBwdHJfa2V5cyAvIDQpO1xyXG5cclxuICAgICAgICAgIF9HU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXlfVHQoXHJcbiAgICAgICAgICAgIHZpZXdfa2V5LFxyXG4gICAgICAgICAgICBwdHJfa2V5cyxcclxuICAgICAgICAgICAgZ2VvbV9rZXlzLmxlbmd0aCxcclxuICAgICAgICAgICAgbm9cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9rZXlzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Bc3luX1VuYnVmZmVyX0dlb21ldHJ5X0tleXMgPVxyXG4gICAgICBKU19TaG93X0FzeW5fVW5idWZmZXJfR2VvbWV0cnlfS2V5cyA9IGZ1bmN0aW9uIChcclxuICAgICAgICB2aWV3X2tleTogbnVtYmVyXHJcbiAgICAgICk6IEludDMyQXJyYXkge1xyXG4gICAgICAgIGxldCBwdHJfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBfR1NfU2hvd19Bc3luX1VuYnVmZmVyX0dlb21ldHJ5X0NvdW50KHZpZXdfa2V5LCBwdHJfY291bnQpO1xyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNF07XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9saXN0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIGNvdW50KTtcclxuICAgICAgICAgIF9HU19TaG93X0FzeW5fVW5idWZmZXJfR2VvbWV0cnlfS2V5cyh2aWV3X2tleSwgcHRyX2xpc3QpO1xyXG5cclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KGNvdW50KTtcclxuICAgICAgICAgIHJlc3VsdC5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkocHRyX2xpc3QgLyA0LCBwdHJfbGlzdCAvIDQgKyBjb3VudClcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9saXN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvdW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Bc3luX1VuYnVmZmVyX0dlb21ldHJ5X0J5X0tleSA9XHJcbiAgICAgIEpTX0FzeW5fVW5idWZmZXJfR2VvbWV0cnlfQnlfS2V5ID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXIsXHJcbiAgICAgICAgZ2VvbV9rZXlzOiBJbnQzMkFycmF5XHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChnZW9tX2tleXMgJiYgZ2VvbV9rZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBnZW9tX2tleXMubGVuZ3RoKTtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KGdlb21fa2V5cywgcHRyX2tleXMgLyA0KTtcclxuXHJcbiAgICAgICAgICBfR1NfQXN5bl9VbmJ1ZmZlcl9HZW9tZXRyeV9CeV9LZXkoXHJcbiAgICAgICAgICAgIHZpZXdfa2V5LFxyXG4gICAgICAgICAgICBwdHJfa2V5cyxcclxuICAgICAgICAgICAgZ2VvbV9rZXlzLmxlbmd0aFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2tleXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X093bmVyX0J5X0tleSA9IEpTX1Nob3dfT3duZXJfQnlfS2V5ID1cclxuICAgICAgX0dTX1Nob3dfT3duZXJfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfUGF0aCA9IEpTX0NvbXB1dGVfUGF0aCA9IGZ1bmN0aW9uIChcclxuICAgICAgc3RhcnRfa2V5OiBudW1iZXIsXHJcbiAgICAgIGVuZF9rZXk6IG51bWJlcixcclxuICAgICAgY291bnQ6IG51bWJlcixcclxuICAgICAgcGF0aDogSW50MzJBcnJheVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl9wYXRoID0gTW9kdWxlLl9tYWxsb2MoNCAqIDUxMik7XHJcblxyXG4gICAgICBfR1NfQ29tcHV0ZV9QYXRoKHN0YXJ0X2tleSwgZW5kX2tleSwgcHRyX2NvdW50LCBwdHJfcGF0aCk7XHJcblxyXG4gICAgICBsZXQgY28gPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudCAvIDRdO1xyXG4gICAgICBsZXQgcGEgPSBuZXcgRmxvYXQzMkFycmF5KGNvKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbzsgaSsrKSB7XHJcbiAgICAgICAgcGFbaV0gPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudCAvIDQgKyBpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb3VudCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGF0aCk7XHJcblxyXG4gICAgICByZXR1cm4gcGE7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5ID1cclxuICAgICAgSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgICAgaW5fY29vcmRpbmF0ZTogc3RyaW5nLFxyXG4gICAgICAgIGluX3Bvc2l0aW9uOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgICBvdXRfY29vcmRpbmF0ZTogc3RyaW5nXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfaWMgPSBhbGxvY2F0ZVVURjgoaW5fY29vcmRpbmF0ZSk7XHJcbiAgICAgICAgbGV0IHB0cl9vYyA9IGFsbG9jYXRlVVRGOChvdXRfY29vcmRpbmF0ZSk7XHJcbiAgICAgICAgbGV0IHB0cl9pcCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfaXAgLyA0XSA9IGluX3Bvc2l0aW9uWzBdO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9pcCAvIDQgKyAxXSA9IGluX3Bvc2l0aW9uWzFdO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9pcCAvIDQgKyAyXSA9IGluX3Bvc2l0aW9uWzJdO1xyXG4gICAgICAgIGxldCBwdHJfb3AgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29wIC8gNF0gPSAwO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9vcCAvIDQgKyAxXSA9IDA7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29wIC8gNCArIDJdID0gMDtcclxuXHJcbiAgICAgICAgX0dTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KGtleSwgcHRyX2ljLCBwdHJfaXAsIHB0cl9vYywgcHRyX29wKTtcclxuXHJcbiAgICAgICAgbGV0IG91dF9wb3NpdGlvbiA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICAgICAgb3V0X3Bvc2l0aW9uWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX29wIC8gNF07XHJcbiAgICAgICAgb3V0X3Bvc2l0aW9uWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX29wIC8gNCArIDFdO1xyXG4gICAgICAgIG91dF9wb3NpdGlvblsyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9vcCAvIDQgKyAyXTtcclxuXHJcbiAgICAgICAgX2ZyZWUocHRyX2ljKTtcclxuICAgICAgICBfZnJlZShwdHJfb2MpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaXApO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfb3ApO1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0X3Bvc2l0aW9uO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfUGF0aCA9XHJcbiAgICAgIEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfUGF0aCA9IGZ1bmN0aW9uIChcclxuICAgICAgICBwYXRoOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgICBpbl9jb29yZGluYXRlOiBzdHJpbmcsXHJcbiAgICAgICAgaW5fcG9zaXRpb246IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICAgIG91dF9jb29yZGluYXRlOiBzdHJpbmdcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHBjb3VudCA9IHBhdGgubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwdHJfcGF0aCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX3BhdGggLyA0ICsgaV0gPSBwYXRoW2ldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHB0cl9pYyA9IGFsbG9jYXRlVVRGOChpbl9jb29yZGluYXRlKTtcclxuICAgICAgICBsZXQgcHRyX29jID0gYWxsb2NhdGVVVEY4KG91dF9jb29yZGluYXRlKTtcclxuICAgICAgICBsZXQgcHRyX2lwID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9pcCAvIDRdID0gaW5fcG9zaXRpb25bMF07XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2lwIC8gNCArIDFdID0gaW5fcG9zaXRpb25bMV07XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2lwIC8gNCArIDJdID0gaW5fcG9zaXRpb25bMl07XHJcbiAgICAgICAgbGV0IHB0cl9vcCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3AgLyA0XSA9IDA7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29wIC8gNCArIDFdID0gMDtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3AgLyA0ICsgMl0gPSAwO1xyXG5cclxuICAgICAgICBfR1NfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9QYXRoKFxyXG4gICAgICAgICAgcHRyX3BhdGgsXHJcbiAgICAgICAgICBwY291bnQsXHJcbiAgICAgICAgICBwdHJfaWMsXHJcbiAgICAgICAgICBwdHJfaXAsXHJcbiAgICAgICAgICBwdHJfb2MsXHJcbiAgICAgICAgICBwdHJfb3BcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgb3V0X3Bvc2l0aW9uID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgICBvdXRfcG9zaXRpb25bMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfb3AgLyA0XTtcclxuICAgICAgICBvdXRfcG9zaXRpb25bMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfb3AgLyA0ICsgMV07XHJcbiAgICAgICAgb3V0X3Bvc2l0aW9uWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX29wIC8gNCArIDJdO1xyXG5cclxuICAgICAgICBfZnJlZShwdHJfaWMpO1xyXG4gICAgICAgIF9mcmVlKHB0cl9vYyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pcCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9vcCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXRoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dF9wb3NpdGlvbjtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19EQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkgPVxyXG4gICAgICBKU19EQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgICAgaW5fY29vcmRpbmF0ZTogc3RyaW5nLFxyXG4gICAgICAgIGluX3Bvc2l0aW9uczogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgICAgb3V0X2Nvb3JkaW5hdGU6IHN0cmluZ1xyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgY291bnQgPSBpbl9wb3NpdGlvbnMubGVuZ3RoIC8gMztcclxuXHJcbiAgICAgICAgbGV0IHB0cl9pYyA9IGFsbG9jYXRlVVRGOChpbl9jb29yZGluYXRlKTtcclxuICAgICAgICBsZXQgcHRyX29jID0gYWxsb2NhdGVVVEY4KG91dF9jb29yZGluYXRlKTtcclxuICAgICAgICBsZXQgcHRyX2lwID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMgKiBjb3VudCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KG5ldyBGbG9hdDY0QXJyYXkoaW5fcG9zaXRpb25zKSwgcHRyX2lwIC8gOCk7XHJcbiAgICAgICAgbGV0IHB0cl9vcCA9IE1vZHVsZS5fbWFsbG9jKDggKiAzICogY291bnQpO1xyXG5cclxuICAgICAgICBfR1NfRENvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICAgICAga2V5LFxyXG4gICAgICAgICAgcHRyX2ljLFxyXG4gICAgICAgICAgcHRyX2lwLFxyXG4gICAgICAgICAgcHRyX29jLFxyXG4gICAgICAgICAgcHRyX29wLFxyXG4gICAgICAgICAgY291bnRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgb3V0X3Bvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoMyAqIGNvdW50KTtcclxuICAgICAgICBvdXRfcG9zaXRpb25zLnNldChcclxuICAgICAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHB0cl9vcCAvIDgsIHB0cl9vcCAvIDggKyAzICogY291bnQpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgX2ZyZWUocHRyX2ljKTtcclxuICAgICAgICBfZnJlZShwdHJfb2MpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaXApO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfb3ApO1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0X3Bvc2l0aW9ucztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0JvdW5kaW5nYm94X0J5X0tleSA9XHJcbiAgICAgIEpTX0NvbXB1dGVfQm91bmRpbmdib3hfQnlfS2V5ID0gZnVuY3Rpb24gKGtleTogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHB0cl9taW4gPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgICAgbGV0IHB0cl9tYXggPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcblxyXG4gICAgICAgIF9HU19Db21wdXRlX0JvdW5kaW5nYm94X0J5X0tleShrZXksIHB0cl9taW4sIHB0cl9tYXgpO1xyXG5cclxuICAgICAgICBsZXQgYmIgPSBuZXcgRmxvYXQzMkFycmF5KDYpO1xyXG5cclxuICAgICAgICBiYlswXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9taW4gLyA0XTtcclxuICAgICAgICBiYlsxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9taW4gLyA0ICsgMV07XHJcbiAgICAgICAgYmJbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNCArIDJdO1xyXG5cclxuICAgICAgICBiYlszXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXggLyA0XTtcclxuICAgICAgICBiYls0XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXggLyA0ICsgMV07XHJcbiAgICAgICAgYmJbNV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNCArIDJdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX21pbik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9tYXgpO1xyXG5cclxuICAgICAgICByZXR1cm4gYmI7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Cb3VuZGluZ2JveF9XaXRoX1Zpc2liaWxpdHlfQnlfS2V5ID1cclxuICAgICAgSlNfQ29tcHV0ZV9Cb3VuZGluZ2JveF9XaXRoX1Zpc2liaWxpdHlfQnlfS2V5ID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICAgIGVsZW1lbnRfdHlwZXM6IEVsZW1lbnRUeXBlXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfbWluID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICAgIGxldCBwdHJfbWF4ID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG5cclxuICAgICAgICBfR1NfQ29tcHV0ZV9Cb3VuZGluZ2JveF9XaXRoX1Zpc2liaWxpdHlfQnlfS2V5KFxyXG4gICAgICAgICAga2V5LFxyXG4gICAgICAgICAgZWxlbWVudF90eXBlcyxcclxuICAgICAgICAgIHB0cl9taW4sXHJcbiAgICAgICAgICBwdHJfbWF4XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGJiID0gbmV3IEZsb2F0MzJBcnJheSg2KTtcclxuXHJcbiAgICAgICAgYmJbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNF07XHJcbiAgICAgICAgYmJbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNCArIDFdO1xyXG4gICAgICAgIGJiWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDQgKyAyXTtcclxuXHJcbiAgICAgICAgYmJbM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNF07XHJcbiAgICAgICAgYmJbNF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNCArIDFdO1xyXG4gICAgICAgIGJiWzVdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDQgKyAyXTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9taW4pO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbWF4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJiO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveF9CeV9LZXkgPVxyXG4gICAgICBKU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hfQnlfS2V5ID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHNlZ19rZXk6IG51bWJlcixcclxuICAgICAgICBrZXk6IG51bWJlclxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyX21pbiA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgICBsZXQgcHRyX21heCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuXHJcbiAgICAgICAgX0dTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveF9CeV9LZXkoc2VnX2tleSwga2V5LCBwdHJfbWluLCBwdHJfbWF4KTtcclxuXHJcbiAgICAgICAgbGV0IGJiID0gbmV3IEZsb2F0MzJBcnJheSg2KTtcclxuXHJcbiAgICAgICAgYmJbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNF07XHJcbiAgICAgICAgYmJbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWluIC8gNCArIDFdO1xyXG4gICAgICAgIGJiWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDQgKyAyXTtcclxuXHJcbiAgICAgICAgYmJbM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNF07XHJcbiAgICAgICAgYmJbNF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF4IC8gNCArIDFdO1xyXG4gICAgICAgIGJiWzVdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDQgKyAyXTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9taW4pO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbWF4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJiO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveF9CeV9LZXlzID1cclxuICAgICAgSlNfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94X0J5X0tleXMgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgc2VnX2tleTogbnVtYmVyLFxyXG4gICAgICAgIGtleXM6IEludDMyQXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl9taW4gPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgICAgbGV0IHB0cl9tYXggPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBrZXlzLmxlbmd0aCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoa2V5cywgcHRyX2tleXMgLyA0KTtcclxuXHJcbiAgICAgICAgX0dTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveF9CeV9LZXlzKFxyXG4gICAgICAgICAgc2VnX2tleSxcclxuICAgICAgICAgIHB0cl9rZXlzLFxyXG4gICAgICAgICAga2V5cy5sZW5ndGgsXHJcbiAgICAgICAgICBwdHJfbWluLFxyXG4gICAgICAgICAgcHRyX21heFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBiYiA9IG5ldyBGbG9hdDMyQXJyYXkoNik7XHJcblxyXG4gICAgICAgIGJiWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDRdO1xyXG4gICAgICAgIGJiWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDQgKyAxXTtcclxuICAgICAgICBiYlsyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9taW4gLyA0ICsgMl07XHJcblxyXG4gICAgICAgIGJiWzNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDRdO1xyXG4gICAgICAgIGJiWzRdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDQgKyAxXTtcclxuICAgICAgICBiYls1XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXggLyA0ICsgMl07XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9taW4pO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbWF4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJiO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveGVzX0J5X0tleXMgPVxyXG4gICAgICBKU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hlc19CeV9LZXlzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHNlZ19rZXk6IG51bWJlcixcclxuICAgICAgICBrZXlzOiBJbnQzMkFycmF5XHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfbWluID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMgKiBrZXlzLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHB0cl9tYXggPSBNb2R1bGUuX21hbGxvYyg0ICogMyAqIGtleXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGtleXMubGVuZ3RoKTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChrZXlzLCBwdHJfa2V5cyAvIDQpO1xyXG5cclxuICAgICAgICBfR1NfQ29tcHV0ZV9WaWV3X0JvdW5kaW5nYm94ZXNfQnlfS2V5cyhcclxuICAgICAgICAgIHNlZ19rZXksXHJcbiAgICAgICAgICBwdHJfa2V5cyxcclxuICAgICAgICAgIGtleXMubGVuZ3RoLFxyXG4gICAgICAgICAgcHRyX21pbixcclxuICAgICAgICAgIHB0cl9tYXhcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgYmIgPSBuZXcgRmxvYXQzMkFycmF5KDYgKiBrZXlzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgYmJbaSAqIDZdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDQgKyBpICogM107XHJcbiAgICAgICAgICBiYltpICogNiArIDFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDQgKyBpICogMyArIDFdO1xyXG4gICAgICAgICAgYmJbaSAqIDYgKyAyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9taW4gLyA0ICsgaSAqIDMgKyAyXTtcclxuXHJcbiAgICAgICAgICBiYltpICogNiArIDNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDQgKyBpICogM107XHJcbiAgICAgICAgICBiYltpICogNiArIDRdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDQgKyBpICogMyArIDFdO1xyXG4gICAgICAgICAgYmJbaSAqIDYgKyA1XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXggLyA0ICsgaSAqIDMgKyAyXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9taW4pO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbWF4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJiO1xyXG4gICAgICB9O1xyXG4gICAgSlNfQ29tcHV0ZV9TZWdtZW50X0JvdW5kaW5nYm94X0J5X0tleSA9XHJcbiAgICAgIF9HU19Db21wdXRlX1NlZ21lbnRfQm91bmRpbmdib3hfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX1NlZ21lbnRfQm91bmRpbmdib3hfQnlfS2V5ID1cclxuICAgICAgSlNfQ2xlYXJfU2VnbWVudF9Cb3VuZGluZ2JveF9CeV9LZXkgPVxyXG4gICAgICAgIF9HU19DbGVhcl9TZWdtZW50X0JvdW5kaW5nYm94X0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0JvdW5kaW5nQm94X0J5X0tleSA9IEpTX1Nob3dfQm91bmRpbmdCb3hfQnlfS2V5ID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX21pbiA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgICBsZXQgcHRyX21heCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfQm91bmRpbmdCb3hfQnlfS2V5KGtleSwgcHRyX21pbiwgcHRyX21heCk7XHJcblxyXG4gICAgICAgIGxldCBiYiA9IG5ldyBGbG9hdDMyQXJyYXkoNik7XHJcblxyXG4gICAgICAgIGJiWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDRdO1xyXG4gICAgICAgIGJiWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21pbiAvIDQgKyAxXTtcclxuICAgICAgICBiYlsyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9taW4gLyA0ICsgMl07XHJcblxyXG4gICAgICAgIGJiWzNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDRdO1xyXG4gICAgICAgIGJiWzRdID0gTW9kdWxlLkhFQVBGMzJbcHRyX21heCAvIDQgKyAxXTtcclxuICAgICAgICBiYls1XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9tYXggLyA0ICsgMl07XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbWluKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX21heCk7XHJcblxyXG4gICAgICAgIHJldHVybiBiYjtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX1Zpc2libGVfQnlfS2V5ID0gSlNfQ29tcHV0ZV9WaXNpYmxlX0J5X0tleSA9XHJcbiAgICAgIGZ1bmN0aW9uIChkaXNwbGF5X2tleTogbnVtYmVyLCBzdGFydF9rZXk6IG51bWJlciwgbnVtPzogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX2tleXMgPSBudWxsO1xyXG4gICAgICAgIGlmIChudW0pIHtcclxuICAgICAgICAgIHB0cl9rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIG51bSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHB0cl9rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIDEwMjQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX0dTX0NvbXB1dGVfVmlzaWJsZV9CeV9LZXkoZGlzcGxheV9rZXksIHN0YXJ0X2tleSwgcHRyX2NvdW50LCBwdHJfa2V5cyk7XHJcblxyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNF07XHJcbiAgICAgICAgbGV0IGtleXMgPSBuZXcgSW50MzJBcnJheShjb3VudCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAga2V5c1tpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2tleXMgLyA0ICsgaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvdW50KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2tleXMpO1xyXG5cclxuICAgICAgICByZXR1cm4ga2V5cztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0F0dHJpYnV0ZV9Db3VudCA9IEpTX1Nob3dfQXR0cmlidXRlX0NvdW50ID1cclxuICAgICAgZnVuY3Rpb24gKCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19BdHRyaWJ1dGVfQ291bnQocHRyKTtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0F0dHJpYnV0ZV9MaXN0ID0gSlNfU2hvd19BdHRyaWJ1dGVfTGlzdCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfQXR0cmlidXRlX0NvdW50KHB0cik7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdDtcclxuICAgICAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2xpc3QgPSBNb2R1bGUuX21hbGxvYyg0ICogY291bnQpO1xyXG4gICAgICAgICAgX0dTX1Nob3dfQXR0cmlidXRlX0xpc3QocHRyX2xpc3QpO1xyXG5cclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KGNvdW50KTtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBNb2R1bGUuSEVBUDMyW3B0cl9saXN0IC8gNCArIGldO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbGlzdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0dlb21ldHJ5X0NvdW50ID0gSlNfU2hvd19HZW9tZXRyeV9Db3VudCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfR2VvbWV0cnlfQ291bnQocHRyKTtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0dlb21ldHJ5X0xpc3QgPSBKU19TaG93X0dlb21ldHJ5X0xpc3QgPVxyXG4gICAgICBmdW5jdGlvbiAoKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X0dlb21ldHJ5X0NvdW50KHB0cik7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdDtcclxuICAgICAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2xpc3QgPSBNb2R1bGUuX21hbGxvYyg0ICogY291bnQpO1xyXG4gICAgICAgICAgX0dTX1Nob3dfR2VvbWV0cnlfTGlzdChwdHJfbGlzdCk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoY291bnQpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2xpc3QgLyA0ICsgaV07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9saXN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3Vic2VnbWVudF9Db3VudCA9IEpTX1Nob3dfU3Vic2VnbWVudF9Db3VudCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfU3Vic2VnbWVudF9Db3VudChwdHIpO1xyXG5cclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3Vic2VnbWVudF9MaXN0ID0gSlNfU2hvd19TdWJzZWdtZW50X0xpc3QgPVxyXG4gICAgICBmdW5jdGlvbiAoKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X1N1YnNlZ21lbnRfQ291bnQocHRyKTtcclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfbGlzdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBjb3VudCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19TdWJzZWdtZW50X0xpc3QocHRyX2xpc3QpO1xyXG5cclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KGNvdW50KTtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBNb2R1bGUuSEVBUDMyW3B0cl9saXN0IC8gNCArIGldO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbGlzdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0FsbF9TdWJzZWdtZW50X0NvdW50ID1cclxuICAgICAgSlNfU2hvd19BbGxfU3Vic2VnbWVudF9Db3VudCA9IGZ1bmN0aW9uICgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfQWxsX1N1YnNlZ21lbnRfQ291bnQocHRyKTtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0FsbF9TdWJzZWdtZW50X0xpc3QgPSBKU19TaG93X0FsbF9TdWJzZWdtZW50X0xpc3QgPVxyXG4gICAgICBmdW5jdGlvbiAoKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X0FsbF9TdWJzZWdtZW50X0NvdW50KHB0cik7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdDtcclxuICAgICAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2xpc3QgPSBNb2R1bGUuX21hbGxvYyg0ICogY291bnQpO1xyXG4gICAgICAgICAgX0dTX1Nob3dfQWxsX1N1YnNlZ21lbnRfTGlzdChwdHJfbGlzdCk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoY291bnQpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2xpc3QgLyA0ICsgaV07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9saXN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSW5jbHVkZV9Db3VudCA9IEpTX1Nob3dfSW5jbHVkZV9Db3VudCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfSW5jbHVkZV9Db3VudChwdHIpO1xyXG5cclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSW5jbHVkZV9MaXN0ID0gSlNfU2hvd19JbmNsdWRlX0xpc3QgPVxyXG4gICAgICBmdW5jdGlvbiAoKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X0luY2x1ZGVfQ291bnQocHRyKTtcclxuICAgICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfbGlzdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBjb3VudCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19JbmNsdWRlX0xpc3QocHRyX2xpc3QpO1xyXG5cclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KGNvdW50KTtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBNb2R1bGUuSEVBUDMyW3B0cl9saXN0IC8gNCArIGldO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbGlzdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0luY2x1ZGUgPSBKU19TaG93X0luY2x1ZGUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGluZGV4OiBudW1iZXJcclxuICAgICk6IG51bWJlciB7XHJcbiAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgX0dTX1Nob3dfSW5jbHVkZShpbmRleCwgcHRyKTtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBNb2R1bGUuSEVBUDMyW3B0ciAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0luY2x1ZGVfU2VnbWVudCA9IEpTX1Nob3dfSW5jbHVkZV9TZWdtZW50ID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyKTogYW55IHtcclxuICAgICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9jZCA9IE1vZHVsZS5fbWFsbG9jKDI1Nik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0luY2x1ZGVfU2VnbWVudChrZXksIHB0ciwgcHRyX2NkKTtcclxuXHJcbiAgICAgICAgbGV0IGluY2x1ZGVfa2V5ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuICAgICAgICBsZXQgY29uZGl0aW9uID0gVVRGOFRvU3RyaW5nKHB0cl9jZCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfY2QpO1xyXG5cclxuICAgICAgICByZXR1cm4geyBrZXk6IGluY2x1ZGVfa2V5LCBjb25kaXRpb24gfTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1N0eWxlX0NvdW50ID0gSlNfU2hvd19TdHlsZV9Db3VudCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfU3R5bGVfQ291bnQocHRyKTtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1N0eWxlX0xpc3QgPSBKU19TaG93X1N0eWxlX0xpc3QgPVxyXG4gICAgICBmdW5jdGlvbiAoKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X1N0eWxlX0NvdW50KHB0cik7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdDtcclxuICAgICAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2xpc3QgPSBNb2R1bGUuX21hbGxvYyg0ICogY291bnQpO1xyXG4gICAgICAgICAgX0dTX1Nob3dfU3R5bGVfTGlzdChwdHJfbGlzdCk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoY291bnQpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2xpc3QgLyA0ICsgaV07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9saXN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3R5bGUgPSBKU19TaG93X1N0eWxlID0gZnVuY3Rpb24gKFxyXG4gICAgICBpbmRleDogbnVtYmVyXHJcbiAgICApOiBudW1iZXIge1xyXG4gICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIF9HU19TaG93X1N0eWxlKGluZGV4LCBwdHIpO1xyXG5cclxuICAgICAgbGV0IGtleSA9IE1vZHVsZS5IRUFQMzJbcHRyIC8gNF07XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU3R5bGVfU2VnbWVudCA9IEpTX1Nob3dfU3R5bGVfU2VnbWVudCA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IGFueSB7XHJcbiAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl9jZCA9IE1vZHVsZS5fbWFsbG9jKDI1Nik7XHJcblxyXG4gICAgICBfR1NfU2hvd19TdHlsZV9TZWdtZW50KGtleSwgcHRyLCBwdHJfY2QpO1xyXG5cclxuICAgICAgbGV0IHN0eWxlX2tleSA9IE1vZHVsZS5IRUFQMzJbcHRyIC8gNF07XHJcbiAgICAgIGxldCBjb25kaXRpb24gPSBVVEY4VG9TdHJpbmcocHRyX2NkKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2NkKTtcclxuXHJcbiAgICAgIHJldHVybiB7IGtleTogc3R5bGVfa2V5LCBjb25kaXRpb24gfTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9TZWxlY3Rpb25fQnlfS2V5ID0gSlNfQ29tcHV0ZV9TZWxlY3Rpb25fQnlfS2V5ID1cclxuICAgICAgX0dTX0NvbXB1dGVfU2VsZWN0aW9uX0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX1NlbGVjdGlvbl9CeV9BcmVhID1cclxuICAgICAgSlNfQ29tcHV0ZV9TZWxlY3Rpb25fQnlfQXJlYSA9IF9HU19Db21wdXRlX1NlbGVjdGlvbl9CeV9BcmVhO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX0NvdW50ID0gSlNfU2hvd19TZWxlY3Rpb25fQ291bnQgPVxyXG4gICAgICBmdW5jdGlvbiAoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfU2VsZWN0aW9uX0NvdW50KHB0cik7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX0VsZW1lbnQgPSBKU19TaG93X1NlbGVjdGlvbl9FbGVtZW50ID1cclxuICAgICAgZnVuY3Rpb24gKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBfR1NfU2hvd19TZWxlY3Rpb25fRWxlbWVudChpbmRleCwgcHRyKTtcclxuICAgICAgICBsZXQga2V5ID0gTW9kdWxlLkhFQVAzMltwdHIgLyA0XTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NlbGVjdGlvbl9QYXRoID0gSlNfU2hvd19TZWxlY3Rpb25fUGF0aCA9IGZ1bmN0aW9uIChcclxuICAgICAgaW5kZXg6IG51bWJlclxyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHB0cl9wYXRoID0gTW9kdWxlLl9tYWxsb2MoNDA5Nik7XHJcblxyXG4gICAgICBfR1NfU2hvd19TZWxlY3Rpb25fUGF0aChpbmRleCwgcHRyX3BhdGgpO1xyXG5cclxuICAgICAgbGV0IHBhdGggPSBVVEY4VG9TdHJpbmcocHRyX3BhdGgpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhdGgpO1xyXG5cclxuICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX1BhdGhfQnlfS2V5cyA9XHJcbiAgICAgIEpTX1Nob3dfU2VsZWN0aW9uX1BhdGhfQnlfS2V5cyA9IGZ1bmN0aW9uIChpbmRleDogbnVtYmVyKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiA1MTIpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19TZWxlY3Rpb25fUGF0aF9CeV9LZXlzKGluZGV4LCBwdHJfY291bnQsIHB0cl9rZXlzKTtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfY291bnQgLyA0XTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEludDMyQXJyYXkoY291bnQpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIHJlc3VsdFtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2tleXMgLyA0ICsgaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvdW50KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2tleXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VsZWN0aW9uX1Bvc2l0aW9uID0gSlNfU2hvd19TZWxlY3Rpb25fUG9zaXRpb24gPVxyXG4gICAgICBmdW5jdGlvbiAoaW5kZXg6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0cl92YWx1ZSA9IE1vZHVsZS5fbWFsbG9jKDQgKiA2KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfU2VsZWN0aW9uX1Bvc2l0aW9uX0J5X1ZhbHVlKGluZGV4LCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICBsZXQgcG9zID0gbmV3IEZsb2F0MzJBcnJheSg2KTtcclxuICAgICAgICBwb3NbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0XTtcclxuICAgICAgICBwb3NbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgMV07XHJcbiAgICAgICAgcG9zWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDJdO1xyXG4gICAgICAgIHBvc1szXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDQgKyAzXTtcclxuICAgICAgICBwb3NbNF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgNF07XHJcbiAgICAgICAgcG9zWzVdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDVdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBvcztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NlbGVjdGlvbl9QYXJhbSA9IEpTX1Nob3dfU2VsZWN0aW9uX1BhcmFtID1cclxuICAgICAgZnVuY3Rpb24gKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfU2VsZWN0aW9uX1BhcmFtKGluZGV4LCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICBsZXQgcGFyYW0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBwYXJhbTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NlbGVjdGlvbl9JbmRleGVzID0gSlNfU2hvd19TZWxlY3Rpb25fSW5kZXhlcyA9XHJcbiAgICAgIGZ1bmN0aW9uIChpbmRleDogbnVtYmVyKTogSW50MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0cl92YWx1ZSA9IE1vZHVsZS5fbWFsbG9jKDQgKiA2KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfU2VsZWN0aW9uX0luZGV4ZXMoaW5kZXgsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIGxldCBpZHggPSBuZXcgSW50MzJBcnJheSg2KTtcclxuICAgICAgICBpZHhbMF0gPSBNb2R1bGUuSEVBUDMyW3B0cl92YWx1ZSAvIDRdO1xyXG4gICAgICAgIGlkeFsxXSA9IE1vZHVsZS5IRUFQMzJbcHRyX3ZhbHVlIC8gNCArIDFdO1xyXG4gICAgICAgIGlkeFsyXSA9IE1vZHVsZS5IRUFQMzJbcHRyX3ZhbHVlIC8gNCArIDJdO1xyXG4gICAgICAgIGlkeFszXSA9IE1vZHVsZS5IRUFQMzJbcHRyX3ZhbHVlIC8gNCArIDNdO1xyXG4gICAgICAgIGlkeFs0XSA9IE1vZHVsZS5IRUFQMzJbcHRyX3ZhbHVlIC8gNCArIDRdO1xyXG4gICAgICAgIGlkeFs1XSA9IE1vZHVsZS5IRUFQMzJbcHRyX3ZhbHVlIC8gNCArIDVdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGlkeDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NlbGVjdGlvbl9UZXN0X0luZm8gPSBKU19TaG93X1NlbGVjdGlvbl9UZXN0X0luZm8gPVxyXG4gICAgICBmdW5jdGlvbiAoaW5kZXg6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0cl92YWx1ZSA9IE1vZHVsZS5fbWFsbG9jKDQgKiAxNSk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1NlbGVjdGlvbl9UZXN0X0luZm8oaW5kZXgsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQzMkFycmF5KDE1KTtcclxuICAgICAgICBwb3NbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0XTtcclxuICAgICAgICBwb3NbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgMV07XHJcbiAgICAgICAgcG9zWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDJdO1xyXG4gICAgICAgIHBvc1szXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDQgKyAzXTtcclxuICAgICAgICBwb3NbNF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgNF07XHJcbiAgICAgICAgcG9zWzVdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDVdO1xyXG4gICAgICAgIHBvc1s2XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDQgKyA2XTtcclxuICAgICAgICBwb3NbN10gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWUgLyA0ICsgN107XHJcbiAgICAgICAgcG9zWzhdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDhdO1xyXG4gICAgICAgIHBvc1s5XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDQgKyA5XTtcclxuICAgICAgICBwb3NbMTBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDEwXTtcclxuICAgICAgICBwb3NbMTFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDExXTtcclxuICAgICAgICBwb3NbMTJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDEyXTtcclxuICAgICAgICBwb3NbMTNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDEzXTtcclxuICAgICAgICBwb3NbMTRdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDE0XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBwb3M7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5ID0gSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5ID1cclxuICAgICAgZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdLZXk6IG51bWJlcixcclxuICAgICAgICBvbmVLZXk6IG51bWJlcixcclxuICAgICAgICB0d29LZXk6IG51bWJlcixcclxuICAgICAgICB0eXBlOiBDb2xsaXNpb25UeXBlLFxyXG4gICAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyX29wdGlvbnMgPSBudWxsO1xyXG4gICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvdW50ID0gX0dTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleShcclxuICAgICAgICAgIHZpZXdLZXksXHJcbiAgICAgICAgICBvbmVLZXksXHJcbiAgICAgICAgICB0d29LZXksXHJcbiAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgcHRyX29wdGlvbnNcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChwdHJfb3B0aW9ucykge1xyXG4gICAgICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQ29sbGlzaW9uX0J5X0tleXMgPVxyXG4gICAgICBKU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXIsXHJcbiAgICAgICAgb25lS2V5czogSW50MzJBcnJheSxcclxuICAgICAgICB0d29LZXlzOiBJbnQzMkFycmF5LFxyXG4gICAgICAgIHR5cGU6IENvbGxpc2lvblR5cGVcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKG9uZUtleXMubGVuZ3RoID4gMCAmJiB0d29LZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBwdHJfb25lX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICogb25lS2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQob25lS2V5cywgcHRyX29uZV9rZXlzIC8gNCk7XHJcbiAgICAgICAgICBsZXQgcHRyX3R3b19rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIHR3b0tleXMubGVuZ3RoKTtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KHR3b0tleXMsIHB0cl90d29fa2V5cyAvIDQpO1xyXG5cclxuICAgICAgICAgIGxldCBjb3VudCA9IF9HU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlzKFxyXG4gICAgICAgICAgICB2aWV3X2tleSxcclxuICAgICAgICAgICAgcHRyX29uZV9rZXlzLFxyXG4gICAgICAgICAgICBvbmVLZXlzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3R3b19rZXlzLFxyXG4gICAgICAgICAgICB0d29LZXlzLmxlbmd0aCxcclxuICAgICAgICAgICAgdHlwZVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX29uZV9rZXlzKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdHdvX2tleXMpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBjb3VudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlzX1R0ID1cclxuICAgICAgSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5c19UdCA9IGZ1bmN0aW9uIChcclxuICAgICAgICB2aWV3X2tleTogbnVtYmVyLFxyXG4gICAgICAgIG9uZUtleXM6IEludDMyQXJyYXksXHJcbiAgICAgICAgdHdvS2V5czogSW50MzJBcnJheSxcclxuICAgICAgICB0eXBlOiBDb2xsaXNpb25UeXBlXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChvbmVLZXlzLmxlbmd0aCA+IDAgJiYgdHdvS2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX29uZV9rZXlzID0gTW9kdWxlLl9tYWxsb2MoNCAqIG9uZUtleXMubGVuZ3RoKTtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb25lS2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl9vbmVfa2V5cyAvIDQgKyBpXSA9IG9uZUtleXNbaV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBNb2R1bGUuSEVBUDMyLnNldChvbmVLZXlzLCBwdHJfb25lX2tleXMgLyA0KTtcclxuICAgICAgICAgIGxldCBwdHJfdHdvX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICogdHdvS2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0d29LZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX3R3b19rZXlzIC8gNCArIGldID0gdHdvS2V5c1tpXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIE1vZHVsZS5IRUFQMzIuc2V0KHR3b0tleXMsIHB0cl90d29fa2V5cyAvIDQpO1xyXG5cclxuICAgICAgICAgIGxldCBjb3VudCA9IF9HU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlzX1R0KFxyXG4gICAgICAgICAgICB2aWV3X2tleSxcclxuICAgICAgICAgICAgcHRyX29uZV9rZXlzLFxyXG4gICAgICAgICAgICBvbmVLZXlzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3R3b19rZXlzLFxyXG4gICAgICAgICAgICB0d29LZXlzLmxlbmd0aCxcclxuICAgICAgICAgICAgdHlwZVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX29uZV9rZXlzKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdHdvX2tleXMpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBjb3VudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlfVHQgPVxyXG4gICAgICBKU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlfVHQgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgdmlld2tleTogbnVtYmVyLFxyXG4gICAgICAgIG9uZUtleTogbnVtYmVyLFxyXG4gICAgICAgIHR3b0tleTogbnVtYmVyLFxyXG4gICAgICAgIHR5cGU6IENvbGxpc2lvblR5cGUsXHJcbiAgICAgICAgbm86IG51bWJlcixcclxuICAgICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl9vcHRpb25zID0gbnVsbDtcclxuICAgICAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICAgICAgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjb3VudCA9IF9HU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlfVHQoXHJcbiAgICAgICAgICB2aWV3a2V5LFxyXG4gICAgICAgICAgb25lS2V5LFxyXG4gICAgICAgICAgdHdvS2V5LFxyXG4gICAgICAgICAgdHlwZSxcclxuICAgICAgICAgIG5vLFxyXG4gICAgICAgICAgcHRyX29wdGlvbnNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAocHRyX29wdGlvbnMpIHtcclxuICAgICAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbGxpc2lvbl9TdGF0dXMgPSBKU19TaG93X0NvbGxpc2lvbl9TdGF0dXMgPVxyXG4gICAgICBmdW5jdGlvbiAoKTogbnVtYmVyW10ge1xyXG4gICAgICAgIGxldCBwdHJUb3RhbCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJDdXJyZW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfQ29sbGlzaW9uX1N0YXR1cyhwdHJUb3RhbCwgcHRyQ3VycmVudCk7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gTW9kdWxlLkhFQVAzMltwdHJUb3RhbCAvIDRdO1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gTW9kdWxlLkhFQVAzMltwdHJDdXJyZW50IC8gNF07XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0clRvdGFsKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyQ3VycmVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBbdG90YWwsIGN1cnJlbnRdO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ29sbGlzaW9uX0NvdW50ID0gSlNfU2hvd19Db2xsaXNpb25fQ291bnQgPVxyXG4gICAgICBmdW5jdGlvbiAoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcHRyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgX0dTX1Nob3dfQ29sbGlzaW9uX0NvdW50KHB0cik7XHJcblxyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyIC8gNF07XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbGxpc2lvbl9FbGVtZW50cyA9IEpTX1Nob3dfQ29sbGlzaW9uX0VsZW1lbnRzID1cclxuICAgICAgZnVuY3Rpb24gKGluZGV4OiBudW1iZXIpOiBJbnQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX3NlZ19vbmUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3NlZ190d28gPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX2dlb21fb25lID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9nZW9tX3R3byA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIF9HU19TaG93X0NvbGxpc2lvbl9FbGVtZW50cyhcclxuICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgcHRyX3NlZ19vbmUsXHJcbiAgICAgICAgICBwdHJfc2VnX3R3byxcclxuICAgICAgICAgIHB0cl9nZW9tX29uZSxcclxuICAgICAgICAgIHB0cl9nZW9tX3R3b1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IGtleV9zZWdfb25lID0gTW9kdWxlLkhFQVAzMltwdHJfc2VnX29uZSAvIDRdO1xyXG4gICAgICAgIGxldCBrZXlfc2VnX3R3byA9IE1vZHVsZS5IRUFQMzJbcHRyX3NlZ190d28gLyA0XTtcclxuICAgICAgICBsZXQga2V5X2dlb21fb25lID0gTW9kdWxlLkhFQVAzMltwdHJfZ2VvbV9vbmUgLyA0XTtcclxuICAgICAgICBsZXQga2V5X2dlb21fdHdvID0gTW9kdWxlLkhFQVAzMltwdHJfZ2VvbV90d28gLyA0XTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3NlZ19vbmUpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfc2VnX3R3byk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9nZW9tX29uZSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9nZW9tX3R3byk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgSW50MzJBcnJheShbXHJcbiAgICAgICAgICBrZXlfc2VnX29uZSxcclxuICAgICAgICAgIGtleV9zZWdfdHdvLFxyXG4gICAgICAgICAga2V5X2dlb21fb25lLFxyXG4gICAgICAgICAga2V5X2dlb21fdHdvLFxyXG4gICAgICAgIF0pO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ29sbGlzaW9uX1BhdGhzID0gSlNfU2hvd19Db2xsaXNpb25fUGF0aHMgPVxyXG4gICAgICBmdW5jdGlvbiAoaW5kZXg6IG51bWJlcik6IHN0cmluZ1tdIHtcclxuICAgICAgICBsZXQgcHRyX3BhdGhfb25lID0gTW9kdWxlLl9tYWxsb2MoMTAyNCk7XHJcbiAgICAgICAgbGV0IHB0cl9wYXRoX3R3byA9IE1vZHVsZS5fbWFsbG9jKDEwMjQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19Db2xsaXNpb25fUGF0aHMoaW5kZXgsIHB0cl9wYXRoX29uZSwgcHRyX3BhdGhfdHdvKTtcclxuXHJcbiAgICAgICAgbGV0IHBhdGhfb25lID0gVVRGOFRvU3RyaW5nKHB0cl9wYXRoX29uZSk7XHJcbiAgICAgICAgbGV0IHBhdGhfdHdvID0gVVRGOFRvU3RyaW5nKHB0cl9wYXRoX3R3byk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGF0aF9vbmUpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGF0aF90d28pO1xyXG5cclxuICAgICAgICByZXR1cm4gW3BhdGhfb25lLCBwYXRoX3R3b107XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Db2xsaXNpb25fUGF0aF9CeV9LZXlzID1cclxuICAgICAgSlNfU2hvd19Db2xsaXNpb25fUGF0aF9CeV9LZXlzID0gZnVuY3Rpb24gKGluZGV4OiBudW1iZXIpOiBJbnQzMkFycmF5W10ge1xyXG4gICAgICAgIGxldCBwdHJfY291bnRfb25lID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9rZXlzX29uZSA9IE1vZHVsZS5fbWFsbG9jKDQgKiA1MTIpO1xyXG4gICAgICAgIGxldCBwdHJfY291bnRfdHdvID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9rZXlzX3R3byA9IE1vZHVsZS5fbWFsbG9jKDQgKiA1MTIpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19Db2xsaXNpb25fUGF0aF9CeV9LZXlzKFxyXG4gICAgICAgICAgaW5kZXgsXHJcbiAgICAgICAgICBwdHJfY291bnRfb25lLFxyXG4gICAgICAgICAgcHRyX2tleXNfb25lLFxyXG4gICAgICAgICAgcHRyX2NvdW50X3R3byxcclxuICAgICAgICAgIHB0cl9rZXlzX3R3b1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBjb3VudF9vbmUgPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudF9vbmUgLyA0XTtcclxuICAgICAgICBsZXQgcmVzdWx0X29uZSA9IG5ldyBJbnQzMkFycmF5KGNvdW50X29uZSk7XHJcblxyXG4gICAgICAgIGxldCBjb3VudF90d28gPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudF90d28gLyA0XTtcclxuICAgICAgICBsZXQgcmVzdWx0X3R3byA9IG5ldyBJbnQzMkFycmF5KGNvdW50X3R3byk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRfb25lOyBpKyspIHtcclxuICAgICAgICAgIHJlc3VsdF9vbmVbaV0gPSBNb2R1bGUuSEVBUDMyW3B0cl9rZXlzX29uZSAvIDQgKyBpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudF90d287IGkrKykge1xyXG4gICAgICAgICAgcmVzdWx0X3R3b1tpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2tleXNfdHdvIC8gNCArIGldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb3VudF9vbmUpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5c19vbmUpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfY291bnRfdHdvKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2tleXNfdHdvKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFtyZXN1bHRfb25lLCByZXN1bHRfdHdvXTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NvbGxpc2lvbl9Qb3NpdGlvbiA9IEpTX1Nob3dfQ29sbGlzaW9uX1Bvc2l0aW9uID1cclxuICAgICAgZnVuY3Rpb24gKGluZGV4OiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyg0ICogNik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0NvbGxpc2lvbl9Qb3NpdGlvbihpbmRleCwgcHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgbGV0IHBvcyA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICAgICAgcG9zWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNF07XHJcbiAgICAgICAgcG9zWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIDFdO1xyXG4gICAgICAgIHBvc1syXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZSAvIDQgKyAyXTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBwb3M7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Db2xsaXNpb25fVHlwZSA9IEpTX1Nob3dfQ29sbGlzaW9uX1R5cGUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGluZGV4OiBudW1iZXJcclxuICAgICk6IG51bWJlciB7XHJcbiAgICAgIGxldCBwdHIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0NvbGxpc2lvbl9UeXBlKGluZGV4LCBwdHIpO1xyXG4gICAgICBsZXQgdHlwZSA9IE1vZHVsZS5IRUFQMzJbcHRyIC8gNF07XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHIpO1xyXG5cclxuICAgICAgcmV0dXJuIHR5cGU7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VnbWVudF9OYW1lID0gSlNfU2hvd19TZWdtZW50X05hbWUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcHRyX25hbWUgPSBNb2R1bGUuX21hbGxvYygyNTYpO1xyXG4gICAgICBfR1NfU2hvd19TZWdtZW50X05hbWUoa2V5LCBwdHJfbmFtZSk7XHJcblxyXG4gICAgICBsZXQgbmFtZSA9IFVURjhUb1N0cmluZyhwdHJfbmFtZSk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX25hbWUpO1xyXG5cclxuICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2VnbWVudF9QYXRoID0gSlNfU2hvd19TZWdtZW50X1BhdGggPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcHRyX3BhdGggPSBNb2R1bGUuX21hbGxvYygxMDI0KTtcclxuICAgICAgX0dTX1Nob3dfU2VnbWVudF9QYXRoKGtleSwgcHRyX3BhdGgpO1xyXG5cclxuICAgICAgbGV0IHBhdGggPSBVVEY4VG9TdHJpbmcocHRyX3BhdGgpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXRoKTtcclxuXHJcbiAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZWdtZW50X0V4aXN0cyA9IEpTX1NlZ21lbnRfRXhpc3RzID0gZnVuY3Rpb24gKFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gX0dTX1NlZ21lbnRfRXhpc3RzKHB0cik7XHJcbiAgICAgIF9mcmVlKHB0cik7XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Nb3ZlX0tleSA9IEpTX01vdmVfS2V5ID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgbmV3X293bmVyX3BhdGg6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmV3X293bmVyX3BhdGgpO1xyXG4gICAgICBfR1NfTW92ZV9LZXkoa2V5LCBwdHIpO1xyXG4gICAgICBfZnJlZShwdHIpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19SZW5hbWVfU2VnbWVudCA9IEpTX1JlbmFtZV9TZWdtZW50ID0gZnVuY3Rpb24gKFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gX0dTX1JlbmFtZV9TZWdtZW50KHB0cik7XHJcbiAgICAgIF9mcmVlKHB0cik7XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Nb3ZlX0tleV9CeV9LZXkgPSBKU19Nb3ZlX0tleV9CeV9LZXkgPVxyXG4gICAgICBfR1NfTW92ZV9LZXlfQnlfS2V5O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0FkZF9Gb250X0xpYnJhcnkgPSBKU19BZGRfRm9udF9MaWJyYXJ5ID0gZnVuY3Rpb24gKFxyXG4gICAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgIGRhdGE6IEFycmF5QnVmZmVyXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyhkYXRhLmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IGFycmF5ID0gbmV3IEludDhBcnJheShkYXRhKTtcclxuICAgICAgTW9kdWxlLkhFQVA4LnNldChhcnJheSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgX0dTX0FkZF9Gb250X0xpYnJhcnkocHRyX25hbWUsIHB0cl9kYXRhLCBkYXRhLmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kYXRhKTtcclxuICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG5cclxuICAgICAgYXJyYXkgPSBudWxsO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Gb250X0xpYnJhcnlfRXhpc3RzID0gSlNfRm9udF9MaWJyYXJ5X0V4aXN0cyA9IGZ1bmN0aW9uIChcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG5cclxuICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG5cclxuICAgICAgcmVzdWx0ID0gX0dTX0ZvbnRfTGlicmFyeV9FeGlzdHMocHRyX25hbWUpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfUmVtb3ZlX0ZvbnRfTGlicmFyeSA9IEpTX1JlbW92ZV9Gb250X0xpYnJhcnkgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcclxuXHJcbiAgICAgIGxldCBwdHJfbmFtZSA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuXHJcbiAgICAgIHJlc3VsdCA9IF9HU19SZW1vdmVfRm9udF9MaWJyYXJ5KHB0cl9uYW1lKTtcclxuXHJcbiAgICAgIF9mcmVlKHB0cl9uYW1lKTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NsZWFyX0ZvbnRfTGlicmFyeSA9IF9HU19DbGVhcl9Gb250X0xpYnJhcnk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0RyaXZlcl9Db25maWdzID0gSlNfU2V0X0RyaXZlcl9Db25maWdzID0gZnVuY3Rpb24gKFxyXG4gICAgICBjb25maWdzOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX2NvbmZpZ3MgPSBhbGxvY2F0ZVVURjgoY29uZmlncyk7XHJcbiAgICAgIF9HU19TZXRfRHJpdmVyX0NvbmZpZ3MocHRyX2NvbmZpZ3MpO1xyXG4gICAgICBfZnJlZShwdHJfY29uZmlncyk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0FkZF9Qcm9wZXJ0eV9Cb29sZWFuID0gSlNfQWRkX1Byb3BlcnR5X0Jvb2xlYW4gPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIsIG5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl92YWx1ZSAvIDRdID0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0XSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfR1NfQWRkX1Byb3BlcnR5X0Jvb2xlYW4oa2V5LCBwdHIsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl92YWx1ZSk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQWRkX1Byb3BlcnR5X0ludGVnZXIgPSBKU19BZGRfUHJvcGVydHlfSW50ZWdlciA9XHJcbiAgICAgIGZ1bmN0aW9uIChrZXk6IG51bWJlciwgbmFtZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl92YWx1ZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX3ZhbHVlIC8gNF0gPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgX0dTX0FkZF9Qcm9wZXJ0eV9JbnRlZ2VyKGtleSwgcHRyLCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICBfZnJlZShwdHIpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdmFsdWUpO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0FkZF9Qcm9wZXJ0eV9Eb3VibGUgPSBKU19BZGRfUHJvcGVydHlfRG91YmxlID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgICB2YWx1ZTogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuXHJcbiAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3ZhbHVlIC8gOF0gPSB2YWx1ZTtcclxuXHJcbiAgICAgIF9HU19BZGRfUHJvcGVydHlfRG91YmxlX0J5X1BvaW50ZXIoa2V5LCBwdHIsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICBfZnJlZShwdHIpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQWRkX1Byb3BlcnR5X1N0cmluZyA9IEpTX0FkZF9Qcm9wZXJ0eV9TdHJpbmcgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgIHZhbHVlOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBsZXQgcHRyX3ZhbHVlID0gYWxsb2NhdGVVVEY4KHZhbHVlKTtcclxuXHJcbiAgICAgIF9HU19BZGRfUHJvcGVydHlfU3RyaW5nKGtleSwgcHRyLCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgX2ZyZWUocHRyX3ZhbHVlKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQWRkX1Byb3BlcnR5X0pzb24gPSBKU19BZGRfUHJvcGVydHlfSnNvbiA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgIG5hbWU6IHN0cmluZyxcclxuICAgICAgdmFsdWU6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCBwdHJfdmFsdWUgPSBhbGxvY2F0ZVVURjgodmFsdWUpO1xyXG5cclxuICAgICAgX0dTX0FkZF9Qcm9wZXJ0eV9Kc29uKGtleSwgcHRyLCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgX2ZyZWUocHRyX3ZhbHVlKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qcm9wZXJ0eV9UeXBlID0gSlNfU2hvd19Qcm9wZXJ0eV9UeXBlID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApOiBudW1iZXIge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG5cclxuICAgICAgbGV0IHB0cl90eXBlID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19Qcm9wZXJ0eV9UeXBlKGtleSwgcHRyLCBwdHJfdHlwZSk7XHJcblxyXG4gICAgICBsZXQgdHlwZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3R5cGUgLyA0XTtcclxuXHJcbiAgICAgIF9mcmVlKHB0cik7XHJcbiAgICAgIF9mcmVlKHB0cl90eXBlKTtcclxuXHJcbiAgICAgIHJldHVybiB0eXBlO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Byb3BlcnR5X0Jvb2xlYW4gPSBKU19TaG93X1Byb3BlcnR5X0Jvb2xlYW4gPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfUHJvcGVydHlfQm9vbGVhbihrZXksIHB0ciwgcHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgbGV0IHZhbHVlID0gTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0XTtcclxuXHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgICBfZnJlZShwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUgPT0gMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qcm9wZXJ0eV9JbnRlZ2VyID0gSlNfU2hvd19Qcm9wZXJ0eV9JbnRlZ2VyID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfUHJvcGVydHlfSW50ZWdlcihrZXksIHB0ciwgcHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgbGV0IHZhbHVlID0gTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0XTtcclxuXHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgICBfZnJlZShwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Qcm9wZXJ0eV9Eb3VibGUgPSBKU19TaG93X1Byb3BlcnR5X0RvdWJsZSA9XHJcbiAgICAgIGZ1bmN0aW9uIChrZXk6IG51bWJlciwgbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2MoOCk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1Byb3BlcnR5X0RvdWJsZShrZXksIHB0ciwgcHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgbGV0IHZhbHVlID0gTW9kdWxlLkhFQVBGNjRbcHRyX3ZhbHVlIC8gOF07XHJcblxyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcbiAgICAgICAgX2ZyZWUocHRyX3ZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUHJvcGVydHlfU3RyaW5nID0gSlNfU2hvd19Qcm9wZXJ0eV9TdHJpbmcgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgICBsZXQgcHRyX2xlbiA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19Qcm9wZXJ0eV9TdHJpbmdfTGVuZ3RoKGtleSwgcHRyLCBwdHJfbGVuKTtcclxuICAgICAgICBsZXQgbGVuID0gTW9kdWxlLkhFQVAzMltwdHJfbGVuIC8gNF07XHJcblxyXG4gICAgICAgIGlmIChsZW4gPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2MobGVuICsgMSk7XHJcblxyXG4gICAgICAgICAgX0dTX1Nob3dfUHJvcGVydHlfU3RyaW5nKGtleSwgcHRyLCBwdHJfdmFsdWUpO1xyXG4gICAgICAgICAgcmVzdWx0ID0gVVRGOFRvU3RyaW5nKHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl92YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfZnJlZShwdHIpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbGVuKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Qcm9wZXJ0eV9FeGlzdHMgPSBKU19Qcm9wZXJ0eV9FeGlzdHMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICk6IGJvb2xlYW4ge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG5cclxuICAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IF9HU19Qcm9wZXJ0eV9FeGlzdHMoa2V5LCBwdHIpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1JlbW92ZV9Qcm9wZXJ0eSA9IEpTX1JlbW92ZV9Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcblxyXG4gICAgICBKU19SZW1vdmVfUHJvcGVydHkoa2V5LCBwdHIpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ2xlYXJfUHJvcGVydGllcyA9IEpTX0NsZWFyX1Byb3BlcnRpZXMgPVxyXG4gICAgICBfR1NfQ2xlYXJfUHJvcGVydGllcztcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1Byb3BlcnRpZXMgPSBKU19TaG93X1Byb3BlcnRpZXMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IG5ldyBTdHJpbmdLZXlMaXN0PGFueT4oKTtcclxuICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfUHJvcGVydHlfQ291bnQoa2V5LCBwdHJfY291bnQpO1xyXG4gICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHB0cl90eXBlID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9uYW1lX2xlbiA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfdmFsdWVfbGVuID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1Byb3BlcnR5X1R5cGVfQnlfSW5kZXgoa2V5LCBpLCBwdHJfdHlwZSk7XHJcbiAgICAgICAgX0dTX1Nob3dfUHJvcGVydHlfTGVuZ3RoX0J5X0luZGV4KGtleSwgaSwgcHRyX25hbWVfbGVuLCBwdHJfdmFsdWVfbGVuKTtcclxuXHJcbiAgICAgICAgbGV0IHR5cGUgPSBNb2R1bGUuSEVBUDMyW3B0cl90eXBlIC8gNF07XHJcbiAgICAgICAgbGV0IG5hbWVfbGVuID0gTW9kdWxlLkhFQVAzMltwdHJfbmFtZV9sZW4gLyA0XTtcclxuICAgICAgICBsZXQgdmFsdWVfbGVuID0gTW9kdWxlLkhFQVAzMltwdHJfdmFsdWVfbGVuIC8gNF07XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09IDEpIHtcclxuICAgICAgICAgIGxldCBwdHJfbmFtZSA9IE1vZHVsZS5fbWFsbG9jKG5hbWVfbGVuICsgMSk7XHJcbiAgICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19Qcm9wZXJ0eV9CeV9JbmRleChrZXksIGksIHB0cl9uYW1lLCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICAgIGxldCBuYW1lID0gVVRGOFRvU3RyaW5nKHB0cl9uYW1lKTtcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3ZhbHVlIC8gNF07XHJcbiAgICAgICAgICByZXN1bHQuYWRkKG5hbWUsIHZhbHVlIGFzIGJvb2xlYW4pO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbmFtZSk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMikge1xyXG4gICAgICAgICAgbGV0IHB0cl9uYW1lID0gTW9kdWxlLl9tYWxsb2MobmFtZV9sZW4gKyAxKTtcclxuICAgICAgICAgIGxldCBwdHJfdmFsdWUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICAgIF9HU19TaG93X1Byb3BlcnR5X0J5X0luZGV4KGtleSwgaSwgcHRyX25hbWUsIHB0cl92YWx1ZSk7XHJcblxyXG4gICAgICAgICAgbGV0IG5hbWUgPSBVVEY4VG9TdHJpbmcocHRyX25hbWUpO1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gTW9kdWxlLkhFQVAzMltwdHJfdmFsdWUgLyA0XTtcclxuICAgICAgICAgIHJlc3VsdC5hZGQobmFtZSwgdmFsdWUgYXMgbnVtYmVyKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX25hbWUpO1xyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl92YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDMpIHtcclxuICAgICAgICAgIGxldCBwdHJfbmFtZSA9IE1vZHVsZS5fbWFsbG9jKG5hbWVfbGVuICsgMSk7XHJcbiAgICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2MoOCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19Qcm9wZXJ0eV9CeV9JbmRleChrZXksIGksIHB0cl9uYW1lLCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICAgIGxldCBuYW1lID0gVVRGOFRvU3RyaW5nKHB0cl9uYW1lKTtcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IE1vZHVsZS5IRUFQRjY0W3B0cl92YWx1ZSAvIDhdO1xyXG4gICAgICAgICAgcmVzdWx0LmFkZChuYW1lLCB2YWx1ZSBhcyBudW1iZXIpO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbmFtZSk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNCB8fCB0eXBlID09IDUpIHtcclxuICAgICAgICAgIGxldCBwdHJfbmFtZSA9IE1vZHVsZS5fbWFsbG9jKG5hbWVfbGVuICsgMSk7XHJcbiAgICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2ModmFsdWVfbGVuICsgMSk7XHJcbiAgICAgICAgICBfR1NfU2hvd19Qcm9wZXJ0eV9CeV9JbmRleChrZXksIGksIHB0cl9uYW1lLCBwdHJfdmFsdWUpO1xyXG5cclxuICAgICAgICAgIGxldCBuYW1lID0gVVRGOFRvU3RyaW5nKHB0cl9uYW1lKTtcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IFVURjhUb1N0cmluZyhwdHJfdmFsdWUpO1xyXG4gICAgICAgICAgcmVzdWx0LmFkZChuYW1lLCB2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9uYW1lKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90eXBlKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX25hbWVfbGVuKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlX2xlbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfY291bnQpO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19LZXlfQnlfSWQgPSBKU19TaG93X0tleV9CeV9JZCA9IGZ1bmN0aW9uIChcclxuICAgICAgaWQ6IHN0cmluZ1xyXG4gICAgKTogbnVtYmVyIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChpZCk7XHJcbiAgICAgIGxldCBrZXkgPSBfR1NfU2hvd19LZXlfQnlfSWQocHRyKTtcclxuICAgICAgX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9LZXlfSW5kZXggPSBKU19TZXRfS2V5X0luZGV4ID0gX0dTX1NldF9LZXlfSW5kZXg7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19LZXlfSW5kZXggPSBKU19TaG93X0tleV9JbmRleCA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IG51bWJlciB7XHJcbiAgICAgIGxldCBwdHJfaW5kZXggPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0tleV9JbmRleChrZXksIHB0cl9pbmRleCk7XHJcblxyXG4gICAgICBsZXQgaW5kZXggPSBNb2R1bGUuSEVBUDMyW3B0cl9pbmRleCAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pbmRleCk7XHJcblxyXG4gICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfS2V5X1RhZyA9IEpTX1Nob3dfS2V5X1RhZyA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICBsZXQgcHRyX3RhZyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICBpZiAoX0dTX1Nob3dfS2V5X1RhZyhrZXksIHB0cl90YWcpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gVVRGOFRvU3RyaW5nKHB0cl90YWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3RhZyk7XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfRHJpdmVyX09wdGlvbnMgPSBKU19TZXRfRHJpdmVyX09wdGlvbnMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgX0dTX1NldF9Ecml2ZXJfT3B0aW9ucyhwdHJfb3B0aW9ucyk7XHJcbiAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Ecml2ZXJfT3B0aW9ucyA9IEpTX1Nob3dfRHJpdmVyX09wdGlvbnMgPVxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHB0cl9ybyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0RyaXZlcl9PcHRpb25zKHB0cl9ybyk7XHJcblxyXG4gICAgICAgIGxldCBybyA9IFVURjhUb1N0cmluZyhwdHJfcm8pO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3JvKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJvO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX0RyaXZlcl9PcHRpb24gPSBKU19TaG93X09uZV9Ecml2ZXJfT3B0aW9uID1cclxuICAgICAgZnVuY3Rpb24gKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgICAgbGV0IHB0cl9ybyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X09uZV9Ecml2ZXJfT3B0aW9uKHB0ciwgcHRyX3JvKTtcclxuXHJcbiAgICAgICAgbGV0IHJvID0gVVRGOFRvU3RyaW5nKHB0cl9ybyk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcm8pO1xyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIHJldHVybiBybztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfU2hhZGVyID0gSlNfU2V0X1NoYWRlciA9IGZ1bmN0aW9uIChzaGFkZXI6IHN0cmluZykge1xyXG4gICAgICBsZXQgcHRyX3NoYWRlciA9IGFsbG9jYXRlVVRGOChzaGFkZXIpO1xyXG4gICAgICAvL2xldCBwdHJfc2hhZGVyID0gTW9kdWxlLl9tYWxsb2Moc2hhZGVyLmxlbmd0aCArIDEpO1xyXG4gICAgICAvL3N0cmluZ1RvQXNjaWkoc2hhZGVyLCBwdHJfc2hhZGVyKTtcclxuICAgICAgX0dTX1NldF9TaGFkZXIocHRyX3NoYWRlcik7XHJcbiAgICAgIF9mcmVlKHB0cl9zaGFkZXIpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1NoYWRlciA9IEpTX1Nob3dfU2hhZGVyID0gZnVuY3Rpb24gKCk6IHN0cmluZyB7XHJcbiAgICAgIGxldCBwdHJfc2ggPSBNb2R1bGUuX21hbGxvYygyMDQwMCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19TaGFkZXIocHRyX3NoKTtcclxuXHJcbiAgICAgIGxldCBzaCA9IFVURjhUb1N0cmluZyhwdHJfc2gpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zaCk7XHJcblxyXG4gICAgICByZXR1cm4gc2g7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX1NoYWRlciA9IEpTX1Nob3dfT25lX1NoYWRlciA9IGZ1bmN0aW9uIChcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBsZXQgcHRyX3NoID0gTW9kdWxlLl9tYWxsb2MoMjA0MDApO1xyXG5cclxuICAgICAgbGV0IHN1Y2NlZWQgPSBfR1NfU2hvd19PbmVfU2hhZGVyKHB0ciwgcHRyX3NoKTtcclxuXHJcbiAgICAgIGxldCBzaCA9IG51bGw7XHJcbiAgICAgIGlmIChzdWNjZWVkKSB7XHJcbiAgICAgICAgbGV0IHNoID0gVVRGOFRvU3RyaW5nKHB0cl9zaCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfc2gpO1xyXG4gICAgICBfZnJlZShwdHIpO1xyXG5cclxuICAgICAgcmV0dXJuIHNoO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9TaGFkZXIgPSBKU19VblNldF9TaGFkZXIgPSBfR1NfVW5TZXRfU2hhZGVyO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9WaWV3cG9ydCA9IEpTX1NldF9WaWV3cG9ydCA9IGZ1bmN0aW9uIChcclxuICAgICAgeDogbnVtYmVyLFxyXG4gICAgICB5OiBudW1iZXIsXHJcbiAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICB0eXBlOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3R5cGUgPSBhbGxvY2F0ZVVURjgodHlwZSk7XHJcbiAgICAgIF9HU19TZXRfVmlld3BvcnQoeCwgeSwgd2lkdGgsIGhlaWdodCwgcHRyX3R5cGUpO1xyXG4gICAgICBfZnJlZShwdHJfdHlwZSk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmEgPSBKU19TZXRfQ2FtZXJhID0gZnVuY3Rpb24gKFxyXG4gICAgICBwb3M6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICB0YXI6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICB1cDogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICBwcm9qZWN0aW9uOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDhdID0gcG9zWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOCArIDFdID0gcG9zWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOCArIDJdID0gcG9zWzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl90YXIgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl90YXIgLyA4XSA9IHRhclswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDggKyAxXSA9IHRhclsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDggKyAyXSA9IHRhclsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfdXAgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDhdID0gdXBbMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDggKyAxXSA9IHVwWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfdXAgLyA4ICsgMl0gPSB1cFsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfcHJvaiA9IGFsbG9jYXRlVVRGOChwcm9qZWN0aW9uKTtcclxuXHJcbiAgICAgIF9HU19TZXRfQ2FtZXJhKHB0cl9wb3MsIHB0cl90YXIsIHB0cl91cCwgd2lkdGgsIGhlaWdodCwgcHRyX3Byb2opO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Rhcik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdXApO1xyXG4gICAgICBfZnJlZShwdHJfcHJvaik7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmFfUG9zaXRpb24gPSBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uID0gZnVuY3Rpb24gKFxyXG4gICAgICBwb3M6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4XSA9IHBvc1swXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDggKyAxXSA9IHBvc1sxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDggKyAyXSA9IHBvc1syXTtcclxuXHJcbiAgICAgIF9HU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHB0cl9wb3MpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ2FtZXJhX1RhcmdldCA9IEpTX1NldF9DYW1lcmFfVGFyZ2V0ID0gZnVuY3Rpb24gKFxyXG4gICAgICB0YXI6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl90YXIgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl90YXIgLyA4XSA9IHRhclswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDggKyAxXSA9IHRhclsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDggKyAyXSA9IHRhclsyXTtcclxuXHJcbiAgICAgIF9HU19TZXRfQ2FtZXJhX1RhcmdldChwdHJfdGFyKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdGFyKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0NhbWVyYV9VcCA9IEpTX1NldF9DYW1lcmFfVXAgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHVwOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfdXAgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDhdID0gdXBbMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDggKyAxXSA9IHVwWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfdXAgLyA4ICsgMl0gPSB1cFsyXTtcclxuXHJcbiAgICAgIF9HU19TZXRfQ2FtZXJhX1VwKHB0cl91cCk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3VwKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0NhbWVyYV9GaWVsZCA9IEpTX1NldF9DYW1lcmFfRmllbGQgPVxyXG4gICAgICBfR1NfU2V0X0NhbWVyYV9GaWVsZDtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ2FtZXJhX0V4dGVudCA9IEpTX1NldF9DYW1lcmFfRXh0ZW50ID1cclxuICAgICAgX0dTX1NldF9DYW1lcmFfRXh0ZW50O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9DYW1lcmFfUHJvamVjdGlvbiA9IEpTX1NldF9DYW1lcmFfUHJvamVjdGlvbiA9XHJcbiAgICAgIGZ1bmN0aW9uIChwcm9qZWN0aW9uOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcHRyX3Byb2ogPSBhbGxvY2F0ZVVURjgocHJvamVjdGlvbik7XHJcblxyXG4gICAgICAgIF9HU19TZXRfQ2FtZXJhX1Byb2plY3Rpb24ocHRyX3Byb2opO1xyXG5cclxuICAgICAgICBfZnJlZShwdHJfcHJvaik7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfS2VlcF9DYW1lcmFfUmF0aW8gPSBKU19LZWVwX0NhbWVyYV9SYXRpbyA9XHJcbiAgICAgIF9HU19LZWVwX0NhbWVyYV9SYXRpbztcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhID0gZnVuY3Rpb24gKCk6IGFueSB7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG4gICAgICBsZXQgcHRyX3RhciA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgbGV0IHB0cl91cCA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuXHJcbiAgICAgIGxldCBwdHJfd2lkdGggPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuICAgICAgbGV0IHB0cl9oZWlnaHQgPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuXHJcbiAgICAgIGxldCBwdHJfcHJvaiA9IE1vZHVsZS5fbWFsbG9jKDY0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0NhbWVyYShcclxuICAgICAgICBwdHJfcG9zLFxyXG4gICAgICAgIHB0cl90YXIsXHJcbiAgICAgICAgcHRyX3VwLFxyXG4gICAgICAgIHB0cl93aWR0aCxcclxuICAgICAgICBwdHJfaGVpZ2h0LFxyXG4gICAgICAgIHB0cl9wcm9qXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBsZXQgY2FtZXJhOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICBwb3NbMF0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOF07XHJcbiAgICAgIHBvc1sxXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4ICsgMV07XHJcbiAgICAgIHBvc1syXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4ICsgMl07XHJcbiAgICAgIGNhbWVyYS5wb3NpdGlvbiA9IHBvcztcclxuXHJcbiAgICAgIGxldCB0YXIgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICB0YXJbMF0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfdGFyIC8gOF07XHJcbiAgICAgIHRhclsxXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl90YXIgLyA4ICsgMV07XHJcbiAgICAgIHRhclsyXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl90YXIgLyA4ICsgMl07XHJcbiAgICAgIGNhbWVyYS50YXJnZXQgPSB0YXI7XHJcblxyXG4gICAgICBsZXQgdXAgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICB1cFswXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDhdO1xyXG4gICAgICB1cFsxXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDggKyAxXTtcclxuICAgICAgdXBbMl0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfdXAgLyA4ICsgMl07XHJcbiAgICAgIGNhbWVyYS51cCA9IHVwO1xyXG5cclxuICAgICAgY2FtZXJhLndpZHRoID0gTW9kdWxlLkhFQVBGNjRbcHRyX3dpZHRoIC8gOF07XHJcbiAgICAgIGNhbWVyYS5oZWlnaHQgPSBNb2R1bGUuSEVBUEY2NFtwdHJfaGVpZ2h0IC8gOF07XHJcblxyXG4gICAgICBjYW1lcmEucHJvamVjdGlvbiA9IFVURjhUb1N0cmluZyhwdHJfcHJvaik7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdGFyKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl91cCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfd2lkdGgpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2hlaWdodCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcHJvaik7XHJcblxyXG4gICAgICByZXR1cm4gY2FtZXJhO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9Qb3NpdGlvbiA9IEpTX1Nob3dfQ2FtZXJhX1Bvc2l0aW9uID1cclxuICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19DYW1lcmFfUG9zaXRpb24ocHRyX3Bvcyk7XHJcblxyXG4gICAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG5cclxuICAgICAgICBwb3NbMF0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOF07XHJcbiAgICAgICAgcG9zWzFdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDggKyAxXTtcclxuICAgICAgICBwb3NbMl0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOCArIDJdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcblxyXG4gICAgICAgIHJldHVybiBwb3M7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfVGFyZ2V0ID0gSlNfU2hvd19DYW1lcmFfVGFyZ2V0ID1cclxuICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwdHJfdGFyID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19DYW1lcmFfVGFyZ2V0KHB0cl90YXIpO1xyXG5cclxuICAgICAgICBsZXQgdGFyID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuXHJcbiAgICAgICAgdGFyWzBdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDhdO1xyXG4gICAgICAgIHRhclsxXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl90YXIgLyA4ICsgMV07XHJcbiAgICAgICAgdGFyWzJdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3RhciAvIDggKyAyXTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90YXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFyO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQ2FtZXJhX1VwID0gSlNfU2hvd19DYW1lcmFfVXAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGxldCBwdHJfdXAgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcblxyXG4gICAgICBfR1NfU2hvd19DYW1lcmFfVXAocHRyX3VwKTtcclxuXHJcbiAgICAgIGxldCB1cCA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcblxyXG4gICAgICB1cFswXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDhdO1xyXG4gICAgICB1cFsxXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl91cCAvIDggKyAxXTtcclxuICAgICAgdXBbMl0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfdXAgLyA4ICsgMl07XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3VwKTtcclxuXHJcbiAgICAgIHJldHVybiB1cDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfRmllbGQgPSBKU19TaG93X0NhbWVyYV9GaWVsZCA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBhbnkge1xyXG4gICAgICAgIGxldCBwdHJfd2lkdGggPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuICAgICAgICBsZXQgcHRyX2hlaWdodCA9IE1vZHVsZS5fbWFsbG9jKDgpO1xyXG5cclxuICAgICAgICBsZXQgZmllbGQgPSBuZXcgRmxvYXQ2NEFycmF5KDIpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19DYW1lcmFfRmllbGQocHRyX3dpZHRoLCBwdHJfaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgZmllbGRbMF0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfd2lkdGggLyA4XTtcclxuICAgICAgICBmaWVsZFsxXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9oZWlnaHQgLyA4XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl93aWR0aCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9oZWlnaHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmllbGQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfRXh0ZW50ID0gSlNfU2hvd19DYW1lcmFfRXh0ZW50ID1cclxuICAgICAgZnVuY3Rpb24gKCk6IEZsb2F0NjRBcnJheSB7XHJcbiAgICAgICAgbGV0IHB0cl9uZWFyID0gTW9kdWxlLl9tYWxsb2MoOCk7XHJcbiAgICAgICAgbGV0IHB0cl9mYXIgPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuXHJcbiAgICAgICAgbGV0IGV4dGVudCA9IG5ldyBGbG9hdDY0QXJyYXkoMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0NhbWVyYV9FeHRlbnQocHRyX25lYXIsIHB0cl9mYXIpO1xyXG5cclxuICAgICAgICBleHRlbnRbMF0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfbmVhciAvIDhdO1xyXG4gICAgICAgIGV4dGVudFsxXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9mYXIgLyA4XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9uZWFyKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2Zhcik7XHJcblxyXG4gICAgICAgIHJldHVybiBleHRlbnQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfUHJvamVjdGlvbiA9IEpTX1Nob3dfQ2FtZXJhX1Byb2plY3Rpb24gPVxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHB0cl9wcm9qID0gTW9kdWxlLl9tYWxsb2MoNjQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19DYW1lcmFfUHJvamVjdGlvbihwdHJfcHJvaik7XHJcblxyXG4gICAgICAgIGxldCBwcm9qZWN0aW9uID0gVVRGOFRvU3RyaW5nKHB0cl9wcm9qKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wcm9qKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb247XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19DYW1lcmFfUHJvamVjdGlvbl9NYXRyaXggPVxyXG4gICAgICBKU19TaG93X0NhbWVyYV9Qcm9qZWN0aW9uX01hdHJpeCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcHRyX21hdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAxNik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0NhbWVyYV9Qcm9qZWN0aW9uX01hdHJpeChwdHJfbWF0KTtcclxuXHJcbiAgICAgICAgbGV0IG1hdCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xyXG4gICAgICAgICAgbWF0W2ldID0gTW9kdWxlLkhFQVBGMzJbcHRyX21hdCAvIDQgKyBpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbWF0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1hdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NhbWVyYV9WaWV3X01hdHJpeCA9IEpTX1Nob3dfQ2FtZXJhX1ZpZXdfTWF0cml4ID1cclxuICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwdHJfbWF0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIDE2KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfQ2FtZXJhX1ZpZXdfTWF0cml4KHB0cl9tYXQpO1xyXG5cclxuICAgICAgICBsZXQgbWF0ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XHJcbiAgICAgICAgICBtYXRbaV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbWF0IC8gNCArIGldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9tYXQpO1xyXG5cclxuICAgICAgICByZXR1cm4gbWF0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUGF0aF9DYW1lcmFfUG9zaXRpb24gPVxyXG4gICAgICBKU19TaG93X1BhdGhfQ2FtZXJhX1Bvc2l0aW9uID0gZnVuY3Rpb24gKHBhdGg6IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICAgICAgbGV0IHBjb3VudCA9IHBhdGgubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwdHJfcGF0aCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX3BhdGggLyA0ICsgaV0gPSBwYXRoW2ldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1BhdGhfQ2FtZXJhX1Bvc2l0aW9uKHB0cl9wYXRoLCBwY291bnQsIHB0cl9wb3MpO1xyXG5cclxuICAgICAgICBsZXQgcG9zID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuXHJcbiAgICAgICAgcG9zWzBdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDhdO1xyXG4gICAgICAgIHBvc1sxXSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4ICsgMV07XHJcbiAgICAgICAgcG9zWzJdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDggKyAyXTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGF0aCk7XHJcblxyXG4gICAgICAgIHJldHVybiBwb3M7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19QYXRoX0NhbWVyYV9UYXJnZXQgPSBKU19TaG93X1BhdGhfQ2FtZXJhX1RhcmdldCA9XHJcbiAgICAgIGZ1bmN0aW9uIChwYXRoOiBBcnJheUxpa2U8bnVtYmVyPikge1xyXG4gICAgICAgIGxldCBwY291bnQgPSBwYXRoLmxlbmd0aDtcclxuICAgICAgICBsZXQgcHRyX3BhdGggPSBNb2R1bGUuX21hbGxvYyg0ICogcGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl9wYXRoIC8gNCArIGldID0gcGF0aFtpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19QYXRoX0NhbWVyYV9UYXJnZXQocHRyX3BhdGgsIHBjb3VudCwgcHRyX3Bvcyk7XHJcblxyXG4gICAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG5cclxuICAgICAgICBwb3NbMF0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOF07XHJcbiAgICAgICAgcG9zWzFdID0gTW9kdWxlLkhFQVBGNjRbcHRyX3BvcyAvIDggKyAxXTtcclxuICAgICAgICBwb3NbMl0gPSBNb2R1bGUuSEVBUEY2NFtwdHJfcG9zIC8gOCArIDJdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXRoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBvcztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Eb2xseV9DYW1lcmEgPSBKU19Eb2xseV9DYW1lcmEgPSBfR1NfRG9sbHlfQ2FtZXJhO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1JvbGxfQ2FtZXJhID0gSlNfUm9sbF9DYW1lcmEgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHN0YXJ0OiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgZW5kOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfc3RhcnQgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9zdGFydCAvIDhdID0gc3RhcnRbMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9zdGFydCAvIDggKyAxXSA9IHN0YXJ0WzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfc3RhcnQgLyA4ICsgMl0gPSBzdGFydFsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfZW5kID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfZW5kIC8gOF0gPSBlbmRbMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9lbmQgLyA4ICsgMV0gPSBlbmRbMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9lbmQgLyA4ICsgMl0gPSBlbmRbMl07XHJcblxyXG4gICAgICBfR1NfUm9sbF9DYW1lcmEocHRyX3N0YXJ0LCBwdHJfZW5kKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfc3RhcnQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2VuZCk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1pvb21fQ2FtZXJhID0gSlNfWm9vbV9DYW1lcmEgPSBfR1NfWm9vbV9DYW1lcmE7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfQ2FtZXJhID0gSlNfVW5TZXRfQ2FtZXJhID0gX0dTX1VuU2V0X0NhbWVyYTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfQ29sb3IgPSBKU19TZXRfQ29sb3IgPSBmdW5jdGlvbiAob3B0aW9uczogc3RyaW5nKSB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcbiAgICAgIF9HU19TZXRfQ29sb3IocHRyKTtcclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfQ29sb3IgPSBKU19VblNldF9Db2xvciA9IF9HU19VblNldF9Db2xvcjtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9PbmVfQ29sb3IgPSBKU19VblNldF9PbmVfQ29sb3IgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfbmFtZSA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgX0dTX1VuU2V0X09uZV9Db2xvcihwdHJfbmFtZSk7XHJcbiAgICAgIF9mcmVlKHB0cl9uYW1lKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Db2xvciA9IEpTX1Nob3dfQ29sb3IgPSBmdW5jdGlvbiAoKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHB0cl9jb2xvcnMgPSBNb2R1bGUuX21hbGxvYyg1MTIpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfQ29sb3IocHRyX2NvbG9ycyk7XHJcblxyXG4gICAgICBsZXQgY29sb3IgPSBVVEY4VG9TdHJpbmcocHRyX2NvbG9ycyk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvbG9ycyk7XHJcblxyXG4gICAgICByZXR1cm4gY29sb3I7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX0NvbG9yID0gSlNfU2hvd19PbmVfQ29sb3IgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBsZXQgcHRyX2NvbG9ycyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICBsZXQgY29sb3IgPSBudWxsO1xyXG4gICAgICBpZiAoX0dTX1Nob3dfT25lX0NvbG9yKHB0cl9uYW1lLCBwdHJfY29sb3JzKSkge1xyXG4gICAgICAgIGNvbG9yID0gVVRGOFRvU3RyaW5nKHB0cl9jb2xvcnMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvbG9ycyk7XHJcbiAgICAgIF9mcmVlKHB0cl9uYW1lKTtcclxuXHJcbiAgICAgIHJldHVybiBjb2xvcjtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Db2xvcl9CeV9WYWx1ZSA9IEpTX1Nob3dfQ29sb3JfQnlfVmFsdWUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBsZXQgcHRyX3ZhbHVlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiA0KTtcclxuXHJcbiAgICAgIGlmIChfR1NfU2hvd19Db2xvcl9CeV9WYWx1ZShwdHJfbmFtZSwgcHRyX3ZhbHVlcykpIHtcclxuICAgICAgICBsZXQgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcclxuXHJcbiAgICAgICAgdmFsdWVzWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlcyAvIDRdO1xyXG4gICAgICAgIHZhbHVlc1sxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl92YWx1ZXMgLyA0ICsgMV07XHJcbiAgICAgICAgdmFsdWVzWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlcyAvIDQgKyAyXTtcclxuICAgICAgICB2YWx1ZXNbM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfdmFsdWVzIC8gNCArIDNdO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZhbHVlcyk7XHJcbiAgICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWVzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0dlb21ldHJ5X0NvbG9yID0gSlNfU2V0X0dlb21ldHJ5X0NvbG9yID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgX0dTX1NldF9HZW9tZXRyeV9Db2xvcihrZXksIHB0cik7XHJcbiAgICAgIF9mcmVlKHB0cik7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZSA9XHJcbiAgICAgIEpTX1NldF9HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlcixcclxuICAgICAgICB0eXBlOiBzdHJpbmcsXHJcbiAgICAgICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICAgICAgdmFsdWU6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfdHlwZSA9IGFsbG9jYXRlVVRGOCh0eXBlKTtcclxuICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2ModmFsdWUubGVuZ3RoICogNCk7XHJcblxyXG4gICAgICAgIGxldCBsZW4gPSB2YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIGldID0gdmFsdWVbaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfR1NfU2V0X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlKFxyXG4gICAgICAgICAga2V5LFxyXG4gICAgICAgICAgcHRyX3R5cGUsXHJcbiAgICAgICAgICBvZmZzZXQsXHJcbiAgICAgICAgICB2YWx1ZS5sZW5ndGggLyA0LFxyXG4gICAgICAgICAgcHRyX3ZhbHVlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl92YWx1ZSk7XHJcbiAgICAgICAgX2ZyZWUocHRyX3R5cGUpO1xyXG4gICAgICB9O1xyXG4gICAgLy8gKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfR2VvbWV0cnlfQ29sb3JfVHlwZSA9IEpTX1Nob3dfR2VvbWV0cnlfQ29sb3JfVHlwZSA9IGZ1bmN0aW9uIChrZXk6IG51bWJlciwgdHlwZTogc3RyaW5nKSB7XHJcbiAgICAvLyAgIGxldCBwdHJfdHlwZSA9IGFsbG9jYXRlVVRGOCh0eXBlKTtcclxuICAgIC8vICAgbGV0IHB0cl9jb2xvcl90eXBlID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAvLyAgIF9HU19TaG93X0dlb21ldHJ5X0NvbG9yX1R5cGUoa2V5LCBwdHJfdHlwZSwgcHRyX2NvbG9yX3R5cGUpO1xyXG4gICAgLy8gICBsZXQgY29sb3JfdHlwZSA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvbG9yX3R5cGUgLyA0XTtcclxuICAgIC8vICAgX2ZyZWUocHRyX3R5cGUpO1xyXG5cclxuICAgIC8vICAgcmV0dXJuIGNvbG9yX3R5cGU7XHJcbiAgICAvLyB9XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZSA9XHJcbiAgICAgIEpTX1Nob3dfR2VvbWV0cnlfQ29sb3JfQnlfVmFsdWUgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgICAgdHlwZTogc3RyaW5nLFxyXG4gICAgICAgIG9mZnNldDogbnVtYmVyXHJcbiAgICAgICk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gbnVsbDtcclxuICAgICAgICBsZXQgcGNvdW50ID0gMDtcclxuICAgICAgICBsZXQga2V5X3R5cGUgPSBKU19TaG93X0tleV9UeXBlKGtleSk7XHJcbiAgICAgICAgaWYgKGtleV90eXBlID09IDEwMyB8fCBrZXlfdHlwZSA9PSAxMDcpIHtcclxuICAgICAgICAgIGxldCBzaGVsbF9zaXplID0gSlNfU2hvd19TaGVsbF9TaXplKGtleSk7XHJcbiAgICAgICAgICBwY291bnQgPSBzaGVsbF9zaXplLnBvcztcclxuICAgICAgICB9IGVsc2UgaWYgKGtleV90eXBlID09IDEwNCkge1xyXG4gICAgICAgICAgbGV0IG1lc2hfc2l6ZSA9IEpTX1Nob3dfTWVzaF9TaXplKGtleSk7XHJcbiAgICAgICAgICBwY291bnQgPSBtZXNoX3NpemUucm93ICogbWVzaF9zaXplLmNvbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwdHJfdHlwZSA9IGFsbG9jYXRlVVRGOCh0eXBlKTtcclxuICAgICAgICBsZXQgcHRyX2NvbG9yX3R5cGUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBfR1NfU2hvd19HZW9tZXRyeV9Db2xvcl9UeXBlKGtleSwgcHRyX3R5cGUsIHB0cl9jb2xvcl90eXBlKTtcclxuICAgICAgICBsZXQgY29sb3JfdHlwZSA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvbG9yX3R5cGUgLyA0XTtcclxuXHJcbiAgICAgICAgaWYgKHBjb3VudCA+IDAgJiYgY29sb3JfdHlwZSA+IDApIHtcclxuICAgICAgICAgIGlmIChjb2xvcl90eXBlID09IDEpIHtcclxuICAgICAgICAgICAgcGNvdW50ID0gMTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgcHRyX3ZhbHVlID0gTW9kdWxlLl9tYWxsb2MocGNvdW50ICogNCk7XHJcblxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBfR1NfU2hvd19HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZShcclxuICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgcHRyX3R5cGUsXHJcbiAgICAgICAgICAgICAgb2Zmc2V0LFxyXG4gICAgICAgICAgICAgIHBjb3VudCxcclxuICAgICAgICAgICAgICBwdHJfdmFsdWVcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGxldCBsZW4gPSBwY291bnQgKiA0O1xyXG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgIHZhbHVlW2ldID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ZhbHVlIC8gNCArIGldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl92YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvbG9yX3R5cGUpO1xyXG4gICAgICAgIF9mcmVlKHB0cl90eXBlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X0dlb21ldHJ5X0NvbG9yID0gSlNfVW5TZXRfR2VvbWV0cnlfQ29sb3IgPVxyXG4gICAgICBmdW5jdGlvbiAoa2V5OiBudW1iZXIsIHR5cGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHJfdHlwZSA9IGFsbG9jYXRlVVRGOCh0eXBlKTtcclxuXHJcbiAgICAgICAgX0dTX1VuU2V0X0dlb21ldHJ5X0NvbG9yKGtleSwgcHRyX3R5cGUpO1xyXG5cclxuICAgICAgICBfZnJlZShwdHJfdHlwZSk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X1Zpc2liaWxpdHkgPSBKU19TZXRfVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIChcclxuICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgX0dTX1NldF9WaXNpYmlsaXR5KHB0cik7XHJcbiAgICAgIF9mcmVlKHB0cik7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X1Zpc2liaWxpdHkgPSBKU19VblNldF9WaXNpYmlsaXR5ID1cclxuICAgICAgX0dTX1VuU2V0X1Zpc2liaWxpdHk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfT25lX1Zpc2liaWxpdHkgPSBKU19VblNldF9PbmVfVmlzaWJpbGl0eSA9XHJcbiAgICAgIGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICAgIF9HU19VblNldF9PbmVfVmlzaWJpbGl0eShwdHIpO1xyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19WaXNpYmlsaXR5ID0gSlNfU2hvd19WaXNpYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBsZXQgcHRyX3ZpID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgIF9HU19TaG93X1Zpc2liaWxpdHkocHRyX3ZpKTtcclxuXHJcbiAgICAgIGxldCB2aSA9IFVURjhUb1N0cmluZyhwdHJfdmkpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl92aSk7XHJcblxyXG4gICAgICByZXR1cm4gdmk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX1Zpc2liaWxpdHkgPSBKU19TaG93X09uZV9WaXNpYmlsaXR5ID0gZnVuY3Rpb24gKFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX25hbWUgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgIGxldCBwdHJfdmkgPSBNb2R1bGUuX21hbGxvYyg2NCk7XHJcblxyXG4gICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gX0dTX1Nob3dfT25lX1Zpc2liaWxpdHkocHRyX25hbWUsIHB0cl92aSk7XHJcblxyXG4gICAgICBsZXQgdmkgPSBudWxsO1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgdmkgPSBVVEY4VG9TdHJpbmcocHRyX3ZpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3ZpKTtcclxuXHJcbiAgICAgIHJldHVybiB2aTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X1NlbGVjdGFiaWxpdHkgPSBKU19TZXRfU2VsZWN0YWJpbGl0eSA9IGZ1bmN0aW9uIChcclxuICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgX0dTX1NldF9TZWxlY3RhYmlsaXR5KHB0cik7XHJcbiAgICAgIF9mcmVlKHB0cik7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X1NlbGVjdGFiaWxpdHkgPSBKU19VblNldF9TZWxlY3RhYmlsaXR5ID1cclxuICAgICAgX0dTX1VuU2V0X1NlbGVjdGFiaWxpdHk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfT25lX1NlbGVjdGFiaWxpdHkgPSBKU19VblNldF9PbmVfU2VsZWN0YWJpbGl0eSA9XHJcbiAgICAgIGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICAgIF9HU19VblNldF9PbmVfU2VsZWN0YWJpbGl0eShwdHIpO1xyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TZWxlY3RhYmlsaXR5ID0gSlNfU2hvd19TZWxlY3RhYmlsaXR5ID1cclxuICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwdHJfc2UgPSBNb2R1bGUuX21hbGxvYyg1MTIpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19TZWxlY3RhYmlsaXR5KHB0cl9zZSk7XHJcblxyXG4gICAgICAgIGxldCBzZSA9IFVURjhUb1N0cmluZyhwdHJfc2UpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3NlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX1NlbGVjdGFiaWxpdHkgPSBKU19TaG93X09uZV9TZWxlY3RhYmlsaXR5ID1cclxuICAgICAgZnVuY3Rpb24gKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHJfbmFtZSA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgICBsZXQgcHRyX3NlID0gTW9kdWxlLl9tYWxsb2MoNjQpO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gX0dTX1Nob3dfT25lX1NlbGVjdGFiaWxpdHkocHRyX25hbWUsIHB0cl9zZSk7XHJcblxyXG4gICAgICAgIGxldCBzZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgc2UgPSBVVEY4VG9TdHJpbmcocHRyX3NlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9mcmVlKHB0cl9uYW1lKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3NlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9Nb2RlbGxpbmdNYXRyaXggPSBKU19TZXRfTW9kZWxsaW5nTWF0cml4ID0gZnVuY3Rpb24gKFxyXG4gICAgICBtbTogQXJyYXlMaWtlPG51bWJlcj5cclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX21tID0gTW9kdWxlLl9tYWxsb2MoNCAqIDE2KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX21tIC8gNCArIGldID0gbW1baV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIF9HU19TZXRfTW9kZWxsaW5nTWF0cml4KHB0cl9tbSk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX21tKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQXBwZW5kX01vZGVsbGluZ01hdHJpeCA9IEpTX0FwcGVuZF9Nb2RlbGxpbmdNYXRyaXggPVxyXG4gICAgICBmdW5jdGlvbiAobW06IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICAgICAgbGV0IHB0cl9tbSA9IE1vZHVsZS5fbWFsbG9jKDQgKiAxNik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfbW0gLyA0ICsgaV0gPSBtbVtpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9HU19BcHBlbmRfTW9kZWxsaW5nTWF0cml4KHB0cl9tbSk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbW0pO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfTW9kZWxsaW5nTWF0cml4ID0gSlNfU2hvd19Nb2RlbGxpbmdNYXRyaXggPVxyXG4gICAgICBmdW5jdGlvbiAoKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgICBsZXQgcHRyX21tID0gTW9kdWxlLl9tYWxsb2MoNCAqIDE2KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfTW9kZWxsaW5nTWF0cml4KHB0cl9tbSk7XHJcblxyXG4gICAgICAgIGxldCBtbSA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xyXG4gICAgICAgICAgbW1baV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbW0gLyA0ICsgaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX21tKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1tO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUGF0aF9Nb2RlbGxpbmdNYXRyaXggPVxyXG4gICAgICBKU19TaG93X1BhdGhfTW9kZWxsaW5nTWF0cml4ID0gZnVuY3Rpb24gKHBhdGg6IEludDMyQXJyYXkpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICAgIGxldCBwY291bnQgPSBwYXRoLmxlbmd0aDtcclxuICAgICAgICBsZXQgcHRyX3BhdGggPSBNb2R1bGUuX21hbGxvYyg0ICogcGNvdW50KTtcclxuICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICBNb2R1bGUuSEVBUDMyW3B0cl9wYXRoIC8gNCArIGldID0gcGF0aFtpXTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQocGF0aCwgcHRyX3BhdGggLyA0KTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9tbSA9IE1vZHVsZS5fbWFsbG9jKDQgKiAxNik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X1BhdGhfTW9kZWxsaW5nTWF0cml4KHB0cl9wYXRoLCBwY291bnQsIHB0cl9tbSk7XHJcblxyXG4gICAgICAgIGxldCBtbSA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xyXG4gICAgICAgICAgbW1baV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbW0gLyA0ICsgaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhdGgpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfbW0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbW07XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfTW9kZWxsaW5nTWF0cml4ID0gSlNfVW5TZXRfTW9kZWxsaW5nTWF0cml4ID1cclxuICAgICAgX0dTX1VuU2V0X01vZGVsbGluZ01hdHJpeDtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfUmVuZGVyaW5nX09wdGlvbnMgPSBKU19TZXRfUmVuZGVyaW5nX09wdGlvbnMgPVxyXG4gICAgICBmdW5jdGlvbiAob3B0aW9uczogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgICBfR1NfU2V0X1JlbmRlcmluZ19PcHRpb25zKHB0cik7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9SZW5kZXJpbmdfT3B0aW9ucyA9IEpTX1VuU2V0X1JlbmRlcmluZ19PcHRpb25zID1cclxuICAgICAgX0dTX1VuU2V0X1JlbmRlcmluZ19PcHRpb25zO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X09uZV9SZW5kZXJpbmdfT3B0aW9uID1cclxuICAgICAgSlNfVW5TZXRfT25lX1JlbmRlcmluZ19PcHRpb24gPSBmdW5jdGlvbiAob3B0aW9uOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG9wdGlvbik7XHJcbiAgICAgICAgX0dTX1VuU2V0X09uZV9SZW5kZXJpbmdfT3B0aW9uKHB0cik7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1JlbmRlcmluZ19PcHRpb25zID0gSlNfU2hvd19SZW5kZXJpbmdfT3B0aW9ucyA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBwdHJfcm8gPSBNb2R1bGUuX21hbGxvYyg1MTIpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19SZW5kZXJpbmdfT3B0aW9ucyhwdHJfcm8pO1xyXG5cclxuICAgICAgICBsZXQgcm8gPSBVVEY4VG9TdHJpbmcocHRyX3JvKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ybyk7XHJcblxyXG4gICAgICAgIHJldHVybiBybztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X09uZV9SZW5kZXJpbmdfT3B0aW9uID1cclxuICAgICAgSlNfU2hvd19PbmVfUmVuZGVyaW5nX09wdGlvbiA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgICAgbGV0IHB0cl9ybyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X09uZV9SZW5kZXJpbmdfT3B0aW9uKHB0ciwgcHRyX3JvKTtcclxuXHJcbiAgICAgICAgbGV0IHJvID0gVVRGOFRvU3RyaW5nKHB0cl9ybyk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcm8pO1xyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIHJldHVybiBybztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X09uZV9EZWZhdWx0X1JlbmRlcmluZ19PcHRpb24gPVxyXG4gICAgICBKU19TaG93X09uZV9EZWZhdWx0X1JlbmRlcmluZ19PcHRpb24gPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICAgIGxldCBwdHJfcm8gPSBNb2R1bGUuX21hbGxvYyg1MTIpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19PbmVfRGVmYXVsdF9SZW5kZXJpbmdfT3B0aW9uKHB0ciwgcHRyX3JvKTtcclxuXHJcbiAgICAgICAgbGV0IHJvID0gVVRGOFRvU3RyaW5nKHB0cl9ybyk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcm8pO1xyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcblxyXG4gICAgICAgIHJldHVybiBybztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X09uZV9QYXRoX1JlbmRlcmluZ19PcHRpb24gPVxyXG4gICAgICBKU19TaG93X09uZV9QYXRoX1JlbmRlcmluZ19PcHRpb24gPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgcGF0aDogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwY291bnQgPSBwYXRoLmxlbmd0aDtcclxuICAgICAgICBsZXQgcHRyX3BhdGggPSBNb2R1bGUuX21hbGxvYyg0ICogcGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl9wYXRoIC8gNCArIGldID0gcGF0aFtpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgICAgbGV0IHB0cl9ybyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X09uZV9QYXRoX1JlbmRlcmluZ19PcHRpb24ocHRyX3BhdGgsIHBjb3VudCwgcHRyLCBwdHJfcm8pO1xyXG5cclxuICAgICAgICBsZXQgcm8gPSBVVEY4VG9TdHJpbmcocHRyX3JvKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXRoKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3JvKTtcclxuICAgICAgICBfZnJlZShwdHIpO1xyXG5cclxuICAgICAgICByZXR1cm4gcm87XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0hldXJpc3RpY19PcHRpb25zID0gSlNfU2V0X0hldXJpc3RpY19PcHRpb25zID1cclxuICAgICAgZnVuY3Rpb24gKG9wdGlvbnM6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcbiAgICAgICAgX0dTX1NldF9IZXVyaXN0aWNfT3B0aW9ucyhwdHIpO1xyXG4gICAgICAgIF9mcmVlKHB0cik7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uID0gSlNfU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uID1cclxuICAgICAgZnVuY3Rpb24gKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwdHJfbmFtZSA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgICBsZXQgcHRyX3ZhbHVlID0gYWxsb2NhdGVVVEY4KHZhbHVlKTtcclxuICAgICAgICBfR1NfU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uKHB0cl9uYW1lLCBwdHJfdmFsdWUpO1xyXG4gICAgICAgIF9mcmVlKHB0cl9uYW1lKTtcclxuICAgICAgICBfZnJlZShwdHJfdmFsdWUpO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uID1cclxuICAgICAgSlNfVW5TZXRfT25lX0hldXJpc3RpY19PcHRpb24gPSBmdW5jdGlvbiAob3B0aW9uOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG9wdGlvbik7XHJcbiAgICAgICAgX0dTX1VuU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uKHB0cik7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9IZXVyaXN0aWNfT3B0aW9ucyA9IEpTX1VuU2V0X0hldXJpc3RpY19PcHRpb25zID1cclxuICAgICAgX0dTX1VuU2V0X0hldXJpc3RpY19PcHRpb25zO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSGV1cmlzdGljX09wdGlvbnMgPSBKU19TaG93X0hldXJpc3RpY19PcHRpb25zID1cclxuICAgICAgZnVuY3Rpb24gKG9wdGlvbnM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHB0cl9obyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0hldXJpc3RpY19PcHRpb25zKHB0cl9obyk7XHJcblxyXG4gICAgICAgIGxldCBobyA9IFVURjhUb1N0cmluZyhwdHJfaG8pO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2hvKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGhvO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX0hldXJpc3RpY19PcHRpb24gPVxyXG4gICAgICBKU19TaG93X09uZV9IZXVyaXN0aWNfT3B0aW9uID0gZnVuY3Rpb24gKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgICBsZXQgcHRyX2hvID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfT25lX0hldXJpc3RpY19PcHRpb24ocHRyLCBwdHJfaG8pO1xyXG5cclxuICAgICAgICBsZXQgaG8gPSBVVEY4VG9TdHJpbmcocHRyX2hvKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9obyk7XHJcbiAgICAgICAgX2ZyZWUocHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGhvO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NldF9Db25kaXRpb24gPSBKU19TZXRfQ29uZGl0aW9uID0gZnVuY3Rpb24gKFxyXG4gICAgICBjb25kaXRpb246IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHIgPSBhbGxvY2F0ZVVURjgoY29uZGl0aW9uKTtcclxuICAgICAgX0dTX1NldF9Db25kaXRpb24ocHRyKTtcclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19Db25kaXRpb24gPSBKU19TaG93X0NvbmRpdGlvbiA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjb25kaXRpb24gPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoX0dTX0F0dHJpYnV0ZV9FeGlzdHMoT2JqZWN0VHlwZS5UWVBFX0NvbmRpdGlvbiBhcyBudW1iZXIpKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2NvbmRpdGlvbiA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICAgICAgX0dTX1Nob3dfQ29uZGl0aW9uKHB0cl9jb25kaXRpb24pO1xyXG5cclxuICAgICAgICAgIGNvbmRpdGlvbiA9IFVURjhUb1N0cmluZyhwdHJfY29uZGl0aW9uKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvbmRpdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29uZGl0aW9uO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1VuU2V0X0NvbmRpdGlvbiA9IEpTX1VuU2V0X0NvbmRpdGlvbiA9XHJcbiAgICAgIF9HU19VblNldF9Db25kaXRpb247XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X1RleHRfRm9udCA9IEpTX1NldF9UZXh0X0ZvbnQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGZvbnRzOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KGZvbnRzKTtcclxuICAgICAgX0dTX1NldF9UZXh0X0ZvbnQocHRyKTtcclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfVGV4dF9Gb250ID0gSlNfVW5TZXRfVGV4dF9Gb250ID1cclxuICAgICAgX0dTX1VuU2V0X1RleHRfRm9udDtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9PbmVfVGV4dF9Gb250ID0gSlNfVW5TZXRfT25lX1RleHRfRm9udCA9IGZ1bmN0aW9uIChcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0ciA9IGFsbG9jYXRlVVRGOChuYW1lKTtcclxuICAgICAgX0dTX1VuU2V0X09uZV9UZXh0X0ZvbnQocHRyKTtcclxuICAgICAgX2ZyZWUocHRyKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19UZXh0X0ZvbnQgPSBKU19TaG93X1RleHRfRm9udCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgbGV0IHB0cl9mb250cyA9IE1vZHVsZS5fbWFsbG9jKDUxMik7XHJcblxyXG4gICAgICBfR1NfU2hvd19UZXh0X0ZvbnQocHRyX2ZvbnRzKTtcclxuXHJcbiAgICAgIGxldCBmb250cyA9IFVURjhUb1N0cmluZyhwdHJfZm9udHMpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9mb250cyk7XHJcblxyXG4gICAgICByZXR1cm4gZm9udHM7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX1RleHRfRm9udCA9IEpTX1Nob3dfT25lX1RleHRfRm9udCA9IGZ1bmN0aW9uIChcclxuICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBsZXQgcHRyX2ZvbnRzID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgIF9HU19TaG93X09uZV9UZXh0X0ZvbnQocHRyX25hbWUsIHB0cl9mb250cyk7XHJcblxyXG4gICAgICBsZXQgZm9udHMgPSBVVEY4VG9TdHJpbmcocHRyX2ZvbnRzKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfZm9udHMpO1xyXG4gICAgICBfZnJlZShwdHJfbmFtZSk7XHJcblxyXG4gICAgICByZXR1cm4gZm9udHM7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0F0dHJpYnV0ZV9FeGlzdHMgPSBKU19BdHRyaWJ1dGVfRXhpc3RzID0gZnVuY3Rpb24gKFxyXG4gICAgICB0eXBlOiBPYmplY3RUeXBlXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIF9HU19BdHRyaWJ1dGVfRXhpc3RzKHR5cGUgYXMgbnVtYmVyKTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW1hZ2VfRXhpc3RzID0gSlNfSW1hZ2VfRXhpc3RzID0gZnVuY3Rpb24gKFxyXG4gICAgICBuYW1lOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gX0dTX0ltYWdlX0V4aXN0cyhwdHIpO1xyXG4gICAgICBfZnJlZShwdHIpO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfUmVzaXplX0J5X0tleSA9IEpTX1Jlc2l6ZV9CeV9LZXkgPSBfR1NfUmVzaXplX0J5X0tleTtcclxuXHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X01hcmtlciA9IEpTX0luc2VydF9NYXJrZXIgPSBfR1NfSW5zZXJ0X01hcmtlcjtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19FZGl0X01hcmtlciA9IEpTX0VkaXRfTWFya2VyID0gX0dTX0VkaXRfTWFya2VyO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfTWFya2VyID0gSlNfU2hvd19NYXJrZXIgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICBsZXQgcHRyX3ggPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl95ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfeiA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfTWFya2VyKGtleSwgcHRyX3gsIHB0cl95LCBwdHJfeik7XHJcblxyXG4gICAgICBsZXQgcG9zID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgcG9zWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ggLyA0XTtcclxuICAgICAgcG9zWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3kgLyA0XTtcclxuICAgICAgcG9zWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ogLyA0XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeSk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeik7XHJcblxyXG4gICAgICByZXR1cm4gcG9zO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfUG9pbnRfQ2xvdWQgPSBKU19JbnNlcnRfUG9pbnRfQ2xvdWQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHBvaW50czogRmxvYXQzMkFycmF5XHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg0ICogcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyLnNldChwb2ludHMsIHB0cl9wb2ludHMgLyA0KTtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBfR1NfSW5zZXJ0X1BvaW50X0Nsb3VkKHB0cl9wb2ludHMsIHBvaW50cy5sZW5ndGggLyAzKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9pbnRzKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfUG9pbnRfQ2xvdWQgPSBKU19FZGl0X1BvaW50X0Nsb3VkID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgcG9pbnRzOiBGbG9hdDMyQXJyYXlcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwb2ludHMubGVuZ3RoKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzIuc2V0KHBvaW50cywgcHRyX3BvaW50cyAvIDQpO1xyXG5cclxuICAgICAgX0dTX0VkaXRfUG9pbnRfQ2xvdWQoa2V5LCBwdHJfcG9pbnRzLCBwb2ludHMubGVuZ3RoIC8gMyk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3BvaW50cyk7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1BvaW50X0Nsb3VkID0gSlNfU2hvd19Qb2ludF9DbG91ZCA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIF9HU19TaG93X1BvaW50X0Nsb3VkX0NvdW50KGtleSwgcHRyX2NvdW50KTtcclxuICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfY291bnQgLyA0XTtcclxuXHJcbiAgICAgIGxldCBwdHJfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGNvdW50ICogMyk7XHJcblxyXG4gICAgICBfR1NfU2hvd19Qb2ludF9DbG91ZChrZXksIHB0cl9wb2ludHMsIHB0cl9jb3VudCk7XHJcblxyXG4gICAgICBsZXQgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDMpO1xyXG5cclxuICAgICAgcmVzdWx0LnNldChcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMi5zdWJhcnJheShwdHJfcG9pbnRzIC8gNCwgcHRyX3BvaW50cyAvIDQgKyBjb3VudCAqIDMpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3BvaW50cyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfY291bnQpO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X0xpbmUgPSBKU19JbnNlcnRfTGluZSA9IF9HU19JbnNlcnRfTGluZTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19FZGl0X0xpbmUgPSBKU19FZGl0X0xpbmUgPSBfR1NfRWRpdF9MaW5lO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfTGluZSA9IEpTX1Nob3dfTGluZSA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIGxldCBwdHJfeDEgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl95MSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX3oxID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfeDIgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl95MiA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX3oyID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19MaW5lKGtleSwgcHRyX3gxLCBwdHJfeTEsIHB0cl96MSwgcHRyX3gyLCBwdHJfeTIsIHB0cl96Mik7XHJcblxyXG4gICAgICBsZXQgcG9zID0gbmV3IEZsb2F0MzJBcnJheSg2KTtcclxuICAgICAgcG9zWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3gxIC8gNF07XHJcbiAgICAgIHBvc1sxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl95MSAvIDRdO1xyXG4gICAgICBwb3NbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfejEgLyA0XTtcclxuICAgICAgcG9zWzNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3gyIC8gNF07XHJcbiAgICAgIHBvc1s0XSA9IE1vZHVsZS5IRUFQRjMyW3B0cl95MiAvIDRdO1xyXG4gICAgICBwb3NbNV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfejIgLyA0XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeDEpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3kxKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl96MSk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeDIpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3kyKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl96Mik7XHJcblxyXG4gICAgICByZXR1cm4gcG9zO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfUG9seWxpbmUgPSBKU19JbnNlcnRfUG9seWxpbmUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHBvaW50czogQXJyYXlMaWtlPG51bWJlcj5cclxuICAgICkge1xyXG4gICAgICBsZXQgbnVtID0gcG9pbnRzLmxlbmd0aDtcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogbnVtKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW07IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV0gPSBwb2ludHNbaV07XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGtleSA9IF9HU19JbnNlcnRfUG9seWxpbmUocHRyX3BvcywgbnVtIC8gMyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfUG9seWxpbmVfQ291bnQgPSBKU19TaG93X1BvbHlsaW5lX0NvdW50ID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogbnVtYmVyIHtcclxuICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfUG9seWxpbmVfQ291bnQoa2V5LCBwdHJfY291bnQpO1xyXG5cclxuICAgICAgbGV0IGNvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfY291bnQgLyA0XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfY291bnQpO1xyXG5cclxuICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X1BvbHlsaW5lID0gSlNfU2hvd19Qb2x5bGluZSA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIGxldCBwdHJfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgX0dTX1Nob3dfUG9seWxpbmVfQ291bnQoa2V5LCBwdHJfY291bnQpO1xyXG4gICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudCAvIDRdO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2NvdW50KTtcclxuXHJcbiAgICAgIGxldCBsZW4gPSBjb3VudCAqIDM7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIGxlbik7XHJcblxyXG4gICAgICBfR1NfU2hvd19Qb2x5bGluZShrZXksIGNvdW50LCBwdHJfcG9zKTtcclxuXHJcbiAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQzMkFycmF5KGxlbik7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBwb3NbaV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcblxyXG4gICAgICByZXR1cm4gcG9zO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfQ2lyY2xlID0gSlNfSW5zZXJ0X0NpcmNsZSA9IGZ1bmN0aW9uIChcclxuICAgICAgY2VudGVyOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgcmFkaXVzOiBudW1iZXIsXHJcbiAgICAgIG5vcm1hbDogQXJyYXlMaWtlPG51bWJlcj5cclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX2NlbnRlciA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2NlbnRlciAvIDRdID0gY2VudGVyWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfY2VudGVyIC8gNCArIDFdID0gY2VudGVyWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfY2VudGVyIC8gNCArIDJdID0gY2VudGVyWzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl9ub3JtYWwgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWwgLyA0XSA9IG5vcm1hbFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDQgKyAxXSA9IG5vcm1hbFsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDQgKyAyXSA9IG5vcm1hbFsyXTtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBfR1NfSW5zZXJ0X0NpcmNsZShwdHJfY2VudGVyLCByYWRpdXMsIHB0cl9ub3JtYWwpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jZW50ZXIpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX25vcm1hbCk7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0NpcmNsZSA9IEpTX1Nob3dfQ2lyY2xlID0gZnVuY3Rpb24gKGtleTogbnVtYmVyKSB7XHJcbiAgICAgIGxldCBwdHJfY2VudGVyID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICBsZXQgcHRyX25vcm1hbCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgbGV0IHB0cl9yYWRpdXMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0NpcmNsZShrZXksIHB0cl9jZW50ZXIsIHB0cl9yYWRpdXMsIHB0cl9ub3JtYWwpO1xyXG5cclxuICAgICAgbGV0IGNlbnRlciA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICAgIGNlbnRlclswXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9jZW50ZXIgLyA0XTtcclxuICAgICAgY2VudGVyWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX2NlbnRlciAvIDQgKyAxXTtcclxuICAgICAgY2VudGVyWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX2NlbnRlciAvIDQgKyAyXTtcclxuXHJcbiAgICAgIGxldCBub3JtYWwgPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICBub3JtYWxbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFsIC8gNF07XHJcbiAgICAgIG5vcm1hbFsxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWwgLyA0ICsgMV07XHJcbiAgICAgIG5vcm1hbFsyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWwgLyA0ICsgMl07XHJcblxyXG4gICAgICBsZXQgcmFkaXVzID0gTW9kdWxlLkhFQVBGMzJbcHRyX3JhZGl1cyAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jZW50ZXIpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX25vcm1hbCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmFkaXVzKTtcclxuXHJcbiAgICAgIHJldHVybiB7IGNlbnRlciwgcmFkaXVzLCBub3JtYWwgfTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X0N5bGluZGVyID0gSlNfSW5zZXJ0X0N5bGluZGVyID0gZnVuY3Rpb24gKFxyXG4gICAgICBzdGFydDogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIGVuZDogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIHJhZGl1czogbnVtYmVyLFxyXG4gICAgICBjYXA6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfc3RhcnQgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9zdGFydCAvIDRdID0gc3RhcnRbMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9zdGFydCAvIDQgKyAxXSA9IHN0YXJ0WzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfc3RhcnQgLyA0ICsgMl0gPSBzdGFydFsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfZW5kID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfZW5kIC8gNF0gPSBlbmRbMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9lbmQgLyA0ICsgMV0gPSBlbmRbMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9lbmQgLyA0ICsgMl0gPSBlbmRbMl07XHJcblxyXG4gICAgICBsZXQgcHRyX2NhcCA9IGFsbG9jYXRlVVRGOChjYXApO1xyXG5cclxuICAgICAgbGV0IGtleSA9IF9HU19JbnNlcnRfQ3lsaW5kZXIocHRyX3N0YXJ0LCBwdHJfZW5kLCByYWRpdXMsIHB0cl9jYXApO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zdGFydCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfZW5kKTtcclxuICAgICAgX2ZyZWUocHRyX2NhcCk7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0N5bGluZGVyID0gSlNfU2hvd19DeWxpbmRlciA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3N0YXJ0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICBsZXQgcHRyX2VuZCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgbGV0IHB0cl9yYWRpdXMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIGxldCBwdHJfY2FwID0gTW9kdWxlLl9tYWxsb2MoMTYpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfQ3lsaW5kZXIoa2V5LCBwdHJfc3RhcnQsIHB0cl9lbmQsIHB0cl9yYWRpdXMsIHB0cl9jYXApO1xyXG5cclxuICAgICAgbGV0IHN0YXJ0ID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgc3RhcnRbMF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfc3RhcnQgLyA0XTtcclxuICAgICAgc3RhcnRbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfc3RhcnQgLyA0ICsgMV07XHJcbiAgICAgIHN0YXJ0WzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3N0YXJ0IC8gNCArIDJdO1xyXG5cclxuICAgICAgbGV0IGVuZCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICAgIGVuZFswXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9lbmQgLyA0XTtcclxuICAgICAgZW5kWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX2VuZCAvIDQgKyAxXTtcclxuICAgICAgZW5kWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX2VuZCAvIDQgKyAyXTtcclxuXHJcbiAgICAgIGxldCByYWRpdXMgPSBNb2R1bGUuSEVBUEYzMltwdHJfcmFkaXVzIC8gNF07XHJcblxyXG4gICAgICBsZXQgY2FwID0gVVRGOFRvU3RyaW5nKHB0cl9jYXApO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zdGFydCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfZW5kKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yYWRpdXMpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2NhcCk7XHJcblxyXG4gICAgICByZXR1cm4geyBzdGFydCwgZW5kLCByYWRpdXMsIGNhcCB9O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfUG9seUN5bGluZGVyID0gSlNfSW5zZXJ0X1BvbHlDeWxpbmRlciA9IGZ1bmN0aW9uIChcclxuICAgICAgcG9pbnRzOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgcmFkaWk6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBjYXA6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvaW50cy5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV0gPSBwb2ludHNbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwdHJfcmFkID0gTW9kdWxlLl9tYWxsb2MoNCAqIHJhZGlpLmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFkaWkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcmFkIC8gNCArIGldID0gcmFkaWlbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwdHJfY2FwID0gYWxsb2NhdGVVVEY4KGNhcCk7XHJcblxyXG4gICAgICBsZXQga2V5ID0gX0dTX0luc2VydF9Qb2x5Q3lsaW5kZXIoXHJcbiAgICAgICAgcHRyX3BvcyxcclxuICAgICAgICBwdHJfcmFkLFxyXG4gICAgICAgIHJhZGlpLmxlbmd0aCxcclxuICAgICAgICBwdHJfY2FwXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmFkKTtcclxuICAgICAgX2ZyZWUocHRyX2NhcCk7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19FZGl0X1BvbHlDeWxpbmRlciA9IEpTX0VkaXRfUG9seUN5bGluZGVyID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgcG9pbnRzOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgcmFkaWk6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBjYXA6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvaW50cy5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV0gPSBwb2ludHNbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwdHJfcmFkID0gTW9kdWxlLl9tYWxsb2MoNCAqIHJhZGlpLmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFkaWkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcmFkIC8gNCArIGldID0gcmFkaWlbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwdHJfY2FwID0gYWxsb2NhdGVVVEY4KGNhcCk7XHJcblxyXG4gICAgICBfR1NfRWRpdF9Qb2x5Q3lsaW5kZXIoa2V5LCBwdHJfcG9zLCBwdHJfcmFkLCByYWRpaS5sZW5ndGgsIHB0cl9jYXApO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3JhZCk7XHJcbiAgICAgIF9mcmVlKHB0cl9jYXApO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X1NoZWxsID0gSlNfSW5zZXJ0X1NoZWxsID0gZnVuY3Rpb24gKFxyXG4gICAgICBwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBpbmRleGVzOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwY291bnQgPSBwb2ludHMubGVuZ3RoO1xyXG4gICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXSA9IHBvaW50c1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGljb3VudCA9IGluZGV4ZXMubGVuZ3RoO1xyXG4gICAgICBsZXQgcHRyX2luZCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBpY291bnQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljb3VudDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfaW5kIC8gNCArIGldID0gaW5kZXhlc1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGtleSA9IF9HU19JbnNlcnRfU2hlbGwocHRyX3BvcywgcGNvdW50IC8gMywgcHRyX2luZCwgaWNvdW50KTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pbmQpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRWRpdF9TaGVsbCA9IEpTX0VkaXRfU2hlbGwgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBpbmRleGVzOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwY291bnQgPSBwb2ludHMubGVuZ3RoO1xyXG4gICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXSA9IHBvaW50c1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGljb3VudCA9IGluZGV4ZXMubGVuZ3RoO1xyXG4gICAgICBsZXQgcHRyX2luZCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBpY291bnQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljb3VudDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfaW5kIC8gNCArIGldID0gaW5kZXhlc1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgX0dTX0VkaXRfU2hlbGwoa2V5LCBwdHJfcG9zLCBwY291bnQgLyAzLCBwdHJfaW5kLCBpY291bnQpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2luZCk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9Ucmlhbmd1bGFyX1NoZWxsID0gSlNfSW5zZXJ0X1RyaWFuZ3VsYXJfU2hlbGwgPVxyXG4gICAgICBmdW5jdGlvbiAocG9pbnRzOiBBcnJheUxpa2U8bnVtYmVyPiwgaW5kZXhlczogQXJyYXlMaWtlPG51bWJlcj4pIHtcclxuICAgICAgICBsZXQgcGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcclxuICAgICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV0gPSBwb2ludHNbaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaWNvdW50ID0gaW5kZXhlcy5sZW5ndGg7XHJcbiAgICAgICAgbGV0IHB0cl9pbmQgPSBNb2R1bGUuX21hbGxvYyg0ICogaWNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl9pbmQgLyA0ICsgaV0gPSBpbmRleGVzW2ldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGtleSA9IF9HU19JbnNlcnRfVHJpYW5ndWxhcl9TaGVsbChcclxuICAgICAgICAgIHB0cl9wb3MsXHJcbiAgICAgICAgICBwY291bnQgLyAzLFxyXG4gICAgICAgICAgcHRyX2luZCxcclxuICAgICAgICAgIGljb3VudFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2luZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19TaGVsbF9TaXplID0gSlNfU2hvd19TaGVsbF9TaXplID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogYW55IHtcclxuICAgICAgbGV0IHB0cl9wb3NfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl9mYWNlX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19TaGVsbF9TaXplKGtleSwgcHRyX3Bvc19jb3VudCwgcHRyX2ZhY2VfY291bnQpO1xyXG5cclxuICAgICAgbGV0IHBvc19jb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX3Bvc19jb3VudCAvIDRdO1xyXG4gICAgICBsZXQgZmFjZV9jb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2ZhY2VfY291bnQgLyA0XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zX2NvdW50KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9mYWNlX2NvdW50KTtcclxuXHJcbiAgICAgIHJldHVybiB7IHBvczogcG9zX2NvdW50LCBmYWNlOiBmYWNlX2NvdW50IH07XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfU2hlbGwgPSBKU19TaG93X1NoZWxsID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogYW55IHtcclxuICAgICAgbGV0IHB0cl9wb3NfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl9mYWNlX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19TaGVsbF9TaXplKGtleSwgcHRyX3Bvc19jb3VudCwgcHRyX2ZhY2VfY291bnQpO1xyXG5cclxuICAgICAgbGV0IHBvc19jb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX3Bvc19jb3VudCAvIDRdO1xyXG4gICAgICBsZXQgZmFjZV9jb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2ZhY2VfY291bnQgLyA0XTtcclxuXHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvc19jb3VudCAqIDMpO1xyXG4gICAgICBsZXQgcHRyX2ZhY2UgPSBNb2R1bGUuX21hbGxvYyg0ICogZmFjZV9jb3VudCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19TaGVsbChrZXksIHB0cl9wb3NfY291bnQsIHB0cl9wb3MsIHB0cl9mYWNlX2NvdW50LCBwdHJfZmFjZSk7XHJcblxyXG4gICAgICBsZXQgcG9zID0gbmV3IEZsb2F0MzJBcnJheShwb3NfY291bnQgKiAzKTtcclxuICAgICAgbGV0IGZhY2UgPSBuZXcgSW50MzJBcnJheShmYWNlX2NvdW50KTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zX2NvdW50OyBpKyspIHtcclxuICAgICAgICBwb3NbaSAqIDNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpICogM107XHJcbiAgICAgICAgcG9zW2kgKiAzICsgMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGkgKiAzICsgMV07XHJcbiAgICAgICAgcG9zW2kgKiAzICsgMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGkgKiAzICsgMl07XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmYWNlX2NvdW50OyBpKyspIHtcclxuICAgICAgICBmYWNlW2ldID0gTW9kdWxlLkhFQVAzMltwdHJfZmFjZSAvIDQgKyBpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3NfY291bnQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2ZhY2VfY291bnQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfZmFjZSk7XHJcblxyXG4gICAgICByZXR1cm4geyBwb3MsIGZhY2UgfTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X01lc2ggPSBKU19JbnNlcnRfTWVzaCA9IGZ1bmN0aW9uIChcclxuICAgICAgcm93OiBudW1iZXIsXHJcbiAgICAgIGNvbDogbnVtYmVyLFxyXG4gICAgICBwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICApIHtcclxuICAgICAgbGV0IHBjb3VudCA9IHJvdyAqIGNvbCAqIDM7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGldID0gcG9pbnRzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQga2V5ID0gX0dTX0luc2VydF9NZXNoKHJvdywgY29sLCBwdHJfcG9zKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfTWVzaF9Qb2ludHMgPSBKU19FZGl0X01lc2hfUG9pbnRzID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgcG9pbnRzOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwY291bnQgPSBwb2ludHMubGVuZ3RoO1xyXG4gICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXSA9IHBvaW50c1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgX0dTX0VkaXRfTWVzaF9Qb2ludHMoa2V5LCBwdHJfcG9zKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfTWVzaF9TaXplID0gSlNfU2hvd19NZXNoX1NpemUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBhbnkge1xyXG4gICAgICBsZXQgcHRyX3Jvd19jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX2NvbF9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfTWVzaF9TaXplKGtleSwgcHRyX3Jvd19jb3VudCwgcHRyX2NvbF9jb3VudCk7XHJcblxyXG4gICAgICBsZXQgcm93X2NvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfcm93X2NvdW50IC8gNF07XHJcbiAgICAgIGxldCBjb2xfY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9jb2xfY291bnQgLyA0XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcm93X2NvdW50KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb2xfY291bnQpO1xyXG5cclxuICAgICAgcmV0dXJuIHsgcm93OiByb3dfY291bnQsIGNvbDogY29sX2NvdW50IH07XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfTWVzaCA9IEpTX1Nob3dfTWVzaCA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgIGxldCBwdHJfcm93X2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfY29sX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19NZXNoX1NpemUoa2V5LCBwdHJfcm93X2NvdW50LCBwdHJfY29sX2NvdW50KTtcclxuXHJcbiAgICAgIGxldCByb3cgPSBNb2R1bGUuSEVBUDMyW3B0cl9yb3dfY291bnQgLyA0XTtcclxuICAgICAgbGV0IGNvbCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvbF9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgbGV0IGNvdW50ID0gcm93ICogY29sICogMztcclxuXHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHJvdyAqIGNvbCAqIDMpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfTWVzaChrZXksIHB0cl9yb3dfY291bnQsIHB0cl9jb2xfY291bnQsIHB0cl9wb3MpO1xyXG5cclxuICAgICAgbGV0IHBvcyA9IG5ldyBGbG9hdDMyQXJyYXkocm93ICogY29sICogMyk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICBwb3NbaV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jvd19jb3VudCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfY29sX2NvdW50KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG5cclxuICAgICAgcmV0dXJuIHBvcztcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfSW5zZXJ0X1ZlY3Rvcl9UZXh0ID0gSlNfSW5zZXJ0X1ZlY3Rvcl9UZXh0ID0gZnVuY3Rpb24gKFxyXG4gICAgICB0ZXh0OiBzdHJpbmcsXHJcbiAgICAgIHBvc2l0aW9uOiBGbG9hdDMyQXJyYXksXHJcbiAgICAgIHhfYXhpczogRmxvYXQzMkFycmF5LFxyXG4gICAgICB5X2F4aXM6IEZsb2F0MzJBcnJheSxcclxuICAgICAgZm9udHM6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfdGV4dCA9IGFsbG9jYXRlVVRGOCh0ZXh0KTtcclxuICAgICAgbGV0IHB0cl9mb250cyA9IG51bGw7XHJcbiAgICAgIGlmIChmb250cykge1xyXG4gICAgICAgIHB0cl9mb250cyA9IGFsbG9jYXRlVVRGOChmb250cyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMi5zZXQocG9zaXRpb24sIHB0cl9wb3MgLyA0KTtcclxuICAgICAgbGV0IHB0cl94ID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMi5zZXQoeF9heGlzLCBwdHJfeCAvIDQpO1xyXG4gICAgICBsZXQgcHRyX3kgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyLnNldCh5X2F4aXMsIHB0cl95IC8gNCk7XHJcblxyXG4gICAgICBsZXQga2V5ID0gX0dTX0luc2VydF9WZWN0b3JfVGV4dChcclxuICAgICAgICBwdHJfdGV4dCxcclxuICAgICAgICBwdHJfcG9zLFxyXG4gICAgICAgIHB0cl94LFxyXG4gICAgICAgIHB0cl95LFxyXG4gICAgICAgIHB0cl9mb250c1xyXG4gICAgICApO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3gpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3kpO1xyXG4gICAgICBfZnJlZShwdHJfdGV4dCk7XHJcbiAgICAgIGlmIChmb250cykge1xyXG4gICAgICAgIF9mcmVlKHB0cl9mb250cyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9QYXJhbWV0cmljX0dlb21ldHJ5ID1cclxuICAgICAgSlNfSW5zZXJ0X1BhcmFtZXRyaWNfR2VvbWV0cnkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgdHlwZTogc3RyaW5nLFxyXG4gICAgICAgIHBhcmFtczogRmxvYXQ2NEFycmF5XHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfdHlwZSA9IGFsbG9jYXRlVVRGOCh0eXBlKTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9wYXJhbXMgPSBNb2R1bGUuX21hbGxvYyg4ICogcGFyYW1zLmxlbmd0aCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHBhcmFtcywgcHRyX3BhcmFtcyAvIDgpO1xyXG5cclxuICAgICAgICBsZXQga2V5ID0gX0dTX0luc2VydF9QYXJhbWV0cmljX0dlb21ldHJ5KFxyXG4gICAgICAgICAgcHRyX3R5cGUsXHJcbiAgICAgICAgICBwdHJfcGFyYW1zLFxyXG4gICAgICAgICAgcGFyYW1zLmxlbmd0aFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGFyYW1zKTtcclxuICAgICAgICBfZnJlZShwdHJfdHlwZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRWRpdF9QYXJhbWV0cmljX0dlb21ldHJ5ID0gSlNfRWRpdF9QYXJhbWV0cmljX0dlb21ldHJ5ID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyLCB0eXBlOiBzdHJpbmcsIHBhcmFtczogRmxvYXQ2NEFycmF5KSB7XHJcbiAgICAgICAgbGV0IHB0cl90eXBlID0gYWxsb2NhdGVVVEY4KHR5cGUpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3BhcmFtcyA9IE1vZHVsZS5fbWFsbG9jKDggKiBwYXJhbXMubGVuZ3RoKTtcclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQocGFyYW1zLCBwdHJfcGFyYW1zIC8gOCk7XHJcblxyXG4gICAgICAgIF9HU19FZGl0X1BhcmFtZXRyaWNfR2VvbWV0cnkoa2V5LCBwdHJfdHlwZSwgcHRyX3BhcmFtcywgcGFyYW1zLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGFyYW1zKTtcclxuICAgICAgICBfZnJlZShwdHJfdHlwZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19QYXJhbWV0cmljX0dlb21ldHJ5ID0gSlNfU2hvd19QYXJhbWV0cmljX0dlb21ldHJ5ID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHB0cl90eXBlID0gTW9kdWxlLl9tYWxsb2MoOCk7XHJcbiAgICAgICAgbGV0IHB0cl9wYXJhbXMgPSBNb2R1bGUuX21hbGxvYyg4ICogMTAyNCk7XHJcbiAgICAgICAgbGV0IHB0cl9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19QYXJhbWV0cmljX0dlb21ldHJ5KGtleSwgcHRyX3R5cGUsIHB0cl9wYXJhbXMsIHB0cl9jb3VudCk7XHJcblxyXG4gICAgICAgIGxldCBjb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2NvdW50IC8gNF07XHJcbiAgICAgICAgbGV0IHR5cGUgPSBVVEY4VG9TdHJpbmcocHRyX3R5cGUpO1xyXG5cclxuICAgICAgICBsZXQgcGFyYW1zID0gbmV3IEZsb2F0NjRBcnJheShjb3VudCk7XHJcbiAgICAgICAgcGFyYW1zLnNldChcclxuICAgICAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHB0cl9wYXJhbXMgLyA4LCBwdHJfcGFyYW1zIC8gOCArIGNvdW50KVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfY291bnQpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGFyYW1zKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3R5cGUpO1xyXG5cclxuICAgICAgICByZXR1cm4geyB0eXBlLCBwYXJhbXMgfTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfUGFyYW1ldHJpY19HZW9tZXRyaWVzID1cclxuICAgICAgSlNfSW5zZXJ0X1BhcmFtZXRyaWNfR2VvbWV0cmllcyA9IGZ1bmN0aW9uIChcclxuICAgICAgICB0eXBlOiBzdHJpbmcsXHJcbiAgICAgICAgcGFyYW1zOiBGbG9hdDY0QXJyYXksXHJcbiAgICAgICAgZ2VvQ291bnQ6IG51bWJlclxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyX3R5cGUgPSBhbGxvY2F0ZVVURjgodHlwZSk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfcGFyYW1zID0gTW9kdWxlLl9tYWxsb2MoOCAqIHBhcmFtcy5sZW5ndGgpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnNldChwYXJhbXMsIHB0cl9wYXJhbXMgLyA4KTtcclxuXHJcbiAgICAgICAgbGV0IGtleSA9IF9HU19JbnNlcnRfUGFyYW1ldHJpY19HZW9tZXRyaWVzKFxyXG4gICAgICAgICAgcHRyX3R5cGUsXHJcbiAgICAgICAgICBwdHJfcGFyYW1zLFxyXG4gICAgICAgICAgcGFyYW1zLmxlbmd0aCxcclxuICAgICAgICAgIGdlb0NvdW50XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXJhbXMpO1xyXG4gICAgICAgIF9mcmVlKHB0cl90eXBlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfTGlnaHQgPSBKU19JbnNlcnRfTGlnaHQgPSBfR1NfSW5zZXJ0X0xpZ2h0O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0VkaXRfTGlnaHQgPSBKU19FZGl0X0xpZ2h0ID0gX0dTX0VkaXRfTGlnaHQ7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19MaWdodCA9IEpTX1Nob3dfTGlnaHQgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBhbnkge1xyXG4gICAgICBsZXQgcHRyX3ggPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgbGV0IHB0cl95ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfeiA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX2IgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0xpZ2h0KGtleSwgcHRyX3gsIHB0cl95LCBwdHJfeiwgcHRyX2IpO1xyXG5cclxuICAgICAgbGV0IHBvcyA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICAgIHBvc1swXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl94IC8gNF07XHJcbiAgICAgIHBvc1sxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl95IC8gNF07XHJcbiAgICAgIHBvc1syXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl96IC8gNF07XHJcblxyXG4gICAgICBsZXQgY2FtZXJhX3JlbGF0aXZlID0gTW9kdWxlLkhFQVAzMltwdHJfYiAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl94KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl95KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl96KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9iKTtcclxuXHJcbiAgICAgIHJldHVybiB7IHBvcywgY2FtZXJhX3JlbGF0aXZlOiBjYW1lcmFfcmVsYXRpdmUgPT0gMCA/IGZhbHNlIDogdHJ1ZSB9O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19JbnNlcnRfSW1hZ2UgPSBKU19JbnNlcnRfSW1hZ2UgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHg6IG51bWJlcixcclxuICAgICAgeTogbnVtYmVyLFxyXG4gICAgICB6OiBudW1iZXIsXHJcbiAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICBkYXRhOiBBcnJheUJ1ZmZlciB8IG51bGwsXHJcbiAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfZGF0YSA9IG51bGw7XHJcblxyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgbGV0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVA4LnNldChhcnJheSwgcHRyX2RhdGEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX2RhdGEgLyA0XSA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBfR1NfSW5zZXJ0X0ltYWdlKHgsIHksIHosIHdpZHRoLCBoZWlnaHQsIHB0cl9kYXRhLCBwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG4gICAgICBfZnJlZShwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZXRfSW1hZ2VfT3B0aW9ucyA9IEpTX1NldF9JbWFnZV9PcHRpb25zID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG5cclxuICAgICAgX0dTX1NldF9JbWFnZV9PcHRpb25zKGtleSwgcHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9PbmVfSW1hZ2VfT3B0aW9uID0gSlNfVW5TZXRfT25lX0ltYWdlX09wdGlvbiA9XHJcbiAgICAgIGZ1bmN0aW9uIChrZXk6IG51bWJlciwgbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHB0cl9uYW1lID0gYWxsb2NhdGVVVEY4KG5hbWUpO1xyXG5cclxuICAgICAgICBfR1NfVW5TZXRfT25lX0ltYWdlX09wdGlvbihrZXksIHB0cl9uYW1lKTtcclxuXHJcbiAgICAgICAgX2ZyZWUocHRyX25hbWUpO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSW1hZ2VfUG9zaXRpb24gPSBKU19TaG93X0ltYWdlX1Bvc2l0aW9uID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgbGV0IHB0cl94ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfeSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX3ogPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0ltYWdlX1Bvc2l0aW9uKGtleSwgcHRyX3gsIHB0cl95LCBwdHJfeik7XHJcblxyXG4gICAgICBsZXQgcG9zID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgcG9zWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ggLyA0XTtcclxuICAgICAgcG9zWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3kgLyA0XTtcclxuICAgICAgcG9zWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3ogLyA0XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeSk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfeik7XHJcblxyXG4gICAgICByZXR1cm4gcG9zO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0ltYWdlX1NpemUgPSBKU19TaG93X0ltYWdlX1NpemUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApOiBhbnkge1xyXG4gICAgICBsZXQgcHRyX3dpZHRoID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfaGVpZ2h0ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19JbWFnZV9TaXplKGtleSwgcHRyX3dpZHRoLCBwdHJfaGVpZ2h0KTtcclxuXHJcbiAgICAgIGxldCB3aWR0aCA9IE1vZHVsZS5IRUFQMzJbcHRyX3dpZHRoIC8gNF07XHJcbiAgICAgIGxldCBoZWlnaHQgPSBNb2R1bGUuSEVBUDMyW3B0cl9oZWlnaHQgLyA0XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfd2lkdGgpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2hlaWdodCk7XHJcblxyXG4gICAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfSW1hZ2VfRGF0YSA9IEpTX1Nob3dfSW1hZ2VfRGF0YSA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICk6IFVpbnQ4QXJyYXkge1xyXG4gICAgICBsZXQgcHRyX3NpemUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgIF9HU19TaG93X0ltYWdlX0RhdGFfU2l6ZShrZXksIHB0cl9zaXplKTtcclxuXHJcbiAgICAgIGxldCBzaXplID0gTW9kdWxlLkhFQVAzMltwdHJfc2l6ZSAvIDRdO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zaXplKTtcclxuXHJcbiAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKHNpemUpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfSW1hZ2VfRGF0YShrZXksIHB0cl9kYXRhKTtcclxuXHJcbiAgICAgIGxldCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc2l6ZSk7XHJcbiAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgICAgZGF0YS5zZXQoTW9kdWxlLkhFQVA4LnN1YmFycmF5KHB0cl9kYXRhLCBwdHJfZGF0YSArIHNpemUpKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcblxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19JbWFnZV9PcHRpb25zID0gSlNfU2hvd19JbWFnZV9PcHRpb25zID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlclxyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgIF9HU19TaG93X0ltYWdlX09wdGlvbnMoa2V5LCBwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICBsZXQgb3B0aW9ucyA9IFVURjhUb1N0cmluZyhwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfT25lX0ltYWdlX09wdGlvbiA9IEpTX1Nob3dfT25lX0ltYWdlX09wdGlvbiA9XHJcbiAgICAgIGZ1bmN0aW9uIChrZXk6IG51bWJlciwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcHRyX25hbWUgPSBhbGxvY2F0ZVVURjgobmFtZSk7XHJcbiAgICAgICAgbGV0IHB0cl9vcHRpb24gPSBNb2R1bGUuX21hbGxvYyg1MTIpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19PbmVfSW1hZ2VfT3B0aW9uKGtleSwgcHRyX25hbWUsIHB0cl9vcHRpb24pO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uID0gVVRGOFRvU3RyaW5nKHB0cl9vcHRpb24pO1xyXG5cclxuICAgICAgICBfZnJlZShwdHJfbmFtZSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9vcHRpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gb3B0aW9uO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0luc2VydF9DdXR0aW5nX1BsYW5lcyA9IEpTX0luc2VydF9DdXR0aW5nX1BsYW5lcyA9XHJcbiAgICAgIGZ1bmN0aW9uIChwbGFuZXM6IEZsb2F0MzJBcnJheSkge1xyXG4gICAgICAgIGxldCBwdHJfcGxhbmVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBsYW5lcy5sZW5ndGggKiAzKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BsYW5lcyAvIDQgKyBpXSA9IHBsYW5lc1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGtleSA9IF9HU19JbnNlcnRfQ3V0dGluZ19QbGFuZXMocHRyX3BsYW5lcywgcGxhbmVzLmxlbmd0aCAvIDEyKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BsYW5lcyk7XHJcblxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRWRpdF9DdXR0aW5nX1BsYW5lcyA9IEpTX0VkaXRfQ3V0dGluZ19QbGFuZXMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBwbGFuZXM6IEZsb2F0MzJBcnJheVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwdHJfcGxhbmVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBsYW5lcy5sZW5ndGggKiAzKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFuZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcGxhbmVzIC8gNCArIGldID0gcGxhbmVzW2ldO1xyXG4gICAgICB9XHJcbiAgICAgIF9HU19FZGl0X0N1dHRpbmdfUGxhbmVzKGtleSwgcHRyX3BsYW5lcywgcGxhbmVzLmxlbmd0aCAvIDEyKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wbGFuZXMpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0N1dHRpbmdfUGxhbmVzID0gSlNfU2hvd19DdXR0aW5nX1BsYW5lcyA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3BsYW5lcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiA2ICogMyAqIDQpO1xyXG4gICAgICBsZXQgcHRyX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICBfR1NfU2hvd19DdXR0aW5nX1BsYW5lcyhrZXksIHB0cl9wbGFuZXMsIHB0cl9jb3VudCk7XHJcblxyXG4gICAgICBsZXQgY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9jb3VudCAvIDRdICogNCAqIDM7XHJcbiAgICAgIGxldCBwbGFuZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgcGxhbmVzW2ldID0gTW9kdWxlLkhFQVBGMzJbcHRyX3BsYW5lcyAvIDQgKyBpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9jb3VudCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcGxhbmVzKTtcclxuXHJcbiAgICAgIHJldHVybiBwbGFuZXM7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfR2VvbWV0cnlfVmVydGljZXNfUG9zaXRpb25fQnlfSW5kZXhlcyA9XHJcbiAgICAgIEpTX1Nob3dfR2VvbWV0cnlfVmVydGljZXNfUG9zaXRpb25fQnlfSW5kZXhlcyA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlcixcclxuICAgICAgICBpbmRleGVzOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgICApOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICAgIGxldCBpY291bnQgPSBpbmRleGVzLmxlbmd0aDtcclxuICAgICAgICBsZXQgcHRyX2lkeCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBpY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWNvdW50OyBpKyspIHtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX2lkeCAvIDQgKyBpXSA9IGluZGV4ZXNbaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcGNvdW50ID0gaWNvdW50ICogMztcclxuICAgICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19HZW9tZXRyeV9WZXJ0aWNlc19Qb3NpdGlvbl9CeV9JbmRleGVzKFxyXG4gICAgICAgICAga2V5LFxyXG4gICAgICAgICAgcHRyX2lkeCxcclxuICAgICAgICAgIGljb3VudCxcclxuICAgICAgICAgIHB0cl9wb3NcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShwY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2lkeCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG5cclxuICAgICAgICByZXR1cm4gcG9zaXRpb25zO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfR2VvbWV0cnlfRWxlbWVudF9UeXBlID1cclxuICAgICAgSlNfU2hvd19HZW9tZXRyeV9FbGVtZW50X1R5cGUgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgICAgZWxlbWVudF90eXBlOiBFbGVtZW50VHlwZSxcclxuICAgICAgICBpbmRleGVzOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICAgICApOiBudW1iZXIge1xyXG4gICAgICAgIGlmIChlbGVtZW50X3R5cGUgPT0gRWxlbWVudFR5cGUuRUxFTUVOVF9UWVBFX1ZlcnRleCkge1xyXG4gICAgICAgICAgbGV0IHB0cl9pZHggPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX2lkeCAvIDRdID0gaW5kZXhlc1swXTtcclxuXHJcbiAgICAgICAgICBsZXQgcHRyX3R5cGUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICAgIF9HU19TaG93X0dlb21ldHJ5X0VsZW1lbnRfVHlwZShcclxuICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICBlbGVtZW50X3R5cGUgYXMgbnVtYmVyLFxyXG4gICAgICAgICAgICBwdHJfaWR4LFxyXG4gICAgICAgICAgICBwdHJfdHlwZVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBsZXQgdHlwZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3R5cGUgLyA0XTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2lkeCk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3R5cGUpO1xyXG5cclxuICAgICAgICAgIHJldHVybiB0eXBlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudF90eXBlID09IEVsZW1lbnRUeXBlLkVMRU1FTlRfVFlQRV9FZGdlKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2lkeCA9IE1vZHVsZS5fbWFsbG9jKDQgKiAyKTtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX2lkeCAvIDRdID0gaW5kZXhlc1swXTtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX2lkeCAvIDQgKyAxXSA9IGluZGV4ZXNbMV07XHJcblxyXG4gICAgICAgICAgbGV0IHB0cl90eXBlID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgICBfR1NfU2hvd19HZW9tZXRyeV9FbGVtZW50X1R5cGUoXHJcbiAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgZWxlbWVudF90eXBlIGFzIG51bWJlcixcclxuICAgICAgICAgICAgcHRyX2lkeCxcclxuICAgICAgICAgICAgcHRyX3R5cGVcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgbGV0IHR5cGUgPSBNb2R1bGUuSEVBUDMyW3B0cl90eXBlIC8gNF07XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pZHgpO1xyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90eXBlKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdHlwZTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzID1cclxuICAgICAgSlNfU2V0X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICAgIG9mZnNldDogbnVtYmVyLFxyXG4gICAgICAgIGNvdW50OiBudW1iZXIsXHJcbiAgICAgICAgdmFsdWU6IEZsb2F0MzJBcnJheVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcGNvdW50ID0gdmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXSA9IHZhbHVlW2ldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX0dTX1NldF9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyhrZXksIG9mZnNldCwgY291bnQsIHB0cl9wb3MpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19HZW9tZXRyeV9UZXh0dXJlX0RpbWVuc2lvbiA9XHJcbiAgICAgIEpTX1Nob3dfR2VvbWV0cnlfVGV4dHVyZV9EaW1lbnNpb24gPSBmdW5jdGlvbiAoa2V5OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwdHJfZGltID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIF9HU19TaG93X0dlb21ldHJ5X1RleHR1cmVfRGltZW5zaW9uKGtleSwgcHRyX2RpbSk7XHJcblxyXG4gICAgICAgIGxldCBkaW0gPSBNb2R1bGUuSEVBUDMyW3B0cl9kaW0gLyA0XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kaW0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGltO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMgPVxyXG4gICAgICBKU19TaG93X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICAgIG9mZnNldDogbnVtYmVyLFxyXG4gICAgICAgIGNvdW50XHJcbiAgICAgICk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgICAgbGV0IGxlbiA9IGNvdW50ICogMjtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9jb29yZHMgPSBNb2R1bGUuX21hbGxvYyg0ICogbGVuKTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMoa2V5LCBvZmZzZXQsIGNvdW50LCBwdHJfY29vcmRzKTtcclxuXHJcbiAgICAgICAgbGV0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgY29vcmRzW2ldID0gTW9kdWxlLkhFQVBGMzJbcHRyX2Nvb3JkcyAvIDQgKyBpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfY29vcmRzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvb3JkcztcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19VblNldF9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyA9XHJcbiAgICAgIEpTX1VuU2V0X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzID0gX0dTX1VuU2V0X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzO1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMgPVxyXG4gICAgICBKU19Db21wdXRlX0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcblxyXG4gICAgICAgIF9HU19Db21wdXRlX0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzKGtleSwgcHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgICBfZnJlZShwdHJfb3B0aW9ucyk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2V0X0dlb21ldHJ5X05vcm1hbHMgPSBKU19TZXRfR2VvbWV0cnlfTm9ybWFscyA9XHJcbiAgICAgIGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlcixcclxuICAgICAgICBvZmZzZXQ6IG51bWJlcixcclxuICAgICAgICBjb3VudDogbnVtYmVyLFxyXG4gICAgICAgIHZhbHVlOiBGbG9hdDMyQXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHBjb3VudCA9IHZhbHVlLmxlbmd0aDtcclxuICAgICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaV0gPSB2YWx1ZVtpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9HU19TZXRfR2VvbWV0cnlfTm9ybWFscyhrZXksIG9mZnNldCwgY291bnQsIHB0cl9wb3MpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2hvd19HZW9tZXRyeV9Ob3JtYWxzID0gSlNfU2hvd19HZW9tZXRyeV9Ob3JtYWxzID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyLCBvZmZzZXQ6IG51bWJlciwgY291bnQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwdHJfbm9ybWFscyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBjb3VudCAqIDMpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19HZW9tZXRyeV9Ob3JtYWxzKGtleSwgb2Zmc2V0LCBjb3VudCwgcHRyX25vcm1hbHMpO1xyXG5cclxuICAgICAgICBsZXQgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAzKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICBub3JtYWxzW2kgKiAzXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWxzIC8gNCArIGkgKiAzXTtcclxuICAgICAgICAgIG5vcm1hbHNbaSAqIDMgKyAxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWxzIC8gNCArIGkgKiAzICsgMV07XHJcbiAgICAgICAgICBub3JtYWxzW2kgKiAzICsgMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFscyAvIDQgKyBpICogMyArIDJdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ub3JtYWxzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5vcm1hbHM7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfVW5TZXRfR2VvbWV0cnlfTm9ybWFscyA9IEpTX1VuU2V0X0dlb21ldHJ5X05vcm1hbHMgPVxyXG4gICAgICBfR1NfVW5TZXRfR2VvbWV0cnlfTm9ybWFscztcclxuXHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9HZW9tZXRyeV9EYXRhID0gSlNfQ29tcHV0ZV9HZW9tZXRyeV9EYXRhID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyLCBvcHRpb25zOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcbiAgICAgICAgX0dTX0NvbXB1dGVfR2VvbWV0cnlfVGVzc2VsbGF0ZV9EYXRhKGtleSwgcHRyX29wdGlvbnMpO1xyXG4gICAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGEgPVxyXG4gICAgICBKU19Db21wdXRlX0dlb21ldHJ5X1Rlc3NlbGxhdGVfRGF0YSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlcixcclxuICAgICAgICBpbWFnZV9rZXk6IG51bWJlcixcclxuICAgICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG5cclxuICAgICAgICBfR1NfQ29tcHV0ZV9HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGEoa2V5LCBwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfcG9zX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9pZHhfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1Nob3dfR2VvbWV0cnlfVGVzc2VsbGF0ZV9EYXRhX0NvdW50KFxyXG4gICAgICAgICAga2V5LFxyXG4gICAgICAgICAgcHRyX3Bvc19jb3VudCxcclxuICAgICAgICAgIHB0cl9pZHhfY291bnRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgcG9zX2NvdW50ID0gTW9kdWxlLkhFQVAzMltwdHJfcG9zX2NvdW50IC8gNF07XHJcbiAgICAgICAgbGV0IGlkeF9jb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2lkeF9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwb3NfY291bnQgKiAzKTtcclxuICAgICAgICBsZXQgcHRyX2lkeCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBpZHhfY291bnQpO1xyXG4gICAgICAgIGxldCBwdHJfbm9yID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvc19jb3VudCAqIDMpO1xyXG4gICAgICAgIGxldCBwdHJfdGV4ID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvc19jb3VudCAqIDIpO1xyXG5cclxuICAgICAgICBfR1NfU2hvd19HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGEoXHJcbiAgICAgICAgICBrZXksXHJcbiAgICAgICAgICBpbWFnZV9rZXksXHJcbiAgICAgICAgICBwdHJfcG9zLFxyXG4gICAgICAgICAgcHRyX2lkeCxcclxuICAgICAgICAgIHB0cl9ub3IsXHJcbiAgICAgICAgICBwdHJfdGV4XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IHBvcyA9IG5ldyBGbG9hdDMyQXJyYXkocG9zX2NvdW50ICogMyk7XHJcbiAgICAgICAgbGV0IGlkeCA9IG5ldyBJbnQzMkFycmF5KGlkeF9jb3VudCk7XHJcbiAgICAgICAgbGV0IG5vciA9IG5ldyBGbG9hdDMyQXJyYXkocG9zX2NvdW50ICogMyk7XHJcbiAgICAgICAgbGV0IHRleCA9IG5ldyBGbG9hdDMyQXJyYXkocG9zX2NvdW50ICogMik7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zX2NvdW50OyBpKyspIHtcclxuICAgICAgICAgIHBvc1tpICogM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGkgKiAzXTtcclxuICAgICAgICAgIHBvc1tpICogMyArIDFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpICogMyArIDFdO1xyXG4gICAgICAgICAgcG9zW2kgKiAzICsgMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGkgKiAzICsgMl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWR4X2NvdW50OyBpKyspIHtcclxuICAgICAgICAgIGlkeFtpXSA9IE1vZHVsZS5IRUFQMzJbcHRyX2lkeCAvIDQgKyBpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NfY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgbm9yW2kgKiAzXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3IgLyA0ICsgaSAqIDNdO1xyXG4gICAgICAgICAgbm9yW2kgKiAzICsgMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbm9yIC8gNCArIGkgKiAzICsgMV07XHJcbiAgICAgICAgICBub3JbaSAqIDMgKyAyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3IgLyA0ICsgaSAqIDMgKyAyXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NfY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgdGV4W2kgKiAyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl90ZXggLyA0ICsgaSAqIDJdO1xyXG4gICAgICAgICAgdGV4W2kgKiAyICsgMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdGV4IC8gNCArIGkgKiAyICsgMV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvc19jb3VudCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pZHhfY291bnQpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2lkeCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ub3IpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdGV4KTtcclxuXHJcbiAgICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgICBfR1NfQ2xlYXJfR2VvbWV0cnlfVGVzc2VsbGF0ZV9EYXRhKGtleSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IHBvc2l0aW9uczogcG9zLCBpbmRleGVzOiBpZHgsIG5vcm1hbHM6IG5vciwgdGV4Y29vcmRzOiB0ZXggfTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19NZXJnZV9TaGVsbCA9IEpTX01lcmdlX1NoZWxsID0gZnVuY3Rpb24gKFxyXG4gICAgICBrZXk6IG51bWJlcixcclxuICAgICAgZnJvbV9rZXk6IG51bWJlcixcclxuICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG5cclxuICAgICAgX0dTX0NvbXB1dGVfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMoa2V5LCBwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICBfZnJlZShwdHJfb3B0aW9ucyk7XHJcbiAgICB9O1xyXG4gICAgSlNfU2V0X0dlb21ldHJ5X05vcm1hbHMgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyLFxyXG4gICAgICBvZmZzZXQ6IG51bWJlcixcclxuICAgICAgY291bnQ6IG51bWJlcixcclxuICAgICAgdmFsdWU6IEZsb2F0MzJBcnJheVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwY291bnQgPSB2YWx1ZS5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGldID0gdmFsdWVbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIF9HU19TZXRfR2VvbWV0cnlfTm9ybWFscyhrZXksIG9mZnNldCwgY291bnQsIHB0cl9wb3MpO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgfTtcclxuICAgIEpTX1Nob3dfR2VvbWV0cnlfTm9ybWFscyA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgIG9mZnNldDogbnVtYmVyLFxyXG4gICAgICBjb3VudDogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9ub3JtYWxzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGNvdW50ICogMyk7XHJcblxyXG4gICAgICBfR1NfU2hvd19HZW9tZXRyeV9Ob3JtYWxzKGtleSwgb2Zmc2V0LCBjb3VudCwgcHRyX25vcm1hbHMpO1xyXG5cclxuICAgICAgbGV0IG5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMyk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICBub3JtYWxzW2kgKiAzXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWxzIC8gNCArIGkgKiAzXTtcclxuICAgICAgICBub3JtYWxzW2kgKiAzICsgMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbm9ybWFscyAvIDQgKyBpICogMyArIDFdO1xyXG4gICAgICAgIG5vcm1hbHNbaSAqIDMgKyAyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWxzIC8gNCArIGkgKiAzICsgMl07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfbm9ybWFscyk7XHJcblxyXG4gICAgICByZXR1cm4gbm9ybWFscztcclxuICAgIH07XHJcbiAgICBKU19VblNldF9HZW9tZXRyeV9Ob3JtYWxzID0gX0dTX1VuU2V0X0dlb21ldHJ5X05vcm1hbHM7XHJcbiAgICBKU19Db21wdXRlX0dlb21ldHJ5X1Rlc3NlbGxhdGVfRGF0YSA9IGZ1bmN0aW9uIChcclxuICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgIGltYWdlX2tleTogbnVtYmVyLFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcblxyXG4gICAgICBfR1NfQ29tcHV0ZV9HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGEoa2V5LCBwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICBsZXQgcHRyX3Bvc19jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX2lkeF9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgX0dTX1Nob3dfR2VvbWV0cnlfVGVzc2VsbGF0ZV9EYXRhX0NvdW50KFxyXG4gICAgICAgIGtleSxcclxuICAgICAgICBwdHJfcG9zX2NvdW50LFxyXG4gICAgICAgIHB0cl9pZHhfY291bnRcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGxldCBwb3NfY291bnQgPSBNb2R1bGUuSEVBUDMyW3B0cl9wb3NfY291bnQgLyA0XTtcclxuICAgICAgbGV0IGlkeF9jb3VudCA9IE1vZHVsZS5IRUFQMzJbcHRyX2lkeF9jb3VudCAvIDRdO1xyXG5cclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg0ICogcG9zX2NvdW50ICogMyk7XHJcbiAgICAgIGxldCBwdHJfaWR4ID0gTW9kdWxlLl9tYWxsb2MoNCAqIGlkeF9jb3VudCk7XHJcbiAgICAgIGxldCBwdHJfbm9yID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBvc19jb3VudCAqIDMpO1xyXG4gICAgICBsZXQgcHRyX3RleCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwb3NfY291bnQgKiAyKTtcclxuXHJcbiAgICAgIF9HU19TaG93X0dlb21ldHJ5X1Rlc3NlbGxhdGVfRGF0YShcclxuICAgICAgICBrZXksXHJcbiAgICAgICAgaW1hZ2Vfa2V5LFxyXG4gICAgICAgIHB0cl9wb3MsXHJcbiAgICAgICAgcHRyX2lkeCxcclxuICAgICAgICBwdHJfbm9yLFxyXG4gICAgICAgIHB0cl90ZXhcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQzMkFycmF5KHBvc19jb3VudCAqIDMpO1xyXG4gICAgICBsZXQgaWR4ID0gbmV3IEludDMyQXJyYXkoaWR4X2NvdW50KTtcclxuICAgICAgbGV0IG5vciA9IG5ldyBGbG9hdDMyQXJyYXkocG9zX2NvdW50ICogMyk7XHJcbiAgICAgIGxldCB0ZXggPSBuZXcgRmxvYXQzMkFycmF5KHBvc19jb3VudCAqIDIpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NfY291bnQ7IGkrKykge1xyXG4gICAgICAgIHBvc1tpICogM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGkgKiAzXTtcclxuICAgICAgICBwb3NbaSAqIDMgKyAxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaSAqIDMgKyAxXTtcclxuICAgICAgICBwb3NbaSAqIDMgKyAyXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3MgLyA0ICsgaSAqIDMgKyAyXTtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkeF9jb3VudDsgaSsrKSB7XHJcbiAgICAgICAgaWR4W2ldID0gTW9kdWxlLkhFQVAzMltwdHJfaWR4IC8gNCArIGldO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zX2NvdW50OyBpKyspIHtcclxuICAgICAgICBub3JbaSAqIDNdID0gTW9kdWxlLkhFQVBGMzJbcHRyX25vciAvIDQgKyBpICogM107XHJcbiAgICAgICAgbm9yW2kgKiAzICsgMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbm9yIC8gNCArIGkgKiAzICsgMV07XHJcbiAgICAgICAgbm9yW2kgKiAzICsgMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfbm9yIC8gNCArIGkgKiAzICsgMl07XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NfY291bnQ7IGkrKykge1xyXG4gICAgICAgIHRleFtpICogMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfdGV4IC8gNCArIGkgKiAyXTtcclxuICAgICAgICB0ZXhbaSAqIDIgKyAxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl90ZXggLyA0ICsgaSAqIDIgKyAxXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3NfY291bnQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2lkeF9jb3VudCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pZHgpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX25vcik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdGV4KTtcclxuXHJcbiAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIF9HU19DbGVhcl9HZW9tZXRyeV9UZXNzZWxsYXRlX0RhdGEoa2V5KTtcclxuXHJcbiAgICAgIHJldHVybiB7IHBvc2l0aW9uczogcG9zLCBpbmRleGVzOiBpZHgsIG5vcm1hbHM6IG5vciwgdGV4Y29vcmRzOiB0ZXggfTtcclxuICAgIH07XHJcbiAgICBKU19NZXJnZV9TaGVsbCA9IGZ1bmN0aW9uIChrZXk6IG51bWJlciwgZnJvbV9rZXk6IG51bWJlciwgb3B0aW9uczogc3RyaW5nKSB7XHJcbiAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuICAgICAgX0dTX01lcmdlX1NoZWxsKGtleSwgZnJvbV9rZXksIHB0cl9vcHRpb25zKTtcclxuICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19FeHRydWRlX0J5X1NoZWxsID0gSlNfRXh0cnVkZV9CeV9TaGVsbCA9IGZ1bmN0aW9uIChcclxuICAgICAgcG9pbnRzOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgaW5kZXhlczogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIG5vcm1hbDogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIG9wdGlvbnM6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIGxldCBwY291bnQgPSBwb2ludHMubGVuZ3RoO1xyXG4gICAgICBsZXQgcHRyX3BvcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwY291bnQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX3BvcyAvIDQgKyBpXSA9IHBvaW50c1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGljb3VudCA9IGluZGV4ZXMubGVuZ3RoO1xyXG4gICAgICBsZXQgcHRyX2luZCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBpY291bnQpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljb3VudDsgaSsrKSB7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMltwdHJfaW5kIC8gNCArIGldID0gaW5kZXhlc1tpXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHB0cl9ub3JtYWwgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWwgLyA0XSA9IG5vcm1hbFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDQgKyAxXSA9IG5vcm1hbFsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDQgKyAyXSA9IG5vcm1hbFsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBfR1NfRXh0cnVkZV9CeV9TaGVsbChcclxuICAgICAgICBwdHJfcG9zLFxyXG4gICAgICAgIHBjb3VudCAvIDMsXHJcbiAgICAgICAgcHRyX2luZCxcclxuICAgICAgICBpY291bnQsXHJcbiAgICAgICAgcHRyX25vcm1hbCxcclxuICAgICAgICBwdHJfb3B0aW9uc1xyXG4gICAgICApO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3MpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2luZCk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfbm9ybWFsKTtcclxuXHJcbiAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0RFeHRydWRlX0J5X1NoZWxsID0gSlNfREV4dHJ1ZGVfQnlfU2hlbGwgPSBmdW5jdGlvbiAoXHJcbiAgICAgIHBvaW50czogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICAgIGluZGV4ZXM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBub3JtYWw6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcclxuICAgICAgbGV0IHB0cl9wb3MgPSBNb2R1bGUuX21hbGxvYyg4ICogcGNvdW50KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwY291bnQ7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9wb3MgLyA4ICsgaV0gPSBwb2ludHNbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBpY291bnQgPSBpbmRleGVzLmxlbmd0aDtcclxuICAgICAgbGV0IHB0cl9pbmQgPSBNb2R1bGUuX21hbGxvYyg0ICogaWNvdW50KTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpY291bnQ7IGkrKykge1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzJbcHRyX2luZCAvIDQgKyBpXSA9IGluZGV4ZXNbaV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwdHJfbm9ybWFsID0gTW9kdWxlLl9tYWxsb2MoOCAqIDMpO1xyXG4gICAgICBNb2R1bGUuSEVBUEY2NFtwdHJfbm9ybWFsIC8gOF0gPSBub3JtYWxbMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9ub3JtYWwgLyA4ICsgMV0gPSBub3JtYWxbMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0W3B0cl9ub3JtYWwgLyA4ICsgMl0gPSBub3JtYWxbMl07XHJcblxyXG4gICAgICBsZXQgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcblxyXG4gICAgICBsZXQga2V5ID0gX0dTX0RFeHRydWRlX0J5X1NoZWxsKFxyXG4gICAgICAgIHB0cl9wb3MsXHJcbiAgICAgICAgcGNvdW50IC8gMyxcclxuICAgICAgICBwdHJfaW5kLFxyXG4gICAgICAgIGljb3VudCxcclxuICAgICAgICBwdHJfbm9ybWFsLFxyXG4gICAgICAgIHB0cl9vcHRpb25zXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW5kKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ub3JtYWwpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfUm90YXRlX0J5X1NoZWxsID0gSlNfUm90YXRlX0J5X1NoZWxsID0gZnVuY3Rpb24gKFxyXG4gICAgICBwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBpbmRleGVzOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgb3JpZ2luOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgbm9ybWFsOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHBjb3VudCA9IHBvaW50cy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoNCAqIHBjb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gNCArIGldID0gcG9pbnRzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaWNvdW50ID0gaW5kZXhlcy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfaW5kID0gTW9kdWxlLl9tYWxsb2MoNCAqIGljb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl9pbmQgLyA0ICsgaV0gPSBpbmRleGVzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcHRyX29yaWdpbiA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29yaWdpbiAvIDRdID0gb3JpZ2luWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3JpZ2luIC8gNCArIDFdID0gb3JpZ2luWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3JpZ2luIC8gNCArIDJdID0gb3JpZ2luWzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl9ub3JtYWwgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWwgLyA0XSA9IG5vcm1hbFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDQgKyAxXSA9IG5vcm1hbFsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDQgKyAyXSA9IG5vcm1hbFsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBfR1NfUm90YXRlX0J5X1NoZWxsKFxyXG4gICAgICAgIHB0cl9wb3MsXHJcbiAgICAgICAgcGNvdW50IC8gMyxcclxuICAgICAgICBwdHJfaW5kLFxyXG4gICAgICAgIGljb3VudCxcclxuICAgICAgICBwdHJfb3JpZ2luLFxyXG4gICAgICAgIHB0cl9ub3JtYWwsXHJcbiAgICAgICAgcHRyX29wdGlvbnNcclxuICAgICAgKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9zKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pbmQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX29yaWdpbik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfbm9ybWFsKTtcclxuXHJcbiAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0RSb3RhdGVfQnlfU2hlbGwgPSBKU19EUm90YXRlX0J5X1NoZWxsID0gZnVuY3Rpb24gKFxyXG4gICAgICBwb2ludHM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBpbmRleGVzOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgb3JpZ2luOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgbm9ybWFsOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgICAgb3B0aW9uczogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgbGV0IHBjb3VudCA9IHBvaW50cy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfcG9zID0gTW9kdWxlLl9tYWxsb2MoOCAqIHBjb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUEYzMltwdHJfcG9zIC8gOCArIGldID0gcG9pbnRzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaWNvdW50ID0gaW5kZXhlcy5sZW5ndGg7XHJcbiAgICAgIGxldCBwdHJfaW5kID0gTW9kdWxlLl9tYWxsb2MoNCAqIGljb3VudCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWNvdW50OyBpKyspIHtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyW3B0cl9pbmQgLyA0ICsgaV0gPSBpbmRleGVzW2ldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcHRyX29yaWdpbiA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29yaWdpbiAvIDhdID0gb3JpZ2luWzBdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3JpZ2luIC8gOCArIDFdID0gb3JpZ2luWzFdO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfb3JpZ2luIC8gOCArIDJdID0gb3JpZ2luWzJdO1xyXG5cclxuICAgICAgbGV0IHB0cl9ub3JtYWwgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9ub3JtYWwgLyA4XSA9IG5vcm1hbFswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDggKyAxXSA9IG5vcm1hbFsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX25vcm1hbCAvIDggKyAyXSA9IG5vcm1hbFsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfb3B0aW9ucyA9IGFsbG9jYXRlVVRGOChvcHRpb25zKTtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBfR1NfRFJvdGF0ZV9CeV9TaGVsbChcclxuICAgICAgICBwdHJfcG9zLFxyXG4gICAgICAgIHBjb3VudCAvIDMsXHJcbiAgICAgICAgcHRyX2luZCxcclxuICAgICAgICBpY291bnQsXHJcbiAgICAgICAgcHRyX29yaWdpbixcclxuICAgICAgICBwdHJfbm9ybWFsLFxyXG4gICAgICAgIHB0cl9vcHRpb25zXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvcyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW5kKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9vcmlnaW4pO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX25vcm1hbCk7XHJcblxyXG4gICAgICBfZnJlZShwdHJfb3B0aW9ucyk7XHJcblxyXG4gICAgICByZXR1cm4ga2V5O1xyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Td2VlcF9CeV9TaGVsbCA9IEpTX1N3ZWVwX0J5X1NoZWxsID0gZnVuY3Rpb24gKFxyXG4gICAgICBwb2ludHM6IEZsb2F0MzJBcnJheSxcclxuICAgICAgaW5kZXhlczogSW50MzJBcnJheSxcclxuICAgICAgcGF0aDogRmxvYXQzMkFycmF5LFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwb2ludHMubGVuZ3RoKTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzIuc2V0KHBvaW50cywgcHRyX3BvaW50cyAvIDQpO1xyXG5cclxuICAgICAgbGV0IHB0cl9pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGluZGV4ZXMubGVuZ3RoKTtcclxuICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoaW5kZXhlcywgcHRyX2luZGV4ZXMgLyA0KTtcclxuXHJcbiAgICAgIGxldCBwdHJfcGF0aCA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwYXRoLmxlbmd0aCk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyLnNldChwYXRoLCBwdHJfcGF0aCAvIDQpO1xyXG5cclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG5cclxuICAgICAgbGV0IGtleSA9IF9HU19Td2VlcF9CeV9TaGVsbChcclxuICAgICAgICBwdHJfcG9pbnRzLFxyXG4gICAgICAgIHBvaW50cy5sZW5ndGggLyAzLFxyXG4gICAgICAgIHB0cl9pbmRleGVzLFxyXG4gICAgICAgIGluZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgIHB0cl9wYXRoLFxyXG4gICAgICAgIHBhdGgubGVuZ3RoIC8gMyxcclxuICAgICAgICBwdHJfb3B0aW9uc1xyXG4gICAgICApO1xyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2ludHMpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2luZGV4ZXMpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhdGgpO1xyXG5cclxuICAgICAgX2ZyZWUocHRyX29wdGlvbnMpO1xyXG5cclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRFN3ZWVwX0J5X1NoZWxsID0gSlNfRFN3ZWVwX0J5X1NoZWxsID0gZnVuY3Rpb24gKFxyXG4gICAgICBwb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgaW5kZXhlczogSW50MzJBcnJheSxcclxuICAgICAgcGF0aDogRmxvYXQ2NEFycmF5LFxyXG4gICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDggKiBwb2ludHMubGVuZ3RoKTtcclxuICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHBvaW50cywgcHRyX3BvaW50cyAvIDgpO1xyXG5cclxuICAgICAgbGV0IHB0cl9pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGluZGV4ZXMubGVuZ3RoKTtcclxuICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoaW5kZXhlcywgcHRyX2luZGV4ZXMgLyA0KTtcclxuXHJcbiAgICAgIGxldCBwdHJfcGF0aCA9IE1vZHVsZS5fbWFsbG9jKDggKiBwYXRoLmxlbmd0aCk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0LnNldChwYXRoLCBwdHJfcGF0aCAvIDgpO1xyXG5cclxuICAgICAgbGV0IHB0cl9vcHRpb25zID0gYWxsb2NhdGVVVEY4KG9wdGlvbnMpO1xyXG5cclxuICAgICAgbGV0IGtleSA9IF9HU19EU3dlZXBfQnlfU2hlbGwoXHJcbiAgICAgICAgcHRyX3BvaW50cyxcclxuICAgICAgICBwb2ludHMubGVuZ3RoIC8gMyxcclxuICAgICAgICBwdHJfaW5kZXhlcyxcclxuICAgICAgICBpbmRleGVzLmxlbmd0aCxcclxuICAgICAgICBwdHJfcGF0aCxcclxuICAgICAgICBwYXRoLmxlbmd0aCAvIDMsXHJcbiAgICAgICAgcHRyX29wdGlvbnNcclxuICAgICAgKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9pbnRzKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pbmRleGVzKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wYXRoKTtcclxuXHJcbiAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfUmF5X1Rlc3QgPSBKU19Db21wdXRlX1JheV9UZXN0ID0gZnVuY3Rpb24gKFxyXG4gICAgICB2aWV3X2tleTogbnVtYmVyLFxyXG4gICAgICBvcmlnaW46IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICBkaXJlY3Q6IEFycmF5TGlrZTxudW1iZXI+XHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9vcmlnaW4gPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9vcmlnaW4gLyA0XSA9IG9yaWdpblswXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29yaWdpbiAvIDQgKyAxXSA9IG9yaWdpblsxXTtcclxuICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29yaWdpbiAvIDQgKyAyXSA9IG9yaWdpblsyXTtcclxuXHJcbiAgICAgIGxldCBwdHJfZGlyZWN0ID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMltwdHJfZGlyZWN0IC8gNF0gPSBkaXJlY3RbMF07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9kaXJlY3QgLyA0ICsgMV0gPSBkaXJlY3RbMV07XHJcbiAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9kaXJlY3QgLyA0ICsgMl0gPSBkaXJlY3RbMl07XHJcblxyXG4gICAgICBsZXQgcHRyX3Bvc2l0aW9uID0gTW9kdWxlLl9tYWxsb2MoNCAqIDMpO1xyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIF9HU19Db21wdXRlX1JheV9UZXN0KHZpZXdfa2V5LCBwdHJfb3JpZ2luLCBwdHJfZGlyZWN0LCBwdHJfcG9zaXRpb24pXHJcbiAgICAgICkge1xyXG4gICAgICAgIHBvc2l0aW9uID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgICBwb3NpdGlvblswXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3NpdGlvbiAvIDRdO1xyXG4gICAgICAgIHBvc2l0aW9uWzFdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3Bvc2l0aW9uIC8gNCArIDFdO1xyXG4gICAgICAgIHBvc2l0aW9uWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3Bvc2l0aW9uIC8gNCArIDJdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX29yaWdpbik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGlyZWN0KTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb3NpdGlvbik7XHJcblxyXG4gICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfR2VvbWV0cnlfUmF5X1Rlc3QgPVxyXG4gICAgICBKU19Db21wdXRlX0dlb21ldHJ5X1JheV9UZXN0ID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHZpZXdfa2V5OiBudW1iZXIsXHJcbiAgICAgICAgZ2VvbV9rZXk6IG51bWJlcixcclxuICAgICAgICBvcmlnaW46IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgICAgIGRpcmVjdDogQXJyYXlMaWtlPG51bWJlcj5cclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl9vcmlnaW4gPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29yaWdpbiAvIDRdID0gb3JpZ2luWzBdO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9vcmlnaW4gLyA0ICsgMV0gPSBvcmlnaW5bMV07XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX29yaWdpbiAvIDQgKyAyXSA9IG9yaWdpblsyXTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9kaXJlY3QgPSBNb2R1bGUuX21hbGxvYyg0ICogMyk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2RpcmVjdCAvIDRdID0gZGlyZWN0WzBdO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjMyW3B0cl9kaXJlY3QgLyA0ICsgMV0gPSBkaXJlY3RbMV07XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGMzJbcHRyX2RpcmVjdCAvIDQgKyAyXSA9IGRpcmVjdFsyXTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9wb3NpdGlvbiA9IE1vZHVsZS5fbWFsbG9jKDQgKiAzKTtcclxuXHJcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBfR1NfQ29tcHV0ZV9HZW9tZXRyeV9SYXlfVGVzdChcclxuICAgICAgICAgICAgdmlld19rZXksXHJcbiAgICAgICAgICAgIGdlb21fa2V5LFxyXG4gICAgICAgICAgICBwdHJfb3JpZ2luLFxyXG4gICAgICAgICAgICBwdHJfZGlyZWN0LFxyXG4gICAgICAgICAgICBwdHJfcG9zaXRpb25cclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHBvc2l0aW9uID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgICAgIHBvc2l0aW9uWzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3Bvc2l0aW9uIC8gNF07XHJcbiAgICAgICAgICBwb3NpdGlvblsxXSA9IE1vZHVsZS5IRUFQRjMyW3B0cl9wb3NpdGlvbiAvIDQgKyAxXTtcclxuICAgICAgICAgIHBvc2l0aW9uWzJdID0gTW9kdWxlLkhFQVBGMzJbcHRyX3Bvc2l0aW9uIC8gNCArIDJdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9vcmlnaW4pO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGlyZWN0KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Bvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQm94X1Rlc3QgPSBKU19Db21wdXRlX0JveF9UZXN0ID0gZnVuY3Rpb24gKFxyXG4gICAgICB2aWV3X2tleTogbnVtYmVyLFxyXG4gICAgICBiYjogQXJyYXlMaWtlPG51bWJlcj5cclxuICAgICkge1xyXG4gICAgICBsZXQgcHRyX2JiID0gTW9kdWxlLl9tYWxsb2MoNCAqIDYpO1xyXG4gICAgICBNb2R1bGUuSEVBUEYzMi5zZXQoYmIsIHB0cl9iYiAvIDQpO1xyXG5cclxuICAgICAgbGV0IHB0cl9yZXN1bHQgPSBNb2R1bGUuX21hbGxvYyg0ICogNik7XHJcblxyXG4gICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgaWYgKF9HU19Db21wdXRlX0JveF9UZXN0KHZpZXdfa2V5LCBwdHJfYmIsIHB0cl9yZXN1bHQpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheSg2KTtcclxuICAgICAgICByZXN1bHQuc2V0KE1vZHVsZS5IRUFQRjMyLnN1YmFycmF5KHB0cl9yZXN1bHQgLyA0LCBwdHJfcmVzdWx0IC8gNCArIDYpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9iYik7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzdWx0KTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfUG9seWdvbl9BcmVhID0gSlNfQ29tcHV0ZV9Qb2x5Z29uX0FyZWEgPVxyXG4gICAgICBmdW5jdGlvbiAocG9pbnRzOiBBcnJheUxpa2U8bnVtYmVyPikge1xyXG4gICAgICAgIGxldCBwdHJfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoOCAqIHBvaW50cy5sZW5ndGgpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnNldChwb2ludHMsIHB0cl9wb2ludHMgLyA4KTtcclxuICAgICAgICBsZXQgcHRyX2FyZWEgPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuXHJcbiAgICAgICAgX0dTX0NvbXB1dGVfUG9seWdvbl9BcmVhKHB0cl9wb2ludHMsIHBvaW50cy5sZW5ndGggLyAzLCBwdHJfYXJlYSk7XHJcblxyXG4gICAgICAgIGxldCBhcmVhID0gTW9kdWxlLkhFQVBGNjRbcHRyX2FyZWEgLyA4XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfYXJlYSk7XHJcblxyXG4gICAgICAgIHJldHVybiBhcmVhO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfQXJlYSA9IEpTX0NvbXB1dGVfQXJlYSA9IGZ1bmN0aW9uIChrZXk6IG51bWJlcikge1xyXG4gICAgICBsZXQgcHRyX2FyZWEgPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuXHJcbiAgICAgIF9HU19Db21wdXRlX0FyZWEoa2V5LCBwdHJfYXJlYSk7XHJcblxyXG4gICAgICBsZXQgYXJlYSA9IE1vZHVsZS5IRUFQRjY0W3B0cl9hcmVhIC8gOF07XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2FyZWEpO1xyXG5cclxuICAgICAgcmV0dXJuIGFyZWE7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0NvbXB1dGVfVm9sdW1lID0gSlNfQ29tcHV0ZV9Wb2x1bWUgPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl92b2x1bWUgPSBNb2R1bGUuX21hbGxvYyg4KTtcclxuXHJcbiAgICAgIF9HU19Db21wdXRlX1ZvbHVtZShrZXksIHB0cl92b2x1bWUpO1xyXG5cclxuICAgICAgbGV0IHZvbHVtZSA9IE1vZHVsZS5IRUFQRjY0W3B0cl92b2x1bWUgLyA4XTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdm9sdW1lKTtcclxuXHJcbiAgICAgIHJldHVybiB2b2x1bWU7XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0lzX1NvbGlkX0dlb21ldHJ5ID0gSlNfSXNfU29saWRfR2VvbWV0cnkgPVxyXG4gICAgICBfR1NfSXNfU29saWRfR2VvbWV0cnk7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29tcHV0ZV9HZW9tZXRyeV9EaXN0YW5jZSA9XHJcbiAgICAgIEpTX0NvbXB1dGVfR2VvbWV0cnlfRGlzdGFuY2UgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgZ2VvbUtleTE6IG51bWJlcixcclxuICAgICAgICBnZW9tS2V5MjogbnVtYmVyLFxyXG4gICAgICAgIHBhdGgxOiBJbnQzMkFycmF5LFxyXG4gICAgICAgIHBhdGgyOiBJbnQzMkFycmF5XHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfZGlzdCA9IE1vZHVsZS5fbWFsbG9jKDQgKiA3KTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9wYXRoMSA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBhdGgxX2xlbiA9IDA7XHJcbiAgICAgICAgaWYgKHBhdGgxKSB7XHJcbiAgICAgICAgICBwdHJfcGF0aDEgPSBNb2R1bGUuX21hbGxvYyg0ICogcGF0aDEubGVuZ3RoKTtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KHBhdGgxLCBwdHJfcGF0aDEgLyA0KTtcclxuICAgICAgICAgIHBhdGgxX2xlbiA9IHBhdGgxLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHB0cl9wYXRoMiA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBhdGgyX2xlbiA9IDA7XHJcbiAgICAgICAgaWYgKHBhdGgyKSB7XHJcbiAgICAgICAgICBwdHJfcGF0aDIgPSBNb2R1bGUuX21hbGxvYyg0ICogcGF0aDIubGVuZ3RoKTtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KHBhdGgyLCBwdHJfcGF0aDIgLyA0KTtcclxuICAgICAgICAgIHBhdGgyX2xlbiA9IHBhdGgyLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9HU19Db21wdXRlX0dlb21ldHJ5X0Rpc3RhbmNlKFxyXG4gICAgICAgICAgZ2VvbUtleTEsXHJcbiAgICAgICAgICBnZW9tS2V5MixcclxuICAgICAgICAgIHB0cl9wYXRoMSxcclxuICAgICAgICAgIHBhdGgxX2xlbixcclxuICAgICAgICAgIHB0cl9wYXRoMixcclxuICAgICAgICAgIHBhdGgyX2xlbixcclxuICAgICAgICAgIHB0cl9kaXN0XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoNyk7XHJcbiAgICAgICAgcmVzdWx0WzBdID0gTW9kdWxlLkhFQVBGMzJbcHRyX2Rpc3QgLyA0XTtcclxuICAgICAgICByZXN1bHRbMV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfZGlzdCAvIDQgKyAxXTtcclxuICAgICAgICByZXN1bHRbMl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfZGlzdCAvIDQgKyAyXTtcclxuICAgICAgICByZXN1bHRbM10gPSBNb2R1bGUuSEVBUEYzMltwdHJfZGlzdCAvIDQgKyAzXTtcclxuICAgICAgICByZXN1bHRbNF0gPSBNb2R1bGUuSEVBUEYzMltwdHJfZGlzdCAvIDQgKyA0XTtcclxuICAgICAgICByZXN1bHRbNV0gPSBNb2R1bGUuSEVBUEYzMltwdHJfZGlzdCAvIDQgKyA1XTtcclxuICAgICAgICByZXN1bHRbNl0gPSBNb2R1bGUuSEVBUEYzMltwdHJfZGlzdCAvIDQgKyA2XTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kaXN0KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhdGgxKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BhdGgyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZWdtZW50X1RvX1N0cmVhbSA9IEpTX1NlZ21lbnRfVG9fU3RyZWFtID1cclxuICAgICAgZnVuY3Rpb24gKCk6IEFycmF5QnVmZmVyIHtcclxuICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3NpemUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1NlZ21lbnRfVG9fU3RyZWFtKHB0cl9kYXRhLCBwdHJfc2l6ZSk7XHJcblxyXG4gICAgICAgIGxldCBsb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfZGF0YSAvIDRdO1xyXG4gICAgICAgIGxldCBzaXplID0gTW9kdWxlLkhFQVAzMltwdHJfc2l6ZSAvIDRdO1xyXG5cclxuICAgICAgICBsZXQgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHNpemUpO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICAgIHJlc3VsdC5zZXQoTW9kdWxlLkhFQVA4LnN1YmFycmF5KGxvY2EsIGxvY2EgKyBzaXplKSk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShsb2NhKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfc2l6ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBidWZmZXI7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2VnbWVudF9Ub19TdHJlYW1fQnlfS2V5ID0gSlNfU2VnbWVudF9Ub19TdHJlYW1fQnlfS2V5ID1cclxuICAgICAgZnVuY3Rpb24gKGtleTogbnVtYmVyKTogQXJyYXlCdWZmZXIge1xyXG4gICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfc2l6ZSA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBfR1NfU2VnbWVudF9Ub19TdHJlYW1fQnlfS2V5KGtleSwgcHRyX2RhdGEsIHB0cl9zaXplKTtcclxuXHJcbiAgICAgICAgbGV0IGxvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9kYXRhIC8gNF07XHJcbiAgICAgICAgbGV0IHNpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9zaXplIC8gNF07XHJcblxyXG4gICAgICAgIGxldCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc2l6ZSk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgcmVzdWx0LnNldChNb2R1bGUuSEVBUDguc3ViYXJyYXkobG9jYSwgbG9jYSArIHNpemUpKTtcclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgICB9O1xyXG5cclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uID1cclxuICAgICAgSlNfU2VnbWVudF9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbiA9IGZ1bmN0aW9uICgpOiBBcnJheUJ1ZmZlciB7XHJcbiAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9zaXplID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIF9HU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uKHB0cl9kYXRhLCBwdHJfc2l6ZSk7XHJcblxyXG4gICAgICAgIGxldCBsb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfZGF0YSAvIDRdO1xyXG4gICAgICAgIGxldCBzaXplID0gTW9kdWxlLkhFQVAzMltwdHJfc2l6ZSAvIDRdO1xyXG5cclxuICAgICAgICBsZXQgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHNpemUpO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICAgIHJlc3VsdC5zZXQoTW9kdWxlLkhFQVA4LnN1YmFycmF5KGxvY2EsIGxvY2EgKyBzaXplKSk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShsb2NhKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfc2l6ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBidWZmZXI7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU2VnbWVudF9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbl9CeV9LZXkgPVxyXG4gICAgICBKU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uX0J5X0tleSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXk6IG51bWJlclxyXG4gICAgICApOiBBcnJheUJ1ZmZlciB7XHJcbiAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9zaXplID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIF9HU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uX0J5X0tleShrZXksIHB0cl9kYXRhLCBwdHJfc2l6ZSk7XHJcblxyXG4gICAgICAgIGxldCBsb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfZGF0YSAvIDRdO1xyXG4gICAgICAgIGxldCBzaXplID0gTW9kdWxlLkhFQVAzMltwdHJfc2l6ZSAvIDRdO1xyXG5cclxuICAgICAgICBsZXQgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHNpemUpO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICAgIHJlc3VsdC5zZXQoTW9kdWxlLkhFQVA4LnN1YmFycmF5KGxvY2EsIGxvY2EgKyBzaXplKSk7XHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcclxuICAgICAgfTtcclxuXHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU3RyZWFtX1RvX1NlZ21lbnRfQnlfS2V5ID0gSlNfU3RyZWFtX1RvX1NlZ21lbnRfQnlfS2V5ID1cclxuICAgICAgZnVuY3Rpb24gKGRhdGE6IEFycmF5QnVmZmVyLCBvd25lcl9rZXk6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIGxldCBhcnJheSA9IG5ldyBJbnQ4QXJyYXkoZGF0YSk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQOC5zZXQoYXJyYXksIHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgbGV0IGtleSA9IF9HU19TdHJlYW1fVG9fU2VnbWVudF9CeV9LZXkoXHJcbiAgICAgICAgICBwdHJfZGF0YSxcclxuICAgICAgICAgIGRhdGEuYnl0ZUxlbmd0aCxcclxuICAgICAgICAgIG93bmVyX2tleVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgIGFycmF5ID0gbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fVG9fU2VnbWVudF9CeV9LZXlfVHQgPVxyXG4gICAgICBKU19TdHJlYW1fVG9fU2VnbWVudF9CeV9LZXlfVHQgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgZGF0YTogQXJyYXlCdWZmZXIsXHJcbiAgICAgICAgb3duZXJfa2V5OiBudW1iZXIsXHJcbiAgICAgICAgbm86IG51bWJlcixcclxuICAgICAgICB2aWV3X2tleTogbnVtYmVyXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIGxldCBhcnJheSA9IG5ldyBJbnQ4QXJyYXkoZGF0YSk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQOC5zZXQoYXJyYXksIHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgbGV0IGtleSA9IF9HU19TdHJlYW1fVG9fU2VnbWVudF9CeV9LZXlfVHQoXHJcbiAgICAgICAgICBwdHJfZGF0YSxcclxuICAgICAgICAgIGRhdGEuYnl0ZUxlbmd0aCxcclxuICAgICAgICAgIG93bmVyX2tleSxcclxuICAgICAgICAgIG5vLFxyXG4gICAgICAgICAgdmlld19rZXlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG5cclxuICAgICAgICBhcnJheSA9IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU3RyZWFtX1dpdGhfQ29tcHJlc3Npb25fVG9fU2VnbWVudF9CeV9LZXkgPVxyXG4gICAgICBKU19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbl9Ub19TZWdtZW50X0J5X0tleSA9IGZ1bmN0aW9uIChcclxuICAgICAgICBkYXRhOiBBcnJheUJ1ZmZlcixcclxuICAgICAgICBvd25lcl9rZXk6IG51bWJlcixcclxuICAgICAgICBvcHRpb25zOiBzdHJpbmdcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5ieXRlTGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGxldCBhcnJheSA9IG5ldyBJbnQ4QXJyYXkoZGF0YSk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQOC5zZXQoYXJyYXksIHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgbGV0IGtleSA9IF9HU19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbl9Ub19TZWdtZW50X0J5X0tleShcclxuICAgICAgICAgIHB0cl9kYXRhLFxyXG4gICAgICAgICAgZGF0YS5ieXRlTGVuZ3RoLFxyXG4gICAgICAgICAgb3duZXJfa2V5LFxyXG4gICAgICAgICAgcHRyX29wdGlvbnNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG4gICAgICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuXHJcbiAgICAgICAgYXJyYXkgPSBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1NlZ21lbnRfRGF0YV9Ub19TdHJlYW0gPSBKU19TZWdtZW50X0RhdGFfVG9fU3RyZWFtID1cclxuICAgICAgZnVuY3Rpb24gKCk6IEFycmF5QnVmZmVyIHtcclxuICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3NpemUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX1NlZ21lbnRfRGF0YV9Ub19TdHJlYW0ocHRyX2RhdGEsIHB0cl9zaXplKTtcclxuXHJcbiAgICAgICAgbGV0IGxvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9kYXRhIC8gNF07XHJcbiAgICAgICAgbGV0IHNpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9zaXplIC8gNF07XHJcblxyXG4gICAgICAgIGxldCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc2l6ZSk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgcmVzdWx0LnNldChNb2R1bGUuSEVBUDguc3ViYXJyYXkobG9jYSwgbG9jYSArIHNpemUpKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKGxvY2EpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zaXplKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fVG9fU2VnbWVudF9EYXRhID0gSlNfU3RyZWFtX1RvX1NlZ21lbnRfRGF0YSA9XHJcbiAgICAgIGZ1bmN0aW9uIChkYXRhOiBBcnJheUJ1ZmZlcikge1xyXG4gICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIGxldCBhcnJheSA9IG5ldyBJbnQ4QXJyYXkoZGF0YSk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQOC5zZXQoYXJyYXksIHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgbGV0IGtleSA9IF9HU19TdHJlYW1fVG9fU2VnbWVudF9EYXRhKHB0cl9kYXRhLCBkYXRhLmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG5cclxuICAgICAgICBhcnJheSA9IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfR2VvbWV0cnlfRGF0YV9Ub19TdHJlYW0gPSBKU19HZW9tZXRyeV9EYXRhX1RvX1N0cmVhbSA9XHJcbiAgICAgIGZ1bmN0aW9uICgpOiBBcnJheUJ1ZmZlciB7XHJcbiAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9zaXplID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIF9HU19HZW9tZXRyeV9EYXRhX1RvX1N0cmVhbShwdHJfZGF0YSwgcHRyX3NpemUpO1xyXG5cclxuICAgICAgICBsZXQgbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX2RhdGEgLyA0XTtcclxuICAgICAgICBsZXQgc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3NpemUgLyA0XTtcclxuXHJcbiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihzaXplKTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgICAgICByZXN1bHQuc2V0KE1vZHVsZS5IRUFQOC5zdWJhcnJheShsb2NhLCBsb2NhICsgc2l6ZSkpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUobG9jYSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kYXRhKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3NpemUpO1xyXG5cclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0dlb21ldHJ5X0RhdGFfVG9fU3RyZWFtX1dpdGhfQ29tcHJlc3Npb24gPVxyXG4gICAgICBKU19HZW9tZXRyeV9EYXRhX1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uID0gZnVuY3Rpb24gKCk6IEFycmF5QnVmZmVyIHtcclxuICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3NpemUgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgX0dTX0dlb21ldHJ5X0RhdGFfVG9fU3RyZWFtX1dpdGhfQ29tcHJlc3Npb24ocHRyX2RhdGEsIHB0cl9zaXplKTtcclxuXHJcbiAgICAgICAgbGV0IGxvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9kYXRhIC8gNF07XHJcbiAgICAgICAgbGV0IHNpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9zaXplIC8gNF07XHJcblxyXG4gICAgICAgIGxldCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc2l6ZSk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgcmVzdWx0LnNldChNb2R1bGUuSEVBUDguc3ViYXJyYXkobG9jYSwgbG9jYSArIHNpemUpKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKGxvY2EpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9zaXplKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YSA9IEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhID1cclxuICAgICAgZnVuY3Rpb24gKGRhdGE6IEFycmF5QnVmZmVyKSB7XHJcbiAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgbGV0IGFycmF5ID0gbmV3IEludDhBcnJheShkYXRhKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVA4LnNldChhcnJheSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgICBfR1NfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGEocHRyX2RhdGEsIGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgIGFycmF5ID0gbnVsbDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXkgPVxyXG4gICAgICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAga2V5OiBudW1iZXIsXHJcbiAgICAgICAgZGF0YTogQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5XHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcclxuICAgICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKGRhdGEuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgbGV0IGFycmF5ID0gbmV3IEludDhBcnJheShkYXRhKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDguc2V0KGFycmF5LCBwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgICAgX0dTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleShrZXksIHB0cl9kYXRhLCBkYXRhLmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgICAgYXJyYXkgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcclxuICAgICAgICAgIGxldCBwdHJfZGF0YSA9IE1vZHVsZS5fbWFsbG9jKGRhdGEubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDguc2V0KGRhdGEsIHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgICBfR1NfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5KGtleSwgcHRyX2RhdGEsIGRhdGEubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzID1cclxuICAgICAgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5cyA9IGZ1bmN0aW9uIChcclxuICAgICAgICBrZXlzOiBJbnQzMkFycmF5LFxyXG4gICAgICAgIGRhdGE6IEFycmF5QnVmZmVyIHwgVWludDhBcnJheVxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICoga2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChrZXlzLCBwdHJfa2V5cyAvIDQpO1xyXG5cclxuICAgICAgICAgIGxldCBhcnJheSA9IG5ldyBJbnQ4QXJyYXkoZGF0YSk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLkhFQVA4LnNldChhcnJheSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgICAgIF9HU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzKFxyXG4gICAgICAgICAgICBwdHJfa2V5cyxcclxuICAgICAgICAgICAga2V5cy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHB0cl9kYXRhLFxyXG4gICAgICAgICAgICBkYXRhLmJ5dGVMZW5ndGhcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9rZXlzKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgICAgYXJyYXkgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcclxuICAgICAgICAgIGxldCBwdHJfa2V5cyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBrZXlzLmxlbmd0aCk7XHJcbiAgICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyhkYXRhLmxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQoa2V5cywgcHRyX2tleXMgLyA0KTtcclxuICAgICAgICAgIE1vZHVsZS5IRUFQOC5zZXQoZGF0YSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgICAgIF9HU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzKFxyXG4gICAgICAgICAgICBwdHJfa2V5cyxcclxuICAgICAgICAgICAga2V5cy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHB0cl9kYXRhLFxyXG4gICAgICAgICAgICBkYXRhLmxlbmd0aFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2tleXMpO1xyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9kYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5c19UdCA9XHJcbiAgICAgIEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXNfVHQgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAga2V5czogSW50MzJBcnJheSxcclxuICAgICAgICBkYXRhOiBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXksXHJcbiAgICAgICAgdmlld19rZXk6IG51bWJlclxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICoga2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChrZXlzLCBwdHJfa2V5cyAvIDQpO1xyXG5cclxuICAgICAgICAgIGxldCBhcnJheSA9IG5ldyBJbnQ4QXJyYXkoZGF0YSk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLkhFQVA4LnNldChhcnJheSwgcHRyX2RhdGEpO1xyXG5cclxuICAgICAgICAgIF9HU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzX1R0KFxyXG4gICAgICAgICAgICBwdHJfa2V5cyxcclxuICAgICAgICAgICAga2V5cy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHB0cl9kYXRhLFxyXG4gICAgICAgICAgICBkYXRhLmJ5dGVMZW5ndGgsXHJcbiAgICAgICAgICAgIHZpZXdfa2V5XHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5cyk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG5cclxuICAgICAgICAgIGFycmF5ID0gbnVsbDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XHJcbiAgICAgICAgICBsZXQgcHRyX2tleXMgPSBNb2R1bGUuX21hbGxvYyg0ICoga2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgbGV0IHB0cl9kYXRhID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5sZW5ndGgpO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KGtleXMsIHB0cl9rZXlzIC8gNCk7XHJcbiAgICAgICAgICBNb2R1bGUuSEVBUDguc2V0KGRhdGEsIHB0cl9kYXRhKTtcclxuXHJcbiAgICAgICAgICBfR1NfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5c19UdChcclxuICAgICAgICAgICAgcHRyX2tleXMsXHJcbiAgICAgICAgICAgIGtleXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwdHJfZGF0YSxcclxuICAgICAgICAgICAgZGF0YS5sZW5ndGgsXHJcbiAgICAgICAgICAgIHZpZXdfa2V5XHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwdHJfa2V5cyk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9XaXRoX0NvbXByZXNzaW9uID1cclxuICAgICAgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfV2l0aF9Db21wcmVzc2lvbiA9IGZ1bmN0aW9uIChcclxuICAgICAgICBkYXRhOiBBcnJheUJ1ZmZlclxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcHRyX2RhdGEgPSBNb2R1bGUuX21hbGxvYyhkYXRhLmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICBsZXQgYXJyYXkgPSBuZXcgSW50OEFycmF5KGRhdGEpO1xyXG5cclxuICAgICAgICBNb2R1bGUuSEVBUDguc2V0KGFycmF5LCBwdHJfZGF0YSk7XHJcblxyXG4gICAgICAgIF9HU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9XaXRoX0NvbXByZXNzaW9uKHB0cl9kYXRhLCBkYXRhLmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2RhdGEpO1xyXG5cclxuICAgICAgICBhcnJheSA9IG51bGw7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQ29weV9TZWdtZW50X0J5X0tleSA9IEpTX0NvcHlfU2VnbWVudF9CeV9LZXkgPVxyXG4gICAgICBfR1NfQ29weV9TZWdtZW50X0J5X0tleTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19TaG93X0RhdGFiYXNlX0luZm8gPSBKU19TaG93X0RhdGFiYXNlX0luZm8gPSBmdW5jdGlvbiAoXHJcbiAgICAgIGtleTogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgbGV0IHB0cl9pbmZvID0gTW9kdWxlLl9tYWxsb2MoNTEyKTtcclxuXHJcbiAgICAgIF9HU19TaG93X0RhdGFiYXNlX0luZm8oa2V5LCBwdHJfaW5mbyk7XHJcblxyXG4gICAgICBsZXQgaW5mbyA9IFVURjhUb1N0cmluZyhwdHJfaW5mbyk7XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX2luZm8pO1xyXG5cclxuICAgICAgcmV0dXJuIGluZm87XHJcbiAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX1Nob3dfQWxsb2NhdGVkX01lbW9yeV9TaXplID1cclxuICAgICAgSlNfU2hvd19BbGxvY2F0ZWRfTWVtb3J5X1NpemUgPSBfR1NfU2hvd19BbGxvY2F0ZWRfTWVtb3J5X1NpemU7XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfRXhlY3V0ZV9UYXNrX1Bvc3RfUHJvY2Vzc2luZyA9XHJcbiAgICAgIEpTX0V4ZWN1dGVfVGFza19Qb3N0X1Byb2Nlc3NpbmcgPSBfR1NfRXhlY3V0ZV9UYXNrX1Bvc3RfUHJvY2Vzc2luZztcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19DcmVhdGVfVGV4dHVyZSA9IEpTX0NyZWF0ZV9UZXh0dXJlID0gZnVuY3Rpb24gKFxyXG4gICAgICBidWZmZXI6IG51bWJlclxyXG4gICAgKSB7XHJcbiAgICAgIF9nbEdlblRleHR1cmVzKDEsIGJ1ZmZlcik7XHJcbiAgICAgIGlmICh3aW5kb3cuR1JPV0FCTEVfSEVBUF9JMzIpIHtcclxuICAgICAgICByZXR1cm4gR0wudGV4dHVyZXNbR1JPV0FCTEVfSEVBUF9JMzIoKVtidWZmZXIgPj4gMl1dO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBHTC50ZXh0dXJlc1tIRUFQMzJbYnVmZmVyID4+IDJdXTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Cb29sZWFuX0ludGVyc2VjdGlvbl9HcmFwaCA9XHJcbiAgICAgIEpTX0Jvb2xlYW5fSW50ZXJzZWN0aW9uX0dyYXBoID0gZnVuY3Rpb24gKFxyXG4gICAgICAgIHBvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICAgIGluZGV4ZXM6IEludDMyQXJyYXksXHJcbiAgICAgICAgcm9vdDogRmxvYXQ2NEFycmF5LFxyXG4gICAgICAgIG5vcm1hbDogRmxvYXQ2NEFycmF5XHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDggKiBwb2ludHMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogaW5kZXhlcy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfcm9vdCA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuICAgICAgICBsZXQgcHRyX25vcm1hbCA9IE1vZHVsZS5fbWFsbG9jKDggKiAzKTtcclxuXHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHBvaW50cywgcHRyX3BvaW50cyAvIDgpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KGluZGV4ZXMsIHB0cl9pbmRleGVzIC8gNCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHJvb3QsIHB0cl9yb290IC8gOCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KG5vcm1hbCwgcHRyX25vcm1hbCAvIDgpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX2ludGVyX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfaW50ZXJfcG9zX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9pbnRlcl9pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9pbnRlcl9pZHhfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgX0dTX0Jvb2xlYW5fSW50ZXJzZWN0aW9uX0dyYXBoKFxyXG4gICAgICAgICAgICBwdHJfcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfaW5kZXhlcyxcclxuICAgICAgICAgICAgaW5kZXhlcy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHB0cl9yb290LFxyXG4gICAgICAgICAgICBwdHJfbm9ybWFsLFxyXG4gICAgICAgICAgICBwdHJfaW50ZXJfcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfaW50ZXJfcG9zX2NvdW50LFxyXG4gICAgICAgICAgICBwdHJfaW50ZXJfaW5kZXhlcyxcclxuICAgICAgICAgICAgcHRyX2ludGVyX2lkeF9jb3VudFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgbGV0IHBvc19sb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfaW50ZXJfcG9pbnRzIC8gNF07XHJcbiAgICAgICAgICBsZXQgcG9zX3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9pbnRlcl9wb3NfY291bnQgLyA0XSAqIDM7XHJcbiAgICAgICAgICBsZXQgaW50ZXJfcG9pbnRzID0gbmV3IEZsb2F0NjRBcnJheShwb3Nfc2l6ZSk7XHJcbiAgICAgICAgICBpbnRlcl9wb2ludHMuc2V0KFxyXG4gICAgICAgICAgICBNb2R1bGUuSEVBUEY2NC5zdWJhcnJheShwb3NfbG9jYSAvIDgsIHBvc19sb2NhIC8gOCArIHBvc19zaXplKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBsZXQgaWR4X2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9pbnRlcl9pbmRleGVzIC8gNF07XHJcbiAgICAgICAgICBsZXQgaWR4X3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9pbnRlcl9pZHhfY291bnQgLyA0XTtcclxuICAgICAgICAgIGxldCBpbnRlcl9pbmRleGVzID0gbmV3IEludDMyQXJyYXkoaWR4X3NpemUpO1xyXG4gICAgICAgICAgaW50ZXJfaW5kZXhlcy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkoaWR4X2xvY2EgLyA0LCBpZHhfbG9jYSAvIDQgKyBpZHhfc2l6ZSlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHBvc19sb2NhKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShpZHhfbG9jYSk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0geyBwb3NpdGlvbnM6IGludGVyX3BvaW50cywgaW5kZXhlczogaW50ZXJfaW5kZXhlcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9pbnRlcl9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW50ZXJfcG9zX2NvdW50KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX2ludGVyX2luZGV4ZXMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW50ZXJfaWR4X2NvdW50KTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfaW5kZXhlcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yb290KTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX25vcm1hbCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQm9vbGVhbl9JbnRlcnNlY3RfUG9seWxpbmVfUG9seWdvbl9YeSA9XHJcbiAgICAgIEpTX0Jvb2xlYW5fSW50ZXJzZWN0X1BvbHlsaW5lX1BvbHlnb25fWHkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgcG9seWxpbmVfcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgICAgICAgcG9seWxpbmVfaW5kZXhlczogSW50MzJBcnJheSxcclxuICAgICAgICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICAgIHRvb2xfaW5kZXhlczogSW50MzJBcnJheSxcclxuICAgICAgICByZXN1bHRfcG9pbnRzOiBGbG9hdDY0QXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBwdHJfcG9seWxpbmVfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoOCAqIHBvbHlsaW5lX3BvaW50cy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfcG9seWxpbmVfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwb2x5bGluZV9pbmRleGVzLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHB0cl90b29sX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDggKiB0b29sX3BvaW50cy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBwdHJfdG9vbF9pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIHRvb2xfaW5kZXhlcy5sZW5ndGgpO1xyXG5cclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQocG9seWxpbmVfcG9pbnRzLCBwdHJfcG9seWxpbmVfcG9pbnRzIC8gOCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQocG9seWxpbmVfaW5kZXhlcywgcHRyX3BvbHlsaW5lX2luZGV4ZXMgLyA0KTtcclxuICAgICAgICBNb2R1bGUuSEVBUEY2NC5zZXQodG9vbF9wb2ludHMsIHB0cl90b29sX3BvaW50cyAvIDgpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KHRvb2xfaW5kZXhlcywgcHRyX3Rvb2xfaW5kZXhlcyAvIDQpO1xyXG5cclxuICAgICAgICBsZXQgcHRyX3Jlc19wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3Jlc19wb3NfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3Jlc19pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfaWR4X2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIF9HU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5bGluZV9Qb2x5Z29uX1h5KFxyXG4gICAgICAgICAgICBwdHJfcG9seWxpbmVfcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfcG9seWxpbmVfaW5kZXhlcyxcclxuICAgICAgICAgICAgcG9seWxpbmVfaW5kZXhlcy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHB0cl90b29sX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3Rvb2xfaW5kZXhlcyxcclxuICAgICAgICAgICAgdG9vbF9pbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3Jlc19wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfcG9zX2NvdW50LFxyXG4gICAgICAgICAgICBwdHJfcmVzX2luZGV4ZXMsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfaWR4X2NvdW50XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBsZXQgcG9zX2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfcG9pbnRzIC8gNF07XHJcbiAgICAgICAgICBsZXQgcG9zX3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfcG9zX2NvdW50IC8gNF0gKiAzO1xyXG4gICAgICAgICAgbGV0IHJlc19wb2ludHMgPSBuZXcgRmxvYXQ2NEFycmF5KHBvc19zaXplKTtcclxuICAgICAgICAgIHJlc19wb2ludHMuc2V0KFxyXG4gICAgICAgICAgICBNb2R1bGUuSEVBUEY2NC5zdWJhcnJheShwb3NfbG9jYSAvIDgsIHBvc19sb2NhIC8gOCArIHBvc19zaXplKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBsZXQgaWR4X2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaW5kZXhlcyAvIDRdO1xyXG4gICAgICAgICAgbGV0IGlkeF9zaXplID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX2lkeF9jb3VudCAvIDRdO1xyXG4gICAgICAgICAgbGV0IHJlc19pbmRleGVzID0gbmV3IEludDMyQXJyYXkoaWR4X3NpemUpO1xyXG4gICAgICAgICAgcmVzX2luZGV4ZXMuc2V0KFxyXG4gICAgICAgICAgICBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGlkeF9sb2NhIC8gNCwgaWR4X2xvY2EgLyA0ICsgaWR4X3NpemUpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwb3NfbG9jYSk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUoaWR4X2xvY2EpO1xyXG5cclxuICAgICAgICAgIHJlc3VsdCA9IHsgcG9zaXRpb25zOiByZXNfcG9pbnRzLCBpbmRleGVzOiByZXNfaW5kZXhlcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfcG9pbnRzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb3NfY291bnQpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX2luZGV4ZXMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX2lkeF9jb3VudCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9seWxpbmVfcG9pbnRzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3BvbHlsaW5lX2luZGV4ZXMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdG9vbF9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdG9vbF9pbmRleGVzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5Z29uX1BvbHlnb25fWHkgPVxyXG4gICAgICBKU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5Z29uX1BvbHlnb25fWHkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgcG9seWdvbl9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgICBwb2x5Z29uX2luZGV4ZXM6IEludDMyQXJyYXksXHJcbiAgICAgICAgdG9vbF9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgICB0b29sX2luZGV4ZXM6IEludDMyQXJyYXlcclxuICAgICAgICAvLyByZXN1bHRfcG9pbnRzOiBGbG9hdDY0QXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBwdHJfcG9seWdvbl9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogcG9seWdvbl9wb2ludHMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3BvbHlnb25faW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwb2x5Z29uX2luZGV4ZXMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3Rvb2xfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoOCAqIHRvb2xfcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHB0cl90b29sX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogdG9vbF9pbmRleGVzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnNldChwb2x5Z29uX3BvaW50cywgcHRyX3BvbHlnb25fcG9pbnRzIC8gOCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQocG9seWdvbl9pbmRleGVzLCBwdHJfcG9seWdvbl9pbmRleGVzIC8gNCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHRvb2xfcG9pbnRzLCBwdHJfdG9vbF9wb2ludHMgLyA4KTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldCh0b29sX2luZGV4ZXMsIHB0cl90b29sX2luZGV4ZXMgLyA0KTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9yZXNfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfcG9zX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfcmVzX2lkeF9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBfR1NfQm9vbGVhbl9JbnRlcnNlY3RfUG9seWdvbl9Qb2x5Z29uX1h5KFxyXG4gICAgICAgICAgICBwdHJfcG9seWdvbl9wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl9wb2x5Z29uX2luZGV4ZXMsXHJcbiAgICAgICAgICAgIHBvbHlnb25faW5kZXhlcy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHB0cl90b29sX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3Rvb2xfaW5kZXhlcyxcclxuICAgICAgICAgICAgdG9vbF9pbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3Jlc19wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfcG9zX2NvdW50LFxyXG4gICAgICAgICAgICBwdHJfcmVzX2luZGV4ZXMsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfaWR4X2NvdW50XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBsZXQgcG9zX2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfcG9pbnRzIC8gNF07XHJcbiAgICAgICAgICBsZXQgcG9zX3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfcG9zX2NvdW50IC8gNF0gKiAzO1xyXG4gICAgICAgICAgbGV0IHJlc19wb2ludHMgPSBuZXcgRmxvYXQ2NEFycmF5KHBvc19zaXplKTtcclxuICAgICAgICAgIHJlc19wb2ludHMuc2V0KFxyXG4gICAgICAgICAgICBNb2R1bGUuSEVBUEY2NC5zdWJhcnJheShwb3NfbG9jYSAvIDgsIHBvc19sb2NhIC8gOCArIHBvc19zaXplKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBsZXQgaWR4X2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaW5kZXhlcyAvIDRdO1xyXG4gICAgICAgICAgbGV0IGlkeF9zaXplID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX2lkeF9jb3VudCAvIDRdO1xyXG4gICAgICAgICAgbGV0IHJlc19pbmRleGVzID0gbmV3IEludDMyQXJyYXkoaWR4X3NpemUpO1xyXG4gICAgICAgICAgcmVzX2luZGV4ZXMuc2V0KFxyXG4gICAgICAgICAgICBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGlkeF9sb2NhIC8gNCwgaWR4X2xvY2EgLyA0ICsgaWR4X3NpemUpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwb3NfbG9jYSk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUoaWR4X2xvY2EpO1xyXG5cclxuICAgICAgICAgIHJlc3VsdCA9IHsgcG9zaXRpb25zOiByZXNfcG9pbnRzLCBpbmRleGVzOiByZXNfaW5kZXhlcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfcG9pbnRzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb3NfY291bnQpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX2luZGV4ZXMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX2lkeF9jb3VudCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9seWdvbl9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9seWdvbl9pbmRleGVzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Rvb2xfcG9pbnRzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Rvb2xfaW5kZXhlcyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICAod2luZG93IGFzIGFueSkuSlNfQm9vbGVhbl9JbnRlcnNlY3RfR3JhcGhfUG9seWdvbl9YeSA9XHJcbiAgICAgIEpTX0Jvb2xlYW5fSW50ZXJzZWN0X0dyYXBoX1BvbHlnb25fWHkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgZ3JhcGhfcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgICAgICAgZ3JhcGhfaW5kZXhlczogSW50MzJBcnJheSxcclxuICAgICAgICB0b29sX3BvaW50czogRmxvYXQ2NEFycmF5LFxyXG4gICAgICAgIHRvb2xfaW5kZXhlczogSW50MzJBcnJheVxyXG4gICAgICAgIC8vIHJlc3VsdF9wb2ludHM6IEZsb2F0NjRBcnJheVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9ncmFwaF9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogZ3JhcGhfcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHB0cl9ncmFwaF9pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCAqIGdyYXBoX2luZGV4ZXMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3Rvb2xfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoOCAqIHRvb2xfcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHB0cl90b29sX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogdG9vbF9pbmRleGVzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnNldChncmFwaF9wb2ludHMsIHB0cl9ncmFwaF9wb2ludHMgLyA4KTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldChncmFwaF9pbmRleGVzLCBwdHJfZ3JhcGhfaW5kZXhlcyAvIDQpO1xyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnNldCh0b29sX3BvaW50cywgcHRyX3Rvb2xfcG9pbnRzIC8gOCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQodG9vbF9pbmRleGVzLCBwdHJfdG9vbF9pbmRleGVzIC8gNCk7XHJcblxyXG4gICAgICAgIGxldCBwdHJfcmVzX3BvaW50cyA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfcmVzX3Bvc19jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfcmVzX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICAgICAgICBsZXQgcHRyX3Jlc19pZHhfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgX0dTX0Jvb2xlYW5fSW50ZXJzZWN0X0dyYXBoX1BvbHlnb25fWHkoXHJcbiAgICAgICAgICAgIHB0cl9ncmFwaF9wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl9ncmFwaF9pbmRleGVzLFxyXG4gICAgICAgICAgICBncmFwaF9pbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3Rvb2xfcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfdG9vbF9pbmRleGVzLFxyXG4gICAgICAgICAgICB0b29sX2luZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwdHJfcmVzX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3Jlc19wb3NfY291bnQsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfaW5kZXhlcyxcclxuICAgICAgICAgICAgcHRyX3Jlc19pZHhfY291bnRcclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGxldCBwb3NfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb2ludHMgLyA0XTtcclxuICAgICAgICAgIGxldCBwb3Nfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb3NfY291bnQgLyA0XSAqIDM7XHJcbiAgICAgICAgICBsZXQgcmVzX3BvaW50cyA9IG5ldyBGbG9hdDY0QXJyYXkocG9zX3NpemUpO1xyXG4gICAgICAgICAgcmVzX3BvaW50cy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHBvc19sb2NhIC8gOCwgcG9zX2xvY2EgLyA4ICsgcG9zX3NpemUpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGxldCBpZHhfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19pbmRleGVzIC8gNF07XHJcbiAgICAgICAgICBsZXQgaWR4X3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaWR4X2NvdW50IC8gNF07XHJcbiAgICAgICAgICBsZXQgcmVzX2luZGV4ZXMgPSBuZXcgSW50MzJBcnJheShpZHhfc2l6ZSk7XHJcbiAgICAgICAgICByZXNfaW5kZXhlcy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkoaWR4X2xvY2EgLyA0LCBpZHhfbG9jYSAvIDQgKyBpZHhfc2l6ZSlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHBvc19sb2NhKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShpZHhfbG9jYSk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0geyBwb3NpdGlvbnM6IHJlc19wb2ludHMsIGluZGV4ZXM6IHJlc19pbmRleGVzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX3Bvc19jb3VudCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaW5kZXhlcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaWR4X2NvdW50KTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ncmFwaF9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfZ3JhcGhfaW5kZXhlcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90b29sX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl90b29sX2luZGV4ZXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9O1xyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0Jvb2xlYW5fU3VidHJhY3RfUG9seWdvbl9Qb2x5Z29uX1h5ID1cclxuICAgICAgSlNfQm9vbGVhbl9TdWJ0cmFjdF9Qb2x5Z29uX1BvbHlnb25fWHkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgcG9seWdvbl9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgICBwb2x5Z29uX2luZGV4ZXM6IEludDMyQXJyYXksXHJcbiAgICAgICAgdG9vbF9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgICB0b29sX2luZGV4ZXM6IEludDMyQXJyYXlcclxuICAgICAgICAvLyByZXN1bHRfcG9pbnRzOiBGbG9hdDY0QXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBwdHJfcG9seWdvbl9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogcG9seWdvbl9wb2ludHMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3BvbHlnb25faW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwb2x5Z29uX2luZGV4ZXMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3Rvb2xfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoOCAqIHRvb2xfcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHB0cl90b29sX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogdG9vbF9pbmRleGVzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnNldChwb2x5Z29uX3BvaW50cywgcHRyX3BvbHlnb25fcG9pbnRzIC8gOCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQocG9seWdvbl9pbmRleGVzLCBwdHJfcG9seWdvbl9pbmRleGVzIC8gNCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHRvb2xfcG9pbnRzLCBwdHJfdG9vbF9wb2ludHMgLyA4KTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldCh0b29sX2luZGV4ZXMsIHB0cl90b29sX2luZGV4ZXMgLyA0KTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9yZXNfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfcG9zX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfcmVzX2lkeF9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBfR1NfQm9vbGVhbl9TdWJ0cmFjdF9Qb2x5Z29uX1BvbHlnb25fWHkoXHJcbiAgICAgICAgICAgIHB0cl9wb2x5Z29uX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3BvbHlnb25faW5kZXhlcyxcclxuICAgICAgICAgICAgcG9seWdvbl9pbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3Rvb2xfcG9pbnRzLFxyXG4gICAgICAgICAgICBwdHJfdG9vbF9pbmRleGVzLFxyXG4gICAgICAgICAgICB0b29sX2luZGV4ZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBwdHJfcmVzX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3Jlc19wb3NfY291bnQsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfaW5kZXhlcyxcclxuICAgICAgICAgICAgcHRyX3Jlc19pZHhfY291bnRcclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGxldCBwb3NfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb2ludHMgLyA0XTtcclxuICAgICAgICAgIGxldCBwb3Nfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb3NfY291bnQgLyA0XSAqIDM7XHJcbiAgICAgICAgICBsZXQgcmVzX3BvaW50cyA9IG5ldyBGbG9hdDY0QXJyYXkocG9zX3NpemUpO1xyXG4gICAgICAgICAgcmVzX3BvaW50cy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHBvc19sb2NhIC8gOCwgcG9zX2xvY2EgLyA4ICsgcG9zX3NpemUpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGxldCBpZHhfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19pbmRleGVzIC8gNF07XHJcbiAgICAgICAgICBsZXQgaWR4X3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaWR4X2NvdW50IC8gNF07XHJcbiAgICAgICAgICBsZXQgcmVzX2luZGV4ZXMgPSBuZXcgSW50MzJBcnJheShpZHhfc2l6ZSk7XHJcbiAgICAgICAgICByZXNfaW5kZXhlcy5zZXQoXHJcbiAgICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkoaWR4X2xvY2EgLyA0LCBpZHhfbG9jYSAvIDQgKyBpZHhfc2l6ZSlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgTW9kdWxlLl9mcmVlKHBvc19sb2NhKTtcclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShpZHhfbG9jYSk7XHJcblxyXG4gICAgICAgICAgcmVzdWx0ID0geyBwb3NpdGlvbnM6IHJlc19wb2ludHMsIGluZGV4ZXM6IHJlc19pbmRleGVzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX3Bvc19jb3VudCk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaW5kZXhlcyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaWR4X2NvdW50KTtcclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2x5Z29uX3BvaW50cyk7XHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9wb2x5Z29uX2luZGV4ZXMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdG9vbF9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfdG9vbF9pbmRleGVzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5KU19Cb29sZWFuX0N1dF9Qb2x5Z29uX1BvbHlnb25fWHkgPVxyXG4gICAgICBKU19Cb29sZWFuX0N1dF9Qb2x5Z29uX1BvbHlnb25fWHkgPSBmdW5jdGlvbiAoXHJcbiAgICAgICAgcG9seWdvbl9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgICBwb2x5Z29uX2luZGV4ZXM6IEludDMyQXJyYXksXHJcbiAgICAgICAgdG9vbF9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgICB0b29sX2luZGV4ZXM6IEludDMyQXJyYXlcclxuICAgICAgICAvLyByZXN1bHRfcG9pbnRzOiBGbG9hdDY0QXJyYXlcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBwdHJfcG9seWdvbl9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogcG9seWdvbl9wb2ludHMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3BvbHlnb25faW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBwb2x5Z29uX2luZGV4ZXMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgcHRyX3Rvb2xfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoOCAqIHRvb2xfcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHB0cl90b29sX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogdG9vbF9pbmRleGVzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnNldChwb2x5Z29uX3BvaW50cywgcHRyX3BvbHlnb25fcG9pbnRzIC8gOCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVAzMi5zZXQocG9seWdvbl9pbmRleGVzLCBwdHJfcG9seWdvbl9pbmRleGVzIC8gNCk7XHJcbiAgICAgICAgTW9kdWxlLkhFQVBGNjQuc2V0KHRvb2xfcG9pbnRzLCBwdHJfdG9vbF9wb2ludHMgLyA4KTtcclxuICAgICAgICBNb2R1bGUuSEVBUDMyLnNldCh0b29sX2luZGV4ZXMsIHB0cl90b29sX2luZGV4ZXMgLyA0KTtcclxuXHJcbiAgICAgICAgbGV0IHB0cl9yZXNfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfcG9zX2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgICAgbGV0IHB0cl9yZXNfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICAgIGxldCBwdHJfcmVzX2lkeF9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBfR1NfQm9vbGVhbl9DdXRfUG9seWdvbl9Qb2x5Z29uX1h5KFxyXG4gICAgICAgICAgICBwdHJfcG9seWdvbl9wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl9wb2x5Z29uX2luZGV4ZXMsXHJcbiAgICAgICAgICAgIHBvbHlnb25faW5kZXhlcy5sZW5ndGgsXHJcbiAgICAgICAgICAgIHB0cl90b29sX3BvaW50cyxcclxuICAgICAgICAgICAgcHRyX3Rvb2xfaW5kZXhlcyxcclxuICAgICAgICAgICAgdG9vbF9pbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgcHRyX3Jlc19wb2ludHMsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfcG9zX2NvdW50LFxyXG4gICAgICAgICAgICBwdHJfcmVzX2luZGV4ZXMsXHJcbiAgICAgICAgICAgIHB0cl9yZXNfaWR4X2NvdW50XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBsZXQgcG9zX2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfcG9pbnRzIC8gNF07XHJcbiAgICAgICAgICBsZXQgcG9zX3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfcG9zX2NvdW50IC8gNF0gKiAzO1xyXG4gICAgICAgICAgbGV0IHJlc19wb2ludHMgPSBuZXcgRmxvYXQ2NEFycmF5KHBvc19zaXplKTtcclxuICAgICAgICAgIHJlc19wb2ludHMuc2V0KFxyXG4gICAgICAgICAgICBNb2R1bGUuSEVBUEY2NC5zdWJhcnJheShwb3NfbG9jYSAvIDgsIHBvc19sb2NhIC8gOCArIHBvc19zaXplKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBsZXQgaWR4X2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaW5kZXhlcyAvIDRdO1xyXG4gICAgICAgICAgbGV0IGlkeF9zaXplID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX2lkeF9jb3VudCAvIDRdO1xyXG4gICAgICAgICAgbGV0IHJlc19pbmRleGVzID0gbmV3IEludDMyQXJyYXkoaWR4X3NpemUpO1xyXG4gICAgICAgICAgcmVzX2luZGV4ZXMuc2V0KFxyXG4gICAgICAgICAgICBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGlkeF9sb2NhIC8gNCwgaWR4X2xvY2EgLyA0ICsgaWR4X3NpemUpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIE1vZHVsZS5fZnJlZShwb3NfbG9jYSk7XHJcbiAgICAgICAgICBNb2R1bGUuX2ZyZWUoaWR4X2xvY2EpO1xyXG5cclxuICAgICAgICAgIHJlc3VsdCA9IHsgcG9zaXRpb25zOiByZXNfcG9pbnRzLCBpbmRleGVzOiByZXNfaW5kZXhlcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfcG9pbnRzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb3NfY291bnQpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX2luZGV4ZXMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX2lkeF9jb3VudCk7XHJcblxyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9seWdvbl9wb2ludHMpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShwdHJfcG9seWdvbl9pbmRleGVzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Rvb2xfcG9pbnRzKTtcclxuICAgICAgICBNb2R1bGUuX2ZyZWUocHRyX3Rvb2xfaW5kZXhlcyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH07XHJcblxyXG4gICAgKHdpbmRvdyBhcyBhbnkpLkpTX0Jvb2xlYW5fU3VidHJhY3QgPSBKU19Cb29sZWFuX1N1YnRyYWN0ID0gZnVuY3Rpb24gKFxyXG4gICAgICBibGFua19wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgYmxhbmtfaW5kZXhlczogSW50MzJBcnJheSxcclxuICAgICAgdG9vbF9wb2ludHM6IEZsb2F0NjRBcnJheSxcclxuICAgICAgdG9vbF9pbmRleGVzOiBJbnQzMkFycmF5XHJcbiAgICAgIC8vIHJlc3VsdF9wb2ludHM6IEZsb2F0NjRBcnJheVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG5cclxuICAgICAgbGV0IHB0cl9ibGFua19wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogYmxhbmtfcG9pbnRzLmxlbmd0aCk7XHJcbiAgICAgIGxldCBwdHJfYmxhbmtfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBibGFua19pbmRleGVzLmxlbmd0aCk7XHJcbiAgICAgIGxldCBwdHJfdG9vbF9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogdG9vbF9wb2ludHMubGVuZ3RoKTtcclxuICAgICAgbGV0IHB0cl90b29sX2luZGV4ZXMgPSBNb2R1bGUuX21hbGxvYyg0ICogdG9vbF9pbmRleGVzLmxlbmd0aCk7XHJcblxyXG4gICAgICBNb2R1bGUuSEVBUEY2NC5zZXQoYmxhbmtfcG9pbnRzLCBwdHJfYmxhbmtfcG9pbnRzIC8gOCk7XHJcbiAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KGJsYW5rX2luZGV4ZXMsIHB0cl9ibGFua19pbmRleGVzIC8gNCk7XHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0LnNldCh0b29sX3BvaW50cywgcHRyX3Rvb2xfcG9pbnRzIC8gOCk7XHJcbiAgICAgIE1vZHVsZS5IRUFQMzIuc2V0KHRvb2xfaW5kZXhlcywgcHRyX3Rvb2xfaW5kZXhlcyAvIDQpO1xyXG5cclxuICAgICAgbGV0IHB0cl9yZXNfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfcmVzX3Bvc19jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG4gICAgICBsZXQgcHRyX3Jlc19pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICAgIGxldCBwdHJfcmVzX2lkeF9jb3VudCA9IE1vZHVsZS5fbWFsbG9jKDQpO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIF9HU19Cb29sZWFuX1N1YnRyYWN0KFxyXG4gICAgICAgICAgcHRyX2JsYW5rX3BvaW50cyxcclxuICAgICAgICAgIGJsYW5rX3BvaW50cy5sZW5ndGggLyAzLFxyXG4gICAgICAgICAgcHRyX2JsYW5rX2luZGV4ZXMsXHJcbiAgICAgICAgICBibGFua19pbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgIHB0cl90b29sX3BvaW50cyxcclxuICAgICAgICAgIHRvb2xfcG9pbnRzLmxlbmd0aCAvIDMsXHJcbiAgICAgICAgICBwdHJfdG9vbF9pbmRleGVzLFxyXG4gICAgICAgICAgdG9vbF9pbmRleGVzLmxlbmd0aCxcclxuICAgICAgICAgIHB0cl9yZXNfcG9pbnRzLFxyXG4gICAgICAgICAgcHRyX3Jlc19wb3NfY291bnQsXHJcbiAgICAgICAgICBwdHJfcmVzX2luZGV4ZXMsXHJcbiAgICAgICAgICBwdHJfcmVzX2lkeF9jb3VudFxyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHBvc19sb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX3BvaW50cyAvIDRdO1xyXG4gICAgICAgIGxldCBwb3Nfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb3NfY291bnQgLyA0XSAqIDM7XHJcbiAgICAgICAgbGV0IHJlc19wb2ludHMgPSBuZXcgRmxvYXQ2NEFycmF5KHBvc19zaXplKTtcclxuICAgICAgICByZXNfcG9pbnRzLnNldChcclxuICAgICAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHBvc19sb2NhIC8gOCwgcG9zX2xvY2EgLyA4ICsgcG9zX3NpemUpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGlkeF9sb2NhID0gTW9kdWxlLkhFQVAzMltwdHJfcmVzX2luZGV4ZXMgLyA0XTtcclxuICAgICAgICBsZXQgaWR4X3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaWR4X2NvdW50IC8gNF07XHJcbiAgICAgICAgbGV0IHJlc19pbmRleGVzID0gbmV3IEludDMyQXJyYXkoaWR4X3NpemUpO1xyXG4gICAgICAgIHJlc19pbmRleGVzLnNldChcclxuICAgICAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkoaWR4X2xvY2EgLyA0LCBpZHhfbG9jYSAvIDQgKyBpZHhfc2l6ZSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBNb2R1bGUuX2ZyZWUocG9zX2xvY2EpO1xyXG4gICAgICAgIE1vZHVsZS5fZnJlZShpZHhfbG9jYSk7XHJcblxyXG4gICAgICAgIHJlc3VsdCA9IHsgcG9zaXRpb25zOiByZXNfcG9pbnRzLCBpbmRleGVzOiByZXNfaW5kZXhlcyB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb2ludHMpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb3NfY291bnQpO1xyXG4gICAgICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19pbmRleGVzKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaWR4X2NvdW50KTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfYmxhbmtfcG9pbnRzKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl9ibGFua19pbmRleGVzKTtcclxuICAgICAgTW9kdWxlLl9mcmVlKHB0cl90b29sX3BvaW50cyk7XHJcbiAgICAgIE1vZHVsZS5fZnJlZShwdHJfdG9vbF9pbmRleGVzKTtcclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gIH1cclxufTtcclxuXHJcbih3aW5kb3cgYXMgYW55KS5KU19GZWF0dXJlX0V4dHJ1ZGUgPSBKU19GZWF0dXJlX0V4dHJ1ZGUgPSBmdW5jdGlvbiAoXHJcbiAgcG9pbnRzOiBGbG9hdDY0QXJyYXksXHJcbiAgaW5kZXhlczogSW50MzJBcnJheSxcclxuICBub3JtYWw6IEZsb2F0NjRBcnJheSxcclxuICBvcHRpb25zOiBzdHJpbmdcclxuKSB7XHJcbiAgbGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG4gIGxldCBwdHJfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoOCAqIHBvaW50cy5sZW5ndGgpO1xyXG4gIGxldCBwdHJfaW5kZXhlcyA9IE1vZHVsZS5fbWFsbG9jKDQgKiBpbmRleGVzLmxlbmd0aCk7XHJcbiAgbGV0IHB0cl9ub3JtYWwgPSBNb2R1bGUuX21hbGxvYyg4ICogMyk7XHJcblxyXG4gIE1vZHVsZS5IRUFQRjY0LnNldChwb2ludHMsIHB0cl9wb2ludHMgLyA4KTtcclxuICBNb2R1bGUuSEVBUDMyLnNldChpbmRleGVzLCBwdHJfaW5kZXhlcyAvIDQpO1xyXG4gIE1vZHVsZS5IRUFQRjY0LnNldChub3JtYWwsIHB0cl9ub3JtYWwgLyA4KTtcclxuXHJcbiAgbGV0IHB0cl9vcHRpb25zID0gbnVsbDtcclxuICBpZiAob3B0aW9ucykge1xyXG4gICAgcHRyX29wdGlvbnMgPSBhbGxvY2F0ZVVURjgob3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBsZXQgcHRyX3Jlc19wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICBsZXQgcHRyX3Jlc19wb3NfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuICBsZXQgcHRyX3Jlc19pbmRleGVzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgbGV0IHB0cl9yZXNfaWR4X2NvdW50ID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcblxyXG4gIGlmIChcclxuICAgIF9HU19GZWF0dXJlX0V4dHJ1ZGUoXHJcbiAgICAgIHB0cl9wb2ludHMsXHJcbiAgICAgIHBvaW50cy5sZW5ndGggLyAzLFxyXG4gICAgICBwdHJfaW5kZXhlcyxcclxuICAgICAgaW5kZXhlcy5sZW5ndGgsXHJcbiAgICAgIHB0cl9ub3JtYWwsXHJcbiAgICAgIHB0cl9vcHRpb25zLFxyXG4gICAgICBwdHJfcmVzX3BvaW50cyxcclxuICAgICAgcHRyX3Jlc19wb3NfY291bnQsXHJcbiAgICAgIHB0cl9yZXNfaW5kZXhlcyxcclxuICAgICAgcHRyX3Jlc19pZHhfY291bnRcclxuICAgIClcclxuICApIHtcclxuICAgIGxldCBwb3NfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb2ludHMgLyA0XTtcclxuICAgIGxldCBwb3Nfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb3NfY291bnQgLyA0XSAqIDM7XHJcbiAgICBsZXQgcmVzX3BvaW50cyA9IG5ldyBGbG9hdDY0QXJyYXkocG9zX3NpemUpO1xyXG4gICAgcmVzX3BvaW50cy5zZXQoXHJcbiAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHBvc19sb2NhIC8gOCwgcG9zX2xvY2EgLyA4ICsgcG9zX3NpemUpXHJcbiAgICApO1xyXG5cclxuICAgIGxldCBpZHhfbG9jYSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19pbmRleGVzIC8gNF07XHJcbiAgICBsZXQgaWR4X3NpemUgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfaWR4X2NvdW50IC8gNF07XHJcbiAgICBsZXQgcmVzX2luZGV4ZXMgPSBuZXcgSW50MzJBcnJheShpZHhfc2l6ZSk7XHJcbiAgICByZXNfaW5kZXhlcy5zZXQoXHJcbiAgICAgIE1vZHVsZS5IRUFQMzIuc3ViYXJyYXkoaWR4X2xvY2EgLyA0LCBpZHhfbG9jYSAvIDQgKyBpZHhfc2l6ZSlcclxuICAgICk7XHJcblxyXG4gICAgTW9kdWxlLl9mcmVlKHBvc19sb2NhKTtcclxuICAgIE1vZHVsZS5fZnJlZShpZHhfbG9jYSk7XHJcblxyXG4gICAgcmVzdWx0ID0geyBwb3NpdGlvbnM6IHJlc19wb2ludHMsIGluZGV4ZXM6IHJlc19pbmRleGVzIH07XHJcbiAgfVxyXG5cclxuICBNb2R1bGUuX2ZyZWUocHRyX3Jlc19wb2ludHMpO1xyXG4gIE1vZHVsZS5fZnJlZShwdHJfcmVzX3Bvc19jb3VudCk7XHJcbiAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaW5kZXhlcyk7XHJcbiAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfaWR4X2NvdW50KTtcclxuXHJcbiAgTW9kdWxlLl9mcmVlKHB0cl9wb2ludHMpO1xyXG4gIE1vZHVsZS5fZnJlZShwdHJfaW5kZXhlcyk7XHJcbiAgTW9kdWxlLl9mcmVlKHB0cl9ub3JtYWwpO1xyXG5cclxuICBpZiAocHRyX29wdGlvbnMpIHtcclxuICAgIF9mcmVlKHB0cl9vcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG4od2luZG93IGFzIGFueSkuSlNfUGxhbmFyX1BvbHlsaW5lX09mZnNldCA9IEpTX1BsYW5hcl9Qb2x5bGluZV9PZmZzZXQgPVxyXG4gIGZ1bmN0aW9uIChwb2ludHM6IEZsb2F0NjRBcnJheSwgb2Zmc2V0X3ZhbHVlOiBudW1iZXIpIHtcclxuICAgIGxldCByZXN1bHQgPSBuZXcgTGlzdDxGbG9hdDY0QXJyYXk+KCk7XHJcblxyXG4gICAgbGV0IHB0cl9wb2ludHMgPSBNb2R1bGUuX21hbGxvYyg4ICogcG9pbnRzLmxlbmd0aCk7XHJcbiAgICBNb2R1bGUuSEVBUEY2NC5zZXQocG9pbnRzLCBwdHJfcG9pbnRzIC8gOCk7XHJcblxyXG4gICAgbGV0IHB0cl9yZXNfcG9pbnRzID0gTW9kdWxlLl9tYWxsb2MoNCk7XHJcbiAgICBsZXQgcHRyX3Jlc19wb3NfY291bnQgPSBNb2R1bGUuX21hbGxvYyg0KTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIF9HU19QbGFuYXJfUG9seWxpbmVfT2Zmc2V0KFxyXG4gICAgICAgIHB0cl9wb2ludHMsXHJcbiAgICAgICAgcG9pbnRzLmxlbmd0aCAvIDMsXHJcbiAgICAgICAgb2Zmc2V0X3ZhbHVlLFxyXG4gICAgICAgIHB0cl9yZXNfcG9pbnRzLFxyXG4gICAgICAgIHB0cl9yZXNfcG9zX2NvdW50XHJcbiAgICAgIClcclxuICAgICkge1xyXG4gICAgICBsZXQgcG9zX2xvY2EgPSBNb2R1bGUuSEVBUDMyW3B0cl9yZXNfcG9pbnRzIC8gNF07XHJcbiAgICAgIGxldCBwb3Nfc2l6ZSA9IE1vZHVsZS5IRUFQMzJbcHRyX3Jlc19wb3NfY291bnQgLyA0XSAqIDM7XHJcbiAgICAgIGxldCByZXNfcG9pbnRzID0gbmV3IEZsb2F0NjRBcnJheShwb3Nfc2l6ZSk7XHJcbiAgICAgIHJlc19wb2ludHMuc2V0KFxyXG4gICAgICAgIE1vZHVsZS5IRUFQRjY0LnN1YmFycmF5KHBvc19sb2NhIC8gOCwgcG9zX2xvY2EgLyA4ICsgcG9zX3NpemUpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXN1bHQgPSBER2VvbWV0cnlPcGVyYXRvcnMuY3JlYXRlUG9seWxpbmVzQnlTZWdtZW50cyhyZXNfcG9pbnRzKTtcclxuXHJcbiAgICAgIE1vZHVsZS5fZnJlZShwb3NfbG9jYSk7XHJcbiAgICB9XHJcblxyXG4gICAgTW9kdWxlLl9mcmVlKHB0cl9yZXNfcG9pbnRzKTtcclxuICAgIE1vZHVsZS5fZnJlZShwdHJfcmVzX3Bvc19jb3VudCk7XHJcbiAgICBNb2R1bGUuX2ZyZWUocHRyX3BvaW50cyk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9O1xyXG5cclxuZXhwb3J0IGVudW0gQ2FtZXJhQ2hhbmdlVHlwZSB7XHJcbiAgVHJhbnNsYXRlID0gMSxcclxuICBSb3RhdGUgPSAyLFxyXG4gIFNjYWxlID0gNCxcclxufVxyXG5leHBvcnQgZW51bSBPYmplY3RUeXBlIHtcclxuICBUWVBFX1Vua25vd24gPSAwLFxyXG4gIFRZUEVfU2VnbWVudCA9IDEsXHJcbiAgVFlQRV9JbmNsdWRlID0gMixcclxuICBUWVBFX1N0eWxlID0gMyxcclxuXHJcbiAgVFlQRV9Ecml2ZXIgPSAxMCxcclxuICBUWVBFX1JlbmRlckNvbnRleHQgPSAxMSxcclxuICBUWVBFX0NvbG9yID0gMTIsXHJcbiAgVFlQRV9TaGFkZXIgPSAxMyxcclxuICBUWVBFX1ZpZXdwb3J0ID0gMTQsXHJcbiAgVFlQRV9DYW1lcmEgPSAxNSxcclxuICBUWVBFX1Zpc2liaWxpdHkgPSAxNixcclxuICBUWVBFX01vZGVsbGluZ01hdHJpeCA9IDE3LFxyXG4gIFRZUEVfUmVuZGVyaW5nT3B0aW9ucyA9IDE4LFxyXG4gIFRZUEVfQ29uZGl0aW9uID0gMTksXHJcbiAgVFlQRV9TZWxlY3RhYmlsaXR5ID0gMjAsXHJcbiAgVFlQRV9Gb250ID0gMjEsXHJcbiAgVFlQRV9IZXVyaXN0aWNPcHRpb25zID0gMjIsXHJcblxyXG4gIC8vVFlQRV9NYXJrZXJTaXplID0gMzAsXHJcbiAgLy9UWVBFX1ZlcnRleFNpemUgPSAzMSxcclxuICAvL1RZUEVfTGluZVdpZHRoID0gMzIsXHJcbiAgLy9UWVBFX0VkZ2VXaWR0aCA9IDMzLFxyXG5cclxuICBUWVBFX01hcmtlciA9IDEwMCxcclxuICBUWVBFX0xpbmUgPSAxMDEsXHJcbiAgVFlQRV9Qb2x5bGluZSA9IDEwMixcclxuICBUWVBFX0NpcmNsZSA9IDEwNixcclxuICBUWVBFX1NoZWxsID0gMTAzLFxyXG4gIFRZUEVfTWVzaCA9IDEwNCxcclxuICBUWVBFX0N5bGluZGVyID0gMTA1LFxyXG4gIFRZUEVfVHJpYW5ndWxhclNoZWxsID0gMTA3LFxyXG4gIC8vVFlQRV9GYWNlU2hlbGwgPSAxMDgsXHJcbiAgVFlQRV9DdXR0aW5nUGxhbmVzID0gMTA5LFxyXG4gIFRZUEVfQ2lyY3VsYXJBcmMgPSAxMTAsXHJcbiAgVFlQRV9FbGxpcHNlID0gMTExLFxyXG4gIFRZUEVfRWxsaXBzZUFyYyA9IDExMixcclxuICBUWVBFX1BvbHlDeWxpbmRlciA9IDExMyxcclxuICBUWVBFX0xpZ2h0ID0gMTIwLFxyXG4gIFRZUEVfSW1hZ2UgPSAxMjEsXHJcbiAgVFlQRV9WZWN0b3JUZXh0ID0gMTIyLFxyXG4gIFRZUEVfUGFyYW1ldHJpY0dlb21ldHJ5ID0gMTIzLFxyXG4gIFRZUEVfUG9pbnRDbG91ZCA9IDEyNCxcclxufVxyXG5leHBvcnQgZW51bSBFbGVtZW50VHlwZSB7XHJcbiAgRUxFTUVOVF9UWVBFX1Vua25vd24gPSAwLFxyXG4gIEVMRU1FTlRfVFlQRV9WZXJ0ZXggPSAxLFxyXG4gIEVMRU1FTlRfVFlQRV9FZGdlID0gMixcclxuICBFTEVNRU5UX1RZUEVfTWFya2VyID0gNCxcclxuICBFTEVNRU5UX1RZUEVfTGluZSA9IDgsXHJcbiAgRUxFTUVOVF9UWVBFX0ZhY2UgPSAxNixcclxufVxyXG5leHBvcnQgZW51bSBWZXJ0ZXhUeXBlIHtcclxuICBWRVJURVhfVFlQRV9Ob25lID0gMCxcclxuICBWRVJURVhfVFlQRV9Jbm5lciA9IDEsXHJcbiAgVkVSVEVYX1RZUEVfQm9yZGVyID0gMixcclxufVxyXG5leHBvcnQgZW51bSBFZGdlVHlwZSB7XHJcbiAgRURHRV9UWVBFX05vbmUgPSAwLFxyXG4gIEVER0VfVFlQRV9Jbm5lciA9IDEsXHJcbiAgRURHRV9UWVBFX0JvcmRlciA9IDIsXHJcbn1cclxuZXhwb3J0IGVudW0gVmlld01vZGUge1xyXG4gIFhZLFxyXG4gIFlYLFxyXG4gIFhaLFxyXG4gIFpYLFxyXG4gIFlaLFxyXG4gIFpZLFxyXG4gIElzbyxcclxuICBFTixcclxuICBOVyxcclxuICBXUyxcclxuICBTRSxcclxuICBUb3BFLFxyXG4gIEJvdHRvbUUsXHJcbiAgVG9wTixcclxuICBCb3R0b21OLFxyXG4gIFRvcFcsXHJcbiAgQm90dG9tVyxcclxuICBUb3BTLFxyXG4gIEJvdHRvbVMsXHJcbiAgVG9wRU4sXHJcbiAgQm90dG9tRU4sXHJcbiAgVG9wTlcsXHJcbiAgQm90dG9tTlcsXHJcbiAgVG9wV1MsXHJcbiAgQm90dG9tV1MsXHJcbiAgVG9wU0UsXHJcbiAgQm90dG9tU0UsXHJcbiAgWVVwSXNvLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBDb29yZGluYXRlU3lzdGVtIHtcclxuICB3aW5kb3csXHJcbiAgcGl4ZWxzLFxyXG4gIHdvcmxkLFxyXG4gIG9iamVjdCxcclxuICB2aWV3cG9pbnQsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFVwZGF0ZVR5cGUge1xyXG4gIC8qKuWQjOatpeabtOaWsCAqL1xyXG4gIFN5bmNocm9uaXphdGlvbixcclxuICAvKirlvILmraXmm7TmlrAgKi9cclxuICBBc3luY2hyb25pemF0aW9uLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBBcmVhU2VsZWN0aW9uVHlwZSB7XHJcbiAgVG91Y2hBbmRDb250YWluID0gMCxcclxuICBDb250YWluID0gMSxcclxufVxyXG5cclxuZXhwb3J0IGVudW0gRm9udFVuaXRzVHlwZSB7XHJcbiAgUG9pbnRzID0gMSxcclxuICBQaXhlbHMgPSAyLFxyXG4gIE9iamVjdCA9IDMsXHJcbiAgV29ybGQgPSA0LFxyXG4gIFdpbmRvdyA9IDUsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFRleHRBbGlnbm1lbnQge1xyXG4gIExlZnRCb3R0b20gPSAxLFxyXG4gIExlZnRDZW50ZXIgPSAyLFxyXG4gIExlZnRUb3AgPSAzLFxyXG4gIENlbnRlckJvdHRvbSA9IDQsXHJcbiAgQ2VudGVyQ2VudGVyID0gNSxcclxuICBDZW50ZXJUb3AgPSA2LFxyXG4gIFJpZ2h0Qm90dG9tID0gNyxcclxuICBSaWdodENlbnRlciA9IDgsXHJcbiAgUmlnaHRUb3AgPSA5LFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBMaWdodGluZ01vZGUge1xyXG4gIE5vbmUgPSAwLFxyXG4gIFBob25nID0gMSxcclxuICBCbGlublBob25nID0gMixcclxuICBMYW1iZXJ0ID0gMyxcclxuICBIYWxmTGFtYmVydCA9IDQsXHJcbiAgQmFuZGVkID0gNSxcclxuICBQQlIgPSA2LFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBDb2xsaXNpb25UeXBlIHtcclxuICBOb25lID0gMCxcclxuICAvKiog56Gs56Kw5pKeICovXHJcbiAgSW50ZXJzZWN0ID0gMSxcclxuICAvKiog5o6l6Kem56Kw5pKeICovXHJcbiAgVG91Y2ggPSAyLFxyXG4gIC8qKiDljIXlkKsgKi9cclxuICBDb250YWluID0gNCxcclxuICAvKiog6L2v56Kw5pKeICovXHJcbiAgU29mdCA9IDgsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEdMVHlwZXMge1xyXG4gIEJZVEUgPSAweDE0MDAsXHJcbiAgVU5TSUdORURfQllURSA9IDB4MTQwMSxcclxuICBTSE9SVCA9IDB4MTQwMixcclxuICBVTlNJR05FRF9TSE9SVCA9IDB4MTQwMyxcclxuICBJTlQgPSAweDE0MDQsXHJcbiAgVU5TSUdORURfSU5UID0gMHgxNDA1LFxyXG4gIEZMT0FUID0gMHgxNDA2LFxyXG4gIERPVUJMRSA9IDB4MTQwYSxcclxuICBTVEFUSUNfRFJBVyA9IDB4ODhlNCxcclxuICBEWU5BTUlDX0RSQVcgPSAweDg4ZTgsXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBWaWV3ZXIge1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuICBnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcclxuICAvKiog5pyA5aSn5YaF5a2Y57O75pWwICovXHJcbiAgbWF4TWVtb3J5RmFjdG9yID0gMC44O1xyXG5cclxuICBwcm90ZWN0ZWQgX3ZpZXdLZXk6IG51bWJlciA9IC0xO1xyXG4gIHByb3RlY3RlZCBfc2NlbmVLZXk6IG51bWJlciA9IC0xO1xyXG4gIHByb3RlY3RlZCBfbW9kZWxLZXk6IG51bWJlciA9IC0xO1xyXG4gIHByb3RlY3RlZCBfc3R5bGVLZXk6IG51bWJlciA9IC0xO1xyXG4gIHByb3RlY3RlZCBfYmFja2dyb3VuZEtleTogbnVtYmVyID0gLTE7XHJcbiAgcHJvdGVjdGVkIF9zY3JlZW5LZXk6IG51bWJlciA9IC0xO1xyXG5cclxuICAvL2F0dHJpYnV0ZXNcclxuICBwcm90ZWN0ZWQgX3dpZHRoID0gNjAwO1xyXG4gIHByb3RlY3RlZCBfaGVpZ2h0ID0gNDAwO1xyXG4gIHByb3RlY3RlZCBfYXNwZWN0UmF0aW8gPSAxO1xyXG5cclxuICAvLy8vaW5wdXRzXHJcbiAgLy9sQnV0dG9uRG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8vckJ1dHRvbkRvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvL21CdXR0b25Eb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy90b3VjaGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvL2NhbWVyYSBhdHRyaWJ1dGVzXHJcbiAgcHJvdGVjdGVkIF9jYW1lcmFPcmllbnRhdGlvbkZpeGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF9zbW9vdGhUcmFuc2l0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcm90ZWN0ZWQgX3Ntb290aFRyYW5zaXRpb25EdXJhdGlvbjogbnVtYmVyID0gNTAwO1xyXG5cclxuICBzY2VuZUNhbWVyYUNoYW5naW5nOiBMaXN0PEZ1bmN0aW9uPiA9IG5ldyBMaXN0PEZ1bmN0aW9uPigpO1xyXG4gIHNjZW5lQ2FtZXJhQ2hhbmdlZDogTGlzdDxGdW5jdGlvbj4gPSBuZXcgTGlzdDxGdW5jdGlvbj4oKTtcclxuICBkb2N1bWVudENoYW5nZWQ6IExpc3Q8RnVuY3Rpb24+ID0gbmV3IExpc3Q8RnVuY3Rpb24+KCk7XHJcbiAgY29sbGlzaW9uQ29tcHV0aW5nOiBMaXN0PEZ1bmN0aW9uPiA9IG5ldyBMaXN0PEZ1bmN0aW9uPigpO1xyXG4gIGNvbGxpc2lvbkNvbXB1dGVkOiBMaXN0PEZ1bmN0aW9uPiA9IG5ldyBMaXN0PEZ1bmN0aW9uPigpO1xyXG4gIGdlb21ldHJ5SXRlbTogTGlzdDxGdW5jdGlvbj4gPSBuZXcgTGlzdDxGdW5jdGlvbj4oKTtcclxuICBnZW9tZXRyeUl0ZW1zOiBMaXN0PEZ1bmN0aW9uPiA9IG5ldyBMaXN0PEZ1bmN0aW9uPigpO1xyXG4gIGdlb21ldHJ5RHJhd0ZpbmlzaDogTGlzdDxGdW5jdGlvbj4gPSBuZXcgTGlzdDxGdW5jdGlvbj4oKTtcclxuXHJcbiAgem9vbUxpbWl0ID0gMC4wMDAwMDE7XHJcbiAgaW1hZ2VVcmxzID0ge307XHJcblxyXG4gIC8vZXZlbnRzXHJcbiAgcHJvdGVjdGVkIF9vblJlc2l6ZSA9IG51bGw7XHJcblxyXG4gIHByb3RlY3RlZCBfdGVzdEdzbElkOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF91cGRhdGVUeXBlOiBVcGRhdGVUeXBlID0gVXBkYXRlVHlwZS5TeW5jaHJvbml6YXRpb247XHJcbiAgcHJpdmF0ZSBfcnVubmluZyA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIOW9k+WJjXZpZXdlcueahGlzQnVzeeeKtuaAgVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2lzQnVzeSA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIOm8oOagh1Vw5pe277yMdmlld2Vy6KaB5Y+Y5oiQ55qE54q25oCBXHJcbiAgICovXHJcbiAgLy8gcHJpdmF0ZSBfYnV0dG9uVXBJc0J1c3kgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1VwZGF0ZVR0ID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNTaGFyZWRBcnJheUJ1ZmZlciA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzQ2FjaGUgPSBmYWxzZTtcclxuICBwcml2YXRlIF9wcmV2aW91c1VwZGF0ZUtleXNMZW5ndGg6IG51bWJlcjtcclxuICBwcml2YXRlIF9keW5hbWljTWVtb3J5OiBEeW5hbWljTWVtb3J5VHlwZSA9IER5bmFtaWNNZW1vcnlUeXBlLk5vbmU7XHJcblxyXG4gIHByb3RlY3RlZCBfY3VycmVudE1lbW9yeVNpemU6IG51bWJlciA9IC0xO1xyXG5cclxuICBwcml2YXRlIHhockxpc3QgPSBuZXcgTGlzdDxhbnk+KCk7XHJcblxyXG4gIHB1YmxpYyBnZXRBc3luR3JvdXBHZW9EYXRhQWN0aW9uOiAoXHJcbiAgICBtb2RlbElkOiBzdHJpbmcsXHJcbiAgICB2ZXJzaW9uOiBudW1iZXJcclxuICApID0+IHsgaHR0cFR5cGU6IHN0cmluZzsgdXJsOiBzdHJpbmcgfSA9IG51bGw7XHJcbiAgcHVibGljIGdldEFzeW5JbWFnZUFjdGlvbjogeyBodHRwVHlwZTogc3RyaW5nOyB1cmw6IHN0cmluZyB9O1xyXG4gIC8v5Yqg6L295Lit55qEc2VnbWVudExpc3QuXHJcbiAgcHJvdGVjdGVkIF9sb2FkaW5nTGlzdDogeyBbaWQ6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgcHJvdGVjdGVkIF9sb2FkaW5nTGlzdENvdW50ID0gMDtcclxuXHJcbiAgcHJvdGVjdGVkIF9idWZmZXJWYW9ObzogbnVtYmVyID0gMDtcclxuICBwcm90ZWN0ZWQgX2J1ZmZlclZhb0xpc3RNYXBObzogeyBbbm86IG51bWJlcl06IG51bWJlcltdIH0gPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBfYnVmZmVyS2V5Q291bnQgPSAwO1xyXG5cclxuICAvL2FzeW5Mb2FkZWRDb3VudDogbnVtYmVyID0gMDtcclxuICAvL2FzeW5Mb2FkaW5nQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgLy9hc3luVmlld0xvYWRQZXJjZW50OiBMaXN0PChwZXJjZW50OiBudW1iZXIpID0+IHZvaWQ+ID0gbmV3IExpc3Q8KHBlcmNlbnQ6IG51bWJlcikgPT4gdm9pZD4oKTtcclxuICAvL+eci+WIsOi/h+eahOaJgOacieWHoOS9lSzlvILmraXliqDovb3lrozmr5XnmoTlm57osIPkuovku7ZcclxuICAvL2FzeW5WaWV3QWxsTG9hZWQ6IExpc3Q8RnVuY3Rpb24+ID0gbmV3IExpc3Q8RnVuY3Rpb24+KCk7XHJcblxyXG4gIHByb3RlY3RlZCBfb2Zmc2V0ID0gMDtcclxuICAvLyDmlbDmja7mmK/lkKbljovnvKlcclxuICBwcm90ZWN0ZWQgX2dlb0RhdGFJc0NvbXByZXNzaW9uID0gZmFsc2U7XHJcbiAgLy8g5LiA57uE5Yeg5L2VKOino+WOi+WJjSnnmoTmnIDlpKfmlbDmja7ph49cclxuICBwcm90ZWN0ZWQgX2dyb3VwU2l6ZUxpbWl0ID0gMTAyNCAqIDEwMjQ7XHJcbiAgLy/lpJrnur/nqIt1cGRhdGVfdmlld2XnmoTmiafooYzmoIfor4ZcclxuICBwcm90ZWN0ZWQgX3RocmVhZFVQVklzUnVubmluZyA9IGZhbHNlO1xyXG4gIC8v5aSa57q/56iLdXBkYXRlX3ZpZXdl5bey57uP5Zyoc2V0SW50ZXJ2YWzkuK3nmoTmoIfor4Yo6K+l5qCH5b+X5L2N5Li6dHJ1ZeaXtu+8jOWwseS4jeimgeWGjeWIm+W7uuWumuaXtuWZqOS6hikuXHJcbiAgcHJvdGVjdGVkIF90aHJlYWRVUFZJc1ByZXBhcmluZyA9IGZhbHNlO1xyXG4gIC8vLS0tLS0tLS0tdGhyZWFkX3h4X1R055qEQ2FuY2VsbGVk5ZKMSXNBZ2FpbuWQjOe6pyzljbPoi6XkuKTkuKrmoIflv5fkvY3pg73kuLp0cnVlLOWPqumcgOimgeaJp+ihjOS4gOasoVR0LOWImeS4pOS4quagh+W/l+S9jemDveaBouWkjWZhbHNlLS0tLS0tLVxyXG4gIC8v5aSa57q/56iLdXBkYXRlX3ZpZXdl55qE5omn6KGM6KKrY2FuY2Vs5LqGXHJcbiAgcHJvdGVjdGVkIF90aHJlYWRVUFZDYW5jZWxsZWQgPSBmYWxzZTtcclxuICAvL3VwZGF0ZV92aWV3ZV9UdOaJp+ihjOmAlOS4reWPiOiiq+iwg+eUqOS6huS4gOasoS5cclxuICBwcm90ZWN0ZWQgX3RocmVhZFVQVklzQWdhaW4gPSBmYWxzZTtcclxuICAvLyBVcGRhdGVHZW9tZXRyeURhdGHnmoTlpJrnur/nqIvnmoTmoIfor4YuXHJcbiAgcHJvdGVjdGVkIF90aHJlYWRVUEdESXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgLy/lpJrnur/nqItVcGRhdGVHZW9tZXRyeURhdGHmiafooYzooqtjYW5jZWzkuoZcclxuICBwcm90ZWN0ZWQgX3RocmVhZFVQR0RDYW5jZWxsZWQgPSBmYWxzZTtcclxuICAvL1VwZGF0ZUdlb21ldHJ5RGF0YV9UdOaJp+ihjOmAlOS4reWPiOiiq+iwg+eUqOS6huS4gOasoS5cclxuICBwcm90ZWN0ZWQgX3RocmVhZFVQR0RJc0FnYWluID0gZmFsc2U7XHJcbiAgLy9zdHJlYW1Ub0dlb21ldHJ5RGF0YV9UdOWkmue6v+eoi+WHveaVsOaJp+ihjOagh+ivhlxyXG4gIHByb3RlY3RlZCBfdGhyZWFkU1RHRElzUnVubmluZ0NvdW50ID0gMDtcclxuICAvLyBzdHJlYW1Ub1NlZ21lbnRUdOato+WcqOaJp+ihjOeahOasoeaVsCjnrYnkuo4w5pe26KGo56S65rKh5pyJ5q2j5Zyo5omn6KGM55qE6L+b56iLKS5cclxuICBwcm90ZWN0ZWQgX3N0cmVhbVRvU2VnbWVudFJ1bm5pbmdDb3VudCA9IDA7XHJcbiAgLy/op6PljovnrqHnkIblmajnmoTov5DooYzmoIfor4YuXHJcbiAgcHJvdGVjdGVkIF9kZWNvZGVNYW5hZ2VySXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgLy/or7fmsYLlh6DkvZXmlbDmja7nmoTov5Tlm57nu5PmnpzliJfooaguXHJcbiAgcHJvdGVjdGVkIF9kZWNvZGluZ09iamVjdExpc3Q6IERlY29kaW5nT2JqZWN0W10gPSBuZXcgQXJyYXk8RGVjb2RpbmdPYmplY3Q+KCk7XHJcbiAgLy8g5q+P5aSa5bCR5Liq5Yeg5L2V77yMcmVuZGVyVmlld+S4gOasoS5cclxuICAvLyBwcml2YXRlIF9yZW5kZXJWaWV3UGVyR3JvdXAgPSA1MDA7XHJcbiAgLy8gcHJpdmF0ZSBfcmVuZGVyVmlld1Blckdyb3VwID0gMTAwMDtcclxuICAvLyBwcml2YXRlIF9yZW5kZXJWaWV3UGVyR3JvdXAgPSAyMDA7XHJcbiAgcHJpdmF0ZSBfcmVuZGVyVmlld1Blckdyb3VwID0gNTA7XHJcblxyXG4gIC8vIOe8k+WtmOeahGtleXNcclxuICBwcm90ZWN0ZWQgX2NhY2hlU2VnS2V5cyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgLy8g57yT5a2Y55qE5Yeg5L2V5pWw5o2ubGlzdFxyXG4gIHByb3RlY3RlZCBfY2FjaGVHZW9tZXRyeURhdGFMaXN0ID0gbmV3IEFycmF5PFVpbnQ4QXJyYXk+KCk7XHJcbiAgLy8g57yT5a2Y55qE5pWw5o2u6YeP5aSn5bCPXHJcbiAgcHJvdGVjdGVkIF9jYWNoZURhdGFTaXplID0gMDtcclxuICAvKipcclxuICAgKiDpnIDopoHlhYjnu5jliLbmiYDmnIko6byg5qCH5pON5L2cYnVzeeaXtuS8muWPque7mOWItuS4gOmDqOWIhuWbvuW9oi4pXHJcbiAgICovXHJcbiAgcHVibGljIHJlbmRlclZpZXdBbGwgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICog5o+S5YWl5Yeg5L2V55qEY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXPooqtCdWZmZXJfR2VvbWV0cnnkuK3mlq1cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiDmmK/lkKbmnInlh6DkvZXmlbDmja7mraPlnKjpgJrov4d1cGRhdGVEaXNwbGF56L+b6KGM5Yqg6L29LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc0dlb21ldHJ5TG9hZGluZyA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIOato+WcqOivu+WPluWHoOS9leaVsOaNrueahHNlZ21lbnTnmoTmlbDph48uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfc2VnbWVudExvYWRpbmdDb3VudCA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIOato+WcqGJ1ZmZlcueahOWHoOS9leaVsOaNruaVsOmHjy5cclxuICAgKi9cclxuICBwdWJsaWMgYnVmZmVyaW5nR2VvbWV0cnlDb3VudCA9IDA7XHJcblxyXG4gIHB1YmxpYyBtb2RlbERlYnVnID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgc3FsV29ya2VyOiBXb3JrZXI7XHJcblxyXG4gIHByaXZhdGUgX3RocmVhZFByb21pc2U6IFRocmVhZFByb21pc2U8VXBkYXRlSW5mbz47XHJcblxyXG4gIC8vIGxvYWRUaW1lRmxhZyA9IHRydWU7XHJcbiAgLy8gcHJvdGVjdGVkIF9uZWVkQXN5blVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvL3B1YmxpYyBvblN0cmVhbVRvU2VnbWVudEZpbmlzaGVkID0gbmV3IE51bWJlcktleUxpc3Q8KGtleTogbnVtYmVyKSA9PiB2b2lkPigpO1xyXG4gIHB1YmxpYyBvbkNvbXB1dGVDb2xsaXNpb25GaW5pc2hlZCA9IG5ldyBOdW1iZXJLZXlMaXN0PChpdGVtOiBbXSkgPT4gdm9pZD4oKTtcclxuXHJcbiAgcHVibGljIGlzRml4RnJhbWVSZW5kZXIgPSB0cnVlO1xyXG5cclxuICBnZXQgYXNwZWN0UmF0aW8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXNwZWN0UmF0aW87XHJcbiAgfVxyXG5cclxuICBzZXQgYXNwZWN0UmF0aW8oYXNwZWN0UmF0aW8pIHtcclxuICAgIHRoaXMuX2FzcGVjdFJhdGlvID0gYXNwZWN0UmF0aW87XHJcbiAgfVxyXG5cclxuICBnZXQgZ2VvRGF0YUlzQ29tcHJlc3Npb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ2VvRGF0YUlzQ29tcHJlc3Npb247XHJcbiAgfVxyXG5cclxuICBzZXQgZ2VvRGF0YUlzQ29tcHJlc3Npb24odmFsdWUpIHtcclxuICAgIHRoaXMuX2dlb0RhdGFJc0NvbXByZXNzaW9uID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgdGhyZWFkSXNSdW5uaW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RocmVhZFVQVklzUnVubmluZyB8fCB0aGlzLl90aHJlYWRVUEdESXNSdW5uaW5nO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlbmRlclZpZXdQZXJHcm91cCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZW5kZXJWaWV3UGVyR3JvdXA7XHJcbiAgfVxyXG5cclxuICBzZXQgcmVuZGVyVmlld1Blckdyb3VwKHZhbHVlKSB7XHJcbiAgICB0aGlzLl9yZW5kZXJWaWV3UGVyR3JvdXAgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBzdHJlYW1Ub1NlZ21lbnRSdW5uaW5nQ291bnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50O1xyXG4gIH1cclxuXHJcbiAgc2V0IHN0cmVhbVRvU2VnbWVudFJ1bm5pbmdDb3VudCh2YWx1ZSkge1xyXG4gICAgdGhpcy5fc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250YWluZXJJZDogc3RyaW5nKSB7XHJcbiAgICBKU19Jbml0X0FwaXMoKTtcclxuICAgIEpTX0luaXRfRGF0YWJhc2UoKTtcclxuICAgIC8vaWYgKCFNb2R1bGVbXCJ0aHJlYWRpbmcgaW5pdGVkXCJdKSB7XHJcbiAgICBKU19Jbml0X011bHRpdGhyZWFkaW5nX1NlcnZpY2VzKG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5KTtcclxuICAgIC8vXHRNb2R1bGVbXCJ0aHJlYWRpbmcgaW5pdGVkXCJdID0gdHJ1ZTtcclxuICAgIC8vfVxyXG5cclxuICAgIGxldCB2aTogVmlld2VyID0gdGhpcztcclxuICAgIHRoaXMuX29uUmVzaXplID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICB2aS51cGRhdGVTaXplKCk7XHJcbiAgICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5jcmVhdGVWaWV3KGNvbnRhaW5lcklkKTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZyhcInNxbFdvcmtlcuWIneWni+WMllwiKTtcclxuICAgIC8vIHRoaXMuc3FsV29ya2VyID0gbmV3IFdvcmtlcihuZXcgVVJMKFwiLi9zcWxpdGUud29ya2VyLmpzXCIsIGltcG9ydC5tZXRhLnVybCkpO1xyXG4gICAgLy8gaW5pdEJhY2tlbmQodGhpcy5zcWxXb3JrZXIpO1xyXG5cclxuICAgIE1vZHVsZVtcIm9uVGFza1Byb2Nlc3NpbmdGaW5pc2hlZFwiXSA9IChcclxuICAgICAgdGFza19pZDogbnVtYmVyLFxyXG4gICAgICB0eXBlOiBudW1iZXIsXHJcbiAgICAgIHZpZXdfa2V5OiBudW1iZXJcclxuICAgICkgPT4ge1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKFwidHlwZTpcIiArIHR5cGUpO1xyXG4gICAgICBsZXQgdmlld2VyID0gdGhpcy5maW5kVmlld2VyQnlLZXkodmlld19rZXkpO1xyXG4gICAgICBpZiAodmlld2VyKSB7XHJcbiAgICAgICAgLy8g5Y+q5pyJc3RyZWFtVG9HZW9tZXRyeVR05ZKMc3RyZWFtVG9TZWdtZW50VHTmiY3pnIDopoHpop3lpJbliKTmlq10aHJlYWRJc1J1bm5pbmcuXHJcbiAgICAgICAgaWYgKHR5cGUgPT09IDEgfHwgdHlwZSA9PT0gMikge1xyXG4gICAgICAgICAgaWYgKCF2aWV3ZXIuaXNCdXN5ICYmICF2aWV3ZXIudGhyZWFkSXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgIEpTX0V4ZWN1dGVfVGFza19Qb3N0X1Byb2Nlc3NpbmcodGFza19pZCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgLy8g6KGo56S6c3RyZWFtVG9TZWdtZW50VHTnur/nqIvnu5PmnZ9cclxuICAgICAgICAgICAgICB2aWV3ZXIuc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50LS07XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICBcInN0cmVhbVRvU2VnbWVudFJ1bm5pbmdDb3VudDpcIixcclxuICAgICAgICAgICAgICAgIHZpZXdlci5zdHJlYW1Ub1NlZ21lbnRSdW5uaW5nQ291bnRcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gMikge1xyXG4gICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgdmlld2VyLl90aHJlYWRTVEdESXNSdW5uaW5nQ291bnQtLTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAgIFwidGhpcy5fdGhyZWFkU1RHRElzUnVubmluZ0NvdW50OlwiLFxyXG4gICAgICAgICAgICAgICAgdmlld2VyLl90aHJlYWRTVEdESXNSdW5uaW5nQ291bnRcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHZpZXdlci5pc0J1c3kgfHwgdmlld2VyLnRocmVhZElzUnVubmluZykge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJvblRhc2tQcm9jZXNzaW5nRmluaXNoZWQgaXMgQnVzeVwiKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgSlNfRXhlY3V0ZV9UYXNrX1Bvc3RfUHJvY2Vzc2luZyh0YXNrX2lkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyDooajnpLpzdHJlYW1Ub1NlZ21lbnRUdOe6v+eoi+e7k+adn1xyXG4gICAgICAgICAgICAgICAgICB2aWV3ZXIuc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgICAgIFwic3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50OlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHZpZXdlci5zdHJlYW1Ub1NlZ21lbnRSdW5uaW5nQ291bnRcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgICB2aWV3ZXIuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAgICAgICBcInRoaXMuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudDpcIixcclxuICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoIXZpZXdlci5pc0J1c3kpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIm9uVGFza1Byb2Nlc3NpbmdGaW5pc2hlZCBleGVjdXRlIFwiICsgXCJ0eXBlOlwiICsgdHlwZSk7XHJcbiAgICAgICAgICAgIEpTX0V4ZWN1dGVfVGFza19Qb3N0X1Byb2Nlc3NpbmcodGFza19pZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHZpZXdlci5pc0J1c3kpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJvblRhc2tQcm9jZXNzaW5nRmluaXNoZWQgaXMgQnVzeVwiKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcclxuICAgICAgICAgICAgICAgICAgXCJvblRhc2tQcm9jZXNzaW5nRmluaXNoZWQgZXhlY3V0ZSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlOlwiICtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlICtcclxuICAgICAgICAgICAgICAgICAgICBcIiBpZFwiICtcclxuICAgICAgICAgICAgICAgICAgICB0YXNrX2lkXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgSlNfRXhlY3V0ZV9UYXNrX1Bvc3RfUHJvY2Vzc2luZyh0YXNrX2lkKTtcclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoIU1vZHVsZVtcInN0cmVhbVRvU2VnbWVudExpc3RcIl0pIHtcclxuICAgICAgTW9kdWxlW1wic3RyZWFtVG9TZWdtZW50TGlzdFwiXSA9IG5ldyBOdW1iZXJLZXlMaXN0PFxyXG4gICAgICAgIChrZXk6IG51bWJlcikgPT4gdm9pZFxyXG4gICAgICA+KCk7XHJcbiAgICB9XHJcbiAgICBNb2R1bGVbXCJhZnRlckFzeW5VcGRhdGVWaWV3XCJdID0gKHZpZXdfa2V5OiBudW1iZXIsIGNhbmNlbGxlZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGxldCB2aWV3ZXIgPSB0aGlzLmZpbmRWaWV3ZXJCeUtleSh2aWV3X2tleSk7XHJcblxyXG4gICAgICBpZiAoIWNhbmNlbGxlZCkge1xyXG4gICAgICAgIHZpZXdlci51bkJ1ZmZlckFuZEJ1ZmZlckdlb21ldHJpZXModHJ1ZSwgdmlld2VyLl90aHJlYWRQcm9taXNlLCB0cnVlKTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQVkNhbmNlbGxlZCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZpZXdlci5kZWJ1Z0xvZyhcIkFzeW5VcGRhdGVWaWV3IGNhbmNlbGxlZFwiKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFzeW5VcGRhdGVWaWV3IGNhbmNlbGxlZFwiKTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQVkNhbmNlbGxlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZpZXdlci5fdGhyZWFkVVBWSXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgIHZpZXdlci5fdGhyZWFkVVBWSXNQcmVwYXJpbmcgPSBmYWxzZTtcclxuICAgICAgdmlld2VyLmRlYnVnTG9nKFwiSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHRfRW5kXCIpO1xyXG5cclxuICAgICAgaWYgKHZpZXdlci5fdGhyZWFkVVBWQ2FuY2VsbGVkKSB7XHJcbiAgICAgICAgdmlld2VyLmRlYnVnTG9nKFwiSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHRfU3RhcnRfQ2FuY2VsbGVkXCIpO1xyXG4gICAgICAgIEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5X1R0KHZpZXdlci52aWV3S2V5KTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQVklzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgdmlld2VyLl90aHJlYWRVUFZDYW5jZWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQVklzQWdhaW4gPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmICh2aWV3ZXIuX3RocmVhZFVQVklzQWdhaW4pIHtcclxuICAgICAgICB2aWV3ZXIuZGVidWdMb2coXCJKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdF9TdGFydF9BZ2FpblwiKTtcclxuICAgICAgICBKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdCh2aWV3ZXIudmlld0tleSk7XHJcbiAgICAgICAgdmlld2VyLl90aHJlYWRVUFZJc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHZpZXdlci5fdGhyZWFkVVBWQ2FuY2VsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdmlld2VyLl90aHJlYWRVUFZJc0FnYWluID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgTW9kdWxlW1wiYWZ0ZXJBc3luVXBkYXRlR2VvbWV0cnlEYXRhXCJdID0gKFxyXG4gICAgICB2aWV3X2tleTogbnVtYmVyLFxyXG4gICAgICBwYXJ0aWFsX2tleTogbnVtYmVyLFxyXG4gICAgICBjYW5jZWxsZWQ6IG51bWJlclxyXG4gICAgKSA9PiB7XHJcbiAgICAgIGxldCB2aWV3ZXIgPSB0aGlzLmZpbmRWaWV3ZXJCeUtleSh2aWV3X2tleSk7XHJcblxyXG4gICAgICBpZiAoIWNhbmNlbGxlZCkge1xyXG4gICAgICAgIHZpZXdlci5fdGhyZWFkVVBHRENhbmNlbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIC8v6L+Y5pyq5Yqg6L295Yeg5L2V55qEc2VnbWVudOWIl+ihqFxyXG4gICAgICAgIGxldCBhc3luS2V5czogSW50MzJBcnJheSA9IEpTX1Nob3dfQXN5bl9HZW9tZXRyeV9EYXRhX0tleXMoXHJcbiAgICAgICAgICB2aWV3ZXIuX3ZpZXdLZXlcclxuICAgICAgICApIGFzIEludDMyQXJyYXk7XHJcbiAgICAgICAgdmlld2VyLmRlYnVnTG9nKFwiYXN5bktleXNMZW5ndGg6XCIgKyBhc3luS2V5cy5sZW5ndGgpO1xyXG5cclxuICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCJlbnN1cmVNZW1vcnlTaXplXCIpO1xyXG4gICAgICAgIGxldCBtZW1vcnlJc0ZyZWUgPSB2aWV3ZXIuZW5zdXJlTWVtb3J5U2l6ZSgpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUudGltZUVuZChcImVuc3VyZU1lbW9yeVNpemVcIik7XHJcblxyXG4gICAgICAgIGlmIChtZW1vcnlJc0ZyZWUpIHtcclxuICAgICAgICAgIHZpZXdlci5hc3luTG9hZEdlb21ldHJpZXMoYXN5bktleXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIm1lbW9yeSBpcyBmdWxsIGJlZm9yZSBhc3luTG9hZEdlb21ldHJpZXNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZpZXdlci5hc3luUmVtb3ZlR2VvbWV0cnkoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQR0RDYW5jZWxsZWQgPSB0cnVlO1xyXG4gICAgICAgIHZpZXdlci5kZWJ1Z0xvZyhcIkFzeW5VcGRhdGVHZW9tZXRyeURhdGEgY2FuY2VsbGVkXCIpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQXN5blVwZGF0ZUdlb21ldHJ5RGF0YSBjYW5jZWxsZWRcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZpZXdlci5fdGhyZWFkVVBHRElzUnVubmluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgdmlld2VyLmRlYnVnTG9nKFwiSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHRfRW5kXCIpO1xyXG5cclxuICAgICAgaWYgKHZpZXdlci5fdGhyZWFkVVBHRENhbmNlbGxlZCkge1xyXG4gICAgICAgIHZpZXdlci5kZWJ1Z0xvZyhcclxuICAgICAgICAgIFwiSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHRfU3RhcnRfQ2FuY2VsbGVkXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0KHZpZXdlci52aWV3S2V5LCAtMSk7XHJcbiAgICAgICAgdmlld2VyLl90aHJlYWRVUEdESXNSdW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQR0RDYW5jZWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQR0RJc0FnYWluID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSBpZiAodmlld2VyLl90aHJlYWRVUEdESXNBZ2Fpbikge1xyXG4gICAgICAgIHZpZXdlci5kZWJ1Z0xvZyhcIkpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0X1N0YXJ0X0FnYWluXCIpO1xyXG4gICAgICAgIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0KHZpZXdlci52aWV3S2V5LCAtMSk7XHJcbiAgICAgICAgdmlld2VyLl90aHJlYWRVUEdESXNSdW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQR0RDYW5jZWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB2aWV3ZXIuX3RocmVhZFVQR0RJc0FnYWluID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gbGV0IGltYWdlVXJscyA9IHt9XHJcbiAgICBNb2R1bGVbXCJvbkltYWdlRXh0ZXJuYWxMb2FkaW5nXCJdID0gKFxyXG4gICAgICB2aWV3X2tleTogbnVtYmVyLFxyXG4gICAgICBpbWFnZV9rZXk6IG51bWJlcixcclxuICAgICAgYnVmZmVyOiBudW1iZXJcclxuICAgICkgPT4ge1xyXG4gICAgICBsZXQgdmlld2VyID0gdGhpcy5maW5kVmlld2VyQnlLZXkodmlld19rZXkpIGFzIFZpZXdlcjtcclxuXHJcbiAgICAgIGxldCBuYW1lID0gSlNfU2hvd19PbmVfSW1hZ2VfT3B0aW9uKGltYWdlX2tleSwgXCJuYW1lXCIpO1xyXG4gICAgICBsZXQgZm9ybWF0ID0gSlNfU2hvd19PbmVfSW1hZ2VfT3B0aW9uKGltYWdlX2tleSwgXCJmb3JtYXRcIik7XHJcbiAgICAgIGxldCBpZCA9IEpTX1Nob3dfT25lX0ltYWdlX09wdGlvbihpbWFnZV9rZXksIFwiaWRcIik7XHJcbiAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgLy8gY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgICAgLy8gaW1nLmNyb3NzT3JpZ2luID0gXCIqXCI7XHJcbiAgICAgICAgLy8gaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyAgIC8vIF9nbEdlblRleHR1cmVzKDEsIGJ1ZmZlcik7XHJcbiAgICAgICAgLy8gICAvLyBsZXQgdGV4dHVyZSA9IEdMLnRleHR1cmVzW0dST1dBQkxFX0hFQVBfSTMyKClbYnVmZmVyID4+IDJdXSBhcyBXZWJHTFRleHR1cmU7XHJcbiAgICAgICAgLy8gICBsZXQgdGV4dHVyZSA9IEpTX0NyZWF0ZV9UZXh0dXJlKGJ1ZmZlcik7XHJcbiAgICAgICAgLy8gICBzZWxmLmdsLmJpbmRUZXh0dXJlKHNlbGYuZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XHJcbiAgICAgICAgLy8gICBpZiAoZm9ybWF0ID09IFwianBnXCIgfHwgZm9ybWF0ID09IFwicmdiXCIpIHtcclxuICAgICAgICAvLyAgICAgc2VsZi5nbC50ZXhJbWFnZTJEKHNlbGYuZ2wuVEVYVFVSRV8yRCwgMCwgc2VsZi5nbC5SR0IsIHNlbGYuZ2wuUkdCLCBzZWxmLmdsLlVOU0lHTkVEX0JZVEUsIGltZyk7XHJcbiAgICAgICAgLy8gICAgIHNlbGYuZ2wuZ2VuZXJhdGVNaXBtYXAoc2VsZi5nbC5URVhUVVJFXzJEKTtcclxuXHJcbiAgICAgICAgLy8gICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBcInBuZ1wiIHx8IGZvcm1hdCA9PSBcInJnYmFcIikge1xyXG4gICAgICAgIC8vICAgICBzZWxmLmdsLnRleEltYWdlMkQoc2VsZi5nbC5URVhUVVJFXzJELCAwLCBzZWxmLmdsLlJHQkEsIHNlbGYuZ2wuUkdCQSwgc2VsZi5nbC5VTlNJR05FRF9CWVRFLCBpbWcpO1xyXG4gICAgICAgIC8vICAgICBzZWxmLmdsLmdlbmVyYXRlTWlwbWFwKHNlbGYuZ2wuVEVYVFVSRV8yRCk7XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gICBzZWxmLmdsLmJpbmRUZXh0dXJlKHNlbGYuZ2wuVEVYVFVSRV8yRCwgbnVsbCk7XHJcblxyXG4gICAgICAgIC8vICAgc2VsZi51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGltZy5zcmMgPSBcImh0dHA6Ly84LjEzNC44NS4yNTQ6ODAyMS9pbWFnZXMvdGVzdC9cIiArIG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGZpbGVOYW1lID0gXCJodHRwOi8vOC4xMzQuODUuMjU0OjgwMjEvaW1hZ2VzL3Rlc3QvXCIgKyBuYW1lO1xyXG4gICAgICAgIC8vIGZldGNoKGZpbGVOYW1lKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAvLyAgIHJlc3BvbnNlLmJsb2IoKS50aGVuKGJsb2IgPT4ge1xyXG4gICAgICAgIC8vICAgICBwb29sLmV4ZWMobG9hZEltYWdlLCBbYmxvYl0pLnRoZW4oaW1hZ2UgPT4ge1xyXG4gICAgICAgIC8vICAgICAgIGxldCBnbCA9IHNlbGYuZ2w7XHJcbiAgICAgICAgLy8gICAgICAgbGV0IHRleHR1cmUgPSBKU19DcmVhdGVfVGV4dHVyZShidWZmZXIpO1xyXG4gICAgICAgIC8vICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xyXG4gICAgICAgIC8vICAgICAgIGlmIChmb3JtYXQgPT0gXCJqcGdcIiB8fCBmb3JtYXQgPT0gXCJyZ2JcIikge1xyXG4gICAgICAgIC8vICAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0IsIGdsLlJHQiwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UpO1xyXG4gICAgICAgIC8vICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XHJcblxyXG4gICAgICAgIC8vICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IFwicG5nXCIgfHwgZm9ybWF0ID09IFwicmdiYVwiKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltYWdlKTtcclxuICAgICAgICAvLyAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xyXG4gICAgICAgIC8vICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTtcclxuXHJcbiAgICAgICAgLy8gICAgICAgc2VsZi51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgLy8gICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBsZXQgZmlsZU5hbWUgPSBcImh0dHA6Ly84LjEzNC44NS4yNTQ6ODAyMS9pbWFnZXMvdGVzdC9cIiArIG5hbWU7XHJcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuZ2V0QXN5bkltYWdlQWN0aW9uLnVybCArIGlkICsgXCIvXCIgKyBuYW1lICsgXCIuXCIgKyBmb3JtYXQ7XHJcbiAgICAgICAgaWYgKHZpZXdlci5pbWFnZVVybHNbdXJsXSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2aWV3ZXIuaW1hZ2VVcmxzW3VybF0gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRva2VuID0gZ2V0Q29va2llKFwiR3NUb2tlblwiKTtcclxuICAgICAgICAvLyBpZiAodG9rZW4pIHtcclxuICAgICAgICAvLyAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCB0b2tlbilcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIHRoaXMueGhyTGlzdC5hZGQoeGhyKTtcclxuXHJcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgdXJsLCB0cnVlKTtcclxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XHJcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IFwiYmxvYlwiO1xyXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIsIFwiKlwiKTtcclxuICAgICAgICBpZiAodG9rZW4pIHtcclxuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCB0b2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnhockxpc3QucmVtb3ZlKHhocik7XHJcblxyXG4gICAgICAgICAgbGV0IGJsb2IgPSB4aHIucmVzcG9uc2U7XHJcbiAgICAgICAgICBjcmVhdGVJbWFnZUJpdG1hcChibG9iKS50aGVuKChpbWFnZSkgPT4ge1xyXG4gICAgICAgICAgICB2aWV3ZXIubWFrZUNvbnRleHRDdXJyZW50KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZ2wgPSB2aWV3ZXIuZ2w7XHJcbiAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gSlNfQ3JlYXRlX1RleHR1cmUoYnVmZmVyKTtcclxuXHJcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xyXG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09IFwianBnXCIgfHwgZm9ybWF0ID09IFwianBlZ1wiIHx8IGZvcm1hdCA9PSBcInJnYlwiKSB7XHJcbiAgICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChcclxuICAgICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsXHJcbiAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICAgZ2wuUkdCLFxyXG4gICAgICAgICAgICAgICAgZ2wuUkdCLFxyXG4gICAgICAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSxcclxuICAgICAgICAgICAgICAgIGltYWdlXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gXCJwbmdcIiB8fCBmb3JtYXQgPT0gXCJyZ2JhXCIpIHtcclxuICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKFxyXG4gICAgICAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCxcclxuICAgICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgICBnbC5SR0JBLFxyXG4gICAgICAgICAgICAgICAgZ2wuUkdCQSxcclxuICAgICAgICAgICAgICAgIGdsLlVOU0lHTkVEX0JZVEUsXHJcbiAgICAgICAgICAgICAgICBpbWFnZVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChcclxuICAgICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsXHJcbiAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICAgZ2wuUkdCLFxyXG4gICAgICAgICAgICAgICAgZ2wuUkdCLFxyXG4gICAgICAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSxcclxuICAgICAgICAgICAgICAgIGltYWdlXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIHZpZXdlci51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHhoci5zZW5kKCk7XHJcblxyXG4gICAgICAgIC8vIGZldGNoKHVybCwge1xyXG4gICAgICAgIC8vICAgaGVhZGVyczoge1xyXG4gICAgICAgIC8vICAgICBBdXRob3JpemF0aW9uOiB0b2tlbixcclxuICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgLy8gfSkudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAvLyAgIHJlc3BvbnNlLmJsb2IoKS50aGVuKChibG9iKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGNyZWF0ZUltYWdlQml0bWFwKGJsb2IpLnRoZW4oKGltYWdlKSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgdmlld2VyLm1ha2VDb250ZXh0Q3VycmVudCgpO1xyXG5cclxuICAgICAgICAvLyAgICAgICBsZXQgZ2wgPSB2aWV3ZXIuZ2w7XHJcbiAgICAgICAgLy8gICAgICAgbGV0IHRleHR1cmUgPSBKU19DcmVhdGVfVGV4dHVyZShidWZmZXIpO1xyXG5cclxuICAgICAgICAvLyAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcclxuICAgICAgICAvLyAgICAgICBpZiAoZm9ybWF0ID09IFwianBnXCIgfHwgZm9ybWF0ID09IFwianBlZ1wiIHx8IGZvcm1hdCA9PSBcInJnYlwiKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBnbC50ZXhJbWFnZTJEKFxyXG4gICAgICAgIC8vICAgICAgICAgICBnbC5URVhUVVJFXzJELFxyXG4gICAgICAgIC8vICAgICAgICAgICAwLFxyXG4gICAgICAgIC8vICAgICAgICAgICBnbC5SR0IsXHJcbiAgICAgICAgLy8gICAgICAgICAgIGdsLlJHQixcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSxcclxuICAgICAgICAvLyAgICAgICAgICAgaW1hZ2VcclxuICAgICAgICAvLyAgICAgICAgICk7XHJcbiAgICAgICAgLy8gICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcclxuICAgICAgICAvLyAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBcInBuZ1wiIHx8IGZvcm1hdCA9PSBcInJnYmFcIikge1xyXG4gICAgICAgIC8vICAgICAgICAgZ2wudGV4SW1hZ2UyRChcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCxcclxuICAgICAgICAvLyAgICAgICAgICAgMCxcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuUkdCQSxcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuUkdCQSxcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuVU5TSUdORURfQllURSxcclxuICAgICAgICAvLyAgICAgICAgICAgaW1hZ2VcclxuICAgICAgICAvLyAgICAgICAgICk7XHJcbiAgICAgICAgLy8gICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcclxuICAgICAgICAvLyAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgZ2wudGV4SW1hZ2UyRChcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCxcclxuICAgICAgICAvLyAgICAgICAgICAgMCxcclxuICAgICAgICAvLyAgICAgICAgICAgZ2wuUkdCLFxyXG4gICAgICAgIC8vICAgICAgICAgICBnbC5SR0IsXHJcbiAgICAgICAgLy8gICAgICAgICAgIGdsLlVOU0lHTkVEX0JZVEUsXHJcbiAgICAgICAgLy8gICAgICAgICAgIGltYWdlXHJcbiAgICAgICAgLy8gICAgICAgICApO1xyXG4gICAgICAgIC8vICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XHJcbiAgICAgICAgLy8gICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpO1xyXG5cclxuICAgICAgICAvLyAgICAgICB2aWV3ZXIudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIE1vZHVsZVtcIm9uQ29sbGlzaW9uQ29tcHV0aW5nXCJdID0gKFxyXG4gICAgICB2aWV3X2tleTogbnVtYmVyLFxyXG4gICAgICB0b3RhbDogbnVtYmVyLFxyXG4gICAgICBjdXJyZW50OiBudW1iZXJcclxuICAgICkgPT4ge1xyXG4gICAgICBsZXQgdmlld2VyID0gdmkuZmluZFZpZXdlckJ5S2V5KHZpZXdfa2V5KSBhcyBWaWV3ZXI7XHJcbiAgICAgIGlmICh2aWV3ZXIpIHtcclxuICAgICAgICB2aWV3ZXIuY29sbGlzaW9uQ29tcHV0aW5nLmZvckVhY2goZnVuY3Rpb24gKFxyXG4gICAgICAgICAgdmFsdWU6ICh2aWV3ZXI6IFZpZXdlciwgdG90YWw6IG51bWJlciwgY3VycmVudDogbnVtYmVyKSA9PiB2b2lkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB2YWx1ZSh2aWV3ZXIsIHRvdGFsLCBjdXJyZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBNb2R1bGVbXCJvbkNvbGxpc2lvbkNvbXB1dGVkXCJdID0gKHZpZXdfa2V5OiBudW1iZXIsIGNvdW50OiBudW1iZXIpID0+IHtcclxuICAgICAgbGV0IHZpZXdlciA9IHZpLmZpbmRWaWV3ZXJCeUtleSh2aWV3X2tleSkgYXMgVmlld2VyO1xyXG4gICAgICBpZiAodmlld2VyKSB7XHJcbiAgICAgICAgdmlld2VyLmNvbGxpc2lvbkNvbXB1dGVkLmZvckVhY2goXHJcbiAgICAgICAgICAodmFsdWU6ICh2aWV3ZXI6IFZpZXdlciwgY291bnQ6IG51bWJlcikgPT4gdm9pZCkgPT4ge1xyXG4gICAgICAgICAgICB2YWx1ZSh2aWV3ZXIsIGNvdW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIE1vZHVsZVtcIm9uU3RyZWFtVG9TZWdtZW50RmluaXNoZWRcIl0gPSAoa2V5OiBudW1iZXIsIG5vOiBudW1iZXIpID0+IHtcclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIm9uU3RyZWFtVG9TZWdtZW50RmluaXNoZWQ6IFwiICsga2V5ICsgbm8pO1xyXG5cclxuICAgICAgbGV0IGV2ZW50ID0gTW9kdWxlW1wic3RyZWFtVG9TZWdtZW50TGlzdFwiXS5nZXQobm8pO1xyXG4gICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICBldmVudChrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIE1vZHVsZVtcIm9uU3RyZWFtVG9HZW9tZXRyeURhdGFGaW5pc2hlZFwiXSA9IChjb3VudDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIC8vIHRoaXMuZGVidWdMb2coXCJvblN0cmVhbVRvR2VvbWV0cnlEYXRhRmluaXNoZWRcIik7XHJcbiAgICAgIHRoaXMuZGVidWdMb2coXCJvblN0cmVhbVRvR2VvbWV0cnlEYXRhRmluaXNoZWQ6IFwiICsgY291bnQpO1xyXG4gICAgICBQcm9jZXNzLnByb2Nlc3NMaXN0LmZvckVhY2goKHByb2Nlc3MpID0+IHtcclxuICAgICAgICBwcm9jZXNzLnZpZXdlcnMuZm9yRWFjaCgodmlldykgPT4ge1xyXG4gICAgICAgICAgbGV0IGJ1ZmZlclRhc2tMZW5ndGggPSB2aWV3LmF5c25UYXNrTWFuYWdlci5nZXRUYXNrTGVuZ3RoKDIpO1xyXG4gICAgICAgICAgaWYgKGJ1ZmZlclRhc2tMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdmlldy5jb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllcyh0cnVlLCBudWxsKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZpZXcuY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYnVmZmVyVGFzayBjb3VudCA+IDAsIGNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVz5Lit5patXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXNfVHRfRW5kXCIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBNb2R1bGVbXCJvbkJ1ZmZlckdlb21ldHJ5RmluaXNoZWRcIl0gPSAobm86IG51bWJlcikgPT4ge1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKFwib25CdWZmZXJHZW9tZXRyeUZpbmlzaGVkXCIpO1xyXG5cclxuICAgICAgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkodGhpcy52aWV3S2V5LCBmYWxzZSk7IC8v57uY5Yi2XHJcbiAgICB9O1xyXG5cclxuICAgIE1vZHVsZVtcIm9uQ29tcHV0ZUNvbGxpc2lvbkZpbmlzaGVkXCJdID0gKG5vOiBudW1iZXIsIGl0ZW1zOiBbXSkgPT4ge1xyXG4gICAgICAvL2NvbnNvbGUubG9nKFwib25Db21wdXRlQ29sbGlzaW9uRmluaXNoZWQ6IFwiLCBubywgaXRlbXMpO1xyXG5cclxuICAgICAgbGV0IGV2ZW50ID0gdGhpcy5vbkNvbXB1dGVDb2xsaXNpb25GaW5pc2hlZC5nZXQobm8pO1xyXG4gICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICBldmVudChpdGVtcyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBhc3luTG9hZEdlb21ldHJpZXMoYXN5bktleXM6IEludDMyQXJyYXkpIHtcclxuICAgIGlmIChhc3luS2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuaXNHZW9tZXRyeUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAvLyB0aGlzLl9zZWdtZW50TG9hZGluZ0NvdW50ID0gMDtcclxuICAgICAgY29uc29sZS5sb2coXCJpc0dlb21ldHJ5TG9hZGluZzpcIiwgdGhpcy5pc0dlb21ldHJ5TG9hZGluZyk7XHJcblxyXG4gICAgICBsZXQgbGlnaHRNb2RlbHMgPSAodGhpcyBhcyBhbnkpLnByb2Nlc3MuZmluZE1vZGVsUmVuZGVyT2JqZWN0cygpO1xyXG4gICAgICBsZXQgaWRNYXBLZXlzOiB7IFtpZDogc3RyaW5nXTogbnVtYmVyW10gfSA9IHt9O1xyXG4gICAgICB0aGlzLmdyb3VwaW5nQXN5bktleXNPZkVhY2hMaWdodE1vZGVsKGFzeW5LZXlzLCBpZE1hcEtleXMpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaWdodE1vZGVscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBtb2RlbElkID0gbGlnaHRNb2RlbHNbaV0ubW9kZWxJZDtcclxuICAgICAgICBsZXQga2V5cyA9IGlkTWFwS2V5c1ttb2RlbElkXTtcclxuXHJcbiAgICAgICAgaWYgKGtleXMpIHtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibW9kZWwtXCIgKyBtb2RlbElkICsgXCItLS1cIiArIGkpO1xyXG4gICAgICAgICAgdGhpcy5nZXRHZW9tZXRyeURhdGFQZXJMaWdodE1vZGVsKGxpZ2h0TW9kZWxzW2ldLCBpZE1hcEtleXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0R2VvbWV0cnlEYXRhUGVyTGlnaHRNb2RlbChcclxuICAgIGxpZ2h0TW9kZWwsXHJcbiAgICBpZE1hcEtleXM6IHsgW2lkOiBzdHJpbmddOiBudW1iZXJbXSB9XHJcbiAgKSB7XHJcbiAgICBsZXQgbW9kZWxJZCA9IGxpZ2h0TW9kZWwubW9kZWxJZDtcclxuICAgIGxldCBtb2RlbFZlcnNpb24gPSBsaWdodE1vZGVsLnZlcnNpb247XHJcbiAgICBsZXQga2V5cyA9IGlkTWFwS2V5c1ttb2RlbElkXTtcclxuXHJcbiAgICBpZiAoa2V5cykge1xyXG4gICAgICBsZXQgZGljdGlvbmFyeTogeyBbaWQ6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICAgIGxldCBjYWNoZURpY3Rpb25hcnk6IHsgW2lkOiBzdHJpbmddOiB7IGtleTogbnVtYmVyOyBkYXRhOiBhbnkgfSB9ID0ge307XHJcblxyXG4gICAgICAvLyBjb25zb2xlLnRpbWUoXCLmn6Xor6JpbmRleGVkREJcIik7XHJcbiAgICAgIGxldCBub0NhY2hlS2V5cyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcblxyXG4gICAgICBsZXQgZ3JvdXBTaXplQ291bnQgPSAwO1xyXG4gICAgICBsZXQgZ3JvdXBJZHMgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gY29uc29sZS50aW1lKFwi5Yik5patc2VnbWVudOaYr+WQpue8k+WtmFwiK21vZGVsSWQpO1xyXG4gICAgICAvLyBsZXQgZmlyc3RJZDtcclxuICAgICAgLy8gSlNfT3Blbl9TZWdtZW50X0J5X0tleShrZXlzWzBdKTtcclxuICAgICAgLy8ge1xyXG4gICAgICAvLyAgIGZpcnN0SWQgPSBKU19TaG93X09uZV9IZXVyaXN0aWNfT3B0aW9uKFwiZ2VvbWV0cnkgaWRcIik7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgbGV0IGlkYjogSURCO1xyXG4gICAgICAvLyBsZXQgaWRiRXhpc3QgPSB0cnVlO1xyXG4gICAgICBsZXQgdHg7XHJcbiAgICAgIGlmICh0aGlzLmlzQ2FjaGUpIHtcclxuICAgICAgICBpZGIgPSBJREIuZ2V0SW5zdGFuY2UobW9kZWxJZCk7XHJcbiAgICAgICAgLy8gaWRiRXhpc3QgPVxyXG4gICAgICAgIC8vICAgKGF3YWl0IGlkYi5nZXQobW9kZWxJZCkpICYmIChhd2FpdCBpZGIuZ2V0KG1vZGVsSWQgKyBcIl9cIiArIGZpcnN0SWQpKTtcclxuICAgICAgICB0eCA9IGF3YWl0IGlkYi50cmFuc2FjdGlvbigpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDpgY3ljoZrZXlz77yM5YWI5bCG5bey57uPbG9hZGluZ2xpc3TnmoRrZXnliIbnprvlh7rljrsuXHJcbiAgICAgIGxldCBsb2FkaW5nRmlsdGVkS2V5cyA9IHRoaXMuZmlsdGVyTG9hZGluZ0xpc3Qoa2V5cyk7XHJcblxyXG4gICAgICB0aGlzLl9zZWdtZW50TG9hZGluZ0NvdW50ICs9IGxvYWRpbmdGaWx0ZWRLZXlzLmxlbmd0aDtcclxuXHJcbiAgICAgIGtleXMgPSBsb2FkaW5nRmlsdGVkS2V5cztcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgbGV0IHNlZ0tleSA9IGtleXNbal07XHJcblxyXG4gICAgICAgIGxldCBpZCA9IG51bGw7XHJcbiAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleShzZWdLZXkpO1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkID0gSlNfU2hvd19PbmVfSGV1cmlzdGljX09wdGlvbihcImdlb21ldHJ5IGlkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaWRcIiwgaWQpO1xyXG4gICAgICAgIGlmIChpZCkge1xyXG4gICAgICAgICAgdGhpcy5fbG9hZGluZ0xpc3Rbc2VnS2V5XSA9IDA7XHJcbiAgICAgICAgICB0aGlzLl9sb2FkaW5nTGlzdENvdW50Kys7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNDYWNoZSkge1xyXG4gICAgICAgICAgICB0eC5zdG9yZVxyXG4gICAgICAgICAgICAgIC5nZXQobW9kZWxJZCArIFwiP3Y9XCIgKyBtb2RlbFZlcnNpb24gKyBcIl9cIiArIGlkKVxyXG4gICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLl9hbGxHZW9Db3VudEZyb21DYWNoZSsrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgY2FjaGVEaWN0aW9uYXJ5W2lkXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6IHNlZ0tleSxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleShzZWdLZXkpO1xyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9KU19TZXRfSGV1cmlzdGljX09wdGlvbnMoXCJhc3luIGdlb21ldHJ5PW9mZlwiKTtcclxuICAgICAgICAgICAgICAgICAgICBKU19TZXRfT25lX0hldXJpc3RpY19PcHRpb24oXCJhc3luIGdlb21ldHJ5XCIsIFwib2ZmXCIpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xvYWRpbmdMaXN0W3NlZ0tleV07XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdMaXN0Q291bnQtLTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sb2FkaW5nTGlzdENvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5blrozlhajpg6jlh6DkvZXmlbDmja5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwiZ2V0IGRhdGEgZmluaXNoXCIpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChqID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpc0xhc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXN5bkJhdGNoU2V0U2VnbWVudHNEYXRhRnJvbUNhY2hlKHNlZ0tleSwgZGF0YSwgaXNMYXN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8v5pyA5ZCO5LiA57uELlxyXG4gICAgICAgICAgICAgICAgICBpZiAoaiA9PT0ga2V5cy5sZW5ndGggLSAxICYmIGdyb3VwSWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBncm91cElkcyA9IGdyb3VwSWRzLnN1YnN0cmluZygwLCBncm91cElkcy5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3luQmF0Y2hTZXRTZWdtZW50c0RhdGEoXHJcbiAgICAgICAgICAgICAgICAgICAgICBtb2RlbElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgW2dyb3VwSWRzXSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmVyc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBncm91cFNpemVDb3VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNlZ21lbnRcIiArIG1vZGVsSWQgKyBcIl9cIiArIGlkICsgXCLlt7LnvJPlrZhcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2lkXSA9IHNlZ0tleTtcclxuICAgICAgICAgICAgICAgICAgbm9DYWNoZUtleXMucHVzaChzZWdLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkoc2VnS2V5KTtcclxuICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wU2l6ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICBKU19TaG93X09uZV9IZXVyaXN0aWNfT3B0aW9uKFwiZ2VvbWV0cnkgc2l6ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gTnVtYmVyKHRlbXBTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNpemUsXCIsIHNpemUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8v5YWI5Yik5patc2l6ZeaYr+WQpuWkp+S6jjEwMjQgKiAxMDI0O1xyXG4gICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSB0aGlzLl9ncm91cFNpemVMaW1pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cElkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvL+aJuemHjyhpZCnmj5LlhaXlh6DkvZXmlbDmja4uXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyDliarljrvmnIDlkI7kuIDkuKrpgJflj7flrZfnrKZcclxuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWRzID0gZ3JvdXBJZHMuc3Vic3RyaW5nKDAsIGdyb3VwSWRzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3luQmF0Y2hTZXRTZWdtZW50c0RhdGEoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cElkc10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmVyc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeVxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwU2l6ZUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBncm91cElkcyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBpZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzeW5CYXRjaFNldFNlZ21lbnRzRGF0YShcclxuICAgICAgICAgICAgICAgICAgICAgIG1vZGVsSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBJZHNdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbW9kZWxWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwU2l6ZUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBncm91cElkcyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9lbHNlLua3u+WKoOiHs+aVsOe7hOS4rS5ncm91cFNpemVDb3VudCArPSBzaXplLlxyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSWRzID0gZ3JvdXBJZHMgKyBpZCArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwU2l6ZUNvdW50ICs9IHNpemU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cFNpemVDb3VudCA+PSB0aGlzLl9ncm91cFNpemVMaW1pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy/lpoLmnpzmlbDnu4RzaXplID4gMTAyNCAqIDEwMjQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyDliarljrvmnIDlkI7kuIDkuKrpgJflj7flrZfnrKZcclxuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWRzID0gZ3JvdXBJZHMuc3Vic3RyaW5nKDAsIGdyb3VwSWRzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3luQmF0Y2hTZXRTZWdtZW50c0RhdGEoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cElkc10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmVyc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeVxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBncm91cFNpemVDb3VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkcyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAvL+acgOWQjuS4gOe7hC5cclxuICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGtleXMubGVuZ3RoIC0gMSAmJiBncm91cElkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwSWRzW2dyb3VwSWRzLmxlbmd0aCAtIDFdID09PSBcIixcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBncm91cElkcy5zdWJzdHJpbmcoMCwgZ3JvdXBJZHMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXN5bkJhdGNoU2V0U2VnbWVudHNEYXRhKFxyXG4gICAgICAgICAgICAgICAgICAgICAgbW9kZWxJZCxcclxuICAgICAgICAgICAgICAgICAgICAgIFtncm91cElkc10sXHJcbiAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBTaXplQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSWRzID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgLy8g5pyA5ZCO5LiA57uELlxyXG4gICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChqID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpc0xhc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXN5bkJhdGNoU2V0U2VnbWVudHNEYXRhRnJvbUNhY2hlKG51bGwsIG51bGwsIGlzTGFzdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkaWN0aW9uYXJ5W2lkXSA9IHNlZ0tleTtcclxuICAgICAgICAgICAgbm9DYWNoZUtleXMucHVzaChzZWdLZXkpO1xyXG4gICAgICAgICAgICBsZXQgc2l6ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkoc2VnS2V5KTtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGxldCB0ZW1wU2l6ZSA9IEpTX1Nob3dfT25lX0hldXJpc3RpY19PcHRpb24oXCJnZW9tZXRyeSBzaXplXCIpO1xyXG4gICAgICAgICAgICAgIHNpemUgPSBOdW1iZXIodGVtcFNpemUpO1xyXG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2l6ZSxcIiwgc2l6ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgICAgICAgLy/lhYjliKTmlq1zaXpl5piv5ZCm5aSn5LqOMTAyNCAqIDEwMjQ7XHJcbiAgICAgICAgICAgIGlmIChzaXplID49IHRoaXMuX2dyb3VwU2l6ZUxpbWl0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGdyb3VwSWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8v5om56YePKGlkKeaPkuWFpeWHoOS9leaVsOaNri5cclxuICAgICAgICAgICAgICAgIC8vIOWJquWOu+acgOWQjuS4gOS4qumAl+WPt+Wtl+esplxyXG4gICAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBncm91cElkcy5zdWJzdHJpbmcoMCwgZ3JvdXBJZHMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFzeW5CYXRjaFNldFNlZ21lbnRzRGF0YShcclxuICAgICAgICAgICAgICAgICAgbW9kZWxJZCxcclxuICAgICAgICAgICAgICAgICAgW2dyb3VwSWRzXSxcclxuICAgICAgICAgICAgICAgICAgbW9kZWxWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgZ3JvdXBTaXplQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgIGdyb3VwSWRzID0gXCJcIjtcclxuICAgICAgICAgICAgICBncm91cElkcyA9IGlkO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXN5bkJhdGNoU2V0U2VnbWVudHNEYXRhKFxyXG4gICAgICAgICAgICAgICAgbW9kZWxJZCxcclxuICAgICAgICAgICAgICAgIFtncm91cElkc10sXHJcbiAgICAgICAgICAgICAgICBtb2RlbFZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5XHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgZ3JvdXBTaXplQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgIGdyb3VwSWRzID0gXCJcIjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvL2Vsc2Uu5re75Yqg6Iez5pWw57uE5LitLmdyb3VwU2l6ZUNvdW50ICs9IHNpemUuXHJcbiAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBncm91cElkcyArIGlkICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgZ3JvdXBTaXplQ291bnQgKz0gc2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGdyb3VwU2l6ZUNvdW50ID49IHRoaXMuX2dyb3VwU2l6ZUxpbWl0KSB7XHJcbiAgICAgICAgICAgICAgICAvL+WmguaenOaVsOe7hHNpemUgPiAxMDI0ICogMTAyNDtcclxuICAgICAgICAgICAgICAgIC8vIOWJquWOu+acgOWQjuS4gOS4qumAl+WPt+Wtl+esplxyXG4gICAgICAgICAgICAgICAgZ3JvdXBJZHMgPSBncm91cElkcy5zdWJzdHJpbmcoMCwgZ3JvdXBJZHMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFzeW5CYXRjaFNldFNlZ21lbnRzRGF0YShcclxuICAgICAgICAgICAgICAgICAgbW9kZWxJZCxcclxuICAgICAgICAgICAgICAgICAgW2dyb3VwSWRzXSxcclxuICAgICAgICAgICAgICAgICAgbW9kZWxWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5XHJcbiAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgIGdyb3VwU2l6ZUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIGdyb3VwSWRzID0gXCJcIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8v5pyA5ZCO5LiA57uELlxyXG4gICAgICAgICAgICBpZiAoaiA9PT0ga2V5cy5sZW5ndGggLSAxICYmIGdyb3VwSWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICBncm91cElkcyA9IGdyb3VwSWRzLnN1YnN0cmluZygwLCBncm91cElkcy5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICB0aGlzLmFzeW5CYXRjaFNldFNlZ21lbnRzRGF0YShcclxuICAgICAgICAgICAgICAgIG1vZGVsSWQsXHJcbiAgICAgICAgICAgICAgICBbZ3JvdXBJZHNdLFxyXG4gICAgICAgICAgICAgICAgbW9kZWxWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgZGljdGlvbmFyeVxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIGdyb3VwU2l6ZUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICBncm91cElkcyA9IFwiXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOmBjeWOhmtleXMs5YWI5bCGbG9hZGluZ2xpc3TnmoRrZXnov4fmu6TmjokuXHJcbiAgICogQHBhcmFtIGtleXNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGZpbHRlckxvYWRpbmdMaXN0KGtleXM6IG51bWJlcltdKSB7XHJcbiAgICBsZXQgbG9hZGluZ0ZpbHRlZEtleXMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgIGxldCBzZWdLZXkgPSBrZXlzW2pdO1xyXG5cclxuICAgICAgbGV0IGlkID0gbnVsbDtcclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleShzZWdLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgaWQgPSBKU19TaG93X09uZV9IZXVyaXN0aWNfT3B0aW9uKFwiZ2VvbWV0cnkgaWRcIik7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgaWYgKGlkKSB7XHJcbiAgICAgICAgLy8g6Ziy5q2i6YeN5aSN5Yqg6L2955u45ZCM55qE5Yeg5L2VLlxyXG4gICAgICAgIGxldCByZXMgPSB0aGlzLl9sb2FkaW5nTGlzdFtzZWdLZXldO1xyXG4gICAgICAgIGlmIChyZXMgIT09IG51bGwgJiYgcmVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9hZGluZ0ZpbHRlZEtleXMucHVzaChzZWdLZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxvYWRpbmdGaWx0ZWRLZXlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5om56YeP5re75Yqgc2VnbWVudOeahOWHoOS9leaVsOaNri5cclxuICAgKiBAcGFyYW0gc2VnS2V5IOWNleS4qnNlZ21lbnTnmoRrZXlcclxuICAgKiBAcGFyYW0gYnl0ZXMg5Y2V5Liqc2VnbWVudOWHoOS9leaVsOaNrlxyXG4gICAqIEBwYXJhbSBpc0xhc3RcclxuICAgKi9cclxuICBhc3luQmF0Y2hTZXRTZWdtZW50c0RhdGFGcm9tQ2FjaGUoc2VnS2V5LCBieXRlcywgaXNMYXN0OiBib29sZWFuKSB7XHJcbiAgICBpZiAoc2VnS2V5KSB7XHJcbiAgICAgIHRoaXMuX2NhY2hlU2VnS2V5cy5wdXNoKHNlZ0tleSk7XHJcbiAgICB9XHJcbiAgICBpZiAoYnl0ZXMpIHtcclxuICAgICAgdGhpcy5fY2FjaGVHZW9tZXRyeURhdGFMaXN0LnB1c2goYnl0ZXMpO1xyXG4gICAgICB0aGlzLl9jYWNoZURhdGFTaXplICs9IGJ5dGVzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX2NhY2hlU2VnS2V5cy5sZW5ndGggPiB0aGlzLl9yZW5kZXJWaWV3UGVyR3JvdXAgfHxcclxuICAgICAgdGhpcy5fY2FjaGVEYXRhU2l6ZSA+IHRoaXMuX2dyb3VwU2l6ZUxpbWl0ICogMjAgfHxcclxuICAgICAgaXNMYXN0XHJcbiAgICApIHtcclxuICAgICAgbGV0IGtleXMgPSBbLi4udGhpcy5fY2FjaGVTZWdLZXlzXTtcclxuICAgICAgaWYgKCFrZXlzIHx8IGtleXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgYWxsQnl0ZUxlbmd0aCA9IDA7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FjaGVHZW9tZXRyeURhdGFMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgYWxsQnl0ZUxlbmd0aCArPSB0aGlzLl9jYWNoZUdlb21ldHJ5RGF0YUxpc3RbaV0ubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZ2VvbWV0cnlHcnVwRGF0YSA9IG5ldyBVaW50OEFycmF5KGFsbEJ5dGVMZW5ndGgpO1xyXG4gICAgICBsZXQgY3VycmVudE9mZnNldCA9IDA7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FjaGVHZW9tZXRyeURhdGFMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZ2VvbWV0cnlHcnVwRGF0YS5zZXQodGhpcy5fY2FjaGVHZW9tZXRyeURhdGFMaXN0W2ldLCBjdXJyZW50T2Zmc2V0KTtcclxuICAgICAgICBjdXJyZW50T2Zmc2V0ICs9IHRoaXMuX2NhY2hlR2VvbWV0cnlEYXRhTGlzdFtpXS5sZW5ndGg7XHJcblxyXG4gICAgICAgIHRoaXMuX2NhY2hlR2VvbWV0cnlEYXRhTGlzdFtpXSA9IG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXNfVHTkuI50aHJlYWRJc1J1bm5pbmfkuI3kupLmlqVcclxuICAgICAgLy8g5Y+q5piv5YW2UHJvY2Vzc2luZ0V4ZWN1dGXkuI50aHJlYWRJc1J1bm5pbmfkupLmlqVcclxuICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgIC8vIOW8guatpeaJp+ihjEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleSzkuJTkuI3og73kuI7nur/nqIvlkIzml7bmiafooYxcclxuICAgICAgICBpZiAodGhpcy5jaGVja1N0cmVhbVRvR2VvbWV0cnlEaXNhYmxlKCkpIHtcclxuICAgICAgICAgIC8vIGlmICh0aGlzLmlzQnVzeSkge1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJidXN5IHwgdGhyZWFkSXNSdW5pbmcsSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V55bu25ZCOXCIpO1xyXG4gICAgICAgICAgLy8gcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9jdXJyZW50TWVtb3J5U2l6ZSArPSBhbGxCeXRlTGVuZ3RoICogMztcclxuICAgICAgICAgIGxldCBpc0ZyZWUgPSB0aGlzLmVuc3VyZUN1cnJlbnRNZW1vcnlTaXplKCk7XHJcbiAgICAgICAgICBpZiAoaXNGcmVlKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwia2V5czpcIiwga2V5cy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1VwZGF0ZVR0KSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90aHJlYWRVUFZJc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleXNfVHRfU3RhcnRcIik7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzX1R0KFxyXG4gICAgICAgICAgICAgICAgICAgIGtleXMsXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnlHcnVwRGF0YSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdLZXlcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fc2VnbWVudExvYWRpbmdDb3VudCAtPSBrZXlzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICAgIC8vICAgXCJfc2VnbWVudExvYWRpbmdDb3VudDpcIixcclxuICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLl9zZWdtZW50TG9hZGluZ0NvdW50XHJcbiAgICAgICAgICAgICAgICAgIC8vICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9LCAyMCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzXCIsIGtleXMubGVuZ3RoKTtcclxuICAgICAgICAgICAgICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzKGtleXMsIGdlb21ldHJ5R3J1cERhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3NlZ21lbnRMb2FkaW5nQ291bnQgLT0ga2V5cy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJfc2VnbWVudExvYWRpbmdDb3VudDpcIiwgdGhpcy5fc2VnbWVudExvYWRpbmdDb3VudCk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXModHJ1ZSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWVtb3J5IGlzIGZ1bGwgZnJvbSBjYWNoZVwiKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTtcclxuICAgICAgICAgIC8vIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMjApO1xyXG5cclxuICAgICAgdGhpcy5fY2FjaGVTZWdLZXlzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgICAgdGhpcy5fY2FjaGVHZW9tZXRyeURhdGFMaXN0ID0gbmV3IEFycmF5PFVpbnQ4QXJyYXk+KCk7XHJcbiAgICAgIHRoaXMuX2NhY2hlRGF0YVNpemUgPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmluZFZpZXdlckJ5S2V5KHZpZXdfa2V5KTogVmlld2VyIHtcclxuICAgIGxldCB2aWV3ZXIgPSBudWxsO1xyXG4gICAgUHJvY2Vzcy5wcm9jZXNzTGlzdC5mb3JFYWNoKChwcm9jZXNzKSA9PiB7XHJcbiAgICAgIHByb2Nlc3Mudmlld2Vycy5mb3JFYWNoKCh2aSkgPT4ge1xyXG4gICAgICAgIGlmICh2aS52aWV3S2V5ID09IHZpZXdfa2V5KSB7XHJcbiAgICAgICAgICB2aWV3ZXIgPSB2aTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodmlld2VyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXZpZXdlcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIuaJvuS4jeWIsHZpZXdlclwiKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmlld2VyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVWaWV3KGNvbnRhaW5lcklkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpO1xyXG4gICAgLy90aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuICAgIC8vIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IFwiMFwiO1xyXG4gICAgLy90aGlzLmNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9IFwibm9uZVwiO1xyXG4gICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJjYW52YXNfXCIgKyBjb250YWluZXJJZCk7XHJcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgIHRoaXMuY2FudmFzLnN0eWxlLmxlZnQgPSBcIjBweFwiO1xyXG4gICAgdGhpcy5jYW52YXMuc3R5bGUucmlnaHQgPSBcIjBweFwiO1xyXG4gICAgdGhpcy5jYW52YXMuc3R5bGUuekluZGV4ID0gXCIwXCI7XHJcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS50b3VjaEFjdGlvbiA9IFwibm9uZVwiO1xyXG4gICAgLy8gdGhpcy5jYW52YXMudGFiSW5kZXggPSAxO1xyXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDtcclxuICAgIHRoaXMuY2FudmFzLm9uY29udGV4dG1lbnUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XHJcbiAgICB0aGlzLmNvbnRhaW5lcltcInZpZXdlclwiXSA9IHRoaXM7XHJcblxyXG4gICAgdGhpcy5fd2lkdGggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMuX2hlaWdodCA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICB0aGlzLl9hc3BlY3RSYXRpbyA9IHRoaXMuX3dpZHRoIC8gdGhpcy5faGVpZ2h0O1xyXG5cclxuICAgIEpTX09wZW5fU2VnbWVudChcIi9kcml2ZXIvZW1zY3JpcHRlblwiKTtcclxuICAgIHtcclxuICAgICAgSlNfU2V0X0RyaXZlcl9Db25maWdzKFwiZHJpdmVyPWVtc2NyaXB0ZW5cIik7XHJcblxyXG4gICAgICB0aGlzLl92aWV3S2V5ID0gSlNfT3Blbl9TZWdtZW50KGNvbnRhaW5lcklkKTtcclxuICAgICAge1xyXG4gICAgICAgIEpTX1NldF9Ecml2ZXJfT3B0aW9ucyhcclxuICAgICAgICAgIFwidmlld2VyIGlkPScjY2FudmFzX1wiICsgY29udGFpbmVySWQgKyBcIicsc2VsZWN0aW9uIHRvbGVyYW5jZT0wLjAwNVwiXHJcbiAgICAgICAgKTtcclxuICAgICAgICBKU19TZXRfU2hhZGVyKFwibmFtZT1ibGlubiBwaG9uZ1wiKTtcclxuICAgICAgICBKU19TZXRfVmlld3BvcnQoMCwgMCwgMSwgMSwgXCJ3aW5kb3dcIik7XHJcblxyXG4gICAgICAgIEpTX1NldF9Db2xvcihcImxpZ2h0cz0ocj0xLGc9MSxiPTEpLGFtYmllbnRzPShyPTAuNSxnPTAuNSxiPTAuNSlcIik7XHJcbiAgICAgICAgSlNfU2V0X0NvbG9yKFxyXG4gICAgICAgICAgXCJiYWNrZ3JvdW5kPShyPTEuMCxnPTEuMCxiPTEuMCksbWFya2Vycz0ocj0wLjAsZz0xLjAsYj0wLjApLGxpbmVzPShyPTAuMCxnPTEuMCxiPTAuMCksdmVydGljZXM9KHI9MC4wLGc9MS4wLGI9MC4wKSxlZGdlcz0ocj0wLjAsZz0xLjAsYj0wLjApLGZhY2VzPShjb2xvcj0ocj0wLjAsZz0xLjAsYj0wLjI3KSxlbWlzc2l2ZT0ocj0wLjAsZz0wLjAsYj0wLjApLHRyYW5zcGFyZW5jeT0xLjAsbWV0YWxsaWM9MC4xLHJvdWdobmVzcz0wLjIsc3BlY3VsYXI9MC41LGRpZmZ1c2U9LSksY3V0dGluZyBmYWNlcz0oY29sb3I9KHI9MS4wLGc9MC44LGI9MC4wKSxkaWZmdXNlPS0pXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIEpTX1NldF9WaXNpYmlsaXR5KFwibGlnaHRzPW9uLGN1dHRpbmcgcGxhbmVzPW9mZlwiKTtcclxuICAgICAgICBKU19TZXRfUmVuZGVyaW5nX09wdGlvbnMoXHJcbiAgICAgICAgICBcIm1hcmtlciBzaXplPTYsdmVydGV4IHNpemU9NixsaW5lIHdpZHRoPTMsZWRnZSB3aWR0aD0zLG1lc2ggbGluZT1vZmYsbWVzaCBlZGdlPW9mZixjdWxsIGJhY2sgZmFjZT1vbixsb2dhcml0aG1pYyBkZXB0aCBidWZmZXI9b2ZmLGRlcHRoIHJhbmdlPSgwLDEpLGZhY2Ugb2Zmc2V0PSgwLDApXCJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBKU19JbnNlcnRfSW1hZ2UoXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICAxLFxyXG4gICAgICAgICAgMSxcclxuICAgICAgICAgIG5ldyBJbnQ4QXJyYXkoWzI1NSwgMjU1LCAyNTUsIDI1NV0pLFxyXG4gICAgICAgICAgXCJuYW1lPS0sbG9jYWxcIlxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NjZW5lS2V5ID0gSlNfT3Blbl9TZWdtZW50KFwic2NlbmVcIik7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYShcclxuICAgICAgICAgICAgWzAsIDAsIDVdLFxyXG4gICAgICAgICAgICBbMCwgMCwgMF0sXHJcbiAgICAgICAgICAgIFswLCAxLCAwXSxcclxuICAgICAgICAgICAgMi4wLFxyXG4gICAgICAgICAgICAyLjAsXHJcbiAgICAgICAgICAgIFwib3J0aG9ncmFwaGljXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBKU19JbnNlcnRfTGlnaHQoMCwgMC40LCAxLjUsIHRydWUpO1xyXG4gICAgICAgICAgSlNfU2V0X01vZGVsbGluZ01hdHJpeChbXHJcbiAgICAgICAgICAgIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsXHJcbiAgICAgICAgICBdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgICB0aGlzLl9zY3JlZW5LZXkgPSBKU19PcGVuX1NlZ21lbnQoXCJzY3JlZW5cIik7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYShcclxuICAgICAgICAgICAgWzAsIDAsIDVdLFxyXG4gICAgICAgICAgICBbMCwgMCwgMF0sXHJcbiAgICAgICAgICAgIFswLCAxLCAwXSxcclxuICAgICAgICAgICAgMi4wLFxyXG4gICAgICAgICAgICAyLjAsXHJcbiAgICAgICAgICAgIFwib3J0aG9ncmFwaGljXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBKU19TZXRfTW9kZWxsaW5nTWF0cml4KFtcclxuICAgICAgICAgICAgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSxcclxuICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgSlNfU2V0X1JlbmRlcmluZ19PcHRpb25zKFxyXG4gICAgICAgICAgICBcInN5bmMgdXBkYXRlPW9uLGRlcHRoIHJhbmdlPSgwLjAsIDAuMSksc2NyZWVuIGRyYXdpbmc9b24sdmlldyBmcnVzdHVtIGN1bGxpbmc9b2ZmLGN1bGxpbmcgbWF4aW11bSBleHRlbnQ9MFwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgSlNfU2V0X0hldXJpc3RpY19PcHRpb25zKFwiZXhjbHVkZSBib3VuZGluZz1vblwiKTtcclxuICAgICAgICAgIEpTX1NldF9WaXNpYmlsaXR5KFwibGlnaHRzPW9mZlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICBKU19PcGVuX1NlZ21lbnQoXCIvaW5jbHVkZSBsaWJyYXJ5XCIpO1xyXG4gICAge1xyXG4gICAgICB0aGlzLl9tb2RlbEtleSA9IEpTX09wZW5fU2VnbWVudChcIm1vZGVsX1wiICsgY29udGFpbmVySWQpO1xyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICB9XHJcbiAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgSlNfT3Blbl9TZWdtZW50KFwiL3N0eWxlIGxpYnJhcnlcIik7XHJcbiAgICB7XHJcbiAgICAgIHRoaXMuX3N0eWxlS2V5ID0gSlNfT3Blbl9TZWdtZW50KFwic3R5bGVfXCIgKyBjb250YWluZXJJZCk7XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAvL0pTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgSlNfVXBkYXRlX0Rpc3BsYXkoKTtcclxuXHJcbiAgICB0aGlzLmdsID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIndlYmdsMlwiKTtcclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLl9vblJlc2l6ZSk7XHJcblxyXG4gICAgLy9hZGRSZXNpemVMaXN0ZW5lcih0aGlzLmNvbnRhaW5lciwgZnVuY3Rpb24gcmVzaXplKGU6IEV2ZW50KSB7XHJcbiAgICAvLyAgICB2aS5jYW52YXMud2lkdGggPSB2aS5jb250YWluZXIub2Zmc2V0V2lkdGg7XHJcbiAgICAvLyAgICB2aS5jYW52YXMuaGVpZ2h0ID0gdmkuY29udGFpbmVyLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAvLyAgICB2aS5fd2lkdGggPSB2aS5jb250YWluZXIub2Zmc2V0V2lkdGg7XHJcbiAgICAvLyAgICB2aS5faGVpZ2h0ID0gdmkuY29udGFpbmVyLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAvLyAgICB2aS5fYXNwZWN0UmF0aW8gPSB2aS5fd2lkdGggLyB2aS5faGVpZ2h0O1xyXG5cclxuICAgIC8vICAgIEpTX1Jlc2l6ZV9CeV9LZXkodmkuX3ZpZXdLZXkpO1xyXG4gICAgLy8gICAgdmkudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgLy99KVxyXG5cclxuICAgIC8vdGhpcy5jYW52YXMub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZTogTW91c2VFdmVudCkge1xyXG4gICAgLy8gICAgaWYgKGUuYnV0dG9uID09IDApIHtcclxuICAgIC8vICAgICAgICB2aS5sQnV0dG9uRG93biA9IHRydWU7XHJcblxyXG4gICAgLy8gICAgICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICAgICAgdmFsdWUub25MQnV0dG9uRG93bihuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuICAgIC8vICAgIGVsc2UgaWYgKGUuYnV0dG9uID09IDIpIHtcclxuICAgIC8vICAgICAgICB2aS5yQnV0dG9uRG93biA9IHRydWU7XHJcblxyXG4gICAgLy8gICAgICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICAgICAgdmFsdWUub25SQnV0dG9uRG93bihuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuICAgIC8vICAgIGVsc2UgaWYgKGUuYnV0dG9uID09IDEpIHtcclxuICAgIC8vICAgICAgICB2aS5tQnV0dG9uRG93biA9IHRydWU7XHJcblxyXG4gICAgLy8gICAgICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICAgICAgdmFsdWUub25NQnV0dG9uRG93bihuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuICAgIC8vfVxyXG5cclxuICAgIC8vdGhpcy5jYW52YXMub25tb3VzZXVwID0gZnVuY3Rpb24gKGU6IE1vdXNlRXZlbnQpIHtcclxuICAgIC8vICAgIGlmIChlLmJ1dHRvbiA9PSAwKSB7XHJcbiAgICAvLyAgICAgICAgdmkubEJ1dHRvbkRvd24gPSBmYWxzZTtcclxuXHJcbiAgICAvLyAgICAgICAgdmkub3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBPcGVyYXRvcikge1xyXG4gICAgLy8gICAgICAgICAgICB2YWx1ZS5vbkxCdXR0b25VcChuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuICAgIC8vICAgIGVsc2UgaWYgKGUuYnV0dG9uID09IDIpIHtcclxuICAgIC8vICAgICAgICB2aS5yQnV0dG9uRG93biA9IGZhbHNlO1xyXG5cclxuICAgIC8vICAgICAgICB2aS5vcGVyYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IE9wZXJhdG9yKSB7XHJcbiAgICAvLyAgICAgICAgICAgIHZhbHVlLm9uUkJ1dHRvblVwKG5ldyBWaWV3ZXJFdmVudCh2aSwgZSkpO1xyXG4gICAgLy8gICAgICAgIH0pO1xyXG4gICAgLy8gICAgfVxyXG4gICAgLy8gICAgZWxzZSBpZiAoZS5idXR0b24gPT0gMSkge1xyXG4gICAgLy8gICAgICAgIHZpLm1CdXR0b25Eb3duID0gZmFsc2U7XHJcblxyXG4gICAgLy8gICAgICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICAgICAgdmFsdWUub25NQnV0dG9uVXAobmV3IFZpZXdlckV2ZW50KHZpLCBlKSk7XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICAvLyAgICB9XHJcbiAgICAvL31cclxuXHJcbiAgICAvL3RoaXMuY2FudmFzLm9ubW91c2Vtb3ZlID0gZnVuY3Rpb24gKGU6IE1vdXNlRXZlbnQpIHtcclxuICAgIC8vICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICB2YWx1ZS5vbk1vdXNlTW92ZShuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgIH0pO1xyXG5cclxuICAgIC8vICAgIGlmICh2aS5sQnV0dG9uRG93bikge1xyXG4gICAgLy8gICAgICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICAgICAgdmFsdWUub25MQnV0dG9uRG93bkFuZE1vdmUobmV3IFZpZXdlckV2ZW50KHZpLCBlKSk7XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICAvLyAgICB9XHJcblxyXG4gICAgLy8gICAgaWYgKHZpLm1CdXR0b25Eb3duKSB7XHJcbiAgICAvLyAgICAgICAgdmkub3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBPcGVyYXRvcikge1xyXG4gICAgLy8gICAgICAgICAgICB2YWx1ZS5vbk1CdXR0b25Eb3duQW5kTW92ZShuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgIH1cclxuXHJcbiAgICAvLyAgICBpZiAodmkuckJ1dHRvbkRvd24pIHtcclxuICAgIC8vICAgICAgICB2aS5vcGVyYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IE9wZXJhdG9yKSB7XHJcbiAgICAvLyAgICAgICAgICAgIHZhbHVlLm9uUkJ1dHRvbkRvd25BbmRNb3ZlKG5ldyBWaWV3ZXJFdmVudCh2aSwgZSkpO1xyXG4gICAgLy8gICAgICAgIH0pO1xyXG4gICAgLy8gICAgfVxyXG4gICAgLy99XHJcblxyXG4gICAgLy90aGlzLmNhbnZhcy5vbm1vdXNld2hlZWwgPSBmdW5jdGlvbiAoZTogV2hlZWxFdmVudCkge1xyXG4gICAgLy8gICAgdmkub3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBPcGVyYXRvcikge1xyXG4gICAgLy8gICAgICAgIHZhbHVlLm9uTW91c2VXaGVlbChuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgIH0pO1xyXG4gICAgLy99XHJcblxyXG4gICAgLy90aGlzLmNhbnZhcy5vbnRvdWNoc3RhcnQgPSBmdW5jdGlvbiAoZTogVG91Y2hFdmVudCkge1xyXG4gICAgLy8gICAgdmkudG91Y2hpbmcgPSB0cnVlO1xyXG5cclxuICAgIC8vICAgIHZpLm9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogT3BlcmF0b3IpIHtcclxuICAgIC8vICAgICAgICB2YWx1ZS5vblRvdWNoU3RhcnQobmV3IFZpZXdlckV2ZW50KHZpLCBlKSk7XHJcbiAgICAvLyAgICB9KTtcclxuICAgIC8vfVxyXG5cclxuICAgIC8vdGhpcy5jYW52YXMub250b3VjaG1vdmUgPSBmdW5jdGlvbiAoZTogVG91Y2hFdmVudCkge1xyXG4gICAgLy8gICAgdmkub3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBPcGVyYXRvcikge1xyXG4gICAgLy8gICAgICAgIHZhbHVlLm9uVG91Y2hNb3ZlKG5ldyBWaWV3ZXJFdmVudCh2aSwgZSkpO1xyXG4gICAgLy8gICAgfSk7XHJcbiAgICAvL31cclxuXHJcbiAgICAvL3RoaXMuY2FudmFzLm9udG91Y2hlbmQgPSBmdW5jdGlvbiAoZTogVG91Y2hFdmVudCkge1xyXG4gICAgLy8gICAgdmkudG91Y2hpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvLyAgICB2aS5vcGVyYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IE9wZXJhdG9yKSB7XHJcbiAgICAvLyAgICAgICAgdmFsdWUub25Ub3VjaEVuZChuZXcgVmlld2VyRXZlbnQodmksIGUpKTtcclxuICAgIC8vICAgIH0pO1xyXG4gICAgLy99XHJcblxyXG4gICAgLy90aGlzLmNhbnZhcy5vbnRvdWNoY2FuY2VsID0gZnVuY3Rpb24gKGU6IFRvdWNoRXZlbnQpIHtcclxuICAgIC8vICAgIHZpLnRvdWNoaW5nID0gZmFsc2U7XHJcblxyXG4gICAgLy8gICAgdmkub3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBPcGVyYXRvcikge1xyXG4gICAgLy8gICAgICAgIHZhbHVlLm9uVG91Y2hDYW5jZWwobmV3IFZpZXdlckV2ZW50KHZpLCBlKSk7XHJcbiAgICAvLyAgICB9KTtcclxuICAgIC8vfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLl9vblJlc2l6ZSk7XHJcbiAgICB0aGlzLnhockxpc3QuZm9yRWFjaCgoeGhyKSA9PiB7XHJcbiAgICAgIHhoci5hYm9ydCgpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmltYWdlVXJscyA9IHt9O1xyXG5cclxuICAgIC8vSlNfRmluYV9EYXRhYmFzZSgpO1xyXG4gICAgaWYgKHRoaXMuX3ZpZXdLZXkgIT0gLTEpIHtcclxuICAgICAgSlNfRGVsZXRlX0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgICAgdGhpcy5fdmlld0tleSA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9tb2RlbEtleSAhPSAtMSkge1xyXG4gICAgICBKU19EZWxldGVfQnlfS2V5KHRoaXMuX21vZGVsS2V5KTtcclxuICAgICAgdGhpcy5fbW9kZWxLZXkgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fc3R5bGVLZXkgIT0gLTEpIHtcclxuICAgICAgSlNfRGVsZXRlX0J5X0tleSh0aGlzLl9zdHlsZUtleSk7XHJcbiAgICAgIHRoaXMuX3N0eWxlS2V5ID0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zY2VuZUNhbWVyYUNoYW5nZWQuY2xlYXIoKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XHJcbiAgICB0aGlzLmNhbnZhcyA9IG51bGw7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmViaW5kKGNvbnRhaW5lcklkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY3JlYXRlVmlldyhjb250YWluZXJJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW5zdXJlTWVtb3J5U2l6ZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBhbGxvY2F0ZWRfc2l6ZSA9IEpTX1Nob3dfQWxsb2NhdGVkX01lbW9yeV9TaXplKCk7XHJcbiAgICB0aGlzLl9jdXJyZW50TWVtb3J5U2l6ZSA9IGFsbG9jYXRlZF9zaXplO1xyXG4gICAgaWYgKGFsbG9jYXRlZF9zaXplID4gMjE0NzQ4MzY0OCAqIHRoaXMubWF4TWVtb3J5RmFjdG9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVuc3VyZUN1cnJlbnRNZW1vcnlTaXplKCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJrZXlzOl9jdXJyZW50TWVtb3J5U2l6ZTpcIiwgdGhpcy5fY3VycmVudE1lbW9yeVNpemUpO1xyXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRNZW1vcnlTaXplID4gMjE0NzQ4MzY0OCAqIHRoaXMubWF4TWVtb3J5RmFjdG9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB2aWV3S2V5KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmlld0tleTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc2NlbmVLZXkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zY2VuZUtleTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbW9kZWxLZXkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlbEtleTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc3R5bGVLZXkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zdHlsZUtleTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNCdXN5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzQnVzeTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgaXNCdXN5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc0J1c3kgPSB2YWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5faXNCdXN5KSB7XHJcbiAgICAgIC8v5Lit5pat5pON5L2cLlxyXG4gICAgICAvL+Wwhuivt+axguaxoOS4reeahOi/kOihjOS4reivt+axguWJlOmZpC5cclxuICAgICAgLy8gdGhpcy5sb2FkaW5nTGlzdC5jbGVhcigpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImJ1c3ksY291bnQ6XCIsIHRoaXMubG9hZGluZ0xpc3QuY291bnQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgZ2V0IGJ1dHRvblVwSXNCdXN5KCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2J1dHRvblVwSXNCdXN5O1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHVibGljIHNldCBidXR0b25VcElzQnVzeSh2YWx1ZSkge1xyXG4gIC8vICAgdGhpcy5fYnV0dG9uVXBJc0J1c3kgPSB2YWx1ZTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNVcGRhdGVUdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1VwZGF0ZVR0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBpc1VwZGF0ZVR0KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc1VwZGF0ZVR0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGlzU2hhcmVkQXJyYXlCdWZmZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNTaGFyZWRBcnJheUJ1ZmZlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgaXNTaGFyZWRBcnJheUJ1ZmZlcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNTaGFyZWRBcnJheUJ1ZmZlciA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc0NhY2hlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzQ2FjaGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGlzQ2FjaGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzQ2FjaGUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdGVzdEdzbElkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rlc3RHc2xJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgdGVzdEdzbElkKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3Rlc3RHc2xJZCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB1cGRhdGVUeXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZVR5cGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHVwZGF0ZVR5cGUodmFsdWU6IFVwZGF0ZVR5cGUpIHtcclxuICAgIGlmIChcclxuICAgICAgdmFsdWUgPT0gVXBkYXRlVHlwZS5Bc3luY2hyb25pemF0aW9uICYmXHJcbiAgICAgIHRoaXMuX3VwZGF0ZVR5cGUgPT0gVXBkYXRlVHlwZS5TeW5jaHJvbml6YXRpb25cclxuICAgICkge1xyXG4gICAgICB0aGlzLl91cGRhdGVUeXBlID0gdmFsdWU7XHJcblxyXG4gICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcclxuICAgICAgLy8gbGV0IGRyYXcgPSAodGltZSkgPT4ge1xyXG4gICAgICAvLyAgIC8vIGNvbnNvbGUubG9nKFwiZHJhd1wiKVxyXG4gICAgICAvLyAgIC8vIGlmICghdGhpcy5faXNCdXN5ICYmIHRoaXMuX2FzeW5VcGRhdGVLZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gICAvLyAgICAgdGhpcy5fYXN5blVwZGF0ZUtleXMgPSBKU19TaG93X0FzeW5fTmVlZF9VcGRhdGVfS2V5cygpIGFzIEludDMyQXJyYXk7XHJcblxyXG4gICAgICAvLyAgIC8vICAgICBjb25zb2xlLmxvZyhcImtleXNcIiwgdGhpcy5fYXN5blVwZGF0ZUtleXMubGVuZ3RoKVxyXG4gICAgICAvLyAgIC8vICAgICBpZiAodGhpcy5fYXN5blVwZGF0ZUtleXMubGVuZ3RoID4gMCAmJiB0aGlzLl9wcmV2aW91c1VwZGF0ZUtleXNMZW5ndGggIT0gdGhpcy5fYXN5blVwZGF0ZUtleXMubGVuZ3RoKSB7XHJcbiAgICAgIC8vICAgLy8gICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2FzeW5VcGRhdGVLZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vICAgLy8gICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vICAgLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0J1c3kpIHtcclxuICAgICAgLy8gICAvLyAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XHJcbiAgICAgIC8vICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgIC8vICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgICAgLy8gICAvLyAgICAgICAgICAgICAgICAgSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnkodGhpcy5fYXN5blVwZGF0ZUtleXNbaV0sIG51bGwpO1xyXG5cclxuICAgICAgLy8gICAvLyAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgLy8gICAvLyAgICAgICAgICAgICAgICAgdGltZXIgPSBudWxsO1xyXG4gICAgICAvLyAgIC8vICAgICAgICAgICAgIH0sIGkgLyAxMDApO1xyXG4gICAgICAvLyAgIC8vICAgICAgICAgfVxyXG4gICAgICAvLyAgIC8vICAgICB9XHJcbiAgICAgIC8vICAgLy8gfVxyXG5cclxuICAgICAgLy8gICAvLyBpZiAodGhpcy5faXNCdXN5IHx8IHRoaXMuX2FzeW5VcGRhdGVLZXlzLmxlbmd0aCA9PSAwIHx8IHRoaXMuX3ByZXZpb3VzVXBkYXRlS2V5c0xlbmd0aCAhPSB0aGlzLl9hc3luVXBkYXRlS2V5cy5sZW5ndGgpXHJcbiAgICAgIC8vICAgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcblxyXG4gICAgICAvLyAgIC8vIHRoaXMuX3ByZXZpb3VzVXBkYXRlS2V5c0xlbmd0aCA9IHRoaXMuX2FzeW5VcGRhdGVLZXlzLmxlbmd0aDtcclxuXHJcbiAgICAgIC8vICAgaWYgKHRoaXMuX3J1bm5pbmcpIHtcclxuICAgICAgLy8gICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShkcmF3KTtcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH07XHJcbiAgICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZShkcmF3KTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHZhbHVlID09IFVwZGF0ZVR5cGUuU3luY2hyb25pemF0aW9uICYmXHJcbiAgICAgIHRoaXMuX3VwZGF0ZVR5cGUgPT0gVXBkYXRlVHlwZS5Bc3luY2hyb25pemF0aW9uXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5fdXBkYXRlVHlwZSA9IHZhbHVlO1xyXG5cclxuICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIOWGheWtmOmZkOWItiAqL1xyXG4gIHB1YmxpYyBnZXQgZHluYW1pY01lbW9yeSgpOiBEeW5hbWljTWVtb3J5VHlwZSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gRHluYW1pY01lbW9yeVR5cGUuTm9uZTtcclxuXHJcbiAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAge1xyXG4gICAgICBsZXQgZG0gPSBKU19TaG93X09uZV9SZW5kZXJpbmdfT3B0aW9uKFwiZHluYW1pYyBtZW1vcnlcIik7XHJcbiAgICAgIGlmIChkbSA9PSBcImNsaWVudFwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gRHluYW1pY01lbW9yeVR5cGUuQ2xpZW50O1xyXG4gICAgICB9IGVsc2UgaWYgKGRtID09IFwic2VydmVyXCIpIHtcclxuICAgICAgICByZXN1bHQgPSBEeW5hbWljTWVtb3J5VHlwZS5TZXJ2ZXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0ID0gRHluYW1pY01lbW9yeVR5cGUuTm9uZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKiog6K6+572u5YaF5a2Y6ZmQ5Yi2ICovXHJcbiAgcHVibGljIHNldCBkeW5hbWljTWVtb3J5KHR5cGU6IER5bmFtaWNNZW1vcnlUeXBlKSB7XHJcbiAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAge1xyXG4gICAgICBKU19TZXRfUmVuZGVyaW5nX09wdGlvbnMoXHJcbiAgICAgICAgXCJkeW5hbWljIG1lbW9yeT1cIiArIER5bmFtaWNNZW1vcnlUeXBlW3R5cGVdLnRvTG93ZXJDYXNlKClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICB9XHJcblxyXG4gIC8qKiDlhoXlrZjpmZDliLbpmIjlgLwgKi9cclxuICBwdWJsaWMgZ2V0IGR5bmFtaWNNZW1vcnlUaHJlc2hvbGQoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQgPSAwLjA7XHJcblxyXG4gICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgIHtcclxuICAgICAgbGV0IGRtID0gSlNfU2hvd19PbmVfUmVuZGVyaW5nX09wdGlvbihcImR5bmFtaWMgbWVtb3J5IHRocmVzaG9sZFwiKTtcclxuICAgICAgaWYgKGRtKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcGFyc2VGbG9hdChkbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqIOiuvue9ruWGheWtmOmZkOWItumYiOWAvCAqL1xyXG4gIHB1YmxpYyBzZXQgZHluYW1pY01lbW9yeVRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAge1xyXG4gICAgICBKU19TZXRfUmVuZGVyaW5nX09wdGlvbnMoXCJkeW5hbWljIG1lbW9yeSB0aHJlc2hvbGQ9XCIgKyB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGxpZ2h0aW5nTW9kZSgpOiBMaWdodGluZ01vZGUge1xyXG4gICAgbGV0IHJlc3VsdCA9IExpZ2h0aW5nTW9kZS5Ob25lO1xyXG4gICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgIHtcclxuICAgICAgbGV0IG5hbWUgPSBKU19TaG93X09uZV9TaGFkZXIoXCJuYW1lXCIpO1xyXG4gICAgICBpZiAobmFtZSA9PSBcInBob25nXCIpIHtcclxuICAgICAgICByZXN1bHQgPSBMaWdodGluZ01vZGUuUGhvbmc7XHJcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBcImJsaW5uIHBob25nXCIpIHtcclxuICAgICAgICByZXN1bHQgPSBMaWdodGluZ01vZGUuQmxpbm5QaG9uZztcclxuICAgICAgfSBlbHNlIGlmIChuYW1lID09IFwibGFtYmVydFwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gTGlnaHRpbmdNb2RlLkxhbWJlcnQ7XHJcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBcImhhbGYgbGFtYmVydFwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gTGlnaHRpbmdNb2RlLkhhbGZMYW1iZXJ0O1xyXG4gICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gXCJiYW5kZWRcIikge1xyXG4gICAgICAgIHJlc3VsdCA9IExpZ2h0aW5nTW9kZS5CYW5kZWQ7XHJcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBcInBiclwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gTGlnaHRpbmdNb2RlLlBCUjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGxpZ2h0aW5nTW9kZShtb2RlOiBMaWdodGluZ01vZGUpIHtcclxuICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgICB7XHJcbiAgICAgIGlmIChtb2RlID09IExpZ2h0aW5nTW9kZS5QaG9uZykge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gcGhvbmdcIik7XHJcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBMaWdodGluZ01vZGUuQmxpbm5QaG9uZykge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gYmxpbm4gcGhvbmdcIik7XHJcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBMaWdodGluZ01vZGUuTGFtYmVydCkge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gbGFtYmVydFwiKTtcclxuICAgICAgfSBlbHNlIGlmIChtb2RlID09IExpZ2h0aW5nTW9kZS5IYWxmTGFtYmVydCkge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gaGFsZiBsYW1iZXJ0XCIpO1xyXG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTGlnaHRpbmdNb2RlLkJhbmRlZCkge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gYmFuZGVkXCIpO1xyXG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTGlnaHRpbmdNb2RlLlBCUikge1xyXG4gICAgICAgIEpTX1NldF9TaGFkZXIoXCJuYW1lID0gcGJyXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgfVxyXG5cclxuICBhc3luVVBHRFRhc2tSdW4oKSB7XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHRfU3RhcnRcIik7XHJcbiAgICAvL+eQhuiuuuS4iuaJp+ihjOWIsOi/memHjOeahOS7o+eggSx0aHJlYWRVUEdESXNSdW5uaW5n5LiN5Lya5Li6dHJ1ZS5cclxuICAgIC8vIGlmICghdGhpcy5fdGhyZWFkVVBHRElzUnVubmluZykge1xyXG4gICAgSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXlfVHQodGhpcy52aWV3S2V5LCAtMSk7XHJcbiAgICB0aGlzLl90aHJlYWRVUEdESXNSdW5uaW5nID0gdHJ1ZTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIC8vIGFzeW5VUEdEVGFza1J1bigpIHtcclxuICAvLyAgIC8vIGNvbnNvbGUubG9nKFwicnVuOlwiLCB0aGlzLlVQR0RUYXNrTGlzdC5sZW5ndGgpO1xyXG4gIC8vICAgaWYgKHRoaXMuX1VQR0RUYXNrTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgIC8v55CG6K665LiK5omn6KGM5Yiw6L+Z6YeM55qE5Luj56CBLHRocmVhZFVQR0RJc1J1bm5pbmfkuI3kvJrkuLp0cnVlLlxyXG4gIC8vICAgICAvLyBpZiAoIXRoaXMuX3RocmVhZFVQR0RJc1J1bm5pbmcpIHtcclxuICAvLyAgICAgaWYgKCF0aGlzLnRocmVhZElzUnVubmluZykge1xyXG4gIC8vICAgICAgIGNvbnNvbGUubG9nKFwiSlNfQXN5bl9VcGRhdGVfUGFydGlhbF9HZW9tZXRyeV9EYXRhX0J5X0tleV9UdF9TdGFydFwiKTtcclxuICAvLyAgICAgICAvLyBsZXQgbW9kZWxTZWdtZW50S2V5ID0gdGhpcy5fVVBHRFRhc2tMaXN0LnNwbGljZSgwLCAxKTtcclxuICAvLyAgICAgICAvLyBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleV9UdChcclxuICAvLyAgICAgICAvLyAgIHRoaXMudmlld0tleSxcclxuICAvLyAgICAgICAvLyAgIG1vZGVsU2VnbWVudEtleVswXVxyXG4gIC8vICAgICAgIC8vICk7XHJcblxyXG4gIC8vICAgICAgIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0KHRoaXMudmlld0tleSwgLTEpO1xyXG4gIC8vICAgICAgIHRoaXMuX3RocmVhZFVQR0RJc1J1bm5pbmcgPSB0cnVlO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgbWFrZUNvbnRleHRDdXJyZW50KCkge1xyXG4gICAgSlNfTWFrZV9Db250ZXh0X0N1cnJlbnQodGhpcy5fdmlld0tleSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVidWdMb2cobWVzOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLm1vZGVsRGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2cobWVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEaXNwbGF5U3luY2VkKCkge1xyXG4gICAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGlzcGxheSgpOiBUaHJlYWRQcm9taXNlPFVwZGF0ZUluZm8+IHtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwidXBkYXRlXCIpO1xyXG4gICAgaWYgKHRoaXMuX3VwZGF0ZVR5cGUgPT0gVXBkYXRlVHlwZS5TeW5jaHJvbml6YXRpb24pIHtcclxuICAgICAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcblxyXG4gICAgICByZXR1cm4gbmV3IFRocmVhZFByb21pc2U8VXBkYXRlSW5mbz4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICByZXNvbHZlKG5ldyBVcGRhdGVJbmZvKHRoaXMsIFVwZGF0ZURpc3BsYXlUeXBlLlN5bmNocm9uaXphdGlvbikpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGxldCBuZWVkQXN5blVwZGF0ZSA9IEpTX0FzeW5fTmVlZF9VcGRhdGVfVmlld19CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgICAgIC8vIGlmIChuZWVkQXN5blVwZGF0ZSkge1xyXG4gICAgICAvLyAgIHRoaXMuZGVidWdMb2coXCJuZWVkQXN5blVwZGF0ZVwiKTtcclxuICAgICAgLy8gICB0aGlzLmFzeW5VcGRhdGVWaWV3KCk7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5pc0J1c3kpIHtcclxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwibm90IGJ1c3lcIik7XHJcbiAgICAgICAgSlNfQXN5bl9VcGRhdGVfQ2FtZXJhX0J5X0tleSh0aGlzLnZpZXdLZXkpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlclZpZXdBbGwpIHtcclxuICAgICAgICAgIEpTX0FzeW5fUmVuZGVyX1ZpZXdfQnlfS2V5KHRoaXMuX3ZpZXdLZXksIGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMucmVuZGVyVmlld0FsbCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGxpZ2h0TW9kZWxzID0gbnVsbDtcclxuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5wcm9jZXNzKSB7XHJcbiAgICAgICAgICAvLyBsaWdodE1vZGVscyA9ICh0aGlzIGFzIGFueSkucHJvY2Vzcy5maW5kUmVuZGVyT2JqZWN0c0J5VHlwZShcclxuICAgICAgICAgIC8vICAgXCJMaWdodE1vZGVsXCJcclxuICAgICAgICAgIC8vICk7XHJcbiAgICAgICAgICBsaWdodE1vZGVscyA9ICh0aGlzIGFzIGFueSkucHJvY2Vzcy5maW5kTW9kZWxSZW5kZXJPYmplY3RzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaWdodE1vZGVscykge1xyXG4gICAgICAgICAgaWYgKGxpZ2h0TW9kZWxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmRlYnVnTG9nKFwibGlndGhNb2RlbHMgbGVuZ3RoID0gMFwiKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL+W8gOWQr+S6huWkmue6v+eoiy5cclxuICAgICAgICAgIGlmICh0aGlzLl9pc1VwZGF0ZVR0KSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAhdGhpcy5fdGhyZWFkVVBHRElzUnVubmluZyAmJlxyXG4gICAgICAgICAgICAgIHRoaXMuc3RyZWFtVG9TZWdtZW50UnVubmluZ0NvdW50ID09PSAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHRoaXMuYXN5blVQR0RUYXNrUnVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0RhdGFfQnlfS2V5KHRoaXMudmlld0tleSk7XHJcbiAgICAgICAgICAgIC8v5Y+q6I635Y+W5Y2V5LiqbGlnaHRNb2RlbOeahOW8guatpeaVsOaNrlxyXG4gICAgICAgICAgICBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleSh0aGlzLnZpZXdLZXksIC0xKTtcclxuXHJcbiAgICAgICAgICAgIC8v6L+Y5pyq5Yqg6L295Yeg5L2V55qEc2VnbWVudOWIl+ihqFxyXG4gICAgICAgICAgICBsZXQgYXN5bktleXM6IEludDMyQXJyYXkgPSBKU19TaG93X0FzeW5fR2VvbWV0cnlfRGF0YV9LZXlzKFxyXG4gICAgICAgICAgICAgIHRoaXMuX3ZpZXdLZXlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5hc3luTG9hZEdlb21ldHJpZXMoYXN5bktleXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFzeW5LZXlzLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcImFzeW5LZXlzLmxlbmd0aCA9IDBcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXN5blJlbW92ZUdlb21ldHJ5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJsaWdodE1vZGVscyBpcyBudWxsXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5aaC5p6cc2VnbWVudOe7k+aehOacieabtOaWsO+8jOWImeebtOaOpeaJp+ihjGNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzXHJcbiAgICAgICAgLy8g5rOoOueOsOWcqOeUseS6juS4gOS6m+WOn+WboO+8jG5lZWRBc3luVXBkYXRl55qE5YC85b+F54S25Li6ZmFsc2UuXHJcbiAgICAgICAgLy8gaWYgKCFuZWVkQXN5blVwZGF0ZSkge1xyXG4gICAgICAgIGxldCBwcm9taXNlID0gbmV3IFRocmVhZFByb21pc2U8VXBkYXRlSW5mbz4oKTtcclxuICAgICAgICB0aGlzLmNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzKGZhbHNlLCBwcm9taXNlKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIGlmICghbmVlZEFzeW5VcGRhdGUgfHwgIXRoaXMuX2lzVXBkYXRlVHQpIHtcclxuICAgICAgICAvLyAgIHRoaXMuY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXMoKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcImJ1c3lcIik7XHJcbiAgICAgICAgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkodGhpcy5fdmlld0tleSwgdGhpcy5pc0ZpeEZyYW1lUmVuZGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaHJlYWRQcm9taXNlPFVwZGF0ZUluZm8+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKG5ldyBVcGRhdGVJbmZvKHRoaXMsIFVwZGF0ZURpc3BsYXlUeXBlLkJ1c3kpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5blJlbW92ZUdlb21ldHJ5KCkge1xyXG4gICAgKCh0aGlzIGFzIGFueSkuYXlzblRhc2tNYW5hZ2VyIGFzIEF5c25UYXNrTWFuYWdlcikuY2xlYXJUYXNrKDMpO1xyXG5cclxuICAgIGxldCByZW1vdmVLZXlzOiBJbnQzMkFycmF5ID0gSlNfU2hvd19Bc3luX1JlbW92ZV9HZW9tZXRyeV9EYXRhX0tleXMoXHJcbiAgICAgIHRoaXMuX3ZpZXdLZXlcclxuICAgICk7XHJcbiAgICBsZXQgY291bnQgPSByZW1vdmVLZXlzLmxlbmd0aDtcclxuICAgIGxldCBwZXJHcm91cExlbmd0aCA9IDEwMDA7XHJcbiAgICBsZXQgZ3JvdXBDb3VudCA9IDA7XHJcbiAgICBsZXQgZ3JvdXAgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7XHJcbiAgICAgIGdyb3VwQ291bnQrKztcclxuICAgICAgZ3JvdXAucHVzaChyZW1vdmVLZXlzW2pdKTtcclxuICAgICAgaWYgKGdyb3VwQ291bnQgPT09IHBlckdyb3VwTGVuZ3RoIHx8IGogPT09IGNvdW50IC0gMSkge1xyXG4gICAgICAgIGxldCBjb3B5R3JvdXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwKSk7XHJcbiAgICAgICAgZ3JvdXBDb3VudCA9IDA7XHJcbiAgICAgICAgZ3JvdXAgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG5cclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiY2xlYXJfR2VvbWV0cnlcIik7XHJcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjb3B5R3JvdXAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkoY29weUdyb3VwW2ldKTtcclxuICAgICAgICAvLyAgIHtcclxuICAgICAgICAvLyAgICAgSlNfQ2xlYXJfR2VvbWV0cnkoKTtcclxuICAgICAgICAvLyAgICAgLy8gSlNfU2V0X0hldXJpc3RpY19PcHRpb25zKFwiYXN5biBnZW9tZXRyeT1vblwiKTtcclxuICAgICAgICAvLyAgICAgSlNfU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uKFwiYXN5biBnZW9tZXRyeVwiLCBcIm9uXCIpO1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy/liKDpmaTlh6DkvZXnmoTlvILmraXku7vliqHkvJjlhYjnuqfkuLozLOS8mOWFiOS6juWIm+W7unZhby5cclxuICAgICAgICAoKHRoaXMgYXMgYW55KS5heXNuVGFza01hbmFnZXIgYXMgQXlzblRhc2tNYW5hZ2VyKS5hc3luVGFzayhcclxuICAgICAgICAgIGFzeW5jIChrZXlMaXN0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQnVzeSB8fCB0aGlzLnRocmVhZElzUnVubmluZykge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJidXN55oiWaXNSdW5uaW5nLHJlbmRlcuW7tuWQjlwiKTtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjbGVhcl9HZW9tZXRyeTogXCIsIGtleUxpc3QubGVuZ3RoKTtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleUxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkoa2V5TGlzdFtpXSk7XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIEpTX0NsZWFyX0dlb21ldHJ5KCk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIEpTX1NldF9IZXVyaXN0aWNfT3B0aW9ucyhcImFzeW4gZ2VvbWV0cnk9b25cIik7XHJcbiAgICAgICAgICAgICAgICAgIEpTX1NldF9PbmVfSGV1cmlzdGljX09wdGlvbihcImFzeW4gZ2VvbWV0cnlcIiwgXCJvblwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgW2NvcHlHcm91cF0sXHJcbiAgICAgICAgICAzXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5bCGa2V55YiX6KGo5oyJ5oyJ5q+P5LiqTGlnaHRNb2Vs6L+b6KGM5YiS5YiGXHJcbiAgICogQHBhcmFtIGFzeW5LZXlzXHJcbiAgICovXHJcbiAgZ3JvdXBpbmdBc3luS2V5c09mRWFjaExpZ2h0TW9kZWwoXHJcbiAgICBhc3luS2V5czogSW50MzJBcnJheSxcclxuICAgIGlkTWFwS2V5czogeyBbaWQ6IHN0cmluZ106IG51bWJlcltdIH1cclxuICApIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXN5bktleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGtleSA9IGFzeW5LZXlzW2ldO1xyXG5cclxuICAgICAgbGV0IG1vZGVsSWQgPSBKU19TaG93X0tleV9UYWcoa2V5KTtcclxuXHJcbiAgICAgIGxldCBhcnJheSA9IGlkTWFwS2V5c1ttb2RlbElkXTtcclxuICAgICAgaWYgKCFhcnJheSkge1xyXG4gICAgICAgIGFycmF5ID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgICAgfVxyXG4gICAgICBhcnJheS5wdXNoKGtleSk7XHJcblxyXG4gICAgICBpZE1hcEtleXNbbW9kZWxJZF0gPSBhcnJheTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luVXBkYXRlVmlldygpIHtcclxuICAgIC8vIEpTX0FzeW5fVXBkYXRlX0NhbWVyYV9CeV9LZXkodGhpcy52aWV3S2V5KTtcclxuICAgIEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG5cclxuICAgIC8vIHRoaXMudW5CdWZmZXJBbmRCdWZmZXJHZW9tZXRyaWVzKCk7XHJcbiAgfVxyXG5cclxuICAvLy9ncm91cElkc0xpc3QtLS1pZOWIl+ihqOeahOWtl+espuS4sueahOaVsOe7hFxyXG4gIC8vL2dyb3VwSWRzLS0taWTliJfooajnmoTlrZfnrKbkuLIs55SoJywn5YiG5YmyXHJcbiAgLy8vZGljdGlvbmFyeS0tLWlk5ZKMc2VnbWVudEtleeeahOaYoOWwhOihqFxyXG4gIHByaXZhdGUgYXN5bkJhdGNoU2V0U2VnbWVudHNEYXRhKFxyXG4gICAgbW9kZWxJZDogc3RyaW5nLFxyXG4gICAgZ3JvdXBJZHNMaXN0OiBzdHJpbmdbXSxcclxuICAgIHZlcnNpb246IG51bWJlcixcclxuICAgIGRpY3Rpb25hcnk6IHsgW2lkOiBzdHJpbmddOiBudW1iZXIgfVxyXG4gICkge1xyXG4gICAgbGV0IHRva2VuID0gZ2V0Q29va2llKFwiR3NUb2tlblwiKTtcclxuICAgIGlmICghdG9rZW4pIHtcclxuICAgICAgLy8gY29uc29sZS53YXJuKFwi6K+35rGC5pyq5pC65bimVG9rZW7vvIHvvIHvvIFcIilcclxuICAgIH1cclxuXHJcbiAgICAvL+avj+S4quWIhue7hOaJuemHj+ivt+axgi5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBJZHNMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLmdldEFzeW5Hcm91cEdlb0RhdGFBY3Rpb24pIHtcclxuICAgICAgICBsZXQgYWN0aW9uID0gdGhpcy5nZXRBc3luR3JvdXBHZW9EYXRhQWN0aW9uKG1vZGVsSWQsIHZlcnNpb24pO1xyXG5cclxuICAgICAgICBsZXQgeGhyOiBYTUxIdHRwUmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIHRoaXMueGhyTGlzdC5hZGQoeGhyKTtcclxuICAgICAgICAvLyBsZXQgdXJsID0gYWN0aW9uLnVybCArIGdyb3Vwc1tpXTtcclxuICAgICAgICB4aHIub3BlbihhY3Rpb24uaHR0cFR5cGUsIGFjdGlvbi51cmwsIHRydWUpO1xyXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcclxuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJibG9iXCI7XHJcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIiwgXCIqXCIpO1xyXG4gICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIHRva2VuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMueGhyTGlzdC5yZW1vdmUoeGhyKTtcclxuXHJcbiAgICAgICAgICBpZiAoeGhyLnN0YXR1cy50b1N0cmluZygpLnNsaWNlKDAsIDEpID09PSBcIjJcIikge1xyXG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKHhoci5yZXNwb25zZSk7XHJcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlLnRhcmdldFtcInJlYWR5U3RhdGVcIl0gPT0gRmlsZVJlYWRlci5ET05FKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmxvYkRhdGEgPSBlLnRhcmdldFtcInJlc3VsdFwiXTtcclxuICAgICAgICAgICAgICAgIGxldCBkZWNvZGluZ09iamVjdDogRGVjb2RpbmdPYmplY3QgPSB7XHJcbiAgICAgICAgICAgICAgICAgIG1vZGVsSWQsXHJcbiAgICAgICAgICAgICAgICAgIHZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGJsb2JEYXRhLFxyXG4gICAgICAgICAgICAgICAgICBncm91cElkczogZ3JvdXBJZHNMaXN0W2ldLFxyXG4gICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RlY29kaW5nT2JqZWN0TGlzdC5wdXNoKGRlY29kaW5nT2JqZWN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnTG9nKFwiZGVjb2RlTW5nOlwiICsgdGhpcy5fZGVjb2RlTWFuYWdlcklzUnVubmluZyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RlY29kZU1hbmFnZXJJc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5kZWNvZGVNbmdSdW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuivt+axguWIhue7hOWHoOS9leWksei0pTpcIiwgeGhyLnJlc3BvbnNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHhoci5vbmVycm9yID0gKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJlcnJvclwiLCBlcnIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBzdHJBcnJheSA9IGdyb3VwSWRzTGlzdFtpXS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgeGhyLnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBpZHM6IHN0ckFycmF5IH0pKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiVmlld2VyLmdldEFzeW5Hcm91cEdlb0RhdGFBY3Rpb24g5pyq5a6a5LmJXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL+WTquS6m+WHoOS9leimgemHjeaWsOabtOaWsFxyXG4gIHByb3RlY3RlZCBjb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllcyhcclxuICAgIGlzU3RyZWFtVG9HZW9tZXRyeTogYm9vbGVhbixcclxuICAgIHByb21pc2U6IFRocmVhZFByb21pc2U8VXBkYXRlSW5mbz5cclxuICApIHtcclxuICAgIC8vIOWPquimgeaJp+ihjOS6hmNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVz77yM5bCx5riF56m6Y29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZC5cclxuICAgIHRoaXMuY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzIHN0YXJ0XCIpO1xyXG4gICAgaWYgKCF0aGlzLmlzQnVzeSkge1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXMgbm90IGJ1c3lcIik7XHJcbiAgICAgIGlmICh0aGlzLl9pc1VwZGF0ZVR0KSB7XHJcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcImNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzIHVwZGF0ZVR0XCIpO1xyXG5cclxuICAgICAgICBsZXQgdmlld2VyID0gdGhpcztcclxuICAgICAgICBpZiAoIXRoaXMuX3RocmVhZFVQVklzUnVubmluZyAmJiAhdGhpcy5fdGhyZWFkVVBWSXNQcmVwYXJpbmcpIHtcclxuICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHZpZXdlci5zdHJlYW1Ub1NlZ21lbnRSdW5uaW5nQ291bnQgPT09IDAgJiZcclxuICAgICAgICAgICAgICB2aWV3ZXIuX3RocmVhZFNUR0RJc1J1bm5pbmdDb3VudCA9PT0gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBpZiAoIXZpZXdlci5fdGhyZWFkVVBWSXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB2aWV3ZXIuX3RocmVhZFByb21pc2UgPSBwcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgdmlld2VyLmRlYnVnTG9nKFwiSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHRfU3RhcnRcIik7XHJcbiAgICAgICAgICAgICAgICBKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdCh2aWV3ZXIudmlld0tleSk7XHJcbiAgICAgICAgICAgICAgICB2aWV3ZXIuX3RocmVhZFVQVklzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZpZXdlci5fdGhyZWFkVVBWSXNBZ2FpbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgICAgdmlld2VyLl90aHJlYWRVUFZJc1ByZXBhcmluZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiAoXHJcbiAgICAgICAgLy8gICAhdGhpcy5fdGhyZWFkVVBWSXNSdW5uaW5nICYmXHJcbiAgICAgICAgLy8gICB0aGlzLnN0cmVhbVRvU2VnbWVudFJ1bm5pbmdDb3VudCA9PT0gMCAmJlxyXG4gICAgICAgIC8vICAgdGhpcy5fdGhyZWFkU1RHRElzUnVubmluZ0NvdW50ID09PSAwXHJcbiAgICAgICAgLy8gKSB7XHJcbiAgICAgICAgLy8gICB0aGlzLl90aHJlYWRQcm9taXNlID0gcHJvbWlzZTtcclxuICAgICAgICAvLyAgIHRoaXMuZGVidWdMb2coXCJKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdF9TdGFydFwiKTtcclxuICAgICAgICAvLyAgIEpTX0FzeW5fVXBkYXRlX1ZpZXdfQnlfS2V5X1R0KHRoaXMudmlld0tleSk7XHJcbiAgICAgICAgLy8gICB0aGlzLl90aHJlYWRVUFZJc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAvLyDmoIfor4ZKU19Bc3luX1VwZGF0ZV9WaWV3X0J5X0tleV9UdOe7k+adn+WQjumcgOimgeWGjeaJp+ihjOS4gOasoS5cclxuICAgICAgICAvLyAgIHRoaXMuX3RocmVhZFVQVklzQWdhaW4gPSB0cnVlO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXMgbm90IHVwZGF0ZVR0XCIpO1xyXG5cclxuICAgICAgICAvLyBKU19Bc3luX1VwZGF0ZV9DYW1lcmFfQnlfS2V5KHRoaXMudmlld0tleSk7XHJcbiAgICAgICAgSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXkodGhpcy52aWV3S2V5KTsgLy9jYW1lcmHov4fmu6Qs56a75pWj5Y+C5pWw5YyW5Yeg5L2VLOiuoeeul+WTquS6m3Zhb+imgeWIm+W7ulxyXG5cclxuICAgICAgICB0aGlzLnVuQnVmZmVyQW5kQnVmZmVyR2VvbWV0cmllcyhpc1N0cmVhbVRvR2VvbWV0cnksIHByb21pc2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5Yig6Zmk6KaB5Yig6Zmk55qEdmFvLOa3u+WKoOimgea3u+WKoOeahHZhby5cclxuICB1bkJ1ZmZlckFuZEJ1ZmZlckdlb21ldHJpZXMoXHJcbiAgICBpc1N0cmVhbVRvR2VvbWV0cnk6IGJvb2xlYW4sXHJcbiAgICBwcm9taXNlOiBUaHJlYWRQcm9taXNlPFVwZGF0ZUluZm8+LFxyXG4gICAgaXNUaHJlYWQ6IGJvb2xlYW5cclxuICApIHtcclxuICAgIGxldCB1bmJ1ZmZlckdlb21LZXlzOiBudW1iZXJbXSA9IEpTX1Nob3dfQXN5bl9VbmJ1ZmZlcl9HZW9tZXRyeV9LZXlzKFxyXG4gICAgICB0aGlzLnZpZXdLZXlcclxuICAgICk7IC8v5pi+56S66KaB5Yig6ZmkdmFv55qE5Yeg5L2Va2V5XHJcbiAgICBsZXQgZmlsdGVyZWRHZW9tS2V5c1VuYnVmZmVyID1cclxuICAgICAgdGhpcy5maWx0ZXJSZXBlYXRLZXlzVW5idWZmZXIodW5idWZmZXJHZW9tS2V5cyk7XHJcbiAgICBKU19Bc3luX1VuYnVmZmVyX0dlb21ldHJ5X0J5X0tleSh0aGlzLnZpZXdLZXksIGZpbHRlcmVkR2VvbUtleXNVbmJ1ZmZlcik7XHJcbiAgICAvL3Nob3dlZFZhb0xpc3RCdWZmZXLmuIXpmaTlr7nlupTnmoRrZXlcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyZWRHZW9tS2V5c1VuYnVmZmVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBrZXkgPSBmaWx0ZXJlZEdlb21LZXlzVW5idWZmZXJbaV07XHJcbiAgICAgIC8vIGRlbGV0ZSB0aGlzLl9zaG93ZWRWYW9MaXN0VW5idWZmZXJba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZ2VvbUtleXM6IG51bWJlcltdID0gSlNfU2hvd19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9LZXlzKHRoaXMuX3ZpZXdLZXkpOyAvL+aYvuekuuimgeWIm+W7unZhb+eahOWHoOS9lWtleVxyXG4gICAgbGV0IGZpbHRlcmVkR2VvbUtleXMgPSB0aGlzLmZpbHRlclJlcGVhdEtleXNCdWZmZXIoZ2VvbUtleXMpO1xyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImZpbHRlcmVkR2VvbUtleXM6XCIgKyBmaWx0ZXJlZEdlb21LZXlzLmxlbmd0aCk7XHJcbiAgICB0aGlzLmNyZWF0ZUFuZERyYXdWYW8oXHJcbiAgICAgIGZpbHRlcmVkR2VvbUtleXMsXHJcbiAgICAgIGlzU3RyZWFtVG9HZW9tZXRyeSxcclxuICAgICAgcHJvbWlzZSxcclxuICAgICAgaXNUaHJlYWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvL+WIm+W7uuW5tue7mOWItnZhby5cclxuICBwcml2YXRlIGNyZWF0ZUFuZERyYXdWYW8oXHJcbiAgICBnZW9tS2V5czogbnVtYmVyW10sXHJcbiAgICBpc1N0cmVhbVRvR2VvbWV0cnk6IGJvb2xlYW4sXHJcbiAgICBwcm9taXNlOiBUaHJlYWRQcm9taXNlPFVwZGF0ZUluZm8+LFxyXG4gICAgaXNUaHJlYWQ6IGJvb2xlYW5cclxuICApIHtcclxuICAgIGlmIChpc1N0cmVhbVRvR2VvbWV0cnkpIHtcclxuICAgICAgKCh0aGlzIGFzIGFueSkuYXlzblRhc2tNYW5hZ2VyIGFzIEF5c25UYXNrTWFuYWdlcikuY2xlYXJUYXNrKDIpO1xyXG4gICAgICB0aGlzLmJ1ZmZlcmluZ0dlb21ldHJ5Q291bnQgPSAwO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImNsZWFyIFRhc2tcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idWZmZXJpbmdHZW9tZXRyeUNvdW50ICs9IGdlb21LZXlzLmxlbmd0aDtcclxuICAgIGNvbnNvbGUubG9nKFwiYnVmZmVyaW5nR2VvbWV0cnlDb3VudDpcIiwgdGhpcy5idWZmZXJpbmdHZW9tZXRyeUNvdW50KTtcclxuXHJcbiAgICBsZXQgY291bnQgPSBnZW9tS2V5cy5sZW5ndGg7XHJcblxyXG4gICAgbGV0IGdyb3VwQ291bnQgPSAwO1xyXG4gICAgbGV0IGdyb3VwID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnQ7IGorKykge1xyXG4gICAgICBncm91cENvdW50Kys7XHJcbiAgICAgIGdyb3VwLnB1c2goZ2VvbUtleXNbal0pO1xyXG4gICAgICBpZiAoZ3JvdXBDb3VudCA9PT0gdGhpcy5fcmVuZGVyVmlld1Blckdyb3VwIHx8IGogPT09IGNvdW50IC0gMSkge1xyXG4gICAgICAgIGxldCBjb3B5R3JvdXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwKSk7XHJcbiAgICAgICAgZ3JvdXBDb3VudCA9IDA7XHJcbiAgICAgICAgZ3JvdXAgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG5cclxuICAgICAgICB0aGlzLl9idWZmZXJLZXlDb3VudCArPSBjb3B5R3JvdXAubGVuZ3RoO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiX2J1ZmZlcktleUNvdW50OlwiLCB0aGlzLl9idWZmZXJLZXlDb3VudCk7XHJcblxyXG4gICAgICAgIC8vIGlmICh0aGlzLmlzVXBkYXRlVHQpIHtcclxuICAgICAgICBpZiAoZmFsc2UpIHtcclxuICAgICAgICAgIHRoaXMuX2J1ZmZlclZhb05vKys7XHJcbiAgICAgICAgICB0aGlzLl9idWZmZXJWYW9MaXN0TWFwTm9bdGhpcy5fYnVmZmVyVmFvTm9dID0gY29weUdyb3VwO1xyXG4gICAgICAgICAgSlNfQXN5bl9CdWZmZXJfR2VvbWV0cnlfQnlfS2V5X1R0KFxyXG4gICAgICAgICAgICB0aGlzLnZpZXdLZXksXHJcbiAgICAgICAgICAgIGNvcHlHcm91cCxcclxuICAgICAgICAgICAgdGhpcy5fYnVmZmVyVmFvTm9cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8v5Yib5bu6dmFv5Y+K57uY5Yi255qE5byC5q2l5Lu75Yqh5LyY5YWI57qn5Li6MlxyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZGQgVGFza1wiKTtcclxuXHJcbiAgICAgICAgICBsZXQgdXBkYXRlSW5mbyA9IG5ldyBVcGRhdGVJbmZvKFxyXG4gICAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgICBpc1RocmVhZFxyXG4gICAgICAgICAgICAgID8gVXBkYXRlRGlzcGxheVR5cGUuQXN5blRocmVhZEJ1ZmZlckdlb21ldHJ5XHJcbiAgICAgICAgICAgICAgOiBVcGRhdGVEaXNwbGF5VHlwZS5Bc3luQnVmZmVyR2VvbWV0cnlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjb3B5R3JvdXA6XCIsIGNvcHlHcm91cC5sZW5ndGgpO1xyXG4gICAgICAgICAgKCh0aGlzIGFzIGFueSkuYXlzblRhc2tNYW5hZ2VyIGFzIEF5c25UYXNrTWFuYWdlcikuYXN5blRhc2soXHJcbiAgICAgICAgICAgIGFzeW5jICh2aWV3a2V5LCBrZXlMaXN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydW4gVGFza1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNCdXN5IHx8IHRoaXMuX3RocmVhZFVQVklzUnVubmluZykge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJidXN5LHJlbmRlcuW7tuWQjlwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lKFwiYnVmZmVyIGFuZCByZW5kZXJcIik7XHJcbiAgICAgICAgICAgICAgICBKU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXkodmlld2tleSwga2V5TGlzdCk7IC8v5Yib5bu6dmFvLlxyXG4gICAgICAgICAgICAgICAgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkodmlld2tleSwgZmFsc2UpOyAvL+e7mOWItlxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwiYnVmZmVyIGFuZCByZW5kZXJcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJrZXlMaXN0OlwiLCBrZXlMaXN0Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcmluZ0dlb21ldHJ5Q291bnQgLT0ga2V5TGlzdC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgcHJvbWlzZT8ucmVzb2x2ZSh1cGRhdGVJbmZvKTtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUluZm8uX2NvdW50Kys7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlclRhc2tDb3VudCA9IChcclxuICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KS5heXNuVGFza01hbmFnZXIgYXMgQXlzblRhc2tNYW5hZ2VyXHJcbiAgICAgICAgICAgICAgICApLmdldFRhc2tMZW5ndGgoMik7XHJcbiAgICAgICAgICAgICAgICAvLyBidWZmZXJUYXNrQ291bnTkuLox6KGo56S65q2j5Zyo5omn6KGM5pyA5ZCO5LiA5LiqYnVmZmVyVGFza++8jOaJp+ihjOWujOWQjuS7juWIl+ihqOS4reWIoOmZpC5cclxuICAgICAgICAgICAgICAgIC8vIGlmIChidWZmZXJUYXNrQ291bnQgPT09IDEgJiYgdGhpcy5jb21BbmRVcGRHZW9Jc0ludGVycnVwdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIC8vIGNvbnNvbGUubG9nKFwiYnVmZmVyR2VvbWV0cnnlrozmr5Us5omn6KGMY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXNcIik7XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gICAvLyDlpoLmnpxidWZmZXLlvILmraXku7vliqHlt7Llhajpg6jlrozmiJDvvIzkuJRjb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllc+iiq2J1ZmZlcl9HZW9tZXRyeeS4reaWrei/h1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLmNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzKGZhbHNlLCBwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgIC8vIGlmIChidWZmZXJUYXNrQ291bnQgPT09IDEgJiYgdGhpcy5jb21BbmRVcGRHZW9Jc0ludGVycnVwdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIC8vIGNvbnNvbGUubG9nKFwiYnVmZmVyR2VvbWV0cnnlrozmr5Us5omn6KGMY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXNcIik7XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gICAvLyDlpoLmnpxidWZmZXLlvILmraXku7vliqHlt7Llhajpg6jlrozmiJDvvIzkuJRjb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllc+iiq2J1ZmZlcl9HZW9tZXRyeeS4reaWrei/h1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLmNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzKGZhbHNlLCBwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2coXCJkcmF3IGZpbmlzaFwiKTtcclxuICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgIGlmIChidWZmZXJUYXNrQ291bnQgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tQW5kVXBkR2VvSXNJbnRlcnJ1cHRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYnVmZmVyR2VvbWV0cnnlrozmr5Us5omn6KGMY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21BbmRVcGRHZW9Jc0ludGVycnVwdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6cYnVmZmVy5byC5q2l5Lu75Yqh5bey5YWo6YOo5a6M5oiQ77yM5LiUY29tcHV0ZUFuZFVwZGF0ZUdlb21ldHJpZXPooqtidWZmZXJfR2VvbWV0cnnkuK3mlq3ov4dcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVBbmRVcGRhdGVHZW9tZXRyaWVzKGZhbHNlLCBwcm9taXNlKTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAgICAgICAgIFwiYnVmZmVyaW5nR2VvbWV0cnlDb3VudDE6XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcmluZ0dlb21ldHJ5Q291bnRcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyaW5nR2VvbWV0cnlDb3VudCA9PT0gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VnbWVudExvYWRpbmdDb3VudCA9PT0gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8g6aKR57mB5pu05paw5pe25pyJ5pe25YCZ5LiN5YeG77yM5Y6f5Zug5piv5Zyo5aSa57q/56iL5LiL77yMX3NlZ21lbnRMb2FkaW5nQ291bnTnmoTorqHmlbDlmajkuI3lh4bnoa4uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImRyYXcgZmluaXNoXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9tZXRyeURyYXdGaW5pc2guZm9yRWFjaCgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaXNHZW9tZXRyeUxvYWRpbmcxOlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzR2VvbWV0cnlMb2FkaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0dlb21ldHJ5TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaXNHZW9tZXRyeUxvYWRpbmcyOlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzR2VvbWV0cnlMb2FkaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW3RoaXMudmlld0tleSwgY29weUdyb3VwXSxcclxuICAgICAgICAgICAgMlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY291bnQgPT09IDApIHtcclxuICAgICAgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXkodGhpcy5fdmlld0tleSwgZmFsc2UpOyAvL+e7mOWItlxyXG5cclxuICAgICAgcHJvbWlzZT8ucmVzb2x2ZShcclxuICAgICAgICBuZXcgVXBkYXRlSW5mbyhcclxuICAgICAgICAgIHRoaXMsXHJcbiAgICAgICAgICBpc1RocmVhZFxyXG4gICAgICAgICAgICA/IFVwZGF0ZURpc3BsYXlUeXBlLkFzeW5UaHJlYWROb25lQnVmZmVyR2VvbWV0cnlcclxuICAgICAgICAgICAgOiBVcGRhdGVEaXNwbGF5VHlwZS5Bc3luTm9uZUJ1ZmZlckdlb21ldHJ5XHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gbHptYU1hbmFnZXIgPSBuZXcgV0xaTUEuTWFuYWdlcigwLCBcImpzL2x6bWEvd2x6bWEud3JrLmpzXCIpO1xyXG5cclxuICBwcml2YXRlIGRlY29kZU1uZ1J1bigpIHtcclxuICAgIGlmICh0aGlzLl9kZWNvZGluZ09iamVjdExpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiZGVjb2RpbmdcIik7XHJcbiAgICAgIHRoaXMuX2RlY29kZU1hbmFnZXJJc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICBsZXQgb2JqOiBEZWNvZGluZ09iamVjdCA9IHRoaXMuX2RlY29kaW5nT2JqZWN0TGlzdC5wb3AoKTtcclxuICAgICAgLy8gICBjb25zb2xlLnRpbWUoXCJBc3luRGVjb2RlRGF0YVRpbWVcIik7XHJcblxyXG4gICAgICB0aGlzLkFzeW5EZWNvZGVEYXRhKG9iaik7XHJcbiAgICAgIC8vICAgY29uc29sZS50aW1lKFwiQXN5bkRlY29kZURhdGFUaW1lXCIpO1xyXG5cclxuICAgICAgLy8g5a2Y5Zyo6K+35rGC6L+U5Zue5pWw5o2u5Y+q5pyJ5LiA5Liq5aSn55qE5Yeg5L2V5pWw5o2u55qE5oOF5Ya1LOatpOaXtuWPquS8muW8gOS4gOS4que6v+eoi+WOu+ino+WOiyzlr7zoh7TkuobpmLvloZ4uXHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgIGkgPCAodGhpcyBhcyBhbnkpLnByb2Nlc3MubHptYU1hbmFnZXIud29ya2Vycy5sZW5ndGg7XHJcbiAgICAgICAgaSsrXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCB3b3JrZXIgPSAodGhpcyBhcyBhbnkpLnByb2Nlc3MubHptYU1hbmFnZXIud29ya2Vyc1tpXTtcclxuICAgICAgICBpZiAod29ya2VyLmlkbGUpIHtcclxuICAgICAgICAgIHRoaXMuZGVjb2RlTW5nUnVuKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGVidWdMb2coXCJkZWNvZGUgYWxsIGZpbmlzaFwiKTtcclxuICAgICAgdGhpcy5fZGVjb2RlTWFuYWdlcklzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy/op6PmnpDnu4TnmoTlh6DkvZXmlbDmja7mtYEs5ouG5YiG5oiQ5q+P5Liq5Yeg5L2V55qE5pWw5o2uLlxyXG4gIHByaXZhdGUgQXN5bkRlY29kZURhdGEob2JqOiBEZWNvZGluZ09iamVjdCkge1xyXG4gICAgLy8gbGV0IHdvcmtlciA9IG5ldyBXb3JrZXIoXCIuL3NxbGl0ZS53b3JrZXIuanNcIik7XHJcblxyXG4gICAgbGV0IG1vZGVsSWQgPSBvYmoubW9kZWxJZDtcclxuICAgIGxldCB2ZXJzaW9uID0gb2JqLnZlcnNpb247XHJcbiAgICBsZXQgYmxvYkRhdGEgPSBvYmouZGF0YSBhcyBBcnJheUJ1ZmZlcjtcclxuICAgIGxldCBncm91cCA9IG9iai5ncm91cElkcztcclxuICAgIGxldCBkaWN0aW9uYXJ5ID0gb2JqLmRpY3Rpb25hcnk7XHJcblxyXG4gICAgbGV0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJsb2JEYXRhKTtcclxuICAgIHRoaXMuX29mZnNldCA9IDA7XHJcblxyXG4gICAgbGV0IGRlQ29kZUNvdW50ID0gMDtcclxuICAgIGxldCBjb3VudCA9IHRoaXMuZGF0YVZpZXdSZWFkSW50MzIoZGF0YVZpZXcpO1xyXG4gICAgbGV0IGlkQXJyYXkgPSBncm91cC5zcGxpdChcIixcIik7XHJcblxyXG4gICAgaWYgKGNvdW50ICE9PSBpZEFycmF5Lmxlbmd0aCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIui/lOWbnueahOS6jOi/m+WItuaVsOaNrueahOWHoOS9leS4quaVsOS4juWHoOS9lee7hOmVv+W6puS4jeS4gOiHtFwiKTtcclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIm5leHQgZGVjb2RlXCIpO1xyXG4gICAgICB0aGlzLmRlY29kZU1uZ1J1bigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGlkYjtcclxuICAgIGlmICh0aGlzLmlzQ2FjaGUpIHtcclxuICAgICAgaWRiID0gSURCLmdldEluc3RhbmNlKG1vZGVsSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWHoOS9leeahOWtl+iKgua1geaVsOe7hC5cclxuICAgIGxldCBzZWdLZXlzOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgICBsZXQgYnl0ZXNBcnJheTogVWludDhBcnJheVtdID0gbmV3IEFycmF5PFVpbnQ4QXJyYXk+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgIGxldCBzdHJlYW1MZW5ndGggPSB0aGlzLmRhdGFWaWV3UmVhZEludDMyKGRhdGFWaWV3KTtcclxuICAgICAgbGV0IGNvbXByZXNzRmxhZyA9IDA7XHJcbiAgICAgIGlmICh0aGlzLl9nZW9EYXRhSXNDb21wcmVzc2lvbikge1xyXG4gICAgICAgIGNvbXByZXNzRmxhZyA9IHRoaXMuZGF0YVZpZXdSZWFkSW50MzIoZGF0YVZpZXcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaWQgPSBpZEFycmF5W2ldO1xyXG4gICAgICBsZXQgc2VnS2V5ID0gZGljdGlvbmFyeVtpZF07XHJcblxyXG4gICAgICBsZXQgZ2VvU3RyZWFtRGF0YSA9IGJsb2JEYXRhLnNsaWNlKFxyXG4gICAgICAgIHRoaXMuX29mZnNldCxcclxuICAgICAgICB0aGlzLl9vZmZzZXQgKyBzdHJlYW1MZW5ndGhcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5fb2Zmc2V0ICs9IHN0cmVhbUxlbmd0aDtcclxuXHJcbiAgICAgIC8v5bCG5LqM6L+b5Yi25pWw5o2u5YaZ5YWl5Yiwc2VnbWVudC5cclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleShzZWdLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgLy8gSlNfU2V0X0hldXJpc3RpY19PcHRpb25zKFwiYXN5biBnZW9tZXRyeT1vZmZcIik7XHJcbiAgICAgICAgSlNfU2V0X09uZV9IZXVyaXN0aWNfT3B0aW9uKFwiYXN5biBnZW9tZXRyeVwiLCBcIm9mZlwiKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbXByZXNzRmxhZyA9PT0gMSkge1xyXG4gICAgICAgICAgKHRoaXMgYXMgYW55KS5wcm9jZXNzLmx6bWFNYW5hZ2VyXHJcbiAgICAgICAgICAgIC5kZWNvZGUoZ2VvU3RyZWFtRGF0YSlcclxuICAgICAgICAgICAgLnRoZW4oKG91dHN0cmVhbSkgPT4ge1xyXG4gICAgICAgICAgICAgIGRlQ29kZUNvdW50Kys7XHJcbiAgICAgICAgICAgICAgbGV0IGRhdGEgPSBvdXRzdHJlYW07XHJcbiAgICAgICAgICAgICAgbGV0IGJ5dGVzOiBVaW50OEFycmF5ID0gZGF0YS50b1VpbnQ4QXJyYXkoKTtcclxuICAgICAgICAgICAgICBieXRlc0FycmF5LnB1c2goYnl0ZXMpO1xyXG4gICAgICAgICAgICAgIHNlZ0tleXMucHVzaChzZWdLZXkpO1xyXG5cclxuICAgICAgICAgICAgICAvLyDnvJPlrZjov5tpbmRleGVkREJcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0NhY2hlKSB7XHJcbiAgICAgICAgICAgICAgICBpZGIuc2V0KG1vZGVsSWQgKyBcIj92PVwiICsgdmVyc2lvbiArIFwiX1wiICsgaWQsIGJ5dGVzKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8v6KGo56S66K+l57uE5Yeg5L2V5pWw5o2u5bey57uP5YWo6YOo6Kej5Y6L5a6M5q+VLOi/m+ihjOS4i+S4gOe7hOWHoOS9leaVsOaNrueahOino+WOiy5cclxuICAgICAgICAgICAgICAvLyB0aGlzLmRlYnVnTG9nKFwiZGVDb2RlQ291bnQ6XCIrIGRlQ29kZUNvdW50ICsgXCItLS0tXCIgKyBcImNvdW50OlwiICsgY291bnQpO1xyXG4gICAgICAgICAgICAgIGlmIChkZUNvZGVDb3VudCA9PT0gY291bnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25lR3JvdXBEZWNvZGVGaW5pc2goc2VnS2V5cywgYnl0ZXNBcnJheSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZGVjb2RlIGVycm9yOlwiLCBlcnIpO1xyXG4gICAgICAgICAgICAgIGRlQ29kZUNvdW50Kys7XHJcbiAgICAgICAgICAgICAgaWYgKGRlQ29kZUNvdW50ID09PSBjb3VudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbmVHcm91cERlY29kZUZpbmlzaChzZWdLZXlzLCBieXRlc0FycmF5KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29tcHJlc3NGbGFnID09PSAwKSB7XHJcbiAgICAgICAgICBkZUNvZGVDb3VudCsrO1xyXG4gICAgICAgICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZ2VvU3RyZWFtRGF0YSk7XHJcbiAgICAgICAgICBieXRlc0FycmF5LnB1c2goYnl0ZXMpO1xyXG4gICAgICAgICAgc2VnS2V5cy5wdXNoKHNlZ0tleSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNDYWNoZSkge1xyXG4gICAgICAgICAgICBpZGIuc2V0KG1vZGVsSWQgKyBcIj92PVwiICsgdmVyc2lvbiArIFwiX1wiICsgaWQsIGJ5dGVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8v6KGo56S66K+l57uE5Yeg5L2V5pWw5o2u5bey57uP5YWo6YOo6Kej5Y6L5a6M5q+VLOi/m+ihjOS4i+S4gOe7hOWHoOS9leaVsOaNrueahOino+WOiy5cclxuICAgICAgICAgIC8vIHRoaXMuZGVidWdMb2coXCJkZUNvZGVDb3VudDpcIisgZGVDb2RlQ291bnQgKyBcIi0tLS1cIiArIFwiY291bnQ6XCIgKyBjb3VudCk7XHJcblxyXG4gICAgICAgICAgaWYgKGRlQ29kZUNvdW50ID09PSBjb3VudCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uZUdyb3VwRGVjb2RlRmluaXNoKHNlZ0tleXMsIGJ5dGVzQXJyYXkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICBkZWxldGUgdGhpcy5fbG9hZGluZ0xpc3Rbc2VnS2V5XTtcclxuICAgICAgdGhpcy5fbG9hZGluZ0xpc3RDb3VudC0tO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2xvYWRpbmdMaXN0Q291bnQgPT09IDApIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPluWujOWFqOmDqOWHoOS9leaVsOaNrlwiKTtcclxuICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCJnZXQgZGF0YSBmaW5pc2hcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQHJldHVybnMg5Yik5patc3RyZWFtVG9HZW9tZXRyeeaYr+WQpuWPr+aJp+ihjC5cclxuICAgKi9cclxuICBjaGVja1N0cmVhbVRvR2VvbWV0cnlEaXNhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmlzVXBkYXRlVHQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaXNCdXN5O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaXNCdXN5IHx8IHRoaXMudGhyZWFkSXNSdW5uaW5nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbmVHcm91cERlY29kZUZpbmlzaChzZWdLZXlzOiBudW1iZXJbXSwgYnl0ZXNBcnJheTogVWludDhBcnJheVtdKSB7XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwibmV4dCBkZWNvZGVcIik7XHJcbiAgICB0aGlzLmRlY29kZU1uZ1J1bigpO1xyXG5cclxuICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgLy8g5byC5q2l5omn6KGMSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5LOS4lOS4jeiDveS4jue6v+eoi+WQjOaXtuaJp+ihjFxyXG4gICAgICBpZiAodGhpcy5jaGVja1N0cmVhbVRvR2VvbWV0cnlEaXNhYmxlKCkpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcclxuICAgICAgICAvLyAgIFwiYnVzeSB8IHRocmVhZElzUnVuaW5nLEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX0J5X0tleeW7tuWQjlwiXHJcbiAgICAgICAgLy8gKTtcclxuICAgICAgICAvLyByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHJlYW1fdG9fZ2VvbWV0cnlcIik7XHJcbiAgICAgICAgLy8g5ou85o6l5pW05Liq5Yeg5L2V57uE55qE5oC75a2X6IqC5rWBLlxyXG4gICAgICAgIC8vIOWHoOS9lee7hOeahOWtl+iKgua1geaAu+mVv+W6pi5cclxuICAgICAgICBsZXQgYWxsQnl0ZUxlbmd0aCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlc0FycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBhbGxCeXRlTGVuZ3RoICs9IGJ5dGVzQXJyYXlbaV0ubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZ2VvbWV0cnlHcnVwRGF0YSA9IG5ldyBVaW50OEFycmF5KGFsbEJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICB0aGlzLl9jdXJyZW50TWVtb3J5U2l6ZSArPSBhbGxCeXRlTGVuZ3RoICogMztcclxuICAgICAgICBsZXQgaXNGcmVlID0gdGhpcy5lbnN1cmVDdXJyZW50TWVtb3J5U2l6ZSgpO1xyXG4gICAgICAgIGlmIChpc0ZyZWUpIHtcclxuICAgICAgICAgIGxldCBjdXJyZW50T2Zmc2V0ID0gMDtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXNBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBnZW9tZXRyeUdydXBEYXRhLnNldChieXRlc0FycmF5W2ldLCBjdXJyZW50T2Zmc2V0KTtcclxuICAgICAgICAgICAgY3VycmVudE9mZnNldCArPSBieXRlc0FycmF5W2ldLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIGJ5dGVzQXJyYXlbaV0gPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNVcGRhdGVUdCkge1xyXG4gICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLl90aHJlYWRVUFZJc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzX1R0X1N0YXJ0XCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGhyZWFkU1RHRElzUnVubmluZ0NvdW50Kys7XHJcbiAgICAgICAgICAgICAgICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzX1R0KFxyXG4gICAgICAgICAgICAgICAgICBzZWdLZXlzLFxyXG4gICAgICAgICAgICAgICAgICBnZW9tZXRyeUdydXBEYXRhLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnZpZXdLZXlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWdtZW50TG9hZGluZ0NvdW50IC09IHNlZ0tleXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICAvLyAgIFwiX3NlZ21lbnRMb2FkaW5nQ291bnQ6XCIsXHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuX3NlZ21lbnRMb2FkaW5nQ291bnRcclxuICAgICAgICAgICAgICAgIC8vICk7XHJcblxyXG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAyMCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzKHNlZ0tleXMsIGdlb21ldHJ5R3J1cERhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZWdtZW50TG9hZGluZ0NvdW50IC09IHNlZ0tleXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIl9zZWdtZW50TG9hZGluZ0NvdW50OlwiLCB0aGlzLl9zZWdtZW50TG9hZGluZ0NvdW50KTtcclxuICAgICAgICAgICAgdGhpcy5jb21wdXRlQW5kVXBkYXRlR2VvbWV0cmllcyh0cnVlLCBudWxsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJfY3VycmVudE1lbW9yeVNpemUgaXMgZnVsbFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xyXG4gICAgICB9XHJcbiAgICB9LCAyMCk7XHJcbiAgfVxyXG5cclxuICAvL+i/h+a7pOmHjeWkjeeahHZhb2tleS0tLS1idWZmZXIuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJSZXBlYXRLZXlzQnVmZmVyKGdlb21LZXlzKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IGdlb21LZXlzQ291bnQgPSBnZW9tS2V5cy5sZW5ndGg7XHJcbiAgICAvL+i/h+a7pOaOieW3sue7j3Nob3fov4fopoHliJvlu7rnmoR2YW8uLi7pmLLmraLliJvlu7rkuIDkuKp2YW/lt7Lnu4/lnKjpmJ/liJfkuK0o5pyq5Yib5bu6KSzkvYblj4jph43lpI3miavmj4/liLAs5a+86Ie06YeN5aSN5Yib5bu655qE6Zeu6aKYLlxyXG4gICAgbGV0IGZpbHRlcmVkR2VvbUtleXMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnZW9tS2V5c0NvdW50OyBpKyspIHtcclxuICAgICAgbGV0IGdlb21LZXk6IG51bWJlciA9IGdlb21LZXlzW2ldO1xyXG4gICAgICBmaWx0ZXJlZEdlb21LZXlzLnB1c2goZ2VvbUtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlcmVkR2VvbUtleXM7XHJcbiAgfVxyXG5cclxuICAvL+i/h+a7pOmHjeWkjeeahHZhb2tleS5cclxuICBwcml2YXRlIGZpbHRlclJlcGVhdEtleXNVbmJ1ZmZlcihnZW9tS2V5cyk6IG51bWJlcltdIHtcclxuICAgIGxldCBnZW9tS2V5c0NvdW50ID0gZ2VvbUtleXMubGVuZ3RoO1xyXG4gICAgLy/ov4fmu6Tmjonlt7Lnu49zaG936L+H6KaB5Yib5bu655qEdmFvLi4u6Ziy5q2i5Yib5bu65LiA5LiqdmFv5bey57uP5Zyo6Zif5YiX5LitKOacquWIm+W7uiks5L2G5Y+I6YeN5aSN5omr5o+P5YiwLOWvvOiHtOmHjeWkjeWIm+W7uueahOmXrumimC5cclxuICAgIGxldCBmaWx0ZXJlZEdlb21LZXlzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2VvbUtleXNDb3VudDsgaSsrKSB7XHJcbiAgICAgIGxldCBnZW9tS2V5OiBudW1iZXIgPSBnZW9tS2V5c1tpXTtcclxuICAgICAgLy8gbGV0IHJlcyA9IHRoaXMuX3Nob3dlZFZhb0xpc3RVbmJ1ZmZlcltnZW9tS2V5XTtcclxuICAgICAgLy8gaWYgKHJlcyA9PT0gbnVsbCB8fCByZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyAgIHRoaXMuX3Nob3dlZFZhb0xpc3RVbmJ1ZmZlcltnZW9tS2V5XSA9IDA7XHJcbiAgICAgIGZpbHRlcmVkR2VvbUtleXMucHVzaChnZW9tS2V5KTtcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmaWx0ZXJlZEdlb21LZXlzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEdzbElkKGtleSk6IHN0cmluZyB7XHJcbiAgICBsZXQgbW9kZWxJZCA9IG51bGw7XHJcbiAgICBtb2RlbElkID0gSlNfU2hvd19Qcm9wZXJ0eV9TdHJpbmcoa2V5LCBcIm1vZGVsSWRcIik7XHJcblxyXG4gICAgaWYgKG1vZGVsSWQpIHtcclxuICAgICAgcmV0dXJuIG1vZGVsSWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgb3duZXJfa2V5ID0gSlNfU2hvd19Pd25lcl9CeV9LZXkoa2V5KTtcclxuICAgICAgaWYgKG93bmVyX2tleSAhPT0gLTEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRHc2xJZChvd25lcl9rZXkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGF0YVZpZXdSZWFkSW50MzIoZGF0YVZpZXc6IERhdGFWaWV3KSB7XHJcbiAgICBsZXQgcmVzdWx0SW50ID0gZGF0YVZpZXcuZ2V0SW50MzIodGhpcy5fb2Zmc2V0KTtcclxuICAgIHRoaXMuX29mZnNldCArPSA0O1xyXG5cclxuICAgIHJldHVybiByZXN1bHRJbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGlzcGxheVdpdGhGcmFtZXJhdGUoXHJcbiAgICBmcmFtZXJhdGU6IG51bWJlcixcclxuICAgIGN1bGxpbmdUaHJlc2hvbGQ6IG51bWJlclxyXG4gICkge1xyXG4gICAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9XaXRoX0ZyYW1lcmF0ZV9CeV9LZXkoXHJcbiAgICAgIHRoaXMuX3ZpZXdLZXksXHJcbiAgICAgIGZyYW1lcmF0ZSxcclxuICAgICAgY3VsbGluZ1RocmVzaG9sZFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEaXNwbGF5V2l0aFRpbWUodGltZTogbnVtYmVyKSB7XHJcbiAgICBKU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfVGltZV9CeV9LZXkodGhpcy5fdmlld0tleSwgdGltZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBoZWlnaHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZVNpemUoKSB7XHJcbiAgICBKU19NYWtlX0NvbnRleHRfQ3VycmVudCh0aGlzLl92aWV3S2V5KTtcclxuXHJcbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoO1xyXG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgIHRoaXMuX3dpZHRoID0gdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGg7XHJcbiAgICB0aGlzLl9oZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgdGhpcy5fYXNwZWN0UmF0aW8gPSB0aGlzLl93aWR0aCAvIHRoaXMuX2hlaWdodDtcclxuXHJcbiAgICBKU19SZXNpemVfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJ1cGRhdGVTaXplLS0tLS0tLS0tLS0tLS1cIilcclxuXHJcbiAgICAvLyB1cGRhdGUgYmFja2dyb3VuZFxyXG4gICAgdGhpcy51cGRhdGVCYWNrZ3JvdW5kQ29sb3IoKTtcclxuICAgIEpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5KHRoaXMudmlld0tleSk7XHJcblxyXG4gICAgLy8gdXBkYXRlU2l6ZeWQjumcgOimgeWumuaXtuaJjeiDveaJp+ihjHVwZGF0ZURvY3VtZW50XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVEb2N1bWVudCgpO1xyXG4gICAgfSwgMCk7XHJcbiAgICAvL3RoaXMuZXhlU2NlbmVDYW1lcmFDaGFuZ2VkKENhbWVyYUNoYW5nZVR5cGUuVHJhbnNsYXRlIHx8IENhbWVyYUNoYW5nZVR5cGUuUm90YXRlIHx8IENhbWVyYUNoYW5nZVR5cGUuU2NhbGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUJhY2tncm91bmRDb2xvcigpIHtcclxuICAgIGlmICh0aGlzLl9iYWNrZ3JvdW5kS2V5ICE9IC0xKSB7XHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fYmFja2dyb3VuZEtleSk7XHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgZ2VvbXMgPSBKU19TaG93X0dlb21ldHJ5X0xpc3QoKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBnZW9tcy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAoSlNfU2hvd19LZXlfVHlwZShnZW9tc1swXSkgYXMgT2JqZWN0VHlwZSkgPT0gT2JqZWN0VHlwZS5UWVBFX1NoZWxsXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBsZXQgYXNwZWN0X3JhdGlvID0gdGhpcy5fYXNwZWN0UmF0aW87XHJcbiAgICAgICAgICBsZXQgZmFyID0gLWFzcGVjdF9yYXRpbyAqIDIgKyAxLjAwMDAwMTtcclxuXHJcbiAgICAgICAgICBsZXQgdyA9IDEuMDtcclxuICAgICAgICAgIGxldCBoID0gMS4wO1xyXG4gICAgICAgICAgaWYgKGFzcGVjdF9yYXRpbyA+IDEpIHtcclxuICAgICAgICAgICAgdyAqPSBhc3BlY3RfcmF0aW87XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBoIC89IGFzcGVjdF9yYXRpbztcclxuICAgICAgICAgICAgZmFyID0gLTIgKyAxLjAwMDAwMTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBKU19FZGl0X1NoZWxsKFxyXG4gICAgICAgICAgICBnZW9tc1swXSxcclxuICAgICAgICAgICAgWy13LCAtaCwgZmFyLCB3LCAtaCwgZmFyLCB3LCBoLCBmYXIsIC13LCBoLCBmYXJdLFxyXG4gICAgICAgICAgICBbNCwgMCwgMSwgMiwgM11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2FtZXJhT3JpZW50YXRpb25GaXhlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYW1lcmFPcmllbnRhdGlvbkZpeGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjYW1lcmFPcmllbnRhdGlvbkZpeGVkKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fY2FtZXJhT3JpZW50YXRpb25GaXhlZCA9IHZhbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc21vb3RoVHJhbnNpdGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zbW9vdGhUcmFuc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzbW9vdGhUcmFuc2l0aW9uKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc21vb3RoVHJhbnNpdGlvbiA9IHZhbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc21vb3RoVHJhbnNpdGlvbkR1cmF0aW9uKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc21vb3RoVHJhbnNpdGlvbkR1cmF0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzbW9vdGhUcmFuc2l0aW9uRHVyYXRpb24oZHVyYXRpb246IG51bWJlcikge1xyXG4gICAgdGhpcy5fc21vb3RoVHJhbnNpdGlvbkR1cmF0aW9uID0gZHVyYXRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGJhY2tncm91bmRDb2xvcigpOiBBcnJheUxpa2U8bnVtYmVyPiB7XHJcbiAgICBsZXQgY29sb3JzO1xyXG4gICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgIHtcclxuICAgICAgY29sb3JzID0gSlNfU2hvd19Db2xvcl9CeV9WYWx1ZShcImJhY2tncm91bmRcIik7XHJcbiAgICB9XHJcbiAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGNvbG9ycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgYmFja2dyb3VuZENvbG9yKHZhbDogQXJyYXlMaWtlPG51bWJlcj4pIHtcclxuICAgIGlmICh2YWwpIHtcclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl92aWV3S2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIGlmICh2YWwubGVuZ3RoID09IDMpIHtcclxuICAgICAgICAgIGlmICh0aGlzLl9iYWNrZ3JvdW5kS2V5ICE9IC0xKSB7XHJcbiAgICAgICAgICAgIEpTX0RlbGV0ZV9CeV9LZXkodGhpcy5fYmFja2dyb3VuZEtleSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmRLZXkgPSAtMTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBKU19TZXRfQ29sb3IoXHJcbiAgICAgICAgICAgIFwiYmFja2dyb3VuZD0ocj1cIiArXHJcbiAgICAgICAgICAgICAgKHZhbFswXSAvIDI1NS4wKS50b0ZpeGVkKDIpICtcclxuICAgICAgICAgICAgICBcIixnPVwiICtcclxuICAgICAgICAgICAgICAodmFsWzFdIC8gMjU1LjApLnRvRml4ZWQoMikgK1xyXG4gICAgICAgICAgICAgIFwiLGI9XCIgK1xyXG4gICAgICAgICAgICAgICh2YWxbMl0gLyAyNTUuMCkudG9GaXhlZCgyKSArXHJcbiAgICAgICAgICAgICAgXCIpXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWwubGVuZ3RoID09IDQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLl9iYWNrZ3JvdW5kS2V5ICE9IC0xKSB7XHJcbiAgICAgICAgICAgIEpTX0RlbGV0ZV9CeV9LZXkodGhpcy5fYmFja2dyb3VuZEtleSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmRLZXkgPSAtMTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBKU19TZXRfQ29sb3IoXHJcbiAgICAgICAgICAgIFwiYmFja2dyb3VuZD0ocj1cIiArXHJcbiAgICAgICAgICAgICAgKHZhbFswXSAvIDI1NS4wKS50b0ZpeGVkKDIpICtcclxuICAgICAgICAgICAgICBcIixnPVwiICtcclxuICAgICAgICAgICAgICAodmFsWzFdIC8gMjU1LjApLnRvRml4ZWQoMikgK1xyXG4gICAgICAgICAgICAgIFwiLGI9XCIgK1xyXG4gICAgICAgICAgICAgICh2YWxbMl0gLyAyNTUuMCkudG9GaXhlZCgyKSArXHJcbiAgICAgICAgICAgICAgXCIsYT1cIiArXHJcbiAgICAgICAgICAgICAgdmFsWzNdLnRvRml4ZWQoMikgK1xyXG4gICAgICAgICAgICAgIFwiKVwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsLmxlbmd0aCA9PSA2IHx8IHZhbC5sZW5ndGggPT0gMTIpIHtcclxuICAgICAgICAgIEpTX1NldF9Db2xvcihcImJhY2tncm91bmQ9KHI9MS4wLGc9MS4wLGI9MS4wLGE9MS4wKVwiKTtcclxuXHJcbiAgICAgICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYmFja2dyb3VuZEtleSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgIEpTX0NsZWFyX0FsbF9CeV9LZXkodGhpcy5fYmFja2dyb3VuZEtleSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmRLZXkgPSBKU19PcGVuX1NlZ21lbnQoXCJiYWNrZ3JvdW5kXCIpO1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgSlNfU2V0X0NhbWVyYShcclxuICAgICAgICAgICAgICAgIFswLCAwLCAxXSxcclxuICAgICAgICAgICAgICAgIFswLCAwLCAwXSxcclxuICAgICAgICAgICAgICAgIFswLCAxLCAwXSxcclxuICAgICAgICAgICAgICAgIDIuMCxcclxuICAgICAgICAgICAgICAgIDIuMCxcclxuICAgICAgICAgICAgICAgIFwib3J0aG9ncmFwaGljXCJcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfRXh0ZW50KC0xLCAxKTtcclxuICAgICAgICAgICAgICBKU19TZXRfTW9kZWxsaW5nTWF0cml4KFtcclxuICAgICAgICAgICAgICAgIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsXHJcbiAgICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgICAgSlNfU2V0X1Zpc2liaWxpdHkoXCJsaWdodHM9b2ZmXCIpO1xyXG4gICAgICAgICAgICAgIEpTX1NldF9SZW5kZXJpbmdfT3B0aW9ucyhcInN5bmMgdXBkYXRlPW9uXCIpO1xyXG4gICAgICAgICAgICAgIEpTX1NldF9IZXVyaXN0aWNfT3B0aW9ucyhcclxuICAgICAgICAgICAgICAgIFwiZXhjbHVkZSBib3VuZGluZz1vbixleGNsdWRlIHNlZ21lbnQgYm91bmRpbmc9b25cIlxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBhc3BlY3RfcmF0aW8gPSB0aGlzLl9hc3BlY3RSYXRpbztcclxuICAgICAgICAgICAgICBsZXQgZmFyID0gLWFzcGVjdF9yYXRpbyAqIDIgKyAxLjAwMDAwMTtcclxuXHJcbiAgICAgICAgICAgICAgbGV0IHcgPSAxLjA7XHJcbiAgICAgICAgICAgICAgbGV0IGggPSAxLjA7XHJcbiAgICAgICAgICAgICAgaWYgKGFzcGVjdF9yYXRpbyA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHcgKj0gYXNwZWN0X3JhdGlvO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBoIC89IGFzcGVjdF9yYXRpbztcclxuICAgICAgICAgICAgICAgIGZhciA9IC0yICsgMS4wMDAwMDE7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBsZXQgc2hlbGxLZXkgPSBKU19JbnNlcnRfU2hlbGwoXHJcbiAgICAgICAgICAgICAgICBbLXcsIC1oLCBmYXIsIHcsIC1oLCBmYXIsIHcsIGgsIGZhciwgLXcsIGgsIGZhcl0sXHJcbiAgICAgICAgICAgICAgICBbNCwgMCwgMSwgMiwgM11cclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBpZiAodmFsLmxlbmd0aCA9PSA2KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYnIgPSB2YWxbMF0gLyAyNTUuMDtcclxuICAgICAgICAgICAgICAgIGxldCBiZyA9IHZhbFsxXSAvIDI1NS4wO1xyXG4gICAgICAgICAgICAgICAgbGV0IGJiID0gdmFsWzJdIC8gMjU1LjA7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmEgPSAxLjA7XHJcbiAgICAgICAgICAgICAgICBsZXQgdHIgPSB2YWxbM10gLyAyNTUuMDtcclxuICAgICAgICAgICAgICAgIGxldCB0ZyA9IHZhbFs0XSAvIDI1NS4wO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRiID0gdmFsWzVdIC8gMjU1LjA7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGEgPSAxLjA7XHJcblxyXG4gICAgICAgICAgICAgICAgSlNfU2V0X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlKHNoZWxsS2V5LCBcImZhY2VcIiwgMCwgW1xyXG4gICAgICAgICAgICAgICAgICBicixcclxuICAgICAgICAgICAgICAgICAgYmcsXHJcbiAgICAgICAgICAgICAgICAgIGJiLFxyXG4gICAgICAgICAgICAgICAgICBiYSxcclxuICAgICAgICAgICAgICAgICAgYnIsXHJcbiAgICAgICAgICAgICAgICAgIGJnLFxyXG4gICAgICAgICAgICAgICAgICBiYixcclxuICAgICAgICAgICAgICAgICAgYmEsXHJcbiAgICAgICAgICAgICAgICAgIHRyLFxyXG4gICAgICAgICAgICAgICAgICB0ZyxcclxuICAgICAgICAgICAgICAgICAgdGIsXHJcbiAgICAgICAgICAgICAgICAgIHRhLFxyXG4gICAgICAgICAgICAgICAgICB0cixcclxuICAgICAgICAgICAgICAgICAgdGcsXHJcbiAgICAgICAgICAgICAgICAgIHRiLFxyXG4gICAgICAgICAgICAgICAgICB0YSxcclxuICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFscyA9IEFycmF5KDE2KTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgIHZhbHNbaSAqIDRdID0gdmFsW2kgKiAzXSAvIDI1NS4wO1xyXG4gICAgICAgICAgICAgICAgICB2YWxzW2kgKiA0ICsgMV0gPSB2YWxbaSAqIDMgKyAxXSAvIDI1NS4wO1xyXG4gICAgICAgICAgICAgICAgICB2YWxzW2kgKiA0ICsgMl0gPSB2YWxbaSAqIDMgKyAyXSAvIDI1NS4wO1xyXG4gICAgICAgICAgICAgICAgICB2YWxzW2kgKiA0ICsgM10gPSAxLjA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBKU19TZXRfR2VvbWV0cnlfQ29sb3JfQnlfVmFsdWUoc2hlbGxLZXksIFwiZmFjZVwiLCAwLCB2YWxzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbWFnZVBhdGhUb0ltYWdlRGF0YShwYXRoKSB7XHJcbiAgICBsZXQgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgIGxldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xyXG4gICAgbGV0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPEltYWdlRGF0YT4oKHJlc29sdmUpID0+IHtcclxuICAgICAgLy8gaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiKSB7XHJcblxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGF4aW9zLmdldChwYXRoLCB7IHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSkudGhlbigoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIC8vICAgaW1nLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZGF0YSk7XHJcbiAgICAgIC8vICAgaW1nLm9ubG9hZCA9IChlKSA9PiB7XHJcbiAgICAgIC8vICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgIC8vICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuICAgICAgLy8gICAgIC8vIOWwhuWbvueJh+aMieWDj+e0oOWGmeWFpeeUu+W4g1xyXG4gICAgICAvLyAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xyXG4gICAgICAvLyAgICAgLy8g6K+75Y+W5Zu+54mH5YOP57Sg5L+h5oGvXHJcbiAgICAgIC8vICAgICBsZXQgaW1hZ2UgPSBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xyXG4gICAgICAvLyAgICAgcmVzb2x2ZShpbWFnZSk7XHJcbiAgICAgIC8vICAgfTtcclxuICAgICAgLy8gfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICBpbWcuc3JjID0gcGF0aDtcclxuICAgICAgaW1nLmNyb3NzT3JpZ2luID0gXCIqXCI7XHJcbiAgICAgIGltZy5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuICAgICAgICAvLyDlsIblm77niYfmjInlg4/ntKDlhpnlhaXnlLvluINcclxuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XHJcbiAgICAgICAgLy8g6K+75Y+W5Zu+54mH5YOP57Sg5L+h5oGvXHJcbiAgICAgICAgbGV0IGltYWdlID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcclxuICAgICAgICByZXNvbHZlKGltYWdlKTtcclxuICAgICAgfTtcclxuICAgICAgLy8gfSlcclxuICAgIH0pO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGJhY2tncm91bmRJbWFnZShpbWFnZVNyYzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmltYWdlUGF0aFRvSW1hZ2VEYXRhKGltYWdlU3JjKS50aGVuKChpbWFnZSkgPT4ge1xyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgSlNfU2V0X0NvbG9yKFwiYmFja2dyb3VuZD0ocj0xLjAsZz0xLjAsYj0xLjAsYT0xLjApXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fYmFja2dyb3VuZEtleSAhPSAtMSkge1xyXG4gICAgICAgICAgSlNfQ2xlYXJfQWxsX0J5X0tleSh0aGlzLl9iYWNrZ3JvdW5kS2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2JhY2tncm91bmRLZXkgPSBKU19PcGVuX1NlZ21lbnQoXCJiYWNrZ3JvdW5kXCIpO1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmEoXHJcbiAgICAgICAgICAgIFswLCAwLCAxXSxcclxuICAgICAgICAgICAgWzAsIDAsIDBdLFxyXG4gICAgICAgICAgICBbMCwgMSwgMF0sXHJcbiAgICAgICAgICAgIDIuMCxcclxuICAgICAgICAgICAgMi4wLFxyXG4gICAgICAgICAgICBcIm9ydGhvZ3JhcGhpY1wiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYV9FeHRlbnQoLTEsIDEpO1xyXG4gICAgICAgICAgSlNfU2V0X01vZGVsbGluZ01hdHJpeChbXHJcbiAgICAgICAgICAgIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsXHJcbiAgICAgICAgICBdKTtcclxuICAgICAgICAgIEpTX1NldF9WaXNpYmlsaXR5KFwibGlnaHRzPW9mZlwiKTtcclxuICAgICAgICAgIEpTX1NldF9SZW5kZXJpbmdfT3B0aW9ucyhcInN5bmMgdXBkYXRlPW9uXCIpO1xyXG4gICAgICAgICAgSlNfU2V0X0hldXJpc3RpY19PcHRpb25zKFxyXG4gICAgICAgICAgICBcImV4Y2x1ZGUgYm91bmRpbmc9b24sZXhjbHVkZSBzZWdtZW50IGJvdW5kaW5nPW9uXCJcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgbGV0IGFzcGVjdF9yYXRpbyA9IHRoaXMuX2FzcGVjdFJhdGlvO1xyXG4gICAgICAgICAgbGV0IGZhciA9IC1hc3BlY3RfcmF0aW8gKiAyICsgMS4wMDAwMDE7XHJcblxyXG4gICAgICAgICAgbGV0IHcgPSAxLjA7XHJcbiAgICAgICAgICBsZXQgaCA9IDEuMDtcclxuICAgICAgICAgIGlmIChhc3BlY3RfcmF0aW8gPiAxKSB7XHJcbiAgICAgICAgICAgIHcgKj0gYXNwZWN0X3JhdGlvO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaCAvPSBhc3BlY3RfcmF0aW87XHJcbiAgICAgICAgICAgIGZhciA9IC0yICsgMS4wMDAwMDE7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHNoZWxsS2V5ID0gSlNfSW5zZXJ0X1NoZWxsKFxyXG4gICAgICAgICAgICBbLXcsIC1oLCBmYXIsIHcsIC1oLCBmYXIsIHcsIGgsIGZhciwgLXcsIGgsIGZhcl0sXHJcbiAgICAgICAgICAgIFs0LCAwLCAxLCAyLCAzXVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBKU19TZXRfR2VvbWV0cnlfVGV4dHVyZV9Db29yZHMoXHJcbiAgICAgICAgICAgIHNoZWxsS2V5LFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICA0LFxyXG4gICAgICAgICAgICBbMCwgMCwgMSwgMCwgMSwgMSwgMCwgMV1cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgSlNfSW5zZXJ0X0ltYWdlKFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICBpbWFnZS53aWR0aCxcclxuICAgICAgICAgICAgaW1hZ2UuaGVpZ2h0LFxyXG4gICAgICAgICAgICBpbWFnZS5kYXRhLFxyXG4gICAgICAgICAgICBcIm5hbWU9J2JhY2tncm91bmQnLGxvY2FsLGZvcm1hdD1yZ2JhXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBKU19TZXRfQ29sb3IoXCJmYWNlIGRpZmZ1c2U9J2JhY2tncm91bmQnXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgSlNfVXBkYXRlX1ZpZXdfRGlzcGxheV9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgICAgIEpTX1VwZGF0ZV9WaWV3X0Rpc3BsYXlfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzZWxlY3Rpb25Ub2xlcmFuY2UoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQgPSAwLjA7XHJcbiAgICBpZiAodGhpcy5fdmlld0tleSAhPSAtMSkge1xyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IG9wdGlvbiA9IEpTX1Nob3dfT25lX0RyaXZlcl9PcHRpb24oXCJzZWxlY3Rpb24gdG9sZXJhbmNlXCIpO1xyXG4gICAgICAgIHJlc3VsdCA9IHBhcnNlRmxvYXQob3B0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc2VsZWN0aW9uVG9sZXJhbmNlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl92aWV3S2V5ICE9IC0xKSB7XHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgICAgIHtcclxuICAgICAgICBKU19TZXRfRHJpdmVyX09wdGlvbnMoXCJzZWxlY3Rpb24gdG9sZXJhbmNlPVwiICsgdmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjb2xsaXNpb25Ub2xlcmFuY2UoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQgPSAwLjA7XHJcbiAgICBpZiAodGhpcy5fdmlld0tleSAhPSAtMSkge1xyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IG9wdGlvbiA9IEpTX1Nob3dfT25lX0RyaXZlcl9PcHRpb24oXCJjb2xsaXNpb24gdG9sZXJhbmNlXCIpO1xyXG4gICAgICAgIHJlc3VsdCA9IHBhcnNlRmxvYXQob3B0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY29sbGlzaW9uVG9sZXJhbmNlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl92aWV3S2V5ICE9IC0xKSB7XHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fdmlld0tleSk7XHJcbiAgICAgIHtcclxuICAgICAgICBKU19TZXRfRHJpdmVyX09wdGlvbnMoXCJjb2xsaXNpb24gdG9sZXJhbmNlPVwiICsgdmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzb2Z0Q29sbGlzaW9uRGlzdGFuY2UoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQgPSAwLjA7XHJcbiAgICBpZiAodGhpcy5fdmlld0tleSAhPSAtMSkge1xyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IG9wdGlvbiA9IEpTX1Nob3dfT25lX0RyaXZlcl9PcHRpb24oXCJzb2Z0IGNvbGxpc2lvbiBkaXN0YW5jZVwiKTtcclxuICAgICAgICByZXN1bHQgPSBwYXJzZUZsb2F0KG9wdGlvbik7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHNvZnRDb2xsaXNpb25EaXN0YW5jZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fdmlld0tleSAhPSAtMSkge1xyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3ZpZXdLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgSlNfU2V0X0RyaXZlcl9PcHRpb25zKFwic29mdCBjb2xsaXNpb24gZGlzdGFuY2U9XCIgKyB2YWx1ZS50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgZ2V0IHNjZW5lQ2FtZXJhKCk6IGFueSB7XHJcbiAgLy8gICAgIGxldCBjYW1lcmEgPSBudWxsO1xyXG4gIC8vICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3NjZW5lS2V5KTtcclxuICAvLyAgICAge1xyXG4gIC8vICAgICAgICAgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gIC8vICAgICByZXR1cm4gY2FtZXJhO1xyXG4gIC8vIH1cclxuXHJcbiAgLy9wdWJsaWMgYWRkT3BlcmF0b3Iob3BlcmF0b3I6IE9wZXJhdG9yKSB7XHJcbiAgLy8gICAgb3BlcmF0b3Iudmlld2VyID0gdGhpcztcclxuICAvLyAgICB0aGlzLm9wZXJhdG9ycy5hZGQob3BlcmF0b3IpO1xyXG4gIC8vICAgIG9wZXJhdG9yLmluaXQoKTtcclxuICAvL31cclxuXHJcbiAgLy9wdWJsaWMgcmVtb3ZlT3BlcmF0b3Iob3BlcmF0b3I6IE9wZXJhdG9yKSB7XHJcbiAgLy8gICAgb3BlcmF0b3IuZmluYSgpO1xyXG4gIC8vICAgIHRoaXMub3BlcmF0b3JzLnJlbW92ZShvcGVyYXRvcik7XHJcbiAgLy8gICAgb3BlcmF0b3Iudmlld2VyID0gbnVsbDtcclxuICAvL31cclxuXHJcbiAgLy9wdWJsaWMgY2xlYXJPcGVyYXRvcnMoKSB7XHJcbiAgLy8gICAgbGV0IGxlbiA9IHRoaXMub3BlcmF0b3JzLml0ZW1zLmxlbmd0aDtcclxuICAvLyAgICBsZXQgaXRlbXMgPSB0aGlzLm9wZXJhdG9ycy5pdGVtcztcclxuXHJcbiAgLy8gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gIC8vICAgICAgICBpdGVtc1tpXS5maW5hKCk7XHJcbiAgLy8gICAgICAgIGl0ZW1zW2ldLnZpZXdlciA9IG51bGw7XHJcbiAgLy8gICAgfVxyXG5cclxuICAvLyAgICB0aGlzLm9wZXJhdG9ycy5jbGVhcigpO1xyXG4gIC8vfVxyXG5cclxuICAvL3B1YmxpYyBmaW5kT3BlcmF0b3I8VCBleHRlbmRzIE9wZXJhdG9yPih0eXBlOiBzdHJpbmcpOiBUIHtcclxuICAvLyAgICBpZiAodGhpcy5vcGVyYXRvcnMgIT0gbnVsbCkge1xyXG4gIC8vICAgICAgICBsZXQgbGVuID0gdGhpcy5vcGVyYXRvcnMuaXRlbXMubGVuZ3RoO1xyXG4gIC8vICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLm9wZXJhdG9ycy5pdGVtcztcclxuXHJcbiAgLy8gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAvLyAgICAgICAgICAgIGlmIChpdGVtc1tpXS50eXBlTmFtZSgpID09IHR5cGUpIHtcclxuICAvLyAgICAgICAgICAgICAgICByZXR1cm4gPFQ+aXRlbXNbaV07XHJcbiAgLy8gICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgIH1cclxuICAvLyAgICB9XHJcblxyXG4gIC8vICAgIHJldHVybiBudWxsO1xyXG4gIC8vfVxyXG5cclxuICBwdWJsaWMgZXhlU2NlbmVDYW1lcmFDaGFuZ2luZyh0eXBlOiBDYW1lcmFDaGFuZ2VUeXBlKSB7XHJcbiAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAvLyDmm7TmlrBuZWFyZmFyXHJcbiAgICB0aGlzLnVwZGF0ZUNhbWVyYU5lYXJGYXIoKTtcclxuICAgIHRoaXMuc2NlbmVDYW1lcmFDaGFuZ2luZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogRnVuY3Rpb24pIHtcclxuICAgICAgdmFsdWUoc2VsZiwgdHlwZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBleGVTY2VuZUNhbWVyYUNoYW5nZWQodHlwZTogQ2FtZXJhQ2hhbmdlVHlwZSkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgdGhpcy5zY2VuZUNhbWVyYUNoYW5nZWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbiAgICAgIHZhbHVlKHNlbGYsIHR5cGUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVEb2N1bWVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZURvY3VtZW50KCkge1xyXG4gICAgdGhpcy5kb2N1bWVudENoYW5nZWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbiAgICAgIHZhbHVlKHNlbGYpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ2FtZXJhTmVhckZhcigpIHtcclxuICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAge1xyXG4gICAgICBsZXQgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICBsZXQgYmI7XHJcblxyXG4gICAgICAgIGlmICgodGhpcyBhcyBhbnkpLnByb2Nlc3MgJiYgKHRoaXMgYXMgYW55KS5wcm9jZXNzLnJlbmRlck9iamVjdCkge1xyXG4gICAgICAgICAgbGV0IG1vZGVsID0gKHRoaXMgYXMgYW55KS5wcm9jZXNzLnJlbmRlck9iamVjdDtcclxuICAgICAgICAgIGlmIChtb2RlbCAmJiBtb2RlbC5wcm9wZXJ0aWVzICYmIG1vZGVsLnByb3BlcnRpZXMuYm91bmRpbmdCb3gpIHtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtb2RlbC5wcm9wZXJ0aWVzLmJvdW5kaW5nQm94XCIsIG1vZGVsLnByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICBiYiA9IG1vZGVsLnByb3BlcnRpZXMuYm91bmRpbmdCb3g7XHJcbiAgICAgICAgICAgIGxldCBiYjIgPSBKU19Db21wdXRlX0JvdW5kaW5nYm94X0J5X0tleSh0aGlzLnNjZW5lS2V5KTtcclxuXHJcbiAgICAgICAgICAgIEJvdW5kaW5nQm94LmV4dGVuZChiYiwgYmIyKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGJiID0gSlNfQ29tcHV0ZV9Cb3VuZGluZ2JveF9CeV9LZXkodGhpcy5zY2VuZUtleSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJiID0gSlNfQ29tcHV0ZV9Cb3VuZGluZ2JveF9CeV9LZXkodGhpcy5zY2VuZUtleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbWluID0gbmV3IEZsb2F0NjRBcnJheShbYmJbMF0sIGJiWzFdLCBiYlsyXV0pO1xyXG4gICAgICAgIGxldCBtYXggPSBuZXcgRmxvYXQ2NEFycmF5KFtiYlszXSwgYmJbNF0sIGJiWzVdXSk7XHJcbiAgICAgICAgQ2FsY3VsYXRlTmVhckZhcihjYW1lcmEsIG1pbiwgbWF4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGludGVybmFsRml0V29ybGQodHlwZT86IEVsZW1lbnRUeXBlKSB7XHJcbiAgICBpZiAodGhpcy5fc2NlbmVLZXkgIT0gLTEpIHtcclxuICAgICAgbGV0IGNlbnRlciA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICAgIGxldCBtaW4gPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICBsZXQgbWF4ID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuXHJcbiAgICAgIGlmICh0eXBlKSB7XHJcbiAgICAgICAgbGV0IGJiID0gSlNfQ29tcHV0ZV9Cb3VuZGluZ2JveF9XaXRoX1Zpc2liaWxpdHlfQnlfS2V5KFxyXG4gICAgICAgICAgdGhpcy5fc2NlbmVLZXksXHJcbiAgICAgICAgICBFbGVtZW50VHlwZS5FTEVNRU5UX1RZUEVfRmFjZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbWluWzBdID0gYmJbMF07XHJcbiAgICAgICAgbWluWzFdID0gYmJbMV07XHJcbiAgICAgICAgbWluWzJdID0gYmJbMl07XHJcbiAgICAgICAgbWF4WzBdID0gYmJbM107XHJcbiAgICAgICAgbWF4WzFdID0gYmJbNF07XHJcbiAgICAgICAgbWF4WzJdID0gYmJbNV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGJiID0gSlNfQ29tcHV0ZV9Cb3VuZGluZ2JveF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAgICAgIG1pblswXSA9IGJiWzBdO1xyXG4gICAgICAgIG1pblsxXSA9IGJiWzFdO1xyXG4gICAgICAgIG1pblsyXSA9IGJiWzJdO1xyXG4gICAgICAgIG1heFswXSA9IGJiWzNdO1xyXG4gICAgICAgIG1heFsxXSA9IGJiWzRdO1xyXG4gICAgICAgIG1heFsyXSA9IGJiWzVdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIm1pbjogXCIsIG1pbik7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwibWF4OiBcIiwgbWF4KTtcclxuXHJcbiAgICAgIGlmIChtYXhbMF0gPiBtaW5bMF0gfHwgbWF4WzFdID4gbWluWzFdIHx8IG1heFsyXSA+IG1pblsyXSkge1xyXG4gICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBkaWFnb25hbFZlY3RvciA9IFBvaW50LnN1YnRyYWN0KG1heCwgbWluKTtcclxuICAgICAgICAgIGxldCBkaWFnb25hbExlbmd0aCA9IFZlY3Rvci5tb2R1bGUoZGlhZ29uYWxWZWN0b3IpO1xyXG5cclxuICAgICAgICAgIGNlbnRlclswXSA9IDAuNSAqIChtaW5bMF0gKyBtYXhbMF0pO1xyXG4gICAgICAgICAgY2VudGVyWzFdID0gMC41ICogKG1pblsxXSArIG1heFsxXSk7XHJcbiAgICAgICAgICBjZW50ZXJbMl0gPSAwLjUgKiAobWluWzJdICsgbWF4WzJdKTtcclxuXHJcbiAgICAgICAgICBsZXQgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuXHJcbiAgICAgICAgICBsZXQgbmV3X3Bvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICAgIGxldCBuZXdfdGFyZ2V0ID0gbmV3IEZsb2F0NjRBcnJheShjZW50ZXIpO1xyXG4gICAgICAgICAgLy9sZXQgbmV3X3VwID0gbnVsbDtcclxuICAgICAgICAgIGxldCBuZXdfd2lkdGggPSAyLjA7XHJcbiAgICAgICAgICBsZXQgbmV3X2hlaWdodCA9IDIuMDtcclxuXHJcbiAgICAgICAgICBsZXQgdmlld2luZ1ZlY3RvciA9IERQb2ludC5zdWJ0cmFjdChjYW1lcmEucG9zaXRpb24sIGNhbWVyYS50YXJnZXQpO1xyXG4gICAgICAgICAgRFZlY3Rvci5ub3JtYWxpemUodmlld2luZ1ZlY3Rvcik7XHJcblxyXG4gICAgICAgICAgaWYgKGRpYWdvbmFsTGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgY2FtZXJhIHBvc2l0aW9uIHRvIGxpZSBvbiB0aGUgdmlld2luZyB2ZWN0b3IsIGF0IGEgZGlzdGFuY2Ugb2ZcclxuICAgICAgICAgICAgLy8gMi41ICogZGlhZ29uYWwgbGVuZ3RoIGF3YXkgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBzY2VuZSBjZW50cm9pZFxyXG4gICAgICAgICAgICBuZXdfcG9zaXRpb24gPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICAgICAgICBuZXdfcG9zaXRpb25bMF0gPVxyXG4gICAgICAgICAgICAgIGNlbnRlclswXSArIDIuNSAqIHZpZXdpbmdWZWN0b3JbMF0gKiBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgICAgbmV3X3Bvc2l0aW9uWzFdID1cclxuICAgICAgICAgICAgICBjZW50ZXJbMV0gKyAyLjUgKiB2aWV3aW5nVmVjdG9yWzFdICogZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICAgIG5ld19wb3NpdGlvblsyXSA9XHJcbiAgICAgICAgICAgICAgY2VudGVyWzJdICsgMi41ICogdmlld2luZ1ZlY3RvclsyXSAqIGRpYWdvbmFsTGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgLy8gc2V0IHRoZSBjYW1lcmEgZmllbGQgdG8gYmUgdGhlIGRpYWdvbmFsIGxlbmd0aCBvZiB0aGUgc2NlbmUncyBib3VuZGluZyBib3hcclxuICAgICAgICAgICAgbmV3X3dpZHRoID0gZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICAgIG5ld19oZWlnaHQgPSBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgICAgLy9uZXdfdXAgPSB1cDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5ld19wb3NpdGlvbiA9IGNhbWVyYS5wb3M7XHJcbiAgICAgICAgICAgIC8vbmV3X3VwID0gdXA7XHJcblxyXG4gICAgICAgICAgICBuZXdfd2lkdGggPSBjYW1lcmEud2lkdGg7XHJcbiAgICAgICAgICAgIG5ld19oZWlnaHQgPSBjYW1lcmEuaGVpZ2h0O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBtYXhab29tTGV2ZWwgPSB0aGlzLnpvb21MaW1pdDtcclxuICAgICAgICAgIGlmIChuZXdfd2lkdGggPCBtYXhab29tTGV2ZWwpIHtcclxuICAgICAgICAgICAgbmV3X3dpZHRoID0gbWF4Wm9vbUxldmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG5ld19oZWlnaHQgPCBtYXhab29tTGV2ZWwpIHtcclxuICAgICAgICAgICAgbmV3X2hlaWdodCA9IG1heFpvb21MZXZlbDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgIG5ld193aWR0aCAqPSAyLjA7XHJcbiAgICAgICAgICAgIG5ld19oZWlnaHQgKj0gMi4wO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIEpTX1NldF9DYW1lcmEoXHJcbiAgICAgICAgICAgIG5ld19wb3NpdGlvbixcclxuICAgICAgICAgICAgbmV3X3RhcmdldCxcclxuICAgICAgICAgICAgY2FtZXJhLnVwLFxyXG4gICAgICAgICAgICBuZXdfd2lkdGgsXHJcbiAgICAgICAgICAgIG5ld19oZWlnaHQsXHJcbiAgICAgICAgICAgIGNhbWVyYS5wcm9qZWN0aW9uXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgIC8vIEpTX1NldF9DYW1lcmEoXHJcbiAgICAgICAgICAgIC8vICAgbmV3X3Bvc2l0aW9uLFxyXG4gICAgICAgICAgICAvLyAgIG5ld190YXJnZXQsXHJcbiAgICAgICAgICAgIC8vICAgY2FtZXJhLnVwLFxyXG4gICAgICAgICAgICAvLyAgIG5ld193aWR0aCxcclxuICAgICAgICAgICAgLy8gICBuZXdfaGVpZ2h0LFxyXG4gICAgICAgICAgICAvLyAgIGNhbWVyYS5wcm9qZWN0aW9uXHJcbiAgICAgICAgICAgIC8vICk7XHJcblxyXG4gICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgLy8gbGV0IGFtZF9wb3NpdGlvbiA9IERHZW9tZXRyeU9wZXJhdG9ycy5kaXN0YW5jZVBvaW50KG5ld190YXJnZXQsIHZpZXdpbmdWZWN0b3IsIGRpYWdvbmFsTGVuZ3RoKTtcclxuICAgICAgICAgICAgLy8gbGV0IGFtZF90YXJnZXQgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICAgICAgICAvLyBhbWRfdGFyZ2V0WzBdID0gYW1kX3Bvc2l0aW9uWzBdIC0gdmlld2luZ1ZlY3RvclswXSAqIDAuMDE7XHJcbiAgICAgICAgICAgIC8vIGFtZF90YXJnZXRbMV0gPSBhbWRfcG9zaXRpb25bMV0gLSB2aWV3aW5nVmVjdG9yWzFdICogMC4wMTtcclxuICAgICAgICAgICAgLy8gYW1kX3RhcmdldFsyXSA9IGFtZF9wb3NpdGlvblsyXSAtIHZpZXdpbmdWZWN0b3JbMl0gKiAwLjAxO1xyXG5cclxuICAgICAgICAgICAgLy8gSlNfU2V0X0NhbWVyYShcclxuICAgICAgICAgICAgLy8gICBhbWRfcG9zaXRpb24sXHJcbiAgICAgICAgICAgIC8vICAgYW1kX3RhcmdldCxcclxuICAgICAgICAgICAgLy8gICBjYW1lcmEudXAsXHJcbiAgICAgICAgICAgIC8vICAgbmV3X3dpZHRoLFxyXG4gICAgICAgICAgICAvLyAgIG5ld19oZWlnaHQsXHJcbiAgICAgICAgICAgIC8vICAgY2FtZXJhLnByb2plY3Rpb25cclxuICAgICAgICAgICAgLy8gKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZGlhZ29uYWxMZW5ndGg6IFwiLCBkaWFnb25hbExlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygxKTtcclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfRXh0ZW50KDEsIGRpYWdvbmFsTGVuZ3RoICogMTApO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRpYWdvbmFsTGVuZ3RoIC8gMTA6IFwiLCBkaWFnb25hbExlbmd0aCAvIDEwKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJkaWFnb25hbExlbmd0aCAqIDEwOiBcIiwgZGlhZ29uYWxMZW5ndGggKiAxMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGludGVybmFsRml0V29ybGRCeUJCKGJiOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgIGlmICh0aGlzLl9zY2VuZUtleSAhPSAtMSkge1xyXG4gICAgICBsZXQgY2VudGVyID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgbGV0IG1pbiA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcbiAgICAgIGxldCBtYXggPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG5cclxuICAgICAgbWluWzBdID0gYmJbMF07XHJcbiAgICAgIG1pblsxXSA9IGJiWzFdO1xyXG4gICAgICBtaW5bMl0gPSBiYlsyXTtcclxuICAgICAgbWF4WzBdID0gYmJbM107XHJcbiAgICAgIG1heFsxXSA9IGJiWzRdO1xyXG4gICAgICBtYXhbMl0gPSBiYls1XTtcclxuXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwibWluOiBcIiwgbWluKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJtYXg6IFwiLCBtYXgpO1xyXG5cclxuICAgICAgaWYgKG1heFswXSA+IG1pblswXSB8fCBtYXhbMV0gPiBtaW5bMV0gfHwgbWF4WzJdID4gbWluWzJdKSB7XHJcbiAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl9zY2VuZUtleSk7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IGRpYWdvbmFsVmVjdG9yID0gUG9pbnQuc3VidHJhY3QobWF4LCBtaW4pO1xyXG4gICAgICAgICAgbGV0IGRpYWdvbmFsTGVuZ3RoID0gVmVjdG9yLm1vZHVsZShkaWFnb25hbFZlY3Rvcik7XHJcblxyXG4gICAgICAgICAgY2VudGVyWzBdID0gMC41ICogKG1pblswXSArIG1heFswXSk7XHJcbiAgICAgICAgICBjZW50ZXJbMV0gPSAwLjUgKiAobWluWzFdICsgbWF4WzFdKTtcclxuICAgICAgICAgIGNlbnRlclsyXSA9IDAuNSAqIChtaW5bMl0gKyBtYXhbMl0pO1xyXG5cclxuICAgICAgICAgIGxldCBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG5cclxuICAgICAgICAgIGxldCBuZXdfcG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgICAgbGV0IG5ld190YXJnZXQgPSBuZXcgRmxvYXQ2NEFycmF5KGNlbnRlcik7XHJcbiAgICAgICAgICAvL2xldCBuZXdfdXAgPSBudWxsO1xyXG4gICAgICAgICAgbGV0IG5ld193aWR0aCA9IDIuMDtcclxuICAgICAgICAgIGxldCBuZXdfaGVpZ2h0ID0gMi4wO1xyXG5cclxuICAgICAgICAgIGxldCB2aWV3aW5nVmVjdG9yID0gRFBvaW50LnN1YnRyYWN0KGNhbWVyYS5wb3NpdGlvbiwgY2FtZXJhLnRhcmdldCk7XHJcbiAgICAgICAgICBEVmVjdG9yLm5vcm1hbGl6ZSh2aWV3aW5nVmVjdG9yKTtcclxuXHJcbiAgICAgICAgICBpZiAoZGlhZ29uYWxMZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAvLyByZXNldCBjYW1lcmEgcG9zaXRpb24gdG8gbGllIG9uIHRoZSB2aWV3aW5nIHZlY3RvciwgYXQgYSBkaXN0YW5jZSBvZlxyXG4gICAgICAgICAgICAvLyAyLjUgKiBkaWFnb25hbCBsZW5ndGggYXdheSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIHNjZW5lIGNlbnRyb2lkXHJcbiAgICAgICAgICAgIG5ld19wb3NpdGlvbiA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICAgICAgICAgIG5ld19wb3NpdGlvblswXSA9XHJcbiAgICAgICAgICAgICAgY2VudGVyWzBdICsgMi41ICogdmlld2luZ1ZlY3RvclswXSAqIGRpYWdvbmFsTGVuZ3RoO1xyXG4gICAgICAgICAgICBuZXdfcG9zaXRpb25bMV0gPVxyXG4gICAgICAgICAgICAgIGNlbnRlclsxXSArIDIuNSAqIHZpZXdpbmdWZWN0b3JbMV0gKiBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgICAgbmV3X3Bvc2l0aW9uWzJdID1cclxuICAgICAgICAgICAgICBjZW50ZXJbMl0gKyAyLjUgKiB2aWV3aW5nVmVjdG9yWzJdICogZGlhZ29uYWxMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGNhbWVyYSBmaWVsZCB0byBiZSB0aGUgZGlhZ29uYWwgbGVuZ3RoIG9mIHRoZSBzY2VuZSdzIGJvdW5kaW5nIGJveFxyXG4gICAgICAgICAgICBuZXdfd2lkdGggPSBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgICAgbmV3X2hlaWdodCA9IGRpYWdvbmFsTGVuZ3RoO1xyXG4gICAgICAgICAgICAvL25ld191cCA9IHVwO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbmV3X3Bvc2l0aW9uID0gY2FtZXJhLnBvcztcclxuICAgICAgICAgICAgLy9uZXdfdXAgPSB1cDtcclxuXHJcbiAgICAgICAgICAgIG5ld193aWR0aCA9IGNhbWVyYS53aWR0aDtcclxuICAgICAgICAgICAgbmV3X2hlaWdodCA9IGNhbWVyYS5oZWlnaHQ7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IG1heFpvb21MZXZlbCA9IHRoaXMuem9vbUxpbWl0O1xyXG4gICAgICAgICAgaWYgKG5ld193aWR0aCA8IG1heFpvb21MZXZlbCkge1xyXG4gICAgICAgICAgICBuZXdfd2lkdGggPSBtYXhab29tTGV2ZWw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobmV3X2hlaWdodCA8IG1heFpvb21MZXZlbCkge1xyXG4gICAgICAgICAgICBuZXdfaGVpZ2h0ID0gbWF4Wm9vbUxldmVsO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgbmV3X3dpZHRoICo9IDIuMDtcclxuICAgICAgICAgICAgbmV3X2hlaWdodCAqPSAyLjA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYShcclxuICAgICAgICAgICAgbmV3X3Bvc2l0aW9uLFxyXG4gICAgICAgICAgICBuZXdfdGFyZ2V0LFxyXG4gICAgICAgICAgICBjYW1lcmEudXAsXHJcbiAgICAgICAgICAgIG5ld193aWR0aCxcclxuICAgICAgICAgICAgbmV3X2hlaWdodCxcclxuICAgICAgICAgICAgY2FtZXJhLnByb2plY3Rpb25cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgLy8gSlNfU2V0X0NhbWVyYShcclxuICAgICAgICAgICAgLy8gICBuZXdfcG9zaXRpb24sXHJcbiAgICAgICAgICAgIC8vICAgbmV3X3RhcmdldCxcclxuICAgICAgICAgICAgLy8gICBjYW1lcmEudXAsXHJcbiAgICAgICAgICAgIC8vICAgbmV3X3dpZHRoLFxyXG4gICAgICAgICAgICAvLyAgIG5ld19oZWlnaHQsXHJcbiAgICAgICAgICAgIC8vICAgY2FtZXJhLnByb2plY3Rpb25cclxuICAgICAgICAgICAgLy8gKTtcclxuXHJcbiAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAvLyBsZXQgYW1kX3Bvc2l0aW9uID0gREdlb21ldHJ5T3BlcmF0b3JzLmRpc3RhbmNlUG9pbnQobmV3X3RhcmdldCwgdmlld2luZ1ZlY3RvciwgZGlhZ29uYWxMZW5ndGgpO1xyXG4gICAgICAgICAgICAvLyBsZXQgYW1kX3RhcmdldCA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICAgICAgICAgIC8vIGFtZF90YXJnZXRbMF0gPSBhbWRfcG9zaXRpb25bMF0gLSB2aWV3aW5nVmVjdG9yWzBdICogMC4wMTtcclxuICAgICAgICAgICAgLy8gYW1kX3RhcmdldFsxXSA9IGFtZF9wb3NpdGlvblsxXSAtIHZpZXdpbmdWZWN0b3JbMV0gKiAwLjAxO1xyXG4gICAgICAgICAgICAvLyBhbWRfdGFyZ2V0WzJdID0gYW1kX3Bvc2l0aW9uWzJdIC0gdmlld2luZ1ZlY3RvclsyXSAqIDAuMDE7XHJcblxyXG4gICAgICAgICAgICAvLyBKU19TZXRfQ2FtZXJhKFxyXG4gICAgICAgICAgICAvLyAgIGFtZF9wb3NpdGlvbixcclxuICAgICAgICAgICAgLy8gICBhbWRfdGFyZ2V0LFxyXG4gICAgICAgICAgICAvLyAgIGNhbWVyYS51cCxcclxuICAgICAgICAgICAgLy8gICBuZXdfd2lkdGgsXHJcbiAgICAgICAgICAgIC8vICAgbmV3X2hlaWdodCxcclxuICAgICAgICAgICAgLy8gICBjYW1lcmEucHJvamVjdGlvblxyXG4gICAgICAgICAgICAvLyApO1xyXG5cclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJkaWFnb25hbExlbmd0aDogXCIsIGRpYWdvbmFsTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDEpO1xyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9FeHRlbnQoMSwgZGlhZ29uYWxMZW5ndGggKiAxMCk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZGlhZ29uYWxMZW5ndGggLyAxMDogXCIsIGRpYWdvbmFsTGVuZ3RoIC8gMTApO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRpYWdvbmFsTGVuZ3RoICogMTA6IFwiLCBkaWFnb25hbExlbmd0aCAqIDEwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZml0V29ybGQodHlwZT86IEVsZW1lbnRUeXBlKSB7XHJcbiAgICBpZiAodGhpcy5fc2NlbmVLZXkgIT0gLTEpIHtcclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl9zY2VuZUtleSk7XHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuICAgICAgICBsZXQgY28gPSBjYW1lcmEucG9zaXRpb247XHJcbiAgICAgICAgbGV0IHRvID0gY2FtZXJhLnRhcmdldDtcclxuICAgICAgICBsZXQgdW8gPSBjYW1lcmEudXA7XHJcbiAgICAgICAgbGV0IHdpZHRobyA9IGNhbWVyYS53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0byA9IGNhbWVyYS5oZWlnaHQ7XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxGaXRXb3JsZCh0eXBlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3Ntb290aFRyYW5zaXRpb24pIHtcclxuICAgICAgICAgIGxldCBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG5cclxuICAgICAgICAgIGxldCBjbiA9IGNhbWVyYS5wb3NpdGlvbjtcclxuICAgICAgICAgIGxldCB0biA9IGNhbWVyYS50YXJnZXQ7XHJcbiAgICAgICAgICBsZXQgdW4gPSBjYW1lcmEudXA7XHJcbiAgICAgICAgICBsZXQgd2lkdGhuID0gY2FtZXJhLndpZHRoO1xyXG4gICAgICAgICAgbGV0IGhlaWdodG4gPSBjYW1lcmEuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgIEdzV2ViR0xVdGlsaXR5LnNtb290aFRyYW5zaXRpb25EKFxyXG4gICAgICAgICAgICBjbyxcclxuICAgICAgICAgICAgdG8sXHJcbiAgICAgICAgICAgIHVvLFxyXG4gICAgICAgICAgICB3aWR0aG8sXHJcbiAgICAgICAgICAgIGhlaWdodG8sXHJcbiAgICAgICAgICAgIGNuLFxyXG4gICAgICAgICAgICB0bixcclxuICAgICAgICAgICAgdW4sXHJcbiAgICAgICAgICAgIHdpZHRobixcclxuICAgICAgICAgICAgaGVpZ2h0bixcclxuICAgICAgICAgICAgdGhpc1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHZpZXdlciA9IHRoaXM7XHJcbiAgICAgICAgICAvL+aJp+ihjHNjZW5lQ2FtZXJhQ2hhbmdlZOaJp+ihjOWFiFNldENhbWVyYU5lYXJGYXIuXHJcbiAgICAgICAgICB0aGlzLmV4ZVNjZW5lQ2FtZXJhQ2hhbmdpbmcoQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGUpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgICB0aGlzLmV4ZVNjZW5lQ2FtZXJhQ2hhbmdlZChDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2NhdGVXb3JsZChrZXk6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuX3NjZW5lS2V5ICE9IC0xKSB7XHJcbiAgICAgIGxldCBjZW50ZXIgPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG4gICAgICBsZXQgbWluID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgICAgbGV0IG1heCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcblxyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3NjZW5lS2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIGxldCBiYiA9IEpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveF9CeV9LZXkodGhpcy5fdmlld0tleSwga2V5KTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgYmJbMF0gPT09IDEgJiZcclxuICAgICAgICAgIGJiWzFdID09PSAxICYmXHJcbiAgICAgICAgICBiYlsyXSA9PT0gMSAmJlxyXG4gICAgICAgICAgYmJbM10gPT09IC0xICYmXHJcbiAgICAgICAgICBiYls0XSA9PT0gLTEgJiZcclxuICAgICAgICAgIGJiWzVdID09PSAtMVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJib3VuZGluZ0JveOS4ui0xLS0tMVwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWluWzBdID0gYmJbMF07XHJcbiAgICAgICAgICBtaW5bMV0gPSBiYlsxXTtcclxuICAgICAgICAgIG1pblsyXSA9IGJiWzJdO1xyXG5cclxuICAgICAgICAgIG1heFswXSA9IGJiWzNdO1xyXG4gICAgICAgICAgbWF4WzFdID0gYmJbNF07XHJcbiAgICAgICAgICBtYXhbMl0gPSBiYls1XTtcclxuXHJcbiAgICAgICAgICAvL29yZGVyIHRoZSBwb2ludHNcclxuICAgICAgICAgIGlmIChtaW5bMF0gPiBtYXhbMF0pIHtcclxuICAgICAgICAgICAgbGV0IHRtcDogbnVtYmVyO1xyXG4gICAgICAgICAgICB0bXAgPSBtaW5bMF07XHJcbiAgICAgICAgICAgIG1pblswXSA9IG1heFswXTtcclxuICAgICAgICAgICAgbWF4WzBdID0gdG1wO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG1pblsxXSA+IG1heFsxXSkge1xyXG4gICAgICAgICAgICBsZXQgdG1wOiBudW1iZXI7XHJcbiAgICAgICAgICAgIHRtcCA9IG1pblsxXTtcclxuICAgICAgICAgICAgbWluWzFdID0gbWF4WzFdO1xyXG4gICAgICAgICAgICBtYXhbMV0gPSB0bXA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobWluWzJdID4gbWF4WzJdKSB7XHJcbiAgICAgICAgICAgIGxldCB0bXA6IG51bWJlcjtcclxuICAgICAgICAgICAgdG1wID0gbWluWzJdO1xyXG4gICAgICAgICAgICBtaW5bMl0gPSBtYXhbMl07XHJcbiAgICAgICAgICAgIG1heFsyXSA9IHRtcDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL2NvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgYmJveCBkaWFnb25hbCB2ZWN0b3JcclxuICAgICAgICAgIC8vdGhpcyB3aWxsIGJlIHVzZWQgdG8gbWFrZSB0aGUgY2FtZXJhIGZpZWxkIGEgYml0IGxhcmdlclxyXG4gICAgICAgICAgLy90byBlbnN1cmUgdGhhdCBvYmplY3RzIGJldHdlZW4gdGhlIGNhbWVyYSBwb3NpdGlvbiBhbmQgdGFyZ2V0XHJcbiAgICAgICAgICAvL3dpbGwgc3RpbGwgbm90IGdldCBjbGlwcGVkICh0aGlzIGlzIGZvciBwZXJzcGVjdGl2ZSB2aWV3aW5nIG1vZGUpXHJcblxyXG4gICAgICAgICAgbGV0IGRpYWdvbmFsVmVjdG9yID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgICAgICAgIG1heFswXSAtIG1pblswXSxcclxuICAgICAgICAgICAgbWF4WzFdIC0gbWluWzFdLFxyXG4gICAgICAgICAgICBtYXhbMl0gLSBtaW5bMl0sXHJcbiAgICAgICAgICBdKTtcclxuICAgICAgICAgIGxldCBkaWFnb25hbExlbmd0aCA9IFZlY3Rvci5tb2R1bGUoZGlhZ29uYWxWZWN0b3IpO1xyXG5cclxuICAgICAgICAgIGNlbnRlclswXSA9IDAuNSAqIChtaW5bMF0gKyBtYXhbMF0pO1xyXG4gICAgICAgICAgY2VudGVyWzFdID0gMC41ICogKG1pblsxXSArIG1heFsxXSk7XHJcbiAgICAgICAgICBjZW50ZXJbMl0gPSAwLjUgKiAobWluWzJdICsgbWF4WzJdKTtcclxuXHJcbiAgICAgICAgICBsZXQgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuXHJcbiAgICAgICAgICBsZXQgY28gPSBjYW1lcmEucG9zaXRpb247XHJcbiAgICAgICAgICBsZXQgdG8gPSBjYW1lcmEudGFyZ2V0O1xyXG4gICAgICAgICAgbGV0IHVvID0gY2FtZXJhLnVwO1xyXG4gICAgICAgICAgbGV0IHdpZHRobyA9IGNhbWVyYS53aWR0aDtcclxuICAgICAgICAgIGxldCBoZWlnaHRvID0gY2FtZXJhLmhlaWdodDtcclxuXHJcbiAgICAgICAgICAvL2RvdWJsZVtdIHBvc2l0aW9uO1xyXG4gICAgICAgICAgLy9kb3VibGVbXSB0YXJnZXQ7XHJcbiAgICAgICAgICAvL2RvdWJsZVtdIHVwO1xyXG4gICAgICAgICAgLy9kb3VibGUgZmllbGR4LCBmaWVsZHk7XHJcbiAgICAgICAgICAvL3N0cmluZyBwcm9qO1xyXG5cclxuICAgICAgICAgIC8vR0NTLlNob3dfQ2FtZXJhKG91dCBwb3NpdGlvbiwgb3V0IHRhcmdldCwgb3V0IHVwLCBvdXQgZmllbGR4LCBvdXQgZmllbGR5LCBvdXQgcHJvaik7XHJcblxyXG4gICAgICAgICAgLy8gbm93IHdlIGRldGVybWluZSB0aGUgbmV3IGNhbWVyYSBkZWZpbml0aW9uXHJcbiAgICAgICAgICBsZXQgY24gPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICAgICAgbGV0IHRuID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuICAgICAgICAgIGxldCB1biA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICAgICAgICBsZXQgd2lkdGhuLCBoZWlnaHRuOiBudW1iZXI7XHJcblxyXG4gICAgICAgICAgaWYgKGRpYWdvbmFsTGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgdG5bMF0gPSBjZW50ZXJbMF07XHJcbiAgICAgICAgICAgIHRuWzFdID0gY2VudGVyWzFdO1xyXG4gICAgICAgICAgICB0blsyXSA9IGNlbnRlclsyXTtcclxuXHJcbiAgICAgICAgICAgIGxldCB2aWV3aW5nVmVjdG9yID0gbmV3IEZsb2F0NjRBcnJheShbXHJcbiAgICAgICAgICAgICAgY29bMF0gLSB0b1swXSxcclxuICAgICAgICAgICAgICBjb1sxXSAtIHRvWzFdLFxyXG4gICAgICAgICAgICAgIGNvWzJdIC0gdG9bMl0sXHJcbiAgICAgICAgICAgIF0pO1xyXG5cclxuICAgICAgICAgICAgRFZlY3Rvci5ub3JtYWxpemUodmlld2luZ1ZlY3Rvcik7XHJcblxyXG4gICAgICAgICAgICAvLyByZXNldCBjYW1lcmEgcG9zaXRpb24gdG8gbGllIG9uIHRoZSB2aWV3aW5nIHZlY3RvciwgYXQgYSBkaXN0YW5jZSBvZlxyXG4gICAgICAgICAgICAvLyAyLjUgKiBkaWFnb25hbCBsZW5ndGggYXdheSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIHNjZW5lIGNlbnRyb2lkXHJcbiAgICAgICAgICAgIGNuWzBdID0gY2VudGVyWzBdICsgMi41ICogdmlld2luZ1ZlY3RvclswXSAqIGRpYWdvbmFsTGVuZ3RoO1xyXG4gICAgICAgICAgICBjblsxXSA9IGNlbnRlclsxXSArIDIuNSAqIHZpZXdpbmdWZWN0b3JbMV0gKiBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgICAgY25bMl0gPSBjZW50ZXJbMl0gKyAyLjUgKiB2aWV3aW5nVmVjdG9yWzJdICogZGlhZ29uYWxMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGNhbWVyYSBmaWVsZCB0byBiZSB0aGUgZGlhZ29uYWwgbGVuZ3RoIG9mIHRoZSBzY2VuZSdzIGJvdW5kaW5nIGJveFxyXG4gICAgICAgICAgICB3aWR0aG4gPSBkaWFnb25hbExlbmd0aDtcclxuICAgICAgICAgICAgaGVpZ2h0biA9IGRpYWdvbmFsTGVuZ3RoO1xyXG4gICAgICAgICAgICB1biA9IHVvO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIG9ubHkgY2hhbmdlIHRoZSB0YXJnZXRcclxuICAgICAgICAgICAgdG5bMF0gPSBjZW50ZXJbMF07XHJcbiAgICAgICAgICAgIHRuWzFdID0gY2VudGVyWzFdO1xyXG4gICAgICAgICAgICB0blsyXSA9IGNlbnRlclsyXTtcclxuXHJcbiAgICAgICAgICAgIGNuID0gY287XHJcbiAgICAgICAgICAgIHVuID0gdW87XHJcblxyXG4gICAgICAgICAgICB3aWR0aG4gPSB3aWR0aG87XHJcbiAgICAgICAgICAgIGhlaWdodG4gPSBoZWlnaHRvO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBtYXhab29tTGV2ZWwgPSB0aGlzLnpvb21MaW1pdDtcclxuICAgICAgICAgIGlmICh3aWR0aG4gPCBtYXhab29tTGV2ZWwpIHtcclxuICAgICAgICAgICAgd2lkdGhuID0gbWF4Wm9vbUxldmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGhlaWdodG4gPCBtYXhab29tTGV2ZWwpIHtcclxuICAgICAgICAgICAgaGVpZ2h0biA9IG1heFpvb21MZXZlbDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgIHdpZHRobiAqPSAyLjA7XHJcbiAgICAgICAgICAgIGhlaWdodG4gKj0gMi4wO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIEpTX1NldF9DYW1lcmEoY24sIHRuLCB1biwgd2lkdGhuLCBoZWlnaHRuLCBjYW1lcmEucHJvamVjdGlvbik7XHJcbiAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3Ntb290aFRyYW5zaXRpb24pIHtcclxuICAgICAgICAgICAgbGV0IGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcblxyXG4gICAgICAgICAgICBjbiA9IGNhbWVyYS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgdG4gPSBjYW1lcmEudGFyZ2V0O1xyXG4gICAgICAgICAgICB1biA9IGNhbWVyYS51cDtcclxuICAgICAgICAgICAgd2lkdGhuID0gY2FtZXJhLndpZHRoO1xyXG4gICAgICAgICAgICBoZWlnaHRuID0gY2FtZXJhLmhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIEdzV2ViR0xVdGlsaXR5LnNtb290aFRyYW5zaXRpb25EKFxyXG4gICAgICAgICAgICAgIGNvLFxyXG4gICAgICAgICAgICAgIHRvLFxyXG4gICAgICAgICAgICAgIHVvLFxyXG4gICAgICAgICAgICAgIHdpZHRobyxcclxuICAgICAgICAgICAgICBoZWlnaHRvLFxyXG4gICAgICAgICAgICAgIGNuLFxyXG4gICAgICAgICAgICAgIHRuLFxyXG4gICAgICAgICAgICAgIHVuLFxyXG4gICAgICAgICAgICAgIHdpZHRobixcclxuICAgICAgICAgICAgICBoZWlnaHRuLFxyXG4gICAgICAgICAgICAgIHRoaXNcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvY2F0ZVdvcmxkQnlEYXRhKHRhcmdldDogRmxvYXQzMkFycmF5LCBtaW46IG51bWJlcltdLCBtYXg6IG51bWJlcltdKSB7XHJcbiAgICBpZiAodGhpcy5fc2NlbmVLZXkgIT0gLTEpIHtcclxuICAgICAgbGV0IGNlbnRlciA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XHJcblxyXG4gICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3NjZW5lS2V5KTtcclxuICAgICAge1xyXG4gICAgICAgIC8vb3JkZXIgdGhlIHBvaW50c1xyXG4gICAgICAgIGlmIChtaW5bMF0gPiBtYXhbMF0pIHtcclxuICAgICAgICAgIGxldCB0bXA6IG51bWJlcjtcclxuICAgICAgICAgIHRtcCA9IG1pblswXTtcclxuICAgICAgICAgIG1pblswXSA9IG1heFswXTtcclxuICAgICAgICAgIG1heFswXSA9IHRtcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1pblsxXSA+IG1heFsxXSkge1xyXG4gICAgICAgICAgbGV0IHRtcDogbnVtYmVyO1xyXG4gICAgICAgICAgdG1wID0gbWluWzFdO1xyXG4gICAgICAgICAgbWluWzFdID0gbWF4WzFdO1xyXG4gICAgICAgICAgbWF4WzFdID0gdG1wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWluWzJdID4gbWF4WzJdKSB7XHJcbiAgICAgICAgICBsZXQgdG1wOiBudW1iZXI7XHJcbiAgICAgICAgICB0bXAgPSBtaW5bMl07XHJcbiAgICAgICAgICBtaW5bMl0gPSBtYXhbMl07XHJcbiAgICAgICAgICBtYXhbMl0gPSB0bXA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgYmJveCBkaWFnb25hbCB2ZWN0b3JcclxuICAgICAgICAvL3RoaXMgd2lsbCBiZSB1c2VkIHRvIG1ha2UgdGhlIGNhbWVyYSBmaWVsZCBhIGJpdCBsYXJnZXJcclxuICAgICAgICAvL3RvIGVuc3VyZSB0aGF0IG9iamVjdHMgYmV0d2VlbiB0aGUgY2FtZXJhIHBvc2l0aW9uIGFuZCB0YXJnZXRcclxuICAgICAgICAvL3dpbGwgc3RpbGwgbm90IGdldCBjbGlwcGVkICh0aGlzIGlzIGZvciBwZXJzcGVjdGl2ZSB2aWV3aW5nIG1vZGUpXHJcblxyXG4gICAgICAgIGxldCBkaWFnb25hbFZlY3RvciA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAgICAgbWF4WzBdIC0gbWluWzBdLFxyXG4gICAgICAgICAgbWF4WzFdIC0gbWluWzFdLFxyXG4gICAgICAgICAgbWF4WzJdIC0gbWluWzJdLFxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIGxldCBkaWFnb25hbExlbmd0aCA9IFZlY3Rvci5tb2R1bGUoZGlhZ29uYWxWZWN0b3IpO1xyXG5cclxuICAgICAgICBjZW50ZXJbMF0gPSAwLjUgKiAobWluWzBdICsgbWF4WzBdKTtcclxuICAgICAgICBjZW50ZXJbMV0gPSAwLjUgKiAobWluWzFdICsgbWF4WzFdKTtcclxuICAgICAgICBjZW50ZXJbMl0gPSAwLjUgKiAobWluWzJdICsgbWF4WzJdKTtcclxuXHJcbiAgICAgICAgLy90YXJnZXQgY2VudGVyIG9mZnNldDtcclxuICAgICAgICBsZXQgb2Zmc2V0ID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgICAgICB0YXJnZXRbMF0gLSBjZW50ZXJbMF0sXHJcbiAgICAgICAgICB0YXJnZXRbMV0gLSBjZW50ZXJbMV0sXHJcbiAgICAgICAgICB0YXJnZXRbMl0gLSBjZW50ZXJbMl0sXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgIGNlbnRlciA9IHRhcmdldDtcclxuICAgICAgICBkaWFnb25hbExlbmd0aCArPSBWZWN0b3IubW9kdWxlKG9mZnNldCk7XHJcblxyXG4gICAgICAgIGxldCBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG5cclxuICAgICAgICBsZXQgY28gPSBjYW1lcmEucG9zaXRpb247XHJcbiAgICAgICAgbGV0IHRvID0gY2FtZXJhLnRhcmdldDtcclxuICAgICAgICBsZXQgdW8gPSBjYW1lcmEudXA7XHJcbiAgICAgICAgbGV0IHdpZHRobyA9IGNhbWVyYS53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0byA9IGNhbWVyYS5oZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIG5vdyB3ZSBkZXRlcm1pbmUgdGhlIG5ldyBjYW1lcmEgZGVmaW5pdGlvblxyXG4gICAgICAgIGxldCBjbiA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XHJcbiAgICAgICAgbGV0IHRuID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuICAgICAgICBsZXQgdW4gPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICAgIGxldCB3aWR0aG4sIGhlaWdodG46IG51bWJlcjtcclxuXHJcbiAgICAgICAgaWYgKGRpYWdvbmFsTGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgIHRuWzBdID0gY2VudGVyWzBdO1xyXG4gICAgICAgICAgdG5bMV0gPSBjZW50ZXJbMV07XHJcbiAgICAgICAgICB0blsyXSA9IGNlbnRlclsyXTtcclxuXHJcbiAgICAgICAgICBsZXQgdmlld2luZ1ZlY3RvciA9IG5ldyBGbG9hdDY0QXJyYXkoW1xyXG4gICAgICAgICAgICBjb1swXSAtIHRvWzBdLFxyXG4gICAgICAgICAgICBjb1sxXSAtIHRvWzFdLFxyXG4gICAgICAgICAgICBjb1syXSAtIHRvWzJdLFxyXG4gICAgICAgICAgXSk7XHJcblxyXG4gICAgICAgICAgRFZlY3Rvci5ub3JtYWxpemUodmlld2luZ1ZlY3Rvcik7XHJcblxyXG4gICAgICAgICAgLy8gcmVzZXQgY2FtZXJhIHBvc2l0aW9uIHRvIGxpZSBvbiB0aGUgdmlld2luZyB2ZWN0b3IsIGF0IGEgZGlzdGFuY2Ugb2ZcclxuICAgICAgICAgIC8vIDIuNSAqIGRpYWdvbmFsIGxlbmd0aCBhd2F5IGZyb20gdGhlIGNlbnRlciBvZiB0aGUgc2NlbmUgY2VudHJvaWRcclxuICAgICAgICAgIGNuWzBdID0gY2VudGVyWzBdICsgMi41ICogdmlld2luZ1ZlY3RvclswXSAqIGRpYWdvbmFsTGVuZ3RoO1xyXG4gICAgICAgICAgY25bMV0gPSBjZW50ZXJbMV0gKyAyLjUgKiB2aWV3aW5nVmVjdG9yWzFdICogZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICBjblsyXSA9IGNlbnRlclsyXSArIDIuNSAqIHZpZXdpbmdWZWN0b3JbMl0gKiBkaWFnb25hbExlbmd0aDtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgdGhlIGNhbWVyYSBmaWVsZCB0byBiZSB0aGUgZGlhZ29uYWwgbGVuZ3RoIG9mIHRoZSBzY2VuZSdzIGJvdW5kaW5nIGJveFxyXG4gICAgICAgICAgd2lkdGhuID0gZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICBoZWlnaHRuID0gZGlhZ29uYWxMZW5ndGg7XHJcbiAgICAgICAgICB1biA9IHVvO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugb25seSBjaGFuZ2UgdGhlIHRhcmdldFxyXG4gICAgICAgICAgdG5bMF0gPSBjZW50ZXJbMF07XHJcbiAgICAgICAgICB0blsxXSA9IGNlbnRlclsxXTtcclxuICAgICAgICAgIHRuWzJdID0gY2VudGVyWzJdO1xyXG5cclxuICAgICAgICAgIGNuID0gY287XHJcbiAgICAgICAgICB1biA9IHVvO1xyXG5cclxuICAgICAgICAgIHdpZHRobiA9IHdpZHRobztcclxuICAgICAgICAgIGhlaWdodG4gPSBoZWlnaHRvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1heFpvb21MZXZlbCA9IHRoaXMuem9vbUxpbWl0O1xyXG4gICAgICAgIGlmICh3aWR0aG4gPCBtYXhab29tTGV2ZWwpIHtcclxuICAgICAgICAgIHdpZHRobiA9IG1heFpvb21MZXZlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGhlaWdodG4gPCBtYXhab29tTGV2ZWwpIHtcclxuICAgICAgICAgIGhlaWdodG4gPSBtYXhab29tTGV2ZWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBKU19TZXRfQ2FtZXJhKGNuLCB0biwgdW4sIHdpZHRobiwgaGVpZ2h0biwgY2FtZXJhLnByb2plY3Rpb24pO1xyXG4gICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAvLyBKU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5leGVTY2VuZUNhbWVyYUNoYW5naW5nKENhbWVyYUNoYW5nZVR5cGUuUm90YXRlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3Ntb290aFRyYW5zaXRpb24pIHtcclxuICAgICAgICAgIGxldCBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG5cclxuICAgICAgICAgIGNuID0gY2FtZXJhLnBvc2l0aW9uO1xyXG4gICAgICAgICAgdG4gPSBjYW1lcmEudGFyZ2V0O1xyXG4gICAgICAgICAgdW4gPSBjYW1lcmEudXA7XHJcbiAgICAgICAgICB3aWR0aG4gPSBjYW1lcmEud2lkdGg7XHJcbiAgICAgICAgICBoZWlnaHRuID0gY2FtZXJhLmhlaWdodDtcclxuXHJcbiAgICAgICAgICBHc1dlYkdMVXRpbGl0eS5zbW9vdGhUcmFuc2l0aW9uRChcclxuICAgICAgICAgICAgY28sXHJcbiAgICAgICAgICAgIHRvLFxyXG4gICAgICAgICAgICB1byxcclxuICAgICAgICAgICAgd2lkdGhvLFxyXG4gICAgICAgICAgICBoZWlnaHRvLFxyXG4gICAgICAgICAgICBjbixcclxuICAgICAgICAgICAgdG4sXHJcbiAgICAgICAgICAgIHVuLFxyXG4gICAgICAgICAgICB3aWR0aG4sXHJcbiAgICAgICAgICAgIGhlaWdodG4sXHJcbiAgICAgICAgICAgIHRoaXNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaWV3TW9kZShtb2RlOiBWaWV3TW9kZSwgZml0V29ybGQ/OiBib29sZWFuLCBiYj86IEZsb2F0MzJBcnJheSkge1xyXG4gICAgaWYgKHRoaXMuX2NhbWVyYU9yaWVudGF0aW9uRml4ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjYW1lcmE6IGFueTtcclxuICAgIGxldCBjbztcclxuICAgIGxldCB0bztcclxuICAgIGxldCB1bztcclxuICAgIGxldCB3aWR0aG87XHJcbiAgICBsZXQgaGVpZ2h0bztcclxuXHJcbiAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHRoaXMuX3NjZW5lS2V5KTtcclxuICAgIHtcclxuICAgICAgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuXHJcbiAgICAgIGNvID0gY2FtZXJhLnBvc2l0aW9uO1xyXG4gICAgICB0byA9IGNhbWVyYS50YXJnZXQ7XHJcbiAgICAgIHVvID0gY2FtZXJhLnVwO1xyXG4gICAgICB3aWR0aG8gPSBjYW1lcmEud2lkdGg7XHJcbiAgICAgIGhlaWdodG8gPSBjYW1lcmEuaGVpZ2h0O1xyXG5cclxuICAgICAgaWYgKGZpdFdvcmxkKSB7XHJcbiAgICAgICAgaWYgKGJiKSB7XHJcbiAgICAgICAgICB0aGlzLmludGVybmFsRml0V29ybGRCeUJCKGJiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5pbnRlcm5hbEZpdFdvcmxkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG5cclxuICAgICAgbGV0IHRhcmdldCA9IGNhbWVyYS50YXJnZXQ7XHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IGNhbWVyYS5wb3NpdGlvbjtcclxuXHJcbiAgICAgIGxldCB2aWV3ID0gRFBvaW50LnN1YnRyYWN0KHBvc2l0aW9uLCB0YXJnZXQpO1xyXG4gICAgICBsZXQgbGVuZ3RoID0gRFZlY3Rvci5tb2R1bGUodmlldyk7XHJcblxyXG4gICAgICBzd2l0Y2ggKG1vZGUpIHtcclxuICAgICAgICBjYXNlIFZpZXdNb2RlLlhZOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSArIGxlbmd0aDtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gLSBsZW5ndGg7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMS4wLCAwLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5ZWDpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gLSBsZW5ndGg7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdICsgbGVuZ3RoO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDEuMCwgMC4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuWFo6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gLSBsZW5ndGg7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gKyBsZW5ndGg7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLlpYOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdICsgbGVuZ3RoO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdIC0gbGVuZ3RoO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl07XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5ZWjpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdICsgbGVuZ3RoO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl07XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gLSBsZW5ndGg7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuWlk6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSAtIGxlbmd0aDtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdICsgbGVuZ3RoO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLklzbzpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IG5ld0xlbiA9IGxlbmd0aCAqIDAuNTc3NDtcclxuXHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdICsgbmV3TGVuO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSAtIG5ld0xlbjtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gKyBuZXdMZW47XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5ZVXBJc286XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBuZXdMZW4gPSBsZW5ndGggKiAwLjU3NzQ7XHJcblxyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSArIG5ld0xlbjtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gKyBuZXdMZW47XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdICsgbmV3TGVuO1xyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5FTjpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLk5XOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl07XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuV1M6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl07XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5TRTpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLlRvcEU6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Cb3R0b21FOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuVG9wTjpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLkJvdHRvbU46XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Ub3BXOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuQm90dG9tVzpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLlRvcFM6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Cb3R0b21TOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF07XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuVG9wRU46XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLkJvdHRvbUVOOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Ub3BOVzpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuQm90dG9tTlc6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSArIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdIC0gKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLlRvcFdTOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBWaWV3TW9kZS5Cb3R0b21XUzpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy9pZiAodGhpcy5IYW5kZWRuZXNzTW9kZSA9PSBIYW5kZWRuZXNzLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzBdID0gdGFyZ2V0WzBdICsgbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMV0gPSB0YXJnZXRbMV0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsyXSA9IHRhcmdldFsyXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMF0gPSB0YXJnZXRbMF0gLSAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsxXSA9IHRhcmdldFsxXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzJdID0gdGFyZ2V0WzJdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKFswLjAsIDAuMCwgMS4wXSk7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICAgICAgICAvL0pTX0tlZXBfQ2FtZXJhX1JhdGlvKDEuMClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgVmlld01vZGUuVG9wU0U6XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vaWYgKHRoaXMuSGFuZGVkbmVzc01vZGUgPT0gSGFuZGVkbmVzcy5SaWdodCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvblswXSA9IHRhcmdldFswXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzFdID0gdGFyZ2V0WzFdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgcG9zaXRpb25bMl0gPSB0YXJnZXRbMl0gKyBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzBdID0gdGFyZ2V0WzBdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMV0gPSB0YXJnZXRbMV0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVsyXSA9IHRhcmdldFsyXSAtIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcChbMC4wLCAwLjAsIDEuMF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgICAgIEpTX0tlZXBfQ2FtZXJhX1JhdGlvKDIuNSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFZpZXdNb2RlLkJvdHRvbVNFOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvL2lmICh0aGlzLkhhbmRlZG5lc3NNb2RlID09IEhhbmRlZG5lc3MuUmlnaHQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25bMF0gPSB0YXJnZXRbMF0gLSBsZW5ndGggLyBNYXRoLnNxcnQoMi4wKSAvIE1hdGguc3FydCgyLjApO1xyXG4gICAgICAgICAgICBwb3NpdGlvblsxXSA9IHRhcmdldFsxXSAtIGxlbmd0aCAvIE1hdGguc3FydCgyLjApIC8gTWF0aC5zcXJ0KDIuMCk7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uWzJdID0gdGFyZ2V0WzJdIC0gbGVuZ3RoIC8gTWF0aC5zcXJ0KDIuMCkgLyBNYXRoLnNxcnQoMi4wKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgIGNhbWVyYVswXSA9IHRhcmdldFswXSArIChmbG9hdCkobGVuZ3RoIC8gU3lzdGVtLk1hdGguU3FydCgyLjApIC8gU3lzdGVtLk1hdGguU3FydCgyLjApKTtcclxuICAgICAgICAgICAgLy8gICAgY2FtZXJhWzFdID0gdGFyZ2V0WzFdICsgKGZsb2F0KShsZW5ndGggLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkgLyBTeXN0ZW0uTWF0aC5TcXJ0KDIuMCkpO1xyXG4gICAgICAgICAgICAvLyAgICBjYW1lcmFbMl0gPSB0YXJnZXRbMl0gKyAoZmxvYXQpKGxlbmd0aCAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSAvIFN5c3RlbS5NYXRoLlNxcnQoMi4wKSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAoWzAuMCwgMC4wLCAxLjBdKTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwib3J0aG9ncmFwaGljXCIpIHtcclxuICAgICAgICAgICAgICBKU19LZWVwX0NhbWVyYV9SYXRpbygyLjUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgICAgIC8vSlNfS2VlcF9DYW1lcmFfUmF0aW8oMS4wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Ntb290aFRyYW5zaXRpb24pIHtcclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl9zY2VuZUtleSk7XHJcbiAgICAgIHtcclxuICAgICAgICBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG4gICAgICB9XHJcbiAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAgIGxldCBjbiA9IGNhbWVyYS5wb3NpdGlvbjtcclxuICAgICAgbGV0IHRuID0gY2FtZXJhLnRhcmdldDtcclxuICAgICAgbGV0IHVuID0gY2FtZXJhLnVwO1xyXG4gICAgICBsZXQgd2lkdGhuID0gY2FtZXJhLndpZHRoO1xyXG4gICAgICBsZXQgaGVpZ2h0biA9IGNhbWVyYS5oZWlnaHQ7XHJcblxyXG4gICAgICBHc1dlYkdMVXRpbGl0eS5zbW9vdGhUcmFuc2l0aW9uRChcclxuICAgICAgICBjbyxcclxuICAgICAgICB0byxcclxuICAgICAgICB1byxcclxuICAgICAgICB3aWR0aG8sXHJcbiAgICAgICAgaGVpZ2h0byxcclxuICAgICAgICBjbixcclxuICAgICAgICB0bixcclxuICAgICAgICB1bixcclxuICAgICAgICB3aWR0aG4sXHJcbiAgICAgICAgaGVpZ2h0bixcclxuICAgICAgICB0aGlzXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdmlld2VyID0gdGhpcztcclxuICAgICAgLy/miafooYxzY2VuZUNhbWVyYUNoYW5nZWTmiafooYzlhYhTZXRDYW1lcmFOZWFyRmFyLlxyXG4gICAgICB0aGlzLmV4ZVNjZW5lQ2FtZXJhQ2hhbmdpbmcoXHJcbiAgICAgICAgQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGUgfCBDYW1lcmFDaGFuZ2VUeXBlLlNjYWxlXHJcbiAgICAgICk7XHJcbiAgICAgIHZpZXdlci51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgIHRoaXMuZXhlU2NlbmVDYW1lcmFDaGFuZ2VkKFxyXG4gICAgICAgIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlIHwgQ2FtZXJhQ2hhbmdlVHlwZS5TY2FsZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gaWYgKGZpdFdvcmxkKSB7XHJcbiAgICAgIC8vICAgbGV0IHZpZXdlciA9IHRoaXM7XHJcbiAgICAgIC8vICAgLy/miafooYxzY2VuZUNhbWVyYUNoYW5nZWTmiafooYzlhYhTZXRDYW1lcmFOZWFyRmFyLlxyXG4gICAgICAvLyAgIHRoaXMudXBkYXRlQ2FtZXJhTmVhckZhcigpO1xyXG5cclxuICAgICAgLy8gICB2aWV3ZXIudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAvLyAgIHRoaXMuc2NlbmVDYW1lcmFDaGFuZ2VkLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBGdW5jdGlvbikge1xyXG4gICAgICAvLyAgICAgdmFsdWUodmlld2VyLCBDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSB8IENhbWVyYUNoYW5nZVR5cGUuU2NhbGUpO1xyXG4gICAgICAvLyAgIH0pO1xyXG4gICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAvLyAgIGxldCB2aWV3ZXIgPSB0aGlzO1xyXG4gICAgICAvLyAgIC8v5omn6KGMc2NlbmVDYW1lcmFDaGFuZ2Vk5omn6KGM5YWIU2V0Q2FtZXJhTmVhckZhci5cclxuICAgICAgLy8gICB0aGlzLnVwZGF0ZUNhbWVyYU5lYXJGYXIoKTtcclxuICAgICAgLy8gICB0aGlzLnNjZW5lQ2FtZXJhQ2hhbmdlZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogRnVuY3Rpb24pIHtcclxuICAgICAgLy8gICAgIHZhbHVlKHZpZXdlciwgQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGUpO1xyXG4gICAgICAvLyAgIH0pO1xyXG5cclxuICAgICAgLy8gICB2aWV3ZXIudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAvLyB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2NlbmVDYW1lcmEoXHJcbiAgICBwb3NpdGluOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgIHRhcmdldDogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICB1cDogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICB3aWR0aD86IG51bWJlcixcclxuICAgIGhlaWdodD86IG51bWJlclxyXG4gICkge1xyXG4gICAgbGV0IGNhbWVyYTogYW55O1xyXG4gICAgbGV0IGNvO1xyXG4gICAgbGV0IHRvO1xyXG4gICAgbGV0IHVvO1xyXG4gICAgbGV0IHdpZHRobztcclxuICAgIGxldCBoZWlnaHRvO1xyXG4gICAgbGV0IHByb2o7XHJcblxyXG4gICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl9zY2VuZUtleSk7XHJcbiAgICB7XHJcbiAgICAgIGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcblxyXG4gICAgICBjbyA9IGNhbWVyYS5wb3NpdGlvbjtcclxuICAgICAgdG8gPSBjYW1lcmEudGFyZ2V0O1xyXG4gICAgICB1byA9IGNhbWVyYS51cDtcclxuICAgICAgd2lkdGhvID0gY2FtZXJhLndpZHRoO1xyXG4gICAgICBoZWlnaHRvID0gY2FtZXJhLmhlaWdodDtcclxuICAgICAgcHJvaiA9IGNhbWVyYS5wcm9qZWN0aW9uO1xyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgIGlmICh0aGlzLl9zbW9vdGhUcmFuc2l0aW9uKSB7XHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKHdpZHRoICYmIGhlaWdodCkge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYShwb3NpdGluLCB0YXJnZXQsIHVwLCB3aWR0aCwgaGVpZ2h0LCBwcm9qKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYShwb3NpdGluLCB0YXJnZXQsIHVwLCB3aWR0aG8sIGhlaWdodG8sIHByb2opO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYS5wcm9qZWN0aW9uID09IFwicGVyc3BlY3RpdmVcIikge1xyXG4gICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcbiAgICAgIH1cclxuICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgbGV0IGNuID0gY2FtZXJhLnBvc2l0aW9uO1xyXG4gICAgICBsZXQgdG4gPSBjYW1lcmEudGFyZ2V0O1xyXG4gICAgICBsZXQgdW4gPSBjYW1lcmEudXA7XHJcbiAgICAgIGxldCB3aWR0aG4gPSBjYW1lcmEud2lkdGg7XHJcbiAgICAgIGxldCBoZWlnaHRuID0gY2FtZXJhLmhlaWdodDtcclxuXHJcbiAgICAgIEdzV2ViR0xVdGlsaXR5LnNtb290aFRyYW5zaXRpb25EKFxyXG4gICAgICAgIGNvLFxyXG4gICAgICAgIHRvLFxyXG4gICAgICAgIHVvLFxyXG4gICAgICAgIHdpZHRobyxcclxuICAgICAgICBoZWlnaHRvLFxyXG4gICAgICAgIGNuLFxyXG4gICAgICAgIHRuLFxyXG4gICAgICAgIHVuLFxyXG4gICAgICAgIHdpZHRobixcclxuICAgICAgICBoZWlnaHRuLFxyXG4gICAgICAgIHRoaXNcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKHdpZHRoICYmIGhlaWdodCkge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYShwb3NpdGluLCB0YXJnZXQsIHVwLCB3aWR0aCwgaGVpZ2h0LCBwcm9qKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYShwb3NpdGluLCB0YXJnZXQsIHVwLCB3aWR0aG8sIGhlaWdodG8sIHByb2opO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByb2ogPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICAgICAgSlNfS2VlcF9DYW1lcmFfUmF0aW8oMi41KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy9KU19LZWVwX0NhbWVyYV9SYXRpbygxLjApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICBsZXQgdmlld2VyID0gdGhpcztcclxuICAgICAgLy/miafooYxzY2VuZUNhbWVyYUNoYW5nZWTmiafooYzlhYhTZXRDYW1lcmFOZWFyRmFyLlxyXG4gICAgICB0aGlzLmV4ZVNjZW5lQ2FtZXJhQ2hhbmdpbmcoXHJcbiAgICAgICAgQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGUgfCBDYW1lcmFDaGFuZ2VUeXBlLlNjYWxlXHJcbiAgICAgICk7XHJcbiAgICAgIHZpZXdlci51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgIC8vIHRoaXMuZXhlU2NlbmVDYW1lcmFDaGFuZ2VkKFxyXG4gICAgICAvLyAgIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlIHwgQ2FtZXJhQ2hhbmdlVHlwZS5TY2FsZVxyXG4gICAgICAvLyApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbnZlcnRDb29yZGluYXRlKFxyXG4gICAgaW5fY29vcmRzOiBDb29yZGluYXRlU3lzdGVtLFxyXG4gICAgb3V0X2Nvb3JkczogQ29vcmRpbmF0ZVN5c3RlbSxcclxuICAgIGluX3BvczogQXJyYXlMaWtlPG51bWJlcj5cclxuICApOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgLy9pZiAoaW5fY29vcmRzID09IENvb3JkaW5hdGVTeXN0ZW0ucGl4ZWxzICYmIG91dF9jb29yZHMgPT0gQ29vcmRpbmF0ZVN5c3RlbS53b3JsZCkge1xyXG4gICAgLy8gICAgcmV0dXJuIEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KHRoaXMuX3NjZW5lS2V5LCBcInBpeGVsc1wiLCBpbl9wb3MsIFwid29ybGRcIik7XHJcbiAgICAvL31cclxuICAgIC8vZWxzZSBpZiAoaW5fY29vcmRzID09IENvb3JkaW5hdGVTeXN0ZW0ud29ybGQgJiYgb3V0X2Nvb3JkcyA9PSBDb29yZGluYXRlU3lzdGVtLnBpeGVscykge1xyXG4gICAgLy8gICAgcmV0dXJuIEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KHRoaXMuX3NjZW5lS2V5LCBcIndvcmxkXCIsIGluX3BvcywgXCJwaXhlbHNcIik7XHJcbiAgICAvL31cclxuICAgIC8vZWxzZSBpZiAoaW5fY29vcmRzID09IENvb3JkaW5hdGVTeXN0ZW0ucGl4ZWxzICYmIG91dF9jb29yZHMgPT0gQ29vcmRpbmF0ZVN5c3RlbS53aW5kb3cpIHtcclxuICAgIC8vICAgIHJldHVybiBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleSh0aGlzLl9zY2VuZUtleSwgXCJwaXhlbHNcIiwgaW5fcG9zLCBcIndpbmRvd1wiKTtcclxuICAgIC8vfVxyXG4gICAgLy9lbHNlIGlmIChpbl9jb29yZHMgPT0gQ29vcmRpbmF0ZVN5c3RlbS53aW5kb3cgJiYgb3V0X2Nvb3JkcyA9PSBDb29yZGluYXRlU3lzdGVtLndvcmxkKSB7XHJcbiAgICAvLyAgICByZXR1cm4gSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkodGhpcy5fc2NlbmVLZXksIFwid2luZG93XCIsIGluX3BvcywgXCJ3b3JsZFwiKTtcclxuICAgIC8vfVxyXG5cclxuICAgIHJldHVybiBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleShcclxuICAgICAgdGhpcy5fc2NlbmVLZXksXHJcbiAgICAgIENvb3JkaW5hdGVTeXN0ZW1baW5fY29vcmRzXS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICBpbl9wb3MsXHJcbiAgICAgIENvb3JkaW5hdGVTeXN0ZW1bb3V0X2Nvb3Jkc10udG9Mb3dlckNhc2UoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb252ZXJ0RENvb3JkaW5hdGUoXHJcbiAgICBpbl9jb29yZHM6IENvb3JkaW5hdGVTeXN0ZW0sXHJcbiAgICBvdXRfY29vcmRzOiBDb29yZGluYXRlU3lzdGVtLFxyXG4gICAgaW5fcG9zOiBBcnJheUxpa2U8bnVtYmVyPlxyXG4gICk6IEZsb2F0NjRBcnJheSB7XHJcbiAgICByZXR1cm4gSlNfRENvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICB0aGlzLl9zY2VuZUtleSxcclxuICAgICAgQ29vcmRpbmF0ZVN5c3RlbVtpbl9jb29yZHNdLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIGluX3BvcyxcclxuICAgICAgQ29vcmRpbmF0ZVN5c3RlbVtvdXRfY29vcmRzXS50b0xvd2VyQ2FzZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdFBvc2l0aW9uQnlQb2ludCh3aW5Qb3M6IEFycmF5TGlrZTxudW1iZXI+KTogRmxvYXQzMkFycmF5IHtcclxuICAgIGxldCBjb3VudCA9IEpTX0NvbXB1dGVfU2VsZWN0aW9uX0J5X0tleShcclxuICAgICAgdGhpcy5fdmlld0tleSxcclxuICAgICAgdGhpcy5fc2NlbmVLZXksXHJcbiAgICAgIHdpblBvc1swXSxcclxuICAgICAgd2luUG9zWzFdXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgbGV0IHNlbGVjdGVkUG9zID0gbnVsbDtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkUG9zID09IG51bGwpIHtcclxuICAgICAgICAgIHNlbGVjdGVkUG9zID0gSlNfU2hvd19TZWxlY3Rpb25fUG9zaXRpb24oaSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBuZXdQb3MgPSBKU19TaG93X1NlbGVjdGlvbl9Qb3NpdGlvbihpKTtcclxuICAgICAgICAgIGlmIChuZXdQb3NbMl0gPCBzZWxlY3RlZFBvc1syXSkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZFBvcyA9IG5ld1BvcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzZWxlY3RlZFBvcztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb21wdXRlUGVyc3BlY3RpdmVOZWFyV29ybGRQb3MocGl4ZWw6IEZsb2F0MzJBcnJheSk6IEZsb2F0NjRBcnJheSB7XHJcbiAgICBsZXQgY2FtZXJhID0gbnVsbDtcclxuICAgIGxldCBleHRlbnQgPSBudWxsO1xyXG4gICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh0aGlzLl9zY2VuZUtleSk7XHJcbiAgICB7XHJcbiAgICAgIGNhbWVyYSA9IEpTX1Nob3dfQ2FtZXJhKCk7XHJcbiAgICAgIGV4dGVudCA9IEpTX1Nob3dfQ2FtZXJhX0V4dGVudCgpO1xyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgbGV0IGNhbWVyYVBvc2l0aW9uID0gY2FtZXJhLnBvc2l0aW9uIGFzIEZsb2F0NjRBcnJheTtcclxuICAgICAgbGV0IGNhbWVyYVRhcmdldCA9IGNhbWVyYS50YXJnZXQgYXMgRmxvYXQ2NEFycmF5O1xyXG4gICAgICBsZXQgY2FtZXJhVXAgPSBjYW1lcmEudXAgYXMgRmxvYXQ2NEFycmF5O1xyXG4gICAgICBsZXQgY2FtZXJhVmlldyA9IERQb2ludC5zdWJ0cmFjdChjYW1lcmFQb3NpdGlvbiwgY2FtZXJhVGFyZ2V0KTtcclxuICAgICAgRFZlY3Rvci5ub3JtYWxpemUoY2FtZXJhVmlldyk7XHJcblxyXG4gICAgICBsZXQgeEF4aXMgPSBEVmVjdG9yLmNyb3NzKGNhbWVyYVVwLCBjYW1lcmFWaWV3KTtcclxuXHJcbiAgICAgIERWZWN0b3IucmV2ZXJzZShjYW1lcmFWaWV3KTtcclxuICAgICAgbGV0IHdjcyA9IG5ldyBEV2NzKFxyXG4gICAgICAgIERHZW9tZXRyeU9wZXJhdG9ycy5kaXN0YW5jZVBvaW50KGNhbWVyYVBvc2l0aW9uLCBjYW1lcmFWaWV3LCBleHRlbnRbMF0pLFxyXG4gICAgICAgIHhBeGlzLFxyXG4gICAgICAgIGNhbWVyYVVwXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBsZXQgbGVuUGVyUGl4ZWwgPSAoMiAqIE1hdGgudGFuKE1hdGguUEkgLyAxMikgKiBleHRlbnRbMF0pIC8gdGhpcy5oZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgcGl4ZWxQb3MgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgICBwaXhlbFBvc1swXSA9IHBpeGVsWzBdIC0gdGhpcy53aWR0aCAvIDI7XHJcbiAgICAgIHBpeGVsUG9zWzFdID0gdGhpcy5oZWlnaHQgLyAyIC0gcGl4ZWxbMV07XHJcbiAgICAgIHBpeGVsUG9zWzJdID0gMDtcclxuXHJcbiAgICAgIGxldCBsb2NhbFdvcmxkUG9zID0gbmV3IEZsb2F0NjRBcnJheShbXHJcbiAgICAgICAgcGl4ZWxQb3NbMF0gKiBsZW5QZXJQaXhlbCxcclxuICAgICAgICBwaXhlbFBvc1sxXSAqIGxlblBlclBpeGVsLFxyXG4gICAgICAgIHBpeGVsUG9zWzJdLFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIGxldCB3b3JsZFBvcyA9IHdjcy50b01vZGVsUG9pbnQobG9jYWxXb3JsZFBvcyk7XHJcblxyXG4gICAgICByZXR1cm4gd29ybGRQb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29tcHV0ZU5lYXJQbGFuZVdvcmxkUG9zKHBpeGVsOiBGbG9hdDMyQXJyYXkpOiBGbG9hdDY0QXJyYXkge1xyXG4gICAgbGV0IGNhbWVyYSA9IG51bGw7XHJcbiAgICBsZXQgZXh0ZW50ID0gbnVsbDtcclxuICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy5fc2NlbmVLZXkpO1xyXG4gICAge1xyXG4gICAgICBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG4gICAgICBleHRlbnQgPSBKU19TaG93X0NhbWVyYV9FeHRlbnQoKTtcclxuICAgIH1cclxuICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJvcnRob2dyYXBoaWNcIikge1xyXG4gICAgICBsZXQgb3V0X3BvcyA9IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICAgIHRoaXMuX3NjZW5lS2V5LFxyXG4gICAgICAgIFwicGl4ZWxzXCIsXHJcbiAgICAgICAgcGl4ZWwsXHJcbiAgICAgICAgXCJ3b3JsZFwiXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCBwb3MgPSBuZXcgRmxvYXQ2NEFycmF5KG91dF9wb3MpO1xyXG5cclxuICAgICAgbGV0IGNhbWVyYVBvc2l0aW9uID0gY2FtZXJhLnBvc2l0aW9uIGFzIEZsb2F0NjRBcnJheTtcclxuICAgICAgbGV0IGNhbWVyYVRhcmdldCA9IGNhbWVyYS50YXJnZXQgYXMgRmxvYXQ2NEFycmF5O1xyXG4gICAgICBsZXQgZGlyZWN0ID0gRFBvaW50LnN1YnRyYWN0KGNhbWVyYVBvc2l0aW9uLCBjYW1lcmFUYXJnZXQpO1xyXG4gICAgICBEVmVjdG9yLm5vcm1hbGl6ZShkaXJlY3QpO1xyXG5cclxuICAgICAgcmV0dXJuIERHZW9tZXRyeU9wZXJhdG9ycy5wcm9qZWN0UG9pbnRUb1BsYW5lKFxyXG4gICAgICAgIHBvcyxcclxuICAgICAgICBjYW1lcmFQb3NpdGlvbixcclxuICAgICAgICBkaXJlY3RcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSBpZiAoY2FtZXJhLnByb2plY3Rpb24gPT0gXCJwZXJzcGVjdGl2ZVwiKSB7XHJcbiAgICAgIGxldCBjYW1lcmFQb3NpdGlvbiA9IGNhbWVyYS5wb3NpdGlvbiBhcyBGbG9hdDY0QXJyYXk7XHJcbiAgICAgIGxldCBjYW1lcmFUYXJnZXQgPSBjYW1lcmEudGFyZ2V0IGFzIEZsb2F0NjRBcnJheTtcclxuICAgICAgbGV0IGNhbWVyYVVwID0gY2FtZXJhLnVwIGFzIEZsb2F0NjRBcnJheTtcclxuICAgICAgbGV0IGNhbWVyYVZpZXcgPSBEUG9pbnQuc3VidHJhY3QoY2FtZXJhUG9zaXRpb24sIGNhbWVyYVRhcmdldCk7XHJcbiAgICAgIERWZWN0b3Iubm9ybWFsaXplKGNhbWVyYVZpZXcpO1xyXG5cclxuICAgICAgbGV0IHhBeGlzID0gRFZlY3Rvci5jcm9zcyhjYW1lcmFVcCwgY2FtZXJhVmlldyk7XHJcblxyXG4gICAgICBEVmVjdG9yLnJldmVyc2UoY2FtZXJhVmlldyk7XHJcbiAgICAgIGxldCB3Y3MgPSBuZXcgRFdjcyhcclxuICAgICAgICBER2VvbWV0cnlPcGVyYXRvcnMuZGlzdGFuY2VQb2ludChjYW1lcmFQb3NpdGlvbiwgY2FtZXJhVmlldywgZXh0ZW50WzBdKSxcclxuICAgICAgICB4QXhpcyxcclxuICAgICAgICBjYW1lcmFVcFxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGV0IGxlblBlclBpeGVsID0gKDIgKiBNYXRoLnRhbihNYXRoLlBJIC8gMTIpICogZXh0ZW50WzBdKSAvIHRoaXMuaGVpZ2h0O1xyXG5cclxuICAgICAgbGV0IHBpeGVsUG9zID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuICAgICAgcGl4ZWxQb3NbMF0gPSBwaXhlbFswXSAtIHRoaXMud2lkdGggLyAyO1xyXG4gICAgICBwaXhlbFBvc1sxXSA9IHRoaXMuaGVpZ2h0IC8gMiAtIHBpeGVsWzFdO1xyXG4gICAgICBwaXhlbFBvc1syXSA9IDA7XHJcblxyXG4gICAgICBsZXQgbG9jYWxXb3JsZFBvcyA9IG5ldyBGbG9hdDY0QXJyYXkoW1xyXG4gICAgICAgIHBpeGVsUG9zWzBdICogbGVuUGVyUGl4ZWwsXHJcbiAgICAgICAgcGl4ZWxQb3NbMV0gKiBsZW5QZXJQaXhlbCxcclxuICAgICAgICBwaXhlbFBvc1syXSxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICBsZXQgd29ybGRQb3MgPSB3Y3MudG9Nb2RlbFBvaW50KGxvY2FsV29ybGRQb3MpO1xyXG5cclxuICAgICAgcmV0dXJuIHdvcmxkUG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRocmVhZFByb21pc2U8VD4ge1xyXG4gIHByaXZhdGUgX3Jlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkID0gbnVsbDtcclxuICBwcml2YXRlIF9ldmVudDogKFxyXG4gICAgcmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkLFxyXG4gICAgcmVqZWN0PzogKGFueSkgPT4gdm9pZFxyXG4gICkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgZXZlbnQ/OiAoXHJcbiAgICAgIHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCxcclxuICAgICAgcmVqZWN0PzogKHJlYXNvbj86IGFueSkgPT4gdm9pZFxyXG4gICAgKSA9PiB2b2lkXHJcbiAgKSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgdGhpcy5fZXZlbnQgPSBldmVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0aGVuKHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCwgcmVqZWN0PzogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XHJcbiAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XHJcblxyXG4gICAgaWYgKHRoaXMuX2V2ZW50KSB7XHJcbiAgICAgIHRoaXMuX2V2ZW50KHRoaXMuX3Jlc29sdmUsIHRoaXMuX3JlamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzb2x2ZSh2YWx1ZTogVCkge1xyXG4gICAgaWYgKHRoaXMuX3Jlc29sdmUpIHtcclxuICAgICAgdGhpcy5fcmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVqZWN0KHJlYXNvbj86IGFueSkge1xyXG4gICAgaWYgKHRoaXMuX3JlamVjdCkge1xyXG4gICAgICB0aGlzLl9yZWplY3QocmVhc29uKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFVwZGF0ZURpc3BsYXlUeXBlIHtcclxuICBTeW5jaHJvbml6YXRpb24sXHJcbiAgQnVzeSxcclxuICBBc3luQnVmZmVyR2VvbWV0cnksXHJcbiAgQXN5bk5vbmVCdWZmZXJHZW9tZXRyeSxcclxuICBBc3luVGhyZWFkQnVmZmVyR2VvbWV0cnksXHJcbiAgQXN5blRocmVhZE5vbmVCdWZmZXJHZW9tZXRyeSxcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVwZGF0ZUluZm8ge1xyXG4gIHByaXZhdGUgX3ZpZXdlcjogVmlld2VyO1xyXG4gIHByaXZhdGUgX3R5cGU6IFVwZGF0ZURpc3BsYXlUeXBlO1xyXG5cclxuICBfY291bnQ6IG51bWJlciA9IDA7XHJcblxyXG4gIHB1YmxpYyBnZXQgdmlld2VyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl90eXBlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjb3VudCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jb3VudDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpZXdlcjogVmlld2VyLCB0eXBlOiBVcGRhdGVEaXNwbGF5VHlwZSkge1xyXG4gICAgdGhpcy5fdmlld2VyID0gdmlld2VyO1xyXG4gICAgdGhpcy5fdHlwZSA9IHR5cGU7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVmlld2VyRXZlbnQge1xyXG4gIHZpZXdlcjogVmlld2VyO1xyXG4gIHVpRXZlbnQ6IFVJRXZlbnQ7XHJcbiAgY29uc3RydWN0b3Iodmlld2VyOiBhbnksIGU6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMudmlld2VyID0gdmlld2VyO1xyXG4gICAgdGhpcy51aUV2ZW50ID0gZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZUV2ZW50KCk6IE1vdXNlRXZlbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudWlFdmVudCBhcyBNb3VzZUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHdoZWVsRXZlbnQoKTogV2hlZWxFdmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy51aUV2ZW50IGFzIFdoZWVsRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG91Y2hFdmVudCgpOiBUb3VjaEV2ZW50IHtcclxuICAgIHJldHVybiB0aGlzLnVpRXZlbnQgYXMgVG91Y2hFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZVBpeGVsUG9zKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICBsZXQgbW91c2VFdmVudCA9IHRoaXMubW91c2VFdmVudCgpO1xyXG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoW21vdXNlRXZlbnQub2Zmc2V0WCwgbW91c2VFdmVudC5vZmZzZXRZLCAwXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW91c2VXb3JsZFBvcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IG1vdXNlRXZlbnQgPSB0aGlzLm1vdXNlRXZlbnQoKTtcclxuICAgIGxldCBwaXhlbFBvcyA9IFttb3VzZUV2ZW50Lm9mZnNldFgsIG1vdXNlRXZlbnQub2Zmc2V0WSwgLTFdO1xyXG5cclxuICAgIGxldCB3b3JsZFBvcyA9IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICB0aGlzLnZpZXdlci5zY2VuZUtleSxcclxuICAgICAgXCJwaXhlbHNcIixcclxuICAgICAgcGl4ZWxQb3MsXHJcbiAgICAgIFwid29ybGRcIlxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gd29ybGRQb3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW91c2VGYXJXb3JsZFBvcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IG1vdXNlRXZlbnQgPSB0aGlzLm1vdXNlRXZlbnQoKTtcclxuICAgIGxldCBwaXhlbFBvcyA9IFttb3VzZUV2ZW50Lm9mZnNldFgsIG1vdXNlRXZlbnQub2Zmc2V0WSwgMV07XHJcblxyXG4gICAgbGV0IHdvcmxkUG9zID0gSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkoXHJcbiAgICAgIHRoaXMudmlld2VyLnNjZW5lS2V5LFxyXG4gICAgICBcInBpeGVsc1wiLFxyXG4gICAgICBwaXhlbFBvcyxcclxuICAgICAgXCJ3b3JsZFwiXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB3b3JsZFBvcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZVpXb3JsZFBvcyh6OiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IG1vdXNlRXZlbnQgPSB0aGlzLm1vdXNlRXZlbnQoKTtcclxuICAgIGxldCBwaXhlbFBvcyA9IFttb3VzZUV2ZW50Lm9mZnNldFgsIG1vdXNlRXZlbnQub2Zmc2V0WSwgel07XHJcblxyXG4gICAgbGV0IHdvcmxkUG9zID0gSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkoXHJcbiAgICAgIHRoaXMudmlld2VyLnNjZW5lS2V5LFxyXG4gICAgICBcInBpeGVsc1wiLFxyXG4gICAgICBwaXhlbFBvcyxcclxuICAgICAgXCJ3b3JsZFwiXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB3b3JsZFBvcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZVdvcmxkUmF5KCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICBsZXQgcmF5ID0gbnVsbDtcclxuICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodGhpcy52aWV3ZXIuc2NlbmVLZXkpO1xyXG4gICAge1xyXG4gICAgICBsZXQgY2FtZXJhID0gSlNfU2hvd19DYW1lcmEoKTtcclxuXHJcbiAgICAgIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcIm9ydGhvZ3JhcGhpY1wiKSB7XHJcbiAgICAgICAgcmF5ID0gUG9pbnQuc3VidHJhY3QoXHJcbiAgICAgICAgICBjYW1lcmEudGFyZ2V0IGFzIEZsb2F0MzJBcnJheSxcclxuICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbiBhcyBGbG9hdDMyQXJyYXlcclxuICAgICAgICApO1xyXG4gICAgICAgIFZlY3Rvci5ub3JtYWxpemUocmF5KTtcclxuICAgICAgfSBlbHNlIGlmIChjYW1lcmEucHJvamVjdGlvbiA9PSBcInBlcnNwZWN0aXZlXCIpIHtcclxuICAgICAgICBsZXQgbW91c2VFdmVudCA9IHRoaXMubW91c2VFdmVudCgpO1xyXG4gICAgICAgIGxldCBwaXhlbFBvcyA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAgICAgbW91c2VFdmVudC5vZmZzZXRYLFxyXG4gICAgICAgICAgbW91c2VFdmVudC5vZmZzZXRZLFxyXG4gICAgICAgICAgLTEsXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgIGxldCBuZWFyUG9zID0gdGhpcy52aWV3ZXIuY29tcHV0ZVBlcnNwZWN0aXZlTmVhcldvcmxkUG9zKHBpeGVsUG9zKTtcclxuICAgICAgICByYXkgPSBEUG9pbnQuc3VidHJhY3QobmVhclBvcywgY2FtZXJhLnBvc2l0aW9uKTtcclxuICAgICAgICBEVmVjdG9yLm5vcm1hbGl6ZShyYXkpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShyYXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcbiAgICByZXR1cm4gcmF5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdXNlVmlld3BvaW50UG9zKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbMCwgMCwgMF0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdXNlV2luZG93UG9zKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICBsZXQgbW91c2VFdmVudCA9IHRoaXMubW91c2VFdmVudCgpO1xyXG4gICAgbGV0IHBpeGVsUG9zID0gW21vdXNlRXZlbnQub2Zmc2V0WCwgbW91c2VFdmVudC5vZmZzZXRZLCAtMV07XHJcblxyXG4gICAgbGV0IHdpbmRvd1BvcyA9IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICB0aGlzLnZpZXdlci5zY2VuZUtleSxcclxuICAgICAgXCJwaXhlbHNcIixcclxuICAgICAgcGl4ZWxQb3MsXHJcbiAgICAgIFwid2luZG93XCJcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHdpbmRvd1BvcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZVVuaXRXaW5kb3dQb3MoKTogRmxvYXQzMkFycmF5IHtcclxuICAgIGxldCB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcclxuICAgIGxldCBtb3VzZUV2ZW50ID0gdGhpcy5tb3VzZUV2ZW50KCk7XHJcblxyXG4gICAgbGV0IHBpeGVsUG9zID0gW21vdXNlRXZlbnQub2Zmc2V0WCwgbW91c2VFdmVudC5vZmZzZXRZLCAtMV07XHJcbiAgICBsZXQgd2luZG93UG9zID0gSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkoXHJcbiAgICAgIHRoaXMudmlld2VyLnNjZW5lS2V5LFxyXG4gICAgICBcInBpeGVsc1wiLFxyXG4gICAgICBwaXhlbFBvcyxcclxuICAgICAgXCJ3aW5kb3dcIlxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgeCA9IHdpbmRvd1Bvc1swXTtcclxuICAgIGxldCB5ID0gd2luZG93UG9zWzFdO1xyXG4gICAgaWYgKHZpZXdlci5hc3BlY3RSYXRpbyA+IDEpIHtcclxuICAgICAgeCAqPSB2aWV3ZXIuYXNwZWN0UmF0aW87XHJcbiAgICB9IGVsc2UgaWYgKHZpZXdlci5hc3BlY3RSYXRpbyA8IDEpIHtcclxuICAgICAgeSAvPSB2aWV3ZXIuYXNwZWN0UmF0aW87XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoW3gsIHksIDBdKTtcclxuICB9XHJcblxyXG4gIGdldEVsZW1lbnRQb3MoZWxlbWVudCkge1xyXG4gICAgbGV0IGFjdHVhbFRvcCA9IGVsZW1lbnQub2Zmc2V0VG9wO1xyXG4gICAgbGV0IGFjdHVhbExlZnQgPSBlbGVtZW50Lm9mZnNldExlZnQ7XHJcbiAgICBsZXQgY3VycmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50O1xyXG4gICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcclxuICAgICAgYWN0dWFsVG9wICs9IGN1cnJlbnQub2Zmc2V0VG9wO1xyXG4gICAgICBhY3R1YWxMZWZ0ICs9IGN1cnJlbnQub2Zmc2V0TGVmdDtcclxuICAgICAgY3VycmVudCA9IGN1cnJlbnQub2Zmc2V0UGFyZW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgdG9wOiBhY3R1YWxUb3AsIGxlZnQ6IGFjdHVhbExlZnQgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b3VjaFdvcmxkUG9zKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICBsZXQgdG91Y2hFdmVudCA9IHRoaXMudG91Y2hFdmVudCgpO1xyXG4gICAgbGV0IHsgdG9wLCBsZWZ0IH0gPSB0aGlzLmdldEVsZW1lbnRQb3ModG91Y2hFdmVudC50YXJnZXQpO1xyXG4gICAgbGV0IHBpeGVsUG9zID0gW1xyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIGxlZnQsXHJcbiAgICAgIHRvdWNoRXZlbnQudG91Y2hlc1swXS5jbGllbnRZIC0gdG9wLFxyXG4gICAgICAtMSxcclxuICAgIF07XHJcblxyXG4gICAgbGV0IHdvcmxkUG9zID0gSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkoXHJcbiAgICAgIHRoaXMudmlld2VyLnNjZW5lS2V5LFxyXG4gICAgICBcInBpeGVsc1wiLFxyXG4gICAgICBwaXhlbFBvcyxcclxuICAgICAgXCJ3b3JsZFwiXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB3b3JsZFBvcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b3VjaFdvcmxkUG9zMSgpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IHRvdWNoRXZlbnQgPSB0aGlzLnRvdWNoRXZlbnQoKTtcclxuICAgIGxldCB7IHRvcCwgbGVmdCB9ID0gdGhpcy5nZXRFbGVtZW50UG9zKHRvdWNoRXZlbnQudGFyZ2V0KTtcclxuICAgIGxldCBwaXhlbFBvcyA9IFtcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzFdLmNsaWVudFggLSBsZWZ0LFxyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMV0uY2xpZW50WSAtIHRvcCxcclxuICAgICAgLTEsXHJcbiAgICBdO1xyXG5cclxuICAgIGxldCB3b3JsZFBvcyA9IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICB0aGlzLnZpZXdlci5zY2VuZUtleSxcclxuICAgICAgXCJwaXhlbHNcIixcclxuICAgICAgcGl4ZWxQb3MsXHJcbiAgICAgIFwid29ybGRcIlxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gd29ybGRQb3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG91Y2hXb3JsZFBvczIoKTogRmxvYXQzMkFycmF5IHtcclxuICAgIGxldCB0b3VjaEV2ZW50ID0gdGhpcy50b3VjaEV2ZW50KCk7XHJcbiAgICBsZXQgeyB0b3AsIGxlZnQgfSA9IHRoaXMuZ2V0RWxlbWVudFBvcyh0b3VjaEV2ZW50LnRhcmdldCk7XHJcbiAgICBsZXQgcGl4ZWxQb3MgPSBbXHJcbiAgICAgIHRvdWNoRXZlbnQudG91Y2hlc1syXS5jbGllbnRYIC0gbGVmdCxcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzJdLmNsaWVudFkgLSB0b3AsXHJcbiAgICAgIC0xLFxyXG4gICAgXTtcclxuXHJcbiAgICBsZXQgd29ybGRQb3MgPSBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleShcclxuICAgICAgdGhpcy52aWV3ZXIuc2NlbmVLZXksXHJcbiAgICAgIFwicGl4ZWxzXCIsXHJcbiAgICAgIHBpeGVsUG9zLFxyXG4gICAgICBcIndvcmxkXCJcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHdvcmxkUG9zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvdWNoV2luZG93UG9zKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICBsZXQgdG91Y2hFdmVudCA9IHRoaXMudG91Y2hFdmVudCgpO1xyXG4gICAgbGV0IHsgdG9wLCBsZWZ0IH0gPSB0aGlzLmdldEVsZW1lbnRQb3ModG91Y2hFdmVudC50YXJnZXQpO1xyXG4gICAgbGV0IHBpeGVsUG9zID0gW1xyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIGxlZnQsXHJcbiAgICAgIHRvdWNoRXZlbnQudG91Y2hlc1swXS5jbGllbnRZIC0gdG9wLFxyXG4gICAgICAtMSxcclxuICAgIF07XHJcbiAgICBsZXQgd2luZG93UG9zID0gSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXkoXHJcbiAgICAgIHRoaXMudmlld2VyLnNjZW5lS2V5LFxyXG4gICAgICBcInBpeGVsc1wiLFxyXG4gICAgICBwaXhlbFBvcyxcclxuICAgICAgXCJ3aW5kb3dcIlxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gd2luZG93UG9zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvdWNoV2luZG93UG9zMSgpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IHRvdWNoRXZlbnQgPSB0aGlzLnRvdWNoRXZlbnQoKTtcclxuICAgIGxldCB7IHRvcCwgbGVmdCB9ID0gdGhpcy5nZXRFbGVtZW50UG9zKHRvdWNoRXZlbnQudGFyZ2V0KTtcclxuICAgIGxldCBwaXhlbFBvcyA9IFtcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzFdLmNsaWVudFggLSBsZWZ0LFxyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMV0uY2xpZW50WSAtIHRvcCxcclxuICAgICAgLTEsXHJcbiAgICBdO1xyXG5cclxuICAgIGxldCB3aW5kb3dQb3MgPSBKU19Db21wdXRlX0Nvb3JkaW5hdGVzX0J5X0tleShcclxuICAgICAgdGhpcy52aWV3ZXIuc2NlbmVLZXksXHJcbiAgICAgIFwicGl4ZWxzXCIsXHJcbiAgICAgIHBpeGVsUG9zLFxyXG4gICAgICBcIndpbmRvd1wiXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB3aW5kb3dQb3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG91Y2hVbml0V2luZG93UG9zKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICBsZXQgdmlld2VyID0gdGhpcy52aWV3ZXI7XHJcbiAgICBsZXQgdG91Y2hFdmVudCA9IHRoaXMudG91Y2hFdmVudCgpO1xyXG4gICAgbGV0IHsgdG9wLCBsZWZ0IH0gPSB0aGlzLmdldEVsZW1lbnRQb3ModG91Y2hFdmVudC50YXJnZXQpO1xyXG5cclxuICAgIGxldCBwaXhlbFBvcyA9IFtcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzBdLmNsaWVudFggLSBsZWZ0LFxyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSAtIHRvcCxcclxuICAgICAgLTEsXHJcbiAgICBdO1xyXG4gICAgbGV0IHdpbmRvd1BvcyA9IEpTX0NvbXB1dGVfQ29vcmRpbmF0ZXNfQnlfS2V5KFxyXG4gICAgICB0aGlzLnZpZXdlci5zY2VuZUtleSxcclxuICAgICAgXCJwaXhlbHNcIixcclxuICAgICAgcGl4ZWxQb3MsXHJcbiAgICAgIFwid2luZG93XCJcclxuICAgICk7XHJcblxyXG4gICAgbGV0IHggPSB3aW5kb3dQb3NbMF07XHJcbiAgICBsZXQgeSA9IHdpbmRvd1Bvc1sxXTtcclxuICAgIGlmICh2aWV3ZXIuYXNwZWN0UmF0aW8gPiAxKSB7XHJcbiAgICAgIHggKj0gdmlld2VyLmFzcGVjdFJhdGlvO1xyXG4gICAgfSBlbHNlIGlmICh2aWV3ZXIuYXNwZWN0UmF0aW8gPCAxKSB7XHJcbiAgICAgIHkgLz0gdmlld2VyLmFzcGVjdFJhdGlvO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFt4LCB5LCAwXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG91Y2hQaXhlbFBvcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgbGV0IHRvdWNoRXZlbnQgPSB0aGlzLnRvdWNoRXZlbnQoKTtcclxuICAgIGxldCB7IHRvcCwgbGVmdCB9ID0gdGhpcy5nZXRFbGVtZW50UG9zKHRvdWNoRXZlbnQudGFyZ2V0KTtcclxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgdG91Y2hFdmVudC50b3VjaGVzWzBdLmNsaWVudFggLSBsZWZ0LFxyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSAtIHRvcCxcclxuICAgICAgMCxcclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvdWNoUGl4ZWxQb3MxKCk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICBsZXQgdG91Y2hFdmVudCA9IHRoaXMudG91Y2hFdmVudCgpO1xyXG4gICAgbGV0IHsgdG9wLCBsZWZ0IH0gPSB0aGlzLmdldEVsZW1lbnRQb3ModG91Y2hFdmVudC50YXJnZXQpO1xyXG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICB0b3VjaEV2ZW50LnRvdWNoZXNbMV0uY2xpZW50WCAtIGxlZnQsXHJcbiAgICAgIHRvdWNoRXZlbnQudG91Y2hlc1sxXS5jbGllbnRZIC0gdG9wLFxyXG4gICAgICAwLFxyXG4gICAgXSk7XHJcbiAgfVxyXG59XHJcblxyXG4vL2V4cG9ydCBjbGFzcyBPcGVyYXRvciB7XHJcbi8vICAgIHZpZXdlcjogVmlld2VyID0gbnVsbDtcclxuXHJcbi8vICAgIExCdXR0b25Eb3duOiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIExCdXR0b25VcDogRnVuY3Rpb24gPSBudWxsO1xyXG4vLyAgICBSQnV0dG9uRG93bjogRnVuY3Rpb24gPSBudWxsO1xyXG4vLyAgICBSQnV0dG9uVXA6IEZ1bmN0aW9uID0gbnVsbDtcclxuLy8gICAgTUJ1dHRvbkRvd246IEZ1bmN0aW9uID0gbnVsbDtcclxuLy8gICAgTUJ1dHRvblVwOiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIE1vdXNlV2hlZWw6IEZ1bmN0aW9uID0gbnVsbDtcclxuLy8gICAgTW91c2VNb3ZlOiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIExCdXR0b25Eb3duQW5kTW92ZTogRnVuY3Rpb24gPSBudWxsO1xyXG4vLyAgICBNQnV0dG9uRG93bkFuZE1vdmU6IEZ1bmN0aW9uID0gbnVsbDtcclxuLy8gICAgUkJ1dHRvbkRvd25BbmRNb3ZlOiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIFRvdWNoU3RhcnQ6IEZ1bmN0aW9uID0gbnVsbDtcclxuLy8gICAgVG91Y2hNb3ZlOiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIFRvdWNoRW5kOiBGdW5jdGlvbiA9IG51bGw7XHJcbi8vICAgIFRvdWNoQ2FuY2VsOiBGdW5jdGlvbiA9IG51bGw7XHJcblxyXG4vLyAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbi8vICAgIH1cclxuXHJcbi8vICAgIHR5cGVOYW1lKCk6IHN0cmluZyB7XHJcbi8vICAgICAgICByZXR1cm4gXCJPcGVyYXRvclwiO1xyXG4vLyAgICB9XHJcblxyXG4vLyAgICBpbml0KCkge1xyXG5cclxuLy8gICAgfVxyXG5cclxuLy8gICAgZmluYSgpIHtcclxuXHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uTEJ1dHRvbkRvd24oZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGlmICh0aGlzLkxCdXR0b25Eb3duICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLkxCdXR0b25Eb3duKGUpO1xyXG4vLyAgICAgICAgfVxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvbkxCdXR0b25VcChlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuTEJ1dHRvblVwICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLkxCdXR0b25VcChlKTtcclxuLy8gICAgICAgIH1cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25SQnV0dG9uRG93bihlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuUkJ1dHRvbkRvd24gIT0gbnVsbCkge1xyXG4vLyAgICAgICAgICAgIHRoaXMuUkJ1dHRvbkRvd24oZSk7XHJcbi8vICAgICAgICB9XHJcblxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvblJCdXR0b25VcChlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuUkJ1dHRvblVwICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLlJCdXR0b25VcChlKTtcclxuLy8gICAgICAgIH1cclxuXHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uTUJ1dHRvbkRvd24oZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGlmICh0aGlzLk1CdXR0b25Eb3duICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLk1CdXR0b25Eb3duKGUpO1xyXG4vLyAgICAgICAgfVxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvbk1CdXR0b25VcChlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuTUJ1dHRvblVwICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLk1CdXR0b25VcChlKTtcclxuLy8gICAgICAgIH1cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25Nb3VzZVdoZWVsKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBpZiAodGhpcy5Nb3VzZVdoZWVsICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLk1vdXNlV2hlZWwoZSk7XHJcbi8vICAgICAgICB9XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uTW91c2VNb3ZlKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBpZiAodGhpcy5Nb3VzZU1vdmUgIT0gbnVsbCkge1xyXG4vLyAgICAgICAgICAgIHRoaXMuTW91c2VNb3ZlKGUpO1xyXG4vLyAgICAgICAgfVxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvbkxCdXR0b25Eb3duQW5kTW92ZShlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuTEJ1dHRvbkRvd25BbmRNb3ZlICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLkxCdXR0b25Eb3duQW5kTW92ZShlKTtcclxuLy8gICAgICAgIH1cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25NQnV0dG9uRG93bkFuZE1vdmUoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGlmICh0aGlzLk1CdXR0b25Eb3duQW5kTW92ZSAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5NQnV0dG9uRG93bkFuZE1vdmUoZSk7XHJcbi8vICAgICAgICB9XHJcblxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvblJCdXR0b25Eb3duQW5kTW92ZShlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuUkJ1dHRvbkRvd25BbmRNb3ZlICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLlJCdXR0b25Eb3duQW5kTW92ZShlKTtcclxuLy8gICAgICAgIH1cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25Ub3VjaFN0YXJ0KGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBpZiAodGhpcy5Ub3VjaFN0YXJ0ICE9IG51bGwpIHtcclxuLy8gICAgICAgICAgICB0aGlzLlRvdWNoU3RhcnQoZSk7XHJcbi8vICAgICAgICB9XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uVG91Y2hNb3ZlKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBpZiAodGhpcy5Ub3VjaE1vdmUgIT0gbnVsbCkge1xyXG4vLyAgICAgICAgICAgIHRoaXMuVG91Y2hNb3ZlKGUpO1xyXG4vLyAgICAgICAgfVxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvblRvdWNoRW5kKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBpZiAodGhpcy5Ub3VjaEVuZCAhPSBudWxsKSB7XHJcbi8vICAgICAgICAgICAgdGhpcy5Ub3VjaEVuZChlKTtcclxuLy8gICAgICAgIH1cclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25Ub3VjaENhbmNlbChlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgaWYgKHRoaXMuVG91Y2hDYW5jZWwgIT0gbnVsbCkge1xyXG4vLyAgICAgICAgICAgIHRoaXMuVG91Y2hDYW5jZWwoZSk7XHJcbi8vICAgICAgICB9XHJcbi8vICAgIH1cclxuLy99XHJcblxyXG4vL2V4cG9ydCBlbnVtIENhbWVyYU9wZXJhdGVTdGF0ZSB7IE5vbmUsIFBhbiwgU2NhbGUsIFJvdGF0ZSB9O1xyXG4vL2V4cG9ydCBlbnVtIE1vdmVCdXR0b25UeXBlIHsgTGVmdCwgTWlkZGxlLCBSaWdodCB9O1xyXG5cclxuLy9leHBvcnQgY2xhc3MgQ2FtZXJhTW91c2UgZXh0ZW5kcyBPcGVyYXRvciB7XHJcbi8vICAgIHByb3RlY3RlZCBzdGF0ZSA9IENhbWVyYU9wZXJhdGVTdGF0ZS5Ob25lO1xyXG4vLyAgICBwcm90ZWN0ZWQgcmFkaXVzID0gMC45O1xyXG4vLyAgICBwcm90ZWN0ZWQgX21vdmVCdXR0b25UeXBlID0gTW92ZUJ1dHRvblR5cGUuTWlkZGxlO1xyXG4vLyAgICBwcm90ZWN0ZWQgX3JvdGF0aW9uRGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbi8vICAgIHByb3RlY3RlZCByb3RhdGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4vLyAgICBwcm90ZWN0ZWQgbUJ1dHRvbkRvd25lZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4vLyAgICBwcm90ZWN0ZWQgZG93bldvcmxkUG9zOiBGbG9hdDMyQXJyYXkgPSBudWxsO1xyXG4vLyAgICBwcm90ZWN0ZWQgZG93blNwaGVyZVBvczogRmxvYXQzMkFycmF5ID0gbnVsbDtcclxuLy8gICAgcHJvdGVjdGVkIG1vdmVTcGhlcmVQb3M6IEZsb2F0MzJBcnJheSA9IG51bGw7XHJcblxyXG4vLyAgICBwcm90ZWN0ZWQgZG93bkNhbWVyYVBvczogRmxvYXQzMkFycmF5ID0gbnVsbDtcclxuLy8gICAgcHJvdGVjdGVkIGRvd25DYW1lcmFUYXI6IEZsb2F0MzJBcnJheSA9IG51bGw7XHJcbi8vICAgIHByb3RlY3RlZCBkb3duQ2FtZXJhVXA6IEZsb2F0MzJBcnJheSA9IG51bGw7XHJcblxyXG4vLyAgICBwcml2YXRlIHJhZGl1c0Rpc3Q6IG51bWJlciA9IDAuMDtcclxuLy8gICAgcHJpdmF0ZSBzY2FsZUVuZDogbnVtYmVyO1xyXG5cclxuLy8gICAgY29uc3RydWN0b3IoKSB7XHJcbi8vICAgICAgICBzdXBlcigpO1xyXG4vLyAgICB9XHJcblxyXG4vLyAgICB0eXBlTmFtZSgpOiBzdHJpbmcge1xyXG4vLyAgICAgICAgcmV0dXJuIFwiQ2FtZXJhTW91c2VcIjtcclxuLy8gICAgfVxyXG5cclxuLy8gICAgcHVibGljIG1vdmVCdXR0b25UeXBlKHR5cGU/OiBNb3ZlQnV0dG9uVHlwZSk6IE1vdmVCdXR0b25UeXBlIHtcclxuLy8gICAgICAgIGlmICh0eXBlICE9IHVuZGVmaW5lZCkge1xyXG4vLyAgICAgICAgICAgIHRoaXMuX21vdmVCdXR0b25UeXBlID0gdHlwZTtcclxuLy8gICAgICAgIH1cclxuXHJcbi8vICAgICAgICByZXR1cm4gdGhpcy5fbW92ZUJ1dHRvblR5cGU7XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIHB1YmxpYyByb3RhdGlvbkRpc2FibGVkKGRpc2FibGU/OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbi8vICAgICAgICBpZiAoZGlzYWJsZSAhPSB1bmRlZmluZWQpIHtcclxuLy8gICAgICAgICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gZGlzYWJsZTtcclxuLy8gICAgICAgIH1cclxuXHJcbi8vICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb25EaXNhYmxlZDtcclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25MQnV0dG9uRG93bihlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgdGhpcy5kb3duV29ybGRQb3MgPSBlLm1vdXNlV29ybGRQb3MoKTtcclxuXHJcbi8vICAgICAgICB0aGlzLnN0YXRlID0gQ2FtZXJhT3BlcmF0ZVN0YXRlLk5vbmU7XHJcbi8vICAgICAgICB0aGlzLnJvdGF0aW5nID0gZmFsc2U7XHJcblxyXG4vLyAgICAgICAgc3VwZXIub25MQnV0dG9uRG93bihlKTtcclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25MQnV0dG9uVXAoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIHRoaXMudmlld2VyLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbi8vICAgICAgICBzdXBlci5vbkxCdXR0b25VcChlKVxyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvblJCdXR0b25Eb3duKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICB0aGlzLnN0YXRlID0gQ2FtZXJhT3BlcmF0ZVN0YXRlLlJvdGF0ZTtcclxuXHJcbi8vICAgICAgICAvL1Nob3dDYW1lcmFDaXJjbGUoZmFsc2UpO1xyXG5cclxuLy8gICAgICAgIGxldCBwb3MgPSBlLm1vdXNlVmlld3BvaW50UG9zKCk7XHJcbi8vICAgICAgICB0aGlzLnJhZGl1c0Rpc3QgPSBwb3NbMV07XHJcblxyXG4vLyAgICAgICAgdGhpcy5kb3duU3BoZXJlUG9zID0gdGhpcy5nZXRTcGhlcmVQb2ludChlKTtcclxuLy8gICAgICAgIHRoaXMubW92ZVNwaGVyZVBvcyA9IHRoaXMuZG93blNwaGVyZVBvcztcclxuXHJcbi8vICAgICAgICAvL1Nob3dDaXJjbGVBcnJvdyhlKTtcclxuXHJcbi8vICAgICAgICBzdXBlci5vblJCdXR0b25Eb3duKGUpO1xyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvblJCdXR0b25VcChlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgdGhpcy52aWV3ZXIudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuLy8gICAgICAgIHN1cGVyLm9uUkJ1dHRvblVwKGUpO1xyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvbk1CdXR0b25Eb3duKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICB0aGlzLm1CdXR0b25Eb3duZWQgPSB0cnVlO1xyXG5cclxuLy8gICAgICAgIHRoaXMuZG93bldvcmxkUG9zID0gZS5tb3VzZVdvcmxkUG9zKCk7XHJcblxyXG4vLyAgICAgICAgdGhpcy5zdGF0ZSA9IENhbWVyYU9wZXJhdGVTdGF0ZS5Ob25lO1xyXG4vLyAgICAgICAgdGhpcy5yb3RhdGluZyA9IGZhbHNlO1xyXG5cclxuLy8gICAgICAgIC8vU2hvd0NhbWVyYUNlbnRlcigpO1xyXG5cclxuLy8gICAgICAgIHN1cGVyLm9uTUJ1dHRvbkRvd24oZSk7XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uTUJ1dHRvblVwKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICAvL3RoaXMudmlld2VyLmNhbWVyYSgpO1xyXG5cclxuLy8gICAgICAgIC8vaWYgKHRoaXMuc3RhdGUgPT0gQ2FtZXJhT3BlcmF0ZVN0YXRlLk5vbmUgJiYgdGhpcy5tQnV0dG9uRG93bmVkKSB7XHJcbi8vICAgICAgICAvLyAgICB0aGlzLnNldENhbWVyYUNlbnRlcihlKTtcclxuLy8gICAgICAgIC8vfVxyXG5cclxuLy8gICAgICAgIC8vLy9GbHVzaENhbWVyYUNlbnRlcihmYWxzZSk7XHJcbi8vICAgICAgICAvLy8vRmx1c2hDYW1lcmFDaXJjbGUoKTtcclxuXHJcbi8vICAgICAgICAvL3RoaXMuc3RhdGUgPSBDYW1lcmFPcGVyYXRlU3RhdGUuTm9uZTtcclxuXHJcbi8vICAgICAgICAvLy8vaWYgKHRoaXMudmlld2VyLm9wZXJhdG9yTWFuYWdlci5Db250YWlucyhcInByZSBzZWxlY3RlclwiKSkge1xyXG4vLyAgICAgICAgLy8vLyAgICB2aWV3ZXIub3BlcmF0b3JNYW5hZ2VyW1wicHJlIHNlbGVjdGVyXCJdLmVuYWJsZSA9IHRydWU7XHJcbi8vICAgICAgICAvLy8vfVxyXG5cclxuLy8gICAgICAgIC8vLy9pZiAodGhpcy5NQnV0dG9uVXAgIT0gbnVsbCkge1xyXG4vLyAgICAgICAgLy8vLyAgICB0aGlzLk1CdXR0b25VcCh2aWV3ZXIsIG5ldyBWaWV3ZXJFdmVudEFyZ3MoZSkpO1xyXG4vLyAgICAgICAgLy8vL31cclxuXHJcbi8vICAgICAgICAvL3RoaXMubUJ1dHRvbkRvd25lZCA9IGZhbHNlO1xyXG5cclxuLy8gICAgICAgIC8vdGhpcy52aWV3ZXIudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuLy8gICAgICAgIHN1cGVyLm9uTUJ1dHRvblVwKGUpO1xyXG4vLyAgICB9XHJcblxyXG4vLyAgICBvbk1vdXNlV2hlZWwoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGxldCB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcclxuXHJcbi8vICAgICAgICBsZXQgd2V2ZW50OiBXaGVlbEV2ZW50ID0gZS53aGVlbEV2ZW50KCk7XHJcbi8vICAgICAgICBsZXQgZGVsdGEgPSBNYXRoLmFicyh3ZXZlbnQud2hlZWxEZWx0YSk7XHJcblxyXG4vLyAgICAgICAgbGV0IGZhY3RvcjogbnVtYmVyID0gd2V2ZW50LndoZWVsRGVsdGEgLyA2MDAuMDtcclxuLy8gICAgICAgIGlmIChkZWx0YSA9PSAxMjApIHtcclxuLy8gICAgICAgICAgICBmYWN0b3IgPSB3ZXZlbnQud2hlZWxEZWx0YSAvIDYwMC4wO1xyXG4vLyAgICAgICAgfVxyXG4vLyAgICAgICAgZWxzZSBpZiAoZGVsdGEgPT0gMzYwKSB7XHJcbi8vICAgICAgICAgICAgZmFjdG9yID0gd2V2ZW50LndoZWVsRGVsdGEgLyAxODAwLjA7XHJcbi8vICAgICAgICB9XHJcbi8vICAgICAgICBlbHNlIGlmIChkZWx0YSA9PSAzKSB7XHJcbi8vICAgICAgICAgICAgZmFjdG9yID0gd2V2ZW50LndoZWVsRGVsdGEgLyAxNS4wO1xyXG4vLyAgICAgICAgfVxyXG5cclxuLy8gICAgICAgIGZhY3RvciA9IDEuMCAtIGZhY3RvcjtcclxuXHJcbi8vICAgICAgICBpZiAoZmFjdG9yID4gMCkge1xyXG5cclxuLy8gICAgICAgICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHZpZXdlci5zY2VuZUtleSgpKTtcclxuLy8gICAgICAgICAgICB7XHJcbi8vICAgICAgICAgICAgICAgIEpTX1pvb21fQ2FtZXJhKGZhY3Rvcik7XHJcbi8vICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbi8vICAgICAgICAgICAgdmlld2VyLnNjZW5lQ2FtZXJhQ2hhbmdlZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogRnVuY3Rpb24pIHtcclxuLy8gICAgICAgICAgICAgICAgdmFsdWUodmlld2VyLCBDYW1lcmFDaGFuZ2VUeXBlLlNjYWxlKTtcclxuLy8gICAgICAgICAgICB9KTtcclxuXHJcbi8vICAgICAgICAgICAgdmlld2VyLnVwZGF0ZURpc3BsYXkoKTtcclxuLy8gICAgICAgIH1cclxuXHJcbi8vICAgICAgICBzdXBlci5vbk1vdXNlV2hlZWwoZSk7XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIG9uTEJ1dHRvbkRvd25BbmRNb3ZlKGU6IFZpZXdlckV2ZW50KSB7XHJcbi8vICAgICAgICBsZXQgdmlld2VyID0gdGhpcy52aWV3ZXI7XHJcblxyXG4vLyAgICAgICAgaWYgKCF2aWV3ZXIuckJ1dHRvbkRvd24gJiYgIXRoaXMucm90YXRpbmcgJiYgdGhpcy5fbW92ZUJ1dHRvblR5cGUgPT0gTW92ZUJ1dHRvblR5cGUuTGVmdCkge1xyXG4vLyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDYW1lcmFPcGVyYXRlU3RhdGUuUGFuO1xyXG5cclxuLy8gICAgICAgICAgICBsZXQgZGVsdGEgPSBQb2ludC5zdWJ0cmFjdChlLm1vdXNlV29ybGRQb3MoKSwgdGhpcy5kb3duV29ybGRQb3MpO1xyXG5cclxuLy8gICAgICAgICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHZpZXdlci5zY2VuZUtleSgpKTtcclxuLy8gICAgICAgICAgICB7XHJcbi8vICAgICAgICAgICAgICAgIEpTX0RvbGx5X0NhbWVyYShkZWx0YVswXSwgZGVsdGFbMV0sIGRlbHRhWzJdKTtcclxuLy8gICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuLy8gICAgICAgICAgICB2aWV3ZXIuc2NlbmVDYW1lcmFDaGFuZ2VkLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlOiBGdW5jdGlvbikge1xyXG4vLyAgICAgICAgICAgICAgICB2YWx1ZSh2aWV3ZXIsIENhbWVyYUNoYW5nZVR5cGUuVHJhbnNsYXRlKTtcclxuLy8gICAgICAgICAgICB9KTtcclxuXHJcbi8vICAgICAgICAgICAgdmlld2VyLnVwZGF0ZURpc3BsYXkoKTtcclxuLy8gICAgICAgIH1cclxuXHJcbi8vICAgICAgICBzdXBlci5vbkxCdXR0b25Eb3duQW5kTW92ZShlKTtcclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25NQnV0dG9uRG93bkFuZE1vdmUoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGxldCB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcclxuXHJcbi8vICAgICAgICBpZiAoIXZpZXdlci5yQnV0dG9uRG93biAmJiAhdGhpcy5yb3RhdGluZyAmJiB0aGlzLl9tb3ZlQnV0dG9uVHlwZSA9PSBNb3ZlQnV0dG9uVHlwZS5NaWRkbGUpIHtcclxuLy8gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ2FtZXJhT3BlcmF0ZVN0YXRlLlBhbjtcclxuXHJcbi8vICAgICAgICAgICAgbGV0IGRlbHRhID0gUG9pbnQuc3VidHJhY3QoZS5tb3VzZVdvcmxkUG9zKCksIHRoaXMuZG93bldvcmxkUG9zKTtcclxuXHJcbi8vICAgICAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aWV3ZXIuc2NlbmVLZXkoKSk7XHJcbi8vICAgICAgICAgICAge1xyXG4vLyAgICAgICAgICAgICAgICBKU19Eb2xseV9DYW1lcmEoZGVsdGFbMF0sIGRlbHRhWzFdLCBkZWx0YVsyXSk7XHJcbi8vICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbi8vICAgICAgICAgICAgdmlld2VyLnNjZW5lQ2FtZXJhQ2hhbmdlZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogRnVuY3Rpb24pIHtcclxuLy8gICAgICAgICAgICAgICAgdmFsdWUodmlld2VyLCBDYW1lcmFDaGFuZ2VUeXBlLlRyYW5zbGF0ZSk7XHJcbi8vICAgICAgICAgICAgfSk7XHJcblxyXG4vLyAgICAgICAgICAgIHRoaXMudmlld2VyLnVwZGF0ZURpc3BsYXkoKTtcclxuLy8gICAgICAgIH1cclxuXHJcbi8vICAgICAgICBzdXBlci5vbk1CdXR0b25Eb3duQW5kTW92ZShlKTtcclxuLy8gICAgfVxyXG5cclxuLy8gICAgb25SQnV0dG9uRG93bkFuZE1vdmUoZTogVmlld2VyRXZlbnQpIHtcclxuLy8gICAgICAgIGxldCB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcclxuXHJcbi8vICAgICAgICBpZiAoIXRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgJiYgIXZpZXdlci5fY2FtZXJhT3JpZW50YXRpb25GaXhlZCkge1xyXG4vLyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDYW1lcmFPcGVyYXRlU3RhdGUuUm90YXRlO1xyXG5cclxuLy8gICAgICAgICAgICBsZXQgbmV3X3NwaGVyZV9wb2ludCA9IHRoaXMuZ2V0U3BoZXJlUG9pbnQoZSk7XHJcblxyXG4vLyAgICAgICAgICAgIGxldCBzdGFydCA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5tb3ZlU3BoZXJlUG9zKTtcclxuLy8gICAgICAgICAgICBWZWN0b3Iubm9ybWFsaXplKHN0YXJ0KTtcclxuLy8gICAgICAgICAgICBsZXQgZW5kID0gbmV3IEZsb2F0MzJBcnJheShuZXdfc3BoZXJlX3BvaW50KTtcclxuLy8gICAgICAgICAgICBWZWN0b3Iubm9ybWFsaXplKGVuZCk7XHJcblxyXG4vLyAgICAgICAgICAgIGlmIChWZWN0b3IubW9kdWxlKFZlY3Rvci5jcm9zcyhzdGFydCwgZW5kKSkgPiBUb2xlcmFuY2UucmVzYWJzKSB7XHJcblxyXG4vLyAgICAgICAgICAgICAgICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5KHZpZXdlci5zY2VuZUtleSgpKTtcclxuLy8gICAgICAgICAgICAgICAge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgSlNfUm9sbF9DYW1lcmEoc3RhcnQsIGVuZCk7XHJcbi8vICAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuLy8gICAgICAgICAgICAgICAgdGhpcy5tb3ZlU3BoZXJlUG9zID0gbmV3X3NwaGVyZV9wb2ludDtcclxuXHJcbi8vICAgICAgICAgICAgICAgIHZpZXdlci5zY2VuZUNhbWVyYUNoYW5nZWQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWU6IEZ1bmN0aW9uKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICB2YWx1ZSh2aWV3ZXIsIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlKTtcclxuLy8gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4vLyAgICAgICAgICAgICAgICB2aWV3ZXIudXBkYXRlRGlzcGxheSgpO1xyXG4vLyAgICAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgICAgdGhpcy5yb3RhdGluZyA9IHRydWU7XHJcbi8vICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgc3VwZXIub25SQnV0dG9uRG93bkFuZE1vdmUoZSk7XHJcbi8vICAgIH1cclxuXHJcbi8vICAgIHByaXZhdGUgZ2V0U3BoZXJlUG9pbnQoZTogVmlld2VyRXZlbnQpOiBGbG9hdDMyQXJyYXkge1xyXG4vLyAgICAgICAgbGV0IHNwaGVyZV9wb3MgPSBlLm1vdXNlVW5pdFdpbmRvd1BvcygpO1xyXG4vLyAgICAgICAgc3BoZXJlX3Bvc1syXSA9IDAuMDtcclxuLy8gICAgICAgIGxldCBhID0gc3BoZXJlX3Bvc1swXSAqIHNwaGVyZV9wb3NbMF0gKyBzcGhlcmVfcG9zWzFdICogc3BoZXJlX3Bvc1sxXTtcclxuLy8gICAgICAgIGxldCBiID0gTWF0aC5zcXJ0KGEpO1xyXG5cclxuLy8gICAgICAgIGlmIChiID4gdGhpcy5yYWRpdXMpIHtcclxuLy8gICAgICAgICAgICBsZXQgeF9kaXIgPSBuZXcgRmxvYXQzMkFycmF5KHNwaGVyZV9wb3MpO1xyXG4vLyAgICAgICAgICAgIFZlY3Rvci5ub3JtYWxpemUoeF9kaXIpO1xyXG4vLyAgICAgICAgICAgIGxldCB2X3VwID0gbmV3IEZsb2F0MzJBcnJheShbMC4wLCAwLjAsIDEuMF0pO1xyXG4vLyAgICAgICAgICAgIGxldCB5X2RpciA9IFZlY3Rvci5jcm9zcyh2X3VwLCB4X2Rpcik7XHJcbi8vICAgICAgICAgICAgVmVjdG9yLm5vcm1hbGl6ZSh5X2Rpcik7XHJcblxyXG4vLyAgICAgICAgICAgIGxldCBvcmlnaW4gPSBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMC4wXSk7XHJcblxyXG4vLyAgICAgICAgICAgIGxldCB3Y3MgPSBuZXcgV2NzKG9yaWdpbiwgeF9kaXIsIHlfZGlyKTtcclxuXHJcbi8vICAgICAgICAgICAgbGV0IGxvY2FsX3NwaGVyZV9wb3MgPSB3Y3MudG9Mb2NhbFBvaW50KHNwaGVyZV9wb3MpO1xyXG5cclxuLy8gICAgICAgICAgICBsZXQgcmVtYWluID0gbG9jYWxfc3BoZXJlX3Bvc1swXSAlICg0ICogdGhpcy5yYWRpdXMpO1xyXG4vLyAgICAgICAgICAgIC8vZG91YmxlIHRlbXAgPSBsb2NhbF9zcGhlcmVfcG9zLng7XHJcblxyXG4vLyAgICAgICAgICAgIGxldCBuZXdfeCA9ICh0aGlzLnJhZGl1cyAqICgyIC8gTWF0aC5QSSkpICogTWF0aC5hc2luKE1hdGguc2luKE1hdGguUEkgKiAobG9jYWxfc3BoZXJlX3Bvc1swXSAvICgyICogdGhpcy5yYWRpdXMpKSkpO1xyXG4vLyAgICAgICAgICAgIGxvY2FsX3NwaGVyZV9wb3NbMF0gPSBuZXdfeDtcclxuXHJcbi8vICAgICAgICAgICAgc3BoZXJlX3BvcyA9IHdjcy50b01vZGVsUG9pbnQobG9jYWxfc3BoZXJlX3Bvcyk7XHJcblxyXG4vLyAgICAgICAgICAgIGEgPSBzcGhlcmVfcG9zWzBdICogc3BoZXJlX3Bvc1swXSArIHNwaGVyZV9wb3NbMV0gKiBzcGhlcmVfcG9zWzFdO1xyXG5cclxuLy8gICAgICAgICAgICBpZiAocmVtYWluID4gdGhpcy5yYWRpdXMgJiYgcmVtYWluIDwgMyAqIHRoaXMucmFkaXVzKSB7XHJcbi8vICAgICAgICAgICAgICAgIHNwaGVyZV9wb3NbMl0gPSAtTWF0aC5zcXJ0KHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgLSBhKTtcclxuLy8gICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgZWxzZSB7XHJcbi8vICAgICAgICAgICAgICAgIHNwaGVyZV9wb3NbMl0gPSBNYXRoLnNxcnQodGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyAtIGEpO1xyXG4vLyAgICAgICAgICAgIH1cclxuLy8gICAgICAgIH1cclxuLy8gICAgICAgIGVsc2Uge1xyXG4vLyAgICAgICAgICAgIHNwaGVyZV9wb3NbMl0gPSBNYXRoLnNxcnQodGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyAtIGEpO1xyXG4vLyAgICAgICAgfVxyXG5cclxuLy8gICAgICAgIHJldHVybiBzcGhlcmVfcG9zO1xyXG4vLyAgICB9XHJcblxyXG4vLyAgICBwcml2YXRlIHNldENhbWVyYUNlbnRlcihlOiBWaWV3ZXJFdmVudCkge1xyXG4vLyAgICAgICAgLy9sZXQgd2luX3BvcyA9IGUubW91c2VVbml0V2luZG93UG9zKCk7XHJcblxyXG4vLyAgICAgICAgLy9sZXQgY2FtZXJhX3RhcmdldCA9IHRoaXMudmlld2VyLnNjZW5lU2VnbWVudC5jYW1lcmEoKS50YXJnZXQoKTtcclxuLy8gICAgICAgIC8vbGV0IHNlbF9wb3MgPSBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAwXSk7XHJcblxyXG4vLyAgICAgICAgLy9MaXN0IDwgU2VsZWN0aW9uS2V5ID4gc2VsZWN0aW9uX2l0ZW1zID0gdGhpcy52aWV3ZXIuU2VsZWN0QnlQb2ludCh3aW5fcG9zKTtcclxuLy8gICAgICAgIC8vaWYgKHNlbGVjdGlvbl9pdGVtcy5Db3VudCA+IDApIHtcclxuLy8gICAgICAgIC8vICAgIHNlbF9wb3MgPSBzZWxlY3Rpb25faXRlbXNbMF0uU2VsZWN0ZWRQb3NpdGlvbjtcclxuLy8gICAgICAgIC8vfVxyXG4vLyAgICAgICAgLy9lbHNlIHtcclxuLy8gICAgICAgIC8vICAgIHNlbF9wb3MgPSBlLk1vdXNlV29ybGRQb3M7XHJcblxyXG4vLyAgICAgICAgLy8gICAgY2FtZXJhX3RhcmdldCA9IHZpZXdlci5TY2VuZVNlZ21lbnQuQ29udmVydENvb3JkaW5hdGUoSG9vcHMuQ29vcmRpbmF0ZVNwYWNlLklubmVyV2luZG93LCBIb29wcy5Db29yZGluYXRlU3BhY2UuV29ybGQsIG5ldyBQb2ludCgwLCAwLCAwKSk7XHJcbi8vICAgICAgICAvL31cclxuXHJcbi8vICAgICAgICAvL1BvaW50IG9mZnNldF9wb3MgPSAoUG9pbnQpKHNlbF9wb3MgLSBjYW1lcmFfdGFyZ2V0KTtcclxuLy8gICAgICAgIC8vdGhpcy52aWV3ZXIuU2NlbmVTZWdtZW50LkNhbWVyYS5Qb3NpdGlvbiA9IHRoaXMudmlld2VyLlNjZW5lU2VnbWVudC5DYW1lcmEuUG9zaXRpb24gKyBvZmZzZXRfcG9zO1xyXG4vLyAgICAgICAgLy90aGlzLnZpZXdlci5TY2VuZVNlZ21lbnQuQ2FtZXJhLlRhcmdldCA9IHRoaXMudmlld2VyLlNjZW5lU2VnbWVudC5DYW1lcmEuVGFyZ2V0ICsgb2Zmc2V0X3BvcztcclxuXHJcbi8vICAgICAgICAvL3ZpZXdlci5FeGVTY2VuZUNhbWVyYUNoYW5nZWQobmV3IENhbWVyYUNoYW5nZWRFdmVudEFyZ3MoQ2FtZXJhQ2hhbmdlZFR5cGUuVHJhbnNsYXRlKSk7XHJcblxyXG4vLyAgICAgICAgLy9IQ1MuVXBkYXRlX0Rpc3BsYXkoKTtcclxuLy8gICAgICAgIC8vdmlld2VyLlVwZGF0ZURpc3BsYXkoKTtcclxuLy8gICAgfVxyXG4vL31cclxuXHJcbmV4cG9ydCBjbGFzcyBHc1dlYkdMVXRpbGl0eSB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRVBTSUxPTiA9IDAuMDAwMDE7XHJcblxyXG4gIHN0YXRpYyBzbW9vdGhUcmFuc2l0aW9uKFxyXG4gICAgY286IEZsb2F0MzJBcnJheSxcclxuICAgIHRvOiBGbG9hdDMyQXJyYXksXHJcbiAgICB1bzogRmxvYXQzMkFycmF5LFxyXG4gICAgd2lkdGhvOiBudW1iZXIsXHJcbiAgICBoZWlnaHRvOiBudW1iZXIsXHJcbiAgICBjbjogRmxvYXQzMkFycmF5LFxyXG4gICAgdG46IEZsb2F0MzJBcnJheSxcclxuICAgIHVuOiBGbG9hdDMyQXJyYXksXHJcbiAgICB3aWR0aG46IG51bWJlcixcclxuICAgIGhlaWdodG46IG51bWJlcixcclxuICAgIHZpOiBhbnlcclxuICApIHtcclxuICAgIC8vbGV0IGNhbWVyYSA9IHZpLmNhbWVyYSgpO1xyXG4gICAgbGV0IGNhbWVyYTogYW55ID0ge1xyXG4gICAgICBwb3NpdGlvbjogbmV3IEZsb2F0MzJBcnJheSgzKSxcclxuICAgICAgdGFyZ2V0OiBuZXcgRmxvYXQzMkFycmF5KDMpLFxyXG4gICAgICB1cDogbmV3IEZsb2F0MzJBcnJheSgzKSxcclxuICAgICAgd2lkdGg6IDAsXHJcbiAgICAgIGhlaWdodDogMCxcclxuICAgICAgcHJvamVjdGlvbjogXCJcIixcclxuICAgIH07XHJcblxyXG4gICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aS5fc2NlbmVLZXkpO1xyXG4gICAge1xyXG4gICAgICBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgIGxldCBYID0gMDtcclxuICAgIGxldCBZID0gMTtcclxuICAgIGxldCBaID0gMjtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIFRvbGVyYW5jZS5zYW1lVmFsdWVGbG9hdEFycmF5KGNvLCBjbikgJiZcclxuICAgICAgVG9sZXJhbmNlLnNhbWVWYWx1ZUZsb2F0QXJyYXkodG8sIHRuKSAmJlxyXG4gICAgICBUb2xlcmFuY2Uuc2FtZVZhbHVlRmxvYXRBcnJheSh1bywgdW4pICYmXHJcbiAgICAgIFRvbGVyYW5jZS5zYW1lVmFsdWUod2lkdGhvLCB3aWR0aG4pICYmXHJcbiAgICAgIFRvbGVyYW5jZS5zYW1lVmFsdWUoaGVpZ2h0bywgaGVpZ2h0bilcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1hdHJpeF9vbGQgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcclxuICAgIGxldCBtYXRyaXhfbmV3ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XHJcbiAgICBsZXQgdmlld192ZWN0b3Jfb2xkID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgIHRvW1hdIC0gY29bWF0sXHJcbiAgICAgIHRvW1ldIC0gY29bWV0sXHJcbiAgICAgIHRvW1pdIC0gY29bWl0sXHJcbiAgICBdKTtcclxuICAgIGxldCB2aWV3X3ZlY3Rvcl9uZXcgPSBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgdG5bWF0gLSBjbltYXSxcclxuICAgICAgdG5bWV0gLSBjbltZXSxcclxuICAgICAgdG5bWl0gLSBjbltaXSxcclxuICAgIF0pO1xyXG5cclxuICAgIGxldCBsZW5ndGggPSBWZWN0b3IubW9kdWxlKHZpZXdfdmVjdG9yX29sZCk7XHJcblxyXG4gICAgbGV0IGxlbmd0aF9kZWx0YSA9IFZlY3Rvci5tb2R1bGUodmlld192ZWN0b3JfbmV3KSAtIGxlbmd0aDtcclxuXHJcbiAgICBWZWN0b3Iubm9ybWFsaXplKHZpZXdfdmVjdG9yX29sZCk7XHJcbiAgICBWZWN0b3Iubm9ybWFsaXplKHZpZXdfdmVjdG9yX25ldyk7XHJcblxyXG4gICAgbGV0IG5lZWRfcm90YXRpb24gPSB0cnVlO1xyXG4gICAgbGV0IHJvdGF0aW9uX2RlbHRhID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgIHZpZXdfdmVjdG9yX29sZFswXSAtIHZpZXdfdmVjdG9yX25ld1swXSxcclxuICAgICAgdmlld192ZWN0b3Jfb2xkWzFdIC0gdmlld192ZWN0b3JfbmV3WzFdLFxyXG4gICAgICB2aWV3X3ZlY3Rvcl9vbGRbMl0gLSB2aWV3X3ZlY3Rvcl9uZXdbMl0sXHJcbiAgICBdKTtcclxuXHJcbiAgICBsZXQgdXBfZGVsdGEgPSBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgdW5bWF0gLSB1b1tYXSxcclxuICAgICAgdW5bWV0gLSB1b1tZXSxcclxuICAgICAgdW5bWl0gLSB1b1taXSxcclxuICAgIF0pO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgVmVjdG9yLm1vZHVsZShyb3RhdGlvbl9kZWx0YSkgPCAwLjAwMDEgJiZcclxuICAgICAgVmVjdG9yLm1vZHVsZSh1cF9kZWx0YSkgPCAwLjAwMDFcclxuICAgICkge1xyXG4gICAgICBuZWVkX3JvdGF0aW9uID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRyYW5zbGF0aW9uID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgIGxldCBwb3NpdGlvbl9tb3ZlX2RlbHRhID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuXHJcbiAgICBpZiAobmVlZF9yb3RhdGlvbikge1xyXG4gICAgICBHc1dlYkdMVXRpbGl0eS5HZXRNYXRyaXhGcm9tQ2FtZXJhKHRvLCBjbywgdW8sIHRyYW5zbGF0aW9uLCBtYXRyaXhfb2xkKTtcclxuICAgICAgR3NXZWJHTFV0aWxpdHkuR2V0TWF0cml4RnJvbUNhbWVyYSh0biwgY24sIHVuLCB0cmFuc2xhdGlvbiwgbWF0cml4X25ldyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwb3NpdGlvbl9tb3ZlX2RlbHRhW1hdID0gY25bWF0gLSBjb1tYXTtcclxuICAgICAgcG9zaXRpb25fbW92ZV9kZWx0YVtZXSA9IGNuW1ldIC0gY29bWV07XHJcbiAgICAgIHBvc2l0aW9uX21vdmVfZGVsdGFbWl0gPSBjbltaXSAtIGNvW1pdO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXRyaXhfaW50ZXJpbSA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xyXG4gICAgbGV0IHF1YXRfb2xkID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcclxuICAgIGxldCBxdWF0X25ldyA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XHJcbiAgICBsZXQgcXVhdF9pbnRlcmltID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcclxuXHJcbiAgICBpZiAobmVlZF9yb3RhdGlvbikge1xyXG4gICAgICBHc1dlYkdMVXRpbGl0eS5NYXRyaXhUb1F1YXRlcm5pb24obWF0cml4X29sZCwgcXVhdF9vbGQpO1xyXG4gICAgICBHc1dlYkdMVXRpbGl0eS5NYXRyaXhUb1F1YXRlcm5pb24obWF0cml4X25ldywgcXVhdF9uZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0YXJnZXRfbW92ZV9kZWx0YSA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICB0bltYXSAtIHRvW1hdLFxyXG4gICAgICB0bltZXSAtIHRvW1ldLFxyXG4gICAgICB0bltaXSAtIHRvW1pdLFxyXG4gICAgXSk7XHJcblxyXG4gICAgbGV0IGZpZWxkX3dpZHRoX2RlbHRhID0gd2lkdGhuIC0gd2lkdGhvO1xyXG4gICAgbGV0IGZpZWxkX2hlaWdodF9kZWx0YSA9IGhlaWdodG4gLSBoZWlnaHRvO1xyXG5cclxuICAgIGxldCBkb3QxLCBkb3QyO1xyXG5cclxuICAgIGlmIChuZWVkX3JvdGF0aW9uKSB7XHJcbiAgICAgIC8vIFNpbXBsZSBkb3QgcHJvZHVjdCB0byBkZXRlcm1pbmUgd2hpY2ggZGlyZWN0aW9uIHRoZSBxdWF0ZXJuaW9uIHNob3VsZFxyXG4gICAgICAvLyBnbyBpZiB3ZSB3YW50IHRvIHRha2UgdGhlIHNob3J0ZXN0IHBhdGguXHJcbiAgICAgIGRvdDEgPVxyXG4gICAgICAgIChxdWF0X29sZFswXSAtIHF1YXRfbmV3WzBdKSAqIChxdWF0X29sZFswXSAtIHF1YXRfbmV3WzBdKSArXHJcbiAgICAgICAgKHF1YXRfb2xkWzFdIC0gcXVhdF9uZXdbMV0pICogKHF1YXRfb2xkWzFdIC0gcXVhdF9uZXdbMV0pICtcclxuICAgICAgICAocXVhdF9vbGRbMl0gLSBxdWF0X25ld1syXSkgKiAocXVhdF9vbGRbMl0gLSBxdWF0X25ld1syXSkgK1xyXG4gICAgICAgIChxdWF0X29sZFszXSAtIHF1YXRfbmV3WzNdKSAqIChxdWF0X29sZFszXSAtIHF1YXRfbmV3WzNdKTtcclxuXHJcbiAgICAgIGRvdDIgPVxyXG4gICAgICAgIChxdWF0X29sZFswXSArIHF1YXRfbmV3WzBdKSAqIChxdWF0X29sZFswXSArIHF1YXRfbmV3WzBdKSArXHJcbiAgICAgICAgKHF1YXRfb2xkWzFdICsgcXVhdF9uZXdbMV0pICogKHF1YXRfb2xkWzFdICsgcXVhdF9uZXdbMV0pICtcclxuICAgICAgICAocXVhdF9vbGRbMl0gKyBxdWF0X25ld1syXSkgKiAocXVhdF9vbGRbMl0gKyBxdWF0X25ld1syXSkgK1xyXG4gICAgICAgIChxdWF0X29sZFszXSArIHF1YXRfbmV3WzNdKSAqIChxdWF0X29sZFszXSArIHF1YXRfbmV3WzNdKTtcclxuXHJcbiAgICAgIGlmIChkb3QyIDwgZG90MSkge1xyXG4gICAgICAgIHF1YXRfbmV3WzBdID0gLXF1YXRfbmV3WzBdO1xyXG4gICAgICAgIHF1YXRfbmV3WzFdID0gLXF1YXRfbmV3WzFdO1xyXG4gICAgICAgIHF1YXRfbmV3WzJdID0gLXF1YXRfbmV3WzJdO1xyXG4gICAgICAgIHF1YXRfbmV3WzNdID0gLXF1YXRfbmV3WzNdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBvc2l0aW9uID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcclxuICAgIGxldCB1cF92ZWN0b3IgPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xyXG5cclxuICAgIGxldCB0b3RhbF9kdXJhdGlvbiA9IHZpLl9zbW9vdGhUcmFuc2l0aW9uRHVyYXRpb247XHJcbiAgICAvL2xldCB0b3RhbF9kdXJhdGlvbiA9IDUwMDtcclxuICAgIC8vXHRmbG9hdCBpbml0aWFsX2RlbHRhID0gKGZsb2F0KSAwLjA1IC8gdG90YWxfZHVyYXRpb247XHRcdFx0Ly8wLjA1ID0gMjBmcHNcdChndWVzc2luZylcclxuICAgIGxldCBxLCBjdXJyZW50X3RpbWU6IG51bWJlcjtcclxuXHJcbiAgICBsZXQgdG90YWxfdGltZV9zdGFydCA9IERhdGUubm93KCk7XHJcbiAgICB0b3RhbF90aW1lX3N0YXJ0IC09IDEwMDsgLy8wLjFtc1xyXG5cclxuICAgIC8vZnVuY3Rpb24gdWRfdGljaygpIHtcclxuICAgIC8vICAgIHZpLnNjZW5lQ2FtZXJhQ2hhbmdlZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogRnVuY3Rpb24pIHtcclxuICAgIC8vICAgICAgICB2YWx1ZSh2aSwgQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGVBbmRTY2FsZSk7XHJcbiAgICAvLyAgICB9KTtcclxuICAgIC8vICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgIC8vfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRpY2soKSB7XHJcbiAgICAgIGN1cnJlbnRfdGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgIHEgPSAoY3VycmVudF90aW1lIC0gdG90YWxfdGltZV9zdGFydCkgLyB0b3RhbF9kdXJhdGlvbjtcclxuICAgICAgaWYgKHEgPj0gMS4wKSB7XHJcbiAgICAgICAgcSA9IDEuMDtcclxuICAgICAgfVxyXG4gICAgICBxID0gR3NXZWJHTFV0aWxpdHkuRWFzZUluRWFzZU91dChxLCAwLjQ5LCAwLjAyLCAwLjQ5KTtcclxuICAgICAgaWYgKHEgPCAwKSB7XHJcbiAgICAgICAgcSA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZWVkX3JvdGF0aW9uKSB7XHJcbiAgICAgICAgbGV0IHRvMiA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAgICAgdG9bWF0gKyBxICogdGFyZ2V0X21vdmVfZGVsdGFbWF0sXHJcbiAgICAgICAgICB0b1tZXSArIHEgKiB0YXJnZXRfbW92ZV9kZWx0YVtZXSxcclxuICAgICAgICAgIHRvW1pdICsgcSAqIHRhcmdldF9tb3ZlX2RlbHRhW1pdLFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICAvLyBmaXJzdCBsZXQgdXNlIHF1YXRlcm5pb25zIHRvIHRha2UgY2FyZSBvZiB0aGUgaW50ZXJwb2xhdGlvblxyXG4gICAgICAgIC8vIG9mIHRoZSByb3RhdGlvbiBlbGVtZW50IG9mIHRoZSBjYW1lcmEgbW92ZW1lbnRcclxuICAgICAgICBHc1dlYkdMVXRpbGl0eS5UcmFuc2l0aW9uUXVhdGVybmlvbihcclxuICAgICAgICAgIHF1YXRfb2xkLFxyXG4gICAgICAgICAgcXVhdF9uZXcsXHJcbiAgICAgICAgICBxLFxyXG4gICAgICAgICAgcXVhdF9pbnRlcmltXHJcbiAgICAgICAgKTtcclxuICAgICAgICBHc1dlYkdMVXRpbGl0eS5RdWF0ZXJuaW9uVG9NYXRyaXgocXVhdF9pbnRlcmltLCBtYXRyaXhfaW50ZXJpbSk7XHJcblxyXG4gICAgICAgIHBvc2l0aW9uW1hdID0gdG8yW1hdIC0gbWF0cml4X2ludGVyaW1bOF0gKiAobGVuZ3RoICsgbGVuZ3RoX2RlbHRhICogcSk7XHJcbiAgICAgICAgcG9zaXRpb25bWV0gPSB0bzJbWV0gLSBtYXRyaXhfaW50ZXJpbVs5XSAqIChsZW5ndGggKyBsZW5ndGhfZGVsdGEgKiBxKTtcclxuICAgICAgICBwb3NpdGlvbltaXSA9IHRvMltaXSAtIG1hdHJpeF9pbnRlcmltWzEwXSAqIChsZW5ndGggKyBsZW5ndGhfZGVsdGEgKiBxKTtcclxuXHJcbiAgICAgICAgdXBfdmVjdG9yW1hdID0gbWF0cml4X2ludGVyaW1bNF07XHJcbiAgICAgICAgdXBfdmVjdG9yW1ldID0gbWF0cml4X2ludGVyaW1bNV07XHJcbiAgICAgICAgdXBfdmVjdG9yW1pdID0gbWF0cml4X2ludGVyaW1bNl07XHJcblxyXG4gICAgICAgIC8vY2FtZXJhLnBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAvL2NhbWVyYS51cCh1cF92ZWN0b3IpO1xyXG4gICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhX1Bvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmFfVXAodXBfdmVjdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgICAvL2xldCB1cCA9IEpTX1Nob3dfQ2FtZXJhX1VwKCk7XHJcblxyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJjYW1lcmEgdXA6XCIgKyB1cFswXSArIFwiLFwiICsgdXBbMV0gKyBcIixcIiArIHVwWzJdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvL2NhbWVyYS5wb3NpdGlvbihuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgICAvLyAgICBjb1tYXSArIChxICogcG9zaXRpb25fbW92ZV9kZWx0YVtYXSksXHJcbiAgICAgICAgLy8gICAgY29bWV0gKyAocSAqIHBvc2l0aW9uX21vdmVfZGVsdGFbWV0pLFxyXG4gICAgICAgIC8vICAgIGNvW1pdICsgKHEgKiBwb3NpdGlvbl9tb3ZlX2RlbHRhW1pdKV0pKTtcclxuXHJcbiAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aS5fc2NlbmVLZXkpO1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24oXHJcbiAgICAgICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAgICAgICAgIGNvW1hdICsgcSAqIHBvc2l0aW9uX21vdmVfZGVsdGFbWF0sXHJcbiAgICAgICAgICAgICAgY29bWV0gKyBxICogcG9zaXRpb25fbW92ZV9kZWx0YVtZXSxcclxuICAgICAgICAgICAgICBjb1taXSArIHEgKiBwb3NpdGlvbl9tb3ZlX2RlbHRhW1pdLFxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBub3cgbGluZWFybHkgaW50ZXJwb2xhdGUgdGhlIGNhbWVyYSB0YXJnZXQgYW5kIGZpZWxkIGNoYW5nZXNcclxuICAgICAgLy9jYW1lcmEudGFyZ2V0KG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAvLyAgICB0b1tYXSArIChxICogdGFyZ2V0X21vdmVfZGVsdGFbWF0pLFxyXG4gICAgICAvLyAgICB0b1tZXSArIChxICogdGFyZ2V0X21vdmVfZGVsdGFbWV0pLFxyXG4gICAgICAvLyAgICB0b1taXSArIChxICogdGFyZ2V0X21vdmVfZGVsdGFbWl0pXSkpO1xyXG5cclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aS5fc2NlbmVLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgSlNfU2V0X0NhbWVyYV9UYXJnZXQoXHJcbiAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgICAgICAgdG9bWF0gKyBxICogdGFyZ2V0X21vdmVfZGVsdGFbWF0sXHJcbiAgICAgICAgICAgIHRvW1ldICsgcSAqIHRhcmdldF9tb3ZlX2RlbHRhW1ldLFxyXG4gICAgICAgICAgICB0b1taXSArIHEgKiB0YXJnZXRfbW92ZV9kZWx0YVtaXSxcclxuICAgICAgICAgIF0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICBsZXQgZncgPSB3aWR0aG8gKyBxICogZmllbGRfd2lkdGhfZGVsdGE7XHJcbiAgICAgIGxldCBmaCA9IGhlaWdodG8gKyBxICogZmllbGRfaGVpZ2h0X2RlbHRhO1xyXG4gICAgICBpZiAoZncgPiAwLjAwMDAxICYmIGZoID4gMC4wMDAwMSkge1xyXG4gICAgICAgIC8vY2FtZXJhLndpZHRoKGZ3KTtcclxuICAgICAgICAvL2NhbWVyYS5oZWlnaHQoZmgpO1xyXG4gICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhX0ZpZWxkKGZ3LCBmaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAgICAgcSA9IChjdXJyZW50X3RpbWUgLSB0b3RhbF90aW1lX3N0YXJ0KSAvIHRvdGFsX2R1cmF0aW9uO1xyXG5cclxuICAgICAgICAvL3ZpLnNjZW5lQ2FtZXJhQ2hhbmdlZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogRnVuY3Rpb24pIHtcclxuICAgICAgICAvLyAgICB2YWx1ZSh2aSwgQ2FtZXJhQ2hhbmdlVHlwZS5TY2FsZSk7XHJcbiAgICAgICAgLy99KTtcclxuXHJcbiAgICAgICAgdmkudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuICAgICAgICAvL2lmIChuZWVkX3JvdGF0aW9uKSB7XHJcbiAgICAgICAgLy8gICAgLy9sZXQgdXAgPSBKU19TaG93X0NhbWVyYV9VcCgpO1xyXG5cclxuICAgICAgICAvLyAgICAvL2NvbnNvbGUubG9nKFwiY2FtZXJhIHVwOlwiICsgdXBbMF0gKyBcIixcIiArIHVwWzFdICsgXCIsXCIgKyB1cFsyXSk7XHJcblxyXG4gICAgICAgIC8vICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgICAvL31cclxuICAgICAgICAvL2Vsc2Uge1xyXG4gICAgICAgIC8vICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgICAvL31cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHEgPCAxLjAgLSBHc1dlYkdMVXRpbGl0eS5FUFNJTE9OKSB7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vY2FtZXJhLnRhcmdldCh0bik7XHJcbiAgICAgICAgLy9jYW1lcmEucG9zaXRpb24oY24pO1xyXG4gICAgICAgIC8vY2FtZXJhLnVwKHVuKTtcclxuICAgICAgICAvL2NhbWVyYS53aWR0aCh3aWR0aG4pXHJcbiAgICAgICAgLy9jYW1lcmEuaGVpZ2h0KGhlaWdodG4pO1xyXG4gICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhKGNuLCB0biwgdW4sIHdpZHRobiwgaGVpZ2h0biwgY2FtZXJhLnByb2plY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICAgIHZpLnNjZW5lQ2FtZXJhQ2hhbmdlZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogRnVuY3Rpb24pIHtcclxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYml0d2lzZVxyXG4gICAgICAgICAgdmFsdWUodmksIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlIHwgQ2FtZXJhQ2hhbmdlVHlwZS5TY2FsZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB2aS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XHJcblxyXG4gICAgLy9jYW1lcmEudGFyZ2V0KHRuKTtcclxuICAgIC8vY2FtZXJhLnBvc2l0aW9uKGNuKTtcclxuICAgIC8vY2FtZXJhLnVwKHVuKTtcclxuICAgIC8vY2FtZXJhLndpZHRoKHdpZHRobilcclxuICAgIC8vY2FtZXJhLmhlaWdodChoZWlnaHRuKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzbW9vdGhUcmFuc2l0aW9uRChcclxuICAgIGNvOiBGbG9hdDY0QXJyYXksXHJcbiAgICB0bzogRmxvYXQ2NEFycmF5LFxyXG4gICAgdW86IEZsb2F0NjRBcnJheSxcclxuICAgIHdpZHRobzogbnVtYmVyLFxyXG4gICAgaGVpZ2h0bzogbnVtYmVyLFxyXG4gICAgY246IEZsb2F0NjRBcnJheSxcclxuICAgIHRuOiBGbG9hdDY0QXJyYXksXHJcbiAgICB1bjogRmxvYXQ2NEFycmF5LFxyXG4gICAgd2lkdGhuOiBudW1iZXIsXHJcbiAgICBoZWlnaHRuOiBudW1iZXIsXHJcbiAgICB2aTogYW55XHJcbiAgKSB7XHJcbiAgICAvL2xldCBjYW1lcmEgPSB2aS5jYW1lcmEoKTtcclxuICAgICh2aSBhcyBWaWV3ZXIpLmlzQnVzeSA9IHRydWU7XHJcblxyXG4gICAgbGV0IGNhbWVyYTogYW55O1xyXG4gICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aS5fc2NlbmVLZXkpO1xyXG4gICAge1xyXG4gICAgICBjYW1lcmEgPSBKU19TaG93X0NhbWVyYSgpO1xyXG4gICAgfVxyXG4gICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgIGxldCBYID0gMDtcclxuICAgIGxldCBZID0gMTtcclxuICAgIGxldCBaID0gMjtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIERUb2xlcmFuY2Uuc2FtZVZhbHVlRmxvYXRBcnJheShjbywgY24pICYmXHJcbiAgICAgIERUb2xlcmFuY2Uuc2FtZVZhbHVlRmxvYXRBcnJheSh0bywgdG4pICYmXHJcbiAgICAgIERUb2xlcmFuY2Uuc2FtZVZhbHVlRmxvYXRBcnJheSh1bywgdW4pICYmXHJcbiAgICAgIERUb2xlcmFuY2Uuc2FtZVZhbHVlKHdpZHRobywgd2lkdGhuKSAmJlxyXG4gICAgICBEVG9sZXJhbmNlLnNhbWVWYWx1ZShoZWlnaHRvLCBoZWlnaHRuKVxyXG4gICAgKSB7XHJcbiAgICAgIHZpLmlzQnVzeSA9IGZhbHNlO1xyXG4gICAgICB2aS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWF0cml4X29sZCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xyXG4gICAgbGV0IG1hdHJpeF9uZXcgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcclxuICAgIGxldCB2aWV3X3ZlY3Rvcl9vbGQgPSBuZXcgRmxvYXQ2NEFycmF5KFtcclxuICAgICAgdG9bWF0gLSBjb1tYXSxcclxuICAgICAgdG9bWV0gLSBjb1tZXSxcclxuICAgICAgdG9bWl0gLSBjb1taXSxcclxuICAgIF0pO1xyXG4gICAgbGV0IHZpZXdfdmVjdG9yX25ldyA9IG5ldyBGbG9hdDY0QXJyYXkoW1xyXG4gICAgICB0bltYXSAtIGNuW1hdLFxyXG4gICAgICB0bltZXSAtIGNuW1ldLFxyXG4gICAgICB0bltaXSAtIGNuW1pdLFxyXG4gICAgXSk7XHJcblxyXG4gICAgbGV0IGxlbmd0aCA9IERWZWN0b3IubW9kdWxlKHZpZXdfdmVjdG9yX29sZCk7XHJcblxyXG4gICAgbGV0IGxlbmd0aF9kZWx0YSA9IERWZWN0b3IubW9kdWxlKHZpZXdfdmVjdG9yX25ldykgLSBsZW5ndGg7XHJcblxyXG4gICAgRFZlY3Rvci5ub3JtYWxpemUodmlld192ZWN0b3Jfb2xkKTtcclxuICAgIERWZWN0b3Iubm9ybWFsaXplKHZpZXdfdmVjdG9yX25ldyk7XHJcblxyXG4gICAgbGV0IG5lZWRfcm90YXRpb24gPSB0cnVlO1xyXG4gICAgbGV0IHJvdGF0aW9uX2RlbHRhID0gbmV3IEZsb2F0NjRBcnJheShbXHJcbiAgICAgIHZpZXdfdmVjdG9yX29sZFswXSAtIHZpZXdfdmVjdG9yX25ld1swXSxcclxuICAgICAgdmlld192ZWN0b3Jfb2xkWzFdIC0gdmlld192ZWN0b3JfbmV3WzFdLFxyXG4gICAgICB2aWV3X3ZlY3Rvcl9vbGRbMl0gLSB2aWV3X3ZlY3Rvcl9uZXdbMl0sXHJcbiAgICBdKTtcclxuXHJcbiAgICBsZXQgdXBfZGVsdGEgPSBuZXcgRmxvYXQ2NEFycmF5KFtcclxuICAgICAgdW5bWF0gLSB1b1tYXSxcclxuICAgICAgdW5bWV0gLSB1b1tZXSxcclxuICAgICAgdW5bWl0gLSB1b1taXSxcclxuICAgIF0pO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgRFZlY3Rvci5tb2R1bGUocm90YXRpb25fZGVsdGEpIDwgMC4wMDAxICYmXHJcbiAgICAgIERWZWN0b3IubW9kdWxlKHVwX2RlbHRhKSA8IDAuMDAwMVxyXG4gICAgKSB7XHJcbiAgICAgIG5lZWRfcm90YXRpb24gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdHJhbnNsYXRpb24gPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG4gICAgbGV0IHBvc2l0aW9uX21vdmVfZGVsdGEgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG5cclxuICAgIGlmIChuZWVkX3JvdGF0aW9uKSB7XHJcbiAgICAgIEdzV2ViR0xVdGlsaXR5LkdldE1hdHJpeEZyb21DYW1lcmFEKHRvLCBjbywgdW8sIHRyYW5zbGF0aW9uLCBtYXRyaXhfb2xkKTtcclxuICAgICAgR3NXZWJHTFV0aWxpdHkuR2V0TWF0cml4RnJvbUNhbWVyYUQodG4sIGNuLCB1biwgdHJhbnNsYXRpb24sIG1hdHJpeF9uZXcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcG9zaXRpb25fbW92ZV9kZWx0YVtYXSA9IGNuW1hdIC0gY29bWF07XHJcbiAgICAgIHBvc2l0aW9uX21vdmVfZGVsdGFbWV0gPSBjbltZXSAtIGNvW1ldO1xyXG4gICAgICBwb3NpdGlvbl9tb3ZlX2RlbHRhW1pdID0gY25bWl0gLSBjb1taXTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWF0cml4X2ludGVyaW0gPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcclxuICAgIGxldCBxdWF0X29sZCA9IG5ldyBGbG9hdDY0QXJyYXkoNCk7XHJcbiAgICBsZXQgcXVhdF9uZXcgPSBuZXcgRmxvYXQ2NEFycmF5KDQpO1xyXG4gICAgbGV0IHF1YXRfaW50ZXJpbSA9IG5ldyBGbG9hdDY0QXJyYXkoNCk7XHJcblxyXG4gICAgaWYgKG5lZWRfcm90YXRpb24pIHtcclxuICAgICAgR3NXZWJHTFV0aWxpdHkuTWF0cml4VG9RdWF0ZXJuaW9uRChtYXRyaXhfb2xkLCBxdWF0X29sZCk7XHJcbiAgICAgIEdzV2ViR0xVdGlsaXR5Lk1hdHJpeFRvUXVhdGVybmlvbkQobWF0cml4X25ldywgcXVhdF9uZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0YXJnZXRfbW92ZV9kZWx0YSA9IG5ldyBGbG9hdDY0QXJyYXkoW1xyXG4gICAgICB0bltYXSAtIHRvW1hdLFxyXG4gICAgICB0bltZXSAtIHRvW1ldLFxyXG4gICAgICB0bltaXSAtIHRvW1pdLFxyXG4gICAgXSk7XHJcblxyXG4gICAgbGV0IGZpZWxkX3dpZHRoX2RlbHRhID0gd2lkdGhuIC0gd2lkdGhvO1xyXG4gICAgbGV0IGZpZWxkX2hlaWdodF9kZWx0YSA9IGhlaWdodG4gLSBoZWlnaHRvO1xyXG5cclxuICAgIGxldCBkb3QxLCBkb3QyO1xyXG5cclxuICAgIGlmIChuZWVkX3JvdGF0aW9uKSB7XHJcbiAgICAgIC8vIFNpbXBsZSBkb3QgcHJvZHVjdCB0byBkZXRlcm1pbmUgd2hpY2ggZGlyZWN0aW9uIHRoZSBxdWF0ZXJuaW9uIHNob3VsZFxyXG4gICAgICAvLyBnbyBpZiB3ZSB3YW50IHRvIHRha2UgdGhlIHNob3J0ZXN0IHBhdGguXHJcbiAgICAgIGRvdDEgPVxyXG4gICAgICAgIChxdWF0X29sZFswXSAtIHF1YXRfbmV3WzBdKSAqIChxdWF0X29sZFswXSAtIHF1YXRfbmV3WzBdKSArXHJcbiAgICAgICAgKHF1YXRfb2xkWzFdIC0gcXVhdF9uZXdbMV0pICogKHF1YXRfb2xkWzFdIC0gcXVhdF9uZXdbMV0pICtcclxuICAgICAgICAocXVhdF9vbGRbMl0gLSBxdWF0X25ld1syXSkgKiAocXVhdF9vbGRbMl0gLSBxdWF0X25ld1syXSkgK1xyXG4gICAgICAgIChxdWF0X29sZFszXSAtIHF1YXRfbmV3WzNdKSAqIChxdWF0X29sZFszXSAtIHF1YXRfbmV3WzNdKTtcclxuXHJcbiAgICAgIGRvdDIgPVxyXG4gICAgICAgIChxdWF0X29sZFswXSArIHF1YXRfbmV3WzBdKSAqIChxdWF0X29sZFswXSArIHF1YXRfbmV3WzBdKSArXHJcbiAgICAgICAgKHF1YXRfb2xkWzFdICsgcXVhdF9uZXdbMV0pICogKHF1YXRfb2xkWzFdICsgcXVhdF9uZXdbMV0pICtcclxuICAgICAgICAocXVhdF9vbGRbMl0gKyBxdWF0X25ld1syXSkgKiAocXVhdF9vbGRbMl0gKyBxdWF0X25ld1syXSkgK1xyXG4gICAgICAgIChxdWF0X29sZFszXSArIHF1YXRfbmV3WzNdKSAqIChxdWF0X29sZFszXSArIHF1YXRfbmV3WzNdKTtcclxuXHJcbiAgICAgIGlmIChkb3QyIDwgZG90MSkge1xyXG4gICAgICAgIHF1YXRfbmV3WzBdID0gLXF1YXRfbmV3WzBdO1xyXG4gICAgICAgIHF1YXRfbmV3WzFdID0gLXF1YXRfbmV3WzFdO1xyXG4gICAgICAgIHF1YXRfbmV3WzJdID0gLXF1YXRfbmV3WzJdO1xyXG4gICAgICAgIHF1YXRfbmV3WzNdID0gLXF1YXRfbmV3WzNdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBvc2l0aW9uID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcclxuICAgIGxldCB1cF92ZWN0b3IgPSBuZXcgRmxvYXQ2NEFycmF5KDMpO1xyXG5cclxuICAgIGxldCB0b3RhbF9kdXJhdGlvbiA9IHZpLl9zbW9vdGhUcmFuc2l0aW9uRHVyYXRpb247XHJcbiAgICAvL2xldCB0b3RhbF9kdXJhdGlvbiA9IDUwMDtcclxuICAgIC8vXHRmbG9hdCBpbml0aWFsX2RlbHRhID0gKGZsb2F0KSAwLjA1IC8gdG90YWxfZHVyYXRpb247XHRcdFx0Ly8wLjA1ID0gMjBmcHNcdChndWVzc2luZylcclxuICAgIGxldCBxLCBjdXJyZW50X3RpbWU6IG51bWJlcjtcclxuXHJcbiAgICBsZXQgdG90YWxfdGltZV9zdGFydCA9IERhdGUubm93KCk7XHJcbiAgICB0b3RhbF90aW1lX3N0YXJ0IC09IDEwMDsgLy8wLjFtc1xyXG5cclxuICAgIC8vZnVuY3Rpb24gdWRfdGljaygpIHtcclxuICAgIC8vICAgIHZpLnNjZW5lQ2FtZXJhQ2hhbmdlZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZTogRnVuY3Rpb24pIHtcclxuICAgIC8vICAgICAgICB2YWx1ZSh2aSwgQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGVBbmRTY2FsZSk7XHJcbiAgICAvLyAgICB9KTtcclxuICAgIC8vICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgIC8vfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRpY2soKSB7XHJcbiAgICAgIGN1cnJlbnRfdGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgIHEgPSAoY3VycmVudF90aW1lIC0gdG90YWxfdGltZV9zdGFydCkgLyB0b3RhbF9kdXJhdGlvbjtcclxuICAgICAgaWYgKHEgPj0gMS4wKSB7XHJcbiAgICAgICAgcSA9IDEuMDtcclxuICAgICAgfVxyXG4gICAgICBxID0gR3NXZWJHTFV0aWxpdHkuRWFzZUluRWFzZU91dChxLCAwLjQ5LCAwLjAyLCAwLjQ5KTtcclxuICAgICAgaWYgKHEgPCAwKSB7XHJcbiAgICAgICAgcSA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZWVkX3JvdGF0aW9uKSB7XHJcbiAgICAgICAgbGV0IHRvMiA9IG5ldyBGbG9hdDY0QXJyYXkoW1xyXG4gICAgICAgICAgdG9bWF0gKyBxICogdGFyZ2V0X21vdmVfZGVsdGFbWF0sXHJcbiAgICAgICAgICB0b1tZXSArIHEgKiB0YXJnZXRfbW92ZV9kZWx0YVtZXSxcclxuICAgICAgICAgIHRvW1pdICsgcSAqIHRhcmdldF9tb3ZlX2RlbHRhW1pdLFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICAvLyBmaXJzdCBsZXQgdXNlIHF1YXRlcm5pb25zIHRvIHRha2UgY2FyZSBvZiB0aGUgaW50ZXJwb2xhdGlvblxyXG4gICAgICAgIC8vIG9mIHRoZSByb3RhdGlvbiBlbGVtZW50IG9mIHRoZSBjYW1lcmEgbW92ZW1lbnRcclxuICAgICAgICBHc1dlYkdMVXRpbGl0eS5UcmFuc2l0aW9uUXVhdGVybmlvbkQoXHJcbiAgICAgICAgICBxdWF0X29sZCxcclxuICAgICAgICAgIHF1YXRfbmV3LFxyXG4gICAgICAgICAgcSxcclxuICAgICAgICAgIHF1YXRfaW50ZXJpbVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgR3NXZWJHTFV0aWxpdHkuUXVhdGVybmlvblRvTWF0cml4RChxdWF0X2ludGVyaW0sIG1hdHJpeF9pbnRlcmltKTtcclxuXHJcbiAgICAgICAgcG9zaXRpb25bWF0gPSB0bzJbWF0gLSBtYXRyaXhfaW50ZXJpbVs4XSAqIChsZW5ndGggKyBsZW5ndGhfZGVsdGEgKiBxKTtcclxuICAgICAgICBwb3NpdGlvbltZXSA9IHRvMltZXSAtIG1hdHJpeF9pbnRlcmltWzldICogKGxlbmd0aCArIGxlbmd0aF9kZWx0YSAqIHEpO1xyXG4gICAgICAgIHBvc2l0aW9uW1pdID0gdG8yW1pdIC0gbWF0cml4X2ludGVyaW1bMTBdICogKGxlbmd0aCArIGxlbmd0aF9kZWx0YSAqIHEpO1xyXG5cclxuICAgICAgICB1cF92ZWN0b3JbWF0gPSBtYXRyaXhfaW50ZXJpbVs0XTtcclxuICAgICAgICB1cF92ZWN0b3JbWV0gPSBtYXRyaXhfaW50ZXJpbVs1XTtcclxuICAgICAgICB1cF92ZWN0b3JbWl0gPSBtYXRyaXhfaW50ZXJpbVs2XTtcclxuXHJcbiAgICAgICAgLy9jYW1lcmEucG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgIC8vY2FtZXJhLnVwKHVwX3ZlY3Rvcik7XHJcbiAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aS5fc2NlbmVLZXkpO1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYV9VcCh1cF92ZWN0b3IpO1xyXG5cclxuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJwb3M6XCIgKyBwb3NpdGlvblswXSArIFwiLCBcIiArIHBvc2l0aW9uWzFdICsgXCIsIFwiICsgcG9zaXRpb25bMl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICAgIC8vbGV0IHVwID0gSlNfU2hvd19EQ2FtZXJhX1VwKCk7XHJcblxyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJjYW1lcmEgdXA6XCIgKyB1cFswXSArIFwiLFwiICsgdXBbMV0gKyBcIixcIiArIHVwWzJdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvL2NhbWVyYS5wb3NpdGlvbihuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgICAvLyAgICBjb1tYXSArIChxICogcG9zaXRpb25fbW92ZV9kZWx0YVtYXSksXHJcbiAgICAgICAgLy8gICAgY29bWV0gKyAocSAqIHBvc2l0aW9uX21vdmVfZGVsdGFbWV0pLFxyXG4gICAgICAgIC8vICAgIGNvW1pdICsgKHEgKiBwb3NpdGlvbl9tb3ZlX2RlbHRhW1pdKV0pKTtcclxuXHJcbiAgICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aS5fc2NlbmVLZXkpO1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmFfUG9zaXRpb24oXHJcbiAgICAgICAgICAgIG5ldyBGbG9hdDY0QXJyYXkoW1xyXG4gICAgICAgICAgICAgIGNvW1hdICsgcSAqIHBvc2l0aW9uX21vdmVfZGVsdGFbWF0sXHJcbiAgICAgICAgICAgICAgY29bWV0gKyBxICogcG9zaXRpb25fbW92ZV9kZWx0YVtZXSxcclxuICAgICAgICAgICAgICBjb1taXSArIHEgKiBwb3NpdGlvbl9tb3ZlX2RlbHRhW1pdLFxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBub3cgbGluZWFybHkgaW50ZXJwb2xhdGUgdGhlIGNhbWVyYSB0YXJnZXQgYW5kIGZpZWxkIGNoYW5nZXNcclxuICAgICAgLy9jYW1lcmEudGFyZ2V0KG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAvLyAgICB0b1tYXSArIChxICogdGFyZ2V0X21vdmVfZGVsdGFbWF0pLFxyXG4gICAgICAvLyAgICB0b1tZXSArIChxICogdGFyZ2V0X21vdmVfZGVsdGFbWV0pLFxyXG4gICAgICAvLyAgICB0b1taXSArIChxICogdGFyZ2V0X21vdmVfZGVsdGFbWl0pXSkpO1xyXG5cclxuICAgICAgSlNfT3Blbl9TZWdtZW50X0J5X0tleSh2aS5fc2NlbmVLZXkpO1xyXG4gICAgICB7XHJcbiAgICAgICAgSlNfU2V0X0NhbWVyYV9UYXJnZXQoXHJcbiAgICAgICAgICBuZXcgRmxvYXQ2NEFycmF5KFtcclxuICAgICAgICAgICAgdG9bWF0gKyBxICogdGFyZ2V0X21vdmVfZGVsdGFbWF0sXHJcbiAgICAgICAgICAgIHRvW1ldICsgcSAqIHRhcmdldF9tb3ZlX2RlbHRhW1ldLFxyXG4gICAgICAgICAgICB0b1taXSArIHEgKiB0YXJnZXRfbW92ZV9kZWx0YVtaXSxcclxuICAgICAgICAgIF0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBKU19DbG9zZV9TZWdtZW50KCk7XHJcblxyXG4gICAgICBsZXQgZncgPSB3aWR0aG8gKyBxICogZmllbGRfd2lkdGhfZGVsdGE7XHJcbiAgICAgIGxldCBmaCA9IGhlaWdodG8gKyBxICogZmllbGRfaGVpZ2h0X2RlbHRhO1xyXG4gICAgICBpZiAoZncgPiAwLjAwMDAxICYmIGZoID4gMC4wMDAwMSkge1xyXG4gICAgICAgIC8vY2FtZXJhLndpZHRoKGZ3KTtcclxuICAgICAgICAvL2NhbWVyYS5oZWlnaHQoZmgpO1xyXG4gICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhX0ZpZWxkKGZ3LCBmaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEpTX0Nsb3NlX1NlZ21lbnQoKTtcclxuXHJcbiAgICAgICAgcSA9IChjdXJyZW50X3RpbWUgLSB0b3RhbF90aW1lX3N0YXJ0KSAvIHRvdGFsX2R1cmF0aW9uO1xyXG5cclxuICAgICAgICAvL+aJp+ihjHNjZW5lQ2FtZXJhQ2hhbmdlZOaJp+ihjOWFiFNldENhbWVyYU5lYXJGYXIuXHJcbiAgICAgICAgdmkuZXhlU2NlbmVDYW1lcmFDaGFuZ2luZyhcclxuICAgICAgICAgIENhbWVyYUNoYW5nZVR5cGUuU2NhbGUgfFxyXG4gICAgICAgICAgICBDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSB8XHJcbiAgICAgICAgICAgIENhbWVyYUNoYW5nZVR5cGUuVHJhbnNsYXRlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdmkudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuICAgICAgICB2aS5leGVTY2VuZUNhbWVyYUNoYW5nZWQoXHJcbiAgICAgICAgICBDYW1lcmFDaGFuZ2VUeXBlLlNjYWxlIHxcclxuICAgICAgICAgICAgQ2FtZXJhQ2hhbmdlVHlwZS5Sb3RhdGUgfFxyXG4gICAgICAgICAgICBDYW1lcmFDaGFuZ2VUeXBlLlRyYW5zbGF0ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vaWYgKG5lZWRfcm90YXRpb24pIHtcclxuICAgICAgICAvLyAgICAvL2xldCB1cCA9IEpTX1Nob3dfQ2FtZXJhX1VwKCk7XHJcblxyXG4gICAgICAgIC8vICAgIC8vY29uc29sZS5sb2coXCJjYW1lcmEgdXA6XCIgKyB1cFswXSArIFwiLFwiICsgdXBbMV0gKyBcIixcIiArIHVwWzJdKTtcclxuXHJcbiAgICAgICAgLy8gICAgdmkudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgLy8gICAgdmkudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocSA8IDEuMCAtIEdzV2ViR0xVdGlsaXR5LkVQU0lMT04pIHtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy9jYW1lcmEudGFyZ2V0KHRuKTtcclxuICAgICAgICAvL2NhbWVyYS5wb3NpdGlvbihjbik7XHJcbiAgICAgICAgLy9jYW1lcmEudXAodW4pO1xyXG4gICAgICAgIC8vY2FtZXJhLndpZHRoKHdpZHRobilcclxuICAgICAgICAvL2NhbWVyYS5oZWlnaHQoaGVpZ2h0bik7XHJcblxyXG4gICAgICAgIEpTX09wZW5fU2VnbWVudF9CeV9LZXkodmkuX3NjZW5lS2V5KTtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAvLyBKU19TZXRfQ2FtZXJhKGNuLCB0biwgdW4sIHdpZHRobiwgaGVpZ2h0biwgY2FtZXJhLnByb2plY3Rpb24pO1xyXG4gICAgICAgICAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbihjbik7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhX1RhcmdldCh0bik7XHJcbiAgICAgICAgICBKU19TZXRfQ2FtZXJhX1VwKHVuKTtcclxuICAgICAgICAgIEpTX1NldF9DYW1lcmFfRmllbGQod2lkdGhuLCBoZWlnaHRuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgSlNfQ2xvc2VfU2VnbWVudCgpO1xyXG5cclxuICAgICAgICAvL+aJp+ihjHNjZW5lQ2FtZXJhQ2hhbmdlZOaJp+ihjOWFiFNldENhbWVyYU5lYXJGYXIuXHJcbiAgICAgICAgdmkuZXhlU2NlbmVDYW1lcmFDaGFuZ2luZyhcclxuICAgICAgICAgIENhbWVyYUNoYW5nZVR5cGUuUm90YXRlIHwgQ2FtZXJhQ2hhbmdlVHlwZS5TY2FsZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHZpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2aS5leGVTY2VuZUNhbWVyYUNoYW5nZWQoXHJcbiAgICAgICAgICBDYW1lcmFDaGFuZ2VUeXBlLlJvdGF0ZSB8IENhbWVyYUNoYW5nZVR5cGUuU2NhbGVcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB2aS5pc0J1c3kgPSBmYWxzZTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQnVzeTpcIiwgdmkuaXNCdXN5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcclxuXHJcbiAgICAvL2NhbWVyYS50YXJnZXQodG4pO1xyXG4gICAgLy9jYW1lcmEucG9zaXRpb24oY24pO1xyXG4gICAgLy9jYW1lcmEudXAodW4pO1xyXG4gICAgLy9jYW1lcmEud2lkdGgod2lkdGhuKVxyXG4gICAgLy9jYW1lcmEuaGVpZ2h0KGhlaWdodG4pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgR2V0TWF0cml4RnJvbUNhbWVyYShcclxuICAgIHRhcmdldDogRmxvYXQzMkFycmF5LFxyXG4gICAgcG9zaXRpb246IEZsb2F0MzJBcnJheSxcclxuICAgIHVwX3ZlY3RvcjogRmxvYXQzMkFycmF5LFxyXG4gICAgdHJhbnNsYXRpb246IEZsb2F0MzJBcnJheSxcclxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5XHJcbiAgKSB7XHJcbiAgICBsZXQgdmlld192ZWN0b3IgPSBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgdGFyZ2V0WzBdIC0gcG9zaXRpb25bMF0sXHJcbiAgICAgIHRhcmdldFsxXSAtIHBvc2l0aW9uWzFdLFxyXG4gICAgICB0YXJnZXRbMl0gLSBwb3NpdGlvblsyXSxcclxuICAgIF0pO1xyXG5cclxuICAgIFZlY3Rvci5ub3JtYWxpemUodmlld192ZWN0b3IpO1xyXG4gICAgVmVjdG9yLm5vcm1hbGl6ZSh1cF92ZWN0b3IpO1xyXG5cclxuICAgIGxldCBjcm9zczEgPSBWZWN0b3IuY3Jvc3ModXBfdmVjdG9yLCB2aWV3X3ZlY3Rvcik7XHJcblxyXG4gICAgbWF0cml4WzBdID0gY3Jvc3MxWzBdO1xyXG4gICAgbWF0cml4WzFdID0gY3Jvc3MxWzFdO1xyXG4gICAgbWF0cml4WzJdID0gY3Jvc3MxWzJdO1xyXG4gICAgbWF0cml4WzNdID0gMC4wO1xyXG5cclxuICAgIGxldCBjcm9zczIgPSBWZWN0b3IuY3Jvc3Modmlld192ZWN0b3IsIGNyb3NzMSk7XHJcblxyXG4gICAgbWF0cml4WzRdID0gY3Jvc3MyWzBdO1xyXG4gICAgbWF0cml4WzVdID0gY3Jvc3MyWzFdO1xyXG4gICAgbWF0cml4WzZdID0gY3Jvc3MyWzJdO1xyXG4gICAgbWF0cml4WzddID0gMC4wO1xyXG5cclxuICAgIG1hdHJpeFs4XSA9IHZpZXdfdmVjdG9yWzBdO1xyXG4gICAgbWF0cml4WzldID0gdmlld192ZWN0b3JbMV07XHJcbiAgICBtYXRyaXhbMTBdID0gdmlld192ZWN0b3JbMl07XHJcbiAgICBtYXRyaXhbMTFdID0gMC4wO1xyXG5cclxuICAgIG1hdHJpeFsxMl0gPSB0cmFuc2xhdGlvblswXTtcclxuICAgIG1hdHJpeFsxM10gPSB0cmFuc2xhdGlvblsxXTtcclxuICAgIG1hdHJpeFsxNF0gPSB0cmFuc2xhdGlvblsyXTtcclxuICAgIG1hdHJpeFsxNV0gPSAxLjA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBHZXRNYXRyaXhGcm9tQ2FtZXJhRChcclxuICAgIHRhcmdldDogRmxvYXQ2NEFycmF5LFxyXG4gICAgcG9zaXRpb246IEZsb2F0NjRBcnJheSxcclxuICAgIHVwX3ZlY3RvcjogRmxvYXQ2NEFycmF5LFxyXG4gICAgdHJhbnNsYXRpb246IEZsb2F0NjRBcnJheSxcclxuICAgIG1hdHJpeDogRmxvYXQ2NEFycmF5XHJcbiAgKSB7XHJcbiAgICBsZXQgdmlld192ZWN0b3IgPSBuZXcgRmxvYXQ2NEFycmF5KFtcclxuICAgICAgdGFyZ2V0WzBdIC0gcG9zaXRpb25bMF0sXHJcbiAgICAgIHRhcmdldFsxXSAtIHBvc2l0aW9uWzFdLFxyXG4gICAgICB0YXJnZXRbMl0gLSBwb3NpdGlvblsyXSxcclxuICAgIF0pO1xyXG5cclxuICAgIERWZWN0b3Iubm9ybWFsaXplKHZpZXdfdmVjdG9yKTtcclxuICAgIERWZWN0b3Iubm9ybWFsaXplKHVwX3ZlY3Rvcik7XHJcblxyXG4gICAgbGV0IGNyb3NzMSA9IERWZWN0b3IuY3Jvc3ModXBfdmVjdG9yLCB2aWV3X3ZlY3Rvcik7XHJcblxyXG4gICAgbWF0cml4WzBdID0gY3Jvc3MxWzBdO1xyXG4gICAgbWF0cml4WzFdID0gY3Jvc3MxWzFdO1xyXG4gICAgbWF0cml4WzJdID0gY3Jvc3MxWzJdO1xyXG4gICAgbWF0cml4WzNdID0gMC4wO1xyXG5cclxuICAgIGxldCBjcm9zczIgPSBEVmVjdG9yLmNyb3NzKHZpZXdfdmVjdG9yLCBjcm9zczEpO1xyXG5cclxuICAgIG1hdHJpeFs0XSA9IGNyb3NzMlswXTtcclxuICAgIG1hdHJpeFs1XSA9IGNyb3NzMlsxXTtcclxuICAgIG1hdHJpeFs2XSA9IGNyb3NzMlsyXTtcclxuICAgIG1hdHJpeFs3XSA9IDAuMDtcclxuXHJcbiAgICBtYXRyaXhbOF0gPSB2aWV3X3ZlY3RvclswXTtcclxuICAgIG1hdHJpeFs5XSA9IHZpZXdfdmVjdG9yWzFdO1xyXG4gICAgbWF0cml4WzEwXSA9IHZpZXdfdmVjdG9yWzJdO1xyXG4gICAgbWF0cml4WzExXSA9IDAuMDtcclxuXHJcbiAgICBtYXRyaXhbMTJdID0gdHJhbnNsYXRpb25bMF07XHJcbiAgICBtYXRyaXhbMTNdID0gdHJhbnNsYXRpb25bMV07XHJcbiAgICBtYXRyaXhbMTRdID0gdHJhbnNsYXRpb25bMl07XHJcbiAgICBtYXRyaXhbMTVdID0gMS4wO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgTWF0cml4VG9RdWF0ZXJuaW9uKFxyXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXHJcbiAgICBxdWF0ZXJuaW9uOiBGbG9hdDMyQXJyYXlcclxuICApIHtcclxuICAgIGxldCB0ciwgczogbnVtYmVyO1xyXG4gICAgbGV0IGksIGosIGs6IG51bWJlcjtcclxuICAgIGxldCBYID0gMDtcclxuICAgIGxldCBZID0gMTtcclxuICAgIGxldCBaID0gMjtcclxuICAgIGxldCBXID0gMztcclxuXHJcbiAgICB0ciA9IG1hdHJpeFswXSArIG1hdHJpeFs1XSArIG1hdHJpeFsxMF07XHJcbiAgICBpZiAodHIgPiAwLjApIHtcclxuICAgICAgcyA9IE1hdGguc3FydCh0ciArIDEuMCk7XHJcbiAgICAgIHF1YXRlcm5pb25bV10gPSBzICogMC41O1xyXG4gICAgICBzID0gMC41IC8gcztcclxuXHJcbiAgICAgIHF1YXRlcm5pb25bWF0gPSAobWF0cml4WzZdIC0gbWF0cml4WzldKSAqIHM7XHJcbiAgICAgIHF1YXRlcm5pb25bWV0gPSAobWF0cml4WzhdIC0gbWF0cml4WzJdKSAqIHM7XHJcbiAgICAgIHF1YXRlcm5pb25bWl0gPSAobWF0cml4WzFdIC0gbWF0cml4WzRdKSAqIHM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpID0gWDtcclxuICAgICAgaWYgKG1hdHJpeFtZICogNCArIFldID4gbWF0cml4W1ggKiA0ICsgWF0pIHtcclxuICAgICAgICBpID0gWTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWF0cml4W1ogKiA0ICsgWl0gPiBtYXRyaXhbaSAqIDQgKyBpXSkge1xyXG4gICAgICAgIGkgPSBaO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbnh0ID0gbmV3IEludDMyQXJyYXkoW1ksIFosIFhdKTtcclxuXHJcbiAgICAgIGogPSBueHRbaV07XHJcbiAgICAgIGsgPSBueHRbal07XHJcblxyXG4gICAgICBzID0gTWF0aC5zcXJ0KFxyXG4gICAgICAgIG1hdHJpeFtpICogNCArIGldIC0gKG1hdHJpeFtqICogNCArIGpdICsgbWF0cml4W2sgKiA0ICsga10pICsgMS4wXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBxdWF0ZXJuaW9uW2ldID0gcyAqIDAuNTtcclxuICAgICAgcyA9IDAuNSAvIHM7XHJcblxyXG4gICAgICBxdWF0ZXJuaW9uW1ddID0gKG1hdHJpeFtqICogNCArIGtdIC0gbWF0cml4W2sgKiA0ICsgal0pICogcztcclxuICAgICAgcXVhdGVybmlvbltqXSA9IChtYXRyaXhbaSAqIDQgKyBqXSArIG1hdHJpeFtqICogNCArIGldKSAqIHM7XHJcbiAgICAgIHF1YXRlcm5pb25ba10gPSAobWF0cml4W2kgKiA0ICsga10gKyBtYXRyaXhbayAqIDQgKyBpXSkgKiBzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgTWF0cml4VG9RdWF0ZXJuaW9uRChcclxuICAgIG1hdHJpeDogRmxvYXQ2NEFycmF5LFxyXG4gICAgcXVhdGVybmlvbjogRmxvYXQ2NEFycmF5XHJcbiAgKSB7XHJcbiAgICBsZXQgdHIsIHM6IG51bWJlcjtcclxuICAgIGxldCBpLCBqLCBrOiBudW1iZXI7XHJcbiAgICBsZXQgWCA9IDA7XHJcbiAgICBsZXQgWSA9IDE7XHJcbiAgICBsZXQgWiA9IDI7XHJcbiAgICBsZXQgVyA9IDM7XHJcblxyXG4gICAgdHIgPSBtYXRyaXhbMF0gKyBtYXRyaXhbNV0gKyBtYXRyaXhbMTBdO1xyXG4gICAgaWYgKHRyID4gMC4wKSB7XHJcbiAgICAgIHMgPSBNYXRoLnNxcnQodHIgKyAxLjApO1xyXG4gICAgICBxdWF0ZXJuaW9uW1ddID0gcyAqIDAuNTtcclxuICAgICAgcyA9IDAuNSAvIHM7XHJcblxyXG4gICAgICBxdWF0ZXJuaW9uW1hdID0gKG1hdHJpeFs2XSAtIG1hdHJpeFs5XSkgKiBzO1xyXG4gICAgICBxdWF0ZXJuaW9uW1ldID0gKG1hdHJpeFs4XSAtIG1hdHJpeFsyXSkgKiBzO1xyXG4gICAgICBxdWF0ZXJuaW9uW1pdID0gKG1hdHJpeFsxXSAtIG1hdHJpeFs0XSkgKiBzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaSA9IFg7XHJcbiAgICAgIGlmIChtYXRyaXhbWSAqIDQgKyBZXSA+IG1hdHJpeFtYICogNCArIFhdKSB7XHJcbiAgICAgICAgaSA9IFk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1hdHJpeFtaICogNCArIFpdID4gbWF0cml4W2kgKiA0ICsgaV0pIHtcclxuICAgICAgICBpID0gWjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG54dCA9IG5ldyBJbnQzMkFycmF5KFtZLCBaLCBYXSk7XHJcblxyXG4gICAgICBqID0gbnh0W2ldO1xyXG4gICAgICBrID0gbnh0W2pdO1xyXG5cclxuICAgICAgcyA9IE1hdGguc3FydChcclxuICAgICAgICBtYXRyaXhbaSAqIDQgKyBpXSAtIChtYXRyaXhbaiAqIDQgKyBqXSArIG1hdHJpeFtrICogNCArIGtdKSArIDEuMFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcXVhdGVybmlvbltpXSA9IHMgKiAwLjU7XHJcbiAgICAgIHMgPSAwLjUgLyBzO1xyXG5cclxuICAgICAgcXVhdGVybmlvbltXXSA9IChtYXRyaXhbaiAqIDQgKyBrXSAtIG1hdHJpeFtrICogNCArIGpdKSAqIHM7XHJcbiAgICAgIHF1YXRlcm5pb25bal0gPSAobWF0cml4W2kgKiA0ICsgal0gKyBtYXRyaXhbaiAqIDQgKyBpXSkgKiBzO1xyXG4gICAgICBxdWF0ZXJuaW9uW2tdID0gKG1hdHJpeFtpICogNCArIGtdICsgbWF0cml4W2sgKiA0ICsgaV0pICogcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFBBKHQ6IG51bWJlciwgbTogbnVtYmVyLCBhOiBudW1iZXIpIHtcclxuICAgIHJldHVybiAodCAqIHQgKiAwLjUgKiBtKSAvIGE7XHJcbiAgfVxyXG4gIHByaXZhdGUgc3RhdGljIFBCKHQ6IG51bWJlciwgbTogbnVtYmVyLCBhOiBudW1iZXIpIHtcclxuICAgIHJldHVybiBHc1dlYkdMVXRpbGl0eS5QQShhLCBtLCBhKSArICh0IC0gYSkgKiBtO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyBQQyh0OiBudW1iZXIsIG06IG51bWJlciwgYTogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgR3NXZWJHTFV0aWxpdHkuUEIoYSArIGIsIG0sIGEpICtcclxuICAgICAgKHQgLSAoYSArIGIpKSAqIG0gKiAoMS4wIC0gKDAuNSAqICh0IC0gKGEgKyBiKSkpIC8gYylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBFYXNlSW5FYXNlT3V0KHQ6IG51bWJlciwgYTogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlcikge1xyXG4gICAgbGV0IHJlczogbnVtYmVyO1xyXG4gICAgbGV0IG0gPSAyLjAgLyAoYSArIDIuMCAqIGIgKyBjKTtcclxuXHJcbiAgICBpZiAodCA8PSBhKSB7XHJcbiAgICAgIHJlcyA9IEdzV2ViR0xVdGlsaXR5LlBBKHQsIG0sIGEpO1xyXG4gICAgfSBlbHNlIGlmICh0ID49IGEgJiYgdCA8PSBhICsgYikge1xyXG4gICAgICByZXMgPSBHc1dlYkdMVXRpbGl0eS5QQih0LCBtLCBhKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlcyA9IEdzV2ViR0xVdGlsaXR5LlBDKHQsIG0sIGEsIGIsIGMpO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlcyA+IDEuMCkge1xyXG4gICAgICByZXMgPSAxLjA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgSF9BQ09TKHg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHggPCAtMSA/IE1hdGguUEkgOiB4ID4gMSA/IDAgOiBNYXRoLmFjb3MoeCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgc3RhdGljIEhfQVNJTih4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB4IDwgLTEgPyAtTWF0aC5QSSAvIDIgOiB4ID4gMSA/IE1hdGguUEkgLyAyIDogTWF0aC5hc2luKHgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgVHJhbnNpdGlvblF1YXRlcm5pb24oXHJcbiAgICBxdWF0X29sZDogRmxvYXQzMkFycmF5LFxyXG4gICAgcXVhdF9uZXc6IEZsb2F0MzJBcnJheSxcclxuICAgIHQ6IG51bWJlcixcclxuICAgIHF0OiBGbG9hdDMyQXJyYXlcclxuICApIHtcclxuICAgIGxldCBvbWVnYSwgY29zb20sIHNpbm9tLCBzY2xwLCBzY2xxOiBudW1iZXI7XHJcbiAgICBsZXQgWCA9IDA7XHJcbiAgICBsZXQgWSA9IDE7XHJcbiAgICBsZXQgWiA9IDI7XHJcbiAgICBsZXQgVyA9IDM7XHJcblxyXG4gICAgY29zb20gPVxyXG4gICAgICBxdWF0X29sZFtYXSAqIHF1YXRfbmV3W1hdICtcclxuICAgICAgcXVhdF9vbGRbWV0gKiBxdWF0X25ld1tZXSArXHJcbiAgICAgIHF1YXRfb2xkW1pdICogcXVhdF9uZXdbWl0gK1xyXG4gICAgICBxdWF0X29sZFtXXSAqIHF1YXRfbmV3W1ddO1xyXG5cclxuICAgIGlmICgxLjAgKyBjb3NvbSA+IEdzV2ViR0xVdGlsaXR5LkVQU0lMT04pIHtcclxuICAgICAgaWYgKDEuMCAtIGNvc29tID4gR3NXZWJHTFV0aWxpdHkuRVBTSUxPTikge1xyXG4gICAgICAgIG9tZWdhID0gR3NXZWJHTFV0aWxpdHkuSF9BQ09TKGNvc29tKTtcclxuICAgICAgICBzaW5vbSA9IE1hdGguc2luKG9tZWdhKTtcclxuICAgICAgICBzY2xwID0gTWF0aC5zaW4oKDEuMCAtIHQpICogb21lZ2EpIC8gc2lub207XHJcbiAgICAgICAgc2NscSA9IE1hdGguc2luKHQgKiBvbWVnYSkgLyBzaW5vbTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzY2xwID0gMS4wIC0gdDtcclxuICAgICAgICBzY2xxID0gdDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcclxuICAgICAgICBxdFtpXSA9IHNjbHAgKiBxdWF0X29sZFtpXSArIHNjbHEgKiBxdWF0X25ld1tpXTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcXRbWF0gPSAtcXVhdF9vbGRbWV07XHJcbiAgICAgIHF0W1ldID0gcXVhdF9vbGRbWF07XHJcbiAgICAgIHF0W1pdID0gLXF1YXRfb2xkW1ddO1xyXG4gICAgICBxdFtXXSA9IHF1YXRfb2xkW1pdO1xyXG4gICAgICBzY2xwID0gTWF0aC5zaW4oKCgxLjAgLSB0KSAqIE1hdGguUEkpIC8gMik7XHJcbiAgICAgIHNjbHEgPSBNYXRoLnNpbigodCAqIE1hdGguUEkpIC8gMik7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XHJcbiAgICAgICAgcXRbaV0gPSBzY2xwICogcXVhdF9vbGRbaV0gKyBzY2xxICogcXRbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFRyYW5zaXRpb25RdWF0ZXJuaW9uRChcclxuICAgIHF1YXRfb2xkOiBGbG9hdDY0QXJyYXksXHJcbiAgICBxdWF0X25ldzogRmxvYXQ2NEFycmF5LFxyXG4gICAgdDogbnVtYmVyLFxyXG4gICAgcXQ6IEZsb2F0NjRBcnJheVxyXG4gICkge1xyXG4gICAgbGV0IG9tZWdhLCBjb3NvbSwgc2lub20sIHNjbHAsIHNjbHE6IG51bWJlcjtcclxuICAgIGxldCBYID0gMDtcclxuICAgIGxldCBZID0gMTtcclxuICAgIGxldCBaID0gMjtcclxuICAgIGxldCBXID0gMztcclxuXHJcbiAgICBjb3NvbSA9XHJcbiAgICAgIHF1YXRfb2xkW1hdICogcXVhdF9uZXdbWF0gK1xyXG4gICAgICBxdWF0X29sZFtZXSAqIHF1YXRfbmV3W1ldICtcclxuICAgICAgcXVhdF9vbGRbWl0gKiBxdWF0X25ld1taXSArXHJcbiAgICAgIHF1YXRfb2xkW1ddICogcXVhdF9uZXdbV107XHJcblxyXG4gICAgaWYgKDEuMCArIGNvc29tID4gR3NXZWJHTFV0aWxpdHkuRVBTSUxPTikge1xyXG4gICAgICBpZiAoMS4wIC0gY29zb20gPiBHc1dlYkdMVXRpbGl0eS5FUFNJTE9OKSB7XHJcbiAgICAgICAgb21lZ2EgPSBHc1dlYkdMVXRpbGl0eS5IX0FDT1MoY29zb20pO1xyXG4gICAgICAgIHNpbm9tID0gTWF0aC5zaW4ob21lZ2EpO1xyXG4gICAgICAgIHNjbHAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcclxuICAgICAgICBzY2xxID0gTWF0aC5zaW4odCAqIG9tZWdhKSAvIHNpbm9tO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNjbHAgPSAxLjAgLSB0O1xyXG4gICAgICAgIHNjbHEgPSB0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xyXG4gICAgICAgIHF0W2ldID0gc2NscCAqIHF1YXRfb2xkW2ldICsgc2NscSAqIHF1YXRfbmV3W2ldO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBxdFtYXSA9IC1xdWF0X29sZFtZXTtcclxuICAgICAgcXRbWV0gPSBxdWF0X29sZFtYXTtcclxuICAgICAgcXRbWl0gPSAtcXVhdF9vbGRbV107XHJcbiAgICAgIHF0W1ddID0gcXVhdF9vbGRbWl07XHJcbiAgICAgIHNjbHAgPSBNYXRoLnNpbigoKDEuMCAtIHQpICogTWF0aC5QSSkgLyAyKTtcclxuICAgICAgc2NscSA9IE1hdGguc2luKCh0ICogTWF0aC5QSSkgLyAyKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcclxuICAgICAgICBxdFtpXSA9IHNjbHAgKiBxdWF0X29sZFtpXSArIHNjbHEgKiBxdFtpXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgUXVhdGVybmlvblRvTWF0cml4KFxyXG4gICAgcXVhdGVybmlvbjogRmxvYXQzMkFycmF5LFxyXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXlcclxuICApIHtcclxuICAgIGxldCBzLCB4cywgeXMsIHpzLCB3eCwgd3ksIHd6LCB4eCwgeHksIHh6LCB5eSwgeXosIHp6OiBudW1iZXI7XHJcbiAgICBsZXQgWCA9IDA7XHJcbiAgICBsZXQgWSA9IDE7XHJcbiAgICBsZXQgWiA9IDI7XHJcbiAgICBsZXQgVyA9IDM7XHJcblxyXG4gICAgcyA9XHJcbiAgICAgIDIuMCAvXHJcbiAgICAgIChxdWF0ZXJuaW9uW1hdICogcXVhdGVybmlvbltYXSArXHJcbiAgICAgICAgcXVhdGVybmlvbltZXSAqIHF1YXRlcm5pb25bWV0gK1xyXG4gICAgICAgIHF1YXRlcm5pb25bWl0gKiBxdWF0ZXJuaW9uW1pdICtcclxuICAgICAgICBxdWF0ZXJuaW9uW1ddICogcXVhdGVybmlvbltXXSk7XHJcblxyXG4gICAgeHMgPSBxdWF0ZXJuaW9uW1hdICogcztcclxuICAgIHlzID0gcXVhdGVybmlvbltZXSAqIHM7XHJcbiAgICB6cyA9IHF1YXRlcm5pb25bWl0gKiBzO1xyXG4gICAgd3ggPSBxdWF0ZXJuaW9uW1ddICogeHM7XHJcbiAgICB3eSA9IHF1YXRlcm5pb25bV10gKiB5cztcclxuICAgIHd6ID0gcXVhdGVybmlvbltXXSAqIHpzO1xyXG4gICAgeHggPSBxdWF0ZXJuaW9uW1hdICogeHM7XHJcbiAgICB4eSA9IHF1YXRlcm5pb25bWF0gKiB5cztcclxuICAgIHh6ID0gcXVhdGVybmlvbltYXSAqIHpzO1xyXG4gICAgeXkgPSBxdWF0ZXJuaW9uW1ldICogeXM7XHJcbiAgICB5eiA9IHF1YXRlcm5pb25bWV0gKiB6cztcclxuICAgIHp6ID0gcXVhdGVybmlvbltaXSAqIHpzO1xyXG5cclxuICAgIG1hdHJpeFswXSA9IDEuMCAtICh5eSArIHp6KTtcclxuICAgIG1hdHJpeFsxXSA9IHh5ICsgd3o7XHJcbiAgICBtYXRyaXhbMl0gPSB4eiAtIHd5O1xyXG4gICAgbWF0cml4WzNdID0gMC4wO1xyXG5cclxuICAgIG1hdHJpeFs0XSA9IHh5IC0gd3o7XHJcbiAgICBtYXRyaXhbNV0gPSAxLjAgLSAoeHggKyB6eik7XHJcbiAgICBtYXRyaXhbNl0gPSB5eiArIHd4O1xyXG4gICAgbWF0cml4WzddID0gMC4wO1xyXG5cclxuICAgIG1hdHJpeFs4XSA9IHh6ICsgd3k7XHJcbiAgICBtYXRyaXhbOV0gPSB5eiAtIHd4O1xyXG4gICAgbWF0cml4WzEwXSA9IDEuMCAtICh4eCArIHl5KTtcclxuICAgIG1hdHJpeFsxMV0gPSAwLjA7XHJcblxyXG4gICAgbWF0cml4WzEyXSA9IDAuMDtcclxuICAgIG1hdHJpeFsxM10gPSAwLjA7XHJcbiAgICBtYXRyaXhbMTRdID0gMC4wO1xyXG4gICAgbWF0cml4WzE1XSA9IDEuMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFF1YXRlcm5pb25Ub01hdHJpeEQoXHJcbiAgICBxdWF0ZXJuaW9uOiBGbG9hdDY0QXJyYXksXHJcbiAgICBtYXRyaXg6IEZsb2F0NjRBcnJheVxyXG4gICkge1xyXG4gICAgbGV0IHMsIHhzLCB5cywgenMsIHd4LCB3eSwgd3osIHh4LCB4eSwgeHosIHl5LCB5eiwgeno6IG51bWJlcjtcclxuICAgIGxldCBYID0gMDtcclxuICAgIGxldCBZID0gMTtcclxuICAgIGxldCBaID0gMjtcclxuICAgIGxldCBXID0gMztcclxuXHJcbiAgICBzID1cclxuICAgICAgMi4wIC9cclxuICAgICAgKHF1YXRlcm5pb25bWF0gKiBxdWF0ZXJuaW9uW1hdICtcclxuICAgICAgICBxdWF0ZXJuaW9uW1ldICogcXVhdGVybmlvbltZXSArXHJcbiAgICAgICAgcXVhdGVybmlvbltaXSAqIHF1YXRlcm5pb25bWl0gK1xyXG4gICAgICAgIHF1YXRlcm5pb25bV10gKiBxdWF0ZXJuaW9uW1ddKTtcclxuXHJcbiAgICB4cyA9IHF1YXRlcm5pb25bWF0gKiBzO1xyXG4gICAgeXMgPSBxdWF0ZXJuaW9uW1ldICogcztcclxuICAgIHpzID0gcXVhdGVybmlvbltaXSAqIHM7XHJcbiAgICB3eCA9IHF1YXRlcm5pb25bV10gKiB4cztcclxuICAgIHd5ID0gcXVhdGVybmlvbltXXSAqIHlzO1xyXG4gICAgd3ogPSBxdWF0ZXJuaW9uW1ddICogenM7XHJcbiAgICB4eCA9IHF1YXRlcm5pb25bWF0gKiB4cztcclxuICAgIHh5ID0gcXVhdGVybmlvbltYXSAqIHlzO1xyXG4gICAgeHogPSBxdWF0ZXJuaW9uW1hdICogenM7XHJcbiAgICB5eSA9IHF1YXRlcm5pb25bWV0gKiB5cztcclxuICAgIHl6ID0gcXVhdGVybmlvbltZXSAqIHpzO1xyXG4gICAgenogPSBxdWF0ZXJuaW9uW1pdICogenM7XHJcblxyXG4gICAgbWF0cml4WzBdID0gMS4wIC0gKHl5ICsgenopO1xyXG4gICAgbWF0cml4WzFdID0geHkgKyB3ejtcclxuICAgIG1hdHJpeFsyXSA9IHh6IC0gd3k7XHJcbiAgICBtYXRyaXhbM10gPSAwLjA7XHJcblxyXG4gICAgbWF0cml4WzRdID0geHkgLSB3ejtcclxuICAgIG1hdHJpeFs1XSA9IDEuMCAtICh4eCArIHp6KTtcclxuICAgIG1hdHJpeFs2XSA9IHl6ICsgd3g7XHJcbiAgICBtYXRyaXhbN10gPSAwLjA7XHJcblxyXG4gICAgbWF0cml4WzhdID0geHogKyB3eTtcclxuICAgIG1hdHJpeFs5XSA9IHl6IC0gd3g7XHJcbiAgICBtYXRyaXhbMTBdID0gMS4wIC0gKHh4ICsgeXkpO1xyXG4gICAgbWF0cml4WzExXSA9IDAuMDtcclxuXHJcbiAgICBtYXRyaXhbMTJdID0gMC4wO1xyXG4gICAgbWF0cml4WzEzXSA9IDAuMDtcclxuICAgIG1hdHJpeFsxNF0gPSAwLjA7XHJcbiAgICBtYXRyaXhbMTVdID0gMS4wO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBicm93c2VyVHlwZSgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGV4cGxvcmVyID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsXHJcbiAgICAgIGNvbXBhcmUgPSBmdW5jdGlvbiAocykge1xyXG4gICAgICAgIHJldHVybiBleHBsb3Jlci5pbmRleE9mKHMpID49IDA7XHJcbiAgICAgIH0sXHJcbiAgICAgIGllMTEgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBcIkFjdGl2ZVhPYmplY3RcIiBpbiB3aW5kb3c7XHJcbiAgICAgIH0pKCk7XHJcbiAgICBpZiAoY29tcGFyZShcIk1TSUVcIikgfHwgaWUxMSkge1xyXG4gICAgICByZXR1cm4gXCJpZVwiO1xyXG4gICAgfSBlbHNlIGlmIChjb21wYXJlKFwiRWRnZVwiKSAmJiAhaWUxMSkge1xyXG4gICAgICByZXR1cm4gXCJFZGdlXCI7XHJcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmUoXCJGaXJlZm94XCIpICYmICFpZTExKSB7XHJcbiAgICAgIHJldHVybiBcIkZpcmVmb3hcIjtcclxuICAgIH0gZWxzZSBpZiAoY29tcGFyZShcIkNocm9tZVwiKSAmJiAhaWUxMSkge1xyXG4gICAgICByZXR1cm4gXCJDaHJvbWVcIjtcclxuICAgIH0gZWxzZSBpZiAoY29tcGFyZShcIk9wZXJhXCIpICYmICFpZTExKSB7XHJcbiAgICAgIHJldHVybiBcIk9wZXJhXCI7XHJcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmUoXCJTYWZhcmlcIikgJiYgIWllMTEpIHtcclxuICAgICAgcmV0dXJuIFwiU2FmYXJpXCI7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIEpTX0luaXRfQXBpcyxcclxuICBKU19Jbml0X0RhdGFiYXNlLFxyXG4gIEpTX0ZpbmFfRGF0YWJhc2UsXHJcbiAgSlNfSW5pdF9NdWx0aXRocmVhZGluZ19TZXJ2aWNlcyxcclxuICBKU19GaW5hX011bHRpdGhyZWFkaW5nX1NlcnZpY2VzLFxyXG4gIEpTX09wZW5fU2VnbWVudCxcclxuICBKU19PcGVuX1NlZ21lbnRfQnlfS2V5LFxyXG4gIEpTX0Nsb3NlX1NlZ21lbnQsXHJcbiAgSlNfRGVsZXRlX1NlZ21lbnQsXHJcbiAgSlNfRGVsZXRlX1NlZ21lbnRfQnlfS2V5LFxyXG4gIEpTX0RlbGV0ZV9CeV9LZXksXHJcbiAgSlNfQ2xlYXJfR2VvbWV0cnksXHJcbiAgSlNfQ2xlYXJfR2VvbWV0cnlfQnlfS2V5LFxyXG4gIEpTX0NsZWFyX0F0dHJpYnV0ZXMsXHJcbiAgSlNfQ2xlYXJfQXR0cmlidXRlc19CeV9LZXksXHJcbiAgSlNfQ2xlYXJfSW5jbHVkZXMsXHJcbiAgSlNfQ2xlYXJfSW5jbHVkZXNfQnlfS2V5LFxyXG4gIEpTX0NsZWFyX1N0eWxlcyxcclxuICBKU19DbGVhcl9TdHlsZXNfQnlfS2V5LFxyXG4gIEpTX0NsZWFyX1N1YnNlZ21lbnRzLFxyXG4gIEpTX0NsZWFyX1N1YnNlZ21lbnRzX0J5X0tleSxcclxuICBKU19DbGVhcl9BbGwsXHJcbiAgSlNfQ2xlYXJfQWxsX0J5X0tleSxcclxuICBKU19JbmNsdWRlX1NlZ21lbnRfQnlfS2V5LFxyXG4gIEpTX0NvbmRpdGlvbmFsX0luY2x1ZGVfQnlfS2V5LFxyXG4gIEpTX1N0eWxlX1NlZ21lbnRfQnlfS2V5LFxyXG4gIEpTX0NvbmRpdGlvbmFsX1N0eWxlX0J5X0tleSxcclxuICBKU19NYWtlX0NvbnRleHRfQ3VycmVudCxcclxuICBKU19VcGRhdGVfRGlzcGxheSxcclxuICBKU19VcGRhdGVfVmlld19EaXNwbGF5X0J5X0tleSxcclxuICBKU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfRnJhbWVyYXRlX0J5X0tleSxcclxuICBKU19VcGRhdGVfVmlld19EaXNwbGF5X1dpdGhfVGltZV9CeV9LZXksXHJcbiAgSlNfQXN5bl9VcGRhdGVfR2VvbWV0cnlfRGF0YV9CeV9LZXksXHJcbiAgLy8gSlNfQXN5bl9VcGRhdGVfUGFydGlhbF9HZW9tZXRyeV9EYXRhX0J5X0tleSxcclxuICBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9EYXRhX0J5X0tleV9UdCxcclxuICAvLyBKU19Bc3luX1VwZGF0ZV9QYXJ0aWFsX0dlb21ldHJ5X0RhdGFfQnlfS2V5X1R0LFxyXG4gIC8vIEpTX0FzeW5fVXBkYXRlX0dlb21ldHJ5X0J5X0tleSxcclxuICBKU19Bc3luX05lZWRfVXBkYXRlX1ZpZXdfQnlfS2V5LFxyXG4gIEpTX0FzeW5fVXBkYXRlX0NhbWVyYV9CeV9LZXksXHJcbiAgSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXksXHJcbiAgSlNfQXN5bl9VcGRhdGVfVmlld19CeV9LZXlfVHQsXHJcbiAgSlNfQXN5bl9SZW5kZXJfVmlld19CeV9LZXksXHJcbiAgSlNfQXN5bl9SZW5kZXJfVmlld19XaXRoX1RpbWVfQnlfS2V5LFxyXG4gIEpTX1Nob3dfQXN5bl9HZW9tZXRyeV9EYXRhX0tleXMsXHJcbiAgSlNfU2hvd19Bc3luX1JlbW92ZV9HZW9tZXRyeV9EYXRhX0tleXMsXHJcbiAgSlNfU2hvd19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9LZXlzLFxyXG4gIEpTX0FzeW5fQnVmZmVyX0dlb21ldHJ5X0J5X0tleSxcclxuICBKU19Bc3luX0J1ZmZlcl9HZW9tZXRyeV9CeV9LZXlfVHQsXHJcbiAgLy8gSlNfU2hvd19Bc3luX1VwZGF0ZV9HZW9tZXRyeV9Db3VudCxcclxuICAvLyBKU19Bc3luX1VwZGF0ZV9HZW9tZXRyeSxcclxuICBKU19TaG93X0tleV9UeXBlLFxyXG4gIEpTX1Nob3dfS2V5X1RhZyxcclxuICBKU19TaG93X093bmVyX0J5X0tleSxcclxuICBKU19Db21wdXRlX1BhdGgsXHJcbiAgSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9LZXksXHJcbiAgSlNfQ29tcHV0ZV9Db29yZGluYXRlc19CeV9QYXRoLFxyXG4gIEpTX1Nob3dfQm91bmRpbmdCb3hfQnlfS2V5LFxyXG4gIEpTX0NvbXB1dGVfQm91bmRpbmdib3hfQnlfS2V5LFxyXG4gIEpTX0NvbXB1dGVfQm91bmRpbmdib3hfV2l0aF9WaXNpYmlsaXR5X0J5X0tleSxcclxuICBKU19Db21wdXRlX1ZpZXdfQm91bmRpbmdib3hfQnlfS2V5LFxyXG4gIEpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveF9CeV9LZXlzLFxyXG4gIEpTX0NvbXB1dGVfVmlld19Cb3VuZGluZ2JveGVzX0J5X0tleXMsXHJcbiAgSlNfQ29tcHV0ZV9TZWdtZW50X0JvdW5kaW5nYm94X0J5X0tleSxcclxuICBKU19DbGVhcl9TZWdtZW50X0JvdW5kaW5nYm94X0J5X0tleSxcclxuICBKU19Db21wdXRlX1Zpc2libGVfQnlfS2V5LFxyXG4gIEpTX1Nob3dfQXR0cmlidXRlX0NvdW50LFxyXG4gIEpTX1Nob3dfQXR0cmlidXRlX0xpc3QsXHJcbiAgSlNfU2hvd19HZW9tZXRyeV9Db3VudCxcclxuICBKU19TaG93X0dlb21ldHJ5X0xpc3QsXHJcbiAgSlNfU2hvd19TdWJzZWdtZW50X0NvdW50LFxyXG4gIEpTX1Nob3dfU3Vic2VnbWVudF9MaXN0LFxyXG4gIEpTX1Nob3dfQWxsX1N1YnNlZ21lbnRfQ291bnQsXHJcbiAgSlNfU2hvd19BbGxfU3Vic2VnbWVudF9MaXN0LFxyXG4gIEpTX1Nob3dfSW5jbHVkZV9Db3VudCxcclxuICBKU19TaG93X0luY2x1ZGVfTGlzdCxcclxuICBKU19TaG93X0luY2x1ZGUsXHJcbiAgSlNfU2hvd19JbmNsdWRlX1NlZ21lbnQsXHJcbiAgSlNfU2hvd19TdHlsZV9Db3VudCxcclxuICBKU19TaG93X1N0eWxlX0xpc3QsXHJcbiAgSlNfU2hvd19TdHlsZSxcclxuICBKU19TaG93X1N0eWxlX1NlZ21lbnQsXHJcbiAgSlNfU2hvd19TZWdtZW50X05hbWUsXHJcbiAgSlNfU2hvd19TZWdtZW50X1BhdGgsXHJcbiAgSlNfU2VnbWVudF9FeGlzdHMsXHJcbiAgSlNfTW92ZV9LZXksXHJcbiAgSlNfTW92ZV9LZXlfQnlfS2V5LFxyXG4gIEpTX1JlbmFtZV9TZWdtZW50LFxyXG4gIEpTX0FkZF9Qcm9wZXJ0eV9Cb29sZWFuLFxyXG4gIEpTX0FkZF9Qcm9wZXJ0eV9JbnRlZ2VyLFxyXG4gIEpTX0FkZF9Qcm9wZXJ0eV9Eb3VibGUsXHJcbiAgSlNfQWRkX1Byb3BlcnR5X1N0cmluZyxcclxuICBKU19BZGRfUHJvcGVydHlfSnNvbixcclxuICBKU19TaG93X1Byb3BlcnR5X1R5cGUsXHJcbiAgSlNfU2hvd19Qcm9wZXJ0eV9Cb29sZWFuLFxyXG4gIEpTX1Nob3dfUHJvcGVydHlfSW50ZWdlcixcclxuICBKU19TaG93X1Byb3BlcnR5X0RvdWJsZSxcclxuICAvLyBKU19TaG93X1Byb3BlcnR5X1N0cmluZ19MZW5ndGgsXHJcbiAgSlNfU2hvd19Qcm9wZXJ0eV9TdHJpbmcsXHJcbiAgSlNfUHJvcGVydHlfRXhpc3RzLFxyXG4gIEpTX1JlbW92ZV9Qcm9wZXJ0eSxcclxuICBKU19DbGVhcl9Qcm9wZXJ0aWVzLFxyXG4gIEpTX1Nob3dfUHJvcGVydGllcyxcclxuICBKU19TaG93X0tleV9CeV9JZCxcclxuICBKU19TZXRfS2V5X0luZGV4LFxyXG4gIEpTX1Nob3dfS2V5X0luZGV4LFxyXG4gIEpTX0NvbXB1dGVfU2VsZWN0aW9uX0J5X0tleSxcclxuICBKU19Db21wdXRlX1NlbGVjdGlvbl9CeV9BcmVhLFxyXG4gIEpTX1Nob3dfU2VsZWN0aW9uX0NvdW50LFxyXG4gIEpTX1Nob3dfU2VsZWN0aW9uX0VsZW1lbnQsXHJcbiAgSlNfU2hvd19TZWxlY3Rpb25fUGF0aCxcclxuICBKU19TaG93X1NlbGVjdGlvbl9QYXRoX0J5X0tleXMsXHJcbiAgSlNfU2hvd19TZWxlY3Rpb25fUG9zaXRpb24sXHJcbiAgSlNfU2hvd19TZWxlY3Rpb25fUGFyYW0sXHJcbiAgSlNfU2hvd19TZWxlY3Rpb25fSW5kZXhlcyxcclxuICBKU19TaG93X1NlbGVjdGlvbl9UZXN0X0luZm8sXHJcbiAgSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5cyxcclxuICBKU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXksXHJcbiAgSlNfQ29tcHV0ZV9Db2xsaXNpb25fQnlfS2V5c19UdCxcclxuICBKU19Db21wdXRlX0NvbGxpc2lvbl9CeV9LZXlfVHQsXHJcbiAgSlNfU2hvd19Db2xsaXNpb25fU3RhdHVzLFxyXG4gIEpTX1Nob3dfQ29sbGlzaW9uX0NvdW50LFxyXG4gIEpTX1Nob3dfQ29sbGlzaW9uX0VsZW1lbnRzLFxyXG4gIEpTX1Nob3dfQ29sbGlzaW9uX1BhdGhzLFxyXG4gIEpTX1Nob3dfQ29sbGlzaW9uX1BhdGhfQnlfS2V5cyxcclxuICBKU19TaG93X0NvbGxpc2lvbl9Qb3NpdGlvbixcclxuICBKU19TaG93X0NvbGxpc2lvbl9UeXBlLFxyXG4gIEpTX0FkZF9Gb250X0xpYnJhcnksXHJcbiAgSlNfRm9udF9MaWJyYXJ5X0V4aXN0cyxcclxuICBKU19SZW1vdmVfRm9udF9MaWJyYXJ5LFxyXG4gIEpTX0NsZWFyX0ZvbnRfTGlicmFyeSxcclxuICBKU19TZXRfRHJpdmVyX0NvbmZpZ3MsXHJcbiAgSlNfU2V0X0RyaXZlcl9PcHRpb25zLFxyXG4gIEpTX1Nob3dfRHJpdmVyX09wdGlvbnMsXHJcbiAgSlNfU2hvd19PbmVfRHJpdmVyX09wdGlvbixcclxuICBKU19TZXRfU2hhZGVyLFxyXG4gIEpTX1VuU2V0X1NoYWRlcixcclxuICBKU19TaG93X1NoYWRlcixcclxuICBKU19TaG93X09uZV9TaGFkZXIsXHJcbiAgSlNfU2V0X1ZpZXdwb3J0LFxyXG4gIEpTX1NldF9DYW1lcmEsXHJcbiAgSlNfU2V0X0NhbWVyYV9Qb3NpdGlvbixcclxuICBKU19TZXRfQ2FtZXJhX1RhcmdldCxcclxuICBKU19TZXRfQ2FtZXJhX1VwLFxyXG4gIEpTX1NldF9DYW1lcmFfRmllbGQsXHJcbiAgSlNfU2V0X0NhbWVyYV9FeHRlbnQsXHJcbiAgSlNfU2V0X0NhbWVyYV9Qcm9qZWN0aW9uLFxyXG4gIEpTX0tlZXBfQ2FtZXJhX1JhdGlvLFxyXG4gIEpTX1Nob3dfQ2FtZXJhLFxyXG4gIEpTX1Nob3dfQ2FtZXJhX1Bvc2l0aW9uLFxyXG4gIEpTX1Nob3dfQ2FtZXJhX1RhcmdldCxcclxuICBKU19TaG93X0NhbWVyYV9VcCxcclxuICBKU19TaG93X0NhbWVyYV9GaWVsZCxcclxuICBKU19TaG93X0NhbWVyYV9FeHRlbnQsXHJcbiAgSlNfU2hvd19DYW1lcmFfUHJvamVjdGlvbixcclxuICBKU19TaG93X0NhbWVyYV9Qcm9qZWN0aW9uX01hdHJpeCxcclxuICBKU19TaG93X0NhbWVyYV9WaWV3X01hdHJpeCxcclxuICBKU19TaG93X1BhdGhfQ2FtZXJhX1Bvc2l0aW9uLFxyXG4gIEpTX1Nob3dfUGF0aF9DYW1lcmFfVGFyZ2V0LFxyXG4gIEpTX0RvbGx5X0NhbWVyYSxcclxuICBKU19Sb2xsX0NhbWVyYSxcclxuICBKU19ab29tX0NhbWVyYSxcclxuICBKU19VblNldF9DYW1lcmEsXHJcbiAgSlNfU2V0X0NvbG9yLFxyXG4gIEpTX1VuU2V0X0NvbG9yLFxyXG4gIEpTX1VuU2V0X09uZV9Db2xvcixcclxuICBKU19TaG93X0NvbG9yLFxyXG4gIEpTX1Nob3dfT25lX0NvbG9yLFxyXG4gIEpTX1Nob3dfQ29sb3JfQnlfVmFsdWUsXHJcbiAgSlNfU2V0X0dlb21ldHJ5X0NvbG9yLFxyXG4gIEpTX1NldF9HZW9tZXRyeV9Db2xvcl9CeV9WYWx1ZSxcclxuICBKU19TaG93X0dlb21ldHJ5X0NvbG9yX0J5X1ZhbHVlLFxyXG4gIEpTX1VuU2V0X0dlb21ldHJ5X0NvbG9yLFxyXG4gIEpTX1NldF9WaXNpYmlsaXR5LFxyXG4gIEpTX1VuU2V0X1Zpc2liaWxpdHksXHJcbiAgSlNfVW5TZXRfT25lX1Zpc2liaWxpdHksXHJcbiAgSlNfU2hvd19WaXNpYmlsaXR5LFxyXG4gIEpTX1Nob3dfT25lX1Zpc2liaWxpdHksXHJcbiAgSlNfU2V0X1NlbGVjdGFiaWxpdHksXHJcbiAgSlNfVW5TZXRfU2VsZWN0YWJpbGl0eSxcclxuICBKU19VblNldF9PbmVfU2VsZWN0YWJpbGl0eSxcclxuICBKU19TaG93X1NlbGVjdGFiaWxpdHksXHJcbiAgSlNfU2hvd19PbmVfU2VsZWN0YWJpbGl0eSxcclxuICBKU19TZXRfTW9kZWxsaW5nTWF0cml4LFxyXG4gIEpTX0FwcGVuZF9Nb2RlbGxpbmdNYXRyaXgsXHJcbiAgSlNfU2hvd19Nb2RlbGxpbmdNYXRyaXgsXHJcbiAgSlNfU2hvd19QYXRoX01vZGVsbGluZ01hdHJpeCxcclxuICBKU19VblNldF9Nb2RlbGxpbmdNYXRyaXgsXHJcbiAgSlNfU2V0X1JlbmRlcmluZ19PcHRpb25zLFxyXG4gIEpTX1VuU2V0X1JlbmRlcmluZ19PcHRpb25zLFxyXG4gIEpTX1VuU2V0X09uZV9SZW5kZXJpbmdfT3B0aW9uLFxyXG4gIEpTX1Nob3dfUmVuZGVyaW5nX09wdGlvbnMsXHJcbiAgSlNfU2hvd19PbmVfUmVuZGVyaW5nX09wdGlvbixcclxuICBKU19TaG93X09uZV9EZWZhdWx0X1JlbmRlcmluZ19PcHRpb24sXHJcbiAgSlNfU2hvd19PbmVfUGF0aF9SZW5kZXJpbmdfT3B0aW9uLFxyXG4gIEpTX1NldF9IZXVyaXN0aWNfT3B0aW9ucyxcclxuICBKU19TZXRfT25lX0hldXJpc3RpY19PcHRpb24sXHJcbiAgSlNfVW5TZXRfSGV1cmlzdGljX09wdGlvbnMsXHJcbiAgSlNfVW5TZXRfT25lX0hldXJpc3RpY19PcHRpb24sXHJcbiAgSlNfU2hvd19IZXVyaXN0aWNfT3B0aW9ucyxcclxuICBKU19TaG93X09uZV9IZXVyaXN0aWNfT3B0aW9uLFxyXG4gIEpTX1NldF9Db25kaXRpb24sXHJcbiAgSlNfU2hvd19Db25kaXRpb24sXHJcbiAgSlNfVW5TZXRfQ29uZGl0aW9uLFxyXG4gIEpTX1NldF9UZXh0X0ZvbnQsXHJcbiAgSlNfVW5TZXRfVGV4dF9Gb250LFxyXG4gIEpTX1VuU2V0X09uZV9UZXh0X0ZvbnQsXHJcbiAgSlNfU2hvd19UZXh0X0ZvbnQsXHJcbiAgSlNfU2hvd19PbmVfVGV4dF9Gb250LFxyXG4gIEpTX0F0dHJpYnV0ZV9FeGlzdHMsXHJcbiAgSlNfSW1hZ2VfRXhpc3RzLFxyXG4gIEpTX1Jlc2l6ZV9CeV9LZXksXHJcbiAgSlNfSW5zZXJ0X01hcmtlcixcclxuICBKU19FZGl0X01hcmtlcixcclxuICBKU19TaG93X01hcmtlcixcclxuICBKU19JbnNlcnRfUG9pbnRfQ2xvdWQsXHJcbiAgSlNfRWRpdF9Qb2ludF9DbG91ZCxcclxuICBKU19TaG93X1BvaW50X0Nsb3VkLFxyXG4gIEpTX0luc2VydF9MaW5lLFxyXG4gIEpTX0VkaXRfTGluZSxcclxuICBKU19TaG93X0xpbmUsXHJcbiAgSlNfSW5zZXJ0X1BvbHlsaW5lLFxyXG4gIEpTX1Nob3dfUG9seWxpbmVfQ291bnQsXHJcbiAgSlNfU2hvd19Qb2x5bGluZSxcclxuICBKU19JbnNlcnRfQ2lyY2xlLFxyXG4gIEpTX1Nob3dfQ2lyY2xlLFxyXG4gIEpTX0luc2VydF9DeWxpbmRlcixcclxuICBKU19TaG93X0N5bGluZGVyLFxyXG4gIEpTX0luc2VydF9Qb2x5Q3lsaW5kZXIsXHJcbiAgSlNfRWRpdF9Qb2x5Q3lsaW5kZXIsXHJcbiAgSlNfSW5zZXJ0X1NoZWxsLFxyXG4gIEpTX0VkaXRfU2hlbGwsXHJcbiAgSlNfU2hvd19TaGVsbF9TaXplLFxyXG4gIEpTX1Nob3dfU2hlbGwsXHJcbiAgSlNfSW5zZXJ0X1RyaWFuZ3VsYXJfU2hlbGwsXHJcbiAgSlNfSW5zZXJ0X01lc2gsXHJcbiAgSlNfRWRpdF9NZXNoX1BvaW50cyxcclxuICBKU19TaG93X01lc2hfU2l6ZSxcclxuICBKU19TaG93X01lc2gsXHJcbiAgSlNfSW5zZXJ0X1ZlY3Rvcl9UZXh0LFxyXG4gIEpTX0luc2VydF9QYXJhbWV0cmljX0dlb21ldHJ5LFxyXG4gIEpTX0VkaXRfUGFyYW1ldHJpY19HZW9tZXRyeSxcclxuICBKU19TaG93X1BhcmFtZXRyaWNfR2VvbWV0cnksXHJcbiAgSlNfSW5zZXJ0X1BhcmFtZXRyaWNfR2VvbWV0cmllcyxcclxuICBKU19JbnNlcnRfTGlnaHQsXHJcbiAgSlNfRWRpdF9MaWdodCxcclxuICBKU19TaG93X0xpZ2h0LFxyXG4gIEpTX0luc2VydF9JbWFnZSxcclxuICBKU19TZXRfSW1hZ2VfT3B0aW9ucyxcclxuICBKU19VblNldF9PbmVfSW1hZ2VfT3B0aW9uLFxyXG4gIEpTX1Nob3dfSW1hZ2VfUG9zaXRpb24sXHJcbiAgSlNfU2hvd19JbWFnZV9TaXplLFxyXG4gIEpTX1Nob3dfSW1hZ2VfRGF0YSxcclxuICBKU19TaG93X0ltYWdlX09wdGlvbnMsXHJcbiAgSlNfU2hvd19PbmVfSW1hZ2VfT3B0aW9uLFxyXG4gIEpTX1Nob3dfSW1hZ2UsXHJcbiAgSlNfSW5zZXJ0X0N1dHRpbmdfUGxhbmVzLFxyXG4gIEpTX0VkaXRfQ3V0dGluZ19QbGFuZXMsXHJcbiAgSlNfU2hvd19DdXR0aW5nX1BsYW5lcyxcclxuICBKU19TaG93X0dlb21ldHJ5X1ZlcnRpY2VzX1Bvc2l0aW9uX0J5X0luZGV4ZXMsXHJcbiAgSlNfU2hvd19HZW9tZXRyeV9FbGVtZW50X1R5cGUsXHJcbiAgSlNfU2V0X0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzLFxyXG4gIEpTX1Nob3dfR2VvbWV0cnlfVGV4dHVyZV9EaW1lbnNpb24sXHJcbiAgSlNfU2hvd19HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyxcclxuICBKU19VblNldF9HZW9tZXRyeV9UZXh0dXJlX0Nvb3JkcyxcclxuICBKU19Db21wdXRlX0dlb21ldHJ5X1RleHR1cmVfQ29vcmRzLFxyXG4gIEpTX1NldF9HZW9tZXRyeV9Ob3JtYWxzLFxyXG4gIEpTX1Nob3dfR2VvbWV0cnlfTm9ybWFscyxcclxuICBKU19VblNldF9HZW9tZXRyeV9Ob3JtYWxzLFxyXG4gIEpTX0NvbXB1dGVfR2VvbWV0cnlfVGVzc2VsbGF0ZV9EYXRhLFxyXG4gIEpTX0NvbXB1dGVfR2VvbWV0cnlfRGF0YSxcclxuICBKU19NZXJnZV9TaGVsbCxcclxuICBKU19FeHRydWRlX0J5X1NoZWxsLFxyXG4gIEpTX1N3ZWVwX0J5X1NoZWxsLFxyXG4gIEpTX0RTd2VlcF9CeV9TaGVsbCxcclxuICBKU19ERXh0cnVkZV9CeV9TaGVsbCxcclxuICBKU19Sb3RhdGVfQnlfU2hlbGwsXHJcbiAgSlNfRFJvdGF0ZV9CeV9TaGVsbCxcclxuICBKU19Db21wdXRlX1JheV9UZXN0LFxyXG4gIEpTX0NvbXB1dGVfR2VvbWV0cnlfUmF5X1Rlc3QsXHJcbiAgSlNfQ29tcHV0ZV9Cb3hfVGVzdCxcclxuICBKU19Db21wdXRlX1BvbHlnb25fQXJlYSxcclxuICBKU19Db21wdXRlX0FyZWEsXHJcbiAgSlNfQ29tcHV0ZV9Wb2x1bWUsXHJcbiAgSlNfSXNfU29saWRfR2VvbWV0cnksXHJcbiAgSlNfQ29tcHV0ZV9HZW9tZXRyeV9EaXN0YW5jZSxcclxuICBKU19TZWdtZW50X1RvX1N0cmVhbSxcclxuICBKU19TZWdtZW50X1RvX1N0cmVhbV9CeV9LZXksXHJcbiAgSlNfU2VnbWVudF9Ub19TdHJlYW1fV2l0aF9Db21wcmVzc2lvbixcclxuICBKU19TZWdtZW50X1RvX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uX0J5X0tleSxcclxuICBKU19TdHJlYW1fVG9fU2VnbWVudCxcclxuICBKU19TdHJlYW1fVG9fU2VnbWVudF9CeV9LZXksXHJcbiAgSlNfU3RyZWFtX1RvX1NlZ21lbnRfQnlfS2V5X1R0LFxyXG4gIEpTX1N0cmVhbV9XaXRoX0NvbXByZXNzaW9uX1RvX1NlZ21lbnRfQnlfS2V5LFxyXG4gIEpTX1NlZ21lbnRfRGF0YV9Ub19TdHJlYW0sXHJcbiAgSlNfU3RyZWFtX1RvX1NlZ21lbnRfRGF0YSxcclxuICBKU19HZW9tZXRyeV9EYXRhX1RvX1N0cmVhbSxcclxuICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YSxcclxuICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXksXHJcbiAgSlNfU3RyZWFtX1RvX0dlb21ldHJ5X0RhdGFfQnlfS2V5cyxcclxuICBKU19TdHJlYW1fVG9fR2VvbWV0cnlfRGF0YV9CeV9LZXlzX1R0LFxyXG4gIEpTX1N0cmVhbV9Ub19HZW9tZXRyeV9EYXRhX1dpdGhfQ29tcHJlc3Npb24sXHJcbiAgSlNfQ29weV9TZWdtZW50X0J5X0tleSxcclxuICBKU19TaG93X0RhdGFiYXNlX0luZm8sXHJcbiAgSlNfU2hvd19BbGxvY2F0ZWRfTWVtb3J5X1NpemUsXHJcbiAgSlNfRXhlY3V0ZV9UYXNrX1Bvc3RfUHJvY2Vzc2luZyxcclxuICBKU19DcmVhdGVfVGV4dHVyZSxcclxuICBKU19Cb29sZWFuX0ludGVyc2VjdGlvbl9HcmFwaCxcclxuICBKU19Cb29sZWFuX0ludGVyc2VjdF9Qb2x5bGluZV9Qb2x5Z29uX1h5LFxyXG4gIEpTX0Jvb2xlYW5fSW50ZXJzZWN0X1BvbHlnb25fUG9seWdvbl9YeSxcclxuICBKU19Cb29sZWFuX0ludGVyc2VjdF9HcmFwaF9Qb2x5Z29uX1h5LFxyXG4gIEpTX0Jvb2xlYW5fU3VidHJhY3RfUG9seWdvbl9Qb2x5Z29uX1h5LFxyXG4gIEpTX0Jvb2xlYW5fQ3V0X1BvbHlnb25fUG9seWdvbl9YeSxcclxuICBKU19Cb29sZWFuX1N1YnRyYWN0LFxyXG4gIEpTX0ZlYXR1cmVfRXh0cnVkZSxcclxuICBKU19QbGFuYXJfUG9seWxpbmVfT2Zmc2V0LFxyXG59O1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./packages/longan/src/longan/gs.viewer.ts\n");
5628
5628
 
5629
5629
  /***/ }),
5630
5630
 
@@ -13322,7 +13322,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"P
13322
13322
  /***/ (function(module) {
13323
13323
 
13324
13324
  "use strict";
13325
- module.exports = JSON.parse('{"name":"gs-bim-air","version":"2.0.0-beta.16","description":"发布的基于gs-longan的图形显示控件","main":"lib/BimAir.umd.min.js","types":"types/index.d.ts","author":"","license":"ISC","scripts":{"publish":"npm publish ","publishBeta":"npm publish --tag=beta","publishBeta2":"npm publish --tag=beta2","typedoc":"typedoc --plugin typedoc-plugin-markdown"},"dependencies":{},"devDependencies":{}}');
13325
+ module.exports = JSON.parse('{"name":"gs-bim-air","version":"2.0.0-beta.18","description":"发布的基于gs-longan的图形显示控件","main":"lib/BimAir.umd.min.js","types":"types/index.d.ts","author":"","license":"ISC","scripts":{"publish":"npm publish ","publishBeta":"npm publish --tag=beta","publishBeta2":"npm publish --tag=beta2","typedoc":"typedoc --plugin typedoc-plugin-markdown"},"dependencies":{},"devDependencies":{}}');
13326
13326
 
13327
13327
  /***/ }),
13328
13328
 
@@ -13333,7 +13333,7 @@ module.exports = JSON.parse('{"name":"gs-bim-air","version":"2.0.0-beta.16","des
13333
13333
  /***/ (function(module) {
13334
13334
 
13335
13335
  "use strict";
13336
- module.exports = JSON.parse('{"name":"gs-longan","version":"2.0.0-beta.11","description":"基于webgl和webassembly图形框架","main":"dist/index.js","exports":{},"scripts":{"publish":"npm publish","publishBeta":"npm publish --tag=beta1","bundle":"node scripts/deleteLonganBundle.js && npx tsc --build tsconfigbundle.json && node scripts/deleteFirstLine && node scripts/copyFile package.json dist/package.json"},"author":"","license":"ISC"}');
13336
+ module.exports = JSON.parse('{"name":"gs-longan","version":"2.0.0-beta.12","description":"基于webgl和webassembly图形框架","main":"dist/index.js","exports":{},"scripts":{"publish":"npm publish","publishBeta":"npm publish --tag=beta1","bundle":"node scripts/deleteLonganBundle.js && npx tsc --build tsconfigbundle.json && node scripts/deleteFirstLine && node scripts/copyFile package.json dist/package.json"},"author":"","license":"ISC"}');
13337
13337
 
13338
13338
  /***/ })
13339
13339