@realsee/dnalogel 3.69.3-alpha.1 → 3.69.4-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/CHANGELOG.md +39 -3
  2. package/components/index.js +1202 -575
  3. package/dist/CSS3DRenderPlugin/Controller.d.ts +0 -4
  4. package/dist/CurrentPanoImagePlugin/Controller.d.ts +1 -2
  5. package/dist/GuideLinePlugin/Controller.d.ts +1 -0
  6. package/dist/MeasurePlugin/Controller.d.ts +26 -3
  7. package/dist/MeasurePlugin/index.d.ts +7 -1
  8. package/dist/ModelViewPlugin/Plugin.d.ts +2 -1
  9. package/dist/PanoTagPlugin/typings/controller.d.ts +3 -0
  10. package/dist/Sculpt/typings/style.d.ts +5 -0
  11. package/dist/Sculpt/utils/unit.d.ts +1 -1
  12. package/dist/base/BasePlugin.d.ts +0 -4
  13. package/dist/floorplan/FloorplanGuidePlugin/Components/Camera.svelte.d.ts +1 -0
  14. package/dist/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/CurrentFloor.svelte.d.ts +1 -0
  15. package/dist/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/ExtraObjects.svelte.d.ts +1 -0
  16. package/dist/floorplan/FloorplanGuidePlugin/Components/Main.svelte.d.ts +1 -0
  17. package/dist/floorplan/FloorplanGuidePlugin/Components/ObserverDots.svelte.d.ts +1 -0
  18. package/dist/floorplan/FloorplanGuidePlugin/Components/RoomLabelItem.svelte.d.ts +1 -0
  19. package/dist/floorplan/FloorplanGuidePlugin/Components/RoomLabels.svelte.d.ts +1 -0
  20. package/dist/floorplan/FloorplanGuidePlugin/Controller.d.ts +46 -0
  21. package/dist/floorplan/FloorplanGuidePlugin/index.d.ts +7 -0
  22. package/dist/floorplan/FloorplanGuidePlugin/typing.d.ts +146 -0
  23. package/dist/floorplan/PanoFloorplanRadarPlugin/typing.d.ts +2 -0
  24. package/dist/floorplan/index.d.ts +1 -0
  25. package/dist/floorplan/typings/index.d.ts +2 -0
  26. package/dist/index.cjs.js +81 -81
  27. package/dist/index.js +13321 -11281
  28. package/dist/index.umd.js +78 -78
  29. package/dist/shared-utils/index.d.ts +2 -1
  30. package/dist/shared-utils/three/Magnifier.d.ts +2 -0
  31. package/dist/shared-utils/three/PointSelector/index.d.ts +5 -0
  32. package/dist/shared-utils/three/PointSelector/utils/PointSelectorHelper.d.ts +1 -0
  33. package/dist/shared-utils/url/defaultUrls.d.ts +30 -0
  34. package/dist/shared-utils/url/replace-static-prefix.d.ts +11 -0
  35. package/docs/assets/navigation.js +1 -1
  36. package/docs/assets/search.js +1 -1
  37. package/docs/classes/AreaMakerPluginType.AreaMakerController.html +5 -7
  38. package/docs/classes/AreaMakerPluginType.AreaMakerItem.html +2 -2
  39. package/docs/classes/CSS3DRender.html +2 -2
  40. package/docs/classes/GuideLineItem.GuideLineItem.html +2 -2
  41. package/docs/classes/GuideLineModeItem.GuideLineModeItem.html +2 -2
  42. package/docs/classes/ModelMakerPluginInstance.html +5 -7
  43. package/docs/classes/ModelMakerPluginType.ModelMakerBoxItem.html +2 -2
  44. package/docs/classes/ModelMakerPluginType.ModelMakerPolygonItem.html +2 -2
  45. package/docs/classes/ModelMakerPluginType.ModelMakerPrismItem.html +2 -2
  46. package/docs/classes/ModelRoomLabelController.html +2 -2
  47. package/docs/classes/MoveController.html +5 -7
  48. package/docs/classes/Object3DHelperController.html +5 -7
  49. package/docs/classes/PaintBrush.html +2 -2
  50. package/docs/classes/PanoMeasurePluginLine.html +2 -2
  51. package/docs/classes/PanoMeasurePluginModel.html +2 -2
  52. package/docs/classes/PanoMeasurePluginPoint.html +2 -2
  53. package/docs/classes/PanoMeasurePluginPolyline.html +2 -2
  54. package/docs/classes/PanoTagPluginController.html +32 -34
  55. package/docs/classes/Sculpt.html +2 -2
  56. package/docs/classes/Util.BetterTween.html +2 -2
  57. package/docs/classes/Util.FiveDomEvents.html +2 -2
  58. package/docs/classes/Util.FivePuppet.html +2 -2
  59. package/docs/classes/Util.Interval.html +2 -2
  60. package/docs/classes/Util.LegacyPointHelper.html +2 -2
  61. package/docs/classes/Util.LightTag.html +2 -2
  62. package/docs/classes/Util.LineSegments.html +2 -2
  63. package/docs/classes/Util.Magnifier.html +8 -8
  64. package/docs/classes/Util.Object3D.html +2 -2
  65. package/docs/classes/Util.PointDomHelper.html +2 -2
  66. package/docs/classes/Util.PointHelper.html +2 -2
  67. package/docs/classes/Util.PointSelector.html +12 -12
  68. package/docs/classes/Util.PointSelectorHelper.html +2 -2
  69. package/docs/classes/Util.Rectangle.html +2 -2
  70. package/docs/classes/Util.sculpt.BaseEditor.html +2 -2
  71. package/docs/classes/Util.sculpt.BoxMesh.html +5 -5
  72. package/docs/classes/Util.sculpt.BoxMeshEditor.html +2 -2
  73. package/docs/classes/Util.sculpt.CircleMesh.html +2 -2
  74. package/docs/classes/Util.sculpt.CircleMeshEditor.html +2 -2
  75. package/docs/classes/Util.sculpt.CircleWithEdgeMesh.html +2 -2
  76. package/docs/classes/Util.sculpt.CylinderMesh.html +2 -2
  77. package/docs/classes/Util.sculpt.CylinderMeshEditor.html +2 -2
  78. package/docs/classes/Util.sculpt.LineMesh.html +2 -2
  79. package/docs/classes/Util.sculpt.PointMesh.html +2 -2
  80. package/docs/classes/Util.sculpt.PolygonMesh.html +2 -2
  81. package/docs/classes/Util.sculpt.PrismMesh.html +5 -5
  82. package/docs/classes/Util.sculpt.PrismMeshEditor.html +2 -2
  83. package/docs/classes/Util.sculpt.RectangleMesh.html +2 -2
  84. package/docs/classes/Util.sculpt.RectangleMeshEditor.html +2 -2
  85. package/docs/classes/Util.sculpt.RectangleWithEdgeMesh.html +2 -2
  86. package/docs/classes/WalkController.html +5 -7
  87. package/docs/enums/CameraMovementEffect.html +2 -2
  88. package/docs/enums/ContentType.html +2 -2
  89. package/docs/enums/DIRECTION.html +2 -2
  90. package/docs/enums/DISPLAY_STRATEGY_TYPE.html +2 -2
  91. package/docs/enums/DimensionType.html +2 -2
  92. package/docs/enums/FLOOR_PLAN_ATTACHED_TO.html +2 -2
  93. package/docs/enums/ITEM_LABEL_PLUGIN_DISPLAY_STRATEGY_TYPE.html +2 -2
  94. package/docs/enums/PaintBrushTypeEnum.html +2 -2
  95. package/docs/enums/PointType.html +2 -2
  96. package/docs/enums/Rotation.html +2 -2
  97. package/docs/functions/AreaMakerPlugin.html +1 -1
  98. package/docs/functions/CSS3DRenderPlugin.html +1 -1
  99. package/docs/functions/CameraMovementPlugin.html +2 -2
  100. package/docs/functions/CruisePlugin.html +1 -1
  101. package/docs/functions/CurrentPanoImagePlugin.html +1 -1
  102. package/docs/functions/FloorplanGuidePlugin.html +1 -0
  103. package/docs/functions/GuideLinePlugin.html +1 -1
  104. package/docs/functions/ItemLabelPlugin.html +1 -1
  105. package/docs/functions/MapviewFloorplanPlugin.html +1 -1
  106. package/docs/functions/MeasurePlugin.html +1 -1
  107. package/docs/functions/ModelChassisCompassPlugin.html +2 -2
  108. package/docs/functions/ModelEntryDoorGuidePlugin.html +2 -2
  109. package/docs/functions/ModelFloorplanPlugin.html +1 -1
  110. package/docs/functions/ModelItemLabelPlugin.html +1 -1
  111. package/docs/functions/ModelMakerPlugin.html +1 -1
  112. package/docs/functions/ModelRoomLabelPlugin.html +1 -1
  113. package/docs/functions/ModelTVVideoPlugin.html +1 -1
  114. package/docs/functions/ModelViewPlugin.html +2 -2
  115. package/docs/functions/MovePlugin.html +1 -1
  116. package/docs/functions/Object3DHelperPlugin.html +1 -1
  117. package/docs/functions/PanoCompassPlugin.html +1 -1
  118. package/docs/functions/PanoCursorRaycasterPlugin.html +2 -2
  119. package/docs/functions/PanoDoorLabelPlugin.html +1 -1
  120. package/docs/functions/PanoFloorplanRadarPlugin.html +1 -1
  121. package/docs/functions/PanoMeasurePlugin.html +1 -1
  122. package/docs/functions/PanoRulerPlugin.html +2 -2
  123. package/docs/functions/PanoRulerProPlugin.html +2 -2
  124. package/docs/functions/PanoSpatialTagPlugin.html +2 -2
  125. package/docs/functions/PanoTagPlugin.html +1 -1
  126. package/docs/functions/PanoVideoPlugin.html +2 -2
  127. package/docs/functions/PipelinePlugin.html +1 -1
  128. package/docs/functions/SculptPlugin.html +2 -2
  129. package/docs/functions/SculptPluginForFive.html +2 -2
  130. package/docs/functions/TopviewFloorplanPlugin.html +1 -1
  131. package/docs/functions/Util.awaitNextFrame.html +1 -1
  132. package/docs/functions/Util.blink.html +2 -2
  133. package/docs/functions/Util.bounding.html +1 -1
  134. package/docs/functions/Util.boundingBox.html +1 -1
  135. package/docs/functions/Util.boundingSphere.html +1 -1
  136. package/docs/functions/Util.boxVertex.html +2 -2
  137. package/docs/functions/Util.boxVertexes.html +1 -1
  138. package/docs/functions/Util.checkFiveModelLoaded.html +2 -2
  139. package/docs/functions/Util.convexHull.html +2 -2
  140. package/docs/functions/Util.equal.html +2 -2
  141. package/docs/functions/Util.fiveModelIsLoaded.html +2 -2
  142. package/docs/functions/Util.getCoordsFromClient.html +1 -1
  143. package/docs/functions/Util.getCoordsFromElement.html +1 -1
  144. package/docs/functions/Util.getFrameTime.html +2 -2
  145. package/docs/functions/Util.getIntersectFromRelativePosition.html +1 -1
  146. package/docs/functions/Util.getRaycasterFromFivePointer.html +1 -1
  147. package/docs/functions/Util.initialCSS3DRender.html +1 -1
  148. package/docs/functions/Util.inside.html +1 -1
  149. package/docs/functions/Util.isModelLike.html +1 -1
  150. package/docs/functions/Util.isNil.html +2 -2
  151. package/docs/functions/Util.isPanoramaLike.html +1 -1
  152. package/docs/functions/Util.lookObject.html +2 -2
  153. package/docs/functions/Util.lookPoint.html +2 -2
  154. package/docs/functions/Util.nextFrame.html +1 -1
  155. package/docs/functions/Util.notNil.html +2 -2
  156. package/docs/functions/Util.reblink.html +2 -2
  157. package/docs/functions/Util.replaceStaticPrefix.html +8 -0
  158. package/docs/functions/Util.requestAnimationFrameInterval.html +2 -2
  159. package/docs/functions/Util.sculpt.createBox.html +1 -1
  160. package/docs/functions/Util.sculpt.createCircle.html +1 -1
  161. package/docs/functions/Util.sculpt.createCylinder.html +1 -1
  162. package/docs/functions/Util.sculpt.createLine.html +2 -2
  163. package/docs/functions/Util.sculpt.createPoint.html +1 -1
  164. package/docs/functions/Util.sculpt.createPolygon.html +1 -1
  165. package/docs/functions/Util.sculpt.createPrism.html +1 -1
  166. package/docs/functions/Util.sculpt.createRectangle.html +2 -2
  167. package/docs/functions/Util.tag.html +1 -1
  168. package/docs/functions/Util.tweenProgress.html +1 -1
  169. package/docs/functions/Util.uuid.html +2 -2
  170. package/docs/functions/Util.waitFiveModelLoaded.html +2 -2
  171. package/docs/functions/Util.worldBounding.html +1 -1
  172. package/docs/functions/Util.worldBoundingBox.html +1 -1
  173. package/docs/functions/Util.worldBoundingSphere.html +1 -1
  174. package/docs/functions/createPolyline.html +2 -2
  175. package/docs/functions/pluginFlag.html +1 -1
  176. package/docs/hierarchy.html +1 -1
  177. package/docs/index.html +2 -2
  178. package/docs/interfaces/AreaMakerPluginType.AnimeOptions.html +2 -2
  179. package/docs/interfaces/AreaMakerPluginType.Config.html +2 -2
  180. package/docs/interfaces/AreaMakerPluginType.EventMap.html +2 -2
  181. package/docs/interfaces/AreaMakerPluginType.Params.html +2 -2
  182. package/docs/interfaces/AreaMakerPluginType.ServerAreaMakerItem.html +2 -2
  183. package/docs/interfaces/AreaMakerPluginType.ServerAreaMakerItemV1.html +2 -2
  184. package/docs/interfaces/AreaMakerPluginType.ServerDataV1.html +2 -2
  185. package/docs/interfaces/AreaMakerPluginType.ServerDataV2.html +2 -2
  186. package/docs/interfaces/AreaMakerPluginType.ShowHideOptions.html +2 -2
  187. package/docs/interfaces/AreaMakerPluginType.State.html +2 -2
  188. package/docs/interfaces/CSS3DRenderPluginEventMap.html +2 -2
  189. package/docs/interfaces/CSS3DRenderPluginState.html +2 -2
  190. package/docs/interfaces/CameraMovementPluginExportType.html +2 -2
  191. package/docs/interfaces/ContentTypeMapInterface.html +2 -2
  192. package/docs/interfaces/CruisePluginTypes.Config.html +2 -2
  193. package/docs/interfaces/CruisePluginTypes.CruiseKeyframe.html +2 -2
  194. package/docs/interfaces/CruisePluginTypes.EventMap.html +2 -2
  195. package/docs/interfaces/CruisePluginTypes.GuildLineConfig.html +2 -2
  196. package/docs/interfaces/CruisePluginTypes.MoveAction.html +2 -2
  197. package/docs/interfaces/CruisePluginTypes.MoveWithKeyframesAction.html +2 -2
  198. package/docs/interfaces/CruisePluginTypes.MoveWithPanoIndexAction.html +2 -2
  199. package/docs/interfaces/CruisePluginTypes.PluginData.html +2 -2
  200. package/docs/interfaces/CruisePluginTypes.PluginServerData.html +2 -2
  201. package/docs/interfaces/CruisePluginTypes.PluginState.html +2 -2
  202. package/docs/interfaces/CurrentPanoImagePluginType.Config.html +2 -2
  203. package/docs/interfaces/CurrentPanoImagePluginType.EventMap.html +2 -2
  204. package/docs/interfaces/CurrentPanoImagePluginType.Params.html +2 -2
  205. package/docs/interfaces/CurrentPanoImagePluginType.ShowHideOptions.html +2 -2
  206. package/docs/interfaces/CurrentPanoImagePluginType.State.html +2 -2
  207. package/docs/interfaces/FloorplanBounding.html +2 -2
  208. package/docs/interfaces/FloorplanData.html +2 -2
  209. package/docs/interfaces/FloorplanEntrance.html +2 -2
  210. package/docs/interfaces/FloorplanExtraObject.html +2 -2
  211. package/docs/interfaces/FloorplanExtraObject3D.html +2 -2
  212. package/docs/interfaces/FloorplanFloorData.html +2 -2
  213. package/docs/interfaces/FloorplanImagePosition.html +2 -2
  214. package/docs/interfaces/FloorplanObserver.html +2 -2
  215. package/docs/interfaces/FloorplanOutlineItem.html +2 -2
  216. package/docs/interfaces/FloorplanPosition.html +2 -2
  217. package/docs/interfaces/FloorplanRoomItem.html +2 -2
  218. package/docs/interfaces/FloorplanRoomLabelItem.html +2 -2
  219. package/docs/interfaces/FloorplanServerBounding.html +2 -2
  220. package/docs/interfaces/FloorplanServerComputedData.html +2 -2
  221. package/docs/interfaces/FloorplanServerData.html +2 -2
  222. package/docs/interfaces/FloorplanServerDoorItem.html +2 -2
  223. package/docs/interfaces/FloorplanServerDoorPosition.html +2 -2
  224. package/docs/interfaces/FloorplanServerEntrance.html +2 -2
  225. package/docs/interfaces/FloorplanServerFloorData.html +2 -2
  226. package/docs/interfaces/FloorplanServerImagePosition.html +2 -2
  227. package/docs/interfaces/FloorplanServerObserver.html +2 -2
  228. package/docs/interfaces/FloorplanServerOutlineItem.html +2 -2
  229. package/docs/interfaces/FloorplanServerPosition.html +2 -2
  230. package/docs/interfaces/FloorplanServerRoomItem.html +2 -2
  231. package/docs/interfaces/FloorplanServerRoomLabelItem.html +2 -2
  232. package/docs/interfaces/GuideLineModeItem.GuideLineTagContainer.html +2 -2
  233. package/docs/interfaces/GuideLinePluginType.CatmullRomCurve3.html +2 -2
  234. package/docs/interfaces/GuideLinePluginType.EventMap.html +2 -2
  235. package/docs/interfaces/GuideLinePluginType.ExtraRouteData.html +2 -2
  236. package/docs/interfaces/GuideLinePluginType.GuideLineGeometryStyle.html +2 -2
  237. package/docs/interfaces/GuideLinePluginType.GuideLineItemContainer.html +2 -2
  238. package/docs/interfaces/GuideLinePluginType.GuideLineMaterialStyle.html +2 -2
  239. package/docs/interfaces/GuideLinePluginType.GuideLineMeshStyle.html +2 -2
  240. package/docs/interfaces/GuideLinePluginType.LineGeometriesConfig.html +2 -2
  241. package/docs/interfaces/GuideLinePluginType.ModelGuideLineStyle.html +2 -2
  242. package/docs/interfaces/GuideLinePluginType.ModelGuideLineTagData.html +2 -2
  243. package/docs/interfaces/GuideLinePluginType.PanoramaGuideLineStyle.html +2 -2
  244. package/docs/interfaces/GuideLinePluginType.PluginDataV2.html +1 -1
  245. package/docs/interfaces/GuideLinePluginType.PluginServerData.html +2 -2
  246. package/docs/interfaces/GuideLinePluginType.PluginState.html +2 -2
  247. package/docs/interfaces/GuideLinePluginType.Route.html +2 -2
  248. package/docs/interfaces/HelperOffset.html +2 -2
  249. package/docs/interfaces/ImagePlaneGroup.html +2 -2
  250. package/docs/interfaces/ItemLabelPluginData.html +2 -2
  251. package/docs/interfaces/ItemLabelPluginExportReturnsType.html +2 -2
  252. package/docs/interfaces/ItemLabelPluginParametersType.html +2 -2
  253. package/docs/interfaces/MinMax.html +2 -2
  254. package/docs/interfaces/ModelChassisCompassPluginData.html +2 -2
  255. package/docs/interfaces/ModelChassisCompassPluginExportType.html +2 -2
  256. package/docs/interfaces/ModelChassisCompassPluginParameterType.html +2 -2
  257. package/docs/interfaces/ModelEntryDoorGuidePluginData.html +2 -2
  258. package/docs/interfaces/ModelEntryDoorGuidePluginExportType.html +2 -2
  259. package/docs/interfaces/ModelItemLabelPluginData.html +2 -2
  260. package/docs/interfaces/ModelItemLabelPluginExportReturnsType.html +2 -2
  261. package/docs/interfaces/ModelItemLabelPluginParametersType.html +2 -2
  262. package/docs/interfaces/ModelMakerPluginType.BoxItemObjectData.html +2 -2
  263. package/docs/interfaces/ModelMakerPluginType.EventMap.html +2 -2
  264. package/docs/interfaces/ModelMakerPluginType.PrismItemObjectData.html +2 -2
  265. package/docs/interfaces/ModelMakerPluginType.ServerBaseItem.html +2 -2
  266. package/docs/interfaces/ModelMakerPluginType.ServerBoxItem.html +2 -2
  267. package/docs/interfaces/ModelMakerPluginType.ServerData.html +2 -2
  268. package/docs/interfaces/ModelMakerPluginType.ServerPrismItem.html +2 -2
  269. package/docs/interfaces/ModelMakerPluginType.ServerTrianglesItem.html +2 -2
  270. package/docs/interfaces/ModelMakerPluginType.State.html +2 -2
  271. package/docs/interfaces/ModelMakerPluginType.TrianglesItemObjectData.html +2 -2
  272. package/docs/interfaces/ModelRoomLabelPluginData.html +2 -2
  273. package/docs/interfaces/ModelTVVideoPluginData.html +2 -2
  274. package/docs/interfaces/ModelTVVideoPluginExportType.html +2 -2
  275. package/docs/interfaces/ModelTVVideoPluginParameterType.html +2 -2
  276. package/docs/interfaces/ModelViewPluginExportType.html +2 -2
  277. package/docs/interfaces/Object3DHelperState.html +2 -2
  278. package/docs/interfaces/ObjectHelperControllers.html +2 -2
  279. package/docs/interfaces/PaintBrushAction.html +2 -2
  280. package/docs/interfaces/PaintBrushConfigs.html +2 -2
  281. package/docs/interfaces/PaintBrushState.html +2 -2
  282. package/docs/interfaces/PanoCursorRaycasterPluginExportType.html +2 -2
  283. package/docs/interfaces/PanoCursorRaycasterPluginParameterType.html +1 -1
  284. package/docs/interfaces/PanoMeasureParameterType.html +2 -2
  285. package/docs/interfaces/PanoMeasurePluginLineJson.html +2 -2
  286. package/docs/interfaces/PanoMeasurePluginOpenParameter.html +2 -2
  287. package/docs/interfaces/PanoMeasurePluginPointJson.html +2 -2
  288. package/docs/interfaces/PanoMeasurePluginPolylineJson.html +2 -2
  289. package/docs/interfaces/PanoRulerPluginExportType.html +2 -2
  290. package/docs/interfaces/PanoRulerPluginOptions.html +2 -2
  291. package/docs/interfaces/PanoRulerPluginParameterType.html +2 -2
  292. package/docs/interfaces/PanoRulerProPluginExportType.html +2 -2
  293. package/docs/interfaces/PanoRulerProPluginOptions.html +2 -2
  294. package/docs/interfaces/PanoRulerProPluginParameterType.html +2 -2
  295. package/docs/interfaces/PanoRulerProPluginState.html +2 -2
  296. package/docs/interfaces/PanoSpatialTagPluginContentEvent.html +1 -1
  297. package/docs/interfaces/PanoSpatialTagPluginContentReplacement.html +1 -1
  298. package/docs/interfaces/PanoSpatialTagPluginData.html +2 -2
  299. package/docs/interfaces/PanoSpatialTagPluginDataElement.html +2 -2
  300. package/docs/interfaces/PanoSpatialTagPluginExportType.html +2 -2
  301. package/docs/interfaces/PanoSpatialTagPluginOriginElement.html +2 -2
  302. package/docs/interfaces/PanoSpatialTagPluginParameterType.html +2 -2
  303. package/docs/interfaces/PanoSpatialTagPluginPointElement.html +2 -2
  304. package/docs/interfaces/PanoSpatialTagPluginTagElement.html +2 -2
  305. package/docs/interfaces/PanoVideoPluginType.LoadParams.html +2 -2
  306. package/docs/interfaces/PanoVideoPluginType.PanoVideoItem.html +2 -2
  307. package/docs/interfaces/PanoVideoPluginType.PluginData.html +2 -2
  308. package/docs/interfaces/PanoVideoPluginType.PluginEventMap.html +2 -2
  309. package/docs/interfaces/PanoVideoPluginType.PluginState.html +2 -2
  310. package/docs/interfaces/PanoVideoPluginType.VideoItem.html +2 -2
  311. package/docs/interfaces/PanoVideoPluginType.VideoMeshParams.html +2 -2
  312. package/docs/interfaces/PluginEventMap.html +4 -3
  313. package/docs/interfaces/Point.html +2 -2
  314. package/docs/interfaces/Room.html +2 -2
  315. package/docs/interfaces/RoomInfo.html +2 -2
  316. package/docs/interfaces/RoomLabel.html +2 -2
  317. package/docs/interfaces/RoomRules.html +1 -1
  318. package/docs/interfaces/Rooms.html +1 -1
  319. package/docs/interfaces/Scissor.html +2 -2
  320. package/docs/interfaces/SculptConfig.html +2 -2
  321. package/docs/interfaces/State.html +2 -2
  322. package/docs/interfaces/TagCacheInterface.html +3 -3
  323. package/docs/interfaces/TagConfig.html +2 -2
  324. package/docs/interfaces/TagGLTFObjectGroup.html +2 -2
  325. package/docs/interfaces/TagIconUrl.html +2 -2
  326. package/docs/interfaces/TagObjectGroup.html +2 -2
  327. package/docs/interfaces/TagState.html +2 -2
  328. package/docs/interfaces/TagStyle.html +2 -2
  329. package/docs/interfaces/Tags.html +2 -2
  330. package/docs/interfaces/TemporaryState.html +2 -2
  331. package/docs/interfaces/Util.AnimeInstance.html +2 -2
  332. package/docs/interfaces/Util.BlinkAnimeOptions.html +2 -2
  333. package/docs/interfaces/Util.EventHandlerConfig.html +2 -2
  334. package/docs/interfaces/Util.FiveDomEvent.html +2 -2
  335. package/docs/interfaces/Util.FiveDomEventMap.html +2 -2
  336. package/docs/interfaces/Util.LegacyMouseGroupParameter.html +2 -2
  337. package/docs/interfaces/Util.MagnifierParameter.html +6 -4
  338. package/docs/interfaces/Util.MouseGroupParameter.html +2 -2
  339. package/docs/interfaces/Util.PointIntersection.html +8 -8
  340. package/docs/interfaces/Util.PointSelectorHelperConfig.html +3 -2
  341. package/docs/interfaces/Util.ReBlinkAnimeOptions.html +2 -2
  342. package/docs/modules/AreaMakerPluginType.html +2 -2
  343. package/docs/modules/CruisePluginTypes.html +2 -2
  344. package/docs/modules/CurrentPanoImagePluginType.html +2 -2
  345. package/docs/modules/GuideLineItem.html +2 -2
  346. package/docs/modules/GuideLineModeItem.html +2 -2
  347. package/docs/modules/GuideLinePluginType.html +2 -2
  348. package/docs/modules/ModelMakerPluginType.html +2 -2
  349. package/docs/modules/PanoVideoPluginType.html +2 -2
  350. package/docs/modules/SculptData.html +2 -2
  351. package/docs/modules/SculptType.html +2 -2
  352. package/docs/modules/Util.html +16 -5
  353. package/docs/modules/Util.sculpt.html +2 -2
  354. package/docs/modules.html +6 -2
  355. package/docs/types/AddObject3DHelperConfig.html +2 -2
  356. package/docs/types/AreaMakerPluginType.AreaMakerItemEventMap.html +2 -2
  357. package/docs/types/AreaMakerPluginType.ItemRenderer.html +1 -1
  358. package/docs/types/AreaMakerPluginType.PluginData.html +2 -2
  359. package/docs/types/AreaMakerPluginType.ServerData.html +2 -2
  360. package/docs/types/ArrayPosition.html +1 -1
  361. package/docs/types/AudioAppearance.html +1 -1
  362. package/docs/types/CSS3DRenderExportType.html +1 -1
  363. package/docs/types/CSS3DRenderPluginExportType.html +1 -1
  364. package/docs/types/CSS3DRenderPluginParameterType.html +1 -1
  365. package/docs/types/ClassFunctionParameters.html +1 -1
  366. package/docs/types/Color.html +1 -1
  367. package/docs/types/ContentTypeConfigKey.html +1 -1
  368. package/docs/types/ContentTypeConfigKeySplit.html +1 -1
  369. package/docs/types/ContentTypeMap.html +1 -1
  370. package/docs/types/Create3DDomContainerReturnType.html +1 -1
  371. package/docs/types/Create3DElementReturnType.html +1 -1
  372. package/docs/types/CruisePluginExportType.html +1 -1
  373. package/docs/types/CruisePluginTypes.CruiseData.html +2 -2
  374. package/docs/types/CruisePluginTypes.MoveEffect.html +1 -1
  375. package/docs/types/CurrentPanoImagePluginExportType.html +1 -1
  376. package/docs/types/DeprecatedMediaPlaneProperty.html +2 -2
  377. package/docs/types/DeprecatedTagProperty.html +2 -2
  378. package/docs/types/Direction-1.html +1 -1
  379. package/docs/types/Direction4.html +1 -1
  380. package/docs/types/ElementRenderer.html +2 -2
  381. package/docs/types/FloorplanGuidePluginParameterType.html +1 -0
  382. package/docs/types/FloorplanGuidePluginReturnType.html +1 -0
  383. package/docs/types/FloorplanRuleLabels.html +2 -2
  384. package/docs/types/FloorplanServerRuleLabels.html +1 -1
  385. package/docs/types/GuideLinePluginExportType.html +1 -1
  386. package/docs/types/GuideLinePluginType.GuideLineItem.html +2 -2
  387. package/docs/types/GuideLinePluginType.GuideLineItemEventMap.html +1 -1
  388. package/docs/types/GuideLinePluginType.GuideLineModeItemMode.html +1 -1
  389. package/docs/types/GuideLinePluginType.GuideLineStyle.html +2 -2
  390. package/docs/types/GuideLinePluginType.ModelGuideLineTag.html +2 -2
  391. package/docs/types/GuideLinePluginType.PathItem.html +2 -2
  392. package/docs/types/GuideLinePluginType.PluginData.html +2 -2
  393. package/docs/types/GuideLinePluginType.RouteConfig.html +2 -2
  394. package/docs/types/HelperEventMap.html +1 -1
  395. package/docs/types/InternalHelperEventMap.html +1 -1
  396. package/docs/types/MapviewFloorplanPluginParameterType.html +1 -1
  397. package/docs/types/MapviewFloorplanPluginReturnType.html +1 -1
  398. package/docs/types/MeasureEndReason.html +1 -0
  399. package/docs/types/MeasurePluginConfig.html +5 -1
  400. package/docs/types/MediaData.html +2 -2
  401. package/docs/types/MediaStore.html +1 -1
  402. package/docs/types/ModelEntryDoorGuidePluginParameterType.html +1 -1
  403. package/docs/types/ModelFloorplanPluginParameterType.html +1 -1
  404. package/docs/types/ModelFloorplanPluginReturnType.html +1 -1
  405. package/docs/types/ModelId.html +1 -1
  406. package/docs/types/ModelMakerPluginType.ElementRenderer.html +1 -1
  407. package/docs/types/ModelMakerPluginType.ItemType.html +2 -2
  408. package/docs/types/ModelMakerPluginType.MarkerItem.html +1 -1
  409. package/docs/types/ModelMakerPluginType.ServerItem.html +2 -2
  410. package/docs/types/ModelRoomLabelPluginParameters.html +1 -1
  411. package/docs/types/ModelRoomLabelPluginReturnType.html +1 -1
  412. package/docs/types/MoveArgs.html +2 -2
  413. package/docs/types/MoveOpts.html +2 -2
  414. package/docs/types/Object3DHelperEventMap.html +1 -1
  415. package/docs/types/ObjectFit.html +1 -1
  416. package/docs/types/PaintBrushEventMap.html +1 -1
  417. package/docs/types/PanoCompassPluginData.html +1 -1
  418. package/docs/types/PanoCompassPluginExportType.html +1 -1
  419. package/docs/types/PanoCompassPluginParameterType.html +1 -1
  420. package/docs/types/PanoFloorplanRadarPluginParameterType.html +1 -1
  421. package/docs/types/PanoFloorplanRadarPluginReturnType.html +1 -1
  422. package/docs/types/PanoIndex.html +1 -1
  423. package/docs/types/PanoMeasurePluginEvent.html +1 -1
  424. package/docs/types/PanoMeasureReturnType.html +1 -1
  425. package/docs/types/PanoSpatialTagPluginId.html +1 -1
  426. package/docs/types/PanoTagPluginExportInterface.html +1 -1
  427. package/docs/types/PanoTagPluginParamsInterface.html +1 -1
  428. package/docs/types/PanoVideoPluginParameterType.html +1 -1
  429. package/docs/types/PanoVideoPluginReturnType.html +1 -1
  430. package/docs/types/PickTagContentTypeInContentTypeConfigKey.html +2 -2
  431. package/docs/types/PipelinePluginParameterType.html +1 -1
  432. package/docs/types/PipelinePluginReturnType.html +1 -1
  433. package/docs/types/PlaneTag.html +2 -2
  434. package/docs/types/Point2DTag.html +2 -2
  435. package/docs/types/Point3DTag.html +2 -2
  436. package/docs/types/PointTagInstance.html +1 -1
  437. package/docs/types/Position.html +1 -1
  438. package/docs/types/PositionFrom.html +1 -1
  439. package/docs/types/RotateArgs.html +2 -2
  440. package/docs/types/RotateOpts.html +2 -2
  441. package/docs/types/RuleLabelsKey.html +1 -1
  442. package/docs/types/RuleLabelsValue.html +1 -1
  443. package/docs/types/ScaleCallback.html +1 -1
  444. package/docs/types/ScalePosition.html +2 -2
  445. package/docs/types/SculptData.BoxData.html +1 -1
  446. package/docs/types/SculptData.CircleData.html +1 -1
  447. package/docs/types/SculptData.CylinderData.html +1 -1
  448. package/docs/types/SculptData.PointData.html +1 -1
  449. package/docs/types/SculptData.PolygonData.html +1 -1
  450. package/docs/types/SculptData.PolylineData.html +1 -1
  451. package/docs/types/SculptData.PrismData.html +1 -1
  452. package/docs/types/SculptData.RectangleData.html +1 -1
  453. package/docs/types/SculptType.Theme.html +2 -2
  454. package/docs/types/StickType.html +1 -1
  455. package/docs/types/Tag.html +2 -2
  456. package/docs/types/Tag2D.html +2 -2
  457. package/docs/types/Tag3D.html +2 -2
  458. package/docs/types/TagClickParams.html +1 -1
  459. package/docs/types/TagConfigByKey.html +1 -1
  460. package/docs/types/TagContentType.html +1 -1
  461. package/docs/types/TagContentTypeMapping.html +1 -1
  462. package/docs/types/TagDimensionType.html +1 -1
  463. package/docs/types/TagElement.html +2 -2
  464. package/docs/types/TagEvents.html +1 -1
  465. package/docs/types/TagGLTFObject.html +1 -1
  466. package/docs/types/TagHooks.html +1 -1
  467. package/docs/types/TagId.html +1 -1
  468. package/docs/types/TagInstance.html +1 -1
  469. package/docs/types/TagPlacement.html +2 -2
  470. package/docs/types/TagPointType.html +2 -2
  471. package/docs/types/TagRendererMap.html +1 -1
  472. package/docs/types/TopviewFloorplanPluginParameterType.html +1 -1
  473. package/docs/types/TopviewFloorplanPluginReturnType.html +1 -1
  474. package/docs/types/Util.ActionIfNoIntersection.html +1 -1
  475. package/docs/types/Util.AdherePoint.html +2 -2
  476. package/docs/types/Util.PointSelectorConfig.html +1 -1
  477. package/docs/types/WorkCode.html +1 -1
  478. package/docs/variables/FLOOR_TYPE_MAP.html +2 -2
  479. package/docs/variables/PLUGIN.html +1 -1
  480. package/docs/variables/ROOM_FETILE_TYPE_MAP.html +2 -2
  481. package/docs/variables/ROOM_TYPE_MAP.html +2 -2
  482. package/docs/variables/Util.CURRENT_PANO_IMAGE_DEFAULT_IMAGE.html +2 -0
  483. package/docs/variables/Util.DEFAULT_STATIC_PREFIX.html +2 -0
  484. package/docs/variables/Util.DNALOGEL_DEFAULT_ASSETS.html +2 -0
  485. package/docs/variables/Util.ENTRY_DOOR_DEFAULT_IMAGE.html +2 -0
  486. package/docs/variables/Util.FLOORPLAN_DEFAULT_IMAGE.html +2 -0
  487. package/docs/variables/Util.GUIDELINE_DEFAULT_ARROW_TEXTURE.html +2 -0
  488. package/docs/variables/Util.GUIDELINE_WHITE_ARROW_TEXTURE.html +2 -0
  489. package/docs/variables/Util.MODEL_CHASSIS_COMPASS_DEFAULT_MODEL.html +2 -0
  490. package/docs/variables/Util.MODEL_ENTRY_DOOR_GUIDE_PLUGIN_DEFAULT_MODEL.html +2 -0
  491. package/docs/variables/Util.PANO_COMPASS_DEFAULT_IMAGE.html +2 -0
  492. package/docs/variables/Util.PANO_SPATIAL_TAG_BLUR_IMAGE.html +2 -0
  493. package/docs/variables/Util.PANO_TAG_DEFAULT_LINK_ICON.html +2 -0
  494. package/docs/variables/Util.animeMap.html +1 -1
  495. package/docs/variables/defaultGlobalConfig.html +1 -1
  496. package/docs/variables/itemLabelPluginServerParams.html +1 -1
  497. package/docs/variables/modelItemLabelPluginServerParams.html +1 -1
  498. package/docs/variables/modelRoomLabelPluginServerParams.html +1 -1
  499. package/libs/AreaMakerPlugin/Controller.js +1 -1
  500. package/libs/AreaMakerPlugin/index.js +1 -1
  501. package/libs/CSS3DRenderPlugin/Controller.d.ts +0 -4
  502. package/libs/CSS3DRenderPlugin/Controller.js +29 -35
  503. package/libs/CSS3DRenderPlugin/index.js +1 -1
  504. package/libs/CruisePlugin/BaseController.js +1 -1
  505. package/libs/CruisePlugin/Move.js +5 -3
  506. package/libs/CruisePlugin/Work.js +5 -3
  507. package/libs/CruisePlugin/index.js +9 -7
  508. package/libs/CurrentPanoImagePlugin/Controller.d.ts +1 -2
  509. package/libs/CurrentPanoImagePlugin/Controller.js +24 -24
  510. package/libs/CurrentPanoImagePlugin/index.js +1 -1
  511. package/libs/GuideLinePlugin/Controller.d.ts +1 -0
  512. package/libs/GuideLinePlugin/Controller.js +106 -83
  513. package/libs/GuideLinePlugin/GuideLineItem.js +5 -3
  514. package/libs/GuideLinePlugin/GuideLineModeItem/index.js +20 -19
  515. package/libs/GuideLinePlugin/GuideLineModeItem.js +1 -1
  516. package/libs/GuideLinePlugin/index.js +9 -7
  517. package/libs/MeasurePlugin/Controller.d.ts +26 -3
  518. package/libs/MeasurePlugin/Controller.js +397 -316
  519. package/libs/MeasurePlugin/index.d.ts +7 -1
  520. package/libs/ModelChassisCompassPlugin/Plugin.js +116 -52
  521. package/libs/ModelChassisCompassPlugin/index.js +64 -0
  522. package/libs/ModelEntryDoorGuidePlugin/Plugin.js +125 -61
  523. package/libs/ModelEntryDoorGuidePlugin/index.js +64 -0
  524. package/libs/ModelMakerPlugin/Controller.js +1 -1
  525. package/libs/ModelMakerPlugin/index.js +1 -1
  526. package/libs/ModelRoomLabelPlugin/RoomLabelItem.js +69 -69
  527. package/libs/ModelTVVideoPlugin/Plugin.js +1 -1
  528. package/libs/ModelTVVideoPlugin/index.js +1 -1
  529. package/libs/ModelViewPlugin/Plugin.d.ts +2 -1
  530. package/libs/ModelViewPlugin/Plugin.js +37 -36
  531. package/libs/Object3DHelperPlugin/Controller.js +1 -1
  532. package/libs/Object3DHelperPlugin/index.js +1 -1
  533. package/libs/PanoCompassPlugin/Controller.js +32 -32
  534. package/libs/PanoCompassPlugin/index.js +1 -1
  535. package/libs/PanoDoorLabelPlugin/Controller.js +1 -1
  536. package/libs/PanoDoorLabelPlugin/index.js +1 -1
  537. package/libs/PanoMeasurePlugin/Controller/WatchController.js +10 -10
  538. package/libs/PanoMeasurePlugin/Controller/index.js +1 -1
  539. package/libs/PanoMeasurePlugin/index.js +1 -1
  540. package/libs/PanoSpatialTagPlugin/Components/tag.js +115 -110
  541. package/libs/PanoSpatialTagPlugin/Plugin.js +89 -88
  542. package/libs/PanoSpatialTagPlugin/index.js +1 -1
  543. package/libs/PanoTagPlugin/Components/Common/TagPopover/TagPopoverToolBar.js +17 -14
  544. package/libs/PanoTagPlugin/Components/Tag/index.js +3 -2
  545. package/libs/PanoTagPlugin/Components/TagContainer.js +3 -2
  546. package/libs/PanoTagPlugin/Components/TagItem.js +3 -2
  547. package/libs/PanoTagPlugin/controller/Tag/BaseTag.js +3 -2
  548. package/libs/PanoTagPlugin/controller/Tag/ModelTag.js +3 -2
  549. package/libs/PanoTagPlugin/controller/Tag/PlaneTag.js +28 -27
  550. package/libs/PanoTagPlugin/controller/Tag/PointTag.js +3 -2
  551. package/libs/PanoTagPlugin/controller/TagRender.js +1 -1
  552. package/libs/PanoTagPlugin/controller/TagUtil.js +1 -1
  553. package/libs/PanoTagPlugin/controller/index.js +7 -9
  554. package/libs/PanoTagPlugin/index.js +22 -22
  555. package/libs/PanoTagPlugin/typings/controller.d.ts +3 -0
  556. package/libs/PanoTagPlugin/utils/tag/format.js +78 -13
  557. package/libs/PanoVideoPlugin/Controller.js +1 -1
  558. package/libs/PanoVideoPlugin/index.js +1 -1
  559. package/libs/PipelinePlugin/Controller.js +1 -1
  560. package/libs/PipelinePlugin/index.js +1 -1
  561. package/libs/Sculpt/Meshes/Line.js +10 -10
  562. package/libs/Sculpt/Meshes/Prism.js +94 -92
  563. package/libs/Sculpt/typings/style.d.ts +5 -0
  564. package/libs/Sculpt/utils/unit.d.ts +1 -1
  565. package/libs/Sculpt/utils/unit.js +18 -18
  566. package/libs/base/BasePlugin.d.ts +0 -4
  567. package/libs/base/BasePlugin.js +14 -20
  568. package/libs/components/AreaLabel/LabelItem.js +77 -77
  569. package/libs/floorplan/FloorplanGuidePlugin/Components/Camera.js +132 -0
  570. package/libs/floorplan/FloorplanGuidePlugin/Components/Camera.svelte.d.ts +1 -0
  571. package/libs/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/CurrentFloor.js +272 -0
  572. package/libs/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/CurrentFloor.svelte.d.ts +1 -0
  573. package/libs/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/ExtraObjects.js +94 -0
  574. package/libs/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/ExtraObjects.svelte.d.ts +1 -0
  575. package/libs/floorplan/FloorplanGuidePlugin/Components/Main.js +585 -0
  576. package/libs/floorplan/FloorplanGuidePlugin/Components/Main.svelte.d.ts +1 -0
  577. package/libs/floorplan/FloorplanGuidePlugin/Components/ObserverDots.js +142 -0
  578. package/libs/floorplan/FloorplanGuidePlugin/Components/ObserverDots.svelte.d.ts +1 -0
  579. package/libs/floorplan/FloorplanGuidePlugin/Components/RoomLabelItem.js +261 -0
  580. package/libs/floorplan/FloorplanGuidePlugin/Components/RoomLabelItem.svelte.d.ts +1 -0
  581. package/libs/floorplan/FloorplanGuidePlugin/Components/RoomLabels.js +290 -0
  582. package/libs/floorplan/FloorplanGuidePlugin/Components/RoomLabels.svelte.d.ts +1 -0
  583. package/libs/floorplan/FloorplanGuidePlugin/Controller.d.ts +46 -0
  584. package/libs/floorplan/FloorplanGuidePlugin/Controller.js +306 -0
  585. package/libs/floorplan/FloorplanGuidePlugin/index.d.ts +7 -0
  586. package/libs/floorplan/FloorplanGuidePlugin/index.js +99 -0
  587. package/libs/floorplan/FloorplanGuidePlugin/typing.d.ts +146 -0
  588. package/libs/floorplan/MapviewFloorplanPlugin/Controller.js +23 -21
  589. package/libs/floorplan/MapviewFloorplanPlugin/index.js +6 -4
  590. package/libs/floorplan/ModelFloorplanPlugin/Controller.js +42 -40
  591. package/libs/floorplan/ModelFloorplanPlugin/index.js +6 -4
  592. package/libs/floorplan/PanoFloorplanRadarPlugin/Controller.js +44 -42
  593. package/libs/floorplan/PanoFloorplanRadarPlugin/index.js +6 -4
  594. package/libs/floorplan/PanoFloorplanRadarPlugin/typing.d.ts +2 -0
  595. package/libs/floorplan/TopviewFloorplanPlugin/Controller.js +17 -15
  596. package/libs/floorplan/TopviewFloorplanPlugin/index.js +6 -4
  597. package/libs/floorplan/index.d.ts +1 -0
  598. package/libs/floorplan/typings/index.d.ts +2 -0
  599. package/libs/index.js +159 -147
  600. package/libs/shared-utils/exports.js +81 -69
  601. package/libs/shared-utils/index.d.ts +2 -1
  602. package/libs/shared-utils/logger.js +1 -1
  603. package/libs/shared-utils/three/Magnifier.d.ts +2 -0
  604. package/libs/shared-utils/three/Magnifier.js +17 -15
  605. package/libs/shared-utils/three/PointSelector/index.d.ts +5 -0
  606. package/libs/shared-utils/three/PointSelector/index.js +38 -37
  607. package/libs/shared-utils/three/PointSelector/utils/PointSelectorHelper.d.ts +1 -0
  608. package/libs/shared-utils/three/PointSelector/utils/PointSelectorHelper.js +41 -31
  609. package/libs/shared-utils/url/absoluteUrl.js +3 -7
  610. package/libs/shared-utils/url/defaultUrls.d.ts +30 -0
  611. package/libs/shared-utils/url/defaultUrls.js +26 -0
  612. package/libs/shared-utils/url/replace-static-prefix.d.ts +11 -0
  613. package/libs/shared-utils/url/replace-static-prefix.js +25 -0
  614. package/package.json +1 -1
  615. package/docs/functions/Util.absoluteUrl.html +0 -2
  616. package/docs/functions/Util.isAbsoluteURL.html +0 -1
  617. package/libs/DigitalHumanPlugin/index.d.ts +0 -67
  618. package/libs/DigitalHumanPlugin/index.js +0 -318
  619. package/libs/DigitalHumanPlugin/stateMachine.d.ts +0 -142
  620. package/libs/DigitalHumanPlugin/stateMachine.js +0 -153
  621. package/libs/DigitalPerformancePlugin/controller/index.d.ts +0 -224
  622. package/libs/DigitalPerformancePlugin/controller/index.js +0 -865
  623. package/libs/DigitalPerformancePlugin/core/DigitalHuman.d.ts +0 -41
  624. package/libs/DigitalPerformancePlugin/core/DigitalHuman.js +0 -174
  625. package/libs/DigitalPerformancePlugin/core/DigitalPlayground.d.ts +0 -33
  626. package/libs/DigitalPerformancePlugin/core/DigitalPlayground.js +0 -149
  627. package/libs/DigitalPerformancePlugin/core/DigitalStateMachine.d.ts +0 -142
  628. package/libs/DigitalPerformancePlugin/core/DigitalStateMachine.js +0 -153
  629. package/libs/DigitalPerformancePlugin/core/Trace.d.ts +0 -9
  630. package/libs/DigitalPerformancePlugin/core/Trace.js +0 -23
  631. package/libs/DigitalPerformancePlugin/index.d.ts +0 -11
  632. package/libs/DigitalPerformancePlugin/index.js +0 -17
  633. package/libs/DigitalPerformancePlugin/mock.d.ts +0 -70
  634. package/libs/DigitalPerformancePlugin/mock.js +0 -273
  635. package/libs/DigitalPerformancePlugin/typings/index.d.ts +0 -79
  636. /package/libs/{DigitalPerformancePlugin/typings/index.js → floorplan/FloorplanGuidePlugin/typing.js} +0 -0
@@ -1,462 +1,893 @@
1
- var z = Object.defineProperty;
2
- var Z = (t, i, e) => i in t ? z(t, i, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[i] = e;
3
- var C = (t, i, e) => (Z(t, typeof i != "symbol" ? i + "" : i, e), e);
4
- function m() {
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => {
4
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ return value;
6
+ };
7
+ function noop() {
5
8
  }
6
- const B = () => Promise.resolve(), k = {
9
+ const promise = () => Promise.resolve();
10
+ const state = {
7
11
  __queue: Promise.resolve()
8
12
  };
9
- function G(t = B) {
10
- k.__queue = k.__queue.then(t).catch(B);
13
+ function queue(promiseCallback = promise) {
14
+ state.__queue = state.__queue.then(promiseCallback).catch(promise);
11
15
  }
12
- function T(t, i, e) {
13
- const n = t.x, s = t.y, r = Math.floor(n / i * 1e4) / 1e4, a = Math.floor(s / e * 1e4) / 1e4;
14
- return { x: r, y: a };
16
+ function transformCoords(coords, cw, ch) {
17
+ const _x = coords.x;
18
+ const _y = coords.y;
19
+ const x = Math.floor(_x / cw * 1e4) / 1e4;
20
+ const y = Math.floor(_y / ch * 1e4) / 1e4;
21
+ return { x, y };
15
22
  }
16
- function L(t, i, e) {
17
- const { x: n, y: s } = t, r = n * i, a = s * e;
18
- return { x: r, y: a };
23
+ function unTransformCoords(coords, cw, ch) {
24
+ const { x: _x, y: _y } = coords;
25
+ const x = _x * cw;
26
+ const y = _y * ch;
27
+ return { x, y };
19
28
  }
20
- function j(t) {
21
- if (t.length < 2)
29
+ function getQuadraticCurvePoint(points) {
30
+ if (points.length < 2)
22
31
  return {};
23
- const i = t.slice(-2), e = i[0], n = {
24
- x: (i[0].x + i[1].x) / 2,
25
- y: (i[0].y + i[1].y) / 2
32
+ const lastTwo = points.slice(-2);
33
+ const control = lastTwo[0];
34
+ const end = {
35
+ x: (lastTwo[0].x + lastTwo[1].x) / 2,
36
+ y: (lastTwo[0].y + lastTwo[1].y) / 2
26
37
  };
27
- return { control: e, end: n };
38
+ return { control, end };
28
39
  }
29
- function U(t, i, e = m) {
30
- new Promise((n) => {
40
+ function execInterval(i, time, callback = noop) {
41
+ new Promise((resolve) => {
31
42
  setTimeout(() => {
32
- e(), n(!0);
33
- }, i * t);
43
+ callback();
44
+ resolve(true);
45
+ }, time * i);
34
46
  });
35
47
  }
36
- const W = window, R = window.requestAnimationFrame || W.webkitRequestAnimationFrame || ((t) => setTimeout(t, 16));
37
- function P(t, i = 0) {
38
- i <= 0 ? R(t) : R(() => P(t, i - 1));
48
+ const _window = window;
49
+ const _requestAnimationFrame = window.requestAnimationFrame || _window.webkitRequestAnimationFrame || ((fn) => setTimeout(fn, 16));
50
+ function nextFrame(fn, delay = 0) {
51
+ if (delay <= 0)
52
+ _requestAnimationFrame(fn);
53
+ else
54
+ _requestAnimationFrame(() => nextFrame(fn, delay - 1));
39
55
  }
40
- var b = Object.freeze({
56
+ var Easing = Object.freeze({
41
57
  Linear: Object.freeze({
42
- None: function(t) {
43
- return t;
58
+ None: function(amount) {
59
+ return amount;
44
60
  },
45
- In: function(t) {
46
- return t;
61
+ In: function(amount) {
62
+ return amount;
47
63
  },
48
- Out: function(t) {
49
- return t;
64
+ Out: function(amount) {
65
+ return amount;
50
66
  },
51
- InOut: function(t) {
52
- return t;
67
+ InOut: function(amount) {
68
+ return amount;
53
69
  }
54
70
  }),
55
71
  Quadratic: Object.freeze({
56
- In: function(t) {
57
- return t * t;
72
+ In: function(amount) {
73
+ return amount * amount;
58
74
  },
59
- Out: function(t) {
60
- return t * (2 - t);
75
+ Out: function(amount) {
76
+ return amount * (2 - amount);
61
77
  },
62
- InOut: function(t) {
63
- return (t *= 2) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1);
78
+ InOut: function(amount) {
79
+ if ((amount *= 2) < 1) {
80
+ return 0.5 * amount * amount;
81
+ }
82
+ return -0.5 * (--amount * (amount - 2) - 1);
64
83
  }
65
84
  }),
66
85
  Cubic: Object.freeze({
67
- In: function(t) {
68
- return t * t * t;
86
+ In: function(amount) {
87
+ return amount * amount * amount;
69
88
  },
70
- Out: function(t) {
71
- return --t * t * t + 1;
89
+ Out: function(amount) {
90
+ return --amount * amount * amount + 1;
72
91
  },
73
- InOut: function(t) {
74
- return (t *= 2) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2);
92
+ InOut: function(amount) {
93
+ if ((amount *= 2) < 1) {
94
+ return 0.5 * amount * amount * amount;
95
+ }
96
+ return 0.5 * ((amount -= 2) * amount * amount + 2);
75
97
  }
76
98
  }),
77
99
  Quartic: Object.freeze({
78
- In: function(t) {
79
- return t * t * t * t;
100
+ In: function(amount) {
101
+ return amount * amount * amount * amount;
80
102
  },
81
- Out: function(t) {
82
- return 1 - --t * t * t * t;
103
+ Out: function(amount) {
104
+ return 1 - --amount * amount * amount * amount;
83
105
  },
84
- InOut: function(t) {
85
- return (t *= 2) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2);
106
+ InOut: function(amount) {
107
+ if ((amount *= 2) < 1) {
108
+ return 0.5 * amount * amount * amount * amount;
109
+ }
110
+ return -0.5 * ((amount -= 2) * amount * amount * amount - 2);
86
111
  }
87
112
  }),
88
113
  Quintic: Object.freeze({
89
- In: function(t) {
90
- return t * t * t * t * t;
114
+ In: function(amount) {
115
+ return amount * amount * amount * amount * amount;
91
116
  },
92
- Out: function(t) {
93
- return --t * t * t * t * t + 1;
117
+ Out: function(amount) {
118
+ return --amount * amount * amount * amount * amount + 1;
94
119
  },
95
- InOut: function(t) {
96
- return (t *= 2) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2);
120
+ InOut: function(amount) {
121
+ if ((amount *= 2) < 1) {
122
+ return 0.5 * amount * amount * amount * amount * amount;
123
+ }
124
+ return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2);
97
125
  }
98
126
  }),
99
127
  Sinusoidal: Object.freeze({
100
- In: function(t) {
101
- return 1 - Math.sin((1 - t) * Math.PI / 2);
128
+ In: function(amount) {
129
+ return 1 - Math.sin((1 - amount) * Math.PI / 2);
102
130
  },
103
- Out: function(t) {
104
- return Math.sin(t * Math.PI / 2);
131
+ Out: function(amount) {
132
+ return Math.sin(amount * Math.PI / 2);
105
133
  },
106
- InOut: function(t) {
107
- return 0.5 * (1 - Math.sin(Math.PI * (0.5 - t)));
134
+ InOut: function(amount) {
135
+ return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount)));
108
136
  }
109
137
  }),
110
138
  Exponential: Object.freeze({
111
- In: function(t) {
112
- return t === 0 ? 0 : Math.pow(1024, t - 1);
139
+ In: function(amount) {
140
+ return amount === 0 ? 0 : Math.pow(1024, amount - 1);
113
141
  },
114
- Out: function(t) {
115
- return t === 1 ? 1 : 1 - Math.pow(2, -10 * t);
142
+ Out: function(amount) {
143
+ return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);
116
144
  },
117
- InOut: function(t) {
118
- return t === 0 ? 0 : t === 1 ? 1 : (t *= 2) < 1 ? 0.5 * Math.pow(1024, t - 1) : 0.5 * (-Math.pow(2, -10 * (t - 1)) + 2);
145
+ InOut: function(amount) {
146
+ if (amount === 0) {
147
+ return 0;
148
+ }
149
+ if (amount === 1) {
150
+ return 1;
151
+ }
152
+ if ((amount *= 2) < 1) {
153
+ return 0.5 * Math.pow(1024, amount - 1);
154
+ }
155
+ return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2);
119
156
  }
120
157
  }),
121
158
  Circular: Object.freeze({
122
- In: function(t) {
123
- return 1 - Math.sqrt(1 - t * t);
159
+ In: function(amount) {
160
+ return 1 - Math.sqrt(1 - amount * amount);
124
161
  },
125
- Out: function(t) {
126
- return Math.sqrt(1 - --t * t);
162
+ Out: function(amount) {
163
+ return Math.sqrt(1 - --amount * amount);
127
164
  },
128
- InOut: function(t) {
129
- return (t *= 2) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);
165
+ InOut: function(amount) {
166
+ if ((amount *= 2) < 1) {
167
+ return -0.5 * (Math.sqrt(1 - amount * amount) - 1);
168
+ }
169
+ return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);
130
170
  }
131
171
  }),
132
172
  Elastic: Object.freeze({
133
- In: function(t) {
134
- return t === 0 ? 0 : t === 1 ? 1 : -Math.pow(2, 10 * (t - 1)) * Math.sin((t - 1.1) * 5 * Math.PI);
173
+ In: function(amount) {
174
+ if (amount === 0) {
175
+ return 0;
176
+ }
177
+ if (amount === 1) {
178
+ return 1;
179
+ }
180
+ return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);
135
181
  },
136
- Out: function(t) {
137
- return t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t - 0.1) * 5 * Math.PI) + 1;
182
+ Out: function(amount) {
183
+ if (amount === 0) {
184
+ return 0;
185
+ }
186
+ if (amount === 1) {
187
+ return 1;
188
+ }
189
+ return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1;
138
190
  },
139
- InOut: function(t) {
140
- return t === 0 ? 0 : t === 1 ? 1 : (t *= 2, t < 1 ? -0.5 * Math.pow(2, 10 * (t - 1)) * Math.sin((t - 1.1) * 5 * Math.PI) : 0.5 * Math.pow(2, -10 * (t - 1)) * Math.sin((t - 1.1) * 5 * Math.PI) + 1);
191
+ InOut: function(amount) {
192
+ if (amount === 0) {
193
+ return 0;
194
+ }
195
+ if (amount === 1) {
196
+ return 1;
197
+ }
198
+ amount *= 2;
199
+ if (amount < 1) {
200
+ return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);
201
+ }
202
+ return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1;
141
203
  }
142
204
  }),
143
205
  Back: Object.freeze({
144
- In: function(t) {
145
- var i = 1.70158;
146
- return t === 1 ? 1 : t * t * ((i + 1) * t - i);
206
+ In: function(amount) {
207
+ var s = 1.70158;
208
+ return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);
147
209
  },
148
- Out: function(t) {
149
- var i = 1.70158;
150
- return t === 0 ? 0 : --t * t * ((i + 1) * t + i) + 1;
210
+ Out: function(amount) {
211
+ var s = 1.70158;
212
+ return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1;
151
213
  },
152
- InOut: function(t) {
153
- var i = 2.5949095;
154
- return (t *= 2) < 1 ? 0.5 * (t * t * ((i + 1) * t - i)) : 0.5 * ((t -= 2) * t * ((i + 1) * t + i) + 2);
214
+ InOut: function(amount) {
215
+ var s = 1.70158 * 1.525;
216
+ if ((amount *= 2) < 1) {
217
+ return 0.5 * (amount * amount * ((s + 1) * amount - s));
218
+ }
219
+ return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);
155
220
  }
156
221
  }),
157
222
  Bounce: Object.freeze({
158
- In: function(t) {
159
- return 1 - b.Bounce.Out(1 - t);
223
+ In: function(amount) {
224
+ return 1 - Easing.Bounce.Out(1 - amount);
160
225
  },
161
- Out: function(t) {
162
- return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + 0.75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375 : 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;
226
+ Out: function(amount) {
227
+ if (amount < 1 / 2.75) {
228
+ return 7.5625 * amount * amount;
229
+ } else if (amount < 2 / 2.75) {
230
+ return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75;
231
+ } else if (amount < 2.5 / 2.75) {
232
+ return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375;
233
+ } else {
234
+ return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375;
235
+ }
163
236
  },
164
- InOut: function(t) {
165
- return t < 0.5 ? b.Bounce.In(t * 2) * 0.5 : b.Bounce.Out(t * 2 - 1) * 0.5 + 0.5;
237
+ InOut: function(amount) {
238
+ if (amount < 0.5) {
239
+ return Easing.Bounce.In(amount * 2) * 0.5;
240
+ }
241
+ return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5;
166
242
  }
167
243
  }),
168
- generatePow: function(t) {
169
- return t === void 0 && (t = 4), t = t < Number.EPSILON ? Number.EPSILON : t, t = t > 1e4 ? 1e4 : t, {
170
- In: function(i) {
171
- return Math.pow(i, t);
244
+ generatePow: function(power) {
245
+ if (power === void 0) {
246
+ power = 4;
247
+ }
248
+ power = power < Number.EPSILON ? Number.EPSILON : power;
249
+ power = power > 1e4 ? 1e4 : power;
250
+ return {
251
+ In: function(amount) {
252
+ return Math.pow(amount, power);
172
253
  },
173
- Out: function(i) {
174
- return 1 - Math.pow(1 - i, t);
254
+ Out: function(amount) {
255
+ return 1 - Math.pow(1 - amount, power);
175
256
  },
176
- InOut: function(i) {
177
- return i < 0.5 ? Math.pow(i * 2, t) / 2 : (1 - Math.pow(2 - i * 2, t)) / 2 + 0.5;
257
+ InOut: function(amount) {
258
+ if (amount < 0.5) {
259
+ return Math.pow(amount * 2, power) / 2;
260
+ }
261
+ return (1 - Math.pow(2 - amount * 2, power)) / 2 + 0.5;
178
262
  }
179
263
  };
180
264
  }
181
- }), N = function() {
265
+ });
266
+ var now = function() {
182
267
  return performance.now();
183
- }, Y = (
268
+ };
269
+ var Group = (
184
270
  /** @class */
185
271
  function() {
186
- function t() {
187
- this._tweens = {}, this._tweensAddedDuringUpdate = {};
272
+ function Group2() {
273
+ this._tweens = {};
274
+ this._tweensAddedDuringUpdate = {};
188
275
  }
189
- return t.prototype.getAll = function() {
190
- var i = this;
191
- return Object.keys(this._tweens).map(function(e) {
192
- return i._tweens[e];
276
+ Group2.prototype.getAll = function() {
277
+ var _this = this;
278
+ return Object.keys(this._tweens).map(function(tweenId) {
279
+ return _this._tweens[tweenId];
193
280
  });
194
- }, t.prototype.removeAll = function() {
281
+ };
282
+ Group2.prototype.removeAll = function() {
195
283
  this._tweens = {};
196
- }, t.prototype.add = function(i) {
197
- this._tweens[i.getId()] = i, this._tweensAddedDuringUpdate[i.getId()] = i;
198
- }, t.prototype.remove = function(i) {
199
- delete this._tweens[i.getId()], delete this._tweensAddedDuringUpdate[i.getId()];
200
- }, t.prototype.update = function(i, e) {
201
- i === void 0 && (i = N()), e === void 0 && (e = !1);
202
- var n = Object.keys(this._tweens);
203
- if (n.length === 0)
204
- return !1;
205
- for (; n.length > 0; ) {
284
+ };
285
+ Group2.prototype.add = function(tween2) {
286
+ this._tweens[tween2.getId()] = tween2;
287
+ this._tweensAddedDuringUpdate[tween2.getId()] = tween2;
288
+ };
289
+ Group2.prototype.remove = function(tween2) {
290
+ delete this._tweens[tween2.getId()];
291
+ delete this._tweensAddedDuringUpdate[tween2.getId()];
292
+ };
293
+ Group2.prototype.update = function(time, preserve) {
294
+ if (time === void 0) {
295
+ time = now();
296
+ }
297
+ if (preserve === void 0) {
298
+ preserve = false;
299
+ }
300
+ var tweenIds = Object.keys(this._tweens);
301
+ if (tweenIds.length === 0) {
302
+ return false;
303
+ }
304
+ while (tweenIds.length > 0) {
206
305
  this._tweensAddedDuringUpdate = {};
207
- for (var s = 0; s < n.length; s++) {
208
- var r = this._tweens[n[s]], a = !e;
209
- r && r.update(i, a) === !1 && !e && delete this._tweens[n[s]];
306
+ for (var i = 0; i < tweenIds.length; i++) {
307
+ var tween2 = this._tweens[tweenIds[i]];
308
+ var autoStart = !preserve;
309
+ if (tween2 && tween2.update(time, autoStart) === false && !preserve) {
310
+ delete this._tweens[tweenIds[i]];
311
+ }
210
312
  }
211
- n = Object.keys(this._tweensAddedDuringUpdate);
313
+ tweenIds = Object.keys(this._tweensAddedDuringUpdate);
212
314
  }
213
- return !0;
214
- }, t;
315
+ return true;
316
+ };
317
+ return Group2;
215
318
  }()
216
- ), w = {
217
- Linear: function(t, i) {
218
- var e = t.length - 1, n = e * i, s = Math.floor(n), r = w.Utils.Linear;
219
- return i < 0 ? r(t[0], t[1], n) : i > 1 ? r(t[e], t[e - 1], e - n) : r(t[s], t[s + 1 > e ? e : s + 1], n - s);
319
+ );
320
+ var Interpolation = {
321
+ Linear: function(v, k) {
322
+ var m = v.length - 1;
323
+ var f = m * k;
324
+ var i = Math.floor(f);
325
+ var fn = Interpolation.Utils.Linear;
326
+ if (k < 0) {
327
+ return fn(v[0], v[1], f);
328
+ }
329
+ if (k > 1) {
330
+ return fn(v[m], v[m - 1], m - f);
331
+ }
332
+ return fn(v[i], v[i + 1 > m ? m : i + 1], f - i);
220
333
  },
221
- Bezier: function(t, i) {
222
- for (var e = 0, n = t.length - 1, s = Math.pow, r = w.Utils.Bernstein, a = 0; a <= n; a++)
223
- e += s(1 - i, n - a) * s(i, a) * t[a] * r(n, a);
224
- return e;
334
+ Bezier: function(v, k) {
335
+ var b = 0;
336
+ var n = v.length - 1;
337
+ var pw = Math.pow;
338
+ var bn = Interpolation.Utils.Bernstein;
339
+ for (var i = 0; i <= n; i++) {
340
+ b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i);
341
+ }
342
+ return b;
225
343
  },
226
- CatmullRom: function(t, i) {
227
- var e = t.length - 1, n = e * i, s = Math.floor(n), r = w.Utils.CatmullRom;
228
- return t[0] === t[e] ? (i < 0 && (s = Math.floor(n = e * (1 + i))), r(t[(s - 1 + e) % e], t[s], t[(s + 1) % e], t[(s + 2) % e], n - s)) : i < 0 ? t[0] - (r(t[0], t[0], t[1], t[1], -n) - t[0]) : i > 1 ? t[e] - (r(t[e], t[e], t[e - 1], t[e - 1], n - e) - t[e]) : r(t[s ? s - 1 : 0], t[s], t[e < s + 1 ? e : s + 1], t[e < s + 2 ? e : s + 2], n - s);
344
+ CatmullRom: function(v, k) {
345
+ var m = v.length - 1;
346
+ var f = m * k;
347
+ var i = Math.floor(f);
348
+ var fn = Interpolation.Utils.CatmullRom;
349
+ if (v[0] === v[m]) {
350
+ if (k < 0) {
351
+ i = Math.floor(f = m * (1 + k));
352
+ }
353
+ return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i);
354
+ } else {
355
+ if (k < 0) {
356
+ return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]);
357
+ }
358
+ if (k > 1) {
359
+ return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]);
360
+ }
361
+ return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i);
362
+ }
229
363
  },
230
364
  Utils: {
231
- Linear: function(t, i, e) {
232
- return (i - t) * e + t;
365
+ Linear: function(p0, p1, t) {
366
+ return (p1 - p0) * t + p0;
233
367
  },
234
- Bernstein: function(t, i) {
235
- var e = w.Utils.Factorial;
236
- return e(t) / e(i) / e(t - i);
368
+ Bernstein: function(n, i) {
369
+ var fc = Interpolation.Utils.Factorial;
370
+ return fc(n) / fc(i) / fc(n - i);
237
371
  },
238
372
  Factorial: function() {
239
- var t = [1];
240
- return function(i) {
241
- var e = 1;
242
- if (t[i])
243
- return t[i];
244
- for (var n = i; n > 1; n--)
245
- e *= n;
246
- return t[i] = e, e;
373
+ var a = [1];
374
+ return function(n) {
375
+ var s = 1;
376
+ if (a[n]) {
377
+ return a[n];
378
+ }
379
+ for (var i = n; i > 1; i--) {
380
+ s *= i;
381
+ }
382
+ a[n] = s;
383
+ return s;
247
384
  };
248
385
  }(),
249
- CatmullRom: function(t, i, e, n, s) {
250
- var r = (e - t) * 0.5, a = (n - i) * 0.5, o = s * s, c = s * o;
251
- return (2 * i - 2 * e + r + a) * c + (-3 * i + 3 * e - 2 * r - a) * o + r * s + i;
386
+ CatmullRom: function(p0, p1, p2, p3, t) {
387
+ var v0 = (p2 - p0) * 0.5;
388
+ var v1 = (p3 - p1) * 0.5;
389
+ var t2 = t * t;
390
+ var t3 = t * t2;
391
+ return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
252
392
  }
253
393
  }
254
- }, H = (
394
+ };
395
+ var Sequence = (
255
396
  /** @class */
256
397
  function() {
257
- function t() {
398
+ function Sequence2() {
258
399
  }
259
- return t.nextId = function() {
260
- return t._nextId++;
261
- }, t._nextId = 0, t;
400
+ Sequence2.nextId = function() {
401
+ return Sequence2._nextId++;
402
+ };
403
+ Sequence2._nextId = 0;
404
+ return Sequence2;
262
405
  }()
263
- ), E = new Y(), Q = (
406
+ );
407
+ var mainGroup = new Group();
408
+ var Tween = (
264
409
  /** @class */
265
410
  function() {
266
- function t(i, e) {
267
- e === void 0 && (e = E), this._object = i, this._group = e, this._isPaused = !1, this._pauseStart = 0, this._valuesStart = {}, this._valuesEnd = {}, this._valuesStartRepeat = {}, this._duration = 1e3, this._isDynamic = !1, this._initialRepeat = 0, this._repeat = 0, this._yoyo = !1, this._isPlaying = !1, this._reversed = !1, this._delayTime = 0, this._startTime = 0, this._easingFunction = b.Linear.None, this._interpolationFunction = w.Linear, this._chainedTweens = [], this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._id = H.nextId(), this._isChainStopped = !1, this._propertiesAreSetUp = !1, this._goToEnd = !1;
411
+ function Tween2(_object, _group) {
412
+ if (_group === void 0) {
413
+ _group = mainGroup;
414
+ }
415
+ this._object = _object;
416
+ this._group = _group;
417
+ this._isPaused = false;
418
+ this._pauseStart = 0;
419
+ this._valuesStart = {};
420
+ this._valuesEnd = {};
421
+ this._valuesStartRepeat = {};
422
+ this._duration = 1e3;
423
+ this._isDynamic = false;
424
+ this._initialRepeat = 0;
425
+ this._repeat = 0;
426
+ this._yoyo = false;
427
+ this._isPlaying = false;
428
+ this._reversed = false;
429
+ this._delayTime = 0;
430
+ this._startTime = 0;
431
+ this._easingFunction = Easing.Linear.None;
432
+ this._interpolationFunction = Interpolation.Linear;
433
+ this._chainedTweens = [];
434
+ this._onStartCallbackFired = false;
435
+ this._onEveryStartCallbackFired = false;
436
+ this._id = Sequence.nextId();
437
+ this._isChainStopped = false;
438
+ this._propertiesAreSetUp = false;
439
+ this._goToEnd = false;
268
440
  }
269
- return t.prototype.getId = function() {
441
+ Tween2.prototype.getId = function() {
270
442
  return this._id;
271
- }, t.prototype.isPlaying = function() {
443
+ };
444
+ Tween2.prototype.isPlaying = function() {
272
445
  return this._isPlaying;
273
- }, t.prototype.isPaused = function() {
446
+ };
447
+ Tween2.prototype.isPaused = function() {
274
448
  return this._isPaused;
275
- }, t.prototype.getDuration = function() {
449
+ };
450
+ Tween2.prototype.getDuration = function() {
276
451
  return this._duration;
277
- }, t.prototype.to = function(i, e) {
278
- if (e === void 0 && (e = 1e3), this._isPlaying)
452
+ };
453
+ Tween2.prototype.to = function(target, duration) {
454
+ if (duration === void 0) {
455
+ duration = 1e3;
456
+ }
457
+ if (this._isPlaying)
279
458
  throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");
280
- return this._valuesEnd = i, this._propertiesAreSetUp = !1, this._duration = e < 0 ? 0 : e, this;
281
- }, t.prototype.duration = function(i) {
282
- return i === void 0 && (i = 1e3), this._duration = i < 0 ? 0 : i, this;
283
- }, t.prototype.dynamic = function(i) {
284
- return i === void 0 && (i = !1), this._isDynamic = i, this;
285
- }, t.prototype.start = function(i, e) {
286
- if (i === void 0 && (i = N()), e === void 0 && (e = !1), this._isPlaying)
459
+ this._valuesEnd = target;
460
+ this._propertiesAreSetUp = false;
461
+ this._duration = duration < 0 ? 0 : duration;
462
+ return this;
463
+ };
464
+ Tween2.prototype.duration = function(duration) {
465
+ if (duration === void 0) {
466
+ duration = 1e3;
467
+ }
468
+ this._duration = duration < 0 ? 0 : duration;
469
+ return this;
470
+ };
471
+ Tween2.prototype.dynamic = function(dynamic) {
472
+ if (dynamic === void 0) {
473
+ dynamic = false;
474
+ }
475
+ this._isDynamic = dynamic;
476
+ return this;
477
+ };
478
+ Tween2.prototype.start = function(time, overrideStartingValues) {
479
+ if (time === void 0) {
480
+ time = now();
481
+ }
482
+ if (overrideStartingValues === void 0) {
483
+ overrideStartingValues = false;
484
+ }
485
+ if (this._isPlaying) {
287
486
  return this;
288
- if (this._group && this._group.add(this), this._repeat = this._initialRepeat, this._reversed) {
289
- this._reversed = !1;
290
- for (var n in this._valuesStartRepeat)
291
- this._swapEndStartRepeatValues(n), this._valuesStart[n] = this._valuesStartRepeat[n];
292
- }
293
- if (this._isPlaying = !0, this._isPaused = !1, this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._isChainStopped = !1, this._startTime = i, this._startTime += this._delayTime, !this._propertiesAreSetUp || e) {
294
- if (this._propertiesAreSetUp = !0, !this._isDynamic) {
295
- var s = {};
296
- for (var r in this._valuesEnd)
297
- s[r] = this._valuesEnd[r];
298
- this._valuesEnd = s;
487
+ }
488
+ this._group && this._group.add(this);
489
+ this._repeat = this._initialRepeat;
490
+ if (this._reversed) {
491
+ this._reversed = false;
492
+ for (var property in this._valuesStartRepeat) {
493
+ this._swapEndStartRepeatValues(property);
494
+ this._valuesStart[property] = this._valuesStartRepeat[property];
299
495
  }
300
- this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, e);
496
+ }
497
+ this._isPlaying = true;
498
+ this._isPaused = false;
499
+ this._onStartCallbackFired = false;
500
+ this._onEveryStartCallbackFired = false;
501
+ this._isChainStopped = false;
502
+ this._startTime = time;
503
+ this._startTime += this._delayTime;
504
+ if (!this._propertiesAreSetUp || overrideStartingValues) {
505
+ this._propertiesAreSetUp = true;
506
+ if (!this._isDynamic) {
507
+ var tmp = {};
508
+ for (var prop in this._valuesEnd)
509
+ tmp[prop] = this._valuesEnd[prop];
510
+ this._valuesEnd = tmp;
511
+ }
512
+ this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues);
301
513
  }
302
514
  return this;
303
- }, t.prototype.startFromCurrentValues = function(i) {
304
- return this.start(i, !0);
305
- }, t.prototype._setupProperties = function(i, e, n, s, r) {
306
- for (var a in n) {
307
- var o = i[a], c = Array.isArray(o), d = c ? "array" : typeof o, I = !c && Array.isArray(n[a]);
308
- if (!(d === "undefined" || d === "function")) {
309
- if (I) {
310
- var u = n[a];
311
- if (u.length === 0)
312
- continue;
313
- for (var l = [o], h = 0, g = u.length; h < g; h += 1) {
314
- var f = this._handleRelativeValue(o, u[h]);
315
- if (isNaN(f)) {
316
- I = !1, console.warn("Found invalid interpolation list. Skipping.");
317
- break;
318
- }
319
- l.push(f);
320
- }
321
- I && (n[a] = l);
515
+ };
516
+ Tween2.prototype.startFromCurrentValues = function(time) {
517
+ return this.start(time, true);
518
+ };
519
+ Tween2.prototype._setupProperties = function(_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) {
520
+ for (var property in _valuesEnd) {
521
+ var startValue = _object[property];
522
+ var startValueIsArray = Array.isArray(startValue);
523
+ var propType = startValueIsArray ? "array" : typeof startValue;
524
+ var isInterpolationList = !startValueIsArray && Array.isArray(_valuesEnd[property]);
525
+ if (propType === "undefined" || propType === "function") {
526
+ continue;
527
+ }
528
+ if (isInterpolationList) {
529
+ var endValues = _valuesEnd[property];
530
+ if (endValues.length === 0) {
531
+ continue;
322
532
  }
323
- if ((d === "object" || c) && o && !I) {
324
- e[a] = c ? [] : {};
325
- var p = o;
326
- for (var A in p)
327
- e[a][A] = p[A];
328
- s[a] = c ? [] : {};
329
- var u = n[a];
330
- if (!this._isDynamic) {
331
- var v = {};
332
- for (var A in u)
333
- v[A] = u[A];
334
- n[a] = u = v;
533
+ var temp = [startValue];
534
+ for (var i = 0, l = endValues.length; i < l; i += 1) {
535
+ var value = this._handleRelativeValue(startValue, endValues[i]);
536
+ if (isNaN(value)) {
537
+ isInterpolationList = false;
538
+ console.warn("Found invalid interpolation list. Skipping.");
539
+ break;
335
540
  }
336
- this._setupProperties(p, e[a], u, s[a], r);
337
- } else
338
- (typeof e[a] == "undefined" || r) && (e[a] = o), c || (e[a] *= 1), I ? s[a] = n[a].slice().reverse() : s[a] = e[a] || 0;
541
+ temp.push(value);
542
+ }
543
+ if (isInterpolationList) {
544
+ _valuesEnd[property] = temp;
545
+ }
339
546
  }
547
+ if ((propType === "object" || startValueIsArray) && startValue && !isInterpolationList) {
548
+ _valuesStart[property] = startValueIsArray ? [] : {};
549
+ var nestedObject = startValue;
550
+ for (var prop in nestedObject) {
551
+ _valuesStart[property][prop] = nestedObject[prop];
552
+ }
553
+ _valuesStartRepeat[property] = startValueIsArray ? [] : {};
554
+ var endValues = _valuesEnd[property];
555
+ if (!this._isDynamic) {
556
+ var tmp = {};
557
+ for (var prop in endValues)
558
+ tmp[prop] = endValues[prop];
559
+ _valuesEnd[property] = endValues = tmp;
560
+ }
561
+ this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues);
562
+ } else {
563
+ if (typeof _valuesStart[property] === "undefined" || overrideStartingValues) {
564
+ _valuesStart[property] = startValue;
565
+ }
566
+ if (!startValueIsArray) {
567
+ _valuesStart[property] *= 1;
568
+ }
569
+ if (isInterpolationList) {
570
+ _valuesStartRepeat[property] = _valuesEnd[property].slice().reverse();
571
+ } else {
572
+ _valuesStartRepeat[property] = _valuesStart[property] || 0;
573
+ }
574
+ }
575
+ }
576
+ };
577
+ Tween2.prototype.stop = function() {
578
+ if (!this._isChainStopped) {
579
+ this._isChainStopped = true;
580
+ this.stopChainedTweens();
581
+ }
582
+ if (!this._isPlaying) {
583
+ return this;
584
+ }
585
+ this._group && this._group.remove(this);
586
+ this._isPlaying = false;
587
+ this._isPaused = false;
588
+ if (this._onStopCallback) {
589
+ this._onStopCallback(this._object);
340
590
  }
341
- }, t.prototype.stop = function() {
342
- return this._isChainStopped || (this._isChainStopped = !0, this.stopChainedTweens()), this._isPlaying ? (this._group && this._group.remove(this), this._isPlaying = !1, this._isPaused = !1, this._onStopCallback && this._onStopCallback(this._object), this) : this;
343
- }, t.prototype.end = function() {
344
- return this._goToEnd = !0, this.update(1 / 0), this;
345
- }, t.prototype.pause = function(i) {
346
- return i === void 0 && (i = N()), this._isPaused || !this._isPlaying ? this : (this._isPaused = !0, this._pauseStart = i, this._group && this._group.remove(this), this);
347
- }, t.prototype.resume = function(i) {
348
- return i === void 0 && (i = N()), !this._isPaused || !this._isPlaying ? this : (this._isPaused = !1, this._startTime += i - this._pauseStart, this._pauseStart = 0, this._group && this._group.add(this), this);
349
- }, t.prototype.stopChainedTweens = function() {
350
- for (var i = 0, e = this._chainedTweens.length; i < e; i++)
591
+ return this;
592
+ };
593
+ Tween2.prototype.end = function() {
594
+ this._goToEnd = true;
595
+ this.update(Infinity);
596
+ return this;
597
+ };
598
+ Tween2.prototype.pause = function(time) {
599
+ if (time === void 0) {
600
+ time = now();
601
+ }
602
+ if (this._isPaused || !this._isPlaying) {
603
+ return this;
604
+ }
605
+ this._isPaused = true;
606
+ this._pauseStart = time;
607
+ this._group && this._group.remove(this);
608
+ return this;
609
+ };
610
+ Tween2.prototype.resume = function(time) {
611
+ if (time === void 0) {
612
+ time = now();
613
+ }
614
+ if (!this._isPaused || !this._isPlaying) {
615
+ return this;
616
+ }
617
+ this._isPaused = false;
618
+ this._startTime += time - this._pauseStart;
619
+ this._pauseStart = 0;
620
+ this._group && this._group.add(this);
621
+ return this;
622
+ };
623
+ Tween2.prototype.stopChainedTweens = function() {
624
+ for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {
351
625
  this._chainedTweens[i].stop();
626
+ }
627
+ return this;
628
+ };
629
+ Tween2.prototype.group = function(group) {
630
+ if (group === void 0) {
631
+ group = mainGroup;
632
+ }
633
+ this._group = group;
634
+ return this;
635
+ };
636
+ Tween2.prototype.delay = function(amount) {
637
+ if (amount === void 0) {
638
+ amount = 0;
639
+ }
640
+ this._delayTime = amount;
641
+ return this;
642
+ };
643
+ Tween2.prototype.repeat = function(times) {
644
+ if (times === void 0) {
645
+ times = 0;
646
+ }
647
+ this._initialRepeat = times;
648
+ this._repeat = times;
352
649
  return this;
353
- }, t.prototype.group = function(i) {
354
- return i === void 0 && (i = E), this._group = i, this;
355
- }, t.prototype.delay = function(i) {
356
- return i === void 0 && (i = 0), this._delayTime = i, this;
357
- }, t.prototype.repeat = function(i) {
358
- return i === void 0 && (i = 0), this._initialRepeat = i, this._repeat = i, this;
359
- }, t.prototype.repeatDelay = function(i) {
360
- return this._repeatDelayTime = i, this;
361
- }, t.prototype.yoyo = function(i) {
362
- return i === void 0 && (i = !1), this._yoyo = i, this;
363
- }, t.prototype.easing = function(i) {
364
- return i === void 0 && (i = b.Linear.None), this._easingFunction = i, this;
365
- }, t.prototype.interpolation = function(i) {
366
- return i === void 0 && (i = w.Linear), this._interpolationFunction = i, this;
367
- }, t.prototype.chain = function() {
368
- for (var i = [], e = 0; e < arguments.length; e++)
369
- i[e] = arguments[e];
370
- return this._chainedTweens = i, this;
371
- }, t.prototype.onStart = function(i) {
372
- return this._onStartCallback = i, this;
373
- }, t.prototype.onEveryStart = function(i) {
374
- return this._onEveryStartCallback = i, this;
375
- }, t.prototype.onUpdate = function(i) {
376
- return this._onUpdateCallback = i, this;
377
- }, t.prototype.onRepeat = function(i) {
378
- return this._onRepeatCallback = i, this;
379
- }, t.prototype.onComplete = function(i) {
380
- return this._onCompleteCallback = i, this;
381
- }, t.prototype.onStop = function(i) {
382
- return this._onStopCallback = i, this;
383
- }, t.prototype.update = function(i, e) {
384
- var n = this, s;
385
- if (i === void 0 && (i = N()), e === void 0 && (e = !0), this._isPaused)
386
- return !0;
387
- var r, a = this._startTime + this._duration;
650
+ };
651
+ Tween2.prototype.repeatDelay = function(amount) {
652
+ this._repeatDelayTime = amount;
653
+ return this;
654
+ };
655
+ Tween2.prototype.yoyo = function(yoyo) {
656
+ if (yoyo === void 0) {
657
+ yoyo = false;
658
+ }
659
+ this._yoyo = yoyo;
660
+ return this;
661
+ };
662
+ Tween2.prototype.easing = function(easingFunction) {
663
+ if (easingFunction === void 0) {
664
+ easingFunction = Easing.Linear.None;
665
+ }
666
+ this._easingFunction = easingFunction;
667
+ return this;
668
+ };
669
+ Tween2.prototype.interpolation = function(interpolationFunction) {
670
+ if (interpolationFunction === void 0) {
671
+ interpolationFunction = Interpolation.Linear;
672
+ }
673
+ this._interpolationFunction = interpolationFunction;
674
+ return this;
675
+ };
676
+ Tween2.prototype.chain = function() {
677
+ var tweens = [];
678
+ for (var _i = 0; _i < arguments.length; _i++) {
679
+ tweens[_i] = arguments[_i];
680
+ }
681
+ this._chainedTweens = tweens;
682
+ return this;
683
+ };
684
+ Tween2.prototype.onStart = function(callback) {
685
+ this._onStartCallback = callback;
686
+ return this;
687
+ };
688
+ Tween2.prototype.onEveryStart = function(callback) {
689
+ this._onEveryStartCallback = callback;
690
+ return this;
691
+ };
692
+ Tween2.prototype.onUpdate = function(callback) {
693
+ this._onUpdateCallback = callback;
694
+ return this;
695
+ };
696
+ Tween2.prototype.onRepeat = function(callback) {
697
+ this._onRepeatCallback = callback;
698
+ return this;
699
+ };
700
+ Tween2.prototype.onComplete = function(callback) {
701
+ this._onCompleteCallback = callback;
702
+ return this;
703
+ };
704
+ Tween2.prototype.onStop = function(callback) {
705
+ this._onStopCallback = callback;
706
+ return this;
707
+ };
708
+ Tween2.prototype.update = function(time, autoStart) {
709
+ var _this = this;
710
+ var _a;
711
+ if (time === void 0) {
712
+ time = now();
713
+ }
714
+ if (autoStart === void 0) {
715
+ autoStart = true;
716
+ }
717
+ if (this._isPaused)
718
+ return true;
719
+ var property;
720
+ var endTime = this._startTime + this._duration;
388
721
  if (!this._goToEnd && !this._isPlaying) {
389
- if (i > a)
390
- return !1;
391
- e && this.start(i, !0);
392
- }
393
- if (this._goToEnd = !1, i < this._startTime)
394
- return !0;
395
- this._onStartCallbackFired === !1 && (this._onStartCallback && this._onStartCallback(this._object), this._onStartCallbackFired = !0), this._onEveryStartCallbackFired === !1 && (this._onEveryStartCallback && this._onEveryStartCallback(this._object), this._onEveryStartCallbackFired = !0);
396
- var o = i - this._startTime, c = this._duration + ((s = this._repeatDelayTime) !== null && s !== void 0 ? s : this._delayTime), d = this._duration + this._repeat * c, I = function() {
397
- if (n._duration === 0 || o > d)
722
+ if (time > endTime)
723
+ return false;
724
+ if (autoStart)
725
+ this.start(time, true);
726
+ }
727
+ this._goToEnd = false;
728
+ if (time < this._startTime) {
729
+ return true;
730
+ }
731
+ if (this._onStartCallbackFired === false) {
732
+ if (this._onStartCallback) {
733
+ this._onStartCallback(this._object);
734
+ }
735
+ this._onStartCallbackFired = true;
736
+ }
737
+ if (this._onEveryStartCallbackFired === false) {
738
+ if (this._onEveryStartCallback) {
739
+ this._onEveryStartCallback(this._object);
740
+ }
741
+ this._onEveryStartCallbackFired = true;
742
+ }
743
+ var elapsedTime = time - this._startTime;
744
+ var durationAndDelay = this._duration + ((_a = this._repeatDelayTime) !== null && _a !== void 0 ? _a : this._delayTime);
745
+ var totalTime = this._duration + this._repeat * durationAndDelay;
746
+ var calculateElapsedPortion = function() {
747
+ if (_this._duration === 0)
398
748
  return 1;
399
- var p = Math.trunc(o / c), A = o - p * c, v = Math.min(A / n._duration, 1);
400
- return v === 0 && o === n._duration ? 1 : v;
401
- }, u = I(), l = this._easingFunction(u);
402
- if (this._updateProperties(this._object, this._valuesStart, this._valuesEnd, l), this._onUpdateCallback && this._onUpdateCallback(this._object, u), this._duration === 0 || o >= this._duration)
749
+ if (elapsedTime > totalTime) {
750
+ return 1;
751
+ }
752
+ var timesRepeated = Math.trunc(elapsedTime / durationAndDelay);
753
+ var timeIntoCurrentRepeat = elapsedTime - timesRepeated * durationAndDelay;
754
+ var portion = Math.min(timeIntoCurrentRepeat / _this._duration, 1);
755
+ if (portion === 0 && elapsedTime === _this._duration) {
756
+ return 1;
757
+ }
758
+ return portion;
759
+ };
760
+ var elapsed = calculateElapsedPortion();
761
+ var value = this._easingFunction(elapsed);
762
+ this._updateProperties(this._object, this._valuesStart, this._valuesEnd, value);
763
+ if (this._onUpdateCallback) {
764
+ this._onUpdateCallback(this._object, elapsed);
765
+ }
766
+ if (this._duration === 0 || elapsedTime >= this._duration) {
403
767
  if (this._repeat > 0) {
404
- var h = Math.min(Math.trunc((o - this._duration) / c) + 1, this._repeat);
405
- isFinite(this._repeat) && (this._repeat -= h);
406
- for (r in this._valuesStartRepeat)
407
- !this._yoyo && typeof this._valuesEnd[r] == "string" && (this._valuesStartRepeat[r] = // eslint-disable-next-line
408
- // @ts-ignore FIXME?
409
- this._valuesStartRepeat[r] + parseFloat(this._valuesEnd[r])), this._yoyo && this._swapEndStartRepeatValues(r), this._valuesStart[r] = this._valuesStartRepeat[r];
410
- return this._yoyo && (this._reversed = !this._reversed), this._startTime += c * h, this._onRepeatCallback && this._onRepeatCallback(this._object), this._onEveryStartCallbackFired = !1, !0;
768
+ var completeCount = Math.min(Math.trunc((elapsedTime - this._duration) / durationAndDelay) + 1, this._repeat);
769
+ if (isFinite(this._repeat)) {
770
+ this._repeat -= completeCount;
771
+ }
772
+ for (property in this._valuesStartRepeat) {
773
+ if (!this._yoyo && typeof this._valuesEnd[property] === "string") {
774
+ this._valuesStartRepeat[property] = // eslint-disable-next-line
775
+ // @ts-ignore FIXME?
776
+ this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]);
777
+ }
778
+ if (this._yoyo) {
779
+ this._swapEndStartRepeatValues(property);
780
+ }
781
+ this._valuesStart[property] = this._valuesStartRepeat[property];
782
+ }
783
+ if (this._yoyo) {
784
+ this._reversed = !this._reversed;
785
+ }
786
+ this._startTime += durationAndDelay * completeCount;
787
+ if (this._onRepeatCallback) {
788
+ this._onRepeatCallback(this._object);
789
+ }
790
+ this._onEveryStartCallbackFired = false;
791
+ return true;
411
792
  } else {
412
- this._onCompleteCallback && this._onCompleteCallback(this._object);
413
- for (var g = 0, f = this._chainedTweens.length; g < f; g++)
414
- this._chainedTweens[g].start(this._startTime + this._duration, !1);
415
- return this._isPlaying = !1, !1;
793
+ if (this._onCompleteCallback) {
794
+ this._onCompleteCallback(this._object);
795
+ }
796
+ for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {
797
+ this._chainedTweens[i].start(this._startTime + this._duration, false);
798
+ }
799
+ this._isPlaying = false;
800
+ return false;
801
+ }
802
+ }
803
+ return true;
804
+ };
805
+ Tween2.prototype._updateProperties = function(_object, _valuesStart, _valuesEnd, value) {
806
+ for (var property in _valuesEnd) {
807
+ if (_valuesStart[property] === void 0) {
808
+ continue;
416
809
  }
417
- return !0;
418
- }, t.prototype._updateProperties = function(i, e, n, s) {
419
- for (var r in n)
420
- if (e[r] !== void 0) {
421
- var a = e[r] || 0, o = n[r], c = Array.isArray(i[r]), d = Array.isArray(o), I = !c && d;
422
- I ? i[r] = this._interpolationFunction(o, s) : typeof o == "object" && o ? this._updateProperties(i[r], a, o, s) : (o = this._handleRelativeValue(a, o), typeof o == "number" && (i[r] = a + (o - a) * s));
810
+ var start = _valuesStart[property] || 0;
811
+ var end = _valuesEnd[property];
812
+ var startIsArray = Array.isArray(_object[property]);
813
+ var endIsArray = Array.isArray(end);
814
+ var isInterpolationList = !startIsArray && endIsArray;
815
+ if (isInterpolationList) {
816
+ _object[property] = this._interpolationFunction(end, value);
817
+ } else if (typeof end === "object" && end) {
818
+ this._updateProperties(_object[property], start, end, value);
819
+ } else {
820
+ end = this._handleRelativeValue(start, end);
821
+ if (typeof end === "number") {
822
+ _object[property] = start + (end - start) * value;
823
+ }
423
824
  }
424
- }, t.prototype._handleRelativeValue = function(i, e) {
425
- return typeof e != "string" ? e : e.charAt(0) === "+" || e.charAt(0) === "-" ? i + parseFloat(e) : parseFloat(e);
426
- }, t.prototype._swapEndStartRepeatValues = function(i) {
427
- var e = this._valuesStartRepeat[i], n = this._valuesEnd[i];
428
- typeof n == "string" ? this._valuesStartRepeat[i] = this._valuesStartRepeat[i] + parseFloat(n) : this._valuesStartRepeat[i] = this._valuesEnd[i], this._valuesEnd[i] = e;
429
- }, t;
825
+ }
826
+ };
827
+ Tween2.prototype._handleRelativeValue = function(start, end) {
828
+ if (typeof end !== "string") {
829
+ return end;
830
+ }
831
+ if (end.charAt(0) === "+" || end.charAt(0) === "-") {
832
+ return start + parseFloat(end);
833
+ }
834
+ return parseFloat(end);
835
+ };
836
+ Tween2.prototype._swapEndStartRepeatValues = function(property) {
837
+ var tmp = this._valuesStartRepeat[property];
838
+ var endValue = this._valuesEnd[property];
839
+ if (typeof endValue === "string") {
840
+ this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue);
841
+ } else {
842
+ this._valuesStartRepeat[property] = this._valuesEnd[property];
843
+ }
844
+ this._valuesEnd[property] = tmp;
845
+ };
846
+ return Tween2;
430
847
  }()
431
- ), _ = E;
432
- _.getAll.bind(_);
433
- _.removeAll.bind(_);
434
- _.add.bind(_);
435
- _.remove.bind(_);
436
- _.update.bind(_);
437
- function F(t, i, e, n = b.Linear.None) {
438
- const s = new Q(t).to(i, e).easing(n).start();
439
- function r(a) {
440
- s.update(a) && requestAnimationFrame(r);
441
- }
442
- return requestAnimationFrame(r), s;
848
+ );
849
+ var TWEEN = mainGroup;
850
+ TWEEN.getAll.bind(TWEEN);
851
+ TWEEN.removeAll.bind(TWEEN);
852
+ TWEEN.add.bind(TWEEN);
853
+ TWEEN.remove.bind(TWEEN);
854
+ TWEEN.update.bind(TWEEN);
855
+ function tween(from, to, duration, easing = Easing.Linear.None) {
856
+ const tweenInstance = new Tween(from).to(to, duration).easing(easing).start();
857
+ function animate(time) {
858
+ if (!tweenInstance.update(time))
859
+ return;
860
+ requestAnimationFrame(animate);
861
+ }
862
+ requestAnimationFrame(animate);
863
+ return tweenInstance;
443
864
  }
444
- var y = /* @__PURE__ */ ((t) => (t.Drawline = "Drawline", t.Undo = "Undo", t.Exit = "Exit", t))(y || {});
445
- const x = Symbol("$$PAINT_BRUSH_EVENT$$");
446
- function S(t) {
447
- return t[x] || (t[x] = {}), t[x];
865
+ var PaintBrushTypeEnum = /* @__PURE__ */ ((PaintBrushTypeEnum2) => {
866
+ PaintBrushTypeEnum2["Drawline"] = "Drawline";
867
+ PaintBrushTypeEnum2["Undo"] = "Undo";
868
+ PaintBrushTypeEnum2["Exit"] = "Exit";
869
+ return PaintBrushTypeEnum2;
870
+ })(PaintBrushTypeEnum || {});
871
+ const EVENT_SYMBOL = Symbol("$$PAINT_BRUSH_EVENT$$");
872
+ function __generateEventIfNotExisted(instance) {
873
+ if (!instance[EVENT_SYMBOL]) {
874
+ instance[EVENT_SYMBOL] = {};
875
+ }
876
+ return instance[EVENT_SYMBOL];
448
877
  }
449
- function J(t) {
450
- t[x] || delete t[x];
878
+ function __removeEventIfNotExisted(instance) {
879
+ if (!instance[EVENT_SYMBOL]) {
880
+ delete instance[EVENT_SYMBOL];
881
+ }
451
882
  }
452
- class K {
883
+ class Subscribe {
453
884
  /**
454
885
  * 判断是否注册了事件
455
886
  * @param name 事件类型
456
887
  */
457
- hasListener(i) {
458
- const e = S(this);
459
- return e && e[i] && e[i].length > 0;
888
+ hasListener(name) {
889
+ const events = __generateEventIfNotExisted(this);
890
+ return events && events[name] && events[name].length > 0;
460
891
  }
461
892
  /**
462
893
  * 注册事件
@@ -467,9 +898,12 @@ class K {
467
898
  * @template K 预设的监听事件名称
468
899
  * @template C 回调函数函数上下文
469
900
  */
470
- on(i, e, n) {
471
- const s = S(this);
472
- return s[i] || (s[i] = []), s[i].push([e, n || !1]), () => this.off(i, e);
901
+ on(name, callback, once) {
902
+ const events = __generateEventIfNotExisted(this);
903
+ if (!events[name])
904
+ events[name] = [];
905
+ events[name].push([callback, once || false]);
906
+ return () => this.off(name, callback);
473
907
  }
474
908
  /**
475
909
  * 注册事件(是否只执行一次)
@@ -479,8 +913,8 @@ class K {
479
913
  * @template K 预设的监听事件名称
480
914
  * @template C 回调函数函数上下文
481
915
  */
482
- once(i, e) {
483
- return this.on(i, e, !0);
916
+ once(name, callback) {
917
+ return this.on(name, callback, true);
484
918
  }
485
919
  /**
486
920
  * 解除事件
@@ -491,20 +925,26 @@ class K {
491
925
  * @param callback 事件回调函数
492
926
  * @template K 预设的监听事件名称
493
927
  */
494
- off(i, e) {
495
- if (i === void 0) {
496
- J(this);
928
+ off(name, callback) {
929
+ if (name === void 0) {
930
+ __removeEventIfNotExisted(this);
497
931
  return;
498
932
  }
499
- const n = S(this);
500
- if (n[i] || (n[i] = []), e === void 0) {
501
- n[i].length = 0;
933
+ const events = __generateEventIfNotExisted(this);
934
+ if (!events[name])
935
+ events[name] = [];
936
+ if (callback === void 0) {
937
+ events[name].length = 0;
502
938
  return;
503
939
  }
504
- let s = 0;
505
- for (; s < n[i].length && n[i][s][0] !== e; s++)
506
- ;
507
- s < n[i].length && n[i].splice(s, 1);
940
+ let index = 0;
941
+ for (; index < events[name].length; index++) {
942
+ if (events[name][index][0] === callback)
943
+ break;
944
+ }
945
+ if (index < events[name].length) {
946
+ events[name].splice(index, 1);
947
+ }
508
948
  }
509
949
  /**
510
950
  * 触发事件
@@ -513,23 +953,28 @@ class K {
513
953
  * @returns canceled 是否被触发取消
514
954
  * @template K 预设的监听事件名称
515
955
  */
516
- emit(i, ...e) {
517
- let n = !1;
518
- const r = S(this)[i] || [];
519
- for (let a of r.slice()) {
520
- const [o, c = !1] = a, d = o(...e);
521
- c && this.off(i, o), d === !1 && (n = !0);
956
+ emit(name, ...data) {
957
+ let canceled = false;
958
+ const events = __generateEventIfNotExisted(this);
959
+ const event = events[name] || [];
960
+ for (let one of event.slice()) {
961
+ const [callback, once = false] = one;
962
+ const result = callback(...data);
963
+ if (once)
964
+ this.off(name, callback);
965
+ if (result === false)
966
+ canceled = true;
522
967
  }
523
- return n;
968
+ return canceled;
524
969
  }
525
970
  }
526
- function M() {
971
+ function S4() {
527
972
  return ((1 + Math.random()) * 65536 | 0).toString(16).substring(1);
528
973
  }
529
- function X() {
530
- return (M() + M() + "-" + M() + "-4" + M().substr(0, 3) + "-" + M() + "-" + M() + M() + M()).toLowerCase();
974
+ function uuid() {
975
+ return (S4() + S4() + "-" + S4() + "-4" + S4().substr(0, 3) + "-" + S4() + "-" + S4() + S4() + S4()).toLowerCase();
531
976
  }
532
- const V = `
977
+ const PaintBrushStyle = `
533
978
  <style type="text/css">
534
979
 
535
980
  #_gl_paintBrush {
@@ -630,21 +1075,26 @@ transition: all 500ms;
630
1075
 
631
1076
  </style>
632
1077
  `;
633
- class q extends K {
634
- constructor(e) {
1078
+ class Controller extends Subscribe {
1079
+ constructor(configs) {
635
1080
  super();
636
- C(this, "configs");
637
- C(this, "clientWidth");
638
- C(this, "clientHeight");
639
- C(this, "ready", !1);
640
- C(this, "uuid", X());
641
- C(this, "tween");
642
- C(this, "tweening", !1);
643
- C(this, "container");
644
- C(this, "canvas");
645
- C(this, "data", {});
646
- C(this, "tempLine", {});
647
- this.configs = e, this.clientWidth = document.body.clientWidth, this.clientHeight = document.body.clientHeight, this.container = this.ifInsertToDOM(), this.canvas = {}, this.initCtrl();
1081
+ __publicField(this, "configs");
1082
+ __publicField(this, "clientWidth");
1083
+ __publicField(this, "clientHeight");
1084
+ __publicField(this, "ready", false);
1085
+ __publicField(this, "uuid", uuid());
1086
+ __publicField(this, "tween");
1087
+ __publicField(this, "tweening", false);
1088
+ __publicField(this, "container");
1089
+ __publicField(this, "canvas");
1090
+ __publicField(this, "data", {});
1091
+ __publicField(this, "tempLine", {});
1092
+ this.configs = configs;
1093
+ this.clientWidth = document.body.clientWidth;
1094
+ this.clientHeight = document.body.clientHeight;
1095
+ this.container = this.ifInsertToDOM();
1096
+ this.canvas = {};
1097
+ this.initCtrl();
648
1098
  }
649
1099
  get color() {
650
1100
  return this.configs.currentColor;
@@ -656,305 +1106,481 @@ class q extends K {
656
1106
  return this.configs.DPR || 1;
657
1107
  }
658
1108
  ifInsertToDOM() {
659
- if (this.container)
1109
+ if (this.container) {
660
1110
  return this.container;
661
- if (this.configs.container)
662
- this.configs.container.id = "_gl_paintBrush", this.container = this.configs.container;
663
- else if (document.getElementById("_gl_paintBrush"))
1111
+ }
1112
+ if (this.configs.container) {
1113
+ this.configs.container.id = "_gl_paintBrush";
1114
+ this.container = this.configs.container;
1115
+ } else if (!document.getElementById("_gl_paintBrush")) {
1116
+ const container = document.createElement("div");
1117
+ container.id = "_gl_paintBrush";
1118
+ document.body.appendChild(container);
1119
+ this.container = container;
1120
+ } else {
664
1121
  this.container = document.getElementById("_gl_paintBrush");
665
- else {
666
- const e = document.createElement("div");
667
- e.id = "_gl_paintBrush", document.body.appendChild(e), this.container = e;
668
1122
  }
669
- return this.container.innerHTML = V, this.container;
1123
+ this.container.innerHTML = PaintBrushStyle;
1124
+ return this.container;
670
1125
  }
671
1126
  /**
672
1127
  *
673
1128
  * @param className 初始化画板
674
1129
  * @returns
675
1130
  */
676
- initCanvas(e) {
677
- const n = document.createElement("canvas");
678
- n.className = e, n.width = this.clientWidth, n.height = this.clientHeight;
679
- const s = n.getContext("2d");
680
- if (s)
681
- return s.lineWidth = 5 * this.dpr, s.lineCap = "round", s.lineJoin = "round", this.container.appendChild(n), n;
1131
+ initCanvas(className) {
1132
+ const canvas = document.createElement("canvas");
1133
+ canvas.className = className;
1134
+ canvas.width = this.clientWidth;
1135
+ canvas.height = this.clientHeight;
1136
+ const ctx = canvas.getContext("2d");
1137
+ if (!ctx)
1138
+ return;
1139
+ ctx.lineWidth = 5 * this.dpr;
1140
+ ctx.lineCap = "round";
1141
+ ctx.lineJoin = "round";
1142
+ this.container.appendChild(canvas);
1143
+ return canvas;
682
1144
  }
683
1145
  /**
684
1146
  * 初始化操作面板
685
1147
  * @returns
686
1148
  */
687
1149
  initCtrl() {
688
- const e = document.createElement("div");
689
- e.className = "_paintBrush-ctrl";
690
- const n = document.createElement("div");
691
- n.className = "_paintBrush-ctrlinner";
692
- const s = document.createElement("a");
693
- s.className = "_paintBrush-ctrlitem _paintBrush-ctrlitem--undo", s.addEventListener("click", (o) => {
694
- var l;
695
- if (o.stopPropagation(), this.configs.onClickUndo && this.configs.onClickUndo(), !this.canvas[this.uuid] || !this.data[this.uuid] || this.data[this.uuid].length === 0)
1150
+ const ctrl = document.createElement("div");
1151
+ ctrl.className = "_paintBrush-ctrl";
1152
+ const ctrl_inner = document.createElement("div");
1153
+ ctrl_inner.className = "_paintBrush-ctrlinner";
1154
+ const a_undo = document.createElement("a");
1155
+ a_undo.className = "_paintBrush-ctrlitem _paintBrush-ctrlitem--undo";
1156
+ a_undo.addEventListener("click", (e) => {
1157
+ var _a;
1158
+ e.stopPropagation();
1159
+ if (this.configs.onClickUndo) {
1160
+ this.configs.onClickUndo();
1161
+ }
1162
+ if (!this.canvas[this.uuid] || !this.data[this.uuid] || this.data[this.uuid].length === 0) {
696
1163
  return;
697
- const c = this.data[this.uuid].pop();
698
- c && this.emitStateChange({
699
- type: y.Undo,
700
- color: this.color,
701
- ready: this.ready,
702
- state: c,
703
- uuid: this.uuid
704
- });
705
- const d = (l = this.canvas[this.uuid]) == null ? void 0 : l.getContext("2d");
706
- if (!this.canvas[this.uuid])
1164
+ }
1165
+ const popState = this.data[this.uuid].pop();
1166
+ if (popState) {
1167
+ this.emitStateChange({
1168
+ type: PaintBrushTypeEnum.Undo,
1169
+ color: this.color,
1170
+ ready: this.ready,
1171
+ state: popState,
1172
+ uuid: this.uuid
1173
+ });
1174
+ }
1175
+ const $ctx = (_a = this.canvas[this.uuid]) == null ? void 0 : _a.getContext("2d");
1176
+ if (!this.canvas[this.uuid]) {
707
1177
  return;
708
- const { width: I, height: u } = this.canvas[this.uuid];
709
- d && d.clearRect(0, 0, I, u), this.data[this.uuid].forEach((h) => this.handleDrawLine(this.uuid, h, { withUndo: !0 }));
1178
+ }
1179
+ const { width, height } = this.canvas[this.uuid];
1180
+ if ($ctx) {
1181
+ $ctx.clearRect(0, 0, width, height);
1182
+ }
1183
+ this.data[this.uuid].forEach((ld) => this.handleDrawLine(this.uuid, ld, { withUndo: true }));
710
1184
  });
711
- const r = document.createElement("a");
712
- return r.className = "_paintBrush-ctrlitem _paintBrush-ctrlitem--close", r.addEventListener("click", (o) => {
713
- o.stopPropagation(), this.closeBrush(), this.configs.onClickClose && this.configs.onClickClose();
714
- }), [s, r].forEach((o) => {
715
- const c = document.createElement("i");
716
- c.className = "brush-icon";
717
- const d = document.createElement("span");
718
- d.className = "brush-txt", d.innerText = o.className.endsWith("undo") ? this.configs.onUndoText : this.configs.onExitText, o.appendChild(c), o.appendChild(d);
719
- }), n.appendChild(s), n.appendChild(r), e.appendChild(n), this.container.appendChild(e), e;
1185
+ const a_close = document.createElement("a");
1186
+ a_close.className = "_paintBrush-ctrlitem _paintBrush-ctrlitem--close";
1187
+ a_close.addEventListener("click", (e) => {
1188
+ e.stopPropagation();
1189
+ this.closeBrush();
1190
+ if (this.configs.onClickClose) {
1191
+ this.configs.onClickClose();
1192
+ }
1193
+ });
1194
+ const $A = [a_undo, a_close];
1195
+ $A.forEach(($a) => {
1196
+ const $i = document.createElement("i");
1197
+ $i.className = "brush-icon";
1198
+ const $span = document.createElement("span");
1199
+ $span.className = "brush-txt";
1200
+ $span.innerText = $a.className.endsWith("undo") ? this.configs.onUndoText : this.configs.onExitText;
1201
+ $a.appendChild($i);
1202
+ $a.appendChild($span);
1203
+ });
1204
+ ctrl_inner.appendChild(a_undo);
1205
+ ctrl_inner.appendChild(a_close);
1206
+ ctrl.appendChild(ctrl_inner);
1207
+ this.container.appendChild(ctrl);
1208
+ return ctrl;
720
1209
  }
721
1210
  openBrush() {
722
1211
  if (this.ready)
723
1212
  return;
724
- this.canvas[this.uuid] || (this.canvas[this.uuid] = this.initCanvas("_paintBrush-canvas")), this.container.className = "brushing";
725
- const e = this.canvas[this.uuid];
726
- e.getContext("2d").clearRect(0, 0, e.width, e.height), this.openBrushHandle(), this.ready = !0, this.emit("readyChange", !0);
1213
+ if (!this.canvas[this.uuid]) {
1214
+ this.canvas[this.uuid] = this.initCanvas("_paintBrush-canvas");
1215
+ }
1216
+ this.container.className = "brushing";
1217
+ const $curCanvas = this.canvas[this.uuid];
1218
+ const $ctx = $curCanvas.getContext("2d");
1219
+ $ctx.clearRect(0, 0, $curCanvas.width, $curCanvas.height);
1220
+ this.openBrushHandle();
1221
+ this.ready = true;
1222
+ this.emit("readyChange", true);
727
1223
  }
728
1224
  closeBrush() {
729
- this.ready && (this.container.className = "", this.data = {}, this.tempLine = {}, Object.keys(this.canvas).forEach((e) => {
730
- this.canvas[e].ontouchstart = () => !1, this.canvas[e].ontouchmove = () => !1, this.canvas[e].ontouchend = () => !1, this.canvas[e].ontouchcancel = () => !1;
731
- const n = this.canvas[e].getContext("2d");
732
- n && n.clearRect(0, 0, this.canvas[e].width, this.canvas[e].height);
733
- }), this.ready = !1, this.emit("readyChange", !1), this.emitStateChange({
734
- type: y.Exit,
1225
+ if (!this.ready)
1226
+ return;
1227
+ this.container.className = "";
1228
+ this.data = {};
1229
+ this.tempLine = {};
1230
+ Object.keys(this.canvas).forEach((key) => {
1231
+ this.canvas[key].ontouchstart = () => false;
1232
+ this.canvas[key].ontouchmove = () => false;
1233
+ this.canvas[key].ontouchend = () => false;
1234
+ this.canvas[key].ontouchcancel = () => false;
1235
+ const $ctx = this.canvas[key].getContext("2d");
1236
+ if ($ctx) {
1237
+ $ctx.clearRect(0, 0, this.canvas[key].width, this.canvas[key].height);
1238
+ }
1239
+ });
1240
+ this.ready = false;
1241
+ this.emit("readyChange", false);
1242
+ this.emitStateChange({
1243
+ type: PaintBrushTypeEnum.Exit,
735
1244
  color: this.color,
736
- ready: !1,
1245
+ ready: false,
737
1246
  uuid: this.uuid
738
- }));
1247
+ });
739
1248
  }
740
- updateCurrentColor(e) {
741
- const n = this.canvas[this.uuid];
742
- if (!n)
1249
+ updateCurrentColor(color) {
1250
+ const currentCanvas = this.canvas[this.uuid];
1251
+ if (!currentCanvas)
1252
+ return;
1253
+ const currentCtx = currentCanvas.getContext("2d");
1254
+ if (!currentCtx)
743
1255
  return;
744
- const s = n.getContext("2d");
745
- s && (this.configs.currentColor = e, s.strokeStyle = e);
1256
+ this.configs.currentColor = color;
1257
+ currentCtx.strokeStyle = color;
746
1258
  }
747
1259
  openBrushHandle() {
748
- const e = this.canvas[this.uuid];
749
- if (!e)
1260
+ const currentCanvas = this.canvas[this.uuid];
1261
+ if (!currentCanvas)
750
1262
  return;
751
- const n = e.getContext("2d");
752
- if (!n)
1263
+ const currentCtx = currentCanvas.getContext("2d");
1264
+ if (!currentCtx)
753
1265
  return;
754
- const s = this.color || "#6D92FF";
755
- n.strokeStyle = s;
756
- let r = null, a = [], o, c = [], d = 0;
757
- const I = (u, l, h) => {
758
- const g = this.color || "#ff0000";
759
- n.strokeStyle = g, n.beginPath(), n.moveTo(u.x, u.y), n.quadraticCurveTo(l.x, l.y, h.x, h.y), n.stroke();
760
- };
761
- e.onmousedown = (u) => {
762
- u.preventDefault(), d = Date.now();
763
- const l = u.clientX, h = u.clientY;
764
- a = [], a.push({ x: l, y: h }), r = { x: l, y: h }, o = T({ x: l, y: h }, this.clientWidth, this.clientHeight), c = [];
765
- }, e.onmousemove = (u) => {
766
- if (u.preventDefault(), !r)
1266
+ const color = this.color || "#6D92FF";
1267
+ currentCtx.strokeStyle = color;
1268
+ let begin = null;
1269
+ let points = [];
1270
+ let move;
1271
+ let line = [];
1272
+ let startTime = 0;
1273
+ const draw = (beginPoint, controlPoint, endPoint) => {
1274
+ const color2 = this.color || "#ff0000";
1275
+ currentCtx.strokeStyle = color2;
1276
+ currentCtx.beginPath();
1277
+ currentCtx.moveTo(beginPoint.x, beginPoint.y);
1278
+ currentCtx.quadraticCurveTo(controlPoint.x, controlPoint.y, endPoint.x, endPoint.y);
1279
+ currentCtx.stroke();
1280
+ };
1281
+ currentCanvas.onmousedown = (e) => {
1282
+ e.preventDefault();
1283
+ startTime = Date.now();
1284
+ const x = e.clientX;
1285
+ const y = e.clientY;
1286
+ points = [];
1287
+ points.push({ x, y });
1288
+ begin = { x, y };
1289
+ move = transformCoords({ x, y }, this.clientWidth, this.clientHeight);
1290
+ line = [];
1291
+ };
1292
+ currentCanvas.onmousemove = (e) => {
1293
+ e.preventDefault();
1294
+ if (!begin)
767
1295
  return;
768
- const l = Number(u.clientX), h = Number(u.clientY);
769
- if (Math.abs(l - r.x) < 5 && Math.abs(h - r.y) < 5 || (a.push({ x: l, y: h }), c.push(T({ x: l, y: h }, this.clientWidth, this.clientHeight)), a.length < 3))
1296
+ const x = Number(e.clientX);
1297
+ const y = Number(e.clientY);
1298
+ if (Math.abs(x - begin.x) < 5 && Math.abs(y - begin.y) < 5) {
770
1299
  return;
771
- const { control: g, end: f } = j(a);
772
- !g || !f || (I(r, g, f), r = f);
773
- }, e.onmouseup = (u) => {
774
- if (u.preventDefault(), r = null, a.length < 3)
1300
+ }
1301
+ points.push({ x, y });
1302
+ line.push(transformCoords({ x, y }, this.clientWidth, this.clientHeight));
1303
+ if (points.length < 3) {
1304
+ return;
1305
+ }
1306
+ const { control, end } = getQuadraticCurvePoint(points);
1307
+ if (!control || !end) {
775
1308
  return;
776
- this.data[this.uuid] || (this.data[this.uuid] = []);
777
- const l = Date.now() - d, h = {
778
- move: Object.assign({}, o),
1309
+ }
1310
+ draw(begin, control, end);
1311
+ begin = end;
1312
+ };
1313
+ currentCanvas.onmouseup = (e) => {
1314
+ e.preventDefault();
1315
+ begin = null;
1316
+ if (points.length < 3)
1317
+ return;
1318
+ if (!this.data[this.uuid]) {
1319
+ this.data[this.uuid] = [];
1320
+ }
1321
+ const duration = Date.now() - startTime;
1322
+ const state2 = {
1323
+ move: Object.assign({}, move),
779
1324
  uuid: this.uuid,
780
- line: [...c],
1325
+ line: [...line],
781
1326
  color: this.color,
782
- duration: l < 1280 ? l : l < 2e3 ? 1280 : 0
1327
+ duration: duration < 1280 ? duration : duration < 2e3 ? 1280 : 0
783
1328
  // 单次笔迹时长超过2000ms不加动画
784
1329
  };
785
- this.data[this.uuid].push(h), P(() => {
1330
+ this.data[this.uuid].push(state2);
1331
+ nextFrame(() => {
786
1332
  this.emitStateChange({
787
- type: y.Drawline,
1333
+ type: PaintBrushTypeEnum.Drawline,
788
1334
  color: this.color,
789
1335
  ready: this.ready,
790
- state: h,
1336
+ state: state2,
791
1337
  uuid: this.uuid
792
1338
  });
793
1339
  });
794
- }, e.ontouchstart = (u) => {
795
- u.preventDefault(), d = Date.now();
796
- const l = u.touches[0].clientX, h = u.touches[0].clientY;
797
- a = [], a.push({ x: l, y: h }), r = { x: l, y: h }, o = T({ x: l, y: h }, this.clientWidth, this.clientHeight), c = [];
798
- }, e.ontouchmove = (u) => {
799
- if (u.preventDefault(), !r)
1340
+ };
1341
+ currentCanvas.ontouchstart = (e) => {
1342
+ e.preventDefault();
1343
+ startTime = Date.now();
1344
+ const x = e.touches[0].clientX;
1345
+ const y = e.touches[0].clientY;
1346
+ points = [];
1347
+ points.push({ x, y });
1348
+ begin = { x, y };
1349
+ move = transformCoords({ x, y }, this.clientWidth, this.clientHeight);
1350
+ line = [];
1351
+ };
1352
+ currentCanvas.ontouchmove = (e) => {
1353
+ e.preventDefault();
1354
+ if (!begin)
1355
+ return;
1356
+ const x = Number(e.touches[0].clientX);
1357
+ const y = Number(e.touches[0].clientY);
1358
+ if (Math.abs(x - begin.x) < 5 && Math.abs(y - begin.y) < 5)
1359
+ return;
1360
+ points.push({ x, y });
1361
+ line.push(transformCoords({ x, y }, this.clientWidth, this.clientHeight));
1362
+ if (points.length < 3)
800
1363
  return;
801
- const l = Number(u.touches[0].clientX), h = Number(u.touches[0].clientY);
802
- if (Math.abs(l - r.x) < 5 && Math.abs(h - r.y) < 5 || (a.push({ x: l, y: h }), c.push(T({ x: l, y: h }, this.clientWidth, this.clientHeight)), a.length < 3))
1364
+ const { control, end } = getQuadraticCurvePoint(points);
1365
+ if (!control || !end)
803
1366
  return;
804
- const { control: g, end: f } = j(a);
805
- !g || !f || (I(r, g, f), r = f);
806
- }, e.ontouchend = e.ontouchcancel = (u) => {
807
- if (u.preventDefault(), r = null, a.length < 3)
1367
+ draw(begin, control, end);
1368
+ begin = end;
1369
+ };
1370
+ currentCanvas.ontouchend = currentCanvas.ontouchcancel = (e) => {
1371
+ e.preventDefault();
1372
+ begin = null;
1373
+ if (points.length < 3)
808
1374
  return;
809
- this.data[this.uuid] || (this.data[this.uuid] = []);
810
- const l = Date.now() - d, h = {
811
- move: Object.assign({}, o),
812
- line: [...c],
1375
+ if (!this.data[this.uuid]) {
1376
+ this.data[this.uuid] = [];
1377
+ }
1378
+ const duration = Date.now() - startTime;
1379
+ const state2 = {
1380
+ move: Object.assign({}, move),
1381
+ line: [...line],
813
1382
  uuid: this.uuid,
814
1383
  color: this.color,
815
- duration: l < 1280 ? l : l < 2e3 ? 1280 : 0
1384
+ duration: duration < 1280 ? duration : duration < 2e3 ? 1280 : 0
816
1385
  // 单次笔迹时长超过2000ms不加动画
817
1386
  };
818
- this.data[this.uuid].push(h), P(() => {
1387
+ this.data[this.uuid].push(state2);
1388
+ nextFrame(() => {
819
1389
  this.emitStateChange({
820
- type: y.Drawline,
1390
+ type: PaintBrushTypeEnum.Drawline,
821
1391
  color: this.color,
822
1392
  ready: this.ready,
823
- state: h,
1393
+ state: state2,
824
1394
  uuid: this.uuid
825
1395
  });
826
1396
  });
827
1397
  };
828
1398
  }
829
- emitStateChange(e, n = !0) {
830
- if (e.type !== y.Drawline) {
831
- this.emit("stateChange", e, n);
1399
+ emitStateChange(action, userAction = true) {
1400
+ if (action.type !== PaintBrushTypeEnum.Drawline) {
1401
+ this.emit("stateChange", action, userAction);
832
1402
  return;
833
1403
  }
834
- const s = Date.now(), r = e.state;
835
- if (!r || !r.line)
1404
+ const timestamp = Date.now();
1405
+ const state2 = action.state;
1406
+ if (!state2)
836
1407
  return;
837
- const a = Math.ceil(r.line.length / 100);
838
- for (let o = 0; o < a; o++) {
839
- const c = {
1408
+ if (!state2.line)
1409
+ return;
1410
+ const sliceCount = Math.ceil(state2.line.length / 100);
1411
+ for (let i = 0; i < sliceCount; i++) {
1412
+ const localityAction = {
840
1413
  uuid: this.uuid,
841
1414
  color: this.color,
842
1415
  ready: this.ready,
843
- type: e.type,
1416
+ type: action.type,
844
1417
  state: {
845
1418
  uuid: this.uuid,
846
- move: r.move,
847
- duration: r.duration,
1419
+ move: state2.move,
1420
+ duration: state2.duration,
848
1421
  color: this.color,
849
- line: r.line.slice(o * 100, (o + 1) * 100)
1422
+ line: state2.line.slice(i * 100, (i + 1) * 100)
850
1423
  },
851
- timestamp: s,
852
- end: o === a - 1
1424
+ timestamp,
1425
+ end: i === sliceCount - 1
853
1426
  };
854
- U(o, 20, () => {
855
- this.emit("stateChange", c, n);
1427
+ execInterval(i, 20, () => {
1428
+ this.emit("stateChange", localityAction, userAction);
856
1429
  });
857
1430
  }
858
1431
  }
859
- action(e) {
860
- const { ready: n, type: s, uuid: r } = e;
861
- if (!n && this.ready) {
1432
+ action(action) {
1433
+ const { ready, type, uuid: uuid2 } = action;
1434
+ if (!ready && this.ready) {
862
1435
  this.closeBrush();
863
1436
  return;
864
1437
  }
865
- if (n && !this.ready) {
1438
+ if (ready && !this.ready) {
866
1439
  this.openBrush();
867
1440
  return;
868
1441
  }
869
- if (this.ready)
870
- switch (s) {
871
- case y.Drawline:
872
- const { state: a, timestamp: o, end: c } = e;
873
- if (!o || !a)
874
- return;
875
- this.tempLine[o] = [].concat(this.tempLine[o] || [], a.line), c && (Object.assign(a, { line: this.tempLine[o] }), this.handleDrawLine(r, a, {}, () => delete this.tempLine[o]));
876
- break;
877
- case y.Undo:
878
- this.handleUndo(r);
879
- break;
880
- }
881
- }
882
- handleDrawLine(e, n, { withUndo: s = !1 }, r = m) {
883
- !n || Object.prototype.toString.call(n) != "[object Object]" || Object.keys(n).length === 0 || G(() => new Promise((a) => {
884
- if (s || (this.canvas[e] || (this.canvas[e] = this.initCanvas("_paintBrush-canvas--sync")), this.data[e] || (this.data[e] = []), this.data[e].push(n)), !this.canvas[e])
885
- return;
886
- const o = this.canvas[e].getContext("2d");
887
- if (!o)
888
- return;
889
- const { line: c = [], color: d = "black", duration: I = 0, uuid: u } = n, l = L(n.move || {}, this.clientWidth, this.clientHeight);
890
- let h = [l];
891
- if (o.strokeStyle = d, o.beginPath(), o.moveTo(l.x, l.y), I && !s) {
892
- let g = [];
893
- const f = this;
894
- f.tween = F({ step: 0 }, { step: c.length - 1 }, I).onUpdate(({ step: p }) => {
895
- var v;
896
- if (f.tweening = !0, !f.ready)
897
- return o.clearRect(0, 0, f.canvas[u].width, f.canvas[u].height), (v = f.tween) == null ? void 0 : v.stop();
898
- const A = Math.floor(p);
899
- if (!g.find((D) => D === A)) {
900
- if (g.push(A), h.push(L(c[A], f.clientWidth, f.clientHeight)), h.length < 3)
901
- return;
902
- const { control: D, end: O } = j(h);
903
- if (!D || !O)
904
- return;
905
- o.quadraticCurveTo(D.x, D.y, O.x, O.y), o.stroke();
1442
+ if (!this.ready) {
1443
+ return;
1444
+ }
1445
+ switch (type) {
1446
+ case PaintBrushTypeEnum.Drawline:
1447
+ const { state: state2, timestamp, end } = action;
1448
+ if (!timestamp)
1449
+ return;
1450
+ if (!state2)
1451
+ return;
1452
+ this.tempLine[timestamp] = [].concat(this.tempLine[timestamp] || [], state2.line);
1453
+ if (end) {
1454
+ Object.assign(state2, { line: this.tempLine[timestamp] });
1455
+ this.handleDrawLine(uuid2, state2, {}, () => delete this.tempLine[timestamp]);
1456
+ }
1457
+ break;
1458
+ case PaintBrushTypeEnum.Undo:
1459
+ this.handleUndo(uuid2);
1460
+ break;
1461
+ }
1462
+ }
1463
+ handleDrawLine(_uuid, data, { withUndo = false }, callback = noop) {
1464
+ if (!data || Object.prototype.toString.call(data) != "[object Object]" || Object.keys(data).length === 0) {
1465
+ return;
1466
+ }
1467
+ queue(() => {
1468
+ return new Promise((resolve) => {
1469
+ if (!withUndo) {
1470
+ if (!this.canvas[_uuid]) {
1471
+ this.canvas[_uuid] = this.initCanvas("_paintBrush-canvas--sync");
906
1472
  }
907
- }).onComplete((p) => {
908
- f.tween = void 0, f.tweening = !1, g = [], h = [], r && r(), a();
909
- });
910
- } else {
911
- for (let g = 0; g < c.length; g++) {
912
- if (h.push(L(c[g], this.clientWidth, this.clientHeight)), h.length < 3)
913
- continue;
914
- const { control: f, end: p } = j(h);
915
- !f || !p || o.quadraticCurveTo(f.x, f.y, p.x, p.y);
1473
+ if (!this.data[_uuid]) {
1474
+ this.data[_uuid] = [];
1475
+ }
1476
+ this.data[_uuid].push(data);
916
1477
  }
917
- o.stroke(), h = [], r && r(), a();
918
- }
919
- }));
1478
+ if (!this.canvas[_uuid]) {
1479
+ return;
1480
+ }
1481
+ const $ctx = this.canvas[_uuid].getContext("2d");
1482
+ if (!$ctx)
1483
+ return;
1484
+ const { line = [], color = "black", duration = 0, uuid: uuid2 } = data;
1485
+ const move = unTransformCoords(data.move || {}, this.clientWidth, this.clientHeight);
1486
+ let points = [move];
1487
+ $ctx.strokeStyle = color;
1488
+ $ctx.beginPath();
1489
+ $ctx.moveTo(move.x, move.y);
1490
+ if (duration && !withUndo) {
1491
+ let drawCache = [];
1492
+ const self = this;
1493
+ self.tween = tween({ step: 0 }, { step: line.length - 1 }, duration).onUpdate(({ step }) => {
1494
+ var _a;
1495
+ self.tweening = true;
1496
+ if (!self.ready) {
1497
+ $ctx.clearRect(0, 0, self.canvas[uuid2].width, self.canvas[uuid2].height);
1498
+ return (_a = self.tween) == null ? void 0 : _a.stop();
1499
+ }
1500
+ const i = Math.floor(step);
1501
+ if (!drawCache.find((dc) => dc === i)) {
1502
+ drawCache.push(i);
1503
+ points.push(unTransformCoords(line[i], self.clientWidth, self.clientHeight));
1504
+ if (points.length < 3)
1505
+ return;
1506
+ const { control, end } = getQuadraticCurvePoint(points);
1507
+ if (!control || !end)
1508
+ return;
1509
+ $ctx.quadraticCurveTo(control.x, control.y, end.x, end.y);
1510
+ $ctx.stroke();
1511
+ }
1512
+ }).onComplete((e) => {
1513
+ self.tween = void 0;
1514
+ self.tweening = false;
1515
+ drawCache = [];
1516
+ points = [];
1517
+ if (callback)
1518
+ callback();
1519
+ resolve();
1520
+ });
1521
+ } else {
1522
+ for (let i = 0; i < line.length; i++) {
1523
+ points.push(unTransformCoords(line[i], this.clientWidth, this.clientHeight));
1524
+ if (points.length < 3)
1525
+ continue;
1526
+ const { control, end } = getQuadraticCurvePoint(points);
1527
+ if (!control || !end)
1528
+ continue;
1529
+ $ctx.quadraticCurveTo(control.x, control.y, end.x, end.y);
1530
+ }
1531
+ $ctx.stroke();
1532
+ points = [];
1533
+ if (callback)
1534
+ callback();
1535
+ resolve();
1536
+ }
1537
+ });
1538
+ });
920
1539
  }
921
- handleUndo(e) {
922
- if (!this.canvas[e] || !this.data[e] || this.data[e].length === 0)
1540
+ handleUndo(uuid2) {
1541
+ if (!this.canvas[uuid2] || !this.data[uuid2] || this.data[uuid2].length === 0) {
923
1542
  return;
924
- this.data[e].pop();
925
- const n = () => {
926
- var r;
927
- const s = (r = this.canvas[e]) == null ? void 0 : r.getContext("2d");
928
- s && s.clearRect(0, 0, this.canvas[e].width, this.canvas[e].height), this.data[e].forEach((a) => this.handleDrawLine(e, a, { withUndo: !0 }));
1543
+ }
1544
+ this.data[uuid2].pop();
1545
+ const handle = () => {
1546
+ var _a;
1547
+ const $ctx = (_a = this.canvas[uuid2]) == null ? void 0 : _a.getContext("2d");
1548
+ if ($ctx) {
1549
+ $ctx.clearRect(0, 0, this.canvas[uuid2].width, this.canvas[uuid2].height);
1550
+ }
1551
+ this.data[uuid2].forEach((ld) => this.handleDrawLine(uuid2, ld, { withUndo: true }));
929
1552
  };
930
1553
  if (this.tween && this.tweening) {
931
- this.tween.stop(), P(n, 60);
1554
+ this.tween.stop();
1555
+ nextFrame(handle, 60);
932
1556
  return;
933
1557
  }
934
- n();
1558
+ handle();
935
1559
  }
936
1560
  destroyBrush() {
937
- this.closeBrush(), this.ready = !1, this.emit("readyChange", !0);
1561
+ this.closeBrush();
1562
+ this.ready = false;
1563
+ this.emit("readyChange", true);
938
1564
  }
939
1565
  }
940
- class tt {
941
- constructor(i = {}) {
942
- C(this, "controller");
943
- const e = Object.assign({
1566
+ class PaintBrush {
1567
+ constructor(configs = {}) {
1568
+ __publicField(this, "controller");
1569
+ const _configs = Object.assign({
944
1570
  currentColor: "#f44336",
945
1571
  onUndoText: "回退",
946
1572
  onExitText: "关闭"
947
- }, i);
948
- this.controller = new q(e);
1573
+ }, configs);
1574
+ this.controller = new Controller(_configs);
949
1575
  }
950
- on(i, e) {
951
- this.controller.on(i, e);
1576
+ on(name, callback) {
1577
+ this.controller.on(name, callback);
952
1578
  }
953
- off(i, e) {
954
- this.controller.off(i, e);
1579
+ off(name, callback) {
1580
+ this.controller.off(name, callback);
955
1581
  }
956
- once(i, e) {
957
- this.controller.once(i, e);
1582
+ once(name, callback) {
1583
+ this.controller.once(name, callback);
958
1584
  }
959
1585
  /**
960
1586
  * 显示画笔。
@@ -962,8 +1588,8 @@ class tt {
962
1588
  show() {
963
1589
  this.controller.openBrush();
964
1590
  }
965
- action(i) {
966
- this.controller.action(i);
1591
+ action(action) {
1592
+ this.controller.action(action);
967
1593
  }
968
1594
  /**
969
1595
  * 获取画笔状态。
@@ -984,11 +1610,12 @@ class tt {
984
1610
  dispose() {
985
1611
  return this.controller.destroyBrush();
986
1612
  }
987
- setCurrentColor(i) {
988
- this.controller.updateCurrentColor(i);
1613
+ setCurrentColor(color) {
1614
+ this.controller.updateCurrentColor(color);
989
1615
  }
990
1616
  }
991
1617
  export {
992
- tt as PaintBrush,
993
- y as PaintBrushTypeEnum
1618
+ PaintBrush,
1619
+ PaintBrushTypeEnum
994
1620
  };
1621
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzL1BhaW50QnJ1c2gvdXRpbHMudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHR3ZWVuanMvdHdlZW4uanMvZGlzdC90d2Vlbi5lc20uanMiLCIuLi9zcmMvY29tcG9uZW50cy9QYWludEJydXNoL3R3ZWVuLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC90eXBpbmdzLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC9TdWJzY3JpYmUudHMiLCIuLi9zcmMvc2hhcmVkLXV0aWxzL3V1aWQudHMiLCIuLi9zcmMvY29tcG9uZW50cy9QYWludEJydXNoL3N0eWxlLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC9Db250cm9sbGVyLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gbm9vcCgpIHsgfVxuY29uc3QgcHJvbWlzZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpXG5cbmNvbnN0IHN0YXRlID0ge1xuICBfX3F1ZXVlOiBQcm9taXNlLnJlc29sdmUoKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvb3JkcyB7XG4gIHg6IG51bWJlclxuICB5OiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlKHByb21pc2VDYWxsYmFjayA9IHByb21pc2UpIHtcbiAgc3RhdGUuX19xdWV1ZSA9IHN0YXRlLl9fcXVldWUudGhlbihwcm9taXNlQ2FsbGJhY2spLmNhdGNoKHByb21pc2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1Db29yZHMoY29vcmRzOiBDb29yZHMsIGN3OiBudW1iZXIsIGNoOiBudW1iZXIpIHtcbiAgY29uc3QgX3g6IG51bWJlciA9IGNvb3Jkcy54XG4gIGNvbnN0IF95OiBudW1iZXIgPSBjb29yZHMueVxuICBjb25zdCB4ID0gTWF0aC5mbG9vcigoX3ggLyBjdykgKiAxMDAwMCkgLyAxMDAwMCAgIC8vIOS/neeVmeWbm+S9jeWwj+aVsFxuICBjb25zdCB5ID0gTWF0aC5mbG9vcigoX3kgLyBjaCkgKiAxMDAwMCkgLyAxMDAwMCAgIC8vIOS/neeVmeWbm+S9jeWwj+aVsFxuICByZXR1cm4geyB4LCB5IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuVHJhbnNmb3JtQ29vcmRzKGNvb3JkczogQ29vcmRzLCBjdzogbnVtYmVyLCBjaDogbnVtYmVyKSB7XG4gIGNvbnN0IHsgeDogX3gsIHk6IF95IH0gPSBjb29yZHNcbiAgY29uc3QgeCA9IF94ICogY3dcbiAgY29uc3QgeSA9IF95ICogY2hcbiAgcmV0dXJuIHsgeCwgeSB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50czogQ29vcmRzW10pIHtcbiAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSByZXR1cm4ge31cbiAgY29uc3QgbGFzdFR3byA9IHBvaW50cy5zbGljZSgtMilcbiAgY29uc3QgY29udHJvbCA9IGxhc3RUd29bMF1cbiAgY29uc3QgZW5kID0ge1xuICAgIHg6IChsYXN0VHdvWzBdLnggKyBsYXN0VHdvWzFdLngpIC8gMixcbiAgICB5OiAobGFzdFR3b1swXS55ICsgbGFzdFR3b1sxXS55KSAvIDIsXG4gIH1cbiAgcmV0dXJuIHsgY29udHJvbCwgZW5kIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNJbnRlcnZhbChpOiBudW1iZXIsIHRpbWU6IG51bWJlciwgY2FsbGJhY2sgPSBub29wKSB7XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICByZXNvbHZlKHRydWUpXG4gICAgfSwgdGltZSAqIGkpXG4gIH0pXG59XG5cbmNvbnN0IF93aW5kb3cgPSB3aW5kb3cgYXMgYW55XG5cbmNvbnN0IF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPVxuICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gIF93aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gIChmbiA9PiBzZXRUaW1lb3V0KGZuLCAxNikpXG5cbmNvbnN0IF9jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCBfd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNsZWFyVGltZW91dFxuXG5cbmV4cG9ydCBmdW5jdGlvbiBuZXh0RnJhbWUgKGZuOiBGcmFtZVJlcXVlc3RDYWxsYmFjaywgZGVsYXkgPSAwKSB7XG4gIGlmIChkZWxheSA8PSAwKSBfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKVxuICBlbHNlIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gbmV4dEZyYW1lKGZuLCBkZWxheSAtIDEpKVxufSIsIi8qKlxuICogVGhlIEVhc2UgY2xhc3MgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIGVhc2luZyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoIHR3ZWVuLmpzLlxuICovXG52YXIgRWFzaW5nID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgTGluZWFyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgTm9uZTogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgUXVhZHJhdGljOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudCAqICgyIC0gYW1vdW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTAuNSAqICgtLWFtb3VudCAqIChhbW91bnQgLSAyKSAtIDEpO1xuICAgICAgICB9LFxuICAgIH0pLFxuICAgIEN1YmljOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIC0tYW1vdW50ICogYW1vdW50ICogYW1vdW50ICsgMTtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMC41ICogKChhbW91bnQgLT0gMikgKiBhbW91bnQgKiBhbW91bnQgKyAyKTtcbiAgICAgICAgfSxcbiAgICB9KSxcbiAgICBRdWFydGljOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIDEgLSAtLWFtb3VudCAqIGFtb3VudCAqIGFtb3VudCAqIGFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTAuNSAqICgoYW1vdW50IC09IDIpICogYW1vdW50ICogYW1vdW50ICogYW1vdW50IC0gMik7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgUXVpbnRpYzogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50O1xuICAgICAgICB9LFxuICAgICAgICBPdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiAtLWFtb3VudCAqIGFtb3VudCAqIGFtb3VudCAqIGFtb3VudCAqIGFtb3VudCArIDE7XG4gICAgICAgIH0sXG4gICAgICAgIEluT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICBpZiAoKGFtb3VudCAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMC41ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAuNSAqICgoYW1vdW50IC09IDIpICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICsgMik7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgU2ludXNvaWRhbDogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gMSAtIE1hdGguc2luKCgoMS4wIC0gYW1vdW50KSAqIE1hdGguUEkpIC8gMik7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguc2luKChhbW91bnQgKiBNYXRoLlBJKSAvIDIpO1xuICAgICAgICB9LFxuICAgICAgICBJbk91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIDAuNSAqICgxIC0gTWF0aC5zaW4oTWF0aC5QSSAqICgwLjUgLSBhbW91bnQpKSk7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgRXhwb25lbnRpYWw6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBJbjogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudCA9PT0gMCA/IDAgOiBNYXRoLnBvdygxMDI0LCBhbW91bnQgLSAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50ID09PSAxID8gMSA6IDEgLSBNYXRoLnBvdygyLCAtMTAgKiBhbW91bnQpO1xuICAgICAgICB9LFxuICAgICAgICBJbk91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChhbW91bnQgKj0gMikgPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAuNSAqIE1hdGgucG93KDEwMjQsIGFtb3VudCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAuNSAqICgtTWF0aC5wb3coMiwgLTEwICogKGFtb3VudCAtIDEpKSArIDIpO1xuICAgICAgICB9LFxuICAgIH0pLFxuICAgIENpcmN1bGFyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSBhbW91bnQgKiBhbW91bnQpO1xuICAgICAgICB9LFxuICAgICAgICBPdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoMSAtIC0tYW1vdW50ICogYW1vdW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMC41ICogKE1hdGguc3FydCgxIC0gYW1vdW50ICogYW1vdW50KSAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAuNSAqIChNYXRoLnNxcnQoMSAtIChhbW91bnQgLT0gMikgKiBhbW91bnQpICsgMSk7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgRWxhc3RpYzogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICBpZiAoYW1vdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW1vdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLU1hdGgucG93KDIsIDEwICogKGFtb3VudCAtIDEpKSAqIE1hdGguc2luKChhbW91bnQgLSAxLjEpICogNSAqIE1hdGguUEkpO1xuICAgICAgICB9LFxuICAgICAgICBPdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmIChhbW91bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbW91bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBNYXRoLnBvdygyLCAtMTAgKiBhbW91bnQpICogTWF0aC5zaW4oKGFtb3VudCAtIDAuMSkgKiA1ICogTWF0aC5QSSkgKyAxO1xuICAgICAgICB9LFxuICAgICAgICBJbk91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYW1vdW50ICo9IDI7XG4gICAgICAgICAgICBpZiAoYW1vdW50IDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMC41ICogTWF0aC5wb3coMiwgMTAgKiAoYW1vdW50IC0gMSkpICogTWF0aC5zaW4oKGFtb3VudCAtIDEuMSkgKiA1ICogTWF0aC5QSSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMC41ICogTWF0aC5wb3coMiwgLTEwICogKGFtb3VudCAtIDEpKSAqIE1hdGguc2luKChhbW91bnQgLSAxLjEpICogNSAqIE1hdGguUEkpICsgMTtcbiAgICAgICAgfSxcbiAgICB9KSxcbiAgICBCYWNrOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHZhciBzID0gMS43MDE1ODtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgPT09IDEgPyAxIDogYW1vdW50ICogYW1vdW50ICogKChzICsgMSkgKiBhbW91bnQgLSBzKTtcbiAgICAgICAgfSxcbiAgICAgICAgT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICB2YXIgcyA9IDEuNzAxNTg7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50ID09PSAwID8gMCA6IC0tYW1vdW50ICogYW1vdW50ICogKChzICsgMSkgKiBhbW91bnQgKyBzKSArIDE7XG4gICAgICAgIH0sXG4gICAgICAgIEluT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICB2YXIgcyA9IDEuNzAxNTggKiAxLjUyNTtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiAoYW1vdW50ICogYW1vdW50ICogKChzICsgMSkgKiBhbW91bnQgLSBzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMC41ICogKChhbW91bnQgLT0gMikgKiBhbW91bnQgKiAoKHMgKyAxKSAqIGFtb3VudCArIHMpICsgMik7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgQm91bmNlOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiAxIC0gRWFzaW5nLkJvdW5jZS5PdXQoMSAtIGFtb3VudCk7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgaWYgKGFtb3VudCA8IDEgLyAyLjc1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDcuNTYyNSAqIGFtb3VudCAqIGFtb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFtb3VudCA8IDIgLyAyLjc1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDcuNTYyNSAqIChhbW91bnQgLT0gMS41IC8gMi43NSkgKiBhbW91bnQgKyAwLjc1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYW1vdW50IDwgMi41IC8gMi43NSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA3LjU2MjUgKiAoYW1vdW50IC09IDIuMjUgLyAyLjc1KSAqIGFtb3VudCArIDAuOTM3NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiA3LjU2MjUgKiAoYW1vdW50IC09IDIuNjI1IC8gMi43NSkgKiBhbW91bnQgKyAwLjk4NDM3NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmIChhbW91bnQgPCAwLjUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWFzaW5nLkJvdW5jZS5JbihhbW91bnQgKiAyKSAqIDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBFYXNpbmcuQm91bmNlLk91dChhbW91bnQgKiAyIC0gMSkgKiAwLjUgKyAwLjU7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgZ2VuZXJhdGVQb3c6IGZ1bmN0aW9uIChwb3dlcikge1xuICAgICAgICBpZiAocG93ZXIgPT09IHZvaWQgMCkgeyBwb3dlciA9IDQ7IH1cbiAgICAgICAgcG93ZXIgPSBwb3dlciA8IE51bWJlci5FUFNJTE9OID8gTnVtYmVyLkVQU0lMT04gOiBwb3dlcjtcbiAgICAgICAgcG93ZXIgPSBwb3dlciA+IDEwMDAwID8gMTAwMDAgOiBwb3dlcjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucG93KGFtb3VudCwgcG93ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC0gTWF0aC5wb3coKDEgLSBhbW91bnQpLCBwb3dlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW1vdW50IDwgMC41KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnBvdygoYW1vdW50ICogMiksIHBvd2VyKSAvIDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoMSAtIE1hdGgucG93KCgyIC0gYW1vdW50ICogMiksIHBvd2VyKSkgLyAyICsgMC41O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9LFxufSk7XG5cbnZhciBub3cgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsgfTtcblxuLyoqXG4gKiBDb250cm9sbGluZyBncm91cHMgb2YgdHdlZW5zXG4gKlxuICogVXNpbmcgdGhlIFRXRUVOIHNpbmdsZXRvbiB0byBtYW5hZ2UgeW91ciB0d2VlbnMgY2FuIGNhdXNlIGlzc3VlcyBpbiBsYXJnZSBhcHBzIHdpdGggbWFueSBjb21wb25lbnRzLlxuICogSW4gdGhlc2UgY2FzZXMsIHlvdSBtYXkgd2FudCB0byBjcmVhdGUgeW91ciBvd24gc21hbGxlciBncm91cHMgb2YgdHdlZW5cbiAqL1xudmFyIEdyb3VwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEdyb3VwKCkge1xuICAgICAgICB0aGlzLl90d2VlbnMgPSB7fTtcbiAgICAgICAgdGhpcy5fdHdlZW5zQWRkZWREdXJpbmdVcGRhdGUgPSB7fTtcbiAgICB9XG4gICAgR3JvdXAucHJvdG90eXBlLmdldEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3R3ZWVucykubWFwKGZ1bmN0aW9uICh0d2VlbklkKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX3R3ZWVuc1t0d2VlbklkXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBHcm91cC5wcm90b3R5cGUucmVtb3ZlQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90d2VlbnMgPSB7fTtcbiAgICB9O1xuICAgIEdyb3VwLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodHdlZW4pIHtcbiAgICAgICAgdGhpcy5fdHdlZW5zW3R3ZWVuLmdldElkKCldID0gdHdlZW47XG4gICAgICAgIHRoaXMuX3R3ZWVuc0FkZGVkRHVyaW5nVXBkYXRlW3R3ZWVuLmdldElkKCldID0gdHdlZW47XG4gICAgfTtcbiAgICBHcm91cC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHR3ZWVuKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90d2VlbnNbdHdlZW4uZ2V0SWQoKV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90d2VlbnNBZGRlZER1cmluZ1VwZGF0ZVt0d2Vlbi5nZXRJZCgpXTtcbiAgICB9O1xuICAgIEdyb3VwLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodGltZSwgcHJlc2VydmUpIHtcbiAgICAgICAgaWYgKHRpbWUgPT09IHZvaWQgMCkgeyB0aW1lID0gbm93KCk7IH1cbiAgICAgICAgaWYgKHByZXNlcnZlID09PSB2b2lkIDApIHsgcHJlc2VydmUgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgdHdlZW5JZHMgPSBPYmplY3Qua2V5cyh0aGlzLl90d2VlbnMpO1xuICAgICAgICBpZiAodHdlZW5JZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHdlZW5zIGFyZSB1cGRhdGVkIGluIFwiYmF0Y2hlc1wiLiBJZiB5b3UgYWRkIGEgbmV3IHR3ZWVuIGR1cmluZyBhblxuICAgICAgICAvLyB1cGRhdGUsIHRoZW4gdGhlIG5ldyB0d2VlbiB3aWxsIGJlIHVwZGF0ZWQgaW4gdGhlIG5leHQgYmF0Y2guXG4gICAgICAgIC8vIElmIHlvdSByZW1vdmUgYSB0d2VlbiBkdXJpbmcgYW4gdXBkYXRlLCBpdCBtYXkgb3IgbWF5IG5vdCBiZSB1cGRhdGVkLlxuICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgcmVtb3ZlZCB0d2VlbiB3YXMgYWRkZWQgZHVyaW5nIHRoZSBjdXJyZW50IGJhdGNoLFxuICAgICAgICAvLyB0aGVuIGl0IHdpbGwgbm90IGJlIHVwZGF0ZWQuXG4gICAgICAgIHdoaWxlICh0d2Vlbklkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl90d2VlbnNBZGRlZER1cmluZ1VwZGF0ZSA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0d2Vlbklkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB0d2VlbiA9IHRoaXMuX3R3ZWVuc1t0d2Vlbklkc1tpXV07XG4gICAgICAgICAgICAgICAgdmFyIGF1dG9TdGFydCA9ICFwcmVzZXJ2ZTtcbiAgICAgICAgICAgICAgICBpZiAodHdlZW4gJiYgdHdlZW4udXBkYXRlKHRpbWUsIGF1dG9TdGFydCkgPT09IGZhbHNlICYmICFwcmVzZXJ2ZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdHdlZW5zW3R3ZWVuSWRzW2ldXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0d2VlbklkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3R3ZWVuc0FkZGVkRHVyaW5nVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBHcm91cDtcbn0oKSk7XG5cbi8qKlxuICpcbiAqL1xudmFyIEludGVycG9sYXRpb24gPSB7XG4gICAgTGluZWFyOiBmdW5jdGlvbiAodiwgaykge1xuICAgICAgICB2YXIgbSA9IHYubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIGYgPSBtICogaztcbiAgICAgICAgdmFyIGkgPSBNYXRoLmZsb29yKGYpO1xuICAgICAgICB2YXIgZm4gPSBJbnRlcnBvbGF0aW9uLlV0aWxzLkxpbmVhcjtcbiAgICAgICAgaWYgKGsgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odlswXSwgdlsxXSwgZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGsgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odlttXSwgdlttIC0gMV0sIG0gLSBmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4odltpXSwgdltpICsgMSA+IG0gPyBtIDogaSArIDFdLCBmIC0gaSk7XG4gICAgfSxcbiAgICBCZXppZXI6IGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIHZhciBiID0gMDtcbiAgICAgICAgdmFyIG4gPSB2Lmxlbmd0aCAtIDE7XG4gICAgICAgIHZhciBwdyA9IE1hdGgucG93O1xuICAgICAgICB2YXIgYm4gPSBJbnRlcnBvbGF0aW9uLlV0aWxzLkJlcm5zdGVpbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbjsgaSsrKSB7XG4gICAgICAgICAgICBiICs9IHB3KDEgLSBrLCBuIC0gaSkgKiBwdyhrLCBpKSAqIHZbaV0gKiBibihuLCBpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYjtcbiAgICB9LFxuICAgIENhdG11bGxSb206IGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIHZhciBtID0gdi5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgZiA9IG0gKiBrO1xuICAgICAgICB2YXIgaSA9IE1hdGguZmxvb3IoZik7XG4gICAgICAgIHZhciBmbiA9IEludGVycG9sYXRpb24uVXRpbHMuQ2F0bXVsbFJvbTtcbiAgICAgICAgaWYgKHZbMF0gPT09IHZbbV0pIHtcbiAgICAgICAgICAgIGlmIChrIDwgMCkge1xuICAgICAgICAgICAgICAgIGkgPSBNYXRoLmZsb29yKChmID0gbSAqICgxICsgaykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbih2WyhpIC0gMSArIG0pICUgbV0sIHZbaV0sIHZbKGkgKyAxKSAlIG1dLCB2WyhpICsgMikgJSBtXSwgZiAtIGkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGsgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZbMF0gLSAoZm4odlswXSwgdlswXSwgdlsxXSwgdlsxXSwgLWYpIC0gdlswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoayA+IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdlttXSAtIChmbih2W21dLCB2W21dLCB2W20gLSAxXSwgdlttIC0gMV0sIGYgLSBtKSAtIHZbbV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuKHZbaSA/IGkgLSAxIDogMF0sIHZbaV0sIHZbbSA8IGkgKyAxID8gbSA6IGkgKyAxXSwgdlttIDwgaSArIDIgPyBtIDogaSArIDJdLCBmIC0gaSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFV0aWxzOiB7XG4gICAgICAgIExpbmVhcjogZnVuY3Rpb24gKHAwLCBwMSwgdCkge1xuICAgICAgICAgICAgcmV0dXJuIChwMSAtIHAwKSAqIHQgKyBwMDtcbiAgICAgICAgfSxcbiAgICAgICAgQmVybnN0ZWluOiBmdW5jdGlvbiAobiwgaSkge1xuICAgICAgICAgICAgdmFyIGZjID0gSW50ZXJwb2xhdGlvbi5VdGlscy5GYWN0b3JpYWw7XG4gICAgICAgICAgICByZXR1cm4gZmMobikgLyBmYyhpKSAvIGZjKG4gLSBpKTtcbiAgICAgICAgfSxcbiAgICAgICAgRmFjdG9yaWFsOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGEgPSBbMV07XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IDE7XG4gICAgICAgICAgICAgICAgaWYgKGFbbl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbbl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBuOyBpID4gMTsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIHMgKj0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYVtuXSA9IHM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSgpLFxuICAgICAgICBDYXRtdWxsUm9tOiBmdW5jdGlvbiAocDAsIHAxLCBwMiwgcDMsIHQpIHtcbiAgICAgICAgICAgIHZhciB2MCA9IChwMiAtIHAwKSAqIDAuNTtcbiAgICAgICAgICAgIHZhciB2MSA9IChwMyAtIHAxKSAqIDAuNTtcbiAgICAgICAgICAgIHZhciB0MiA9IHQgKiB0O1xuICAgICAgICAgICAgdmFyIHQzID0gdCAqIHQyO1xuICAgICAgICAgICAgcmV0dXJuICgyICogcDEgLSAyICogcDIgKyB2MCArIHYxKSAqIHQzICsgKC0zICogcDEgKyAzICogcDIgLSAyICogdjAgLSB2MSkgKiB0MiArIHYwICogdCArIHAxO1xuICAgICAgICB9LFxuICAgIH0sXG59O1xuXG4vKipcbiAqIFV0aWxzXG4gKi9cbnZhciBTZXF1ZW5jZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZXF1ZW5jZSgpIHtcbiAgICB9XG4gICAgU2VxdWVuY2UubmV4dElkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU2VxdWVuY2UuX25leHRJZCsrO1xuICAgIH07XG4gICAgU2VxdWVuY2UuX25leHRJZCA9IDA7XG4gICAgcmV0dXJuIFNlcXVlbmNlO1xufSgpKTtcblxudmFyIG1haW5Hcm91cCA9IG5ldyBHcm91cCgpO1xuXG4vKipcbiAqIFR3ZWVuLmpzIC0gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdHdlZW5qcy90d2Vlbi5qc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdlZW5qcy90d2Vlbi5qcy9ncmFwaHMvY29udHJpYnV0b3JzIGZvciB0aGUgZnVsbCBsaXN0IG9mIGNvbnRyaWJ1dG9ycy5cbiAqIFRoYW5rIHlvdSBhbGwsIHlvdSdyZSBhd2Vzb21lIVxuICovXG52YXIgVHdlZW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHdlZW4oX29iamVjdCwgX2dyb3VwKSB7XG4gICAgICAgIGlmIChfZ3JvdXAgPT09IHZvaWQgMCkgeyBfZ3JvdXAgPSBtYWluR3JvdXA7IH1cbiAgICAgICAgdGhpcy5fb2JqZWN0ID0gX29iamVjdDtcbiAgICAgICAgdGhpcy5fZ3JvdXAgPSBfZ3JvdXA7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhdXNlU3RhcnQgPSAwO1xuICAgICAgICB0aGlzLl92YWx1ZXNTdGFydCA9IHt9O1xuICAgICAgICB0aGlzLl92YWx1ZXNFbmQgPSB7fTtcbiAgICAgICAgdGhpcy5fdmFsdWVzU3RhcnRSZXBlYXQgPSB7fTtcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSAxMDAwO1xuICAgICAgICB0aGlzLl9pc0R5bmFtaWMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faW5pdGlhbFJlcGVhdCA9IDA7XG4gICAgICAgIHRoaXMuX3JlcGVhdCA9IDA7XG4gICAgICAgIHRoaXMuX3lveW8gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JldmVyc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RlbGF5VGltZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gICAgICAgIHRoaXMuX2Vhc2luZ0Z1bmN0aW9uID0gRWFzaW5nLkxpbmVhci5Ob25lO1xuICAgICAgICB0aGlzLl9pbnRlcnBvbGF0aW9uRnVuY3Rpb24gPSBJbnRlcnBvbGF0aW9uLkxpbmVhcjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHRoaXMuX2NoYWluZWRUd2VlbnMgPSBbXTtcbiAgICAgICAgdGhpcy5fb25TdGFydENhbGxiYWNrRmlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2tGaXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pZCA9IFNlcXVlbmNlLm5leHRJZCgpO1xuICAgICAgICB0aGlzLl9pc0NoYWluU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzQXJlU2V0VXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZ29Ub0VuZCA9IGZhbHNlO1xuICAgIH1cbiAgICBUd2Vlbi5wcm90b3R5cGUuZ2V0SWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5pc1BsYXlpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1BsYXlpbmc7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1BhdXNlZDtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5nZXREdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnRvID0gZnVuY3Rpb24gKHRhcmdldCwgZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKGR1cmF0aW9uID09PSB2b2lkIDApIHsgZHVyYXRpb24gPSAxMDAwOyB9XG4gICAgICAgIGlmICh0aGlzLl9pc1BsYXlpbmcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgY2FsbCBUd2Vlbi50bygpIHdoaWxlIFR3ZWVuIGlzIGFscmVhZHkgc3RhcnRlZCBvciBwYXVzZWQuIFN0b3AgdGhlIFR3ZWVuIGZpcnN0LicpO1xuICAgICAgICB0aGlzLl92YWx1ZXNFbmQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXNBcmVTZXRVcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IGR1cmF0aW9uIDwgMCA/IDAgOiBkdXJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuZHVyYXRpb24gPSBmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKGR1cmF0aW9uID09PSB2b2lkIDApIHsgZHVyYXRpb24gPSAxMDAwOyB9XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gZHVyYXRpb24gPCAwID8gMCA6IGR1cmF0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5keW5hbWljID0gZnVuY3Rpb24gKGR5bmFtaWMpIHtcbiAgICAgICAgaWYgKGR5bmFtaWMgPT09IHZvaWQgMCkgeyBkeW5hbWljID0gZmFsc2U7IH1cbiAgICAgICAgdGhpcy5faXNEeW5hbWljID0gZHluYW1pYztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAodGltZSwgb3ZlcnJpZGVTdGFydGluZ1ZhbHVlcykge1xuICAgICAgICBpZiAodGltZSA9PT0gdm9pZCAwKSB7IHRpbWUgPSBub3coKTsgfVxuICAgICAgICBpZiAob3ZlcnJpZGVTdGFydGluZ1ZhbHVlcyA9PT0gdm9pZCAwKSB7IG92ZXJyaWRlU3RhcnRpbmdWYWx1ZXMgPSBmYWxzZTsgfVxuICAgICAgICBpZiAodGhpcy5faXNQbGF5aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgdGhpcy5fZ3JvdXAgJiYgdGhpcy5fZ3JvdXAuYWRkKHRoaXMpO1xuICAgICAgICB0aGlzLl9yZXBlYXQgPSB0aGlzLl9pbml0aWFsUmVwZWF0O1xuICAgICAgICBpZiAodGhpcy5fcmV2ZXJzZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIHdlcmUgcmV2ZXJzZWQgKGYuZS4gdXNpbmcgdGhlIHlveW8gZmVhdHVyZSkgdGhlbiB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyBmbGlwIHRoZSB0d2VlbiBkaXJlY3Rpb24gYmFjayB0byBmb3J3YXJkLlxuICAgICAgICAgICAgdGhpcy5fcmV2ZXJzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMuX3ZhbHVlc1N0YXJ0UmVwZWF0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3dhcEVuZFN0YXJ0UmVwZWF0VmFsdWVzKHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25TdGFydENhbGxiYWNrRmlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2tGaXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0NoYWluU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSB0aW1lO1xuICAgICAgICB0aGlzLl9zdGFydFRpbWUgKz0gdGhpcy5fZGVsYXlUaW1lO1xuICAgICAgICBpZiAoIXRoaXMuX3Byb3BlcnRpZXNBcmVTZXRVcCB8fCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzQXJlU2V0VXAgPSB0cnVlO1xuICAgICAgICAgICAgLy8gSWYgZHluYW1pYyBpcyBub3QgZW5hYmxlZCwgY2xvbmUgdGhlIGVuZCB2YWx1ZXMgaW5zdGVhZCBvZiB1c2luZyB0aGUgcGFzc2VkLWluIGVuZCB2YWx1ZXMuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzRHluYW1pYykge1xuICAgICAgICAgICAgICAgIHZhciB0bXAgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHRoaXMuX3ZhbHVlc0VuZClcbiAgICAgICAgICAgICAgICAgICAgdG1wW3Byb3BdID0gdGhpcy5fdmFsdWVzRW5kW3Byb3BdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc0VuZCA9IHRtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NldHVwUHJvcGVydGllcyh0aGlzLl9vYmplY3QsIHRoaXMuX3ZhbHVlc1N0YXJ0LCB0aGlzLl92YWx1ZXNFbmQsIHRoaXMuX3ZhbHVlc1N0YXJ0UmVwZWF0LCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5zdGFydEZyb21DdXJyZW50VmFsdWVzID0gZnVuY3Rpb24gKHRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodGltZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuX3NldHVwUHJvcGVydGllcyA9IGZ1bmN0aW9uIChfb2JqZWN0LCBfdmFsdWVzU3RhcnQsIF92YWx1ZXNFbmQsIF92YWx1ZXNTdGFydFJlcGVhdCwgb3ZlcnJpZGVTdGFydGluZ1ZhbHVlcykge1xuICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBfdmFsdWVzRW5kKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnRWYWx1ZSA9IF9vYmplY3RbcHJvcGVydHldO1xuICAgICAgICAgICAgdmFyIHN0YXJ0VmFsdWVJc0FycmF5ID0gQXJyYXkuaXNBcnJheShzdGFydFZhbHVlKTtcbiAgICAgICAgICAgIHZhciBwcm9wVHlwZSA9IHN0YXJ0VmFsdWVJc0FycmF5ID8gJ2FycmF5JyA6IHR5cGVvZiBzdGFydFZhbHVlO1xuICAgICAgICAgICAgdmFyIGlzSW50ZXJwb2xhdGlvbkxpc3QgPSAhc3RhcnRWYWx1ZUlzQXJyYXkgJiYgQXJyYXkuaXNBcnJheShfdmFsdWVzRW5kW3Byb3BlcnR5XSk7XG4gICAgICAgICAgICAvLyBJZiBgdG8oKWAgc3BlY2lmaWVzIGEgcHJvcGVydHkgdGhhdCBkb2Vzbid0IGV4aXN0IGluIHRoZSBzb3VyY2Ugb2JqZWN0LFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIG5vdCBzZXQgdGhhdCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0XG4gICAgICAgICAgICBpZiAocHJvcFR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBhbiBBcnJheSB3YXMgcHJvdmlkZWQgYXMgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgIGlmIChpc0ludGVycG9sYXRpb25MaXN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGVuZFZhbHVlcyA9IF92YWx1ZXNFbmRbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIGlmIChlbmRWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYW4gYXJyYXkgb2YgcmVsYXRpdmUgdmFsdWVzLlxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgYSBsb2NhbCBjb3B5IG9mIHRoZSBBcnJheSB3aXRoIHRoZSBzdGFydCB2YWx1ZSBhdCB0aGUgZnJvbnRcbiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IFtzdGFydFZhbHVlXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGVuZFZhbHVlcy5sZW5ndGg7IGkgPCBsOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5faGFuZGxlUmVsYXRpdmVWYWx1ZShzdGFydFZhbHVlLCBlbmRWYWx1ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0ludGVycG9sYXRpb25MaXN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZvdW5kIGludmFsaWQgaW50ZXJwb2xhdGlvbiBsaXN0LiBTa2lwcGluZy4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0ludGVycG9sYXRpb25MaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChfdmFsdWVzU3RhcnRbcHJvcGVydHldID09PSB1bmRlZmluZWQpIHsgLy8gaGFuZGxlIGVuZCB2YWx1ZXMgb25seSB0aGUgZmlyc3QgdGltZS4gTk9UIE5FRURFRD8gc2V0dXBQcm9wZXJ0aWVzIGlzIG5vdyBndWFyZGVkIGJ5IF9wcm9wZXJ0aWVzQXJlU2V0VXAuXG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZXNFbmRbcHJvcGVydHldID0gdGVtcDtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZGVlcG5lc3Mgb2YgdGhlIHZhbHVlc1xuICAgICAgICAgICAgaWYgKChwcm9wVHlwZSA9PT0gJ29iamVjdCcgfHwgc3RhcnRWYWx1ZUlzQXJyYXkpICYmIHN0YXJ0VmFsdWUgJiYgIWlzSW50ZXJwb2xhdGlvbkxpc3QpIHtcbiAgICAgICAgICAgICAgICBfdmFsdWVzU3RhcnRbcHJvcGVydHldID0gc3RhcnRWYWx1ZUlzQXJyYXkgPyBbXSA6IHt9O1xuICAgICAgICAgICAgICAgIHZhciBuZXN0ZWRPYmplY3QgPSBzdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gbmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZXNTdGFydFtwcm9wZXJ0eV1bcHJvcF0gPSBuZXN0ZWRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE8/IHJlcGVhdCBuZXN0ZWQgdmFsdWVzPyBBbmQgeW95bz8gQW5kIGFycmF5IHZhbHVlcz9cbiAgICAgICAgICAgICAgICBfdmFsdWVzU3RhcnRSZXBlYXRbcHJvcGVydHldID0gc3RhcnRWYWx1ZUlzQXJyYXkgPyBbXSA6IHt9O1xuICAgICAgICAgICAgICAgIHZhciBlbmRWYWx1ZXMgPSBfdmFsdWVzRW5kW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAvLyBJZiBkeW5hbWljIGlzIG5vdCBlbmFibGVkLCBjbG9uZSB0aGUgZW5kIHZhbHVlcyBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBwYXNzZWQtaW4gZW5kIHZhbHVlcy5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lzRHluYW1pYykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0ge307XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gZW5kVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wW3Byb3BdID0gZW5kVmFsdWVzW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICBfdmFsdWVzRW5kW3Byb3BlcnR5XSA9IGVuZFZhbHVlcyA9IHRtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0dXBQcm9wZXJ0aWVzKG5lc3RlZE9iamVjdCwgX3ZhbHVlc1N0YXJ0W3Byb3BlcnR5XSwgZW5kVmFsdWVzLCBfdmFsdWVzU3RhcnRSZXBlYXRbcHJvcGVydHldLCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHZhbHVlLCBidXQgb25seSBvbmNlIHVubGVzcyBvdmVycmlkZSBpcyByZXF1ZXN0ZWQuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBfdmFsdWVzU3RhcnRbcHJvcGVydHldID09PSAndW5kZWZpbmVkJyB8fCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gPSBzdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0VmFsdWVJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIEZJWE1FP1xuICAgICAgICAgICAgICAgICAgICBfdmFsdWVzU3RhcnRbcHJvcGVydHldICo9IDEuMDsgLy8gRW5zdXJlcyB3ZSdyZSB1c2luZyBudW1iZXJzLCBub3Qgc3RyaW5nc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNJbnRlcnBvbGF0aW9uTGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBGSVhNRT9cbiAgICAgICAgICAgICAgICAgICAgX3ZhbHVlc1N0YXJ0UmVwZWF0W3Byb3BlcnR5XSA9IF92YWx1ZXNFbmRbcHJvcGVydHldLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZhbHVlc1N0YXJ0UmVwZWF0W3Byb3BlcnR5XSA9IF92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gfHwgMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzQ2hhaW5TdG9wcGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0NoYWluU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN0b3BDaGFpbmVkVHdlZW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB0aGlzLl9ncm91cCAmJiB0aGlzLl9ncm91cC5yZW1vdmUodGhpcyk7XG4gICAgICAgIHRoaXMuX2lzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fb25TdG9wQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuX29uU3RvcENhbGxiYWNrKHRoaXMuX29iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9nb1RvRW5kID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGUoSW5maW5pdHkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgIGlmICh0aW1lID09PSB2b2lkIDApIHsgdGltZSA9IG5vdygpOyB9XG4gICAgICAgIGlmICh0aGlzLl9pc1BhdXNlZCB8fCAhdGhpcy5faXNQbGF5aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc1BhdXNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3BhdXNlU3RhcnQgPSB0aW1lO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgdGhpcy5fZ3JvdXAgJiYgdGhpcy5fZ3JvdXAucmVtb3ZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgICAgICBpZiAodGltZSA9PT0gdm9pZCAwKSB7IHRpbWUgPSBub3coKTsgfVxuICAgICAgICBpZiAoIXRoaXMuX2lzUGF1c2VkIHx8ICF0aGlzLl9pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSArPSB0aW1lIC0gdGhpcy5fcGF1c2VTdGFydDtcbiAgICAgICAgdGhpcy5fcGF1c2VTdGFydCA9IDA7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB0aGlzLl9ncm91cCAmJiB0aGlzLl9ncm91cC5hZGQodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnN0b3BDaGFpbmVkVHdlZW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbnVtQ2hhaW5lZFR3ZWVucyA9IHRoaXMuX2NoYWluZWRUd2VlbnMubGVuZ3RoOyBpIDwgbnVtQ2hhaW5lZFR3ZWVuczsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFpbmVkVHdlZW5zW2ldLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5ncm91cCA9IGZ1bmN0aW9uIChncm91cCkge1xuICAgICAgICBpZiAoZ3JvdXAgPT09IHZvaWQgMCkgeyBncm91cCA9IG1haW5Hcm91cDsgfVxuICAgICAgICB0aGlzLl9ncm91cCA9IGdyb3VwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5kZWxheSA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgaWYgKGFtb3VudCA9PT0gdm9pZCAwKSB7IGFtb3VudCA9IDA7IH1cbiAgICAgICAgdGhpcy5fZGVsYXlUaW1lID0gYW1vdW50O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5yZXBlYXQgPSBmdW5jdGlvbiAodGltZXMpIHtcbiAgICAgICAgaWYgKHRpbWVzID09PSB2b2lkIDApIHsgdGltZXMgPSAwOyB9XG4gICAgICAgIHRoaXMuX2luaXRpYWxSZXBlYXQgPSB0aW1lcztcbiAgICAgICAgdGhpcy5fcmVwZWF0ID0gdGltZXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnJlcGVhdERlbGF5ID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICB0aGlzLl9yZXBlYXREZWxheVRpbWUgPSBhbW91bnQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnlveW8gPSBmdW5jdGlvbiAoeW95bykge1xuICAgICAgICBpZiAoeW95byA9PT0gdm9pZCAwKSB7IHlveW8gPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLl95b3lvID0geW95bztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuZWFzaW5nID0gZnVuY3Rpb24gKGVhc2luZ0Z1bmN0aW9uKSB7XG4gICAgICAgIGlmIChlYXNpbmdGdW5jdGlvbiA9PT0gdm9pZCAwKSB7IGVhc2luZ0Z1bmN0aW9uID0gRWFzaW5nLkxpbmVhci5Ob25lOyB9XG4gICAgICAgIHRoaXMuX2Vhc2luZ0Z1bmN0aW9uID0gZWFzaW5nRnVuY3Rpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLmludGVycG9sYXRpb24gPSBmdW5jdGlvbiAoaW50ZXJwb2xhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uRnVuY3Rpb24gPT09IHZvaWQgMCkgeyBpbnRlcnBvbGF0aW9uRnVuY3Rpb24gPSBJbnRlcnBvbGF0aW9uLkxpbmVhcjsgfVxuICAgICAgICB0aGlzLl9pbnRlcnBvbGF0aW9uRnVuY3Rpb24gPSBpbnRlcnBvbGF0aW9uRnVuY3Rpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgVHdlZW4ucHJvdG90eXBlLmNoYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdHdlZW5zID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0d2VlbnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFpbmVkVHdlZW5zID0gdHdlZW5zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uU3RhcnRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5vbkV2ZXJ5U3RhcnQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUub25VcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25VcGRhdGVDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5vblJlcGVhdCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblJlcGVhdENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLm9uQ29tcGxldGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25Db21wbGV0ZUNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLm9uU3RvcCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblN0b3BDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3ZWVuIGlzIHN0aWxsIHBsYXlpbmcgYWZ0ZXIgdGhlIHVwZGF0ZSwgZmFsc2VcbiAgICAgKiBvdGhlcndpc2UgKGNhbGxpbmcgdXBkYXRlIG9uIGEgcGF1c2VkIHR3ZWVuIHN0aWxsIHJldHVybnMgdHJ1ZSBiZWNhdXNlXG4gICAgICogaXQgaXMgc3RpbGwgcGxheWluZywganVzdCBwYXVzZWQpLlxuICAgICAqL1xuICAgIFR3ZWVuLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodGltZSwgYXV0b1N0YXJ0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRpbWUgPT09IHZvaWQgMCkgeyB0aW1lID0gbm93KCk7IH1cbiAgICAgICAgaWYgKGF1dG9TdGFydCA9PT0gdm9pZCAwKSB7IGF1dG9TdGFydCA9IHRydWU7IH1cbiAgICAgICAgaWYgKHRoaXMuX2lzUGF1c2VkKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciBwcm9wZXJ0eTtcbiAgICAgICAgdmFyIGVuZFRpbWUgPSB0aGlzLl9zdGFydFRpbWUgKyB0aGlzLl9kdXJhdGlvbjtcbiAgICAgICAgaWYgKCF0aGlzLl9nb1RvRW5kICYmICF0aGlzLl9pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgIGlmICh0aW1lID4gZW5kVGltZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYXV0b1N0YXJ0KVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQodGltZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZ29Ub0VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGltZSA8IHRoaXMuX3N0YXJ0VGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29uU3RhcnRDYWxsYmFja0ZpcmVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uU3RhcnRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRDYWxsYmFjayh0aGlzLl9vYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb25TdGFydENhbGxiYWNrRmlyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vbkV2ZXJ5U3RhcnRDYWxsYmFja0ZpcmVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uRXZlcnlTdGFydENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2sodGhpcy5fb2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29uRXZlcnlTdGFydENhbGxiYWNrRmlyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbGFwc2VkVGltZSA9IHRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XG4gICAgICAgIHZhciBkdXJhdGlvbkFuZERlbGF5ID0gdGhpcy5fZHVyYXRpb24gKyAoKF9hID0gdGhpcy5fcmVwZWF0RGVsYXlUaW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLl9kZWxheVRpbWUpO1xuICAgICAgICB2YXIgdG90YWxUaW1lID0gdGhpcy5fZHVyYXRpb24gKyB0aGlzLl9yZXBlYXQgKiBkdXJhdGlvbkFuZERlbGF5O1xuICAgICAgICB2YXIgY2FsY3VsYXRlRWxhcHNlZFBvcnRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuX2R1cmF0aW9uID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKGVsYXBzZWRUaW1lID4gdG90YWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGltZXNSZXBlYXRlZCA9IE1hdGgudHJ1bmMoZWxhcHNlZFRpbWUgLyBkdXJhdGlvbkFuZERlbGF5KTtcbiAgICAgICAgICAgIHZhciB0aW1lSW50b0N1cnJlbnRSZXBlYXQgPSBlbGFwc2VkVGltZSAtIHRpbWVzUmVwZWF0ZWQgKiBkdXJhdGlvbkFuZERlbGF5O1xuICAgICAgICAgICAgLy8gVE9ETyB1c2UgJT9cbiAgICAgICAgICAgIC8vIGNvbnN0IHRpbWVJbnRvQ3VycmVudFJlcGVhdCA9IGVsYXBzZWRUaW1lICUgZHVyYXRpb25BbmREZWxheVxuICAgICAgICAgICAgdmFyIHBvcnRpb24gPSBNYXRoLm1pbih0aW1lSW50b0N1cnJlbnRSZXBlYXQgLyBfdGhpcy5fZHVyYXRpb24sIDEpO1xuICAgICAgICAgICAgaWYgKHBvcnRpb24gPT09IDAgJiYgZWxhcHNlZFRpbWUgPT09IF90aGlzLl9kdXJhdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvcnRpb247XG4gICAgICAgIH07XG4gICAgICAgIHZhciBlbGFwc2VkID0gY2FsY3VsYXRlRWxhcHNlZFBvcnRpb24oKTtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZWFzaW5nRnVuY3Rpb24oZWxhcHNlZCk7XG4gICAgICAgIC8vIHByb3BlcnRpZXMgdHJhbnNmb3JtYXRpb25zXG4gICAgICAgIHRoaXMuX3VwZGF0ZVByb3BlcnRpZXModGhpcy5fb2JqZWN0LCB0aGlzLl92YWx1ZXNTdGFydCwgdGhpcy5fdmFsdWVzRW5kLCB2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLl9vblVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9vblVwZGF0ZUNhbGxiYWNrKHRoaXMuX29iamVjdCwgZWxhcHNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2R1cmF0aW9uID09PSAwIHx8IGVsYXBzZWRUaW1lID49IHRoaXMuX2R1cmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVwZWF0ID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZUNvdW50ID0gTWF0aC5taW4oTWF0aC50cnVuYygoZWxhcHNlZFRpbWUgLSB0aGlzLl9kdXJhdGlvbikgLyBkdXJhdGlvbkFuZERlbGF5KSArIDEsIHRoaXMuX3JlcGVhdCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmluaXRlKHRoaXMuX3JlcGVhdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwZWF0IC09IGNvbXBsZXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJlYXNzaWduIHN0YXJ0aW5nIHZhbHVlcywgcmVzdGFydCBieSBtYWtpbmcgc3RhcnRUaW1lID0gbm93XG4gICAgICAgICAgICAgICAgZm9yIChwcm9wZXJ0eSBpbiB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3lveW8gJiYgdHlwZW9mIHRoaXMuX3ZhbHVlc0VuZFtwcm9wZXJ0eV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgRklYTUU/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzU3RhcnRSZXBlYXRbcHJvcGVydHldICsgcGFyc2VGbG9hdCh0aGlzLl92YWx1ZXNFbmRbcHJvcGVydHldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5feW95bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3dhcEVuZFN0YXJ0UmVwZWF0VmFsdWVzKHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl95b3lvKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JldmVyc2VkID0gIXRoaXMuX3JldmVyc2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFRpbWUgKz0gZHVyYXRpb25BbmREZWxheSAqIGNvbXBsZXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uUmVwZWF0Q2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25SZXBlYXRDYWxsYmFjayh0aGlzLl9vYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9vbkV2ZXJ5U3RhcnRDYWxsYmFja0ZpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25Db21wbGV0ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ29tcGxldGVDYWxsYmFjayh0aGlzLl9vYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbnVtQ2hhaW5lZFR3ZWVucyA9IHRoaXMuX2NoYWluZWRUd2VlbnMubGVuZ3RoOyBpIDwgbnVtQ2hhaW5lZFR3ZWVuczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIGNoYWluZWQgdHdlZW5zIHN0YXJ0IGV4YWN0bHkgYXQgdGhlIHRpbWUgdGhleSBzaG91bGQsXG4gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgdGhlIGB1cGRhdGUoKWAgbWV0aG9kIHdhcyBjYWxsZWQgd2F5IHBhc3QgdGhlIGR1cmF0aW9uIG9mIHRoZSB0d2VlblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFpbmVkVHdlZW5zW2ldLnN0YXJ0KHRoaXMuX3N0YXJ0VGltZSArIHRoaXMuX2R1cmF0aW9uLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2lzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5fdXBkYXRlUHJvcGVydGllcyA9IGZ1bmN0aW9uIChfb2JqZWN0LCBfdmFsdWVzU3RhcnQsIF92YWx1ZXNFbmQsIHZhbHVlKSB7XG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIF92YWx1ZXNFbmQpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVwZGF0ZSBwcm9wZXJ0aWVzIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzb3VyY2Ugb2JqZWN0XG4gICAgICAgICAgICBpZiAoX3ZhbHVlc1N0YXJ0W3Byb3BlcnR5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBfdmFsdWVzU3RhcnRbcHJvcGVydHldIHx8IDA7XG4gICAgICAgICAgICB2YXIgZW5kID0gX3ZhbHVlc0VuZFtwcm9wZXJ0eV07XG4gICAgICAgICAgICB2YXIgc3RhcnRJc0FycmF5ID0gQXJyYXkuaXNBcnJheShfb2JqZWN0W3Byb3BlcnR5XSk7XG4gICAgICAgICAgICB2YXIgZW5kSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoZW5kKTtcbiAgICAgICAgICAgIHZhciBpc0ludGVycG9sYXRpb25MaXN0ID0gIXN0YXJ0SXNBcnJheSAmJiBlbmRJc0FycmF5O1xuICAgICAgICAgICAgaWYgKGlzSW50ZXJwb2xhdGlvbkxpc3QpIHtcbiAgICAgICAgICAgICAgICBfb2JqZWN0W3Byb3BlcnR5XSA9IHRoaXMuX2ludGVycG9sYXRpb25GdW5jdGlvbihlbmQsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdvYmplY3QnICYmIGVuZCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgRklYTUU/XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJvcGVydGllcyhfb2JqZWN0W3Byb3BlcnR5XSwgc3RhcnQsIGVuZCwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUGFyc2VzIHJlbGF0aXZlIGVuZCB2YWx1ZXMgd2l0aCBzdGFydCBhcyBiYXNlIChlLmcuOiArMTAsIC0zKVxuICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuX2hhbmRsZVJlbGF0aXZlVmFsdWUoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IG5vbiBudW1lcmljIHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIEZJWE1FP1xuICAgICAgICAgICAgICAgICAgICBfb2JqZWN0W3Byb3BlcnR5XSA9IHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLl9oYW5kbGVSZWxhdGl2ZVZhbHVlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQuY2hhckF0KDApID09PSAnKycgfHwgZW5kLmNoYXJBdCgwKSA9PT0gJy0nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBwYXJzZUZsb2F0KGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoZW5kKTtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5fc3dhcEVuZFN0YXJ0UmVwZWF0VmFsdWVzID0gZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgIHZhciB0bXAgPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV07XG4gICAgICAgIHZhciBlbmRWYWx1ZSA9IHRoaXMuX3ZhbHVlc0VuZFtwcm9wZXJ0eV07XG4gICAgICAgIGlmICh0eXBlb2YgZW5kVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV0gKyBwYXJzZUZsb2F0KGVuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1N0YXJ0UmVwZWF0W3Byb3BlcnR5XSA9IHRoaXMuX3ZhbHVlc0VuZFtwcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWVzRW5kW3Byb3BlcnR5XSA9IHRtcDtcbiAgICB9O1xuICAgIHJldHVybiBUd2Vlbjtcbn0oKSk7XG5cbnZhciBWRVJTSU9OID0gJzIzLjEuMyc7XG5cbi8qKlxuICogVHdlZW4uanMgLSBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2VlbmpzL3R3ZWVuLmpzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2VlbmpzL3R3ZWVuLmpzL2dyYXBocy9jb250cmlidXRvcnMgZm9yIHRoZSBmdWxsIGxpc3Qgb2YgY29udHJpYnV0b3JzLlxuICogVGhhbmsgeW91IGFsbCwgeW91J3JlIGF3ZXNvbWUhXG4gKi9cbnZhciBuZXh0SWQgPSBTZXF1ZW5jZS5uZXh0SWQ7XG4vKipcbiAqIENvbnRyb2xsaW5nIGdyb3VwcyBvZiB0d2VlbnNcbiAqXG4gKiBVc2luZyB0aGUgVFdFRU4gc2luZ2xldG9uIHRvIG1hbmFnZSB5b3VyIHR3ZWVucyBjYW4gY2F1c2UgaXNzdWVzIGluIGxhcmdlIGFwcHMgd2l0aCBtYW55IGNvbXBvbmVudHMuXG4gKiBJbiB0aGVzZSBjYXNlcywgeW91IG1heSB3YW50IHRvIGNyZWF0ZSB5b3VyIG93biBzbWFsbGVyIGdyb3VwcyBvZiB0d2VlbnMuXG4gKi9cbnZhciBUV0VFTiA9IG1haW5Hcm91cDtcbi8vIFRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGV4cG9ydCB0aGluZ3MgaW4gYSB3YXkgdGhhdCdzIGNvbXBhdGlibGUgd2l0aCBib3RoIEVTXG4vLyBNb2R1bGVzIGFuZCBDb21tb25KUywgd2l0aG91dCBidWlsZCBoYWNrcywgYW5kIHNvIGFzIG5vdCB0byBicmVhayB0aGVcbi8vIGV4aXN0aW5nIEFQSS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcm9sbHVwL2lzc3Vlcy8xOTYxI2lzc3VlY29tbWVudC00MjMwMzc4ODFcbnZhciBnZXRBbGwgPSBUV0VFTi5nZXRBbGwuYmluZChUV0VFTik7XG52YXIgcmVtb3ZlQWxsID0gVFdFRU4ucmVtb3ZlQWxsLmJpbmQoVFdFRU4pO1xudmFyIGFkZCA9IFRXRUVOLmFkZC5iaW5kKFRXRUVOKTtcbnZhciByZW1vdmUgPSBUV0VFTi5yZW1vdmUuYmluZChUV0VFTik7XG52YXIgdXBkYXRlID0gVFdFRU4udXBkYXRlLmJpbmQoVFdFRU4pO1xudmFyIGV4cG9ydHMgPSB7XG4gICAgRWFzaW5nOiBFYXNpbmcsXG4gICAgR3JvdXA6IEdyb3VwLFxuICAgIEludGVycG9sYXRpb246IEludGVycG9sYXRpb24sXG4gICAgbm93OiBub3csXG4gICAgU2VxdWVuY2U6IFNlcXVlbmNlLFxuICAgIG5leHRJZDogbmV4dElkLFxuICAgIFR3ZWVuOiBUd2VlbixcbiAgICBWRVJTSU9OOiBWRVJTSU9OLFxuICAgIGdldEFsbDogZ2V0QWxsLFxuICAgIHJlbW92ZUFsbDogcmVtb3ZlQWxsLFxuICAgIGFkZDogYWRkLFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIHVwZGF0ZTogdXBkYXRlLFxufTtcblxuZXhwb3J0IHsgRWFzaW5nLCBHcm91cCwgSW50ZXJwb2xhdGlvbiwgU2VxdWVuY2UsIFR3ZWVuLCBWRVJTSU9OLCBhZGQsIGV4cG9ydHMgYXMgZGVmYXVsdCwgZ2V0QWxsLCBuZXh0SWQsIG5vdywgcmVtb3ZlLCByZW1vdmVBbGwsIHVwZGF0ZSB9O1xuIiwiaW1wb3J0IHsgVHdlZW4sIEVhc2luZyB9IGZyb20gJ0B0d2VlbmpzL3R3ZWVuLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFR3ZWVuUmVzIGV4dGVuZHMgVHdlZW48YW55PiB7XG4gIG9uRGVzdHJveTogKGZuOiAoKSA9PiB2b2lkKSA9PiBhbnlcbiAgZGVzdHJveTogKCkgPT4gYW55XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0d2Vlbihmcm9tOiBhbnksIHRvOiBhbnksIGR1cmF0aW9uOiBudW1iZXIsIGVhc2luZyA9IEVhc2luZy5MaW5lYXIuTm9uZSkge1xuICBjb25zdCB0d2Vlbkluc3RhbmNlID0gbmV3IFR3ZWVuKGZyb20pLnRvKHRvLCBkdXJhdGlvbikuZWFzaW5nKGVhc2luZykuc3RhcnQoKSBhcyBUd2VlblJlc1xuXG4gIGZ1bmN0aW9uIGFuaW1hdGUodGltZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0d2Vlbkluc3RhbmNlLnVwZGF0ZSh0aW1lKSkgcmV0dXJuXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpXG4gIH1cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpXG5cbiAgcmV0dXJuIHR3ZWVuSW5zdGFuY2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWVuUHJvZ3Jlc3MoZHVyYXRpb246IG51bWJlciwgZWFzaW5nOiAoYW1vdW50OiBudW1iZXIpID0+IG51bWJlcikge1xuICByZXR1cm4gdHdlZW4oeyBwcm9ncmVzczogMCB9LCB7IHByb2dyZXNzOiAxIH0sIGR1cmF0aW9uLCBlYXNpbmcpXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIFBhaW50QnJ1c2hDb25maWdzIHtcbiAgY29udGFpbmVyPzogSFRNTERpdkVsZW1lbnRcbiAgY3VycmVudENvbG9yOiBzdHJpbmdcbiAgRFBSPzogbnVtYmVyLFxuICBvbkNsaWNrQ2xvc2U/OiAoKSA9PiB2b2lkLFxuICBvbkNsaWNrVW5kbz86ICgpID0+IHZvaWQsXG4gIG9uVW5kb1RleHQ/OiBzdHJpbmdcbiAgb25FeGl0VGV4dD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBQYWludEJydXNoRXZlbnRNYXAgPSB7XG4gIHJlYWR5Q2hhbmdlOiAocmVhZHk6IGJvb2xlYW4pID0+IHZvaWQsXG4gIHN0YXRlQ2hhbmdlOiAoc3RhdGU6IFBhaW50QnJ1c2hBY3Rpb24sIHVzZXJBY3Rpb246IGJvb2xlYW4pID0+IHZvaWQsXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBQYWludEJydXNoU3RhdGUge1xuICBtb3ZlOiB7eDogbnVtYmVyLCB5OiBudW1iZXJ9XG4gIGxpbmU6IHt4OiBudW1iZXIsIHk6IG51bWJlcn1bXVxuICBjb2xvcjogc3RyaW5nXG4gIHV1aWQ6IHN0cmluZ1xuICBkdXJhdGlvbjogbnVtYmVyIC8vIOWNleasoeeslOi/ueaXtumVv+i2hei/hzIwMDBtc+S4jeWKoOWKqOeUu1xufVxuXG5cbmV4cG9ydCBlbnVtIFBhaW50QnJ1c2hUeXBlRW51bSB7XG4gIERyYXdsaW5lPSdEcmF3bGluZScsXG4gIFVuZG89J1VuZG8nLFxuICBFeGl0PSdFeGl0Jyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWludEJydXNoQWN0aW9uIHtcbiAgdXVpZDogc3RyaW5nXG4gIC8qKlxuICAgKiDnsbvlnovmnprkuL5cbiAgICovXG4gIHR5cGU6IFBhaW50QnJ1c2hUeXBlRW51bVxuICAvKipcbiAgICog6aKc6Imy6Imy5YC8XG4gICAqL1xuICBjb2xvcjogc3RyaW5nXG4gIC8qKlxuICAgKiDmmK/lkKblsLHnu6pcbiAgICovXG4gIHJlYWR5OiBib29sZWFuXG4gIC8qKlxuICAgKiDnirbmgIHlgLxcbiAgICovXG4gIHN0YXRlPzogUGFpbnRCcnVzaFN0YXRlXG4gIC8qKlxuICAgKiDml7bpl7TmiLPvvJrlvZPkvZwgdXVpZCDkvb/nlKhcbiAgICovXG4gIHRpbWVzdGFtcD86IG51bWJlclxuICAvKipcbiAgICog5piv5ZCm5piv57uT5bC+5pWw5o2uXG4gICAqL1xuICBlbmQ/OiBib29sZWFuXG59XG4iLCIvLyB0eXBlIFVuaXF1ZVN5bWJvbCA9IFJldHVyblR5cGU8KGE6IHN0cmluZykgPT4geyByZWFkb25seSAwOiB1bmlxdWUgc3ltYm9sIH1bMF0+O1xuLy9cbi8vIGZ1bmN0aW9uIGNyZWF0ZVN5bWJvbChkZXNjcmlwdGlvbjogc3RyaW5nKTogVW5pcXVlU3ltYm9sIHtcbi8vICAgLy8gVE9ETyDop6PlhrPmj5DnpLpcbi8vICAgLy8gQHRzLWlnbm9yZVxuLy8gICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiA/IGAkU3ltYm9sPCR7ZGVzY3JpcHRpb259PiRgIDogU3ltYm9sKGRlc2NyaXB0aW9uKTtcbi8vIH1cbi8vXG4vLyBjb25zdCBFVkVOVF9TWU1CT0wgPSBjcmVhdGVTeW1ib2woXCIkJExJVkVfRVZFTlQkJFwiKVxuXG5jb25zdCBFVkVOVF9TWU1CT0w6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woXCIkJFBBSU5UX0JSVVNIX0VWRU5UJCRcIilcblxuZXhwb3J0IHR5cGUgRXZlbnRNYXAgPSB7XG4gIFtuYW1lOiBzdHJpbmddOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQgfCBib29sZWFuLFxufVxuXG5mdW5jdGlvbiBfX2dlbmVyYXRlRXZlbnRJZk5vdEV4aXN0ZWQ8VCBleHRlbmRzIEV2ZW50TWFwPihpbnN0YW5jZTogYW55KToge1xuICBbS2V5IGluIGtleW9mIFRdOiBbY2FsbGJhY2s6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFRbS2V5XT4pID0+IFJldHVyblR5cGU8VFtLZXldPiwgb25jZTogYm9vbGVhbl1bXVxufSB7XG4gIGlmICghaW5zdGFuY2VbRVZFTlRfU1lNQk9MXSkge1xuICAgIGluc3RhbmNlW0VWRU5UX1NZTUJPTF0gPSB7fVxuICB9XG4gIHJldHVybiBpbnN0YW5jZVtFVkVOVF9TWU1CT0xdXG59XG5cbmZ1bmN0aW9uIF9fcmVtb3ZlRXZlbnRJZk5vdEV4aXN0ZWQoaW5zdGFuY2U6IGFueSkge1xuICBpZiAoIWluc3RhbmNlW0VWRU5UX1NZTUJPTF0pIHtcbiAgICBkZWxldGUgaW5zdGFuY2VbRVZFTlRfU1lNQk9MXVxuICB9XG59XG5cbi8qKlxuICog55uR5ZCs6ICF5qih5byPXG4gKiBAdGVtcGxhdGUgVCDpooTorr7nmoTnm5HlkKzlm57osIPnsbvlnotcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIG5ldyBTdWJzY3JpYmU8e1xuICogXCJmb29cIjogW2FyZzE6IG51bWJlciwgYXJnMjogc3RyaW5nXSxcbiAqIFwiYmFyXCI6IFthcmc6IGJvb2xlYW5dLFxuICogfT4oKVxuICogYGBgXG4gKi9cbmNsYXNzIFN1YnNjcmliZTxUIGV4dGVuZHMgRXZlbnRNYXA+e1xuICAvKipcbiAgICog5Yik5pat5piv5ZCm5rOo5YaM5LqG5LqL5Lu2XG4gICAqIEBwYXJhbSBuYW1lICDkuovku7bnsbvlnotcbiAgICovXG4gIGhhc0xpc3RlbmVyKG5hbWU6IGtleW9mIFQpOiBib29sZWFuIHtcbiAgICBjb25zdCBldmVudHMgPSBfX2dlbmVyYXRlRXZlbnRJZk5vdEV4aXN0ZWQ8VD4odGhpcylcbiAgICByZXR1cm4gZXZlbnRzICYmIGV2ZW50c1tuYW1lXSAmJiBldmVudHNbbmFtZV0ubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tlxuICAgKiBAcGFyYW0gIG5hbWUgICAg5LqL5Lu257G75Z6LXG4gICAqIEBwYXJhbSAgY2FsbGJhY2sg5LqL5Lu25Zue6LCD5Ye95pWwXG4gICAqIEBwYXJhbSAgb25jZSAgICAg5piv5ZCm5Y+q5omn6KGM5LiA5qyhXG4gICAqIEByZXR1cm5zIOino+mZpOS6i+S7tlxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICogQHRlbXBsYXRlIEMg5Zue6LCD5Ye95pWw5Ye95pWw5LiK5LiL5paHXG4gICAqL1xuICBvbjxLIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgbmFtZTogSyxcbiAgICBjYWxsYmFjazogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IFJldHVyblR5cGU8VFtLXT4sXG4gICAgb25jZT86IGJvb2xlYW5cbiAgKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3QgZXZlbnRzID0gX19nZW5lcmF0ZUV2ZW50SWZOb3RFeGlzdGVkPFQ+KHRoaXMpXG4gICAgaWYgKCFldmVudHNbbmFtZV0pIGV2ZW50c1tuYW1lXSA9IFtdXG4gICAgZXZlbnRzW25hbWVdLnB1c2goW2NhbGxiYWNrIGFzIGFueSwgb25jZSB8fCBmYWxzZV0pXG4gICAgcmV0dXJuICgpID0+IHRoaXMub2ZmKG5hbWUsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tijmmK/lkKblj6rmiafooYzkuIDmrKEpXG4gICAqIEBwYXJhbSAgbmFtZSAgICAg5LqL5Lu257G75Z6LXG4gICAqIEBwYXJhbSAgY2FsbGJhY2sg5LqL5Lu25Zue6LCD5Ye95pWwXG4gICAqIEByZXR1cm5zIOino+mZpOS6i+S7tlxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICogQHRlbXBsYXRlIEMg5Zue6LCD5Ye95pWw5Ye95pWw5LiK5LiL5paHXG4gICAqL1xuICBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICBuYW1lOiBLLFxuICAgIGNhbGxiYWNrOiAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gUmV0dXJuVHlwZTxUW0tdPixcbiAgKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMub24obmFtZSwgY2FsbGJhY2ssIHRydWUpXG4gIH1cblxuICAvKipcbiAgICog6Kej6Zmk5LqL5Lu2XG4gICAqXG4gICAqIOWmguaenCBuYW1lIOS4jeS8oOeahOivneino+mZpOWvueW6lOaJgOacieS6i+S7tlxuICAgKiDlpoLmnpwgbmFtZSwgY2FsbGJhY2sg5LiN5Lyg55qE6K+d6Kej6Zmk5omA5pyJbmFtZeeahOaJgOacieS6i+S7tlxuICAgKiBAcGFyYW0gIG5hbWUgICAgIOS6i+S7tuexu+Wei1xuICAgKiBAcGFyYW0gIGNhbGxiYWNrIOS6i+S7tuWbnuiwg+WHveaVsFxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICovXG4gIG9mZjxLIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgbmFtZT86IEssXG4gICAgY2FsbGJhY2s/OiAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gUmV0dXJuVHlwZTxUW0tdPlxuICApOiB2b2lkIHtcbiAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBfX3JlbW92ZUV2ZW50SWZOb3RFeGlzdGVkKHRoaXMpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZXZlbnRzID0gX19nZW5lcmF0ZUV2ZW50SWZOb3RFeGlzdGVkPFQ+KHRoaXMpXG4gICAgaWYgKCFldmVudHNbbmFtZV0pIGV2ZW50c1tuYW1lXSA9IFtdXG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGV2ZW50c1tuYW1lXS5sZW5ndGggPSAwXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbGV0IGluZGV4ID0gMFxuICAgIGZvciAoOyBpbmRleCA8IGV2ZW50c1tuYW1lXS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmIChldmVudHNbbmFtZV1baW5kZXhdWzBdID09PSBjYWxsYmFjaykgYnJlYWtcbiAgICB9XG4gICAgaWYgKGluZGV4IDwgZXZlbnRzW25hbWVdLmxlbmd0aCkge1xuICAgICAgZXZlbnRzW25hbWVdLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6Kem5Y+R5LqL5Lu2XG4gICAqIEBwYXJhbSAgbmFtZSAg5LqL5Lu257G75Z6LXG4gICAqIEBwYXJhbSAgZGF0YSAg6Kem5Y+R5LqL5Lu255qE5pWw5o2uXG4gICAqIEByZXR1cm5zIGNhbmNlbGVkIOaYr+WQpuiiq+inpuWPkeWPlua2iFxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICovXG4gIGVtaXQ8SyBleHRlbmRzIGtleW9mIFQ+KG5hbWU6IEssIC4uLmRhdGE6IFBhcmFtZXRlcnM8VFtLXT4pOiBib29sZWFuIHtcbiAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZVxuICAgIGNvbnN0IGV2ZW50cyA9IF9fZ2VuZXJhdGVFdmVudElmTm90RXhpc3RlZDxUPih0aGlzKVxuICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRzW25hbWVdIHx8IFtdXG4gICAgZm9yIChsZXQgb25lIG9mIGV2ZW50LnNsaWNlKCkpIHtcbiAgICAgIGNvbnN0IFtjYWxsYmFjaywgb25jZSA9IGZhbHNlXSA9IG9uZVxuICAgICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2soLi4uZGF0YSlcbiAgICAgIGlmIChvbmNlKSB0aGlzLm9mZihuYW1lLCBjYWxsYmFjaylcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSBjYW5jZWxlZCA9IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGNhbmNlbGVkXG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTdWJzY3JpYmVNaXhpblR5cGUge1xuICBleHBvcnQgaW50ZXJmYWNlIGhhc0xpc3RlbmVyPFQgZXh0ZW5kcyBFdmVudE1hcD4ge1xuICAgIChuYW1lOiBrZXlvZiBUKTogYm9vbGVhblxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2Ugb248VCBleHRlbmRzIEV2ZW50TWFwPiB7XG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICAgIG5hbWU6IEssXG4gICAgICBjYWxsYmFjazogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IFJldHVyblR5cGU8VFtLXT4sXG4gICAgICBvbmNlPzogYm9vbGVhblxuICAgICk6ICgpID0+IHZvaWRcbiAgfVxuICBleHBvcnQgaW50ZXJmYWNlIG9uY2U8VCBleHRlbmRzIEV2ZW50TWFwPiB7XG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICAgIG5hbWU6IEssXG4gICAgICBjYWxsYmFjazogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IFJldHVyblR5cGU8VFtLXT4sXG4gICAgKTogKCkgPT4gdm9pZFxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2Ugb2ZmPFQgZXh0ZW5kcyBFdmVudE1hcD4ge1xuICAgIDxLIGV4dGVuZHMga2V5b2YgVD4obmFtZXM/OiBLIHwgS1tdLCBjYWxsYmFjaz86ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogdm9pZFxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2UgZW1pdDxUIGV4dGVuZHMgRXZlbnRNYXA+IHtcbiAgICA8SyBleHRlbmRzIGtleW9mIFQ+KG5hbWU6IEssIC4uLmRhdGE6IFBhcmFtZXRlcnM8VFtLXT4pOiBib29sZWFuXG4gIH1cbn1cblxuZXhwb3J0IHsgU3Vic2NyaWJlIH1cbiIsIi8vIHV1aWRcbmZ1bmN0aW9uIFM0KCkge1xuICByZXR1cm4gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkgfCAwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpXG59XG4vKipcbiAqIOmaj+acuueUn+aIkOS4gOS4qnV1aWTlgLxcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1dWlkKCkge1xuICAvLyB0aGVuIHRvIGNhbGwgaXQsIHBsdXMgc3RpdGNoIGluICc0JyBpbiB0aGUgdGhpcmQgZ3JvdXBcbiAgcmV0dXJuIChTNCgpICsgUzQoKSArICctJyArIFM0KCkgKyAnLTQnICsgUzQoKS5zdWJzdHIoMCwgMykgKyAnLScgKyBTNCgpICsgJy0nICsgUzQoKSArIFM0KCkgKyBTNCgpKS50b0xvd2VyQ2FzZSgpXG59XG5cbmV4cG9ydCB7IHV1aWQgfVxuIiwiY29uc3QgUGFpbnRCcnVzaFN0eWxlID0gYFxuPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPlxuXG4jX2dsX3BhaW50QnJ1c2gge1xucG9zaXRpb246IGZpeGVkO1xudG9wOiAwO1xuYm90dG9tOiAwO1xubGVmdDogMDtcbnJpZ2h0OiAwO1xudHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApO1xuei1pbmRleDogMTk5NztcbnBvaW50ZXItZXZlbnRzOiBub25lO1xub3BhY2l0eTogMDtcbnRyYW5zaXRpb246IGFsbCA1MDBtcztcbn1cblxuI19nbF9wYWludEJydXNoLmJydXNoaW5nIHtcbiAgb3BhY2l0eTogMTtcbn1cblxuI19nbF9wYWludEJydXNoIC5fcGFpbnRCcnVzaC1jYW52YXMge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbn1cblxuI19nbF9wYWludEJydXNoIC5fcGFpbnRCcnVzaC1jYW52YXMtLXN5bmMge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgei1pbmRleDogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG59XG5cbiNfZ2xfcGFpbnRCcnVzaCAuX3BhaW50QnJ1c2gtY2FudmFzIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHotaW5kZXg6IDE7XG59XG5cbiNfZ2xfcGFpbnRCcnVzaC5icnVzaGluZyAuX3BhaW50QnJ1c2gtY2FudmFzIHtcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbiNfZ2xfcGFpbnRCcnVzaCAuX3BhaW50QnJ1c2gtY3RybCB7XG4gIHdpZHRoOiAxNDBweDtcbiAgaGVpZ2h0OiA1MnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMjhweDtcbiAgcmlnaHQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDUwJSk7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgY29sb3I6IHdoaXRlO1xuICB6LWluZGV4OiAyO1xufVxuXG4jX2dsX3BhaW50QnJ1c2guYnJ1c2hpbmcgLl9wYWludEJydXNoLWN0cmwge1xuICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuI19nbF9wYWludEJydXNoIC5fcGFpbnRCcnVzaC1jdHJsIC5fcGFpbnRCcnVzaC1jdHJsaW5uZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDI2cHg7XG4gIHBhZGRpbmc6IDhweCAxNnB4O1xuICBib3gtc2hhZG93OiAwIDJweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCBoc2woMGRlZyAwJSAwJSAvIDU3JSksIGhzbCgwZGVnIDAlIDAlIC8gNzAlKSAxMTclKTtcbn1cblxuLl9wYWludEJydXNoLWN0cmxpdGVtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiAzOHB4O1xuICBoZWlnaHQ6IDM4cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLl9wYWludEJydXNoLWN0cmxpdGVtLS11bmRvID4uYnJ1c2gtaWNvbntcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejRLUEhOMlp5QjNhV1IwYUQwaU1qSndlQ0lnYUdWcFoyaDBQU0l5TW5CNElpQjJhV1YzUW05NFBTSXdJREFnTWpJZ01qSWlJSFpsY25OcGIyNDlJakV1TVNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUkrQ2lBZ0lDQThaR1ZtY3o0S0lDQWdJQ0FnSUNBOGJHbHVaV0Z5UjNKaFpHbGxiblFnZURFOUlqVXdKU0lnZVRFOUlqUTFMalkzTlRJME9DVWlJSGd5UFNJdE1UWXVPVFl4TURJekpTSWdlVEk5SWpnMExqSXpPRFF4T1RnbElpQnBaRDBpYkdsdVpXRnlSM0poWkdsbGJuUXRNU0krQ2lBZ0lDQWdJQ0FnSUNBZ0lEeHpkRzl3SUhOMGIzQXRZMjlzYjNJOUlpTkdSa1pHUmtZaUlHOW1abk5sZEQwaU1DVWlQand2YzNSdmNENEtJQ0FnSUNBZ0lDQWdJQ0FnUEhOMGIzQWdjM1J2Y0MxamIyeHZjajBpSTBaR1JrWkdSaUlnYzNSdmNDMXZjR0ZqYVhSNVBTSXdMak13TXpZM05qYzVNaUlnYjJabWMyVjBQU0l4TURBbElqNDhMM04wYjNBK0NpQWdJQ0FnSUNBZ1BDOXNhVzVsWVhKSGNtRmthV1Z1ZEQ0S0lDQWdJRHd2WkdWbWN6NEtJQ0FnSUR4bklITjBjbTlyWlQwaWJtOXVaU0lnYzNSeWIydGxMWGRwWkhSb1BTSXhJaUJtYVd4c1BTSnViMjVsSWlCbWFXeHNMWEoxYkdVOUltVjJaVzV2WkdRaVBnb2dJQ0FnSUNBZ0lEeG5JSFJ5WVc1elptOXliVDBpZEhKaGJuTnNZWFJsS0MweE5EQXVNREF3TURBd0xDQXROelF3TGpBd01EQXdNQ2tpUGdvZ0lDQWdJQ0FnSUNBZ0lDQThaeUIwY21GdWMyWnZjbTA5SW5SeVlXNXpiR0YwWlNneE5EQXVNREF3TURBd0xDQTNOREF1TURBd01EQXdLU0krQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4Y21WamRDQm1hV3hzUFNJalJEaEVPRVE0SWlCdmNHRmphWFI1UFNJd0lpQjRQU0l3SWlCNVBTSXdJaUIzYVdSMGFEMGlNaklpSUdobGFXZG9kRDBpTWpJaVBqd3ZjbVZqZEQ0S0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUR4bklIUnlZVzV6Wm05eWJUMGlkSEpoYm5Oc1lYUmxLRFF1TURBd01EQXdMQ0F5TGprNU1EWTFPU2tpSUhOMGNtOXJaUzFzYVc1bFkyRndQU0p5YjNWdVpDSWdjM1J5YjJ0bExYZHBaSFJvUFNJeUlqNEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4Y0dGMGFDQmtQU0pOTUN3ekxqYzFPRGMxTnpBNUlFdzVMamcwTXpjMUxETXVOelU0TnpVM01Ea2dRekV5TGpZNU1UUTJPRElzTXk0M05UZzNOVGN3T1NBeE5TdzJMakEyTnpJNE9EZzFJREUxTERndU9URTFNREEzTURrZ1F6RTFMREV4TGpjMk1qY3lOVE1nTVRJdU5qa3hORFk0TWl3eE5DNHdOekV5TlRjeElEa3VPRFF6TnpVc01UUXVNRGN4TWpVM01TQk1NU3d4TkM0d056RXlOVGN4SWlCemRISnZhMlU5SW5WeWJDZ2piR2x1WldGeVIzSmhaR2xsYm5RdE1Ta2lQand2Y0dGMGFENEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4Y0c5c2VXeHBibVVnYzNSeWIydGxQU0lqUmtaR1JrWkdJaUJ6ZEhKdmEyVXRiR2x1WldwdmFXNDlJbkp2ZFc1a0lpQndiMmx1ZEhNOUlqTXVOemt3TWpJM01EY2dOeTQxTXprMk5qQTJOQ0F3SURNdU56VTROelUzTURrZ015NDNPVEF5TWpjd055QXdJajQ4TDNCdmJIbHNhVzVsUGdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnUEM5blBnb2dJQ0FnSUNBZ0lDQWdJQ0E4TDJjK0NpQWdJQ0FnSUNBZ1BDOW5QZ29nSUNBZ1BDOW5QZ284TDNOMlp6ND0pO1xuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJTtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG59XG5cbi5fcGFpbnRCcnVzaC1jdHJsaXRlbS0tY2xvc2UgPi5icnVzaC1pY29uIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejRLUEhOMlp5QjNhV1IwYUQwaU1qSndlQ0lnYUdWcFoyaDBQU0l5TW5CNElpQjJhV1YzUW05NFBTSXdJREFnTWpJZ01qSWlJSFpsY25OcGIyNDlJakV1TVNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUkrQ2lBZ0lDQThaR1ZtY3o0S0lDQWdJQ0FnSUNBOGJHbHVaV0Z5UjNKaFpHbGxiblFnZURFOUlqVXdMakF5TURZNU15VWlJSGt4UFNJdE1UTXVOek16TXpjMU1TVWlJSGd5UFNJMU1DVWlJSGt5UFNJeE1UUXVNVEV3T1RrMEpTSWdhV1E5SW14cGJtVmhja2R5WVdScFpXNTBMVEVpUGdvZ0lDQWdJQ0FnSUNBZ0lDQThjM1J2Y0NCemRHOXdMV052Ykc5eVBTSWpSa1pHUmtaR0lpQnZabVp6WlhROUlqQWxJajQ4TDNOMGIzQStDaUFnSUNBZ0lDQWdJQ0FnSUR4emRHOXdJSE4wYjNBdFkyOXNiM0k5SWlOR1JrWkdSa1lpSUhOMGIzQXRiM0JoWTJsMGVUMGlNQzQyTURFd05ETTBPRGdpSUc5bVpuTmxkRDBpTkRrdU16QTRORGc0TWlVaVBqd3ZjM1J2Y0Q0S0lDQWdJQ0FnSUNBZ0lDQWdQSE4wYjNBZ2MzUnZjQzFqYjJ4dmNqMGlJMFpHUmtaR1JpSWdiMlptYzJWMFBTSXhNREFsSWo0OEwzTjBiM0ErQ2lBZ0lDQWdJQ0FnUEM5c2FXNWxZWEpIY21Ga2FXVnVkRDRLSUNBZ0lDQWdJQ0E4YkdsdVpXRnlSM0poWkdsbGJuUWdlREU5SWpVd0pTSWdlVEU5SWpBbElpQjRNajBpTlRBbElpQjVNajBpTVRBd0pTSWdhV1E5SW14cGJtVmhja2R5WVdScFpXNTBMVElpUGdvZ0lDQWdJQ0FnSUNBZ0lDQThjM1J2Y0NCemRHOXdMV052Ykc5eVBTSWpSa1pHUmtaR0lpQnZabVp6WlhROUlqQWxJajQ4TDNOMGIzQStDaUFnSUNBZ0lDQWdJQ0FnSUR4emRHOXdJSE4wYjNBdFkyOXNiM0k5SWlOR1JrWkdSa1lpSUc5bVpuTmxkRDBpTlRVdU9UWTRNVFV6TlNVaVBqd3ZjM1J2Y0Q0S0lDQWdJQ0FnSUNBZ0lDQWdQSE4wYjNBZ2MzUnZjQzFqYjJ4dmNqMGlJMFpHUmtaR1JpSWdiMlptYzJWMFBTSXhNREFsSWo0OEwzTjBiM0ErQ2lBZ0lDQWdJQ0FnUEM5c2FXNWxZWEpIY21Ga2FXVnVkRDRLSUNBZ0lEd3ZaR1ZtY3o0S0lDQWdJRHhuSUhOMGNtOXJaVDBpYm05dVpTSWdjM1J5YjJ0bExYZHBaSFJvUFNJeElpQm1hV3hzUFNKdWIyNWxJaUJtYVd4c0xYSjFiR1U5SW1WMlpXNXZaR1FpUGdvZ0lDQWdJQ0FnSUR4blBnb2dJQ0FnSUNBZ0lDQWdJQ0E4Y21WamRDQm1hV3hzUFNJalJEaEVPRVE0SWlCdmNHRmphWFI1UFNJd0lpQjRQU0l3SWlCNVBTSXdJaUIzYVdSMGFEMGlNaklpSUdobGFXZG9kRDBpTWpJaVBqd3ZjbVZqZEQ0S0lDQWdJQ0FnSUNBZ0lDQWdQR2NnZEhKaGJuTm1iM0p0UFNKMGNtRnVjMnhoZEdVb05DNHdNREF3TURBc0lEVXVNREF3TURBd0tTSWdabWxzYkMxeWRXeGxQU0p1YjI1NlpYSnZJajRLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRHhuUGdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lEeHdZWFJvSUdROUlrMDNMQzB5TGprNE9ERTJOVFk0SUVNM0xqVXhNamd6TlRnMExDMHlMams0T0RFMk5UWTRJRGN1T1RNMU5UQTNNVFlzTFRJdU5qQXlNVEkxTkRrZ055NDVPVE15TnpJeU55d3RNaTR4TURRM09EWTRNU0JNT0N3dE1TNDVPRGd4TmpVMk9DQk1PQ3d4TXk0NU9UZ3hNVFEySUVNNExERTBMalUxTURNNU9UTWdOeTQxTlRJeU9EUTNOU3d4TkM0NU9UZ3hNVFEySURjc01UUXVPVGs0TVRFME5pQkROaTQwT0RjeE5qUXhOaXd4TkM0NU9UZ3hNVFEySURZdU1EWTBORGt5T0RRc01UUXVOakV5TURjME5DQTJMakF3TmpjeU56Y3pMREUwTGpFeE5EY3pOVGNnVERZc01UTXVPVGs0TVRFME5pQk1OaXd0TVM0NU9EZ3hOalUyT0NCRE5pd3RNaTQxTkRBME5UQTBNeUEyTGpRME56Y3hOVEkxTEMweUxqazRPREUyTlRZNElEY3NMVEl1T1RnNE1UWTFOamdnV2lJZ1ptbHNiRDBpZFhKc0tDTnNhVzVsWVhKSGNtRmthV1Z1ZEMweEtTSWdkSEpoYm5ObWIzSnRQU0owY21GdWMyeGhkR1VvTnk0d01EQXdNREFzSURZdU1EQTBPVGMwS1NCeWIzUmhkR1VvTFRRMUxqQXdNREF3TUNrZ2RISmhibk5zWVhSbEtDMDNMakF3TURBd01Dd2dMVFl1TURBME9UYzBLU0FpUGp3dmNHRjBhRDRLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBOGNHRjBhQ0JrUFNKTk55d3RNaTQ1T0RneE5qVTJPQ0JETnk0MU1USTRNelU0TkN3dE1pNDVPRGd4TmpVMk9DQTNMamt6TlRVd056RTJMQzB5TGpZd01qRXlOVFE1SURjdU9Ua3pNamN5TWpjc0xUSXVNVEEwTnpnMk9ERWdURGdzTFRFdU9UZzRNVFkxTmpnZ1REZ3NNVE11T1RrNE1URTBOaUJET0N3eE5DNDFOVEF6T1RreklEY3VOVFV5TWpnME56VXNNVFF1T1RrNE1URTBOaUEzTERFMExqazVPREV4TkRZZ1F6WXVORGczTVRZME1UWXNNVFF1T1RrNE1URTBOaUEyTGpBMk5EUTVNamcwTERFMExqWXhNakEzTkRRZ05pNHdNRFkzTWpjM015d3hOQzR4TVRRM016VTNJRXcyTERFekxqazVPREV4TkRZZ1REWXNMVEV1T1RnNE1UWTFOamdnUXpZc0xUSXVOVFF3TkRVd05ETWdOaTQwTkRjM01UVXlOU3d0TWk0NU9EZ3hOalUyT0NBM0xDMHlMams0T0RFMk5UWTRJRm9pSUdacGJHdzlJblZ5YkNnamJHbHVaV0Z5UjNKaFpHbGxiblF0TWlraUlIUnlZVzV6Wm05eWJUMGlkSEpoYm5Oc1lYUmxLRGN1TURBd01EQXdMQ0EyTGpBd05EazNOQ2tnY205MFlYUmxLQzB4TXpVdU1EQXdNREF3S1NCMGNtRnVjMnhoZEdVb0xUY3VNREF3TURBd0xDQXROaTR3TURRNU56UXBJQ0krUEM5d1lYUm9QZ29nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdQQzluUGdvZ0lDQWdJQ0FnSUNBZ0lDQThMMmMrQ2lBZ0lDQWdJQ0FnUEM5blBnb2dJQ0FnUEM5blBnbzhMM04yWno0PSk7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlO1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbn1cblxuPC9zdHlsZT5cbmBcblxuZXhwb3J0IGRlZmF1bHQgUGFpbnRCcnVzaFN0eWxlXG4iLCJpbXBvcnQge1xuICBxdWV1ZSxcbiAgZXhlY0ludGVydmFsLFxuICB0cmFuc2Zvcm1Db29yZHMsXG4gIHVuVHJhbnNmb3JtQ29vcmRzLFxuICBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50LFxuICBub29wLFxuICB0eXBlIENvb3JkcyxcbiAgbmV4dEZyYW1lLFxufSBmcm9tICcuL3V0aWxzJ1xuXG5pbXBvcnQgdHdlZW4sIHsgdHlwZSBUd2VlblJlcyB9IGZyb20gJy4vdHdlZW4nXG5cbmltcG9ydCB7XG4gIHR5cGUgUGFpbnRCcnVzaEFjdGlvbixcbiAgdHlwZSBQYWludEJydXNoQ29uZmlncyxcbiAgdHlwZSBQYWludEJydXNoRXZlbnRNYXAsXG4gIHR5cGUgUGFpbnRCcnVzaFN0YXRlLFxuICBQYWludEJydXNoVHlwZUVudW0sXG59IGZyb20gJy4vdHlwaW5ncydcblxuaW1wb3J0IHsgU3Vic2NyaWJlIH0gZnJvbSAnLi9TdWJzY3JpYmUnXG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnLi4vLi4vc2hhcmVkLXV0aWxzL3V1aWQnXG5pbXBvcnQgUGFpbnRCcnVzaFN0eWxlIGZyb20gJy4vc3R5bGUnXG5cbmV4cG9ydCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgU3Vic2NyaWJlPFBhaW50QnJ1c2hFdmVudE1hcD4ge1xuICBjb25maWdzOiBQYWludEJydXNoQ29uZmlnc1xuXG4gcHJpdmF0ZSBjbGllbnRXaWR0aDogbnVtYmVyXG4gcHJpdmF0ZSBjbGllbnRIZWlnaHQ6IG51bWJlclxuXG4gcHJpdmF0ZSByZWFkeSA9IGZhbHNlXG5cbiBwcml2YXRlIHV1aWQgPSB1dWlkKClcbiBwcml2YXRlIHR3ZWVuPzogVHdlZW5SZXNcbiBwcml2YXRlIHR3ZWVuaW5nID0gZmFsc2VcblxuIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudFxuIHByaXZhdGUgY2FudmFzOiBSZWNvcmQ8c3RyaW5nLCBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZD5cbiBwcml2YXRlIGRhdGE6IFJlY29yZDxzdHJpbmcsIFBhaW50QnJ1c2hTdGF0ZVtdPiA9IHt9XG4gcHJpdmF0ZSB0ZW1wTGluZTogUmVjb3JkPHN0cmluZywgQ29vcmRzW10+ID0ge31cblxuICBnZXQgY29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlncy5jdXJyZW50Q29sb3JcbiAgfVxuXG4gIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhXG4gIH1cblxuICBnZXQgZHByKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3MuRFBSIHx8IDFcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3M6IFBhaW50QnJ1c2hDb25maWdzKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuY29uZmlncyA9IGNvbmZpZ3NcblxuICAgIHRoaXMuY2xpZW50V2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoXG4gICAgdGhpcy5jbGllbnRIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodFxuXG4gICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmlmSW5zZXJ0VG9ET00oKVxuICAgIHRoaXMuY2FudmFzID0ge31cbiAgICB0aGlzLmluaXRDdHJsKClcbiAgfVxuXG4gIGlmSW5zZXJ0VG9ET00oKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXJcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlncy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMuY29uZmlncy5jb250YWluZXIuaWQgPSAnX2dsX3BhaW50QnJ1c2gnXG4gICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuY29uZmlncy5jb250YWluZXJcbiAgICB9IGVsc2UgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX2dsX3BhaW50QnJ1c2gnKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgIGNvbnRhaW5lci5pZCA9ICdfZ2xfcGFpbnRCcnVzaCdcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKVxuICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXJcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX2dsX3BhaW50QnJ1c2gnKSBhcyBIVE1MRGl2RWxlbWVudFxuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9IFBhaW50QnJ1c2hTdHlsZVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSDliJ3lp4vljJbnlLvmnb9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGluaXRDYW52YXMoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgIGNhbnZhcy5jbGFzc05hbWUgPSBjbGFzc05hbWVcbiAgICBjYW52YXMud2lkdGggPSB0aGlzLmNsaWVudFdpZHRoXG4gICAgY2FudmFzLmhlaWdodCA9IHRoaXMuY2xpZW50SGVpZ2h0XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICBpZiAoIWN0eCkgcmV0dXJuXG4gICAgY3R4LmxpbmVXaWR0aCA9IDUgKiB0aGlzLmRwclxuICAgIGN0eC5saW5lQ2FwID0gJ3JvdW5kJ1xuICAgIGN0eC5saW5lSm9pbiA9ICdyb3VuZCdcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpXG4gICAgcmV0dXJuIGNhbnZhc1xuICB9XG5cblxuICAvKipcbiAgICog5Yid5aeL5YyW5pON5L2c6Z2i5p2/XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBpbml0Q3RybCgpIHtcbiAgICBjb25zdCBjdHJsOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgY3RybC5jbGFzc05hbWUgPSAnX3BhaW50QnJ1c2gtY3RybCdcbiAgICBjb25zdCBjdHJsX2lubmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgY3RybF9pbm5lci5jbGFzc05hbWUgPSAnX3BhaW50QnJ1c2gtY3RybGlubmVyJ1xuXG4gICAgY29uc3QgYV91bmRvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgYV91bmRvLmNsYXNzTmFtZSA9ICdfcGFpbnRCcnVzaC1jdHJsaXRlbSBfcGFpbnRCcnVzaC1jdHJsaXRlbS0tdW5kbydcbiAgICBhX3VuZG8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICAgICAvLyDngrnlh7vmkqTlm57vvJrkvpvln4vngrnkvb/nlKhcbiAgICAgIGlmICh0aGlzLmNvbmZpZ3Mub25DbGlja1VuZG8pIHtcbiAgICAgICAgdGhpcy5jb25maWdzLm9uQ2xpY2tVbmRvKClcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmNhbnZhc1t0aGlzLnV1aWRdIHx8ICF0aGlzLmRhdGFbdGhpcy51dWlkXSB8fCB0aGlzLmRhdGFbdGhpcy51dWlkXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBwb3BTdGF0ZSA9IHRoaXMuZGF0YVt0aGlzLnV1aWRdLnBvcCgpXG5cbiAgICAgIGlmIChwb3BTdGF0ZSkge1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSh7XG4gICAgICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLlVuZG8sXG4gICAgICAgICAgY29sb3I6IHRoaXMuY29sb3IsXG4gICAgICAgICAgcmVhZHk6IHRoaXMucmVhZHksXG4gICAgICAgICAgc3RhdGU6IHBvcFN0YXRlLFxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgJGN0eCA9IHRoaXMuY2FudmFzW3RoaXMudXVpZF0/LmdldENvbnRleHQoJzJkJylcbiAgICAgIGlmICghdGhpcy5jYW52YXNbdGhpcy51dWlkXSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5jYW52YXNbdGhpcy51dWlkXSFcbiAgICAgIGlmICgkY3R4KSB7XG4gICAgICAgICRjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpXG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXS5mb3JFYWNoKChsZDogYW55KSA9PiB0aGlzLmhhbmRsZURyYXdMaW5lKHRoaXMudXVpZCwgbGQsIHsgd2l0aFVuZG86IHRydWUgfSkpXG5cbiAgICB9KVxuICAgIGNvbnN0IGFfY2xvc2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBhX2Nsb3NlLmNsYXNzTmFtZSA9ICdfcGFpbnRCcnVzaC1jdHJsaXRlbSBfcGFpbnRCcnVzaC1jdHJsaXRlbS0tY2xvc2UnXG4gICAgYV9jbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICB0aGlzLmNsb3NlQnJ1c2goKVxuICAgICAgLy8g54K55Ye75YWz6Zet77ya5L6b5Z+L54K55L2/55SoXG4gICAgICBpZiAodGhpcy5jb25maWdzLm9uQ2xpY2tDbG9zZSkge1xuICAgICAgICB0aGlzLmNvbmZpZ3Mub25DbGlja0Nsb3NlKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgJEEgPSBbYV91bmRvLCBhX2Nsb3NlXVxuICAgICRBLmZvckVhY2goKCRhKSA9PiB7XG4gICAgICBjb25zdCAkaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKVxuICAgICAgJGkuY2xhc3NOYW1lID0gJ2JydXNoLWljb24nXG4gICAgICBjb25zdCAkc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuICAgICAgJHNwYW4uY2xhc3NOYW1lID0gJ2JydXNoLXR4dCdcblxuICAgICAgJHNwYW4uaW5uZXJUZXh0ID0gJGEuY2xhc3NOYW1lLmVuZHNXaXRoKCd1bmRvJykgPyB0aGlzLmNvbmZpZ3Mub25VbmRvVGV4dCA6IHRoaXMuY29uZmlncy5vbkV4aXRUZXh0XG4gICAgICAkYS5hcHBlbmRDaGlsZCgkaSlcbiAgICAgICRhLmFwcGVuZENoaWxkKCRzcGFuKVxuICAgIH0pXG5cbiAgICBjdHJsX2lubmVyLmFwcGVuZENoaWxkKGFfdW5kbylcbiAgICBjdHJsX2lubmVyLmFwcGVuZENoaWxkKGFfY2xvc2UpXG4gICAgY3RybC5hcHBlbmRDaGlsZChjdHJsX2lubmVyKVxuXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoY3RybClcblxuICAgIHJldHVybiBjdHJsXG4gIH1cblxuICBvcGVuQnJ1c2goKSB7XG4gICAgaWYgKHRoaXMucmVhZHkpIHJldHVyblxuICAgIGlmICghdGhpcy5jYW52YXNbdGhpcy51dWlkXSkge1xuICAgICAgdGhpcy5jYW52YXNbdGhpcy51dWlkXSA9IHRoaXMuaW5pdENhbnZhcygnX3BhaW50QnJ1c2gtY2FudmFzJylcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gJ2JydXNoaW5nJ1xuICAgIGNvbnN0ICRjdXJDYW52YXMgPSB0aGlzLmNhbnZhc1t0aGlzLnV1aWRdIVxuXG4gICAgY29uc3QgJGN0eCA9ICRjdXJDYW52YXMuZ2V0Q29udGV4dCgnMmQnKSFcbiAgICAkY3R4LmNsZWFyUmVjdCgwLCAwLCAkY3VyQ2FudmFzLndpZHRoLCAkY3VyQ2FudmFzLmhlaWdodClcbiAgICB0aGlzLm9wZW5CcnVzaEhhbmRsZSgpXG4gICAgdGhpcy5yZWFkeSA9IHRydWVcbiAgICB0aGlzLmVtaXQoJ3JlYWR5Q2hhbmdlJywgdHJ1ZSlcbiAgfVxuXG4gIGNsb3NlQnJ1c2goKSB7XG4gICAgaWYgKCF0aGlzLnJlYWR5KSByZXR1cm5cblxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICcnXG4gICAgdGhpcy5kYXRhID0ge31cbiAgICB0aGlzLnRlbXBMaW5lID0ge31cbiAgICBPYmplY3Qua2V5cyh0aGlzLmNhbnZhcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICB0aGlzLmNhbnZhc1trZXldIS5vbnRvdWNoc3RhcnQgPSAoKSA9PiBmYWxzZVxuICAgICAgdGhpcy5jYW52YXNba2V5XSEub250b3VjaG1vdmUgPSAoKSA9PiBmYWxzZVxuICAgICAgdGhpcy5jYW52YXNba2V5XSEub250b3VjaGVuZCA9ICgpID0+IGZhbHNlXG4gICAgICB0aGlzLmNhbnZhc1trZXldIS5vbnRvdWNoY2FuY2VsID0gKCkgPT4gZmFsc2VcbiAgICAgIGNvbnN0ICRjdHggPSB0aGlzLmNhbnZhc1trZXldIS5nZXRDb250ZXh0KCcyZCcpXG4gICAgICBpZiAoJGN0eCkge1xuICAgICAgICAkY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhc1trZXldIS53aWR0aCwgdGhpcy5jYW52YXNba2V5XSEuaGVpZ2h0KVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5yZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdyZWFkeUNoYW5nZScsIGZhbHNlKVxuXG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2Uoe1xuICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLkV4aXQsXG4gICAgICBjb2xvcjogdGhpcy5jb2xvcixcbiAgICAgIHJlYWR5OiBmYWxzZSxcbiAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlQ3VycmVudENvbG9yKGNvbG9yOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50Q2FudmFzID0gdGhpcy5jYW52YXNbdGhpcy51dWlkXVxuICAgIGlmICghY3VycmVudENhbnZhcykgcmV0dXJuXG4gICAgY29uc3QgY3VycmVudEN0eCA9IGN1cnJlbnRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGlmICghY3VycmVudEN0eCkgcmV0dXJuXG4gICAgdGhpcy5jb25maWdzLmN1cnJlbnRDb2xvciA9IGNvbG9yXG4gICAgY3VycmVudEN0eC5zdHJva2VTdHlsZSA9IGNvbG9yXG5cbiAgfVxuXG4gIG9wZW5CcnVzaEhhbmRsZSgpIHtcbiAgICBjb25zdCBjdXJyZW50Q2FudmFzID0gdGhpcy5jYW52YXNbdGhpcy51dWlkXVxuICAgIGlmICghY3VycmVudENhbnZhcykgcmV0dXJuXG4gICAgY29uc3QgY3VycmVudEN0eCA9IGN1cnJlbnRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGlmICghY3VycmVudEN0eCkgcmV0dXJuXG5cbiAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3IgfHwgJyM2RDkyRkYnXG5cbiAgICBjdXJyZW50Q3R4LnN0cm9rZVN0eWxlID0gY29sb3JcblxuICAgIGxldCBiZWdpbjogYW55ID0gbnVsbCAvLyDlvIDlp4vngrlcbiAgICBsZXQgcG9pbnRzOiBhbnlbXSA9IFtdIC8vIOWNleasoSB0b3VjaCDngrnkvY3pm4blkIhcbiAgICBsZXQgbW92ZTogQ29vcmRzXG4gICAgbGV0IGxpbmU6IENvb3Jkc1tdID0gW10gLy8g5ZCM5q2lIHRvdWNoIOeCueS9jeaVsOaNrlxuICAgIGxldCBzdGFydFRpbWUgPSAwIC8vIHRvdWNoIOW8gOWni+aXtumXtFxuXG4gICAgLy8g57uY5Yi2XG4gICAgY29uc3QgZHJhdyA9IChiZWdpblBvaW50OiBDb29yZHMsIGNvbnRyb2xQb2ludDogQ29vcmRzLCBlbmRQb2ludDogQ29vcmRzKSA9PiB7XG4gICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3IgfHwgJyNmZjAwMDAnXG4gICAgICBjdXJyZW50Q3R4LnN0cm9rZVN0eWxlID0gY29sb3JcbiAgICAgIGN1cnJlbnRDdHguYmVnaW5QYXRoKClcbiAgICAgIGN1cnJlbnRDdHgubW92ZVRvKGJlZ2luUG9pbnQueCwgYmVnaW5Qb2ludC55KVxuICAgICAgY3VycmVudEN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgZW5kUG9pbnQueCwgZW5kUG9pbnQueSlcbiAgICAgIGN1cnJlbnRDdHguc3Ryb2tlKClcbiAgICB9XG5cbiAgICAvLyDpvKDmoIfmjInkuItcbiAgICBjdXJyZW50Q2FudmFzLm9ubW91c2Vkb3duID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgY29uc3QgeCA9IGUuY2xpZW50WFxuICAgICAgY29uc3QgeSA9IGUuY2xpZW50WVxuXG4gICAgICBwb2ludHMgPSBbXVxuICAgICAgcG9pbnRzLnB1c2goeyB4LCB5IH0pXG4gICAgICBiZWdpbiA9IHsgeCwgeSB9XG5cbiAgICAgIG1vdmUgPSB0cmFuc2Zvcm1Db29yZHMoeyB4LCB5IH0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KVxuICAgICAgbGluZSA9IFtdXG4gICAgfVxuXG4gICAgLy8g6byg5qCH56e75YqoXG4gICAgY3VycmVudENhbnZhcy5vbm1vdXNlbW92ZSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGlmICghYmVnaW4pIHJldHVyblxuICAgICAgY29uc3QgeCA9IE51bWJlcihlLmNsaWVudFgpXG4gICAgICBjb25zdCB5ID0gTnVtYmVyKGUuY2xpZW50WSlcbiAgICAgIC8vIOWvhumbhueCueS9jeeogOmHilxuICAgICAgaWYgKE1hdGguYWJzKHggLSBiZWdpbi54KSA8IDUgJiYgTWF0aC5hYnMoeSAtIGJlZ2luLnkpIDwgNSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHBvaW50cy5wdXNoKHsgeCwgeSB9KVxuICAgICAgLy8g5q2k5aSE5bqU6K6w5b2V5oqY57q/5ouf5ZCI5LmL5YmN55qE54K5XG4gICAgICBsaW5lLnB1c2godHJhbnNmb3JtQ29vcmRzKHsgeCwgeSB9LCB0aGlzLmNsaWVudFdpZHRoLCB0aGlzLmNsaWVudEhlaWdodCkpXG4gICAgICAvLyDmipjnur/mi5/lkIjkuozmrKHotJ3loZ7lsJTmm7Lnur/oh7PlsJHpnIDopoHkuInkuKrngrlcbiAgICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgIGlmICghY29udHJvbCB8fCAhZW5kKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZHJhdyhiZWdpbiwgY29udHJvbCwgZW5kKVxuICAgICAgYmVnaW4gPSBlbmRcbiAgICB9XG5cbiAgICAvLyDpvKDmoIfmnb7lvIBcbiAgICBjdXJyZW50Q2FudmFzLm9ubW91c2V1cCA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGJlZ2luID0gbnVsbFxuICAgICAgaWYgKHBvaW50cy5sZW5ndGggPCAzKSByZXR1cm5cblxuICAgICAgaWYgKCF0aGlzLmRhdGFbdGhpcy51dWlkXSkge1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXSA9IFtdXG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWVcbiAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICBtb3ZlOiBPYmplY3QuYXNzaWduKHt9LCBtb3ZlKSxcbiAgICAgICAgdXVpZDogdGhpcy51dWlkLFxuICAgICAgICBsaW5lOiBbLi4ubGluZV0sXG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gPCAxMjgwID8gZHVyYXRpb24gOiBkdXJhdGlvbiA8IDIwMDAgPyAxMjgwIDogMCwgLy8g5Y2V5qyh56yU6L+55pe26ZW/6LaF6L+HMjAwMG1z5LiN5Yqg5Yqo55S7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXS5wdXNoKHN0YXRlKVxuICAgICAgLy8g5bm/5pKt5pWw5o2uXG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSh7XG4gICAgICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLkRyYXdsaW5lLFxuICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICAgIHJlYWR5OiB0aGlzLnJlYWR5LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8g5omL5Yq/5oyJ5Y6LXG4gICAgY3VycmVudENhbnZhcy5vbnRvdWNoc3RhcnQgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICBjb25zdCB4ID0gZS50b3VjaGVzWzBdLmNsaWVudFhcbiAgICAgIGNvbnN0IHkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WVxuXG4gICAgICBwb2ludHMgPSBbXVxuICAgICAgcG9pbnRzLnB1c2goeyB4LCB5IH0pXG4gICAgICBiZWdpbiA9IHsgeCwgeSB9XG5cbiAgICAgIG1vdmUgPSB0cmFuc2Zvcm1Db29yZHMoeyB4LCB5IH0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KVxuICAgICAgbGluZSA9IFtdXG4gICAgfVxuXG4gICAgLy8g5omL5Yq/56e75YqoXG4gICAgY3VycmVudENhbnZhcy5vbnRvdWNobW92ZSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGlmICghYmVnaW4pIHJldHVyblxuICAgICAgY29uc3QgeCA9IE51bWJlcihlLnRvdWNoZXNbMF0uY2xpZW50WClcbiAgICAgIGNvbnN0IHkgPSBOdW1iZXIoZS50b3VjaGVzWzBdLmNsaWVudFkpXG4gICAgICBpZiAoTWF0aC5hYnMoeCAtIGJlZ2luLngpIDwgNSAmJiBNYXRoLmFicyh5IC0gYmVnaW4ueSkgPCA1KSByZXR1cm4gLy8g5a+G6ZuG54K55L2N56iA6YeKXG4gICAgICBwb2ludHMucHVzaCh7IHgsIHkgfSlcbiAgICAgIGxpbmUucHVzaCh0cmFuc2Zvcm1Db29yZHMoeyB4LCB5IH0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KSkgLy8g5q2k5aSE5bqU6K6w5b2V5oqY57q/5ouf5ZCI5LmL5YmN55qE54K5XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiAvLyDmipjnur/mi5/lkIjkuozmrKHotJ3loZ7lsJTmm7Lnur/oh7PlsJHpnIDopoHkuInkuKrngrlcbiAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgIGlmICghY29udHJvbCB8fCAhZW5kKSByZXR1cm5cbiAgICAgIGRyYXcoYmVnaW4sIGNvbnRyb2wsIGVuZClcbiAgICAgIGJlZ2luID0gZW5kXG4gICAgfVxuXG4gICAgLy8g5omL5Yq/5oyJ5Y6L56a75byAXG4gICAgY3VycmVudENhbnZhcy5vbnRvdWNoZW5kID0gY3VycmVudENhbnZhcy5vbnRvdWNoY2FuY2VsID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgYmVnaW4gPSBudWxsXG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVyblxuICAgICAgaWYgKCF0aGlzLmRhdGFbdGhpcy51dWlkXSkge1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXSA9IFtdXG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWVcbiAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICBtb3ZlOiBPYmplY3QuYXNzaWduKHt9LCBtb3ZlKSxcbiAgICAgICAgbGluZTogWy4uLmxpbmVdLFxuICAgICAgICB1dWlkOiB0aGlzLnV1aWQsXG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gPCAxMjgwID8gZHVyYXRpb24gOiBkdXJhdGlvbiA8IDIwMDAgPyAxMjgwIDogMCwgLy8g5Y2V5qyh56yU6L+55pe26ZW/6LaF6L+HMjAwMG1z5LiN5Yqg5Yqo55S7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXS5wdXNoKHN0YXRlKVxuICAgICAgLy8g5bm/5pKt5pWw5o2uXG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSh7XG4gICAgICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLkRyYXdsaW5lLFxuICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICAgIHJlYWR5OiB0aGlzLnJlYWR5LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZW1pdFN0YXRlQ2hhbmdlKGFjdGlvbjogUGFpbnRCcnVzaEFjdGlvbiwgdXNlckFjdGlvbjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgIT09IFBhaW50QnJ1c2hUeXBlRW51bS5EcmF3bGluZSkge1xuICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZScsIGFjdGlvbiwgdXNlckFjdGlvbilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KClcbiAgICBjb25zdCBzdGF0ZSA9IGFjdGlvbi5zdGF0ZVxuICAgIGlmICghc3RhdGUpIHJldHVyblxuICAgIGlmICghc3RhdGUubGluZSkgcmV0dXJuXG4gICAgY29uc3Qgc2xpY2VDb3VudCA9IE1hdGguY2VpbChzdGF0ZS5saW5lLmxlbmd0aCAvIDEwMClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpY2VDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBsb2NhbGl0eUFjdGlvbjogUGFpbnRCcnVzaEFjdGlvbiA9IHtcbiAgICAgICAgdXVpZDogdGhpcy51dWlkLFxuICAgICAgICBjb2xvcjogdGhpcy5jb2xvcixcbiAgICAgICAgcmVhZHk6IHRoaXMucmVhZHksXG4gICAgICAgIHR5cGU6IGFjdGlvbi50eXBlLFxuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgICBtb3ZlOiBzdGF0ZS5tb3ZlLFxuICAgICAgICAgIGR1cmF0aW9uOiBzdGF0ZS5kdXJhdGlvbixcbiAgICAgICAgICBjb2xvcjogdGhpcy5jb2xvcixcbiAgICAgICAgICBsaW5lOiBzdGF0ZS5saW5lLnNsaWNlKGkgKiAxMDAsIChpICsgMSkgKiAxMDApLFxuICAgICAgICB9LFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIGVuZDogaSA9PT0gc2xpY2VDb3VudCAtIDEsXG4gICAgICB9XG4gICAgICAvKiog55Sx5LqO5Y2V5qyhIHdzIOS8oOi+k+aVsOaNrumHj+i/h+Wkp++8jOS8muWvvOiHtCB3cyDmlq3mjonvvIzmiYDku6XliIbmibnkvKDmlbDmja4gKi9cbiAgICAgIGV4ZWNJbnRlcnZhbChpLCAyMCwgKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlJywgbG9jYWxpdHlBY3Rpb24sIHVzZXJBY3Rpb24pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGFjdGlvbihhY3Rpb246IFBhaW50QnJ1c2hBY3Rpb24pIHtcbiAgICBjb25zdCB7IHJlYWR5LCB0eXBlLCB1dWlkIH0gPSBhY3Rpb25cblxuICAgIGlmICghcmVhZHkgJiYgdGhpcy5yZWFkeSkge1xuICAgICAgLy8g5YWz6Zet6Z2i5p2/XG4gICAgICB0aGlzLmNsb3NlQnJ1c2goKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChyZWFkeSAmJiAhdGhpcy5yZWFkeSkge1xuICAgICAgLy8g5byA5ZCv6Z2i5p2/77ya6aaW5qyh5omT5byA55S756yU5LiN5ZCM5q2l5LiK5LiA5qyh55qE55S757q/XG4gICAgICB0aGlzLm9wZW5CcnVzaCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucmVhZHkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBQYWludEJydXNoVHlwZUVudW0uRHJhd2xpbmU6XG4gICAgICAgIGNvbnN0IHsgc3RhdGUsIHRpbWVzdGFtcCwgZW5kIH0gPSBhY3Rpb25cbiAgICAgICAgaWYgKCF0aW1lc3RhbXApIHJldHVyblxuICAgICAgICBpZiAoIXN0YXRlKSByZXR1cm5cbiAgICAgICAgdGhpcy50ZW1wTGluZVt0aW1lc3RhbXBdID0gKFtdIGFzIENvb3Jkc1tdKS5jb25jYXQodGhpcy50ZW1wTGluZVt0aW1lc3RhbXBdIHx8IFtdLCBzdGF0ZS5saW5lKVxuICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwgeyBsaW5lOiB0aGlzLnRlbXBMaW5lW3RpbWVzdGFtcF0gfSlcbiAgICAgICAgICB0aGlzLmhhbmRsZURyYXdMaW5lKHV1aWQsIHN0YXRlLCB7fSwgKCkgPT4gZGVsZXRlIHRoaXMudGVtcExpbmVbdGltZXN0YW1wXSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBQYWludEJydXNoVHlwZUVudW0uVW5kbzpcbiAgICAgICAgdGhpcy5oYW5kbGVVbmRvKHV1aWQpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG5cbiAgaGFuZGxlRHJhd0xpbmUoX3V1aWQ6IHN0cmluZywgZGF0YTogUGFpbnRCcnVzaFN0YXRlLCB7IHdpdGhVbmRvID0gZmFsc2UgfSwgY2FsbGJhY2sgPSBub29wKSB7XG4gICAgaWYgKCFkYXRhIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSAhPSAnW29iamVjdCBPYmplY3RdJyB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHF1ZXVlKCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBpZiAoIXdpdGhVbmRvKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNhbnZhc1tfdXVpZF0pIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzW191dWlkXSA9IHRoaXMuaW5pdENhbnZhcygnX3BhaW50QnJ1c2gtY2FudmFzLS1zeW5jJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGFbX3V1aWRdKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFbX3V1aWRdID0gW11cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kYXRhW191dWlkXS5wdXNoKGRhdGEpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuY2FudmFzW191dWlkXSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0ICRjdHggPSB0aGlzLmNhbnZhc1tfdXVpZF0hLmdldENvbnRleHQoJzJkJylcblxuICAgICAgICBpZiAoISRjdHgpIHJldHVyblxuICAgICAgICBjb25zdCB7IGxpbmUgPSBbXSwgY29sb3IgPSAnYmxhY2snLCBkdXJhdGlvbiA9IDAsIHV1aWQgfSA9IGRhdGFcbiAgICAgICAgY29uc3QgbW92ZSA9IHVuVHJhbnNmb3JtQ29vcmRzKGRhdGEubW92ZSB8fCB7fSBhcyBDb29yZHMsIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KVxuXG4gICAgICAgIGxldCBwb2ludHMgPSBbbW92ZV1cblxuICAgICAgICAkY3R4LnN0cm9rZVN0eWxlID0gY29sb3JcblxuICAgICAgICAkY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICRjdHgubW92ZVRvKG1vdmUueCwgbW92ZS55KVxuXG4gICAgICAgIGlmIChkdXJhdGlvbiAmJiAhd2l0aFVuZG8pIHtcbiAgICAgICAgICBsZXQgZHJhd0NhY2hlOiBhbnlbXSA9IFtdXG4gICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICAgICAgICBzZWxmLnR3ZWVuID0gdHdlZW4oeyBzdGVwOiAwIH0sIHsgc3RlcDogbGluZS5sZW5ndGggLSAxIH0sIGR1cmF0aW9uKVxuICAgICAgICAgICAgLm9uVXBkYXRlKCh7IHN0ZXAgfSkgPT4ge1xuICAgICAgICAgICAgICBzZWxmLnR3ZWVuaW5nID0gdHJ1ZVxuICAgICAgICAgICAgICBpZiAoIXNlbGYucmVhZHkpIHtcbiAgICAgICAgICAgICAgICAkY3R4LmNsZWFyUmVjdCgwLCAwLCBzZWxmLmNhbnZhc1t1dWlkXSEud2lkdGgsIHNlbGYuY2FudmFzW3V1aWRdIS5oZWlnaHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudHdlZW4/LnN0b3AoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKHN0ZXApXG4gICAgICAgICAgICAgIGlmICghZHJhd0NhY2hlLmZpbmQoKGRjKSA9PiBkYyA9PT0gaSkpIHtcbiAgICAgICAgICAgICAgICBkcmF3Q2FjaGUucHVzaChpKVxuICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKHVuVHJhbnNmb3JtQ29vcmRzKGxpbmVbaV0sIHNlbGYuY2xpZW50V2lkdGgsIHNlbGYuY2xpZW50SGVpZ2h0KSlcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVyblxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wgfHwgIWVuZCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgJGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2wueCwgY29udHJvbC55LCBlbmQueCwgZW5kLnkpXG4gICAgICAgICAgICAgICAgJGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uQ29tcGxldGUoKGUpID0+IHtcbiAgICAgICAgICAgICAgc2VsZi50d2VlbiA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICBzZWxmLnR3ZWVuaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgZHJhd0NhY2hlID0gW11cbiAgICAgICAgICAgICAgcG9pbnRzID0gW11cbiAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXG4gICAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHVuVHJhbnNmb3JtQ29vcmRzKGxpbmVbaV0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KSlcbiAgICAgICAgICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMykgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgICAgICAgIGlmICghY29udHJvbCB8fCAhZW5kKSBjb250aW51ZVxuICAgICAgICAgICAgJGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2wueCwgY29udHJvbC55LCBlbmQueCwgZW5kLnkpXG4gICAgICAgICAgfVxuICAgICAgICAgICRjdHguc3Ryb2tlKClcbiAgICAgICAgICBwb2ludHMgPSBbXVxuICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKVxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBoYW5kbGVVbmRvKHV1aWQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jYW52YXNbdXVpZF0gfHwgIXRoaXMuZGF0YVt1dWlkXSB8fCB0aGlzLmRhdGFbdXVpZF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5kYXRhW3V1aWRdLnBvcCgpXG5cbiAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7XG4gICAgICBjb25zdCAkY3R4ID0gdGhpcy5jYW52YXNbdXVpZF0/LmdldENvbnRleHQoJzJkJylcbiAgICAgIGlmICgkY3R4KSB7XG4gICAgICAgICRjdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzW3V1aWRdIS53aWR0aCwgdGhpcy5jYW52YXNbdXVpZF0hLmhlaWdodClcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVt1dWlkXS5mb3JFYWNoKChsZDogYW55KSA9PiB0aGlzLmhhbmRsZURyYXdMaW5lKHV1aWQsIGxkLCB7IHdpdGhVbmRvOiB0cnVlIH0pKVxuICAgIH1cbiAgICBpZiAodGhpcy50d2VlbiAmJiB0aGlzLnR3ZWVuaW5nKSB7XG4gICAgICB0aGlzLnR3ZWVuLnN0b3AoKVxuICAgICAgbmV4dEZyYW1lKGhhbmRsZSwgNjApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaGFuZGxlKClcbiAgfVxuXG4gIGRlc3Ryb3lCcnVzaCgpIHtcbiAgICB0aGlzLmNsb3NlQnJ1c2goKVxuICAgIHRoaXMucmVhZHkgPSBmYWxzZVxuICAgIHRoaXMuZW1pdCgncmVhZHlDaGFuZ2UnLCB0cnVlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDb250cm9sbGVyIH0gZnJvbSAnLi9Db250cm9sbGVyJ1xuaW1wb3J0IHR5cGUgeyBQYWludEJydXNoQWN0aW9uLCBQYWludEJydXNoQ29uZmlncywgUGFpbnRCcnVzaEV2ZW50TWFwLCBQYWludEJydXNoU3RhdGUgfSBmcm9tICcuL3R5cGluZ3MnXG5cbmV4cG9ydCBjbGFzcyBQYWludEJydXNoIHtcblxuICBwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXJcblxuICBjb25zdHJ1Y3Rvcihjb25maWdzOiBQYXJ0aWFsPFBhaW50QnJ1c2hDb25maWdzPiA9IHt9KSB7XG4gICAgY29uc3QgX2NvbmZpZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGN1cnJlbnRDb2xvcjogJyNmNDQzMzYnLFxuICAgICAgb25VbmRvVGV4dDogJ+WbnumAgCcsXG4gICAgICBvbkV4aXRUZXh0OiAn5YWz6ZetJ1xuICAgIH0sIGNvbmZpZ3MpXG5cbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcihfY29uZmlncylcbiAgfVxuXG4gIG9uPEsgZXh0ZW5kcyBrZXlvZiBQYWludEJydXNoRXZlbnRNYXA+KG5hbWU6IEssXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFBhaW50QnJ1c2hFdmVudE1hcFtLXT4pID0+IFJldHVyblR5cGU8UGFpbnRCcnVzaEV2ZW50TWFwW0tdPilcbiAge1xuICAgIHRoaXMuY29udHJvbGxlci5vbihuYW1lLCBjYWxsYmFjaylcbiAgfVxuXG4gIG9mZjxLIGV4dGVuZHMga2V5b2YgUGFpbnRCcnVzaEV2ZW50TWFwPihuYW1lOiBLLFxuICAgIGNhbGxiYWNrOiAoLi4uYXJnczogUGFyYW1ldGVyczxQYWludEJydXNoRXZlbnRNYXBbS10+KSA9PiBSZXR1cm5UeXBlPFBhaW50QnJ1c2hFdmVudE1hcFtLXT4pXG4gIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIub2ZmKG5hbWUsIGNhbGxiYWNrKVxuICB9XG5cblxuICBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBQYWludEJydXNoRXZlbnRNYXA+KG5hbWU6IEssXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFBhaW50QnJ1c2hFdmVudE1hcFtLXT4pID0+IFJldHVyblR5cGU8UGFpbnRCcnVzaEV2ZW50TWFwW0tdPilcbiAge1xuICAgIHRoaXMuY29udHJvbGxlci5vbmNlKG5hbWUsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIOaYvuekuueUu+eslOOAglxuICAgKi9cbiAgc2hvdygpIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIub3BlbkJydXNoKClcbiAgfVxuXG4gIGFjdGlvbihhY3Rpb246IFBhaW50QnJ1c2hBY3Rpb24pIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuYWN0aW9uKGFjdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnlLvnrJTnirbmgIHjgIJcbiAgICovXG4gIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLnN0YXRlXG4gIH1cblxuICBnZXQgY29uZmlncygpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmNvbmZpZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HjgIJcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uIOeUu+eslOW6lOivpee7tOaKpOS4gOS4qiAqKuWFqOWxgOWNleS+iyoq77yM6YeN5aSN5Yip55So44CCXG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZGVzdHJveUJydXNoKClcbiAgfVxuXG4gIHNldEN1cnJlbnRDb2xvcihjb2xvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5jb250cm9sbGVyLnVwZGF0ZUN1cnJlbnRDb2xvcihjb2xvcilcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkdyb3VwIiwidHdlZW4iLCJTZXF1ZW5jZSIsIlR3ZWVuIiwiUGFpbnRCcnVzaFR5cGVFbnVtIiwiY29sb3IiLCJzdGF0ZSIsInV1aWQiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLFNBQVMsT0FBTztBQUFFO0FBQ3pCLE1BQU0sVUFBVSxNQUFNLFFBQVE7QUFFOUIsTUFBTSxRQUFRO0FBQUEsRUFDWixTQUFTLFFBQVEsUUFBUTtBQUMzQjtBQU9nQixTQUFBLE1BQU0sa0JBQWtCLFNBQVM7QUFDL0MsUUFBTSxVQUFVLE1BQU0sUUFBUSxLQUFLLGVBQWUsRUFBRSxNQUFNLE9BQU87QUFDbkU7QUFFZ0IsU0FBQSxnQkFBZ0IsUUFBZ0IsSUFBWSxJQUFZO0FBQ3RFLFFBQU0sS0FBYSxPQUFPO0FBQzFCLFFBQU0sS0FBYSxPQUFPO0FBQzFCLFFBQU0sSUFBSSxLQUFLLE1BQU8sS0FBSyxLQUFNLEdBQUssSUFBSTtBQUMxQyxRQUFNLElBQUksS0FBSyxNQUFPLEtBQUssS0FBTSxHQUFLLElBQUk7QUFDbkMsU0FBQSxFQUFFLEdBQUc7QUFDZDtBQUVnQixTQUFBLGtCQUFrQixRQUFnQixJQUFZLElBQVk7QUFDeEUsUUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLE9BQU87QUFDekIsUUFBTSxJQUFJLEtBQUs7QUFDZixRQUFNLElBQUksS0FBSztBQUNSLFNBQUEsRUFBRSxHQUFHO0FBQ2Q7QUFFTyxTQUFTLHVCQUF1QixRQUFrQjtBQUN2RCxNQUFJLE9BQU8sU0FBUztBQUFHLFdBQU87QUFDeEIsUUFBQSxVQUFVLE9BQU8sTUFBTSxFQUFFO0FBQ3pCLFFBQUEsVUFBVSxRQUFRLENBQUM7QUFDekIsUUFBTSxNQUFNO0FBQUEsSUFDVixJQUFJLFFBQVEsQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSztBQUFBLElBQ25DLElBQUksUUFBUSxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLO0FBQUEsRUFBQTtBQUU5QixTQUFBLEVBQUUsU0FBUztBQUNwQjtBQUVPLFNBQVMsYUFBYSxHQUFXLE1BQWMsV0FBVyxNQUFNO0FBQ2pFLE1BQUEsUUFBUSxDQUFDLFlBQVk7QUFDdkIsZUFBVyxNQUFNO0FBQ047QUFDVCxjQUFRLElBQUk7QUFBQSxJQUFBLEdBQ1gsT0FBTyxDQUFDO0FBQUEsRUFBQSxDQUNaO0FBQ0g7QUFFQSxNQUFNLFVBQVU7QUFFaEIsTUFBTSx5QkFDSixPQUFPLHlCQUNQLFFBQVEsZ0NBQ1AsQ0FBTSxPQUFBLFdBQVcsSUFBSSxFQUFFO0FBS1YsU0FBQSxVQUFXLElBQTBCLFFBQVEsR0FBRztBQUM5RCxNQUFJLFNBQVM7QUFBRywyQkFBdUIsRUFBRTtBQUFBO0FBQ3BDLDJCQUF1QixNQUFNLFVBQVUsSUFBSSxRQUFRLENBQUMsQ0FBQztBQUM1RDtBQzdEQSxJQUFJLFNBQVMsT0FBTyxPQUFPO0FBQUEsRUFDdkIsUUFBUSxPQUFPLE9BQU87QUFBQSxJQUNsQixNQUFNLFNBQVUsUUFBUTtBQUNwQixhQUFPO0FBQUEsSUFDVjtBQUFBLElBQ0QsSUFBSSxTQUFVLFFBQVE7QUFDbEIsYUFBTztBQUFBLElBQ1Y7QUFBQSxJQUNELEtBQUssU0FBVSxRQUFRO0FBQ25CLGFBQU87QUFBQSxJQUNWO0FBQUEsSUFDRCxPQUFPLFNBQVUsUUFBUTtBQUNyQixhQUFPO0FBQUEsSUFDVjtBQUFBLEVBQ1QsQ0FBSztBQUFBLEVBQ0QsV0FBVyxPQUFPLE9BQU87QUFBQSxJQUNyQixJQUFJLFNBQVUsUUFBUTtBQUNsQixhQUFPLFNBQVM7QUFBQSxJQUNuQjtBQUFBLElBQ0QsS0FBSyxTQUFVLFFBQVE7QUFDbkIsYUFBTyxVQUFVLElBQUk7QUFBQSxJQUN4QjtBQUFBLElBQ0QsT0FBTyxTQUFVLFFBQVE7QUFDckIsV0FBSyxVQUFVLEtBQUssR0FBRztBQUNuQixlQUFPLE1BQU0sU0FBUztBQUFBLE1BQ3pCO0FBQ0QsYUFBTyxRQUFRLEVBQUUsVUFBVSxTQUFTLEtBQUs7QUFBQSxJQUM1QztBQUFBLEVBQ1QsQ0FBSztBQUFBLEVBQ0QsT0FBTyxPQUFPLE9BQU87QUFBQSxJQUNqQixJQUFJLFNBQVUsUUFBUTtBQUNsQixhQUFPLFNBQVMsU0FBUztBQUFBLElBQzVCO0FBQUEsSUFDRCxLQUFLLFNBQVUsUUFBUTtBQUNuQixhQUFPLEVBQUUsU0FBUyxTQUFTLFNBQVM7QUFBQSxJQUN2QztBQUFBLElBQ0QsT0FBTyxTQUFVLFFBQVE7QUFDckIsV0FBSyxVQUFVLEtBQUssR0FBRztBQUNuQixlQUFPLE1BQU0sU0FBUyxTQUFTO0FBQUEsTUFDbEM7QUFDRCxhQUFPLFFBQVEsVUFBVSxLQUFLLFNBQVMsU0FBUztBQUFBLElBQ25EO0FBQUEsRUFDVCxDQUFLO0FBQUEsRUFDRCxTQUFTLE9BQU8sT0FBTztBQUFBLElBQ25CLElBQUksU0FBVSxRQUFRO0FBQ2xCLGFBQU8sU0FBUyxTQUFTLFNBQVM7QUFBQSxJQUNyQztBQUFBLElBQ0QsS0FBSyxTQUFVLFFBQVE7QUFDbkIsYUFBTyxJQUFJLEVBQUUsU0FBUyxTQUFTLFNBQVM7QUFBQSxJQUMzQztBQUFBLElBQ0QsT0FBTyxTQUFVLFFBQVE7QUFDckIsV0FBSyxVQUFVLEtBQUssR0FBRztBQUNuQixlQUFPLE1BQU0sU0FBUyxTQUFTLFNBQVM7QUFBQSxNQUMzQztBQUNELGFBQU8sU0FBUyxVQUFVLEtBQUssU0FBUyxTQUFTLFNBQVM7QUFBQSxJQUM3RDtBQUFBLEVBQ1QsQ0FBSztBQUFBLEVBQ0QsU0FBUyxPQUFPLE9BQU87QUFBQSxJQUNuQixJQUFJLFNBQVUsUUFBUTtBQUNsQixhQUFPLFNBQVMsU0FBUyxTQUFTLFNBQVM7QUFBQSxJQUM5QztBQUFBLElBQ0QsS0FBSyxTQUFVLFFBQVE7QUFDbkIsYUFBTyxFQUFFLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUztBQUFBLElBQ3pEO0FBQUEsSUFDRCxPQUFPLFNBQVUsUUFBUTtBQUNyQixXQUFLLFVBQVUsS0FBSyxHQUFHO0FBQ25CLGVBQU8sTUFBTSxTQUFTLFNBQVMsU0FBUyxTQUFTO0FBQUEsTUFDcEQ7QUFDRCxhQUFPLFFBQVEsVUFBVSxLQUFLLFNBQVMsU0FBUyxTQUFTLFNBQVM7QUFBQSxJQUNyRTtBQUFBLEVBQ1QsQ0FBSztBQUFBLEVBQ0QsWUFBWSxPQUFPLE9BQU87QUFBQSxJQUN0QixJQUFJLFNBQVUsUUFBUTtBQUNsQixhQUFPLElBQUksS0FBSyxLQUFNLElBQU0sVUFBVSxLQUFLLEtBQU0sQ0FBQztBQUFBLElBQ3JEO0FBQUEsSUFDRCxLQUFLLFNBQVUsUUFBUTtBQUNuQixhQUFPLEtBQUssSUFBSyxTQUFTLEtBQUssS0FBTSxDQUFDO0FBQUEsSUFDekM7QUFBQSxJQUNELE9BQU8sU0FBVSxRQUFRO0FBQ3JCLGFBQU8sT0FBTyxJQUFJLEtBQUssSUFBSSxLQUFLLE1BQU0sTUFBTSxPQUFPO0FBQUEsSUFDdEQ7QUFBQSxFQUNULENBQUs7QUFBQSxFQUNELGFBQWEsT0FBTyxPQUFPO0FBQUEsSUFDdkIsSUFBSSxTQUFVLFFBQVE7QUFDbEIsYUFBTyxXQUFXLElBQUksSUFBSSxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFBQSxJQUN0RDtBQUFBLElBQ0QsS0FBSyxTQUFVLFFBQVE7QUFDbkIsYUFBTyxXQUFXLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLE1BQU0sTUFBTTtBQUFBLElBQ3pEO0FBQUEsSUFDRCxPQUFPLFNBQVUsUUFBUTtBQUNyQixVQUFJLFdBQVcsR0FBRztBQUNkLGVBQU87QUFBQSxNQUNWO0FBQ0QsVUFBSSxXQUFXLEdBQUc7QUFDZCxlQUFPO0FBQUEsTUFDVjtBQUNELFdBQUssVUFBVSxLQUFLLEdBQUc7QUFDbkIsZUFBTyxNQUFNLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUFBLE1BQ3pDO0FBQ0QsYUFBTyxPQUFPLENBQUMsS0FBSyxJQUFJLEdBQUcsT0FBTyxTQUFTLEVBQUUsSUFBSTtBQUFBLElBQ3BEO0FBQUEsRUFDVCxDQUFLO0FBQUEsRUFDRCxVQUFVLE9BQU8sT0FBTztBQUFBLElBQ3BCLElBQUksU0FBVSxRQUFRO0FBQ2xCLGFBQU8sSUFBSSxLQUFLLEtBQUssSUFBSSxTQUFTLE1BQU07QUFBQSxJQUMzQztBQUFBLElBQ0QsS0FBSyxTQUFVLFFBQVE7QUFDbkIsYUFBTyxLQUFLLEtBQUssSUFBSSxFQUFFLFNBQVMsTUFBTTtBQUFBLElBQ3pDO0FBQUEsSUFDRCxPQUFPLFNBQVUsUUFBUTtBQUNyQixXQUFLLFVBQVUsS0FBSyxHQUFHO0FBQ25CLGVBQU8sUUFBUSxLQUFLLEtBQUssSUFBSSxTQUFTLE1BQU0sSUFBSTtBQUFBLE1BQ25EO0FBQ0QsYUFBTyxPQUFPLEtBQUssS0FBSyxLQUFLLFVBQVUsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUN6RDtBQUFBLEVBQ1QsQ0FBSztBQUFBLEVBQ0QsU0FBUyxPQUFPLE9BQU87QUFBQSxJQUNuQixJQUFJLFNBQVUsUUFBUTtBQUNsQixVQUFJLFdBQVcsR0FBRztBQUNkLGVBQU87QUFBQSxNQUNWO0FBQ0QsVUFBSSxXQUFXLEdBQUc7QUFDZCxlQUFPO0FBQUEsTUFDVjtBQUNELGFBQU8sQ0FBQyxLQUFLLElBQUksR0FBRyxNQUFNLFNBQVMsRUFBRSxJQUFJLEtBQUssS0FBSyxTQUFTLE9BQU8sSUFBSSxLQUFLLEVBQUU7QUFBQSxJQUNqRjtBQUFBLElBQ0QsS0FBSyxTQUFVLFFBQVE7QUFDbkIsVUFBSSxXQUFXLEdBQUc7QUFDZCxlQUFPO0FBQUEsTUFDVjtBQUNELFVBQUksV0FBVyxHQUFHO0FBQ2QsZUFBTztBQUFBLE1BQ1Y7QUFDRCxhQUFPLEtBQUssSUFBSSxHQUFHLE1BQU0sTUFBTSxJQUFJLEtBQUssS0FBSyxTQUFTLE9BQU8sSUFBSSxLQUFLLEVBQUUsSUFBSTtBQUFBLElBQy9FO0FBQUEsSUFDRCxPQUFPLFNBQVUsUUFBUTtBQUNyQixVQUFJLFdBQVcsR0FBRztBQUNkLGVBQU87QUFBQSxNQUNWO0FBQ0QsVUFBSSxXQUFXLEdBQUc7QUFDZCxlQUFPO0FBQUEsTUFDVjtBQUNELGdCQUFVO0FBQ1YsVUFBSSxTQUFTLEdBQUc7QUFDWixlQUFPLE9BQU8sS0FBSyxJQUFJLEdBQUcsTUFBTSxTQUFTLEVBQUUsSUFBSSxLQUFLLEtBQUssU0FBUyxPQUFPLElBQUksS0FBSyxFQUFFO0FBQUEsTUFDdkY7QUFDRCxhQUFPLE1BQU0sS0FBSyxJQUFJLEdBQUcsT0FBTyxTQUFTLEVBQUUsSUFBSSxLQUFLLEtBQUssU0FBUyxPQUFPLElBQUksS0FBSyxFQUFFLElBQUk7QUFBQSxJQUMzRjtBQUFBLEVBQ1QsQ0FBSztBQUFBLEVBQ0QsTUFBTSxPQUFPLE9BQU87QUFBQSxJQUNoQixJQUFJLFNBQVUsUUFBUTtBQUNsQixVQUFJLElBQUk7QUFDUixhQUFPLFdBQVcsSUFBSSxJQUFJLFNBQVMsV0FBVyxJQUFJLEtBQUssU0FBUztBQUFBLElBQ25FO0FBQUEsSUFDRCxLQUFLLFNBQVUsUUFBUTtBQUNuQixVQUFJLElBQUk7QUFDUixhQUFPLFdBQVcsSUFBSSxJQUFJLEVBQUUsU0FBUyxXQUFXLElBQUksS0FBSyxTQUFTLEtBQUs7QUFBQSxJQUMxRTtBQUFBLElBQ0QsT0FBTyxTQUFVLFFBQVE7QUFDckIsVUFBSSxJQUFJLFVBQVU7QUFDbEIsV0FBSyxVQUFVLEtBQUssR0FBRztBQUNuQixlQUFPLE9BQU8sU0FBUyxXQUFXLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDdkQ7QUFDRCxhQUFPLFFBQVEsVUFBVSxLQUFLLFdBQVcsSUFBSSxLQUFLLFNBQVMsS0FBSztBQUFBLElBQ25FO0FBQUEsRUFDVCxDQUFLO0FBQUEsRUFDRCxRQUFRLE9BQU8sT0FBTztBQUFBLElBQ2xCLElBQUksU0FBVSxRQUFRO0FBQ2xCLGFBQU8sSUFBSSxPQUFPLE9BQU8sSUFBSSxJQUFJLE1BQU07QUFBQSxJQUMxQztBQUFBLElBQ0QsS0FBSyxTQUFVLFFBQVE7QUFDbkIsVUFBSSxTQUFTLElBQUksTUFBTTtBQUNuQixlQUFPLFNBQVMsU0FBUztBQUFBLE1BQzVCLFdBQ1EsU0FBUyxJQUFJLE1BQU07QUFDeEIsZUFBTyxVQUFVLFVBQVUsTUFBTSxRQUFRLFNBQVM7QUFBQSxNQUNyRCxXQUNRLFNBQVMsTUFBTSxNQUFNO0FBQzFCLGVBQU8sVUFBVSxVQUFVLE9BQU8sUUFBUSxTQUFTO0FBQUEsTUFDdEQsT0FDSTtBQUNELGVBQU8sVUFBVSxVQUFVLFFBQVEsUUFBUSxTQUFTO0FBQUEsTUFDdkQ7QUFBQSxJQUNKO0FBQUEsSUFDRCxPQUFPLFNBQVUsUUFBUTtBQUNyQixVQUFJLFNBQVMsS0FBSztBQUNkLGVBQU8sT0FBTyxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUk7QUFBQSxNQUN6QztBQUNELGFBQU8sT0FBTyxPQUFPLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxNQUFNO0FBQUEsSUFDcEQ7QUFBQSxFQUNULENBQUs7QUFBQSxFQUNELGFBQWEsU0FBVSxPQUFPO0FBQzFCLFFBQUksVUFBVSxRQUFRO0FBQUUsY0FBUTtBQUFBLElBQUk7QUFDcEMsWUFBUSxRQUFRLE9BQU8sVUFBVSxPQUFPLFVBQVU7QUFDbEQsWUFBUSxRQUFRLE1BQVEsTUFBUTtBQUNoQyxXQUFPO0FBQUEsTUFDSCxJQUFJLFNBQVUsUUFBUTtBQUNsQixlQUFPLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxNQUNoQztBQUFBLE1BQ0QsS0FBSyxTQUFVLFFBQVE7QUFDbkIsZUFBTyxJQUFJLEtBQUssSUFBSyxJQUFJLFFBQVMsS0FBSztBQUFBLE1BQzFDO0FBQUEsTUFDRCxPQUFPLFNBQVUsUUFBUTtBQUNyQixZQUFJLFNBQVMsS0FBSztBQUNkLGlCQUFPLEtBQUssSUFBSyxTQUFTLEdBQUksS0FBSyxJQUFJO0FBQUEsUUFDMUM7QUFDRCxnQkFBUSxJQUFJLEtBQUssSUFBSyxJQUFJLFNBQVMsR0FBSSxLQUFLLEtBQUssSUFBSTtBQUFBLE1BQ3hEO0FBQUEsSUFDYjtBQUFBLEVBQ0s7QUFDTCxDQUFDO0FBRUQsSUFBSSxNQUFNLFdBQVk7QUFBRSxTQUFPLFlBQVksSUFBRztBQUFHO0FBUWpELElBQUk7QUFBQTtBQUFBLEVBQXVCLFdBQVk7QUFDbkMsYUFBU0EsU0FBUTtBQUNiLFdBQUssVUFBVTtBQUNmLFdBQUssMkJBQTJCO0lBQ25DO0FBQ0QsSUFBQUEsT0FBTSxVQUFVLFNBQVMsV0FBWTtBQUNqQyxVQUFJLFFBQVE7QUFDWixhQUFPLE9BQU8sS0FBSyxLQUFLLE9BQU8sRUFBRSxJQUFJLFNBQVUsU0FBUztBQUNwRCxlQUFPLE1BQU0sUUFBUSxPQUFPO0FBQUEsTUFDeEMsQ0FBUztBQUFBLElBQ1Q7QUFDSSxJQUFBQSxPQUFNLFVBQVUsWUFBWSxXQUFZO0FBQ3BDLFdBQUssVUFBVTtJQUN2QjtBQUNJLElBQUFBLE9BQU0sVUFBVSxNQUFNLFNBQVVDLFFBQU87QUFDbkMsV0FBSyxRQUFRQSxPQUFNLE1BQU8sQ0FBQSxJQUFJQTtBQUM5QixXQUFLLHlCQUF5QkEsT0FBTSxNQUFPLENBQUEsSUFBSUE7QUFBQSxJQUN2RDtBQUNJLElBQUFELE9BQU0sVUFBVSxTQUFTLFNBQVVDLFFBQU87QUFDdEMsYUFBTyxLQUFLLFFBQVFBLE9BQU0sTUFBTyxDQUFBO0FBQ2pDLGFBQU8sS0FBSyx5QkFBeUJBLE9BQU0sTUFBTyxDQUFBO0FBQUEsSUFDMUQ7QUFDSSxJQUFBRCxPQUFNLFVBQVUsU0FBUyxTQUFVLE1BQU0sVUFBVTtBQUMvQyxVQUFJLFNBQVMsUUFBUTtBQUFFLGVBQU8sSUFBSztBQUFBLE1BQUc7QUFDdEMsVUFBSSxhQUFhLFFBQVE7QUFBRSxtQkFBVztBQUFBLE1BQVE7QUFDOUMsVUFBSSxXQUFXLE9BQU8sS0FBSyxLQUFLLE9BQU87QUFDdkMsVUFBSSxTQUFTLFdBQVcsR0FBRztBQUN2QixlQUFPO0FBQUEsTUFDVjtBQU1ELGFBQU8sU0FBUyxTQUFTLEdBQUc7QUFDeEIsYUFBSywyQkFBMkI7QUFDaEMsaUJBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7QUFDdEMsY0FBSUMsU0FBUSxLQUFLLFFBQVEsU0FBUyxDQUFDLENBQUM7QUFDcEMsY0FBSSxZQUFZLENBQUM7QUFDakIsY0FBSUEsVUFBU0EsT0FBTSxPQUFPLE1BQU0sU0FBUyxNQUFNLFNBQVMsQ0FBQyxVQUFVO0FBQy9ELG1CQUFPLEtBQUssUUFBUSxTQUFTLENBQUMsQ0FBQztBQUFBLFVBQ2xDO0FBQUEsUUFDSjtBQUNELG1CQUFXLE9BQU8sS0FBSyxLQUFLLHdCQUF3QjtBQUFBLE1BQ3ZEO0FBQ0QsYUFBTztBQUFBLElBQ2Y7QUFDSSxXQUFPRDtBQUFBLEVBQ1gsRUFBQztBQUFBO0FBS0QsSUFBSSxnQkFBZ0I7QUFBQSxFQUNoQixRQUFRLFNBQVUsR0FBRyxHQUFHO0FBQ3BCLFFBQUksSUFBSSxFQUFFLFNBQVM7QUFDbkIsUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksS0FBSyxNQUFNLENBQUM7QUFDcEIsUUFBSSxLQUFLLGNBQWMsTUFBTTtBQUM3QixRQUFJLElBQUksR0FBRztBQUNQLGFBQU8sR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0FBQUEsSUFDMUI7QUFDRCxRQUFJLElBQUksR0FBRztBQUNQLGFBQU8sR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztBQUFBLElBQ2xDO0FBQ0QsV0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7QUFBQSxFQUNsRDtBQUFBLEVBQ0QsUUFBUSxTQUFVLEdBQUcsR0FBRztBQUNwQixRQUFJLElBQUk7QUFDUixRQUFJLElBQUksRUFBRSxTQUFTO0FBQ25CLFFBQUksS0FBSyxLQUFLO0FBQ2QsUUFBSSxLQUFLLGNBQWMsTUFBTTtBQUM3QixhQUFTLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSztBQUN6QixXQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7QUFBQSxJQUNwRDtBQUNELFdBQU87QUFBQSxFQUNWO0FBQUEsRUFDRCxZQUFZLFNBQVUsR0FBRyxHQUFHO0FBQ3hCLFFBQUksSUFBSSxFQUFFLFNBQVM7QUFDbkIsUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksS0FBSyxNQUFNLENBQUM7QUFDcEIsUUFBSSxLQUFLLGNBQWMsTUFBTTtBQUM3QixRQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHO0FBQ2YsVUFBSSxJQUFJLEdBQUc7QUFDUCxZQUFJLEtBQUssTUFBTyxJQUFJLEtBQUssSUFBSTtNQUNoQztBQUNELGFBQU8sR0FBRyxHQUFHLElBQUksSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztBQUFBLElBQzVFLE9BQ0k7QUFDRCxVQUFJLElBQUksR0FBRztBQUNQLGVBQU8sRUFBRSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFBQSxNQUN0RDtBQUNELFVBQUksSUFBSSxHQUFHO0FBQ1AsZUFBTyxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7QUFBQSxNQUNqRTtBQUNELGFBQU8sR0FBRyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztBQUFBLElBQzlGO0FBQUEsRUFDSjtBQUFBLEVBQ0QsT0FBTztBQUFBLElBQ0gsUUFBUSxTQUFVLElBQUksSUFBSSxHQUFHO0FBQ3pCLGNBQVEsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUMxQjtBQUFBLElBQ0QsV0FBVyxTQUFVLEdBQUcsR0FBRztBQUN2QixVQUFJLEtBQUssY0FBYyxNQUFNO0FBQzdCLGFBQU8sR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFBQSxJQUNsQztBQUFBLElBQ0QsV0FBWSxXQUFZO0FBQ3BCLFVBQUksSUFBSSxDQUFDLENBQUM7QUFDVixhQUFPLFNBQVUsR0FBRztBQUNoQixZQUFJLElBQUk7QUFDUixZQUFJLEVBQUUsQ0FBQyxHQUFHO0FBQ04saUJBQU8sRUFBRSxDQUFDO0FBQUEsUUFDYjtBQUNELGlCQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSztBQUN4QixlQUFLO0FBQUEsUUFDUjtBQUNELFVBQUUsQ0FBQyxJQUFJO0FBQ1AsZUFBTztBQUFBLE1BQ3ZCO0FBQUEsSUFDQSxFQUFZO0FBQUEsSUFDSixZQUFZLFNBQVUsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHO0FBQ3JDLFVBQUksTUFBTSxLQUFLLE1BQU07QUFDckIsVUFBSSxNQUFNLEtBQUssTUFBTTtBQUNyQixVQUFJLEtBQUssSUFBSTtBQUNiLFVBQUksS0FBSyxJQUFJO0FBQ2IsY0FBUSxJQUFJLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBTSxNQUFNLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLE1BQU0sS0FBSyxLQUFLLElBQUk7QUFBQSxJQUM5RjtBQUFBLEVBQ0o7QUFDTDtBQUtBLElBQUk7QUFBQTtBQUFBLEVBQTBCLFdBQVk7QUFDdEMsYUFBU0UsWUFBVztBQUFBLElBQ25CO0FBQ0QsSUFBQUEsVUFBUyxTQUFTLFdBQVk7QUFDMUIsYUFBT0EsVUFBUztBQUFBLElBQ3hCO0FBQ0ksSUFBQUEsVUFBUyxVQUFVO0FBQ25CLFdBQU9BO0FBQUEsRUFDWCxFQUFDO0FBQUE7QUFFRCxJQUFJLFlBQVksSUFBSTtBQVVwQixJQUFJO0FBQUE7QUFBQSxFQUF1QixXQUFZO0FBQ25DLGFBQVNDLE9BQU0sU0FBUyxRQUFRO0FBQzVCLFVBQUksV0FBVyxRQUFRO0FBQUUsaUJBQVM7QUFBQSxNQUFZO0FBQzlDLFdBQUssVUFBVTtBQUNmLFdBQUssU0FBUztBQUNkLFdBQUssWUFBWTtBQUNqQixXQUFLLGNBQWM7QUFDbkIsV0FBSyxlQUFlO0FBQ3BCLFdBQUssYUFBYTtBQUNsQixXQUFLLHFCQUFxQjtBQUMxQixXQUFLLFlBQVk7QUFDakIsV0FBSyxhQUFhO0FBQ2xCLFdBQUssaUJBQWlCO0FBQ3RCLFdBQUssVUFBVTtBQUNmLFdBQUssUUFBUTtBQUNiLFdBQUssYUFBYTtBQUNsQixXQUFLLFlBQVk7QUFDakIsV0FBSyxhQUFhO0FBQ2xCLFdBQUssYUFBYTtBQUNsQixXQUFLLGtCQUFrQixPQUFPLE9BQU87QUFDckMsV0FBSyx5QkFBeUIsY0FBYztBQUU1QyxXQUFLLGlCQUFpQjtBQUN0QixXQUFLLHdCQUF3QjtBQUM3QixXQUFLLDZCQUE2QjtBQUNsQyxXQUFLLE1BQU0sU0FBUztBQUNwQixXQUFLLGtCQUFrQjtBQUN2QixXQUFLLHNCQUFzQjtBQUMzQixXQUFLLFdBQVc7QUFBQSxJQUNuQjtBQUNELElBQUFBLE9BQU0sVUFBVSxRQUFRLFdBQVk7QUFDaEMsYUFBTyxLQUFLO0FBQUEsSUFDcEI7QUFDSSxJQUFBQSxPQUFNLFVBQVUsWUFBWSxXQUFZO0FBQ3BDLGFBQU8sS0FBSztBQUFBLElBQ3BCO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLFdBQVcsV0FBWTtBQUNuQyxhQUFPLEtBQUs7QUFBQSxJQUNwQjtBQUNJLElBQUFBLE9BQU0sVUFBVSxjQUFjLFdBQVk7QUFDdEMsYUFBTyxLQUFLO0FBQUEsSUFDcEI7QUFDSSxJQUFBQSxPQUFNLFVBQVUsS0FBSyxTQUFVLFFBQVEsVUFBVTtBQUM3QyxVQUFJLGFBQWEsUUFBUTtBQUFFLG1CQUFXO0FBQUEsTUFBTztBQUM3QyxVQUFJLEtBQUs7QUFDTCxjQUFNLElBQUksTUFBTSx5RkFBeUY7QUFDN0csV0FBSyxhQUFhO0FBQ2xCLFdBQUssc0JBQXNCO0FBQzNCLFdBQUssWUFBWSxXQUFXLElBQUksSUFBSTtBQUNwQyxhQUFPO0FBQUEsSUFDZjtBQUNJLElBQUFBLE9BQU0sVUFBVSxXQUFXLFNBQVUsVUFBVTtBQUMzQyxVQUFJLGFBQWEsUUFBUTtBQUFFLG1CQUFXO0FBQUEsTUFBTztBQUM3QyxXQUFLLFlBQVksV0FBVyxJQUFJLElBQUk7QUFDcEMsYUFBTztBQUFBLElBQ2Y7QUFDSSxJQUFBQSxPQUFNLFVBQVUsVUFBVSxTQUFVLFNBQVM7QUFDekMsVUFBSSxZQUFZLFFBQVE7QUFBRSxrQkFBVTtBQUFBLE1BQVE7QUFDNUMsV0FBSyxhQUFhO0FBQ2xCLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLFFBQVEsU0FBVSxNQUFNLHdCQUF3QjtBQUM1RCxVQUFJLFNBQVMsUUFBUTtBQUFFLGVBQU8sSUFBSztBQUFBLE1BQUc7QUFDdEMsVUFBSSwyQkFBMkIsUUFBUTtBQUFFLGlDQUF5QjtBQUFBLE1BQVE7QUFDMUUsVUFBSSxLQUFLLFlBQVk7QUFDakIsZUFBTztBQUFBLE1BQ1Y7QUFFRCxXQUFLLFVBQVUsS0FBSyxPQUFPLElBQUksSUFBSTtBQUNuQyxXQUFLLFVBQVUsS0FBSztBQUNwQixVQUFJLEtBQUssV0FBVztBQUdoQixhQUFLLFlBQVk7QUFDakIsaUJBQVMsWUFBWSxLQUFLLG9CQUFvQjtBQUMxQyxlQUFLLDBCQUEwQixRQUFRO0FBQ3ZDLGVBQUssYUFBYSxRQUFRLElBQUksS0FBSyxtQkFBbUIsUUFBUTtBQUFBLFFBQ2pFO0FBQUEsTUFDSjtBQUNELFdBQUssYUFBYTtBQUNsQixXQUFLLFlBQVk7QUFDakIsV0FBSyx3QkFBd0I7QUFDN0IsV0FBSyw2QkFBNkI7QUFDbEMsV0FBSyxrQkFBa0I7QUFDdkIsV0FBSyxhQUFhO0FBQ2xCLFdBQUssY0FBYyxLQUFLO0FBQ3hCLFVBQUksQ0FBQyxLQUFLLHVCQUF1Qix3QkFBd0I7QUFDckQsYUFBSyxzQkFBc0I7QUFFM0IsWUFBSSxDQUFDLEtBQUssWUFBWTtBQUNsQixjQUFJLE1BQU0sQ0FBQTtBQUNWLG1CQUFTLFFBQVEsS0FBSztBQUNsQixnQkFBSSxJQUFJLElBQUksS0FBSyxXQUFXLElBQUk7QUFDcEMsZUFBSyxhQUFhO0FBQUEsUUFDckI7QUFDRCxhQUFLLGlCQUFpQixLQUFLLFNBQVMsS0FBSyxjQUFjLEtBQUssWUFBWSxLQUFLLG9CQUFvQixzQkFBc0I7QUFBQSxNQUMxSDtBQUNELGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLHlCQUF5QixTQUFVLE1BQU07QUFDckQsYUFBTyxLQUFLLE1BQU0sTUFBTSxJQUFJO0FBQUEsSUFDcEM7QUFDSSxJQUFBQSxPQUFNLFVBQVUsbUJBQW1CLFNBQVUsU0FBUyxjQUFjLFlBQVksb0JBQW9CLHdCQUF3QjtBQUN4SCxlQUFTLFlBQVksWUFBWTtBQUM3QixZQUFJLGFBQWEsUUFBUSxRQUFRO0FBQ2pDLFlBQUksb0JBQW9CLE1BQU0sUUFBUSxVQUFVO0FBQ2hELFlBQUksV0FBVyxvQkFBb0IsVUFBVSxPQUFPO0FBQ3BELFlBQUksc0JBQXNCLENBQUMscUJBQXFCLE1BQU0sUUFBUSxXQUFXLFFBQVEsQ0FBQztBQUdsRixZQUFJLGFBQWEsZUFBZSxhQUFhLFlBQVk7QUFDckQ7QUFBQSxRQUNIO0FBRUQsWUFBSSxxQkFBcUI7QUFDckIsY0FBSSxZQUFZLFdBQVcsUUFBUTtBQUNuQyxjQUFJLFVBQVUsV0FBVyxHQUFHO0FBQ3hCO0FBQUEsVUFDSDtBQUdELGNBQUksT0FBTyxDQUFDLFVBQVU7QUFDdEIsbUJBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLElBQUksR0FBRyxLQUFLLEdBQUc7QUFDakQsZ0JBQUksUUFBUSxLQUFLLHFCQUFxQixZQUFZLFVBQVUsQ0FBQyxDQUFDO0FBQzlELGdCQUFJLE1BQU0sS0FBSyxHQUFHO0FBQ2Qsb0NBQXNCO0FBQ3RCLHNCQUFRLEtBQUssNkNBQTZDO0FBQzFEO0FBQUEsWUFDSDtBQUNELGlCQUFLLEtBQUssS0FBSztBQUFBLFVBQ2xCO0FBQ0QsY0FBSSxxQkFBcUI7QUFFckIsdUJBQVcsUUFBUSxJQUFJO0FBQUEsVUFFMUI7QUFBQSxRQUNKO0FBRUQsYUFBSyxhQUFhLFlBQVksc0JBQXNCLGNBQWMsQ0FBQyxxQkFBcUI7QUFDcEYsdUJBQWEsUUFBUSxJQUFJLG9CQUFvQixDQUFBLElBQUssQ0FBQTtBQUNsRCxjQUFJLGVBQWU7QUFDbkIsbUJBQVMsUUFBUSxjQUFjO0FBQzNCLHlCQUFhLFFBQVEsRUFBRSxJQUFJLElBQUksYUFBYSxJQUFJO0FBQUEsVUFDbkQ7QUFFRCw2QkFBbUIsUUFBUSxJQUFJLG9CQUFvQixDQUFBLElBQUssQ0FBQTtBQUN4RCxjQUFJLFlBQVksV0FBVyxRQUFRO0FBRW5DLGNBQUksQ0FBQyxLQUFLLFlBQVk7QUFDbEIsZ0JBQUksTUFBTSxDQUFBO0FBQ1YscUJBQVMsUUFBUTtBQUNiLGtCQUFJLElBQUksSUFBSSxVQUFVLElBQUk7QUFDOUIsdUJBQVcsUUFBUSxJQUFJLFlBQVk7QUFBQSxVQUN0QztBQUNELGVBQUssaUJBQWlCLGNBQWMsYUFBYSxRQUFRLEdBQUcsV0FBVyxtQkFBbUIsUUFBUSxHQUFHLHNCQUFzQjtBQUFBLFFBQzlILE9BQ0k7QUFFRCxjQUFJLE9BQU8sYUFBYSxRQUFRLE1BQU0sZUFBZSx3QkFBd0I7QUFDekUseUJBQWEsUUFBUSxJQUFJO0FBQUEsVUFDNUI7QUFDRCxjQUFJLENBQUMsbUJBQW1CO0FBR3BCLHlCQUFhLFFBQVEsS0FBSztBQUFBLFVBQzdCO0FBQ0QsY0FBSSxxQkFBcUI7QUFHckIsK0JBQW1CLFFBQVEsSUFBSSxXQUFXLFFBQVEsRUFBRSxNQUFLLEVBQUc7VUFDL0QsT0FDSTtBQUNELCtCQUFtQixRQUFRLElBQUksYUFBYSxRQUFRLEtBQUs7QUFBQSxVQUM1RDtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDVDtBQUNJLElBQUFBLE9BQU0sVUFBVSxPQUFPLFdBQVk7QUFDL0IsVUFBSSxDQUFDLEtBQUssaUJBQWlCO0FBQ3ZCLGFBQUssa0JBQWtCO0FBQ3ZCLGFBQUssa0JBQWlCO0FBQUEsTUFDekI7QUFDRCxVQUFJLENBQUMsS0FBSyxZQUFZO0FBQ2xCLGVBQU87QUFBQSxNQUNWO0FBRUQsV0FBSyxVQUFVLEtBQUssT0FBTyxPQUFPLElBQUk7QUFDdEMsV0FBSyxhQUFhO0FBQ2xCLFdBQUssWUFBWTtBQUNqQixVQUFJLEtBQUssaUJBQWlCO0FBQ3RCLGFBQUssZ0JBQWdCLEtBQUssT0FBTztBQUFBLE1BQ3BDO0FBQ0QsYUFBTztBQUFBLElBQ2Y7QUFDSSxJQUFBQSxPQUFNLFVBQVUsTUFBTSxXQUFZO0FBQzlCLFdBQUssV0FBVztBQUNoQixXQUFLLE9BQU8sUUFBUTtBQUNwQixhQUFPO0FBQUEsSUFDZjtBQUNJLElBQUFBLE9BQU0sVUFBVSxRQUFRLFNBQVUsTUFBTTtBQUNwQyxVQUFJLFNBQVMsUUFBUTtBQUFFLGVBQU8sSUFBSztBQUFBLE1BQUc7QUFDdEMsVUFBSSxLQUFLLGFBQWEsQ0FBQyxLQUFLLFlBQVk7QUFDcEMsZUFBTztBQUFBLE1BQ1Y7QUFDRCxXQUFLLFlBQVk7QUFDakIsV0FBSyxjQUFjO0FBRW5CLFdBQUssVUFBVSxLQUFLLE9BQU8sT0FBTyxJQUFJO0FBQ3RDLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLFNBQVMsU0FBVSxNQUFNO0FBQ3JDLFVBQUksU0FBUyxRQUFRO0FBQUUsZUFBTyxJQUFLO0FBQUEsTUFBRztBQUN0QyxVQUFJLENBQUMsS0FBSyxhQUFhLENBQUMsS0FBSyxZQUFZO0FBQ3JDLGVBQU87QUFBQSxNQUNWO0FBQ0QsV0FBSyxZQUFZO0FBQ2pCLFdBQUssY0FBYyxPQUFPLEtBQUs7QUFDL0IsV0FBSyxjQUFjO0FBRW5CLFdBQUssVUFBVSxLQUFLLE9BQU8sSUFBSSxJQUFJO0FBQ25DLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLG9CQUFvQixXQUFZO0FBQzVDLGVBQVMsSUFBSSxHQUFHLG1CQUFtQixLQUFLLGVBQWUsUUFBUSxJQUFJLGtCQUFrQixLQUFLO0FBQ3RGLGFBQUssZUFBZSxDQUFDLEVBQUUsS0FBSTtBQUFBLE1BQzlCO0FBQ0QsYUFBTztBQUFBLElBQ2Y7QUFDSSxJQUFBQSxPQUFNLFVBQVUsUUFBUSxTQUFVLE9BQU87QUFDckMsVUFBSSxVQUFVLFFBQVE7QUFBRSxnQkFBUTtBQUFBLE1BQVk7QUFDNUMsV0FBSyxTQUFTO0FBQ2QsYUFBTztBQUFBLElBQ2Y7QUFDSSxJQUFBQSxPQUFNLFVBQVUsUUFBUSxTQUFVLFFBQVE7QUFDdEMsVUFBSSxXQUFXLFFBQVE7QUFBRSxpQkFBUztBQUFBLE1BQUk7QUFDdEMsV0FBSyxhQUFhO0FBQ2xCLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLFNBQVMsU0FBVSxPQUFPO0FBQ3RDLFVBQUksVUFBVSxRQUFRO0FBQUUsZ0JBQVE7QUFBQSxNQUFJO0FBQ3BDLFdBQUssaUJBQWlCO0FBQ3RCLFdBQUssVUFBVTtBQUNmLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLGNBQWMsU0FBVSxRQUFRO0FBQzVDLFdBQUssbUJBQW1CO0FBQ3hCLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLE9BQU8sU0FBVSxNQUFNO0FBQ25DLFVBQUksU0FBUyxRQUFRO0FBQUUsZUFBTztBQUFBLE1BQVE7QUFDdEMsV0FBSyxRQUFRO0FBQ2IsYUFBTztBQUFBLElBQ2Y7QUFDSSxJQUFBQSxPQUFNLFVBQVUsU0FBUyxTQUFVLGdCQUFnQjtBQUMvQyxVQUFJLG1CQUFtQixRQUFRO0FBQUUseUJBQWlCLE9BQU8sT0FBTztBQUFBLE1BQU87QUFDdkUsV0FBSyxrQkFBa0I7QUFDdkIsYUFBTztBQUFBLElBQ2Y7QUFDSSxJQUFBQSxPQUFNLFVBQVUsZ0JBQWdCLFNBQVUsdUJBQXVCO0FBQzdELFVBQUksMEJBQTBCLFFBQVE7QUFBRSxnQ0FBd0IsY0FBYztBQUFBLE1BQVM7QUFDdkYsV0FBSyx5QkFBeUI7QUFDOUIsYUFBTztBQUFBLElBQ2Y7QUFFSSxJQUFBQSxPQUFNLFVBQVUsUUFBUSxXQUFZO0FBQ2hDLFVBQUksU0FBUyxDQUFBO0FBQ2IsZUFBUyxLQUFLLEdBQUcsS0FBSyxVQUFVLFFBQVEsTUFBTTtBQUMxQyxlQUFPLEVBQUUsSUFBSSxVQUFVLEVBQUU7QUFBQSxNQUM1QjtBQUNELFdBQUssaUJBQWlCO0FBQ3RCLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLFVBQVUsU0FBVSxVQUFVO0FBQzFDLFdBQUssbUJBQW1CO0FBQ3hCLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLGVBQWUsU0FBVSxVQUFVO0FBQy9DLFdBQUssd0JBQXdCO0FBQzdCLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLFdBQVcsU0FBVSxVQUFVO0FBQzNDLFdBQUssb0JBQW9CO0FBQ3pCLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLFdBQVcsU0FBVSxVQUFVO0FBQzNDLFdBQUssb0JBQW9CO0FBQ3pCLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLGFBQWEsU0FBVSxVQUFVO0FBQzdDLFdBQUssc0JBQXNCO0FBQzNCLGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLFNBQVMsU0FBVSxVQUFVO0FBQ3pDLFdBQUssa0JBQWtCO0FBQ3ZCLGFBQU87QUFBQSxJQUNmO0FBTUksSUFBQUEsT0FBTSxVQUFVLFNBQVMsU0FBVSxNQUFNLFdBQVc7QUFDaEQsVUFBSSxRQUFRO0FBQ1osVUFBSTtBQUNKLFVBQUksU0FBUyxRQUFRO0FBQUUsZUFBTyxJQUFLO0FBQUEsTUFBRztBQUN0QyxVQUFJLGNBQWMsUUFBUTtBQUFFLG9CQUFZO0FBQUEsTUFBTztBQUMvQyxVQUFJLEtBQUs7QUFDTCxlQUFPO0FBQ1gsVUFBSTtBQUNKLFVBQUksVUFBVSxLQUFLLGFBQWEsS0FBSztBQUNyQyxVQUFJLENBQUMsS0FBSyxZQUFZLENBQUMsS0FBSyxZQUFZO0FBQ3BDLFlBQUksT0FBTztBQUNQLGlCQUFPO0FBQ1gsWUFBSTtBQUNBLGVBQUssTUFBTSxNQUFNLElBQUk7QUFBQSxNQUM1QjtBQUNELFdBQUssV0FBVztBQUNoQixVQUFJLE9BQU8sS0FBSyxZQUFZO0FBQ3hCLGVBQU87QUFBQSxNQUNWO0FBQ0QsVUFBSSxLQUFLLDBCQUEwQixPQUFPO0FBQ3RDLFlBQUksS0FBSyxrQkFBa0I7QUFDdkIsZUFBSyxpQkFBaUIsS0FBSyxPQUFPO0FBQUEsUUFDckM7QUFDRCxhQUFLLHdCQUF3QjtBQUFBLE1BQ2hDO0FBQ0QsVUFBSSxLQUFLLCtCQUErQixPQUFPO0FBQzNDLFlBQUksS0FBSyx1QkFBdUI7QUFDNUIsZUFBSyxzQkFBc0IsS0FBSyxPQUFPO0FBQUEsUUFDMUM7QUFDRCxhQUFLLDZCQUE2QjtBQUFBLE1BQ3JDO0FBQ0QsVUFBSSxjQUFjLE9BQU8sS0FBSztBQUM5QixVQUFJLG1CQUFtQixLQUFLLGNBQWMsS0FBSyxLQUFLLHNCQUFzQixRQUFRLE9BQU8sU0FBUyxLQUFLLEtBQUs7QUFDNUcsVUFBSSxZQUFZLEtBQUssWUFBWSxLQUFLLFVBQVU7QUFDaEQsVUFBSSwwQkFBMEIsV0FBWTtBQUN0QyxZQUFJLE1BQU0sY0FBYztBQUNwQixpQkFBTztBQUNYLFlBQUksY0FBYyxXQUFXO0FBQ3pCLGlCQUFPO0FBQUEsUUFDVjtBQUNELFlBQUksZ0JBQWdCLEtBQUssTUFBTSxjQUFjLGdCQUFnQjtBQUM3RCxZQUFJLHdCQUF3QixjQUFjLGdCQUFnQjtBQUcxRCxZQUFJLFVBQVUsS0FBSyxJQUFJLHdCQUF3QixNQUFNLFdBQVcsQ0FBQztBQUNqRSxZQUFJLFlBQVksS0FBSyxnQkFBZ0IsTUFBTSxXQUFXO0FBQ2xELGlCQUFPO0FBQUEsUUFDVjtBQUNELGVBQU87QUFBQSxNQUNuQjtBQUNRLFVBQUksVUFBVTtBQUNkLFVBQUksUUFBUSxLQUFLLGdCQUFnQixPQUFPO0FBRXhDLFdBQUssa0JBQWtCLEtBQUssU0FBUyxLQUFLLGNBQWMsS0FBSyxZQUFZLEtBQUs7QUFDOUUsVUFBSSxLQUFLLG1CQUFtQjtBQUN4QixhQUFLLGtCQUFrQixLQUFLLFNBQVMsT0FBTztBQUFBLE1BQy9DO0FBQ0QsVUFBSSxLQUFLLGNBQWMsS0FBSyxlQUFlLEtBQUssV0FBVztBQUN2RCxZQUFJLEtBQUssVUFBVSxHQUFHO0FBQ2xCLGNBQUksZ0JBQWdCLEtBQUssSUFBSSxLQUFLLE9BQU8sY0FBYyxLQUFLLGFBQWEsZ0JBQWdCLElBQUksR0FBRyxLQUFLLE9BQU87QUFDNUcsY0FBSSxTQUFTLEtBQUssT0FBTyxHQUFHO0FBQ3hCLGlCQUFLLFdBQVc7QUFBQSxVQUNuQjtBQUVELGVBQUssWUFBWSxLQUFLLG9CQUFvQjtBQUN0QyxnQkFBSSxDQUFDLEtBQUssU0FBUyxPQUFPLEtBQUssV0FBVyxRQUFRLE1BQU0sVUFBVTtBQUM5RCxtQkFBSyxtQkFBbUIsUUFBUTtBQUFBO0FBQUEsY0FHNUIsS0FBSyxtQkFBbUIsUUFBUSxJQUFJLFdBQVcsS0FBSyxXQUFXLFFBQVEsQ0FBQztBQUFBLFlBQy9FO0FBQ0QsZ0JBQUksS0FBSyxPQUFPO0FBQ1osbUJBQUssMEJBQTBCLFFBQVE7QUFBQSxZQUMxQztBQUNELGlCQUFLLGFBQWEsUUFBUSxJQUFJLEtBQUssbUJBQW1CLFFBQVE7QUFBQSxVQUNqRTtBQUNELGNBQUksS0FBSyxPQUFPO0FBQ1osaUJBQUssWUFBWSxDQUFDLEtBQUs7QUFBQSxVQUMxQjtBQUNELGVBQUssY0FBYyxtQkFBbUI7QUFDdEMsY0FBSSxLQUFLLG1CQUFtQjtBQUN4QixpQkFBSyxrQkFBa0IsS0FBSyxPQUFPO0FBQUEsVUFDdEM7QUFDRCxlQUFLLDZCQUE2QjtBQUNsQyxpQkFBTztBQUFBLFFBQ1YsT0FDSTtBQUNELGNBQUksS0FBSyxxQkFBcUI7QUFDMUIsaUJBQUssb0JBQW9CLEtBQUssT0FBTztBQUFBLFVBQ3hDO0FBQ0QsbUJBQVMsSUFBSSxHQUFHLG1CQUFtQixLQUFLLGVBQWUsUUFBUSxJQUFJLGtCQUFrQixLQUFLO0FBR3RGLGlCQUFLLGVBQWUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxhQUFhLEtBQUssV0FBVyxLQUFLO0FBQUEsVUFDdkU7QUFDRCxlQUFLLGFBQWE7QUFDbEIsaUJBQU87QUFBQSxRQUNWO0FBQUEsTUFDSjtBQUNELGFBQU87QUFBQSxJQUNmO0FBQ0ksSUFBQUEsT0FBTSxVQUFVLG9CQUFvQixTQUFVLFNBQVMsY0FBYyxZQUFZLE9BQU87QUFDcEYsZUFBUyxZQUFZLFlBQVk7QUFFN0IsWUFBSSxhQUFhLFFBQVEsTUFBTSxRQUFXO0FBQ3RDO0FBQUEsUUFDSDtBQUNELFlBQUksUUFBUSxhQUFhLFFBQVEsS0FBSztBQUN0QyxZQUFJLE1BQU0sV0FBVyxRQUFRO0FBQzdCLFlBQUksZUFBZSxNQUFNLFFBQVEsUUFBUSxRQUFRLENBQUM7QUFDbEQsWUFBSSxhQUFhLE1BQU0sUUFBUSxHQUFHO0FBQ2xDLFlBQUksc0JBQXNCLENBQUMsZ0JBQWdCO0FBQzNDLFlBQUkscUJBQXFCO0FBQ3JCLGtCQUFRLFFBQVEsSUFBSSxLQUFLLHVCQUF1QixLQUFLLEtBQUs7QUFBQSxRQUM3RCxXQUNRLE9BQU8sUUFBUSxZQUFZLEtBQUs7QUFHckMsZUFBSyxrQkFBa0IsUUFBUSxRQUFRLEdBQUcsT0FBTyxLQUFLLEtBQUs7QUFBQSxRQUM5RCxPQUNJO0FBRUQsZ0JBQU0sS0FBSyxxQkFBcUIsT0FBTyxHQUFHO0FBRTFDLGNBQUksT0FBTyxRQUFRLFVBQVU7QUFHekIsb0JBQVEsUUFBUSxJQUFJLFNBQVMsTUFBTSxTQUFTO0FBQUEsVUFDL0M7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ1Q7QUFDSSxJQUFBQSxPQUFNLFVBQVUsdUJBQXVCLFNBQVUsT0FBTyxLQUFLO0FBQ3pELFVBQUksT0FBTyxRQUFRLFVBQVU7QUFDekIsZUFBTztBQUFBLE1BQ1Y7QUFDRCxVQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUs7QUFDaEQsZUFBTyxRQUFRLFdBQVcsR0FBRztBQUFBLE1BQ2hDO0FBQ0QsYUFBTyxXQUFXLEdBQUc7QUFBQSxJQUM3QjtBQUNJLElBQUFBLE9BQU0sVUFBVSw0QkFBNEIsU0FBVSxVQUFVO0FBQzVELFVBQUksTUFBTSxLQUFLLG1CQUFtQixRQUFRO0FBQzFDLFVBQUksV0FBVyxLQUFLLFdBQVcsUUFBUTtBQUN2QyxVQUFJLE9BQU8sYUFBYSxVQUFVO0FBQzlCLGFBQUssbUJBQW1CLFFBQVEsSUFBSSxLQUFLLG1CQUFtQixRQUFRLElBQUksV0FBVyxRQUFRO0FBQUEsTUFDOUYsT0FDSTtBQUNELGFBQUssbUJBQW1CLFFBQVEsSUFBSSxLQUFLLFdBQVcsUUFBUTtBQUFBLE1BQy9EO0FBQ0QsV0FBSyxXQUFXLFFBQVEsSUFBSTtBQUFBLElBQ3BDO0FBQ0ksV0FBT0E7QUFBQSxFQUNYLEVBQUM7QUFBQTtBQW1CRCxJQUFJLFFBQVE7QUFLQyxNQUFNLE9BQU8sS0FBSyxLQUFLO0FBQ3BCLE1BQU0sVUFBVSxLQUFLLEtBQUs7QUFDaEMsTUFBTSxJQUFJLEtBQUssS0FBSztBQUNqQixNQUFNLE9BQU8sS0FBSyxLQUFLO0FBQ3ZCLE1BQU0sT0FBTyxLQUFLLEtBQUs7QUNsMUJwQyxTQUF3QixNQUFNLE1BQVcsSUFBUyxVQUFrQixTQUFTLE9BQU8sT0FBTyxNQUFNO0FBQy9GLFFBQU0sZ0JBQWdCLElBQUksTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxPQUFPLE1BQU0sRUFBRSxNQUFNO0FBRTVFLFdBQVMsUUFBUSxNQUFjO0FBQ3pCLFFBQUEsQ0FBQyxjQUFjLE9BQU8sSUFBSTtBQUFHO0FBQ2pDLDBCQUFzQixPQUFPO0FBQUEsRUFDL0I7QUFDQSx3QkFBc0IsT0FBTztBQUV0QixTQUFBO0FBQ1Q7QUNPWSxJQUFBLHVDQUFBQyx3QkFBTDtBQUNMQSxzQkFBQSxVQUFTLElBQUE7QUFDVEEsc0JBQUEsTUFBSyxJQUFBO0FBQ0xBLHNCQUFBLE1BQUssSUFBQTtBQUhLQSxTQUFBQTtBQUFBLEdBQUEsc0JBQUEsQ0FBQSxDQUFBO0FDZlosTUFBTSxlQUE4QixPQUFPLHVCQUF1QjtBQU1sRSxTQUFTLDRCQUFnRCxVQUV2RDtBQUNJLE1BQUEsQ0FBQyxTQUFTLFlBQVksR0FBRztBQUNsQixhQUFBLFlBQVksSUFBSTtFQUMzQjtBQUNBLFNBQU8sU0FBUyxZQUFZO0FBQzlCO0FBRUEsU0FBUywwQkFBMEIsVUFBZTtBQUM1QyxNQUFBLENBQUMsU0FBUyxZQUFZLEdBQUc7QUFDM0IsV0FBTyxTQUFTLFlBQVk7QUFBQSxFQUM5QjtBQUNGO0FBYUEsTUFBTSxVQUE2QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLakMsWUFBWSxNQUF3QjtBQUM1QixVQUFBLFNBQVMsNEJBQStCLElBQUk7QUFDbEQsV0FBTyxVQUFVLE9BQU8sSUFBSSxLQUFLLE9BQU8sSUFBSSxFQUFFLFNBQVM7QUFBQSxFQUN6RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV0EsR0FDRSxNQUNBLFVBQ0EsTUFDWTtBQUNOLFVBQUEsU0FBUyw0QkFBK0IsSUFBSTtBQUM5QyxRQUFBLENBQUMsT0FBTyxJQUFJO0FBQVUsYUFBQSxJQUFJLElBQUk7QUFDbEMsV0FBTyxJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQWlCLFFBQVEsS0FBSyxDQUFDO0FBQ2xELFdBQU8sTUFBTSxLQUFLLElBQUksTUFBTSxRQUFRO0FBQUEsRUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVQSxLQUNFLE1BQ0EsVUFDWTtBQUNaLFdBQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxJQUFJO0FBQUEsRUFDckM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVdBLElBQ0UsTUFDQSxVQUNNO0FBQ04sUUFBSSxTQUFTLFFBQVc7QUFDdEIsZ0NBQTBCLElBQUk7QUFDOUI7QUFBQSxJQUNGO0FBQ00sVUFBQSxTQUFTLDRCQUErQixJQUFJO0FBQzlDLFFBQUEsQ0FBQyxPQUFPLElBQUk7QUFBVSxhQUFBLElBQUksSUFBSTtBQUNsQyxRQUFJLGFBQWEsUUFBVztBQUNuQixhQUFBLElBQUksRUFBRSxTQUFTO0FBQ3RCO0FBQUEsSUFDRjtBQUNBLFFBQUksUUFBUTtBQUNaLFdBQU8sUUFBUSxPQUFPLElBQUksRUFBRSxRQUFRLFNBQVM7QUFDM0MsVUFBSSxPQUFPLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNO0FBQVU7QUFBQSxJQUMzQztBQUNBLFFBQUksUUFBUSxPQUFPLElBQUksRUFBRSxRQUFRO0FBQy9CLGFBQU8sSUFBSSxFQUFFLE9BQU8sT0FBTyxDQUFDO0FBQUEsSUFDOUI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLEtBQXdCLFNBQVksTUFBaUM7QUFDbkUsUUFBSSxXQUFXO0FBQ1QsVUFBQSxTQUFTLDRCQUErQixJQUFJO0FBQ2xELFVBQU0sUUFBUSxPQUFPLElBQUksS0FBSyxDQUFBO0FBQ3JCLGFBQUEsT0FBTyxNQUFNLFNBQVM7QUFDN0IsWUFBTSxDQUFDLFVBQVUsT0FBTyxLQUFLLElBQUk7QUFDM0IsWUFBQSxTQUFTLFNBQVMsR0FBRyxJQUFJO0FBQzNCLFVBQUE7QUFBVyxhQUFBLElBQUksTUFBTSxRQUFRO0FBQ2pDLFVBQUksV0FBVztBQUFrQixtQkFBQTtBQUFBLElBQ25DO0FBQ08sV0FBQTtBQUFBLEVBQ1Q7QUFDRjtBQ3pJQSxTQUFTLEtBQUs7QUFDRixXQUFBLElBQUksS0FBSyxPQUFBLEtBQVksUUFBVyxHQUFHLFNBQVMsRUFBRSxFQUFFLFVBQVUsQ0FBQztBQUN2RTtBQUtBLFNBQXdCLE9BQU87QUFFckIsVUFBQSxPQUFPLE9BQU8sTUFBTSxPQUFPLE9BQU8sR0FBRyxFQUFFLE9BQU8sR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLElBQUksTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUN2RztBQ1hBLE1BQU0sa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUN5QmpCLE1BQU0sbUJBQW1CLFVBQThCO0FBQUEsRUE2QjVELFlBQVksU0FBNEI7QUFDaEM7QUE3QlI7QUFFTztBQUNBO0FBRUEsaUNBQVE7QUFFUixnQ0FBTyxLQUFLO0FBQ1o7QUFDQSxvQ0FBVztBQUVYO0FBQ0E7QUFDQSxnQ0FBMEMsQ0FBQTtBQUMxQyxvQ0FBcUMsQ0FBQTtBQWdCMUMsU0FBSyxVQUFVO0FBRVYsU0FBQSxjQUFjLFNBQVMsS0FBSztBQUM1QixTQUFBLGVBQWUsU0FBUyxLQUFLO0FBRTdCLFNBQUEsWUFBWSxLQUFLO0FBQ3RCLFNBQUssU0FBUztBQUNkLFNBQUssU0FBUztBQUFBLEVBQ2hCO0FBQUEsRUF0QkEsSUFBSSxRQUFRO0FBQ1YsV0FBTyxLQUFLLFFBQVE7QUFBQSxFQUN0QjtBQUFBLEVBRUEsSUFBSSxRQUFRO0FBQ1YsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBLEVBRUEsSUFBSSxNQUFNO0FBQ0QsV0FBQSxLQUFLLFFBQVEsT0FBTztBQUFBLEVBQzdCO0FBQUEsRUFjQSxnQkFBZ0I7QUFDZCxRQUFJLEtBQUssV0FBVztBQUNsQixhQUFPLEtBQUs7QUFBQSxJQUNkO0FBQ0ksUUFBQSxLQUFLLFFBQVEsV0FBVztBQUNyQixXQUFBLFFBQVEsVUFBVSxLQUFLO0FBQ3ZCLFdBQUEsWUFBWSxLQUFLLFFBQVE7QUFBQSxJQUNyQixXQUFBLENBQUMsU0FBUyxlQUFlLGdCQUFnQixHQUFHO0FBQy9DLFlBQUEsWUFBWSxTQUFTLGNBQWMsS0FBSztBQUM5QyxnQkFBVSxLQUFLO0FBQ04sZUFBQSxLQUFLLFlBQVksU0FBUztBQUNuQyxXQUFLLFlBQVk7QUFBQSxJQUFBLE9BQ1o7QUFDQSxXQUFBLFlBQVksU0FBUyxlQUFlLGdCQUFnQjtBQUFBLElBQzNEO0FBRUEsU0FBSyxVQUFVLFlBQVk7QUFFM0IsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLFdBQVcsV0FBbUI7QUFDdEIsVUFBQSxTQUFTLFNBQVMsY0FBYyxRQUFRO0FBQzlDLFdBQU8sWUFBWTtBQUNuQixXQUFPLFFBQVEsS0FBSztBQUNwQixXQUFPLFNBQVMsS0FBSztBQUNmLFVBQUEsTUFBTSxPQUFPLFdBQVcsSUFBSTtBQUNsQyxRQUFJLENBQUM7QUFBSztBQUNOLFFBQUEsWUFBWSxJQUFJLEtBQUs7QUFDekIsUUFBSSxVQUFVO0FBQ2QsUUFBSSxXQUFXO0FBQ1YsU0FBQSxVQUFVLFlBQVksTUFBTTtBQUMxQixXQUFBO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxXQUFXO0FBQ0gsVUFBQSxPQUF1QixTQUFTLGNBQWMsS0FBSztBQUN6RCxTQUFLLFlBQVk7QUFDWCxVQUFBLGFBQTZCLFNBQVMsY0FBYyxLQUFLO0FBQy9ELGVBQVcsWUFBWTtBQUVqQixVQUFBLFNBQVMsU0FBUyxjQUFjLEdBQUc7QUFDekMsV0FBTyxZQUFZO0FBQ1osV0FBQSxpQkFBaUIsU0FBUyxDQUFDLE1BQU07QVB2SHJDO0FPd0hELFFBQUUsZ0JBQWdCO0FBR2QsVUFBQSxLQUFLLFFBQVEsYUFBYTtBQUM1QixhQUFLLFFBQVE7TUFDZjtBQUVBLFVBQUksQ0FBQyxLQUFLLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssSUFBSSxFQUFFLFdBQVcsR0FBRztBQUN6RjtBQUFBLE1BQ0Y7QUFDQSxZQUFNLFdBQVcsS0FBSyxLQUFLLEtBQUssSUFBSSxFQUFFO0FBRXRDLFVBQUksVUFBVTtBQUNaLGFBQUssZ0JBQWdCO0FBQUEsVUFDbkIsTUFBTSxtQkFBbUI7QUFBQSxVQUN6QixPQUFPLEtBQUs7QUFBQSxVQUNaLE9BQU8sS0FBSztBQUFBLFVBQ1osT0FBTztBQUFBLFVBQ1AsTUFBTSxLQUFLO0FBQUEsUUFBQSxDQUNaO0FBQUEsTUFDSDtBQUVBLFlBQU0sUUFBTyxVQUFLLE9BQU8sS0FBSyxJQUFJLE1BQXJCLG1CQUF3QixXQUFXO0FBQ2hELFVBQUksQ0FBQyxLQUFLLE9BQU8sS0FBSyxJQUFJLEdBQUc7QUFDM0I7QUFBQSxNQUNGO0FBQ0EsWUFBTSxFQUFFLE9BQU8sV0FBVyxLQUFLLE9BQU8sS0FBSyxJQUFJO0FBQy9DLFVBQUksTUFBTTtBQUNSLGFBQUssVUFBVSxHQUFHLEdBQUcsT0FBTyxNQUFNO0FBQUEsTUFDcEM7QUFDQSxXQUFLLEtBQUssS0FBSyxJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQVksS0FBSyxlQUFlLEtBQUssTUFBTSxJQUFJLEVBQUUsVUFBVSxLQUFNLENBQUEsQ0FBQztBQUFBLElBQUEsQ0FFakc7QUFDSyxVQUFBLFVBQVUsU0FBUyxjQUFjLEdBQUc7QUFDMUMsWUFBUSxZQUFZO0FBQ1osWUFBQSxpQkFBaUIsU0FBUyxDQUFDLE1BQU07QUFDdkMsUUFBRSxnQkFBZ0I7QUFDbEIsV0FBSyxXQUFXO0FBRVosVUFBQSxLQUFLLFFBQVEsY0FBYztBQUM3QixhQUFLLFFBQVE7TUFDZjtBQUFBLElBQUEsQ0FDRDtBQUVLLFVBQUEsS0FBSyxDQUFDLFFBQVEsT0FBTztBQUN4QixPQUFBLFFBQVEsQ0FBQyxPQUFPO0FBQ1gsWUFBQSxLQUFLLFNBQVMsY0FBYyxHQUFHO0FBQ3JDLFNBQUcsWUFBWTtBQUNULFlBQUEsUUFBUSxTQUFTLGNBQWMsTUFBTTtBQUMzQyxZQUFNLFlBQVk7QUFFWixZQUFBLFlBQVksR0FBRyxVQUFVLFNBQVMsTUFBTSxJQUFJLEtBQUssUUFBUSxhQUFhLEtBQUssUUFBUTtBQUN6RixTQUFHLFlBQVksRUFBRTtBQUNqQixTQUFHLFlBQVksS0FBSztBQUFBLElBQUEsQ0FDckI7QUFFRCxlQUFXLFlBQVksTUFBTTtBQUM3QixlQUFXLFlBQVksT0FBTztBQUM5QixTQUFLLFlBQVksVUFBVTtBQUV0QixTQUFBLFVBQVUsWUFBWSxJQUFJO0FBRXhCLFdBQUE7QUFBQSxFQUNUO0FBQUEsRUFFQSxZQUFZO0FBQ1YsUUFBSSxLQUFLO0FBQU87QUFDaEIsUUFBSSxDQUFDLEtBQUssT0FBTyxLQUFLLElBQUksR0FBRztBQUMzQixXQUFLLE9BQU8sS0FBSyxJQUFJLElBQUksS0FBSyxXQUFXLG9CQUFvQjtBQUFBLElBQy9EO0FBQ0EsU0FBSyxVQUFVLFlBQVk7QUFDM0IsVUFBTSxhQUFhLEtBQUssT0FBTyxLQUFLLElBQUk7QUFFbEMsVUFBQSxPQUFPLFdBQVcsV0FBVyxJQUFJO0FBQ3ZDLFNBQUssVUFBVSxHQUFHLEdBQUcsV0FBVyxPQUFPLFdBQVcsTUFBTTtBQUN4RCxTQUFLLGdCQUFnQjtBQUNyQixTQUFLLFFBQVE7QUFDUixTQUFBLEtBQUssZUFBZSxJQUFJO0FBQUEsRUFDL0I7QUFBQSxFQUVBLGFBQWE7QUFDWCxRQUFJLENBQUMsS0FBSztBQUFPO0FBRWpCLFNBQUssVUFBVSxZQUFZO0FBQzNCLFNBQUssT0FBTztBQUNaLFNBQUssV0FBVztBQUNoQixXQUFPLEtBQUssS0FBSyxNQUFNLEVBQUUsUUFBUSxDQUFDLFFBQVE7QUFDeEMsV0FBSyxPQUFPLEdBQUcsRUFBRyxlQUFlLE1BQU07QUFDdkMsV0FBSyxPQUFPLEdBQUcsRUFBRyxjQUFjLE1BQU07QUFDdEMsV0FBSyxPQUFPLEdBQUcsRUFBRyxhQUFhLE1BQU07QUFDckMsV0FBSyxPQUFPLEdBQUcsRUFBRyxnQkFBZ0IsTUFBTTtBQUN4QyxZQUFNLE9BQU8sS0FBSyxPQUFPLEdBQUcsRUFBRyxXQUFXLElBQUk7QUFDOUMsVUFBSSxNQUFNO0FBQ1IsYUFBSyxVQUFVLEdBQUcsR0FBRyxLQUFLLE9BQU8sR0FBRyxFQUFHLE9BQU8sS0FBSyxPQUFPLEdBQUcsRUFBRyxNQUFNO0FBQUEsTUFDeEU7QUFBQSxJQUFBLENBQ0Q7QUFDRCxTQUFLLFFBQVE7QUFDUixTQUFBLEtBQUssZUFBZSxLQUFLO0FBRTlCLFNBQUssZ0JBQWdCO0FBQUEsTUFDbkIsTUFBTSxtQkFBbUI7QUFBQSxNQUN6QixPQUFPLEtBQUs7QUFBQSxNQUNaLE9BQU87QUFBQSxNQUNQLE1BQU0sS0FBSztBQUFBLElBQUEsQ0FDWjtBQUFBLEVBQ0g7QUFBQSxFQUVBLG1CQUFtQixPQUFlO0FBQ2hDLFVBQU0sZ0JBQWdCLEtBQUssT0FBTyxLQUFLLElBQUk7QUFDM0MsUUFBSSxDQUFDO0FBQWU7QUFDZCxVQUFBLGFBQWEsY0FBYyxXQUFXLElBQUk7QUFDaEQsUUFBSSxDQUFDO0FBQVk7QUFDakIsU0FBSyxRQUFRLGVBQWU7QUFDNUIsZUFBVyxjQUFjO0FBQUEsRUFFM0I7QUFBQSxFQUVBLGtCQUFrQjtBQUNoQixVQUFNLGdCQUFnQixLQUFLLE9BQU8sS0FBSyxJQUFJO0FBQzNDLFFBQUksQ0FBQztBQUFlO0FBQ2QsVUFBQSxhQUFhLGNBQWMsV0FBVyxJQUFJO0FBQ2hELFFBQUksQ0FBQztBQUFZO0FBRVgsVUFBQSxRQUFRLEtBQUssU0FBUztBQUU1QixlQUFXLGNBQWM7QUFFekIsUUFBSSxRQUFhO0FBQ2pCLFFBQUksU0FBZ0IsQ0FBQTtBQUNoQixRQUFBO0FBQ0osUUFBSSxPQUFpQixDQUFBO0FBQ3JCLFFBQUksWUFBWTtBQUdoQixVQUFNLE9BQU8sQ0FBQyxZQUFvQixjQUFzQixhQUFxQjtBQUNyRUMsWUFBQUEsU0FBUSxLQUFLLFNBQVM7QUFDNUIsaUJBQVcsY0FBY0E7QUFDekIsaUJBQVcsVUFBVTtBQUNyQixpQkFBVyxPQUFPLFdBQVcsR0FBRyxXQUFXLENBQUM7QUFDakMsaUJBQUEsaUJBQWlCLGFBQWEsR0FBRyxhQUFhLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUNsRixpQkFBVyxPQUFPO0FBQUEsSUFBQTtBQUlOLGtCQUFBLGNBQWMsQ0FBQyxNQUFNO0FBQ2pDLFFBQUUsZUFBZTtBQUNqQixrQkFBWSxLQUFLO0FBQ2pCLFlBQU0sSUFBSSxFQUFFO0FBQ1osWUFBTSxJQUFJLEVBQUU7QUFFWixlQUFTLENBQUE7QUFDVCxhQUFPLEtBQUssRUFBRSxHQUFHLEVBQUcsQ0FBQTtBQUNaLGNBQUEsRUFBRSxHQUFHO0FBRU4sYUFBQSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUEsR0FBSyxLQUFLLGFBQWEsS0FBSyxZQUFZO0FBQ3BFLGFBQU8sQ0FBQTtBQUFBLElBQUM7QUFJSSxrQkFBQSxjQUFjLENBQUMsTUFBTTtBQUNqQyxRQUFFLGVBQWU7QUFDakIsVUFBSSxDQUFDO0FBQU87QUFDTixZQUFBLElBQUksT0FBTyxFQUFFLE9BQU87QUFDcEIsWUFBQSxJQUFJLE9BQU8sRUFBRSxPQUFPO0FBRTFCLFVBQUksS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHO0FBQzFEO0FBQUEsTUFDRjtBQUNBLGFBQU8sS0FBSyxFQUFFLEdBQUcsRUFBRyxDQUFBO0FBRWYsV0FBQSxLQUFLLGdCQUFnQixFQUFFLEdBQUcsS0FBSyxLQUFLLGFBQWEsS0FBSyxZQUFZLENBQUM7QUFFcEUsVUFBQSxPQUFPLFNBQVMsR0FBRztBQUNyQjtBQUFBLE1BQ0Y7QUFDQSxZQUFNLEVBQUUsU0FBUyxJQUFJLElBQUksdUJBQXVCLE1BQU07QUFDbEQsVUFBQSxDQUFDLFdBQVcsQ0FBQyxLQUFLO0FBQ3BCO0FBQUEsTUFDRjtBQUNLLFdBQUEsT0FBTyxTQUFTLEdBQUc7QUFDaEIsY0FBQTtBQUFBLElBQUE7QUFJSSxrQkFBQSxZQUFZLENBQUMsTUFBTTtBQUMvQixRQUFFLGVBQWU7QUFDVCxjQUFBO0FBQ1IsVUFBSSxPQUFPLFNBQVM7QUFBRztBQUV2QixVQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxHQUFHO0FBQ3pCLGFBQUssS0FBSyxLQUFLLElBQUksSUFBSSxDQUFBO0FBQUEsTUFDekI7QUFDTSxZQUFBLFdBQVcsS0FBSyxJQUFBLElBQVE7QUFDOUIsWUFBTUMsU0FBUTtBQUFBLFFBQ1osTUFBTSxPQUFPLE9BQU8sQ0FBQSxHQUFJLElBQUk7QUFBQSxRQUM1QixNQUFNLEtBQUs7QUFBQSxRQUNYLE1BQU0sQ0FBQyxHQUFHLElBQUk7QUFBQSxRQUNkLE9BQU8sS0FBSztBQUFBLFFBQ1osVUFBVSxXQUFXLE9BQU8sV0FBVyxXQUFXLE1BQU8sT0FBTztBQUFBO0FBQUEsTUFBQTtBQUVsRSxXQUFLLEtBQUssS0FBSyxJQUFJLEVBQUUsS0FBS0EsTUFBSztBQUUvQixnQkFBVSxNQUFNO0FBQ2QsYUFBSyxnQkFBZ0I7QUFBQSxVQUNuQixNQUFNLG1CQUFtQjtBQUFBLFVBQ3pCLE9BQU8sS0FBSztBQUFBLFVBQ1osT0FBTyxLQUFLO0FBQUEsVUFDWixPQUFBQTtBQUFBLFVBQ0EsTUFBTSxLQUFLO0FBQUEsUUFBQSxDQUNaO0FBQUEsTUFBQSxDQUNGO0FBQUEsSUFBQTtBQUlXLGtCQUFBLGVBQWUsQ0FBQyxNQUFNO0FBQ2xDLFFBQUUsZUFBZTtBQUNqQixrQkFBWSxLQUFLO0FBQ2pCLFlBQU0sSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFO0FBQ3ZCLFlBQU0sSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFO0FBRXZCLGVBQVMsQ0FBQTtBQUNULGFBQU8sS0FBSyxFQUFFLEdBQUcsRUFBRyxDQUFBO0FBQ1osY0FBQSxFQUFFLEdBQUc7QUFFTixhQUFBLGdCQUFnQixFQUFFLEdBQUcsRUFBQSxHQUFLLEtBQUssYUFBYSxLQUFLLFlBQVk7QUFDcEUsYUFBTyxDQUFBO0FBQUEsSUFBQztBQUlJLGtCQUFBLGNBQWMsQ0FBQyxNQUFNO0FBQ2pDLFFBQUUsZUFBZTtBQUNqQixVQUFJLENBQUM7QUFBTztBQUNaLFlBQU0sSUFBSSxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTztBQUNyQyxZQUFNLElBQUksT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLE9BQU87QUFDckMsVUFBSSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJO0FBQUc7QUFDNUQsYUFBTyxLQUFLLEVBQUUsR0FBRyxFQUFHLENBQUE7QUFDZixXQUFBLEtBQUssZ0JBQWdCLEVBQUUsR0FBRyxLQUFLLEtBQUssYUFBYSxLQUFLLFlBQVksQ0FBQztBQUN4RSxVQUFJLE9BQU8sU0FBUztBQUFHO0FBQ3ZCLFlBQU0sRUFBRSxTQUFTLElBQUksSUFBSSx1QkFBdUIsTUFBTTtBQUNsRCxVQUFBLENBQUMsV0FBVyxDQUFDO0FBQUs7QUFDakIsV0FBQSxPQUFPLFNBQVMsR0FBRztBQUNoQixjQUFBO0FBQUEsSUFBQTtBQUlWLGtCQUFjLGFBQWEsY0FBYyxnQkFBZ0IsQ0FBQyxNQUFNO0FBQzlELFFBQUUsZUFBZTtBQUNULGNBQUE7QUFDUixVQUFJLE9BQU8sU0FBUztBQUFHO0FBQ3ZCLFVBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUc7QUFDekIsYUFBSyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUE7QUFBQSxNQUN6QjtBQUNNLFlBQUEsV0FBVyxLQUFLLElBQUEsSUFBUTtBQUM5QixZQUFNQSxTQUFRO0FBQUEsUUFDWixNQUFNLE9BQU8sT0FBTyxDQUFBLEdBQUksSUFBSTtBQUFBLFFBQzVCLE1BQU0sQ0FBQyxHQUFHLElBQUk7QUFBQSxRQUNkLE1BQU0sS0FBSztBQUFBLFFBQ1gsT0FBTyxLQUFLO0FBQUEsUUFDWixVQUFVLFdBQVcsT0FBTyxXQUFXLFdBQVcsTUFBTyxPQUFPO0FBQUE7QUFBQSxNQUFBO0FBRWxFLFdBQUssS0FBSyxLQUFLLElBQUksRUFBRSxLQUFLQSxNQUFLO0FBRS9CLGdCQUFVLE1BQU07QUFDZCxhQUFLLGdCQUFnQjtBQUFBLFVBQ25CLE1BQU0sbUJBQW1CO0FBQUEsVUFDekIsT0FBTyxLQUFLO0FBQUEsVUFDWixPQUFPLEtBQUs7QUFBQSxVQUNaLE9BQUFBO0FBQUEsVUFDQSxNQUFNLEtBQUs7QUFBQSxRQUFBLENBQ1o7QUFBQSxNQUFBLENBQ0Y7QUFBQSxJQUFBO0FBQUEsRUFFTDtBQUFBLEVBRUEsZ0JBQWdCLFFBQTBCLGFBQXNCLE1BQU07QUFDaEUsUUFBQSxPQUFPLFNBQVMsbUJBQW1CLFVBQVU7QUFDMUMsV0FBQSxLQUFLLGVBQWUsUUFBUSxVQUFVO0FBQzNDO0FBQUEsSUFDRjtBQUVNLFVBQUEsWUFBWSxLQUFLO0FBQ3ZCLFVBQU1BLFNBQVEsT0FBTztBQUNyQixRQUFJLENBQUNBO0FBQU87QUFDWixRQUFJLENBQUNBLE9BQU07QUFBTTtBQUNqQixVQUFNLGFBQWEsS0FBSyxLQUFLQSxPQUFNLEtBQUssU0FBUyxHQUFHO0FBRXBELGFBQVMsSUFBSSxHQUFHLElBQUksWUFBWSxLQUFLO0FBQ25DLFlBQU0saUJBQW1DO0FBQUEsUUFDdkMsTUFBTSxLQUFLO0FBQUEsUUFDWCxPQUFPLEtBQUs7QUFBQSxRQUNaLE9BQU8sS0FBSztBQUFBLFFBQ1osTUFBTSxPQUFPO0FBQUEsUUFDYixPQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUs7QUFBQSxVQUNYLE1BQU1BLE9BQU07QUFBQSxVQUNaLFVBQVVBLE9BQU07QUFBQSxVQUNoQixPQUFPLEtBQUs7QUFBQSxVQUNaLE1BQU1BLE9BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLEtBQUssR0FBRztBQUFBLFFBQy9DO0FBQUEsUUFDQTtBQUFBLFFBQ0EsS0FBSyxNQUFNLGFBQWE7QUFBQSxNQUFBO0FBR2IsbUJBQUEsR0FBRyxJQUFJLE1BQU07QUFDbkIsYUFBQSxLQUFLLGVBQWUsZ0JBQWdCLFVBQVU7QUFBQSxNQUFBLENBQ3BEO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE9BQU8sUUFBMEI7QUFDL0IsVUFBTSxFQUFFLE9BQU8sTUFBTSxNQUFBQyxVQUFTO0FBRTFCLFFBQUEsQ0FBQyxTQUFTLEtBQUssT0FBTztBQUV4QixXQUFLLFdBQVc7QUFDaEI7QUFBQSxJQUNGO0FBQ0ksUUFBQSxTQUFTLENBQUMsS0FBSyxPQUFPO0FBRXhCLFdBQUssVUFBVTtBQUNmO0FBQUEsSUFDRjtBQUVJLFFBQUEsQ0FBQyxLQUFLLE9BQU87QUFDZjtBQUFBLElBQ0Y7QUFFQSxZQUFRLE1BQU07QUFBQSxNQUNaLEtBQUssbUJBQW1CO0FBQ3RCLGNBQU0sRUFBRSxPQUFBRCxRQUFPLFdBQVcsSUFBQSxJQUFRO0FBQ2xDLFlBQUksQ0FBQztBQUFXO0FBQ2hCLFlBQUksQ0FBQ0E7QUFBTztBQUNaLGFBQUssU0FBUyxTQUFTLElBQUssQ0FBQSxFQUFnQixPQUFPLEtBQUssU0FBUyxTQUFTLEtBQUssQ0FBQSxHQUFJQSxPQUFNLElBQUk7QUFDN0YsWUFBSSxLQUFLO0FBQ0EsaUJBQUEsT0FBT0EsUUFBTyxFQUFFLE1BQU0sS0FBSyxTQUFTLFNBQVMsR0FBRztBQUNsRCxlQUFBLGVBQWVDLE9BQU1ELFFBQU8sQ0FBQSxHQUFJLE1BQU0sT0FBTyxLQUFLLFNBQVMsU0FBUyxDQUFDO0FBQUEsUUFDNUU7QUFDQTtBQUFBLE1BQ0YsS0FBSyxtQkFBbUI7QUFDdEIsYUFBSyxXQUFXQyxLQUFJO0FBQ3BCO0FBQUEsSUFHSjtBQUFBLEVBQ0Y7QUFBQSxFQUdBLGVBQWUsT0FBZSxNQUF1QixFQUFFLFdBQVcsTUFBTSxHQUFHLFdBQVcsTUFBTTtBQUMxRixRQUFJLENBQUMsUUFBUSxPQUFPLFVBQVUsU0FBUyxLQUFLLElBQUksS0FBSyxxQkFBcUIsT0FBTyxLQUFLLElBQUksRUFBRSxXQUFXLEdBQUc7QUFDeEc7QUFBQSxJQUNGO0FBRUEsVUFBTSxNQUFNO0FBQ0gsYUFBQSxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzlCLFlBQUksQ0FBQyxVQUFVO0FBQ2IsY0FBSSxDQUFDLEtBQUssT0FBTyxLQUFLLEdBQUc7QUFDdkIsaUJBQUssT0FBTyxLQUFLLElBQUksS0FBSyxXQUFXLDBCQUEwQjtBQUFBLFVBQ2pFO0FBQ0EsY0FBSSxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFDaEIsaUJBQUEsS0FBSyxLQUFLLElBQUk7VUFDckI7QUFDQSxlQUFLLEtBQUssS0FBSyxFQUFFLEtBQUssSUFBSTtBQUFBLFFBQzVCO0FBRUEsWUFBSSxDQUFDLEtBQUssT0FBTyxLQUFLLEdBQUc7QUFDdkI7QUFBQSxRQUNGO0FBQ0EsY0FBTSxPQUFPLEtBQUssT0FBTyxLQUFLLEVBQUcsV0FBVyxJQUFJO0FBRWhELFlBQUksQ0FBQztBQUFNO0FBQ0wsY0FBQSxFQUFFLE9BQU8sSUFBSSxRQUFRLFNBQVMsV0FBVyxHQUFHLE1BQUFBLE1BQVMsSUFBQTtBQUNyRCxjQUFBLE9BQU8sa0JBQWtCLEtBQUssUUFBUSxJQUFjLEtBQUssYUFBYSxLQUFLLFlBQVk7QUFFekYsWUFBQSxTQUFTLENBQUMsSUFBSTtBQUVsQixhQUFLLGNBQWM7QUFFbkIsYUFBSyxVQUFVO0FBQ2YsYUFBSyxPQUFPLEtBQUssR0FBRyxLQUFLLENBQUM7QUFFdEIsWUFBQSxZQUFZLENBQUMsVUFBVTtBQUN6QixjQUFJLFlBQW1CLENBQUE7QUFDdkIsZ0JBQU0sT0FBTztBQUNiLGVBQUssUUFBUSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEtBQUssU0FBUyxFQUFBLEdBQUssUUFBUSxFQUNoRSxTQUFTLENBQUMsRUFBRSxXQUFXO0FQeGY3QjtBT3lmTyxpQkFBSyxXQUFXO0FBQ1osZ0JBQUEsQ0FBQyxLQUFLLE9BQU87QUFDZixtQkFBSyxVQUFVLEdBQUcsR0FBRyxLQUFLLE9BQU9BLEtBQUksRUFBRyxPQUFPLEtBQUssT0FBT0EsS0FBSSxFQUFHLE1BQU07QUFDakUsc0JBQUEsVUFBSyxVQUFMLG1CQUFZO0FBQUEsWUFDckI7QUFDTSxrQkFBQSxJQUFJLEtBQUssTUFBTSxJQUFJO0FBQ3pCLGdCQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsT0FBTyxPQUFPLENBQUMsR0FBRztBQUNyQyx3QkFBVSxLQUFLLENBQUM7QUFDVCxxQkFBQSxLQUFLLGtCQUFrQixLQUFLLENBQUMsR0FBRyxLQUFLLGFBQWEsS0FBSyxZQUFZLENBQUM7QUFDM0Usa0JBQUksT0FBTyxTQUFTO0FBQUc7QUFDdkIsb0JBQU0sRUFBRSxTQUFTLElBQUksSUFBSSx1QkFBdUIsTUFBTTtBQUNsRCxrQkFBQSxDQUFDLFdBQVcsQ0FBQztBQUFLO0FBQ2pCLG1CQUFBLGlCQUFpQixRQUFRLEdBQUcsUUFBUSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDeEQsbUJBQUssT0FBTztBQUFBLFlBQ2Q7QUFBQSxVQUFBLENBQ0QsRUFDQSxXQUFXLENBQUMsTUFBTTtBQUNqQixpQkFBSyxRQUFRO0FBQ2IsaUJBQUssV0FBVztBQUNoQix3QkFBWSxDQUFBO0FBQ1oscUJBQVMsQ0FBQTtBQUNMLGdCQUFBO0FBQW1CO0FBQ2Y7VUFBQSxDQUNUO0FBQUEsUUFBQSxPQUNFO0FBQ0wsbUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDN0IsbUJBQUEsS0FBSyxrQkFBa0IsS0FBSyxDQUFDLEdBQUcsS0FBSyxhQUFhLEtBQUssWUFBWSxDQUFDO0FBQzNFLGdCQUFJLE9BQU8sU0FBUztBQUFHO0FBQ3ZCLGtCQUFNLEVBQUUsU0FBUyxJQUFJLElBQUksdUJBQXVCLE1BQU07QUFDbEQsZ0JBQUEsQ0FBQyxXQUFXLENBQUM7QUFBSztBQUNqQixpQkFBQSxpQkFBaUIsUUFBUSxHQUFHLFFBQVEsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQUEsVUFDMUQ7QUFDQSxlQUFLLE9BQU87QUFDWixtQkFBUyxDQUFBO0FBQ0wsY0FBQTtBQUFtQjtBQUNmO1FBQ1Y7QUFBQSxNQUFBLENBQ0Q7QUFBQSxJQUFBLENBQ0Y7QUFBQSxFQUNIO0FBQUEsRUFFQSxXQUFXQSxPQUFjO0FBQ3ZCLFFBQUksQ0FBQyxLQUFLLE9BQU9BLEtBQUksS0FBSyxDQUFDLEtBQUssS0FBS0EsS0FBSSxLQUFLLEtBQUssS0FBS0EsS0FBSSxFQUFFLFdBQVcsR0FBRztBQUMxRTtBQUFBLElBQ0Y7QUFDSyxTQUFBLEtBQUtBLEtBQUksRUFBRSxJQUFJO0FBRXBCLFVBQU0sU0FBUyxNQUFNO0FQeGlCbEI7QU95aUJELFlBQU0sUUFBTyxVQUFLLE9BQU9BLEtBQUksTUFBaEIsbUJBQW1CLFdBQVc7QUFDM0MsVUFBSSxNQUFNO0FBQ1IsYUFBSyxVQUFVLEdBQUcsR0FBRyxLQUFLLE9BQU9BLEtBQUksRUFBRyxPQUFPLEtBQUssT0FBT0EsS0FBSSxFQUFHLE1BQU07QUFBQSxNQUMxRTtBQUNBLFdBQUssS0FBS0EsS0FBSSxFQUFFLFFBQVEsQ0FBQyxPQUFZLEtBQUssZUFBZUEsT0FBTSxJQUFJLEVBQUUsVUFBVSxLQUFBLENBQU0sQ0FBQztBQUFBLElBQUE7QUFFcEYsUUFBQSxLQUFLLFNBQVMsS0FBSyxVQUFVO0FBQy9CLFdBQUssTUFBTTtBQUNYLGdCQUFVLFFBQVEsRUFBRTtBQUNwQjtBQUFBLElBQ0Y7QUFDTztFQUNUO0FBQUEsRUFFQSxlQUFlO0FBQ2IsU0FBSyxXQUFXO0FBQ2hCLFNBQUssUUFBUTtBQUNSLFNBQUEsS0FBSyxlQUFlLElBQUk7QUFBQSxFQUMvQjtBQUNGO0FDempCTyxNQUFNLFdBQVc7QUFBQSxFQUl0QixZQUFZLFVBQXNDLElBQUk7QUFGOUM7QUFHQSxVQUFBLFdBQVcsT0FBTyxPQUFPO0FBQUEsTUFDN0IsY0FBYztBQUFBLE1BQ2QsWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE9BQ1gsT0FBTztBQUVMLFNBQUEsYUFBYSxJQUFJLFdBQVcsUUFBUTtBQUFBLEVBQzNDO0FBQUEsRUFFQSxHQUF1QyxNQUNyQyxVQUNGO0FBQ08sU0FBQSxXQUFXLEdBQUcsTUFBTSxRQUFRO0FBQUEsRUFDbkM7QUFBQSxFQUVBLElBQXdDLE1BQ3RDLFVBQ0Y7QUFDTyxTQUFBLFdBQVcsSUFBSSxNQUFNLFFBQVE7QUFBQSxFQUNwQztBQUFBLEVBR0EsS0FBeUMsTUFDdkMsVUFDRjtBQUNPLFNBQUEsV0FBVyxLQUFLLE1BQU0sUUFBUTtBQUFBLEVBQ3JDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxPQUFPO0FBQ0wsU0FBSyxXQUFXO0VBQ2xCO0FBQUEsRUFFQSxPQUFPLFFBQTBCO0FBQzFCLFNBQUEsV0FBVyxPQUFPLE1BQU07QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBSSxRQUFRO0FBQ1YsV0FBTyxLQUFLLFdBQVc7QUFBQSxFQUN6QjtBQUFBLEVBRUEsSUFBSSxVQUFVO0FBQ1osV0FBTyxLQUFLLFdBQVc7QUFBQSxFQUN6QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxVQUFVO0FBQ0QsV0FBQSxLQUFLLFdBQVc7RUFDekI7QUFBQSxFQUVBLGdCQUFnQixPQUFlO0FBQ3hCLFNBQUEsV0FBVyxtQkFBbUIsS0FBSztBQUFBLEVBQzFDO0FBQ0Y7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzFdfQ==