node-poweredup 8.0.5 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/.drone.yml +2 -2
  2. package/.gitmodules +0 -3
  3. package/.jsdoc.json +1 -2
  4. package/dist/browser/poweredup.js +1 -1
  5. package/dist/browser/poweredup.js.map +1 -1
  6. package/dist/node/color.js +5 -1
  7. package/dist/node/color.js.map +1 -1
  8. package/dist/node/consts.d.ts +21 -21
  9. package/dist/node/consts.js +27 -27
  10. package/dist/node/consts.js.map +1 -1
  11. package/dist/node/devices/absolutemotor.js +6 -2
  12. package/dist/node/devices/absolutemotor.js.map +1 -1
  13. package/dist/node/devices/basicmotor.js +5 -1
  14. package/dist/node/devices/basicmotor.js.map +1 -1
  15. package/dist/node/devices/colordistancesensor.js +7 -3
  16. package/dist/node/devices/colordistancesensor.js.map +1 -1
  17. package/dist/node/devices/currentsensor.js +6 -2
  18. package/dist/node/devices/currentsensor.js.map +1 -1
  19. package/dist/node/devices/device.d.ts +3 -1
  20. package/dist/node/devices/device.js +5 -1
  21. package/dist/node/devices/device.js.map +1 -1
  22. package/dist/node/devices/duplotrainbasecolorsensor.js +6 -2
  23. package/dist/node/devices/duplotrainbasecolorsensor.js.map +1 -1
  24. package/dist/node/devices/duplotrainbasemotor.js +5 -1
  25. package/dist/node/devices/duplotrainbasemotor.js.map +1 -1
  26. package/dist/node/devices/duplotrainbasespeaker.js +6 -2
  27. package/dist/node/devices/duplotrainbasespeaker.js.map +1 -1
  28. package/dist/node/devices/duplotrainbasespeedometer.js +6 -2
  29. package/dist/node/devices/duplotrainbasespeedometer.js.map +1 -1
  30. package/dist/node/devices/hubled.js +6 -2
  31. package/dist/node/devices/hubled.js.map +1 -1
  32. package/dist/node/devices/light.js +5 -1
  33. package/dist/node/devices/light.js.map +1 -1
  34. package/dist/node/devices/marioaccelerometer.js +6 -2
  35. package/dist/node/devices/marioaccelerometer.js.map +1 -1
  36. package/dist/node/devices/mariobarcodesensor.js +6 -2
  37. package/dist/node/devices/mariobarcodesensor.js.map +1 -1
  38. package/dist/node/devices/mariopantssensor.js +6 -2
  39. package/dist/node/devices/mariopantssensor.js.map +1 -1
  40. package/dist/node/devices/mediumlinearmotor.js +5 -1
  41. package/dist/node/devices/mediumlinearmotor.js.map +1 -1
  42. package/dist/node/devices/motionsensor.js +6 -2
  43. package/dist/node/devices/motionsensor.js.map +1 -1
  44. package/dist/node/devices/movehubmediumlinearmotor.js +5 -1
  45. package/dist/node/devices/movehubmediumlinearmotor.js.map +1 -1
  46. package/dist/node/devices/movehubtiltsensor.js +6 -2
  47. package/dist/node/devices/movehubtiltsensor.js.map +1 -1
  48. package/dist/node/devices/piezobuzzer.js +5 -1
  49. package/dist/node/devices/piezobuzzer.js.map +1 -1
  50. package/dist/node/devices/remotecontrolbutton.js +7 -3
  51. package/dist/node/devices/remotecontrolbutton.js.map +1 -1
  52. package/dist/node/devices/simplemediumlinearmotor.js +5 -1
  53. package/dist/node/devices/simplemediumlinearmotor.js.map +1 -1
  54. package/dist/node/devices/tachomotor.js +6 -2
  55. package/dist/node/devices/tachomotor.js.map +1 -1
  56. package/dist/node/devices/technic3x3colorlightmatrix.js +6 -2
  57. package/dist/node/devices/technic3x3colorlightmatrix.js.map +1 -1
  58. package/dist/node/devices/techniccolorsensor.js +6 -2
  59. package/dist/node/devices/techniccolorsensor.js.map +1 -1
  60. package/dist/node/devices/technicdistancesensor.js +6 -2
  61. package/dist/node/devices/technicdistancesensor.js.map +1 -1
  62. package/dist/node/devices/technicforcesensor.js +6 -2
  63. package/dist/node/devices/technicforcesensor.js.map +1 -1
  64. package/dist/node/devices/techniclargeangularmotor.js +5 -1
  65. package/dist/node/devices/techniclargeangularmotor.js.map +1 -1
  66. package/dist/node/devices/techniclargelinearmotor.js +5 -1
  67. package/dist/node/devices/techniclargelinearmotor.js.map +1 -1
  68. package/dist/node/devices/technicmediumangularmotor.js +5 -1
  69. package/dist/node/devices/technicmediumangularmotor.js.map +1 -1
  70. package/dist/node/devices/technicmediumhubaccelerometersensor.js +6 -2
  71. package/dist/node/devices/technicmediumhubaccelerometersensor.js.map +1 -1
  72. package/dist/node/devices/technicmediumhubgyrosensor.js +6 -2
  73. package/dist/node/devices/technicmediumhubgyrosensor.js.map +1 -1
  74. package/dist/node/devices/technicmediumhubtiltsensor.js +7 -3
  75. package/dist/node/devices/technicmediumhubtiltsensor.js.map +1 -1
  76. package/dist/node/devices/technicsmallangularmotor.js +5 -1
  77. package/dist/node/devices/technicsmallangularmotor.js.map +1 -1
  78. package/dist/node/devices/technicxlargelinearmotor.js +5 -1
  79. package/dist/node/devices/technicxlargelinearmotor.js.map +1 -1
  80. package/dist/node/devices/tiltsensor.js +6 -2
  81. package/dist/node/devices/tiltsensor.js.map +1 -1
  82. package/dist/node/devices/trainmotor.js +5 -1
  83. package/dist/node/devices/trainmotor.js.map +1 -1
  84. package/dist/node/devices/voltagesensor.js +6 -2
  85. package/dist/node/devices/voltagesensor.js.map +1 -1
  86. package/dist/node/hubs/basehub.d.ts +1 -0
  87. package/dist/node/hubs/basehub.js +5 -1
  88. package/dist/node/hubs/basehub.js.map +1 -1
  89. package/dist/node/hubs/duplotrainbase.d.ts +1 -0
  90. package/dist/node/hubs/duplotrainbase.js +5 -1
  91. package/dist/node/hubs/duplotrainbase.js.map +1 -1
  92. package/dist/node/hubs/hub.d.ts +1 -0
  93. package/dist/node/hubs/hub.js +12 -11
  94. package/dist/node/hubs/hub.js.map +1 -1
  95. package/dist/node/hubs/lpf2hub.js +5 -1
  96. package/dist/node/hubs/lpf2hub.js.map +1 -1
  97. package/dist/node/hubs/mario.d.ts +1 -0
  98. package/dist/node/hubs/mario.js +5 -1
  99. package/dist/node/hubs/mario.js.map +1 -1
  100. package/dist/node/hubs/movehub.d.ts +1 -0
  101. package/dist/node/hubs/movehub.js +7 -6
  102. package/dist/node/hubs/movehub.js.map +1 -1
  103. package/dist/node/hubs/remotecontrol.d.ts +1 -0
  104. package/dist/node/hubs/remotecontrol.js +5 -1
  105. package/dist/node/hubs/remotecontrol.js.map +1 -1
  106. package/dist/node/hubs/technicmediumhub.d.ts +1 -0
  107. package/dist/node/hubs/technicmediumhub.js +5 -1
  108. package/dist/node/hubs/technicmediumhub.js.map +1 -1
  109. package/dist/node/hubs/technicsmallhub.d.ts +1 -0
  110. package/dist/node/hubs/technicsmallhub.js +10 -6
  111. package/dist/node/hubs/technicsmallhub.js.map +1 -1
  112. package/dist/node/hubs/wedo2smarthub.d.ts +1 -0
  113. package/dist/node/hubs/wedo2smarthub.js +10 -6
  114. package/dist/node/hubs/wedo2smarthub.js.map +1 -1
  115. package/dist/node/index-browser.js +5 -1
  116. package/dist/node/index-browser.js.map +1 -1
  117. package/dist/node/index-node.js +5 -1
  118. package/dist/node/index-node.js.map +1 -1
  119. package/dist/node/interfaces.d.ts +1 -0
  120. package/dist/node/nobleabstraction.d.ts +1 -0
  121. package/dist/node/nobleabstraction.js.map +1 -1
  122. package/dist/node/poweredup-browser.js +10 -3
  123. package/dist/node/poweredup-browser.js.map +1 -1
  124. package/dist/node/poweredup-node.js +5 -1
  125. package/dist/node/poweredup-node.js.map +1 -1
  126. package/dist/node/utils.d.ts +2 -1
  127. package/dist/node/utils.js.map +1 -1
  128. package/dist/node/webbleabstraction.d.ts +2 -1
  129. package/dist/node/webbleabstraction.js +1 -1
  130. package/dist/node/webbleabstraction.js.map +1 -1
  131. package/docs/AbsoluteMotor.html +1037 -1066
  132. package/docs/BaseHub.html +622 -807
  133. package/docs/BasicMotor.html +707 -809
  134. package/docs/ColorDistanceSensor.html +1500 -1611
  135. package/docs/CurrentSensor.html +470 -623
  136. package/docs/Device.html +372 -502
  137. package/docs/DuploTrainBase.html +1004 -1225
  138. package/docs/DuploTrainBaseColorSensor.html +712 -874
  139. package/docs/DuploTrainBaseMotor.html +723 -841
  140. package/docs/DuploTrainBaseSpeaker.html +565 -693
  141. package/docs/DuploTraniBaseSpeedometer.html +396 -550
  142. package/docs/Hub.html +3842 -3987
  143. package/docs/HubLED.html +591 -731
  144. package/docs/LPF2Hub.html +983 -1188
  145. package/docs/Light.html +591 -731
  146. package/docs/Mario.html +1004 -1225
  147. package/docs/MarioAccelerometer.html +568 -732
  148. package/docs/MarioBarcodeSensor.html +568 -732
  149. package/docs/MarioPantsSensor.html +470 -623
  150. package/docs/MediumLinearMotor.html +679 -748
  151. package/docs/MotionSensor.html +470 -623
  152. package/docs/MoveHub.html +1004 -1225
  153. package/docs/MoveHubMediumLinearMotor.html +679 -748
  154. package/docs/MoveHubTiltSensor.html +483 -642
  155. package/docs/PiezoBuzzer.html +495 -642
  156. package/docs/PoweredUP.html +2223 -2174
  157. package/docs/RemoteControl.html +1004 -1225
  158. package/docs/RemoteControlButton.html +470 -623
  159. package/docs/SimpleMediumLinearMotor.html +396 -550
  160. package/docs/TachoMotor.html +1298 -1393
  161. package/docs/Technic3x3ColorLightMatrix.html +484 -628
  162. package/docs/TechnicColorSensor.html +726 -876
  163. package/docs/TechnicDistanceSensor.html +667 -824
  164. package/docs/TechnicForceSensor.html +614 -765
  165. package/docs/TechnicLargeAngularMotor.html +1046 -1091
  166. package/docs/TechnicLargeLinearMotor.html +1046 -1091
  167. package/docs/TechnicMediumAngularMotor.html +1046 -1091
  168. package/docs/TechnicMediumHub.html +1004 -1225
  169. package/docs/TechnicMediumHubAccelerometerSensor.html +496 -661
  170. package/docs/TechnicMediumHubGyroSensor.html +496 -661
  171. package/docs/TechnicMediumHubTiltSensor.html +820 -945
  172. package/docs/TechnicSmallAngularMotor.html +1046 -1091
  173. package/docs/TechnicXLargeLinearMotor.html +1046 -1091
  174. package/docs/TiltSensor.html +483 -642
  175. package/docs/TrainMotor.html +723 -841
  176. package/docs/VoltageSensor.html +470 -623
  177. package/docs/WeDo2SmartHub.html +890 -1102
  178. package/docs/consts.js.html +53 -116
  179. package/docs/devices_absolutemotor.js.html +35 -94
  180. package/docs/devices_basicmotor.js.html +34 -93
  181. package/docs/devices_colordistancesensor.js.html +33 -92
  182. package/docs/devices_currentsensor.js.html +35 -94
  183. package/docs/devices_device.js.html +32 -91
  184. package/docs/devices_duplotrainbasecolorsensor.js.html +35 -94
  185. package/docs/devices_duplotrainbasemotor.js.html +34 -93
  186. package/docs/devices_duplotrainbasespeaker.js.html +35 -94
  187. package/docs/devices_duplotrainbasespeedometer.js.html +35 -94
  188. package/docs/devices_hubled.js.html +35 -94
  189. package/docs/devices_light.js.html +34 -93
  190. package/docs/devices_marioaccelerometer.js.html +35 -94
  191. package/docs/devices_mariobarcodesensor.js.html +35 -94
  192. package/docs/devices_mariopantssensor.js.html +35 -94
  193. package/docs/devices_mediumlinearmotor.js.html +34 -93
  194. package/docs/devices_motionsensor.js.html +35 -94
  195. package/docs/devices_movehubmediumlinearmotor.js.html +34 -93
  196. package/docs/devices_movehubtiltsensor.js.html +35 -94
  197. package/docs/devices_piezobuzzer.js.html +34 -93
  198. package/docs/devices_remotecontrolbutton.js.html +36 -95
  199. package/docs/devices_simplemediumlinearmotor.js.html +34 -93
  200. package/docs/devices_tachomotor.js.html +33 -92
  201. package/docs/devices_technic3x3colorlightmatrix.js.html +35 -94
  202. package/docs/devices_techniccolorsensor.js.html +35 -94
  203. package/docs/devices_technicdistancesensor.js.html +35 -94
  204. package/docs/devices_technicforcesensor.js.html +35 -94
  205. package/docs/devices_techniclargeangularmotor.js.html +34 -93
  206. package/docs/devices_techniclargelinearmotor.js.html +34 -93
  207. package/docs/devices_technicmediumangularmotor.js.html +34 -93
  208. package/docs/devices_technicmediumhubaccelerometersensor.js.html +35 -94
  209. package/docs/devices_technicmediumhubgyrosensor.js.html +35 -94
  210. package/docs/devices_technicmediumhubtiltsensor.js.html +36 -95
  211. package/docs/devices_technicsmallangularmotor.js.html +34 -93
  212. package/docs/devices_technicxlargelinearmotor.js.html +34 -93
  213. package/docs/devices_tiltsensor.js.html +35 -94
  214. package/docs/devices_trainmotor.js.html +34 -93
  215. package/docs/devices_voltagesensor.js.html +35 -94
  216. package/docs/global.html +2094 -7927
  217. package/docs/hubs_basehub.js.html +31 -90
  218. package/docs/hubs_duplotrainbase.js.html +34 -93
  219. package/docs/hubs_hub.js.html +41 -103
  220. package/docs/hubs_lpf2hub.js.html +31 -90
  221. package/docs/hubs_mario.js.html +34 -93
  222. package/docs/hubs_movehub.js.html +36 -98
  223. package/docs/hubs_remotecontrol.js.html +34 -93
  224. package/docs/hubs_technicmediumhub.js.html +34 -93
  225. package/docs/hubs_technicsmallhub.js.html +39 -98
  226. package/docs/hubs_wedo2smarthub.js.html +36 -95
  227. package/docs/index.html +36 -83
  228. package/docs/poweredup-browser.js.html +36 -92
  229. package/docs/poweredup-node.js.html +32 -91
  230. package/docs/scripts/linenumber.js +21 -19
  231. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  232. package/docs/scripts/prettify/lang-css.js +2 -0
  233. package/docs/scripts/prettify/prettify.js +28 -0
  234. package/docs/styles/jsdoc-default.css +192 -787
  235. package/docs/styles/prettify-jsdoc.css +1 -1
  236. package/docs/styles/prettify-tomorrow.css +8 -14
  237. package/package.json +13 -13
  238. package/src/devices/device.ts +2 -2
  239. package/src/devices/remotecontrolbutton.ts +1 -1
  240. package/src/devices/technicmediumhubtiltsensor.ts +1 -1
  241. package/src/hubs/hub.ts +2 -2
  242. package/src/hubs/movehub.ts +2 -2
  243. package/src/poweredup-browser.ts +5 -2
  244. package/src/webbleabstraction.ts +2 -2
  245. package/jsdoc-template/braintree/CHANGELOG.md +0 -31
  246. package/jsdoc-template/braintree/LICENSE +0 -27
  247. package/jsdoc-template/braintree/README.md +0 -90
  248. package/jsdoc-template/braintree/package.json +0 -39
  249. package/jsdoc-template/braintree/publish.js +0 -675
  250. package/jsdoc-template/braintree/static/fonts/OpenSans-Bold-webfont.eot +0 -0
  251. package/jsdoc-template/braintree/static/fonts/OpenSans-Bold-webfont.svg +0 -1830
  252. package/jsdoc-template/braintree/static/fonts/OpenSans-Bold-webfont.woff +0 -0
  253. package/jsdoc-template/braintree/static/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  254. package/jsdoc-template/braintree/static/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  255. package/jsdoc-template/braintree/static/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  256. package/jsdoc-template/braintree/static/fonts/OpenSans-Italic-webfont.eot +0 -0
  257. package/jsdoc-template/braintree/static/fonts/OpenSans-Italic-webfont.svg +0 -1830
  258. package/jsdoc-template/braintree/static/fonts/OpenSans-Italic-webfont.woff +0 -0
  259. package/jsdoc-template/braintree/static/fonts/OpenSans-Light-webfont.eot +0 -0
  260. package/jsdoc-template/braintree/static/fonts/OpenSans-Light-webfont.svg +0 -1831
  261. package/jsdoc-template/braintree/static/fonts/OpenSans-Light-webfont.woff +0 -0
  262. package/jsdoc-template/braintree/static/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  263. package/jsdoc-template/braintree/static/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  264. package/jsdoc-template/braintree/static/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  265. package/jsdoc-template/braintree/static/fonts/OpenSans-Regular-webfont.eot +0 -0
  266. package/jsdoc-template/braintree/static/fonts/OpenSans-Regular-webfont.svg +0 -1831
  267. package/jsdoc-template/braintree/static/fonts/OpenSans-Regular-webfont.woff +0 -0
  268. package/jsdoc-template/braintree/static/fonts/OpenSans-Semibold-webfont.eot +0 -0
  269. package/jsdoc-template/braintree/static/fonts/OpenSans-Semibold-webfont.svg +0 -1830
  270. package/jsdoc-template/braintree/static/fonts/OpenSans-Semibold-webfont.ttf +0 -0
  271. package/jsdoc-template/braintree/static/fonts/OpenSans-Semibold-webfont.woff +0 -0
  272. package/jsdoc-template/braintree/static/fonts/OpenSans-SemiboldItalic-webfont.eot +0 -0
  273. package/jsdoc-template/braintree/static/fonts/OpenSans-SemiboldItalic-webfont.svg +0 -1830
  274. package/jsdoc-template/braintree/static/fonts/OpenSans-SemiboldItalic-webfont.ttf +0 -0
  275. package/jsdoc-template/braintree/static/fonts/OpenSans-SemiboldItalic-webfont.woff +0 -0
  276. package/jsdoc-template/braintree/static/icons/home.svg +0 -4
  277. package/jsdoc-template/braintree/static/icons/search.svg +0 -4
  278. package/jsdoc-template/braintree/static/scripts/linenumber.js +0 -23
  279. package/jsdoc-template/braintree/static/scripts/pagelocation.js +0 -89
  280. package/jsdoc-template/braintree/static/styles/collapse.css +0 -27
  281. package/jsdoc-template/braintree/static/styles/jsdoc-default.css +0 -953
  282. package/jsdoc-template/braintree/static/styles/prettify-jsdoc.css +0 -111
  283. package/jsdoc-template/braintree/static/styles/prettify-tomorrow.css +0 -138
  284. package/jsdoc-template/braintree/tmpl/augments.tmpl +0 -10
  285. package/jsdoc-template/braintree/tmpl/container.tmpl +0 -213
  286. package/jsdoc-template/braintree/tmpl/details.tmpl +0 -223
  287. package/jsdoc-template/braintree/tmpl/example.tmpl +0 -2
  288. package/jsdoc-template/braintree/tmpl/examples.tmpl +0 -14
  289. package/jsdoc-template/braintree/tmpl/exceptions.tmpl +0 -28
  290. package/jsdoc-template/braintree/tmpl/layout.tmpl +0 -150
  291. package/jsdoc-template/braintree/tmpl/mainpage.tmpl +0 -9
  292. package/jsdoc-template/braintree/tmpl/members.tmpl +0 -38
  293. package/jsdoc-template/braintree/tmpl/method.tmpl +0 -128
  294. package/jsdoc-template/braintree/tmpl/params.tmpl +0 -125
  295. package/jsdoc-template/braintree/tmpl/properties.tmpl +0 -111
  296. package/jsdoc-template/braintree/tmpl/returns.tmpl +0 -17
  297. package/jsdoc-template/braintree/tmpl/source.tmpl +0 -9
  298. package/jsdoc-template/braintree/tmpl/tutorial.tmpl +0 -23
  299. package/jsdoc-template/braintree/tmpl/type.tmpl +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"poweredup.js","mappings":"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AAY,KACpB,mBACA,qBACA,wBAYQD,EAAA,EAAAA,sBAAA,EAAAA,oBAAmB,KAC3B,mBACA,6CACA,mCACA,mBACA,uBAIQD,EAAA,EAAAA,sBAAA,EAAAA,oBAAmB,KAC3B,gDACA,kCACA,wBACA,8CACA,4BACA,uDACA,sDAIQD,EAAA,EAAAA,aAAA,EAAAA,WAAU,KAClB,uDACA,2DACA,2BACA,2BACA,2BACA,mDAIQD,EAAA,EAAAA,oBAAA,EAAAA,kBAAiB,KACzB,qBACA,iCACA,sDACA,yDACA,iEACA,kEACA,gEACA,0DACA,4DACA,4DACA,+DACA,iEACA,uDACA,mDA+BQD,EAAA,EAAAA,cAAA,EAAAA,YAAW,KACnB,qCACA,iCACA,+BACA,yCACA,uDACA,iDACA,kEACA,sDACA,sEACA,wCACA,4DACA,sEACA,wEACA,oFACA,4CACA,sDACA,8CACA,0DACA,4DACA,wEACA,gDACA,mDACA,sEAuBQD,EAAA,EAAAA,uBAAA,EAAAA,qBAAoB,KAC5B,yCACA,uBACA,+BACA,+BACA,mBACA,yCACA,mCACA,6CACA,uDACA,wEACA,wCACA,sCACA,kDACA,sDACA,2DAcQD,EAAA,EAAAA,uBAAA,EAAAA,qBAAoB,KAC5B,qCACA,6DACA,+DACA,2CACA,6DACA,0CAuBQD,EAAA,EAAAA,qBAAA,EAAAA,mBAAkB,KAC1B,yCACA,mCACA,+BACA,+BACA,mBACA,yCACA,mCACA,6CACA,uDACA,oDACA,wCACA,sCACA,kDACA,sDACA,+CAkBQD,EAAA,EAAAA,aAAA,EAAAA,WAAU,KAClB,qCACA,+BACA,iDACA,mDACA,2DACA,qDACA,4BACA,kDACA,kDACA,iEAYQD,EAAA,EAAAA,YAAA,EAAAA,UAAS,KACjB,+BACA,mCACA,iDACA,oDAYQD,EAAA,EAAAA,iBAAA,EAAAA,eAAc,KACtB,+BACA,mCACA,iDACA,oDAUQD,EAAA,EAAAA,eAAA,EAAAA,aAAY,KACpB,2BACA,wBAWQD,EAAA,EAAAA,QAAA,EAAAA,MAAK,KACb,+BACA,iCACA,kDAsBQD,EAAA,EAAAA,WAAA,EAAAA,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","sources":["webpack://node-poweredup/./node_modules/base64-js/index.js","webpack://node-poweredup/./node_modules/buffer/index.js","webpack://node-poweredup/./node_modules/debug/src/browser.js","webpack://node-poweredup/./node_modules/debug/src/common.js","webpack://node-poweredup/./node_modules/events/events.js","webpack://node-poweredup/./node_modules/ieee754/index.js","webpack://node-poweredup/./node_modules/ms/index.js","webpack://node-poweredup/./src/color.ts","webpack://node-poweredup/./src/consts.ts","webpack://node-poweredup/./src/devices/absolutemotor.ts","webpack://node-poweredup/./src/devices/basicmotor.ts","webpack://node-poweredup/./src/devices/colordistancesensor.ts","webpack://node-poweredup/./src/devices/currentsensor.ts","webpack://node-poweredup/./src/devices/device.ts","webpack://node-poweredup/./src/devices/duplotrainbasecolorsensor.ts","webpack://node-poweredup/./src/devices/duplotrainbasemotor.ts","webpack://node-poweredup/./src/devices/duplotrainbasespeaker.ts","webpack://node-poweredup/./src/devices/duplotrainbasespeedometer.ts","webpack://node-poweredup/./src/devices/hubled.ts","webpack://node-poweredup/./src/devices/light.ts","webpack://node-poweredup/./src/devices/marioaccelerometer.ts","webpack://node-poweredup/./src/devices/mariobarcodesensor.ts","webpack://node-poweredup/./src/devices/mariopantssensor.ts","webpack://node-poweredup/./src/devices/mediumlinearmotor.ts","webpack://node-poweredup/./src/devices/motionsensor.ts","webpack://node-poweredup/./src/devices/movehubmediumlinearmotor.ts","webpack://node-poweredup/./src/devices/movehubtiltsensor.ts","webpack://node-poweredup/./src/devices/piezobuzzer.ts","webpack://node-poweredup/./src/devices/remotecontrolbutton.ts","webpack://node-poweredup/./src/devices/simplemediumlinearmotor.ts","webpack://node-poweredup/./src/devices/tachomotor.ts","webpack://node-poweredup/./src/devices/technic3x3colorlightmatrix.ts","webpack://node-poweredup/./src/devices/techniccolorsensor.ts","webpack://node-poweredup/./src/devices/technicdistancesensor.ts","webpack://node-poweredup/./src/devices/technicforcesensor.ts","webpack://node-poweredup/./src/devices/techniclargeangularmotor.ts","webpack://node-poweredup/./src/devices/techniclargelinearmotor.ts","webpack://node-poweredup/./src/devices/technicmediumangularmotor.ts","webpack://node-poweredup/./src/devices/technicmediumhubaccelerometersensor.ts","webpack://node-poweredup/./src/devices/technicmediumhubgyrosensor.ts","webpack://node-poweredup/./src/devices/technicmediumhubtiltsensor.ts","webpack://node-poweredup/./src/devices/technicsmallangularmotor.ts","webpack://node-poweredup/./src/devices/technicxlargelinearmotor.ts","webpack://node-poweredup/./src/devices/tiltsensor.ts","webpack://node-poweredup/./src/devices/trainmotor.ts","webpack://node-poweredup/./src/devices/voltagesensor.ts","webpack://node-poweredup/./src/hubs/basehub.ts","webpack://node-poweredup/./src/hubs/duplotrainbase.ts","webpack://node-poweredup/./src/hubs/hub.ts","webpack://node-poweredup/./src/hubs/lpf2hub.ts","webpack://node-poweredup/./src/hubs/mario.ts","webpack://node-poweredup/./src/hubs/movehub.ts","webpack://node-poweredup/./src/hubs/remotecontrol.ts","webpack://node-poweredup/./src/hubs/technicmediumhub.ts","webpack://node-poweredup/./src/hubs/technicsmallhub.ts","webpack://node-poweredup/./src/hubs/wedo2smarthub.ts","webpack://node-poweredup/./src/index-browser.ts","webpack://node-poweredup/./src/poweredup-browser.ts","webpack://node-poweredup/./src/utils.ts","webpack://node-poweredup/./src/webbleabstraction.ts","webpack://node-poweredup/./node_modules/compare-versions/index.mjs","webpack://node-poweredup/webpack/bootstrap","webpack://node-poweredup/webpack/runtime/define property getters","webpack://node-poweredup/webpack/runtime/global","webpack://node-poweredup/webpack/runtime/hasOwnProperty shorthand","webpack://node-poweredup/webpack/runtime/make namespace object","webpack://node-poweredup/webpack/startup"],"sourcesContent":["'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","import * as Consts from \"./consts\";\n\nexport class Color {\n\n private _color: number;\n private _brightness: number = 100;\n\n constructor (color: number, brightness?: number) {\n this._color = color;\n this._brightness = brightness || 100;\n }\n\n public toValue () {\n if (this._color === Consts.Color.NONE) {\n return this._color;\n }\n return this._color + (Math.round(this._brightness / 10) << 4);\n }\n\n}","/**\n * @typedef HubType\n * @property {number} UNKNOWN 0\n * @property {number} WEDO2_SMART_HUB 1\n * @property {number} MOVE_HUB 2\n * @property {number} HUB 3\n * @property {number} REMOTE_CONTROL 4\n * @property {number} DUPLO_TRAIN_BASE 5\n * @property {number} TECHNIC_MEDIUM_HUB 6\n * @property {number} MARIO 7\n * @property {number} TECHNIC_SMALL_HUB 8\n */\nexport enum HubType {\n UNKNOWN = 0,\n WEDO2_SMART_HUB = 1,\n MOVE_HUB = 2,\n HUB = 3,\n REMOTE_CONTROL = 4,\n DUPLO_TRAIN_BASE = 5,\n TECHNIC_MEDIUM_HUB = 6,\n MARIO = 7,\n TECHNIC_SMALL_HUB = 8,\n}\n\n\n// tslint:disable-next-line\nexport const HubTypeNames = HubType;\n\n\n/**\n * @typedef DeviceType\n * @property {number} UNKNOWN 0\n * @property {number} SIMPLE_MEDIUM_LINEAR_MOTOR 1\n * @property {number} TRAIN_MOTOR 2\n * @property {number} LIGHT 8\n * @property {number} VOLTAGE_SENSOR 20\n * @property {number} CURRENT_SENSOR 21\n * @property {number} PIEZO_BUZZER 22\n * @property {number} HUB_LED 23\n * @property {number} TILT_SENSOR 34\n * @property {number} MOTION_SENSOR 35\n * @property {number} COLOR_DISTANCE_SENSOR 37\n * @property {number} MEDIUM_LINEAR_MOTOR 38\n * @property {number} MOVE_HUB_MEDIUM_LINEAR_MOTOR 39\n * @property {number} MOVE_HUB_TILT_SENSOR 40\n * @property {number} DUPLO_TRAIN_BASE_MOTOR 41\n * @property {number} DUPLO_TRAIN_BASE_SPEAKER 42\n * @property {number} DUPLO_TRAIN_BASE_COLOR_SENSOR 43\n * @property {number} DUPLO_TRAIN_BASE_SPEEDOMETER 44\n * @property {number} TECHNIC_LARGE_LINEAR_MOTOR 46\n * @property {number} TECHNIC_XLARGE_LINEAR_MOTOR 47\n * @property {number} TECHNIC_MEDIUM_ANGULAR_MOTOR 48\n * @property {number} TECHNIC_LARGE_ANGULAR_MOTOR 49\n * @property {number} TECHNIC_MEDIUM_HUB_GEST_SENSOR 54\n * @property {number} REMOTE_CONTROL_BUTTON 55\n * @property {number} REMOTE_CONTROL_RSSI 56\n * @property {number} TECHNIC_MEDIUM_HUB_ACCELEROMETER 57\n * @property {number} TECHNIC_MEDIUM_HUB_GYRO_SENSOR 58\n * @property {number} TECHNIC_MEDIUM_HUB_TILT_SENSOR 59\n * @property {number} TECHNIC_MEDIUM_HUB_TEMPERATURE_SENSOR 60\n * @property {number} TECHNIC_COLOR_SENSOR 61\n * @property {number} TECHNIC_DISTANCE_SENSOR 62\n * @property {number} TECHNIC_FORCE_SENSOR 63\n * @property {number} TECHNIC_3X3_COLOR_LIGHT_MATRIX 64\n * @property {number} TECHNIC_SMALL_ANGULAR_MOTOR 65\n * @property {number} MARIO_ACCELEROMETER 71\n * @property {number} MARIO_BARCODE_SENSOR 73\n * @property {number} MARIO_PANTS_SENSOR 74\n * @property {number} TECHNIC_MEDIUM_ANGULAR_MOTOR_GREY 75\n * @property {number} TECHNIC_LARGE_ANGULAR_MOTOR_GREY 76\n */\nexport enum DeviceType {\n UNKNOWN = 0,\n SIMPLE_MEDIUM_LINEAR_MOTOR = 1,\n TRAIN_MOTOR = 2,\n LIGHT = 8,\n VOLTAGE_SENSOR = 20,\n CURRENT_SENSOR = 21,\n PIEZO_BUZZER = 22,\n HUB_LED = 23,\n TILT_SENSOR = 34,\n MOTION_SENSOR = 35,\n COLOR_DISTANCE_SENSOR = 37,\n MEDIUM_LINEAR_MOTOR = 38,\n MOVE_HUB_MEDIUM_LINEAR_MOTOR = 39,\n MOVE_HUB_TILT_SENSOR = 40,\n DUPLO_TRAIN_BASE_MOTOR = 41,\n DUPLO_TRAIN_BASE_SPEAKER = 42,\n DUPLO_TRAIN_BASE_COLOR_SENSOR = 43,\n DUPLO_TRAIN_BASE_SPEEDOMETER = 44,\n TECHNIC_LARGE_LINEAR_MOTOR = 46, // Technic Control+\n TECHNIC_XLARGE_LINEAR_MOTOR = 47, // Technic Control+\n TECHNIC_MEDIUM_ANGULAR_MOTOR = 48, // Spike Prime\n TECHNIC_LARGE_ANGULAR_MOTOR = 49, // Spike Prime\n TECHNIC_MEDIUM_HUB_GEST_SENSOR = 54,\n REMOTE_CONTROL_BUTTON = 55,\n REMOTE_CONTROL_RSSI = 56,\n TECHNIC_MEDIUM_HUB_ACCELEROMETER = 57,\n TECHNIC_MEDIUM_HUB_GYRO_SENSOR = 58,\n TECHNIC_MEDIUM_HUB_TILT_SENSOR = 59,\n TECHNIC_MEDIUM_HUB_TEMPERATURE_SENSOR = 60,\n TECHNIC_COLOR_SENSOR = 61, // Spike Prime\n TECHNIC_DISTANCE_SENSOR = 62, // Spike Prime\n TECHNIC_FORCE_SENSOR = 63, // Spike Prime\n TECHNIC_3X3_COLOR_LIGHT_MATRIX = 64, // Spike Essential\n TECHNIC_SMALL_ANGULAR_MOTOR = 65, // Spike Essential\n MARIO_ACCELEROMETER = 71,\n MARIO_BARCODE_SENSOR = 73,\n MARIO_PANTS_SENSOR = 74,\n TECHNIC_MEDIUM_ANGULAR_MOTOR_GREY = 75, // Mindstorms\n TECHNIC_LARGE_ANGULAR_MOTOR_GREY = 76, // Technic Control+\n}\n\n\n// tslint:disable-next-line\nexport const DeviceTypeNames = DeviceType;\n\n\n/**\n * @typedef Color\n * @property {number} BLACK 0\n * @property {number} PINK 1\n * @property {number} PURPLE 2\n * @property {number} BLUE 3\n * @property {number} LIGHT_BLUE 4\n * @property {number} CYAN 5\n * @property {number} GREEN 6\n * @property {number} YELLOW 7\n * @property {number} ORANGE 8\n * @property {number} RED 9\n * @property {number} WHITE 10\n * @property {number} NONE 255\n */\nexport enum Color {\n BLACK = 0,\n PINK = 1,\n PURPLE = 2,\n BLUE = 3,\n LIGHT_BLUE = 4,\n CYAN = 5,\n GREEN = 6,\n YELLOW = 7,\n ORANGE = 8,\n RED = 9,\n WHITE = 10,\n NONE = 255\n}\n\n\n// tslint:disable-next-line\nexport const ColorNames = Color;\n\n\n/**\n * @typedef ButtonState\n * @property {number} PRESSED 2\n * @property {number} RELEASED 0\n * @property {number} UP 1\n * @property {number} DOWN 255\n * @property {number} STOP 127\n */\nexport enum ButtonState {\n PRESSED = 2,\n RELEASED = 0,\n UP = 1,\n DOWN = 255,\n STOP = 127\n}\n\n\n/**\n * @typedef BrakingStyle\n * @property {number} FLOAT 0\n * @property {number} HOLD 127\n * @property {number} BRAKE 128\n */\nexport enum BrakingStyle {\n FLOAT = 0,\n HOLD = 126,\n BRAKE = 127\n}\n\n\n/**\n * @typedef DuploTrainBaseSound\n * @property {number} BRAKE 3\n * @property {number} STATION_DEPARTURE 5\n * @property {number} WATER_REFILL 7\n * @property {number} HORN 9\n * @property {number} STEAM 10\n */\nexport enum DuploTrainBaseSound {\n BRAKE = 3,\n STATION_DEPARTURE = 5,\n WATER_REFILL = 7,\n HORN = 9,\n STEAM = 10\n}\n\n\nexport enum BLEManufacturerData {\n DUPLO_TRAIN_BASE_ID = 32,\n MOVE_HUB_ID = 64,\n HUB_ID = 65,\n REMOTE_CONTROL_ID = 66,\n MARIO_ID = 67,\n TECHNIC_MEDIUM_HUB_ID = 128,\n TECHNIC_SMALL_HUB_ID = 131\n}\n\n\nexport enum BLEService {\n WEDO2_SMART_HUB = \"00001523-1212-efde-1523-785feabcd123\",\n WEDO2_SMART_HUB_2 = \"00004f0e-1212-efde-1523-785feabcd123\",\n WEDO2_SMART_HUB_3 = \"2a19\",\n WEDO2_SMART_HUB_4 = \"180f\",\n WEDO2_SMART_HUB_5 = \"180a\",\n LPF2_HUB = \"00001623-1212-efde-1623-785feabcd123\"\n}\n\n\nexport enum BLECharacteristic {\n WEDO2_BATTERY = \"2a19\",\n WEDO2_FIRMWARE_REVISION = \"2a26\",\n WEDO2_BUTTON = \"00001526-1212-efde-1523-785feabcd123\", // \"1526\"\n WEDO2_PORT_TYPE = \"00001527-1212-efde-1523-785feabcd123\", // \"1527\" // Handles plugging and unplugging of devices on WeDo 2.0 Smart Hub\n WEDO2_LOW_VOLTAGE_ALERT = \"00001528-1212-efde-1523-785feabcd123\", // \"1528\"\n WEDO2_HIGH_CURRENT_ALERT = \"00001529-1212-efde-1523-785feabcd123\", // \"1529\"\n WEDO2_LOW_SIGNAL_ALERT = \"0000152a-1212-efde-1523-785feabcd123\", // \"152a\",\n WEDO2_DISCONNECT = \"0000152b-1212-efde-1523-785feabcd123\", // \"152b\"\n WEDO2_SENSOR_VALUE = \"00001560-1212-efde-1523-785feabcd123\", // \"1560\"\n WEDO2_VALUE_FORMAT = \"00001561-1212-efde-1523-785feabcd123\", // \"1561\"\n WEDO2_PORT_TYPE_WRITE = \"00001563-1212-efde-1523-785feabcd123\", // \"1563\"\n WEDO2_MOTOR_VALUE_WRITE = \"00001565-1212-efde-1523-785feabcd123\", // \"1565\"\n WEDO2_NAME_ID = \"00001524-1212-efde-1523-785feabcd123\", // \"1524\"\n LPF2_ALL = \"00001624-1212-efde-1623-785feabcd123\"\n}\n\n\n/**\n * @typedef MessageType\n * @property {number} HUB_PROPERTIES 0x01\n * @property {number} HUB_ACTIONS 0x02\n * @property {number} HUB_ALERTS 0x03\n * @property {number} HUB_ATTACHED_IO 0x04\n * @property {number} GENERIC_ERROR_MESSAGES 0x05\n * @property {number} HW_NETWORK_COMMANDS 0x08\n * @property {number} FW_UPDATE_GO_INTO_BOOT_MODE 0x10\n * @property {number} FW_UPDATE_LOCK_MEMORY 0x11\n * @property {number} FW_UPDATE_LOCK_STATUS_REQUEST 0x12\n * @property {number} FW_LOCK_STATUS 0x13\n * @property {number} PORT_INFORMATION_REQUEST 0x21\n * @property {number} PORT_MODE_INFORMATION_REQUEST 0x22\n * @property {number} PORT_INPUT_FORMAT_SETUP_SINGLE 0x41\n * @property {number} PORT_INPUT_FORMAT_SETUP_COMBINEDMODE 0x42\n * @property {number} PORT_INFORMATION 0x43\n * @property {number} PORT_MODE_INFORMATION 0x44\n * @property {number} PORT_VALUE_SINGLE 0x45\n * @property {number} PORT_VALUE_COMBINEDMODE 0x46\n * @property {number} PORT_INPUT_FORMAT_SINGLE 0x47\n * @property {number} PORT_INPUT_FORMAT_COMBINEDMODE 0x48\n * @property {number} VIRTUAL_PORT_SETUP 0x61\n * @property {number} PORT_OUTPUT_COMMAND 0x81\n * @property {number} PORT_OUTPUT_COMMAND_FEEDBACK 0x82\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#message-types\n */\nexport enum MessageType {\n HUB_PROPERTIES = 0x01,\n HUB_ACTIONS = 0x02,\n HUB_ALERTS = 0x03,\n HUB_ATTACHED_IO = 0x04,\n GENERIC_ERROR_MESSAGES = 0x05,\n HW_NETWORK_COMMANDS = 0x08,\n FW_UPDATE_GO_INTO_BOOT_MODE = 0x10,\n FW_UPDATE_LOCK_MEMORY = 0x11,\n FW_UPDATE_LOCK_STATUS_REQUEST = 0x12,\n FW_LOCK_STATUS = 0x13,\n PORT_INFORMATION_REQUEST = 0x21,\n PORT_MODE_INFORMATION_REQUEST = 0x22,\n PORT_INPUT_FORMAT_SETUP_SINGLE = 0x41,\n PORT_INPUT_FORMAT_SETUP_COMBINEDMODE = 0x42,\n PORT_INFORMATION = 0x43,\n PORT_MODE_INFORMATION = 0x44,\n PORT_VALUE_SINGLE = 0x45,\n PORT_VALUE_COMBINEDMODE = 0x46,\n PORT_INPUT_FORMAT_SINGLE = 0x47,\n PORT_INPUT_FORMAT_COMBINEDMODE = 0x48,\n VIRTUAL_PORT_SETUP = 0x61,\n PORT_OUTPUT_COMMAND = 0x81,\n PORT_OUTPUT_COMMAND_FEEDBACK = 0x82,\n}\n\n\n/**\n * @typedef HubPropertyReference\n * @param {number} ADVERTISING_NAME 0x01\n * @param {number} BUTTON 0x02\n * @param {number} FW_VERSION 0x03\n * @param {number} HW_VERSION 0x04\n * @param {number} RSSI 0x05\n * @param {number} BATTERY_VOLTAGE 0x06\n * @param {number} BATTERY_TYPE 0x07\n * @param {number} MANUFACTURER_NAME 0x08\n * @param {number} RADIO_FIRMWARE_VERSION 0x09\n * @param {number} LEGO_WIRELESS_PROTOCOL_VERSION 0x0A\n * @param {number} SYSTEM_TYPE_ID 0x0B\n * @param {number} HW_NETWORK_ID 0x0C\n * @param {number} PRIMARY_MAC_ADDRESS 0x0D\n * @param {number} SECONDARY_MAC_ADDRESS 0x0E\n * @param {number} HARDWARE_NETWORK_FAMILY 0x0F\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#hub-property-reference\n */\nexport enum HubPropertyReference {\n ADVERTISING_NAME = 0x01,\n BUTTON = 0x02,\n FW_VERSION = 0x03,\n HW_VERSION = 0x04,\n RSSI = 0x05,\n BATTERY_VOLTAGE = 0x06,\n BATTERY_TYPE = 0x07,\n MANUFACTURER_NAME = 0x08,\n RADIO_FIRMWARE_VERSION = 0x09,\n LEGO_WIRELESS_PROTOCOL_VERSION = 0x0A,\n SYSTEM_TYPE_ID = 0x0B,\n HW_NETWORK_ID = 0x0C,\n PRIMARY_MAC_ADDRESS = 0x0D,\n SECONDARY_MAC_ADDRESS = 0x0E,\n HARDWARE_NETWORK_FAMILY = 0x0F,\n}\n\n\n/**\n * @typedef HubPropertyOperation\n * @param {number} SET_DOWNSTREAM 0x01\n * @param {number} ENABLE_UPDATES_DOWNSTREAM 0x02\n * @param {number} DISABLE_UPDATES_DOWNSTREAM 0x03\n * @param {number} RESET_DOWNSTREAM 0x04\n * @param {number} REQUEST_UPDATE_DOWNSTREAM 0x05\n * @param {number} UPDATE_UPSTREAM 0x06\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#hub-property-reference\n */\nexport enum HubPropertyOperation {\n SET_DOWNSTREAM = 0x01,\n ENABLE_UPDATES_DOWNSTREAM = 0x02,\n DISABLE_UPDATES_DOWNSTREAM = 0x03,\n RESET_DOWNSTREAM = 0x04,\n REQUEST_UPDATE_DOWNSTREAM = 0x05,\n UPDATE_UPSTREAM = 0x06,\n}\n\n\n/**\n * @typedef HubPropertyPayload\n * @param {number} ADVERTISING_NAME 0x01\n * @param {number} BUTTON_STATE 0x02\n * @param {number} FW_VERSION 0x03\n * @param {number} HW_VERSION 0x04\n * @param {number} RSSI 0x05\n * @param {number} BATTERY_VOLTAGE 0x06\n * @param {number} BATTERY_TYPE 0x07\n * @param {number} MANUFACTURER_NAME 0x08\n * @param {number} RADIO_FIRMWARE_VERSION 0x09\n * @param {number} LWP_PROTOCOL_VERSION 0x0A\n * @param {number} SYSTEM_TYPE_ID 0x0B\n * @param {number} HW_NETWORK_ID 0x0C\n * @param {number} PRIMARY_MAC_ADDRESS 0x0D\n * @param {number} SECONDARY_MAC_ADDRESS 0x0E\n * @param {number} HW_NETWORK_FAMILY 0x0F\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#hub-property-reference\n */\nexport enum HubPropertyPayload {\n ADVERTISING_NAME = 0x01,\n BUTTON_STATE = 0x02,\n FW_VERSION = 0x03,\n HW_VERSION = 0x04,\n RSSI = 0x05,\n BATTERY_VOLTAGE = 0x06,\n BATTERY_TYPE = 0x07,\n MANUFACTURER_NAME = 0x08,\n RADIO_FIRMWARE_VERSION = 0x09,\n LWP_PROTOCOL_VERSION = 0x0A,\n SYSTEM_TYPE_ID = 0x0B,\n HW_NETWORK_ID = 0x0C,\n PRIMARY_MAC_ADDRESS = 0x0D,\n SECONDARY_MAC_ADDRESS = 0x0E,\n HW_NETWORK_FAMILY = 0x0F,\n}\n\n\n/**\n * @typedef ActionType\n * @param {number} SWITCH_OFF_HUB 0x01\n * @param {number} DISCONNECT 0x02\n * @param {number} VCC_PORT_CONTROL_ON 0x03\n * @param {number} VCC_PORT_CONTROL_OFF 0x04\n * @param {number} ACTIVATE_BUSY_INDICATION 0x05\n * @param {number} RESET_BUSY_INDICATION 0x06\n * @param {number} SHUTDOWN 0x2F\n * @param {number} HUB_WILL_SWITCH_OFF 0x30\n * @param {number} HUB_WILL_DISCONNECT 0x31\n * @param {number} HUB_WILL_GO_INTO_BOOT_MODE 0x32\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#action-types\n */\nexport enum ActionType {\n SWITCH_OFF_HUB = 0x01,\n DISCONNECT = 0x02,\n VCC_PORT_CONTROL_ON = 0x03,\n VCC_PORT_CONTROL_OFF = 0x04,\n ACTIVATE_BUSY_INDICATION = 0x05,\n RESET_BUSY_INDICATION = 0x06,\n SHUTDOWN = 0x2F,\n HUB_WILL_SWITCH_OFF = 0x30,\n HUB_WILL_DISCONNECT = 0x31,\n HUB_WILL_GO_INTO_BOOT_MODE = 0x32,\n}\n\n\n/**\n * @typedef AlertType\n * @param {number} LOW_VOLTAGE 0x01\n * @param {number} HIGH_CURRENT 0x02\n * @param {number} LOW_SIGNAL_STRENGTH 0x03\n * @param {number} OVER_POWER_CONDITION 0x04\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#alert-type\n */\nexport enum AlertType {\n LOW_VOLTAGE = 0x01,\n HIGH_CURRENT = 0x02,\n LOW_SIGNAL_STRENGTH = 0x03,\n OVER_POWER_CONDITION = 0x04,\n}\n\n\n/**\n * @typedef AlertOperation\n * @param {number} ENABLE_UPDATE 0x01\n * @param {number} DISABLE_UPDATE 0x02\n * @param {number} REQUEST_UPDATE 0x03\n * @param {number} UPDATE 0x04\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#alert-operation\n */\nexport enum AlertOperation {\n LOW_VOLTAGE = 0x01,\n HIGH_CURRENT = 0x02,\n LOW_SIGNAL_STRENGTH = 0x03,\n OVER_POWER_CONDITION = 0x04,\n}\n\n\n/**\n * @typedef AlertPayload\n * @param {number} STATUS_OK 0x00\n * @param {number} ALERT 0xFF\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#alert-payload\n */\nexport enum AlertPayload {\n STATUS_OK = 0x00,\n ALERT = 0xFF,\n}\n\n\n/**\n * @typedef Event\n * @param {number} DETACHED_IO 0x00\n * @param {number} ATTACHED_IO 0x01\n * @param {number} ATTACHED_VIRTUAL_IO 0x02\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#event\n */\nexport enum Event {\n DETACHED_IO = 0x00,\n ATTACHED_IO = 0x01,\n ATTACHED_VIRTUAL_IO = 0x02,\n}\n\n\n/**\n * @typedef IOTypeID\n * @param {number} MOTOR 0x0001\n * @param {number} SYSTEM_TRAIN_MOTOR 0x0002\n * @param {number} BUTTON 0x0005\n * @param {number} LED_LIGHT 0x0008\n * @param {number} VOLTAGE 0x0014\n * @param {number} CURRENT 0x0015\n * @param {number} PIEZO_TONE_SOUND 0x0016\n * @param {number} RGB_LIGHT 0x0017\n * @param {number} EXTERNAL_TILT_SENSOR 0x0022\n * @param {number} MOTION_SENSOR 0x0023\n * @param {number} VISION_SENSOR 0x0025\n * @param {number} EXTERNAL_MOTOR 0x0026\n * @param {number} INTERNAL_MOTOR 0x0027\n * @param {number} INTERNAL_TILT 0x0028\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#io-type-id\n */\nexport enum IOTypeID {\n MOTOR = 0x0001,\n SYSTEM_TRAIN_MOTOR = 0x0002,\n BUTTON = 0x0005,\n LED_LIGHT = 0x0008,\n VOLTAGE = 0x0014,\n CURRENT = 0x0015,\n PIEZO_TONE_SOUND = 0x0016,\n RGB_LIGHT = 0x0017,\n EXTERNAL_TILT_SENSOR = 0x0022,\n MOTION_SENSOR = 0x0023,\n VISION_SENSOR = 0x0025,\n EXTERNAL_MOTOR = 0x0026,\n INTERNAL_MOTOR = 0x0027,\n INTERNAL_TILT = 0x0028,\n}\n\n\n/**\n * @typedef ErrorCode\n * @param {number} ACK 0x01\n * @param {number} MACK 0x02\n * @param {number} BUFFER_OVERFLOW 0x03\n * @param {number} TIMEOUT 0x04\n * @param {number} COMMAND_NOT_RECOGNIZED 0x05\n * @param {number} INVALID_USE 0x06\n * @param {number} OVERCURRENT 0x07\n * @param {number} INTERNAL_ERROR 0x08\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#error-codes\n */\nexport enum ErrorCode {\n ACK = 0x01,\n MACK = 0x02,\n BUFFER_OVERFLOW = 0x03,\n TIMEOUT = 0x04,\n COMMAND_NOT_RECOGNIZED = 0x05,\n INVALID_USE = 0x06,\n OVERCURRENT = 0x07,\n INTERNAL_ERROR = 0x08,\n}\n\n\n/**\n * @typedef HWNetWorkCommandType\n * @param {number} CONNECTION_REQUEST 0x02\n * @param {number} FAMILY_REQUEST 0x03\n * @param {number} FAMILY_SET 0x04\n * @param {number} JOIN_DENIED 0x05\n * @param {number} GET_FAMILY 0x06\n * @param {number} FAMILY 0x07\n * @param {number} GET_SUBFAMILY 0x08\n * @param {number} SUBFAMILY 0x09\n * @param {number} SUBFAMILY_SET 0x0A\n * @param {number} GET_EXTENDED_FAMILY 0x0B\n * @param {number} EXTENDED_FAMILY 0x0C\n * @param {number} EXTENDED_FAMILY_SET 0x0D\n * @param {number} RESET_LONG_PRESS_TIMING 0x0E\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#h-w-network-command-type\n */\nexport enum HWNetWorkCommandType {\n CONNECTION_REQUEST = 0x02,\n FAMILY_REQUEST = 0x03,\n FAMILY_SET = 0x04,\n JOIN_DENIED = 0x05,\n GET_FAMILY = 0x06,\n FAMILY = 0x07,\n GET_SUBFAMILY = 0x08,\n SUBFAMILY = 0x09,\n SUBFAMILY_SET = 0x0A,\n GET_EXTENDED_FAMILY = 0x0B,\n EXTENDED_FAMILY = 0x0C,\n EXTENDED_FAMILY_SET = 0x0D,\n RESET_LONG_PRESS_TIMING = 0x0E,\n}\n\n\n/**\n * @typedef HWNetworkFamily\n * @param {number} GREEN 0x01\n * @param {number} YELLOW 0x02\n * @param {number} RED 0x03\n * @param {number} BLUE 0x04\n * @param {number} PURPLE 0x05\n * @param {number} LIGHT_BLUE 0x06\n * @param {number} TEAL 0x07\n * @param {number} PINK 0x08\n * @param {number} WHITE 0x00\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#h-w-network-family\n */\nexport enum HWNetworkFamily {\n GREEN = 0x01,\n YELLOW = 0x02,\n RED = 0x03,\n BLUE = 0x04,\n PURPLE = 0x05,\n LIGHT_BLUE = 0x06,\n TEAL = 0x07,\n PINK = 0x08,\n WHITE = 0x00,\n}\n\n\n/**\n * @typedef HWNetworkSubFamily\n * @param {number} ONE_FLASH 0x01\n * @param {number} TWO_FLASHES 0x02\n * @param {number} THREE_FLASHES 0x03\n * @param {number} FOUR_FLASHES 0x04\n * @param {number} FIVE_FLASHES 0x05\n * @param {number} SIX_FLASHES 0x06\n * @param {number} SEVEN_FLASHES 0x07\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#h-w-network-sub-family\n */\nexport enum HWNetworkSubFamily {\n ONE_FLASH = 0x01,\n TWO_FLASHES = 0x02,\n THREE_FLASHES = 0x03,\n FOUR_FLASHES = 0x04,\n FIVE_FLASHES = 0x05,\n SIX_FLASHES = 0x06,\n SEVEN_FLASHES = 0x07,\n}\n\n\n/**\n * @typedef ModeInformationType\n * @param {number} NAME 0x00\n * @param {number} RAW 0x01\n * @param {number} PCT 0x02\n * @param {number} SI 0x03\n * @param {number} SYMBOL 0x04\n * @param {number} MAPPING 0x05\n * @param {number} USED_INTERNALLY 0x06\n * @param {number} MOTOR_BIAS 0x07\n * @param {number} CAPABILITY_BITS 0x08\n * @param {number} VALUE_FORMAT 0x80\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#mode-information-types\n */\nexport enum ModeInformationType {\n NAME = 0x00,\n RAW = 0x01,\n PCT = 0x02,\n SI = 0x03,\n SYMBOL = 0x04,\n MAPPING = 0x05,\n USED_INTERNALLY = 0x06,\n MOTOR_BIAS = 0x07,\n CAPABILITY_BITS = 0x08,\n VALUE_FORMAT = 0x80,\n}\n\n\n/**\n * @typedef PortInputFormatSetupSubCommand\n * @param {number} SET_MODEANDDATASET_COMBINATIONS 0x01\n * @param {number} LOCK_LPF2_DEVICE_FOR_SETUP 0x02\n * @param {number} UNLOCKANDSTARTWITHMULTIUPDATEENABLED 0x03\n * @param {number} UNLOCKANDSTARTWITHMULTIUPDATEDISABLED 0x04\n * @param {number} NOT_USED 0x05\n * @param {number} RESET_SENSOR 0x06\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#port-input-format-setup-sub-commands\n */\nexport enum PortInputFormatSetupSubCommand {\n SET_MODEANDDATASET_COMBINATIONS = 0x01,\n LOCK_LPF2_DEVICE_FOR_SETUP = 0x02,\n UNLOCKANDSTARTWITHMULTIUPDATEENABLED = 0x03,\n UNLOCKANDSTARTWITHMULTIUPDATEDISABLED = 0x04,\n NOT_USED = 0x05,\n RESET_SENSOR = 0x06,\n}\n\n\n/**\n * @typedef MarioPantsType\n * @param {number} NONE 0x00\n * @param {number} PROPELLER 0x06\n * @param {number} CAT 0x11\n * @param {number} FIRE 0x12\n * @param {number} NORMAL 0x21\n * @param {number} BUILDER 0x22\n */\nexport enum MarioPantsType {\n NONE = 0x00,\n PROPELLER = 0x06,\n CAT = 0x11,\n FIRE = 0x12,\n NORMAL = 0x21,\n BUILDER = 0x22,\n}\n\n\n/**\n * @typedef MarioColor\n * @param {number} WHITE 0x1300\n * @param {number} RED 0x1500\n * @param {number} BLUE 0x1700\n * @param {number} YELLOW 0x1800\n * @param {number} BLACK 0x1a00\n * @param {number} GREEN 0x2500\n * @param {number} BROWN 0x6a00\n * @param {number} CYAN 0x4201\n */\nexport enum MarioColor {\n WHITE = 0x1300,\n RED = 0x1500,\n BLUE = 0x1700,\n YELLOW = 0x1800,\n BLACK = 0x1a00,\n GREEN = 0x2500,\n BROWN = 0x6a00,\n CYAN = 0x4201,\n}\n","import { TachoMotor } from \"./tachomotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { mapSpeed, normalizeAngle, roundAngleToNearest90 } from \"../utils\";\n\n/**\n * @class AbsoluteMotor\n * @extends TachoMotor\n */\nexport class AbsoluteMotor extends TachoMotor {\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.UNKNOWN) {\n super(hub, portId, Object.assign({}, modeMap, ModeMap), type);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.ABSOLUTE:\n const angle = normalizeAngle(message.readInt16LE(this.isWeDo2SmartHub ? 2 : 4));\n /**\n * Emits when a the motors absolute position is changed.\n * @event AbsoluteMotor#absolute\n * @type {object}\n * @param {number} absolute\n */\n this.notify(\"absolute\", { angle });\n break;\n default:\n super.receive(message);\n break;\n }\n }\n\n /**\n * Rotate a motor by a given angle.\n * @method AbsoluteMotor#gotoAngle\n * @param {number} angle Absolute position the motor should go to (degrees from 0).\n * @param {number} [speed=100] For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100.\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public gotoAngle (angle: [number, number] | number, speed: number = 100) {\n if (!this.isVirtualPort && angle instanceof Array) {\n throw new Error(\"Only virtual ports can accept multiple positions\");\n }\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Absolute positioning is not available on the WeDo 2.0 Smart Hub\");\n }\n this.cancelEventTimer();\n return new Promise<void>((resolve) => {\n if (speed === undefined || speed === null) {\n speed = 100;\n }\n let message;\n if (angle instanceof Array) {\n message = Buffer.from([0x81, this.portId, 0x11, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, mapSpeed(speed), this._maxPower, this._brakeStyle, this.useProfile()]);\n message.writeInt32LE(normalizeAngle(angle[0]), 4);\n message.writeInt32LE(normalizeAngle(angle[1]), 8);\n } else {\n message = Buffer.from([0x81, this.portId, 0x11, 0x0d, 0x00, 0x00, 0x00, 0x00, mapSpeed(speed), this._maxPower, this._brakeStyle, this.useProfile()]);\n message.writeInt32LE(normalizeAngle(angle), 4);\n }\n this.send(message);\n this._finishedCallbacks.push(() => {\n return resolve();\n });\n });\n }\n\n\n /**\n * Rotate motor to real zero position.\n *\n * Real zero is marked on Technic angular motors (SPIKE Prime). It is also available on Technic linear motors (Control+) but is unmarked.\n * @method AbsoluteMotor#gotoRealZero\n * @param {number} [speed=100] Speed between 1 - 100. Note that this will always take the shortest path to zero.\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public gotoRealZero (speed: number = 100) {\n return new Promise<void>((resolve) => {\n const oldMode = this.mode;\n let calibrated = false;\n this.on(\"absolute\", async ({ angle }) => {\n if (!calibrated) {\n calibrated = true;\n if (angle < 0) {\n angle = Math.abs(angle);\n } else {\n speed = -speed;\n }\n await this.rotateByDegrees(angle, speed);\n if (oldMode) {\n this.subscribe(oldMode);\n }\n return resolve();\n }\n });\n this.requestUpdate();\n });\n }\n\n\n /**\n * Reset zero to current position\n * @method AbsoluteMotor#resetZero\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public resetZero () {\n return new Promise<void>((resolve) => {\n const data = Buffer.from([0x81, this.portId, 0x11, 0x51, 0x02, 0x00, 0x00, 0x00, 0x00]);\n this.send(data);\n return resolve();\n });\n }\n\n\n}\n\nexport enum Mode {\n ROTATION = 0x02,\n ABSOLUTE = 0x03\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"rotate\": Mode.ROTATION,\n \"absolute\": Mode.ABSOLUTE\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\nimport { calculateRamp, mapSpeed } from \"../utils\";\n\n/**\n * @class BasicMotor\n * @extends Device\n */\nexport class BasicMotor extends Device {\n\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number}, type: Consts.DeviceType = Consts.DeviceType.UNKNOWN) {\n super(hub, portId, modeMap, type);\n }\n\n\n /**\n * Set the motor power.\n * @method BasicMotor#setPower\n * @param {number} power For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100. Stop is 0.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setPower (power: number, interrupt: boolean = true) {\n if (interrupt) {\n this.cancelEventTimer();\n }\n return this.writeDirect(0x00, Buffer.from([mapSpeed(power)]));\n }\n\n\n /**\n * Ramp the motor power.\n * @method BasicMotor#rampPower\n * @param {number} fromPower For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100. Stop is 0.\n * @param {number} toPower For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100. Stop is 0.\n * @param {number} time How long the ramp should last (in milliseconds).\n * @returns {Promise} Resolved upon successful completion of command.\n */\n public rampPower (fromPower: number, toPower: number, time: number) {\n this.cancelEventTimer();\n return new Promise((resolve) => {\n calculateRamp(this, fromPower, toPower, time)\n .on(\"changePower\", (power) => {\n this.setPower(power, false);\n })\n .on(\"finished\", resolve);\n });\n }\n\n\n /**\n * Stop the motor.\n * @method BasicMotor#stop\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public stop () {\n this.cancelEventTimer();\n return this.setPower(0);\n }\n\n\n /**\n * Brake the motor.\n * @method BasicMotor#brake\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public brake () {\n this.cancelEventTimer();\n return this.setPower(Consts.BrakingStyle.BRAKE);\n }\n\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { parseColor } from \"../utils\";\n\n/**\n * @class ColorDistanceSensor\n * @extends Device\n */\nexport class ColorDistanceSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.COLOR_DISTANCE_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.COLOR:\n if (message[this.isWeDo2SmartHub ? 2 : 4] <= 10) {\n const color = parseColor(message[this.isWeDo2SmartHub ? 2 : 4]);\n\n /**\n * Emits when a color sensor is activated.\n * @event ColorDistanceSensor#color\n * @type {object}\n * @param {Color} color\n */\n this.notify(\"color\", { color });\n }\n break;\n\n case Mode.DISTANCE:\n if (this.isWeDo2SmartHub) {\n break;\n }\n if (message[4] <= 10) {\n let distance = Math.floor(message[4] * 25.4) - 20;\n\n if (distance < 0) {\n distance = 0;\n }\n\n /**\n * Emits when a distance sensor is activated.\n * @event ColorDistanceSensor#distance\n * @type {object}\n * @param {number} distance Distance, in millimeters.\n */\n this.notify(\"distance\", { distance });\n }\n break;\n\n case Mode.DISTANCE_COUNT:\n if (this.isWeDo2SmartHub) {\n break;\n }\n if (message.length !== 8) {\n // if mode of device has not changed to this._mode yet\n break;\n }\n const count = message.readUInt32LE(4);\n /**\n * Emits when distance is reduced to less than 10 centimeters.\n * @event ColorDistanceSensor#distanceCount\n * @type {object}\n * @param {number} number of distance events.\n */\n this.notify(\"distanceCount\", { count });\n break;\n\n case Mode.REFLECT:\n if (this.isWeDo2SmartHub) {\n break;\n }\n const reflect = message[4];\n /**\n * Event measuring reflection change, emits when the sensor is activated.\n * @event ColorDistanceSensor#reflect\n * @type {object}\n * @param {number} percentage from 0 to 100.\n */\n this.notify(\"reflect\", { reflect });\n break;\n\n case Mode.AMBIENT:\n if (this.isWeDo2SmartHub) {\n break;\n }\n const ambient = message[4];\n /**\n * Event measuring abient light change, emits when the sensor is activated.\n * @event ColorDistanceSensor#ambient\n * @type {object}\n * @param {number} percentage from 0 to 100.\n */\n this.notify(\"ambient\", { ambient });\n break;\n\n case Mode.RGB_I:\n if (this.isWeDo2SmartHub) {\n break;\n }\n if (message.length !== 10) {\n // if mode of device has not changed to this._mode yet\n break;\n }\n const red = message.readUInt16LE(4);\n const green = message.readUInt16LE(6);\n const blue = message.readUInt16LE(8);\n /**\n * Emits when a color sensor is activated.\n * @event ColorDistanceSensor#rgbIntensity\n * @type {object}\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n */\n this.notify(\"rgbIntensity\", { red, green, blue });\n break;\n\n case Mode.COLOR_AND_DISTANCE:\n if (this.isWeDo2SmartHub) {\n break;\n }\n\n let distance = message[5];\n const partial = message[7];\n\n if (partial > 0) {\n distance += 1.0 / partial;\n }\n\n distance = Math.floor(distance * 25.4) - 20;\n\n /**\n * A combined color and distance event, emits when the sensor is activated.\n * @event ColorDistanceSensor#colorAndDistance\n * @type {object}\n * @param {Color} color\n * @param {number} distance Distance, in millimeters.\n */\n if (message[4] <= 10) {\n const color = message[4];\n this.notify(\"colorAndDistance\", { color, distance });\n }\n break;\n\n }\n }\n\n\n /**\n * Switches the IR receiver into extended channel mode. After setting this, use channels 5-8 instead of 1-4 for this receiver.\n *\n * NOTE: Calling this with channel 5-8 with switch off extended channel mode for this receiver.\n * @method ColorDistanceSensor#setPFExtendedChannel\n * @param {number} channel Channel number, between 1-8\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setPFExtendedChannel (channel: number) {\n let address = 0;\n if (channel >= 4) {\n channel -= 4;\n address = 1;\n }\n const message = Buffer.alloc(2);\n // Send \"Extended toggle address command\"\n message[0] = ((channel - 1) << 4) + (address << 3);\n message[1] = 6 << 4;\n return this.sendPFIRMessage(message);\n }\n\n\n /**\n * Set the power of a Power Functions motor via IR\n * @method ColorDistanceSensor#setPFPower\n * @param {number} channel Channel number, between 1-4\n * @param {string} output Outport port, \"RED\" (A) or \"BLUE\" (B)\n * @param {number} power -7 (full reverse) to 7 (full forward). 0 is stop. 8 is brake.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setPFPower (channel: number, output: Output, power: number) {\n let address = 0;\n if (channel > 4) {\n channel -= 4;\n address = 1;\n }\n const message = Buffer.alloc(2);\n // Send \"Single output mode\"\n message[0] = ((channel - 1) << 4) + (address << 3) + (output === \"RED\" ? 4 : 5);\n message[1] = this._pfPowerToPWM(power) << 4;\n return this.sendPFIRMessage(message);\n }\n\n\n /**\n * Start Power Functions motors running via IR\n *\n * NOTE: This command is designed for bang-bang style operation. To keep the motors running, the sensor needs to be within range of the IR receiver constantly.\n * @method ColorDistanceSensor#startPFMotors\n * @param {Buffer} channel Channel number, between 1-4\n * @param {Buffer} powerA -7 (full reverse) to 7 (full forward). 0 is stop. 8 is brake.\n * @param {Buffer} powerB -7 (full reverse) to 7 (full forward). 0 is stop. 8 is brake.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public startPFMotors (channel: number, powerBlue: number, powerRed: number) {\n let address = 0;\n if (channel > 4) {\n channel -= 4;\n address = 1;\n }\n const message = Buffer.alloc(2);\n // Send \"Combo PWM mode\"\n message[0] = (((channel - 1) + 4 + (address << 3)) << 4) + this._pfPowerToPWM(powerBlue);\n message[1] = this._pfPowerToPWM(powerRed) << 4;\n return this.sendPFIRMessage(message);\n }\n\n\n /**\n * Send a raw Power Functions IR command\n * @method ColorDistanceSensor#sendPFIRMessage\n * @param {Buffer} message 2 byte payload making up a Power Functions protocol command. NOTE: Only specify nibbles 1-3, nibble 4 should be zeroed.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public sendPFIRMessage (message: Buffer) {\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Power Functions IR is not available on the WeDo 2.0 Smart Hub\");\n } else {\n const payload = Buffer.alloc(2);\n payload[0] = (message[0] << 4) + (message[1] >> 4);\n payload[1] = message[0] >> 4;\n this.subscribe(Mode.PF_IR);\n return this.writeDirect(0x07, payload);\n }\n }\n\n\n /**\n * Set the color of the LED on the sensor via a color value.\n * @method ColorDistanceSensor#setColor\n * @param {Color} color\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setColor (color: number | boolean) {\n return new Promise<void>((resolve) => {\n if (color === false) {\n color = 0;\n }\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Setting LED color is not available on the WeDo 2.0 Smart Hub\");\n } else {\n this.subscribe(Mode.LED);\n this.writeDirect(0x05, Buffer.from([color as number]));\n }\n return resolve();\n });\n }\n\n /**\n * Set the distance count value.\n * @method ColorDistanceSensor#setDistanceCount\n * @param {count} distance count between 0 and 2^32\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setDistanceCount (count: number) {\n return new Promise<void>((resolve) => {\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Setting distance count is not available on the WeDo 2.0 Smart Hub\");\n } else {\n\t\tconst payload = Buffer.alloc(4);\n\t\tpayload.writeUInt32LE(count % 2**32);\n // no need to subscribe, can be set in different mode\n this.writeDirect(0x02, payload);\n }\n return resolve();\n });\n }\n\n private _pfPowerToPWM (power: number) {\n return power & 15;\n }\n\n}\n\nexport enum Mode {\n COLOR = 0x00,\n DISTANCE = 0x01,\n DISTANCE_COUNT = 0x02,\n REFLECT = 0x03,\n AMBIENT = 0x04,\n LED = 0x05,\n RGB_I = 0x06,\n PF_IR = 0x07,\n COLOR_AND_DISTANCE = 0x08\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"color\": Mode.COLOR,\n \"distance\": Mode.DISTANCE,\n \"distanceCount\": Mode.DISTANCE_COUNT,\n \"reflect\": Mode.REFLECT,\n \"ambient\": Mode.AMBIENT,\n \"rgbIntensity\": Mode.RGB_I,\n \"colorAndDistance\": Mode.COLOR_AND_DISTANCE\n};\n\nexport enum Output {\n RED = \"RED\",\n BLUE = \"BLUE\"\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class CurrentSensor\n * @extends Device\n */\nexport class CurrentSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.CURRENT_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this.mode;\n\n switch (mode) {\n case Mode.CURRENT:\n if (this.isWeDo2SmartHub) {\n const current = message.readInt16LE(2) / 1000;\n this.notify(\"current\", { current });\n } else {\n let maxCurrentValue = MaxCurrentValue[this.hub.type];\n if (maxCurrentValue === undefined) {\n maxCurrentValue = MaxCurrentValue[Consts.HubType.UNKNOWN];\n }\n let maxCurrentRaw = MaxCurrentRaw[this.hub.type];\n if (maxCurrentRaw === undefined) {\n maxCurrentRaw = MaxCurrentRaw[Consts.HubType.UNKNOWN];\n }\n const current = message.readUInt16LE(4) * maxCurrentValue / maxCurrentRaw;\n /**\n * Emits when a current change is detected.\n * @event CurrentSensor#current\n * @type {object}\n * @param {number} current\n */\n this.notify(\"current\", { current });\n }\n break;\n }\n }\n\n}\n\nexport enum Mode {\n CURRENT = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"current\": Mode.CURRENT\n};\n\nconst MaxCurrentValue: {[hubType: number]: number} = {\n [Consts.HubType.UNKNOWN]: 2444,\n [Consts.HubType.TECHNIC_MEDIUM_HUB]: 4175,\n};\n\nconst MaxCurrentRaw: {[hubType: number]: number} = {\n [Consts.HubType.UNKNOWN]: 4095,\n};\n","import { EventEmitter } from \"events\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class Device\n * @extends EventEmitter\n */\nexport class Device extends EventEmitter {\n\n public autoSubscribe: boolean = true;\n public values: {[event: string]: any} = {};\n\n protected _mode: number | undefined;\n protected _busy: boolean = false;\n protected _finishedCallbacks: (() => void)[] = [];\n\n private _hub: IDeviceInterface;\n private _portId: number;\n private _connected: boolean = true;\n private _type: Consts.DeviceType;\n private _modeMap: {[event: string]: number} = {};\n\n private _isWeDo2SmartHub: boolean;\n private _isVirtualPort: boolean = false;\n private _eventTimer: NodeJS.Timer | null = null;\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.UNKNOWN) {\n super();\n this._hub = hub;\n this._portId = portId;\n this._type = type;\n this._modeMap = modeMap;\n this._isWeDo2SmartHub = (this.hub.type === Consts.HubType.WEDO2_SMART_HUB);\n this._isVirtualPort = this.hub.isPortVirtual(portId);\n\n const eventAttachListener = (event: string) => {\n if (event === \"detach\") {\n return;\n }\n if (this.autoSubscribe) {\n if (this._modeMap[event] !== undefined) {\n this.subscribe(this._modeMap[event]);\n }\n }\n };\n\n const deviceDetachListener = (device: Device) => {\n if (device.portId === this.portId) {\n this._connected = false;\n this.hub.removeListener(\"detach\", deviceDetachListener);\n this.emit(\"detach\");\n }\n };\n\n for (const event in this._modeMap) {\n if (this.hub.listenerCount(event) > 0) {\n eventAttachListener(event);\n }\n }\n\n this.hub.on(\"newListener\", eventAttachListener);\n this.on(\"newListener\", eventAttachListener);\n this.hub.on(\"detach\", deviceDetachListener);\n }\n\n /**\n * @readonly\n * @property {boolean} connected Check if the device is still attached.\n */\n public get connected () {\n return this._connected;\n }\n\n /**\n * @readonly\n * @property {Hub} hub The Hub the device is attached to.\n */\n public get hub () {\n return this._hub;\n }\n\n public get portId () {\n return this._portId;\n }\n\n /**\n * @readonly\n * @property {string} portName The port the device is attached to.\n */\n public get portName () {\n return this.hub.getPortNameForPortId(this.portId);\n }\n\n /**\n * @readonly\n * @property {number} type The type of the device\n */\n public get type () {\n return this._type;\n }\n\n public get typeName () {\n return Consts.DeviceTypeNames[this.type];\n }\n\n /**\n * @readonly\n * @property {number} mode The mode the device is currently in\n */\n public get mode () {\n return this._mode;\n }\n\n protected get isWeDo2SmartHub () {\n return this._isWeDo2SmartHub;\n }\n\n /**\n * @readonly\n * @property {boolean} isVirtualPort Is this device attached to a virtual port (ie. a combined device)\n */\n protected get isVirtualPort () {\n return this._isVirtualPort;\n }\n\n public writeDirect (mode: number, data: Buffer) {\n if (this.isWeDo2SmartHub) {\n return this.send(Buffer.concat([Buffer.from([this.portId, 0x01, 0x02]), data]), Consts.BLECharacteristic.WEDO2_MOTOR_VALUE_WRITE);\n } else {\n return this.send(Buffer.concat([Buffer.from([0x81, this.portId, 0x11, 0x51, mode]), data]), Consts.BLECharacteristic.LPF2_ALL);\n }\n }\n\n public send (data: Buffer, characteristic: string = Consts.BLECharacteristic.LPF2_ALL) {\n this._ensureConnected();\n return this.hub.send(data, characteristic);\n }\n\n public subscribe (mode: number) {\n this._ensureConnected();\n if (mode !== this._mode) {\n this._mode = mode;\n this.hub.subscribe(this.portId, this.type, mode);\n }\n }\n\n public unsubscribe (mode: number) {\n this._ensureConnected();\n }\n\n public receive (message: Buffer) {\n this.notify(\"receive\", { message });\n }\n\n public notify (event: string, values: any) {\n this.values[event] = values;\n this.emit(event, values);\n if (this.hub.listenerCount(event) > 0) {\n this.hub.emit(event, this, values);\n }\n }\n\n public requestUpdate () {\n this.send(Buffer.from([0x21, this.portId, 0x00]));\n }\n\n public finish (message: number) {\n if((message & 0x10) === 0x10) return; // \"busy/full\"\n this._busy = (message & 0x01) === 0x01;\n while(this._finishedCallbacks.length > Number(this._busy)) {\n const callback = this._finishedCallbacks.shift();\n if(callback) {\n callback();\n }\n }\n }\n\n public setEventTimer (timer: NodeJS.Timer) {\n this._eventTimer = timer;\n }\n\n public cancelEventTimer () {\n if (this._eventTimer) {\n clearTimeout(this._eventTimer);\n this._eventTimer = null;\n }\n }\n\n private _ensureConnected () {\n if (!this.connected) {\n throw new Error(\"Device is not connected\");\n }\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { parseColor } from \"../utils\";\n\n/**\n * @class DuploTrainBaseColorSensor\n * @extends Device\n */\nexport class DuploTrainBaseColorSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.DUPLO_TRAIN_BASE_COLOR_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.INTENSITY:\n const intensity = message[4];\n\n /**\n * Emits when intensity of the color/light changes.\n * @event DuploTrainBaseColorSensor#intensity\n * @type {object}\n * @param {number} intensity\n */\n this.notify(\"intensity\", { intensity });\n break;\n\n case Mode.COLOR:\n if (message[4] <= 10) {\n const color = parseColor(message[4]);\n\n /**\n * Emits when a color sensor is activated.\n * @event DuploTrainBaseColorSensor#color\n * @type {object}\n * @param {Color} color\n */\n this.notify(\"color\", { color });\n }\n break;\n\n case Mode.REFLECTIVITY:\n const reflect = message[4];\n\n /**\n * Emits when the light reflectivity changes.\n * @event DuploTrainBaseColorSensor#reflect\n * @type {object}\n * @param {number} reflect Percentage, from 0 to 100.\n */\n this.notify(\"reflect\", { reflect });\n break;\n\n case Mode.RGB:\n const red = Math.floor(message.readUInt16LE(4) / 4);\n const green = Math.floor(message.readUInt16LE(6) / 4);\n const blue = Math.floor(message.readUInt16LE(8) / 4);\n\n /**\n * Emits when the light reflectivity changes.\n * @event DuploTrainBaseColorSensor#rgb\n * @type {object}\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n */\n this.notify(\"rgb\", { red, green, blue });\n break;\n\n }\n }\n\n}\n\nexport enum Mode {\n INTENSITY = 0x00,\n COLOR = 0x01,\n REFLECTIVITY = 0x02,\n RGB = 0x03\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"intensity\": Mode.INTENSITY,\n \"color\": Mode.COLOR,\n \"reflect\": Mode.REFLECTIVITY,\n \"rgb\": Mode.RGB\n};\n","import { BasicMotor } from \"./basicmotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class DuploTrainBaseMotor\n * @extends BasicMotor\n */\nexport class DuploTrainBaseMotor extends BasicMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.DUPLO_TRAIN_BASE_MOTOR);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class DuploTrainBaseSpeaker\n * @extends Device\n */\nexport class DuploTrainBaseSpeaker extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.DUPLO_TRAIN_BASE_SPEAKER);\n }\n\n /**\n * Play a built-in train sound.\n * @method DuploTrainBaseSpeaker#playSound\n * @param {DuploTrainBaseSound} sound\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public playSound (sound: Consts.DuploTrainBaseSound) {\n return new Promise<void>((resolve) => {\n this.subscribe(Mode.SOUND);\n this.writeDirect(0x01, Buffer.from([sound]));\n return resolve();\n });\n }\n\n /**\n * Play a built-in system tone.\n * @method DuploTrainBaseSpeaker#playTone\n * @param {number} tone\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public playTone (tone: number) {\n this.subscribe(Mode.TONE);\n this.writeDirect(0x02, Buffer.from([tone]));\n }\n\n}\n\nexport enum Mode {\n SOUND = 0x01,\n TONE = 0x02\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class DuploTraniBaseSpeedometer\n * @extends Device\n */\nexport class DuploTrainBaseSpeedometer extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.DUPLO_TRAIN_BASE_SPEEDOMETER);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.SPEED:\n const speed = message.readInt16LE(4);\n\n /**\n * Emits on a speed change.\n * @event DuploTrainBaseSpeedometer#speed\n * @type {object}\n * @param {number} speed\n */\n this.notify(\"speed\", { speed });\n break;\n\n }\n }\n\n}\n\nexport enum Mode {\n SPEED = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"speed\": Mode.SPEED\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class HubLED\n * @extends Device\n */\nexport class HubLED extends Device {\n\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.HUB_LED);\n }\n\n\n /**\n * Set the color of the LED on the Hub via a color value.\n * @method HubLED#setColor\n * @param {Color} color\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setColor (color: number | boolean) {\n return new Promise<void>((resolve) => {\n if (typeof color === \"boolean\") {\n color = 0;\n }\n if (this.isWeDo2SmartHub) {\n this.send(Buffer.from([0x06, 0x17, 0x01, 0x01]), Consts.BLECharacteristic.WEDO2_PORT_TYPE_WRITE);\n this.send(Buffer.from([0x06, 0x04, 0x01, color]), Consts.BLECharacteristic.WEDO2_MOTOR_VALUE_WRITE);\n } else {\n this.subscribe(Mode.COLOR);\n this.writeDirect(0x00, Buffer.from([color]));\n }\n return resolve();\n });\n }\n\n\n /**\n * Set the color of the LED on the Hub via RGB values.\n * @method HubLED#setRGB\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setRGB (red: number, green: number, blue: number) {\n return new Promise<void>((resolve) => {\n if (this.isWeDo2SmartHub) {\n this.send(Buffer.from([0x06, 0x17, 0x01, 0x02]), Consts.BLECharacteristic.WEDO2_PORT_TYPE_WRITE);\n this.send(Buffer.from([0x06, 0x04, 0x03, red, green, blue]), Consts.BLECharacteristic.WEDO2_MOTOR_VALUE_WRITE);\n } else {\n this.subscribe(Mode.RGB);\n this.writeDirect(0x01, Buffer.from([red, green, blue]));\n }\n return resolve();\n });\n }\n\n\n}\n\nexport enum Mode {\n COLOR = 0x00,\n RGB = 0x01\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { calculateRamp } from \"../utils\";\n\n/**\n * @class Light\n * @extends Device\n */\nexport class Light extends Device {\n\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.LIGHT);\n }\n\n\n /**\n * Set the light brightness.\n * @method Light#setBrightness\n * @param {number} brightness Brightness value between 0-100 (0 is off)\n * @returns {Promise} Resolved upon successful completion of command.\n */\n public setBrightness (brightness: number, interrupt: boolean = true) {\n if (interrupt) {\n this.cancelEventTimer();\n }\n return new Promise<void>((resolve) => {\n this.writeDirect(0x00, Buffer.from([brightness]));\n return resolve();\n });\n }\n\n\n /**\n * Ramp the light brightness.\n * @method Light#rampBrightness\n * @param {number} fromBrightness Brightness value between 0-100 (0 is off)\n * @param {number} toBrightness Brightness value between 0-100 (0 is off)\n * @param {number} time How long the ramp should last (in milliseconds).\n * @returns {Promise} Resolved upon successful completion of command.\n */\n public rampBrightness (fromBrightness: number, toBrightness: number, time: number) {\n this.cancelEventTimer();\n return new Promise((resolve) => {\n calculateRamp(this, fromBrightness, toBrightness, time)\n .on(\"changePower\", (power) => {\n this.setBrightness(power, false);\n })\n .on(\"finished\", resolve);\n });\n }\n\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MarioAccelerometer\n * @extends Device\n */\nexport class MarioAccelerometer extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.MARIO_ACCELEROMETER);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.ACCEL:\n /**\n * Emits when accelerometer detects movement. Measured in mG.\n * @event MarioAccelerometer#accel\n * @type {object}\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\n const x = message[4];\n const y = message[5];\n const z = message[6];\n this.notify(\"accel\", { x, y, z });\n break;\n case Mode.GEST:\n /**\n * Emits when a gesture is detected\n * @event MarioAccelerometer#gest\n * @type {object}\n * @param {number} gesture\n */\n const gesture = message[4];\n this.notify(\"gesture\", { gesture });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n ACCEL = 0x00,\n GEST = 0x01,\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"accel\": Mode.ACCEL,\n \"gesture\": Mode.GEST,\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MarioBarcodeSensor\n * @extends Device\n */\nexport class MarioBarcodeSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.MARIO_BARCODE_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.BARCODE:\n /**\n * Emits when the barcode sensor sees a barcode.\n * @event MarioBarcodeSensor#barcode\n * @type {object}\n * @param {number} id\n */\n const barcode = message.readUInt16LE(4);\n const color = message.readUInt16LE(6);\n if (color === 0xffff) {\n // This is a barcode\n this.notify(\"barcode\", { barcode });\n } else if (barcode === 0xffff) {\n // This is a color\n this.notify(\"barcode\", { color });\n }\n break;\n case Mode.RGB:\n /**\n * Emits when the barcode sensor sees a RGB color.\n * @event MarioBarcodeSensor#rgb\n * @type {object}\n * @param {number} r\n * @param {number} g\n * @param {number} b\n */\n const r = message[4];\n const g = message[5];\n const b = message[6];\n this.notify(\"rgb\", { r, g, b });\n break;\n\n }\n }\n\n}\n\nexport enum Mode {\n BARCODE = 0x00,\n RGB = 0x01,\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"barcode\": Mode.BARCODE,\n \"rgb\": Mode.RGB,\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MarioPantsSensor\n * @extends Device\n */\nexport class MarioPantsSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.MARIO_PANTS_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.PANTS:\n /**\n * Emits when the user changes the pants on Mario.\n * @event MarioPantsSensor#pants\n * @type {object}\n * @param {number} pants\n */\n const pants = message[4];\n this.notify(\"pants\", { pants });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n PANTS = 0x00,\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"pants\": Mode.PANTS,\n};\n","import { TachoMotor } from \"./tachomotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MediumLinearMotor\n * @extends TachoMotor\n */\nexport class MediumLinearMotor extends TachoMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.MEDIUM_LINEAR_MOTOR);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MotionSensor\n * @extends Device\n */\nexport class MotionSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.MOTION_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.DISTANCE:\n let distance = message[this.isWeDo2SmartHub ? 2 : 4];\n if (message[this.isWeDo2SmartHub ? 3 : 5] === 1) {\n distance = distance + 255;\n }\n distance *= 10;\n /**\n * Emits when a distance sensor is activated.\n * @event MotionSensor#distance\n * @type {object}\n * @param {number} distance Distance, in millimeters.\n */\n this.notify(\"distance\", { distance });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n DISTANCE = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"distance\": Mode.DISTANCE\n};\n","import { TachoMotor } from \"./tachomotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MoveHubMediumLinearMotor\n * @extends TachoMotor\n */\nexport class MoveHubMediumLinearMotor extends TachoMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.MOVE_HUB_MEDIUM_LINEAR_MOTOR);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MoveHubTiltSensor\n * @extends Device\n */\nexport class MoveHubTiltSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.MOVE_HUB_TILT_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.TILT:\n /**\n * Emits when a tilt sensor is activated.\n * @event MoveHubTiltSensor#tilt\n * @type {object}\n * @param {number} x\n * @param {number} y\n */\n const x = -message.readInt8(4);\n const y = message.readInt8(5);\n this.notify(\"tilt\", { x, y });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n TILT = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"tilt\": Mode.TILT\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class PiezoBuzzer\n * @extends Device\n */\nexport class PiezoBuzzer extends Device {\n\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.PIEZO_BUZZER);\n }\n\n\n /**\n * Play a tone on the Hub's in-built buzzer\n * @method PiezoBuzzer#playTone\n * @param {number} frequency\n * @param {number} time How long the tone should play for (in milliseconds).\n * @returns {Promise} Resolved upon successful completion of command (ie. once the tone has finished playing).\n */\n public playTone (frequency: number, time: number) {\n return new Promise((resolve) => {\n const data = Buffer.from([0x05, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00]);\n data.writeUInt16LE(frequency, 3);\n data.writeUInt16LE(time, 5);\n this.send(data, Consts.BLECharacteristic.WEDO2_MOTOR_VALUE_WRITE);\n global.setTimeout(resolve, time);\n });\n }\n\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class RemoteControlButton\n * @extends Device\n */\nexport class RemoteControlButton extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.REMOTE_CONTROL_BUTTON);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.BUTTON_EVENTS:\n /**\n * Emits when a button on the remote is pressed or released.\n * @event RemoteControlButton#button\n * @type {object}\n * @param {number} event\n */\n const event = message[4];\n this.notify(\"remoteButton\", { event });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n BUTTON_EVENTS = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"remoteButton\": Mode.BUTTON_EVENTS\n};\n\nexport const ButtonState: {[state: string]: number} = {\n \"UP\": 0x01,\n \"DOWN\": 0xff,\n \"STOP\": 0x7f,\n \"RELEASED\": 0x00,\n};\n","import { BasicMotor } from \"./basicmotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class SimpleMediumLinearMotor\n * @extends Device\n */\nexport class SimpleMediumLinearMotor extends BasicMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.SIMPLE_MEDIUM_LINEAR_MOTOR);\n }\n\n}\n","import { BasicMotor } from \"./basicmotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { mapSpeed } from \"../utils\";\n\n/**\n * @class TachoMotor\n * @extends BasicMotor\n */\nexport class TachoMotor extends BasicMotor {\n\n protected _brakeStyle: Consts.BrakingStyle = Consts.BrakingStyle.BRAKE;\n protected _maxPower: number = 100;\n public useAccelerationProfile: boolean = true;\n public useDecelerationProfile: boolean = true;\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.UNKNOWN) {\n super(hub, portId, Object.assign({}, modeMap, ModeMap), type);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.ROTATION:\n const degrees = message.readInt32LE(this.isWeDo2SmartHub ? 2 : 4);\n /**\n * Emits when a rotation sensor is activated.\n * @event TachoMotor#rotate\n * @type {object}\n * @param {number} rotation\n */\n this.notify(\"rotate\", { degrees });\n break;\n }\n }\n\n\n /**\n * Set the braking style of the motor.\n *\n * Note: This applies to setSpeed, rotateByDegrees, and gotoAngle.\n * @method TachoMotor#setBrakingStyle\n * @param {number} style Either BRAKE or HOLD\n */\n public setBrakingStyle (style: Consts.BrakingStyle) {\n this._brakeStyle = style;\n }\n\n\n /**\n * Set the max power of the motor.\n *\n * Note: This applies to setSpeed, rotateByDegrees, and gotoAngle.\n * @method TachoMotor#setMaxPower\n * @param {number} style Either BRAKE or HOLD\n */\n public setMaxPower (maxPower: number) {\n this._maxPower = maxPower;\n }\n\n\n /**\n * Set the global acceleration time\n * @method TachoMotor#setAccelerationTime\n * @param {number} time How long acceleration should last (in milliseconds).\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public setAccelerationTime (time: number, profile: number = 0x00) {\n const message = Buffer.from([0x81, this.portId, 0x11, 0x05, 0x00, 0x00, profile]);\n message.writeUInt16LE(time, 4);\n this.send(message);\n }\n\n\n /**\n * Set the global deceleration time\n * @method TachoMotor#setDecelerationTime\n * @param {number} time How long deceleration should last (in milliseconds).\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public setDecelerationTime (time: number, profile: number = 0x00) {\n const message = Buffer.from([0x81, this.portId, 0x11, 0x06, 0x00, 0x00, profile]);\n message.writeUInt16LE(time, 4);\n this.send(message);\n }\n\n\n /**\n * Set the motor speed.\n * @method TachoMotor#setSpeed\n * @param {number} speed For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100. Stop is 0.\n * @param {number} time How long the motor should run for (in milliseconds).\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setSpeed (speed: [number, number] | number, time: number | undefined) {\n if (!this.isVirtualPort && speed instanceof Array) {\n throw new Error(\"Only virtual ports can accept multiple speeds\");\n }\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Motor speed is not available on the WeDo 2.0 Smart Hub\");\n }\n this.cancelEventTimer();\n return new Promise<void>((resolve) => {\n if (speed === undefined || speed === null) {\n speed = 100;\n }\n let message;\n if (time !== undefined) {\n if (speed instanceof Array) {\n message = Buffer.from([0x81, this.portId, 0x11, 0x0a, 0x00, 0x00, mapSpeed(speed[0]), mapSpeed(speed[1]), this._maxPower, this._brakeStyle, this.useProfile()]);\n } else {\n message = Buffer.from([0x81, this.portId, 0x11, 0x09, 0x00, 0x00, mapSpeed(speed), this._maxPower, this._brakeStyle, this.useProfile()]);\n }\n message.writeUInt16LE(time, 4);\n } else {\n if (speed instanceof Array) {\n message = Buffer.from([0x81, this.portId, 0x11, 0x08, mapSpeed(speed[0]), mapSpeed(speed[1]), this._maxPower, this.useProfile()]);\n } else {\n message = Buffer.from([0x81, this.portId, 0x11, 0x07, mapSpeed(speed), this._maxPower, this.useProfile()]);\n }\n }\n this.send(message);\n this._finishedCallbacks.push(() => {\n return resolve();\n });\n });\n }\n\n /**\n * Rotate a motor by a given amount of degrees.\n * @method TachoMotor#rotateByDegrees\n * @param {number} degrees How much the motor should be rotated (in degrees).\n * @param {number} [speed=100] For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100.\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public rotateByDegrees (degrees: number, speed: [number, number] | number) {\n if (!this.isVirtualPort && speed instanceof Array) {\n throw new Error(\"Only virtual ports can accept multiple speeds\");\n }\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Rotation is not available on the WeDo 2.0 Smart Hub\");\n }\n this.cancelEventTimer();\n return new Promise<void>((resolve) => {\n if (speed === undefined || speed === null) {\n speed = 100;\n }\n let message;\n if (speed instanceof Array) {\n message = Buffer.from([0x81, this.portId, 0x11, 0x0c, 0x00, 0x00, 0x00, 0x00, mapSpeed(speed[0]), mapSpeed(speed[1]), this._maxPower, this._brakeStyle, this.useProfile()]);\n } else {\n message = Buffer.from([0x81, this.portId, 0x11, 0x0b, 0x00, 0x00, 0x00, 0x00, mapSpeed(speed), this._maxPower, this._brakeStyle, this.useProfile()]);\n }\n message.writeUInt32LE(degrees, 4);\n this.send(message);\n this._finishedCallbacks.push(() => {\n return resolve();\n });\n });\n }\n\n\n protected useProfile () {\n let value = 0x00;\n if (this.useAccelerationProfile) {\n value += 0x01;\n }\n if (this.useDecelerationProfile) {\n value += 0x02;\n }\n return value;\n }\n\n\n}\n\nexport enum Mode {\n ROTATION = 0x02\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"rotate\": Mode.ROTATION\n};\n","import { Color } from \"../color\";\n\nimport { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class Technic3x3ColorLightMatrix\n * @extends Device\n */\nexport class Technic3x3ColorLightMatrix extends Device {\n\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.TECHNIC_3X3_COLOR_LIGHT_MATRIX);\n }\n\n\n /**\n * Set the LED matrix, one color per LED\n * @method Technic3x3ColorLightMatrix#setMatrix\n * @param {Color[] | Color} colors Array of 9 colors, 9 Color objects, or a single color\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setMatrix (colors: number[] | number) {\n return new Promise<void>((resolve) => {\n this.subscribe(Mode.PIX_0);\n const colorArray = new Array(9);\n for (let i = 0; i < colorArray.length; i++) {\n if (typeof colors === 'number') {\n // @ts-ignore\n colorArray[i] = colors + (10 << 4);\n }\n // @ts-ignore\n if (colors[i] instanceof Color) {\n // @ts-ignore\n colorArray[i] = colors[i].toValue();\n }\n // @ts-ignore\n if (colors[i] === Consts.Color.NONE) {\n colorArray[i] = Consts.Color.NONE;\n }\n // @ts-ignore\n if (colors[i] <= 10) {\n // @ts-ignore\n colorArray[i] = colors[i] + (10 << 4); // If a raw color value, set it to max brightness (10)\n }\n }\n this.writeDirect(Mode.PIX_0, Buffer.from(colorArray));\n return resolve();\n });\n }\n\n\n}\n\nexport enum Mode {\n LEV_0 = 0x00,\n COL_0 = 0x01,\n PIX_0 = 0x02,\n TRANS = 0x03\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { parseColor } from \"../utils\";\n\n/**\n * @class TechnicColorSensor\n * @extends Device\n */\nexport class TechnicColorSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_COLOR_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.COLOR:\n if (message[4] <= 10) {\n const color = parseColor(message[4]);\n\n /**\n * Emits when a color sensor is activated.\n * @event TechnicColorSensor#color\n * @type {object}\n * @param {Color} color\n */\n this.notify(\"color\", { color });\n }\n break;\n\n case Mode.REFLECTIVITY:\n const reflect = message[4];\n\n /**\n * Emits when the light reflectivity changes.\n * @event TechnicColorSensor#reflect\n * @type {object}\n * @param {number} reflect Percentage, from 0 to 100.\n */\n this.notify(\"reflect\", { reflect });\n break;\n\n case Mode.AMBIENT_LIGHT:\n const ambient = message[4];\n\n /**\n * Emits when the ambient light changes.\n * @event TechnicColorSensor#ambient\n * @type {object}\n * @param {number} ambient Percentage, from 0 to 100.\n */\n this.notify(\"ambient\", { ambient });\n break;\n }\n }\n\n /**\n * Set the brightness (or turn on/off) of the lights around the sensor.\n * @method TechnicColorSensor#setBrightness\n * @param {number} firstSegment First light segment. 0-100 brightness.\n * @param {number} secondSegment Second light segment. 0-100 brightness.\n * @param {number} thirdSegment Third light segment. 0-100 brightness.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setBrightness (firstSegment: number, secondSegment: number, thirdSegment: number) {\n this.writeDirect(0x03, Buffer.from([firstSegment, secondSegment, thirdSegment]));\n }\n\n}\n\nexport enum Mode {\n COLOR = 0x00,\n REFLECTIVITY = 0x01,\n AMBIENT_LIGHT = 0x02\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"color\": Mode.COLOR,\n \"reflect\": Mode.REFLECTIVITY,\n \"ambient\": Mode.AMBIENT_LIGHT\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicDistanceSensor\n * @extends Device\n */\nexport class TechnicDistanceSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_DISTANCE_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.DISTANCE:\n const distance = message.readUInt16LE(4);\n\n /**\n * Emits when the detected distance changes (Slow sampling covers 40mm to 2500mm).\n * @event TechnicDistanceSensor#distance\n * @type {object}\n * @param {number} distance Distance, from 40 to 2500mm\n */\n this.notify(\"distance\", { distance });\n break;\n\n case Mode.FAST_DISTANCE:\n const fastDistance = message.readUInt16LE(4);\n\n /**\n * Emits when the detected distance changes (Fast sampling covers 50mm to 320mm).\n * @event TechnicDistanceSensor#fastDistance\n * @type {object}\n * @param {number} fastDistance Distance, from 50 to 320mm\n */\n this.notify(\"fastDistance\", { fastDistance });\n break;\n }\n }\n\n /**\n * Set the brightness (or turn on/off) of the lights around the eyes.\n * @method TechnicDistanceSensor#setBrightness\n * @param {number} topLeft Top left quadrant (above left eye). 0-100 brightness.\n * @param {number} bottomLeft Bottom left quadrant (below left eye). 0-100 brightness.\n * @param {number} topRight Top right quadrant (above right eye). 0-100 brightness.\n * @param {number} bottomRight Bottom right quadrant (below right eye). 0-100 brightness.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setBrightness (topLeft: number, bottomLeft: number, topRight: number, bottomRight: number) {\n this.writeDirect(0x05, Buffer.from([topLeft, topRight, bottomLeft, bottomRight]));\n }\n\n}\n\nexport enum Mode {\n DISTANCE = 0x00,\n FAST_DISTANCE = 0x01\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"distance\": Mode.DISTANCE,\n \"fastDistance\": Mode.FAST_DISTANCE\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicForceSensor\n * @extends Device\n */\nexport class TechnicForceSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_FORCE_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.FORCE:\n const force = message[this.isWeDo2SmartHub ? 2 : 4] / 10;\n\n /**\n * Emits when force is applied.\n * @event TechnicForceSensor#force\n * @type {object}\n * @param {number} force Force, in newtons (0-10).\n */\n this.notify(\"force\", { force });\n break;\n\n case Mode.TOUCHED:\n const touched = message[4] ? true : false;\n\n /**\n * Emits when the sensor is touched.\n * @event TechnicForceSensor#touch\n * @type {object}\n * @param {boolean} touch Touched on/off (boolean).\n */\n this.notify(\"touched\", { touched });\n break;\n\n case Mode.TAPPED:\n const tapped = message[4];\n\n /**\n * Emits when the sensor is tapped.\n * @event TechnicForceSensor#tapped\n * @type {object}\n * @param {number} tapped How hard the sensor was tapped, from 0-3.\n */\n this.notify(\"tapped\", { tapped });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n FORCE = 0x00,\n TOUCHED = 0x01,\n TAPPED = 0x02\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"force\": Mode.FORCE,\n \"touched\": Mode.TOUCHED,\n \"tapped\": Mode.TAPPED\n};\n","import { AbsoluteMotor } from \"./absolutemotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicLargeAngularMotor\n * @extends AbsoluteMotor\n */\nexport class TechnicLargeAngularMotor extends AbsoluteMotor {\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.TECHNIC_LARGE_ANGULAR_MOTOR) {\n super(hub, portId, {}, type);\n }\n\n}\n","import { AbsoluteMotor } from \"./absolutemotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicLargeLinearMotor\n * @extends AbsoluteMotor\n */\nexport class TechnicLargeLinearMotor extends AbsoluteMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.TECHNIC_LARGE_LINEAR_MOTOR);\n }\n\n}\n","import { AbsoluteMotor } from \"./absolutemotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicMediumAngularMotor\n * @extends AbsoluteMotor\n */\nexport class TechnicMediumAngularMotor extends AbsoluteMotor {\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.TECHNIC_MEDIUM_ANGULAR_MOTOR) {\n super(hub, portId, {}, type);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicMediumHubAccelerometerSensor\n * @extends Device\n */\nexport class TechnicMediumHubAccelerometerSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_MEDIUM_HUB_ACCELEROMETER);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.ACCEL:\n /**\n * Emits when accelerometer detects movement. Measured in mG.\n * @event TechnicMediumHubAccelerometerSensor#accel\n * @type {object}\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\n const x = Math.round(message.readInt16LE(4) / 4.096);\n const y = Math.round(message.readInt16LE(6) / 4.096);\n const z = Math.round(message.readInt16LE(8) / 4.096);\n this.notify(\"accel\", { x, y, z });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n ACCEL = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"accel\": Mode.ACCEL\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicMediumHubGyroSensor\n * @extends Device\n */\nexport class TechnicMediumHubGyroSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_MEDIUM_HUB_GYRO_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.GYRO:\n /**\n * Emits when gyroscope detects movement. Measured in DPS - degrees per second.\n * @event TechnicMediumHubGyroSensor#gyro\n * @type {object}\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\n const x = Math.round(message.readInt16LE(4) * 7 / 400);\n const y = Math.round(message.readInt16LE(6) * 7 / 400);\n const z = Math.round(message.readInt16LE(8) * 7 / 400);\n this.notify(\"gyro\", { x, y, z });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n GYRO = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"gyro\": Mode.GYRO\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicMediumHubTiltSensor\n * @extends Device\n */\nexport class TechnicMediumHubTiltSensor extends Device {\n\n protected _impactThreshold: number = 10; // guess of default value\n protected _impactHoldoff: number = 10; // guess of default value\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_MEDIUM_HUB_TILT_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.TILT:\n /**\n * Emits when a tilt sensor is activated.\n *\n * @event TechnicMediumHubTiltSensor#tilt\n * @type {object}\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\n let z = -message.readInt16LE(4);\n const y = message.readInt16LE(6);\n const x = message.readInt16LE(8);\n\n // workaround for calibration problem or bug in technicMediumHub firmware 1.1.00.0000\n if(y === 90 || y === -90) {\n z = Math.sign(y)*(z + 180);\n if(z > 180) z -= 360;\n if(z < -180) z += 360;\n }\n\n this.notify(\"tilt\", { x, y, z });\n break;\n\n case Mode.IMPACT_COUNT:\n if (message.length !== 8) {\n // if mode of device has not changed to this._mode yet\n break;\n }\n const count = message.readUInt32LE(4);\n /**\n * Emits when proper acceleration is above threshold (e.g. on impact when being thrown to the ground).\n * @event TechnicMediumHubTiltSensor#impactCount\n * @type {object}\n * @param {number} number of impact events.\n */\n this.notify(\"tiltCount\", { count });\n break;\n }\n }\n\n /**\n * Set the impact count value.\n * @method TechnicMediumHubTiltSensor#setImpactCount\n * @param {count} impact count between 0 and 2^32\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setImpactCount (count: number) {\n return new Promise<void>((resolve) => {\n const payload = Buffer.alloc(4);\n\t payload.writeUInt32LE(count % 2**32);\n // no need to subscribe, can be set in different mode\n this.writeDirect(0x01, payload);\n return resolve();\n });\n }\n\n /**\n * Set the impact threshold.\n * @method TechnicMediumHubTiltSensor#setImpactThreshold\n * @param {threshold} value between 1 and 127\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setImpactThreshold (threshold: number) {\n this._impactThreshold = threshold;\n return new Promise<void>((resolve) => {\n this.writeDirect(0x02, Buffer.from([this._impactThreshold, this._impactHoldoff]));\n return resolve();\n });\n }\n\n /**\n * Set the impact holdoff time.\n * @method TechnicMediumHubTiltSensor#setImpactHoldoff\n * @param {holdoff} value between 1 and 127\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setImpactHoldoff (holdoff: number) {\n this._impactHoldoff = holdoff;\n return new Promise<void>((resolve) => {\n this.writeDirect(0x02, Buffer.from([this._impactThreshold, this._impactHoldoff]));\n return resolve();\n });\n }\n}\n\nexport enum Mode {\n TILT = 0x00,\n IMPACT_COUNT = 0x01\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"tilt\": Mode.TILT,\n \"impactCount\": Mode.IMPACT_COUNT\n};\n","import { AbsoluteMotor } from \"./absolutemotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicSmallAngularMotor\n * @extends AbsoluteMotor\n */\nexport class TechnicSmallAngularMotor extends AbsoluteMotor {\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.TECHNIC_SMALL_ANGULAR_MOTOR) {\n super(hub, portId, {}, type);\n }\n\n}\n","import { AbsoluteMotor } from \"./absolutemotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicXLargeLinearMotor\n * @extends AbsoluteMotor\n */\nexport class TechnicXLargeLinearMotor extends AbsoluteMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.TECHNIC_XLARGE_LINEAR_MOTOR);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TiltSensor\n * @extends Device\n */\nexport class TiltSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TILT_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.TILT:\n const x = message.readInt8(this.isWeDo2SmartHub ? 2 : 4);\n const y = message.readInt8(this.isWeDo2SmartHub ? 3 : 5);\n /**\n * Emits when a tilt sensor is activated.\n * @event TiltSensor#tilt\n * @type {object}\n * @param {number} x\n * @param {number} y\n */\n this.notify(\"tilt\", { x, y });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n TILT = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"tilt\": Mode.TILT\n};\n","import { BasicMotor } from \"./basicmotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TrainMotor\n * @extends BasicMotor\n */\nexport class TrainMotor extends BasicMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.TRAIN_MOTOR);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class VoltageSensor\n * @extends Device\n */\nexport class VoltageSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.VOLTAGE_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.VOLTAGE:\n if (this.isWeDo2SmartHub) {\n const voltage = message.readInt16LE(2) / 40;\n this.notify(\"voltage\", { voltage });\n } else {\n let maxVoltageValue = MaxVoltageValue[this.hub.type];\n if (maxVoltageValue === undefined) {\n maxVoltageValue = MaxVoltageValue[Consts.HubType.UNKNOWN];\n }\n let maxVoltageRaw = MaxVoltageRaw[this.hub.type];\n if (maxVoltageRaw === undefined) {\n maxVoltageRaw = MaxVoltageRaw[Consts.HubType.UNKNOWN];\n }\n const voltage = message.readUInt16LE(4) * maxVoltageValue / maxVoltageRaw;\n /**\n * Emits when a voltage change is detected.\n * @event VoltageSensor#voltage\n * @type {object}\n * @param {number} voltage\n */\n this.notify(\"voltage\", { voltage });\n }\n break;\n }\n }\n\n}\n\nexport enum Mode {\n VOLTAGE = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"voltage\": Mode.VOLTAGE\n};\n\nconst MaxVoltageValue: {[hubType: number]: number} = {\n [Consts.HubType.UNKNOWN]: 9.615,\n [Consts.HubType.DUPLO_TRAIN_BASE]: 6.4,\n [Consts.HubType.REMOTE_CONTROL]: 6.4,\n};\n\nconst MaxVoltageRaw: {[hubType: number]: number} = {\n [Consts.HubType.UNKNOWN]: 3893,\n [Consts.HubType.DUPLO_TRAIN_BASE]: 3047,\n [Consts.HubType.REMOTE_CONTROL]: 3200,\n [Consts.HubType.TECHNIC_MEDIUM_HUB]: 4095,\n};\n","import { EventEmitter } from \"events\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { ColorDistanceSensor } from \"../devices/colordistancesensor\";\nimport { CurrentSensor } from \"../devices/currentsensor\";\nimport { Device } from \"../devices/device\";\n\nimport { DuploTrainBaseColorSensor } from \"../devices/duplotrainbasecolorsensor\";\nimport { DuploTrainBaseMotor } from \"../devices/duplotrainbasemotor\";\nimport { DuploTrainBaseSpeaker } from \"../devices/duplotrainbasespeaker\";\nimport { DuploTrainBaseSpeedometer } from \"../devices/duplotrainbasespeedometer\";\n\nimport { HubLED } from \"../devices/hubled\";\nimport { Light } from \"../devices/light\";\nimport { MarioAccelerometer } from \"../devices/marioaccelerometer\";\nimport { MarioBarcodeSensor } from \"../devices/mariobarcodesensor\";\nimport { MarioPantsSensor } from \"../devices/mariopantssensor\";\nimport { MediumLinearMotor } from \"../devices/mediumlinearmotor\";\nimport { MotionSensor } from \"../devices/motionsensor\";\nimport { MoveHubMediumLinearMotor } from \"../devices/movehubmediumlinearmotor\";\nimport { MoveHubTiltSensor } from \"../devices/movehubtiltsensor\";\nimport { PiezoBuzzer } from \"../devices/piezobuzzer\";\nimport { RemoteControlButton } from \"../devices/remotecontrolbutton\";\nimport { SimpleMediumLinearMotor } from \"../devices/simplemediumlinearmotor\";\nimport { TechnicColorSensor } from \"../devices/techniccolorsensor\";\nimport { TechnicDistanceSensor } from \"../devices/technicdistancesensor\";\nimport { TechnicForceSensor } from \"../devices/technicforcesensor\";\nimport { TechnicLargeAngularMotor } from \"../devices/techniclargeangularmotor\";\nimport { TechnicLargeLinearMotor } from \"../devices/techniclargelinearmotor\";\nimport { TechnicSmallAngularMotor } from \"../devices/technicsmallangularmotor\";\nimport { TechnicMediumAngularMotor } from \"../devices/technicmediumangularmotor\";\nimport { TechnicMediumHubAccelerometerSensor } from \"../devices/technicmediumhubaccelerometersensor\";\nimport { TechnicMediumHubGyroSensor } from \"../devices/technicmediumhubgyrosensor\";\nimport { TechnicMediumHubTiltSensor } from \"../devices/technicmediumhubtiltsensor\";\nimport { TechnicXLargeLinearMotor } from \"../devices/technicxlargelinearmotor\";\nimport { TiltSensor } from \"../devices/tiltsensor\";\nimport { TrainMotor } from \"../devices/trainmotor\";\nimport { VoltageSensor } from \"../devices/voltagesensor\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nimport { Technic3x3ColorLightMatrix } from \"../devices/technic3x3colorlightmatrix\";\nconst debug = Debug(\"basehub\");\n\n\n/**\n * @class BaseHub\n * @extends EventEmitter\n */\nexport class BaseHub extends EventEmitter {\n\n protected _attachedDevices: {[portId: number]: Device} = {};\n\n protected _name: string = \"\";\n protected _firmwareVersion: string = \"0.0.00.0000\";\n protected _hardwareVersion: string = \"0.0.00.0000\";\n protected _primaryMACAddress: string = \"00:00:00:00:00:00\";\n protected _batteryLevel: number = 100;\n protected _rssi: number = -60;\n protected _portMap: {[portName: string]: number} = {};\n protected _virtualPorts: number[] = [];\n\n protected _bleDevice: IBLEAbstraction;\n\n private _type: Consts.HubType;\n private _attachCallbacks: ((device: Device) => boolean)[] = [];\n\n constructor (bleDevice: IBLEAbstraction, portMap: {[portName: string]: number} = {}, type: Consts.HubType = Consts.HubType.UNKNOWN) {\n super();\n this.setMaxListeners(23); // Technic Medium Hub has 9 built in devices + 4 external ports. Node.js throws a warning after 10 attached event listeners.\n this._type = type;\n this._bleDevice = bleDevice;\n this._portMap = Object.assign({}, portMap);\n bleDevice.on(\"disconnect\", () => {\n /**\n * Emits when the hub is disconnected.\n * @event Hub#disconnect\n */\n this.emit(\"disconnect\");\n });\n }\n\n\n /**\n * @readonly\n * @property {string} name Name of the hub\n */\n public get name () {\n return this._bleDevice.name;\n }\n\n\n /**\n * @readonly\n * @property {string} connected Connected status\n */\n public get connected () {\n return this._bleDevice.connected;\n }\n\n\n /**\n * @readonly\n * @property {string} connecting Connecting status\n */\n public get connecting () {\n return this._bleDevice.connecting;\n }\n\n\n /**\n * @readonly\n * @property {string} type Hub type\n */\n public get type () {\n return this._type;\n }\n\n\n /**\n * @readonly\n * @property {string[]} ports Array of port names\n */\n public get ports () {\n return Object.keys(this._portMap);\n }\n\n\n /**\n * @readonly\n * @property {string} firmwareVersion Firmware version of the hub\n */\n public get firmwareVersion () {\n return this._firmwareVersion;\n }\n\n\n /**\n * @readonly\n * @property {string} hardwareVersion Hardware version of the hub\n */\n public get hardwareVersion () {\n return this._hardwareVersion;\n }\n\n\n /**\n * @readonly\n * @property {string} primaryMACAddress Primary MAC address of the hub\n */\n public get primaryMACAddress () {\n return this._primaryMACAddress;\n }\n\n\n /**\n * @readonly\n * @property {string} uuid UUID of the hub\n */\n public get uuid () {\n return this._bleDevice.uuid;\n }\n\n\n /**\n * @readonly\n * @property {number} batteryLevel Battery level of the hub (Percentage between 0-100)\n */\n public get batteryLevel () {\n return this._batteryLevel;\n }\n\n\n /**\n * @readonly\n * @property {number} rssi Signal strength of the hub\n */\n public get rssi () {\n return this._rssi;\n }\n\n\n /**\n * Connect to the Hub.\n * @method Hub#connect\n * @returns {Promise} Resolved upon successful connect.\n */\n public connect () {\n if (this._bleDevice.connecting) {\n throw new Error(\"Already connecting\");\n } else if (this._bleDevice.connected) {\n throw new Error(\"Already connected\");\n }\n return this._bleDevice.connect();\n }\n\n\n /**\n * Disconnect the Hub.\n * @method Hub#disconnect\n * @returns {Promise} Resolved upon successful disconnect.\n */\n public disconnect () {\n return this._bleDevice.disconnect();\n }\n\n\n /**\n * Retrieves the device attached to a given port.\n * @method Hub#getDeviceAtPort\n * @param {string} portName The name of the port to retrieve the device from.\n * @returns {Device | undefined} The device attached to the port.\n */\n public getDeviceAtPort (portName: string) {\n const portId = this._portMap[portName];\n if (portId !== undefined) {\n return this._attachedDevices[portId];\n } else {\n return undefined;\n }\n }\n\n\n /**\n * Retrieves the device attached to a given port, waiting until one is attached if there isn't one.\n *\n * Note: If a device is never attached, the returned promise may never resolve.\n * @method Hub#waitForDeviceAtPort\n * @param {string} portName The name of the port to retrieve the device from.\n * @returns {Promise} Resolved once a device is attached, or resolved immediately if a device is already attached.\n */\n public waitForDeviceAtPort (portName: string) {\n return new Promise((resolve) => {\n const existingDevice = this.getDeviceAtPort(portName);\n if (existingDevice) {\n return resolve(existingDevice);\n }\n this._attachCallbacks.push((device) => {\n if (device.portName === portName) {\n resolve(device);\n return true;\n } else {\n return false;\n }\n });\n });\n }\n\n\n /**\n * Retrieves all attached devices.\n * @method Hub#getDevices\n * @returns {Device[]} Array of all attached devices.\n */\n public getDevices () {\n return Object.values(this._attachedDevices);\n }\n\n\n /**\n * Retrieves an array of devices of the specified type.\n * @method Hub#getDevicesByType\n * @param {number} deviceType The device type to lookup.\n * @returns {Device[]} Array of all devices of the specified type.\n */\n public getDevicesByType (deviceType: number) {\n return this.getDevices().filter((device) => device.type === deviceType);\n }\n\n\n /**\n * Retrieves the first device attached of the specified type, waiting until one is attached if there isn't one.\n *\n * Note: If a device is never attached, the returned promise may never resolve.\n * @method Hub#waitForDeviceByType\n * @param {number} deviceType The device type to lookup.\n * @returns {Promise} Resolved once a device is attached, or resolved immediately if a device is already attached.\n */\n public waitForDeviceByType (deviceType: number) {\n return new Promise((resolve) => {\n const existingDevices = this.getDevicesByType(deviceType);\n if (existingDevices.length >= 1) {\n return resolve(existingDevices[0]);\n }\n this._attachCallbacks.push((device) => {\n if (device.type === deviceType) {\n resolve(device);\n return true;\n } else {\n return false;\n }\n });\n });\n }\n\n\n public getPortNameForPortId (portId: number) {\n for (const port of Object.keys(this._portMap)) {\n if (this._portMap[port] === portId) {\n return port;\n }\n }\n return;\n }\n\n\n public isPortVirtual (portId: number) {\n return (this._virtualPorts.indexOf(portId) > -1);\n }\n\n\n /**\n * Sleep a given amount of time.\n *\n * Note: This is a helper method to make it easier to add delays into a chain of commands.\n * @method Hub#sleep\n * @param {number} delay How long to sleep (in milliseconds).\n * @returns {Promise} Resolved after the delay is finished.\n */\n public sleep (delay: number) {\n return new Promise((resolve) => {\n global.setTimeout(resolve, delay);\n });\n }\n\n\n /**\n * Wait until a given list of concurrently running commands are complete.\n *\n * Note: This is a helper method to make it easier to wait for concurrent commands to complete.\n * @method Hub#wait\n * @param {Array<Promise<any>>} commands Array of executing commands.\n * @returns {Promise} Resolved after the commands are finished.\n */\n public wait (commands: Promise<any>[]) {\n return Promise.all(commands);\n }\n\n\n public send (message: Buffer, uuid: string) {\n return Promise.resolve();\n }\n\n\n public subscribe (portId: number, deviceType: number, mode: number) {\n // NK Do nothing here\n }\n\n\n public unsubscribe (portId: number, deviceType: number, mode: number) {\n // NK Do nothing here\n }\n\n\n public manuallyAttachDevice(deviceType: number, portId: number) {\n if (!this._attachedDevices[portId]) {\n debug(`No device attached to portId ${portId}, creating and attaching device type ${deviceType}`);\n const device = this._createDevice(deviceType, portId);\n this._attachDevice(device);\n return device;\n } else {\n if (this._attachedDevices[portId].type === deviceType) {\n debug(`Device of ${deviceType} already attached to portId ${portId}, returning existing device`);\n return this._attachedDevices[portId];\n } else {\n throw new Error(`Already a different type of device attached to portId ${portId}. Only use this method when you are certain what's attached.`);\n }\n }\n }\n\n\n protected _attachDevice (device: Device) {\n if (this._attachedDevices[device.portId] && this._attachedDevices[device.portId].type === device.type) {\n return;\n }\n this._attachedDevices[device.portId] = device;\n\n /**\n * Emits when a device is attached to the Hub.\n * @event Hub#attach\n * @param {Device} device\n */\n this.emit(\"attach\", device);\n debug(`Attached device type ${device.type} (${Consts.DeviceTypeNames[device.type]}) on port ${device.portName} (${device.portId})`);\n\n let i = this._attachCallbacks.length;\n while (i--) {\n const callback = this._attachCallbacks[i];\n if (callback(device)) {\n this._attachCallbacks.splice(i, 1);\n }\n }\n }\n\n\n protected _detachDevice (device: Device) {\n delete this._attachedDevices[device.portId];\n /**\n * Emits when a device is detached from the Hub.\n * @event Hub#detach\n * @param {Device} device\n */\n this.emit(\"detach\", device);\n debug(`Detached device type ${device.type} (${Consts.DeviceTypeNames[device.type]}) on port ${device.portName} (${device.portId})`);\n }\n\n\n protected _createDevice (deviceType: number, portId: number) {\n let constructor;\n\n // NK TODO: This needs to go in a better place\n const deviceConstructors: {[type: number]: typeof Device} = {\n [Consts.DeviceType.LIGHT]: Light,\n [Consts.DeviceType.TRAIN_MOTOR]: TrainMotor,\n [Consts.DeviceType.SIMPLE_MEDIUM_LINEAR_MOTOR]: SimpleMediumLinearMotor,\n [Consts.DeviceType.MOVE_HUB_MEDIUM_LINEAR_MOTOR]: MoveHubMediumLinearMotor,\n [Consts.DeviceType.MOTION_SENSOR]: MotionSensor,\n [Consts.DeviceType.TILT_SENSOR]: TiltSensor,\n [Consts.DeviceType.MOVE_HUB_TILT_SENSOR]: MoveHubTiltSensor,\n [Consts.DeviceType.PIEZO_BUZZER]: PiezoBuzzer,\n [Consts.DeviceType.TECHNIC_COLOR_SENSOR]: TechnicColorSensor,\n [Consts.DeviceType.TECHNIC_DISTANCE_SENSOR]: TechnicDistanceSensor,\n [Consts.DeviceType.TECHNIC_FORCE_SENSOR]: TechnicForceSensor,\n [Consts.DeviceType.TECHNIC_MEDIUM_HUB_TILT_SENSOR]: TechnicMediumHubTiltSensor,\n [Consts.DeviceType.TECHNIC_MEDIUM_HUB_GYRO_SENSOR]: TechnicMediumHubGyroSensor,\n [Consts.DeviceType.TECHNIC_MEDIUM_HUB_ACCELEROMETER]: TechnicMediumHubAccelerometerSensor,\n [Consts.DeviceType.MEDIUM_LINEAR_MOTOR]: MediumLinearMotor,\n [Consts.DeviceType.TECHNIC_SMALL_ANGULAR_MOTOR]: TechnicSmallAngularMotor,\n [Consts.DeviceType.TECHNIC_MEDIUM_ANGULAR_MOTOR]: TechnicMediumAngularMotor,\n [Consts.DeviceType.TECHNIC_LARGE_ANGULAR_MOTOR]: TechnicLargeAngularMotor,\n [Consts.DeviceType.TECHNIC_LARGE_LINEAR_MOTOR]: TechnicLargeLinearMotor,\n [Consts.DeviceType.TECHNIC_XLARGE_LINEAR_MOTOR]: TechnicXLargeLinearMotor,\n [Consts.DeviceType.COLOR_DISTANCE_SENSOR]: ColorDistanceSensor,\n [Consts.DeviceType.VOLTAGE_SENSOR]: VoltageSensor,\n [Consts.DeviceType.CURRENT_SENSOR]: CurrentSensor,\n [Consts.DeviceType.REMOTE_CONTROL_BUTTON]: RemoteControlButton,\n [Consts.DeviceType.HUB_LED]: HubLED,\n [Consts.DeviceType.DUPLO_TRAIN_BASE_COLOR_SENSOR]: DuploTrainBaseColorSensor,\n [Consts.DeviceType.DUPLO_TRAIN_BASE_MOTOR]: DuploTrainBaseMotor,\n [Consts.DeviceType.DUPLO_TRAIN_BASE_SPEAKER]: DuploTrainBaseSpeaker,\n [Consts.DeviceType.DUPLO_TRAIN_BASE_SPEEDOMETER]: DuploTrainBaseSpeedometer,\n [Consts.DeviceType.MARIO_ACCELEROMETER]: MarioAccelerometer,\n [Consts.DeviceType.MARIO_BARCODE_SENSOR]: MarioBarcodeSensor,\n [Consts.DeviceType.MARIO_PANTS_SENSOR]: MarioPantsSensor,\n [Consts.DeviceType.TECHNIC_MEDIUM_ANGULAR_MOTOR_GREY]: TechnicMediumAngularMotor,\n [Consts.DeviceType.TECHNIC_LARGE_ANGULAR_MOTOR_GREY]: TechnicLargeAngularMotor,\n [Consts.DeviceType.TECHNIC_3X3_COLOR_LIGHT_MATRIX]: Technic3x3ColorLightMatrix,\n };\n\n constructor = deviceConstructors[deviceType as Consts.DeviceType];\n\n if (constructor) {\n return new constructor(this, portId, undefined, deviceType);\n } else {\n return new Device(this, portId, undefined, deviceType);\n }\n\n }\n\n\n protected _getDeviceByPortId (portId: number) {\n return this._attachedDevices[portId];\n }\n\n\n}\n","import { Peripheral } from \"@abandonware/noble\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nimport { IBLEAbstraction } from \"../interfaces\";\nconst debug = Debug(\"duplotrainbase\");\n\n\n/**\n * The DuploTrainBase is emitted if the discovered device is a Duplo Train Base.\n * @class DuploTrainBase\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class DuploTrainBase extends LPF2Hub {\n\n\n public static IsDuploTrainBase (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.DUPLO_TRAIN_BASE_ID\n );\n }\n\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.DUPLO_TRAIN_BASE);\n debug(\"Discovered Duplo Train Base\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Duplo Train Base\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"MOTOR\": 0,\n \"COLOR\": 18,\n \"SPEEDOMETER\": 19\n};\n\n","import { Peripheral } from \"@abandonware/noble\";\nimport compareVersion from \"compare-versions\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"hub\");\n\n\n/**\n * The Hub is emitted if the discovered device is a Hub.\n * @class Hub\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class Hub extends LPF2Hub {\n\n\n public static IsHub (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.HUB_ID\n );\n }\n\n protected _currentPort = 0x3b;\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.HUB);\n debug(\"Discovered Powered UP Hub\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Powered UP Hub\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n protected _checkFirmware (version: string) {\n if (compareVersion(\"1.1.00.0004\", version) === 1) {\n throw new Error(`Your Powered Up Hub's (${this.name}) firmware is out of date and unsupported by this library. Please update it via the official Powered Up app.`);\n }\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"A\": 0,\n \"B\": 1,\n \"HUB_LED\": 50,\n \"CURRENT_SENSOR\": 59,\n \"VOLTAGE_SENSOR\": 60\n};\n","import { BaseHub } from \"./basehub\";\n\nimport * as Consts from \"../consts\";\n\nimport { decodeMACAddress, decodeVersion, toBin, toHex } from \"../utils\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"lpf2hub\");\nconst modeInfoDebug = Debug(\"lpf2hubmodeinfo\");\n\n\n/**\n * @class LPF2Hub\n * @extends BaseHub\n */\nexport class LPF2Hub extends BaseHub {\n\n private _messageBuffer: Buffer = Buffer.alloc(0);\n\n private _propertyRequestCallbacks: {[property: number]: ((data: Buffer) => void)} = {};\n\n\n public async connect () {\n debug(\"LPF2Hub connecting\");\n await super.connect();\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.LPF2_HUB);\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.LPF2_ALL, this._parseMessage.bind(this));\n await this._requestHubPropertyReports(Consts.HubPropertyPayload.BUTTON_STATE);\n await this._requestHubPropertyValue(Consts.HubPropertyPayload.FW_VERSION);\n await this._requestHubPropertyValue(Consts.HubPropertyPayload.HW_VERSION);\n await this._requestHubPropertyReports(Consts.HubPropertyPayload.RSSI);\n await this._requestHubPropertyReports(Consts.HubPropertyPayload.BATTERY_VOLTAGE);\n await this._requestHubPropertyValue(Consts.HubPropertyPayload.PRIMARY_MAC_ADDRESS);\n this.emit(\"connect\");\n debug(\"LPF2Hub connected\");\n }\n\n\n /**\n * Shutdown the Hub.\n * @method LPF2Hub#shutdown\n * @returns {Promise} Resolved upon successful disconnect.\n */\n public shutdown () {\n return this.send(Buffer.from([0x02, 0x01]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n /**\n * Set the name of the Hub.\n * @method LPF2Hub#setName\n * @param {string} name New name of the hub (14 characters or less, ASCII only).\n * @returns {Promise} Resolved upon successful issuance of command.\n */\n public async setName (name: string) {\n if (name.length > 14) {\n throw new Error(\"Name must be 14 characters or less\");\n }\n let data = Buffer.from([0x01, 0x01, 0x01]);\n data = Buffer.concat([data, Buffer.from(name, \"ascii\")]);\n // Send this twice, as sometimes the first time doesn't take\n await this.send(data, Consts.BLECharacteristic.LPF2_ALL);\n await this.send(data, Consts.BLECharacteristic.LPF2_ALL);\n this._name = name;\n }\n\n\n public send (message: Buffer, uuid: string) {\n message = Buffer.concat([Buffer.alloc(2), message]);\n message[0] = message.length;\n debug(\"Sent Message (LPF2_ALL)\", message);\n return this._bleDevice.writeToCharacteristic(uuid, message);\n }\n\n\n public subscribe (portId: number, deviceType: number, mode: number) {\n return this.send(Buffer.from([0x41, portId, mode, 0x01, 0x00, 0x00, 0x00, 0x01]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n public unsubscribe (portId: number, mode: number) {\n return this.send(Buffer.from([0x41, portId, mode, 0x01, 0x00, 0x00, 0x00, 0x00]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n /**\n * Combines two ports with into a single virtual port.\n *\n * Note: The devices attached to the ports must be of the same device type.\n * @method LPF2Hub#createVirtualPort\n * @param {string} firstPortName First port name\n * @param {string} secondPortName Second port name\n * @returns {Promise} Resolved upon successful issuance of command.\n */\n public createVirtualPort (firstPortName: string, secondPortName: string) {\n const firstDevice = this.getDeviceAtPort(firstPortName);\n if (!firstDevice) {\n throw new Error(`Port ${firstPortName} does not have an attached device`);\n }\n const secondDevice = this.getDeviceAtPort(secondPortName);\n if (!secondDevice) {\n throw new Error(`Port ${secondPortName} does not have an attached device`);\n }\n if (firstDevice.type !== secondDevice.type) {\n throw new Error(`Both devices must be of the same type to create a virtual port`);\n }\n return this.send(Buffer.from([0x61, 0x01, firstDevice.portId, secondDevice.portId]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n protected _checkFirmware (version: string) {\n return;\n }\n\n\n private _parseMessage (data?: Buffer) {\n\n if (data) {\n this._messageBuffer = Buffer.concat([this._messageBuffer, data]);\n }\n\n if (this._messageBuffer.length <= 0) {\n return;\n }\n\n const len = this._messageBuffer[0];\n if (len <= this._messageBuffer.length) {\n\n const message = this._messageBuffer.slice(0, len);\n this._messageBuffer = this._messageBuffer.slice(len);\n\n debug(\"Received Message (LPF2_ALL)\", message);\n\n switch (message[2]) {\n case Consts.MessageType.HUB_PROPERTIES: {\n const property = message[3];\n const callback = this._propertyRequestCallbacks[property];\n if (callback) {\n callback(message);\n } else {\n this._parseHubPropertyResponse(message);\n }\n delete this._propertyRequestCallbacks[property];\n break;\n }\n case Consts.MessageType.HUB_ATTACHED_IO: {\n this._parsePortMessage(message);\n break;\n }\n case Consts.MessageType.PORT_INFORMATION: {\n this._parsePortInformationResponse(message);\n break;\n }\n case Consts.MessageType.PORT_MODE_INFORMATION: {\n this._parseModeInformationResponse(message);\n break;\n }\n case Consts.MessageType.PORT_VALUE_SINGLE: {\n this._parseSensorMessage(message);\n break;\n }\n case Consts.MessageType.PORT_OUTPUT_COMMAND_FEEDBACK: {\n this._parsePortAction(message);\n break;\n }\n }\n\n if (this._messageBuffer.length > 0) {\n this._parseMessage();\n }\n\n }\n }\n\n\n private _requestHubPropertyValue (property: number) {\n return new Promise<void>((resolve) => {\n this._propertyRequestCallbacks[property] = (message) => {\n this._parseHubPropertyResponse(message);\n return resolve();\n };\n this.send(Buffer.from([0x01, property, 0x05]), Consts.BLECharacteristic.LPF2_ALL);\n });\n }\n\n\n private _requestHubPropertyReports (property: number) {\n return this.send(Buffer.from([0x01, property, 0x02]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n private _parseHubPropertyResponse (message: Buffer) {\n if (message[3] === Consts.HubPropertyPayload.BUTTON_STATE) {\n if (message[5] === 1) {\n /**\n * Emits when a button is pressed.\n * @event LPF2Hub#button\n * @param {string} button\n * @param {ButtonState} state\n */\n this.emit(\"button\", { event: Consts.ButtonState.PRESSED });\n return;\n } else if (message[5] === 0) {\n this.emit(\"button\", { event: Consts.ButtonState.RELEASED });\n return;\n }\n\n } else if (message[3] === Consts.HubPropertyPayload.FW_VERSION) {\n this._firmwareVersion = decodeVersion(message.readInt32LE(5));\n this._checkFirmware(this._firmwareVersion);\n\n } else if (message[3] === Consts.HubPropertyPayload.HW_VERSION) {\n this._hardwareVersion = decodeVersion(message.readInt32LE(5));\n\n } else if (message[3] === Consts.HubPropertyPayload.RSSI) {\n const rssi = message.readInt8(5);\n if (rssi !== 0) {\n this._rssi = rssi;\n this.emit(\"rssi\", { rssi: this._rssi });\n }\n\n } else if (message[3] === Consts.HubPropertyPayload.PRIMARY_MAC_ADDRESS) {\n this._primaryMACAddress = decodeMACAddress(message.slice(5));\n\n } else if (message[3] === Consts.HubPropertyPayload.BATTERY_VOLTAGE) {\n const batteryLevel = message[5];\n if (batteryLevel !== this._batteryLevel) {\n this._batteryLevel = batteryLevel;\n this.emit(\"batteryLevel\", { batteryLevel });\n }\n }\n\n }\n\n private async _parsePortMessage (message: Buffer) {\n\n const portId = message[3];\n const event = message[4];\n const deviceType = event ? message.readUInt16LE(5) : 0;\n\n if (event === Consts.Event.ATTACHED_IO) {\n\n if (modeInfoDebug.enabled) {\n const deviceTypeName = Consts.DeviceTypeNames[message[5]] || \"Unknown\";\n modeInfoDebug(`Port ${toHex(portId)}, type ${toHex(deviceType, 4)} (${deviceTypeName})`);\n const hwVersion = decodeVersion(message.readInt32LE(7));\n const swVersion = decodeVersion(message.readInt32LE(11));\n modeInfoDebug(`Port ${toHex(portId)}, hardware version ${hwVersion}, software version ${swVersion}`);\n await this._sendPortInformationRequest(portId);\n }\n\n const device = this._createDevice(deviceType, portId);\n this._attachDevice(device);\n\n } else if (event === Consts.Event.DETACHED_IO) {\n const device = this._getDeviceByPortId(portId);\n if (device) {\n this._detachDevice(device);\n if (this.isPortVirtual(portId)) {\n const portName = this.getPortNameForPortId(portId);\n if (portName) {\n delete this._portMap[portName];\n }\n this._virtualPorts = this._virtualPorts.filter((virtualPortId) => virtualPortId !== portId);\n }\n }\n\n } else if (event === Consts.Event.ATTACHED_VIRTUAL_IO) {\n const firstPortName = this.getPortNameForPortId(message[7]);\n const secondPortName = this.getPortNameForPortId(message[8]);\n // @ts-ignore NK These should never be undefined\n const virtualPortName = firstPortName + secondPortName;\n const virtualPortId = message[3];\n this._portMap[virtualPortName] = virtualPortId;\n this._virtualPorts.push(virtualPortId);\n const device = this._createDevice(deviceType, virtualPortId);\n this._attachDevice(device);\n }\n\n }\n\n\n private async _sendPortInformationRequest (port: number) {\n await this.send(Buffer.from([0x21, port, 0x01]), Consts.BLECharacteristic.LPF2_ALL);\n await this.send(Buffer.from([0x21, port, 0x02]), Consts.BLECharacteristic.LPF2_ALL); // Mode combinations\n }\n\n\n private async _parsePortInformationResponse (message: Buffer) {\n const port = message[3];\n if (message[4] === 2) {\n const modeCombinationMasks: number[] = [];\n for (let i = 5; i < message.length; i += 2) {\n modeCombinationMasks.push(message.readUInt16LE(i));\n }\n modeInfoDebug(`Port ${toHex(port)}, mode combinations [${modeCombinationMasks.map((c) => toBin(c, 0)).join(\", \")}]`);\n return;\n }\n const count = message[6];\n const input = toBin(message.readUInt16LE(7), count);\n const output = toBin(message.readUInt16LE(9), count);\n modeInfoDebug(`Port ${toHex(port)}, total modes ${count}, input modes ${input}, output modes ${output}`);\n\n for (let i = 0; i < count; i++) {\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.NAME);\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.RAW);\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.PCT);\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.SI);\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.SYMBOL);\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.VALUE_FORMAT);\n }\n }\n\n\n private _sendModeInformationRequest (port: number, mode: number, type: number) {\n return this.send(Buffer.from([0x22, port, mode, type]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n private _parseModeInformationResponse (message: Buffer) {\n const port = toHex(message[3]);\n const mode = message[4];\n const type = message[5];\n switch (type) {\n case Consts.ModeInformationType.NAME:\n modeInfoDebug(`Port ${port}, mode ${mode}, name ${message.slice(6, message.length).toString()}`);\n break;\n case Consts.ModeInformationType.RAW:\n modeInfoDebug(`Port ${port}, mode ${mode}, RAW min ${message.readFloatLE(6)}, max ${message.readFloatLE(10)}`);\n break;\n case Consts.ModeInformationType.PCT:\n modeInfoDebug(`Port ${port}, mode ${mode}, PCT min ${message.readFloatLE(6)}, max ${message.readFloatLE(10)}`);\n break;\n case Consts.ModeInformationType.SI:\n modeInfoDebug(`Port ${port}, mode ${mode}, SI min ${message.readFloatLE(6)}, max ${message.readFloatLE(10)}`);\n break;\n case Consts.ModeInformationType.SYMBOL:\n modeInfoDebug(`Port ${port}, mode ${mode}, SI symbol ${message.slice(6, message.length).toString()}`);\n break;\n case Consts.ModeInformationType.VALUE_FORMAT:\n const numValues = message[6];\n const dataType = [\"8bit\", \"16bit\", \"32bit\", \"float\"][message[7]];\n const totalFigures = message[8];\n const decimals = message[9];\n modeInfoDebug(`Port ${port}, mode ${mode}, Value ${numValues} x ${dataType}, Decimal format ${totalFigures}.${decimals}`);\n }\n }\n\n\n private _parsePortAction (message: Buffer) {\n for (let offset = 3; offset < message.length; offset += 2) {\n const device = this._getDeviceByPortId(message[offset]);\n\n if (device) {\n device.finish(message[offset+1]);\n }\n }\n }\n\n\n private _parseSensorMessage (message: Buffer) {\n\n const portId = message[3];\n const device = this._getDeviceByPortId(portId);\n\n if (device) {\n device.receive(message);\n }\n\n }\n\n\n}\n","import { Peripheral } from \"@abandonware/noble\";\nimport compareVersion from \"compare-versions\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"movehub\");\n\n\n/**\n * Mario is emitted if the discovered device is a LEGO Super Mario brick.\n * @class Mario\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class Mario extends LPF2Hub {\n\n\n public static IsMario (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.MARIO_ID\n );\n }\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.MARIO);\n debug(\"Discovered Mario\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Mario\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n};\n","import { Peripheral } from \"@abandonware/noble\";\nimport compareVersion from \"compare-versions\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"movehub\");\n\n\n/**\n * The MoveHub is emitted if the discovered device is a Move Hub.\n * @class MoveHub\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class MoveHub extends LPF2Hub {\n\n\n public static IsMoveHub (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.MOVE_HUB_ID\n );\n }\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.MOVE_HUB);\n debug(\"Discovered Move Hub\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Move Hub\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n protected _checkFirmware (version: string) {\n if (compareVersion(\"2.0.00.0017\", version) === 1) {\n throw new Error(`Your Move Hub's (${this.name}) firmware is out of date and unsupported by this library. Please update it via the official Powered Up app.`);\n }\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"A\": 0,\n \"B\": 1,\n \"C\": 2,\n \"D\": 3,\n \"HUB_LED\": 50,\n \"TILT_SENSOR\": 58,\n \"CURRENT_SENSOR\": 59,\n \"VOLTAGE_SENSOR\": 60\n};\n","import { Peripheral } from \"@abandonware/noble\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"remotecontrol\");\n\n\n/**\n * The RemoteControl is emitted if the discovered device is a Remote Control.\n * @class RemoteControl\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class RemoteControl extends LPF2Hub {\n\n\n public static IsRemoteControl (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.REMOTE_CONTROL_ID\n );\n }\n\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.REMOTE_CONTROL);\n debug(\"Discovered Powered UP Remote\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Powered UP Remote\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"LEFT\": 0,\n \"RIGHT\": 1,\n \"HUB_LED\": 52,\n \"VOLTAGE_SENSOR\": 59,\n \"REMOTE_CONTROL_RSSI\": 60\n};\n","import { Peripheral } from \"@abandonware/noble\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"technicmediumhub\");\n\n\n/**\n * The TechnicMediumHub is emitted if the discovered device is a Technic Medium Hub.\n * @class TechnicMediumHub\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class TechnicMediumHub extends LPF2Hub {\n\n\n public static IsTechnicMediumHub (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.TECHNIC_MEDIUM_HUB_ID\n );\n }\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.TECHNIC_MEDIUM_HUB);\n debug(\"Discovered Control+ Hub\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Control+ Hub\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"A\": 0,\n \"B\": 1,\n \"C\": 2,\n \"D\": 3,\n \"HUB_LED\": 50,\n \"CURRENT_SENSOR\": 59,\n \"VOLTAGE_SENSOR\": 60,\n \"ACCELEROMETER\": 97,\n \"GYRO_SENSOR\": 98,\n \"TILT_SENSOR\": 99\n};\n","import { Peripheral } from \"@abandonware/noble\";\nimport compareVersion from \"compare-versions\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"hub\");\n\n\n/**\n * The TechnicSmallHub is emitted if the discovered device is a Technic Small Hub.\n * @class Hub\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class TechnicSmallHub extends LPF2Hub {\n\n\n public static IsTechnicSmallHub (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.TECHNIC_SMALL_HUB_ID\n );\n }\n\n protected _currentPort = 0x3b;\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.TECHNIC_SMALL_HUB);\n debug(\"Discovered Spike Essential Hub\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Spike Essential Hub\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"A\": 0,\n \"B\": 1,\n \"HUB_LED\": 49,\n \"CURRENT_SENSOR\": 59,\n \"VOLTAGE_SENSOR\": 60,\n \"ACCELEROMETER\": 97,\n \"GYRO_SENSOR\": 98,\n \"TILT_SENSOR\": 99\n};\n","import { Peripheral } from \"@abandonware/noble\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { BaseHub } from \"./basehub\";\n\nimport * as Consts from \"../consts\";\n\nimport { isWebBluetooth } from \"../utils\";\n\nimport Debug = require(\"debug\");\nimport { HubLED } from \"../devices/hubled\";\nconst debug = Debug(\"wedo2smarthub\");\n\n\n/**\n * The WeDo2SmartHub is emitted if the discovered device is a WeDo 2.0 Smart Hub.\n * @class WeDo2SmartHub\n * @extends BaseHub\n */\nexport class WeDo2SmartHub extends BaseHub {\n\n\n public static IsWeDo2SmartHub (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.WEDO2_SMART_HUB.replace(/-/g, \"\")) >= 0\n );\n }\n\n\n private _lastTiltX: number = 0;\n private _lastTiltY: number = 0;\n\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.WEDO2_SMART_HUB);\n debug(\"Discovered WeDo 2.0 Smart Hub\");\n }\n\n\n public connect () {\n return new Promise<void>(async (resolve) => {\n debug(\"Connecting to WeDo 2.0 Smart Hub\");\n await super.connect();\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB);\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB_2);\n if (!isWebBluetooth) {\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB_3);\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB_4);\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB_5);\n } else {\n await this._bleDevice.discoverCharacteristicsForService(\"battery_service\");\n await this._bleDevice.discoverCharacteristicsForService(\"device_information\");\n }\n debug(\"Connect completed\");\n this.emit(\"connect\");\n resolve();\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.WEDO2_PORT_TYPE, this._parsePortMessage.bind(this));\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.WEDO2_SENSOR_VALUE, this._parseSensorMessage.bind(this));\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.WEDO2_BUTTON, this._parseSensorMessage.bind(this));\n if (!isWebBluetooth) {\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.WEDO2_BATTERY, this._parseBatteryMessage.bind(this));\n this._bleDevice.readFromCharacteristic(Consts.BLECharacteristic.WEDO2_BATTERY, (err, data) => {\n if (data) {\n this._parseBatteryMessage(data);\n }\n });\n } else {\n this._bleDevice.readFromCharacteristic(\"00002a19-0000-1000-8000-00805f9b34fb\", (err, data) => {\n if (data) {\n this._parseBatteryMessage(data);\n }\n });\n this._bleDevice.subscribeToCharacteristic(\"00002a19-0000-1000-8000-00805f9b34fb\", this._parseHighCurrentAlert.bind(this));\n }\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.WEDO2_HIGH_CURRENT_ALERT, this._parseHighCurrentAlert.bind(this));\n if (!isWebBluetooth) {\n this._bleDevice.readFromCharacteristic(Consts.BLECharacteristic.WEDO2_FIRMWARE_REVISION, (err, data) => {\n if (data) {\n this._parseFirmwareRevisionString(data);\n }\n });\n } else {\n this._bleDevice.readFromCharacteristic(\"00002a26-0000-1000-8000-00805f9b34fb\", (err, data) => {\n if (data) {\n this._parseFirmwareRevisionString(data);\n }\n });\n }\n });\n }\n\n\n /**\n * Shutdown the Hub.\n * @method WeDo2SmartHub#shutdown\n * @returns {Promise} Resolved upon successful disconnect.\n */\n public shutdown () {\n return this.send(Buffer.from([0x00]), Consts.BLECharacteristic.WEDO2_DISCONNECT);\n }\n\n\n /**\n * Set the name of the Hub.\n * @method WeDo2SmartHub#setName\n * @param {string} name New name of the hub (14 characters or less, ASCII only).\n * @returns {Promise} Resolved upon successful issuance of command.\n */\n public setName (name: string) {\n if (name.length > 14) {\n throw new Error(\"Name must be 14 characters or less\");\n }\n return new Promise<void>((resolve) => {\n const data = Buffer.from(name, \"ascii\");\n // Send this twice, as sometimes the first time doesn't take\n this.send(data, Consts.BLECharacteristic.WEDO2_NAME_ID);\n this.send(data, Consts.BLECharacteristic.WEDO2_NAME_ID);\n this._name = name;\n return resolve();\n });\n }\n\n\n public send (message: Buffer, uuid: string) {\n if (debug.enabled) {\n debug(`Sent Message (${this._getCharacteristicNameFromUUID(uuid)})`, message);\n }\n return this._bleDevice.writeToCharacteristic(uuid, message);\n }\n\n\n public subscribe (portId: number, deviceType: number, mode: number) {\n this.send(Buffer.from([0x01, 0x02, portId, deviceType, mode, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01]), Consts.BLECharacteristic.WEDO2_PORT_TYPE_WRITE);\n }\n\n\n public unsubscribe (portId: number, deviceType: number, mode: number) {\n this.send(Buffer.from([0x01, 0x02, portId, deviceType, mode, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00]), Consts.BLECharacteristic.WEDO2_PORT_TYPE_WRITE);\n }\n\n\n private _getCharacteristicNameFromUUID (uuid: string) {\n const keys = Object.keys(Consts.BLECharacteristic);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (Consts.BLECharacteristic[key as keyof typeof Consts.BLECharacteristic] === uuid) {\n return key;\n }\n }\n return \"UNKNOWN\";\n }\n\n\n private _parseHighCurrentAlert (data: Buffer) {\n debug(\"Received Message (WEDO2_HIGH_CURRENT_ALERT)\", data);\n }\n\n\n private _parseBatteryMessage (data: Buffer) {\n debug(\"Received Message (WEDO2_BATTERY)\", data);\n const batteryLevel = data[0];\n if (batteryLevel !== this._batteryLevel) {\n this._batteryLevel = batteryLevel;\n this.emit(\"batteryLevel\", { batteryLevel });\n }\n }\n\n\n private _parseFirmwareRevisionString (data: Buffer) {\n debug(\"Received Message (WEDO2_FIRMWARE_REVISION)\", data);\n this._firmwareVersion = data.toString();\n }\n\n\n private _parsePortMessage (data: Buffer) {\n debug(\"Received Message (WEDO2_PORT_TYPE)\", data);\n\n const portId = data[0];\n const event = data[1];\n const deviceType = event ? data[3] : 0;\n\n if (event === 0x01) {\n const device = this._createDevice(deviceType, portId);\n this._attachDevice(device);\n } else if (event === 0x00) {\n const device = this._getDeviceByPortId(portId);\n if (device) {\n this._detachDevice(device);\n }\n }\n }\n\n\n private _parseSensorMessage (message: Buffer) {\n\n debug(\"Received Message (WEDO2_SENSOR_VALUE)\", message);\n\n if (message[0] === 0x01) {\n /**\n * Emits when a button is pressed.\n * @event WeDo2SmartHub#button\n * @param {string} button\n * @param {ButtonState} state\n */\n this.emit(\"button\", { event: Consts.ButtonState.PRESSED });\n return;\n } else if (message[0] === 0x00) {\n this.emit(\"button\", { event: Consts.ButtonState.RELEASED });\n return;\n }\n\n const portId = message[1];\n const device = this._getDeviceByPortId(portId);\n\n if (device) {\n device.receive(message);\n }\n\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"A\": 1,\n \"B\": 2,\n \"CURRENT_SENSOR\": 3,\n \"VOLTAGE_SENSOR\": 4,\n \"PIEZO_BUZZER\": 5,\n \"HUB_LED\": 6\n};\n","import * as Consts from \"./consts\";\n\nimport { PoweredUP } from \"./poweredup-browser\";\nimport { Color } from \"./color\";\n\nimport { BaseHub } from \"./hubs/basehub\";\nimport { DuploTrainBase } from \"./hubs/duplotrainbase\";\nimport { Hub } from \"./hubs/hub\";\nimport { Mario } from \"./hubs/mario\";\nimport { MoveHub } from \"./hubs/movehub\";\nimport { RemoteControl } from \"./hubs/remotecontrol\";\nimport { TechnicMediumHub } from \"./hubs/technicmediumhub\";\nimport { WeDo2SmartHub } from \"./hubs/wedo2smarthub\";\n\nimport { ColorDistanceSensor } from \"./devices/colordistancesensor\";\nimport { CurrentSensor } from \"./devices/currentsensor\";\nimport { Device } from \"./devices/device\";\nimport { DuploTrainBaseColorSensor } from \"./devices/duplotrainbasecolorsensor\";\nimport { DuploTrainBaseMotor } from \"./devices/duplotrainbasemotor\";\nimport { DuploTrainBaseSpeaker } from \"./devices/duplotrainbasespeaker\";\nimport { DuploTrainBaseSpeedometer } from \"./devices/duplotrainbasespeedometer\";\nimport { HubLED } from \"./devices/hubled\";\nimport { Light } from \"./devices/light\";\nimport { MediumLinearMotor } from \"./devices/mediumlinearmotor\";\nimport { MotionSensor } from \"./devices/motionsensor\";\nimport { MoveHubMediumLinearMotor } from \"./devices/movehubmediumlinearmotor\";\nimport { MoveHubTiltSensor } from \"./devices/movehubtiltsensor\";\nimport { PiezoBuzzer } from \"./devices/piezobuzzer\";\nimport { RemoteControlButton } from \"./devices/remotecontrolbutton\";\nimport { SimpleMediumLinearMotor } from \"./devices/simplemediumlinearmotor\";\nimport { TechnicColorSensor } from \"./devices/techniccolorsensor\";\nimport { TechnicDistanceSensor } from \"./devices/technicdistancesensor\";\nimport { TechnicForceSensor } from \"./devices/technicforcesensor\";\nimport { TechnicLargeAngularMotor } from \"./devices/techniclargeangularmotor\";\nimport { TechnicLargeLinearMotor } from \"./devices/techniclargelinearmotor\";\nimport { TechnicSmallAngularMotor } from \"./devices/technicsmallangularmotor\";\nimport { TechnicMediumAngularMotor } from \"./devices/technicmediumangularmotor\";\nimport { TechnicMediumHubAccelerometerSensor } from \"./devices/technicmediumhubaccelerometersensor\";\nimport { TechnicMediumHubGyroSensor } from \"./devices/technicmediumhubgyrosensor\";\nimport { TechnicMediumHubTiltSensor } from \"./devices/technicmediumhubtiltsensor\";\nimport { TechnicXLargeLinearMotor } from \"./devices/technicxlargelinearmotor\";\nimport { Technic3x3ColorLightMatrix } from \"./devices/technic3x3colorlightmatrix\";\nimport { TiltSensor } from \"./devices/tiltsensor\";\nimport { TrainMotor } from \"./devices/trainmotor\";\nimport { VoltageSensor } from \"./devices/voltagesensor\";\nimport { TachoMotor } from \"./devices/tachomotor\";\nimport { AbsoluteMotor } from \"./devices/absolutemotor\";\nimport { BasicMotor } from \"./devices/basicmotor\";\n\nimport { isWebBluetooth } from \"./utils\";\n\n// @ts-ignore\nwindow.PoweredUP = {\n PoweredUP,\n BaseHub,\n WeDo2SmartHub,\n TechnicMediumHub,\n Hub,\n RemoteControl,\n DuploTrainBase,\n Consts,\n Color,\n ColorDistanceSensor,\n Device,\n DuploTrainBaseColorSensor,\n DuploTrainBaseMotor,\n DuploTrainBaseSpeaker,\n DuploTrainBaseSpeedometer,\n HubLED,\n Light,\n Mario,\n MediumLinearMotor,\n MotionSensor,\n MoveHub,\n MoveHubMediumLinearMotor,\n MoveHubTiltSensor,\n PiezoBuzzer,\n RemoteControlButton,\n SimpleMediumLinearMotor,\n TechnicColorSensor,\n TechnicDistanceSensor,\n TechnicForceSensor,\n TechnicMediumHubAccelerometerSensor,\n TechnicMediumHubGyroSensor,\n TechnicMediumHubTiltSensor,\n TechnicSmallAngularMotor,\n TechnicMediumAngularMotor,\n TechnicLargeAngularMotor,\n TechnicLargeLinearMotor,\n TechnicXLargeLinearMotor,\n Technic3x3ColorLightMatrix,\n TiltSensor,\n TrainMotor,\n VoltageSensor,\n CurrentSensor,\n TachoMotor,\n AbsoluteMotor,\n BasicMotor,\n isWebBluetooth\n};\n\n","import { WebBLEDevice } from \"./webbleabstraction\";\n\nimport { BaseHub } from \"./hubs/basehub\";\nimport { DuploTrainBase } from \"./hubs/duplotrainbase\";\nimport { Hub } from \"./hubs/hub\";\nimport { Mario } from \"./hubs/mario\";\nimport { MoveHub } from \"./hubs/movehub\";\nimport { RemoteControl } from \"./hubs/remotecontrol\";\nimport { TechnicMediumHub } from \"./hubs/technicmediumhub\";\nimport { WeDo2SmartHub } from \"./hubs/wedo2smarthub\";\n\nimport * as Consts from \"./consts\";\n\nimport { EventEmitter } from \"events\";\n\nimport Debug = require(\"debug\");\nimport { IBLEAbstraction } from \"./interfaces\";\nimport { TechnicSmallHub } from \"./hubs/technicsmallhub\";\nconst debug = Debug(\"poweredup\");\n\n\n/**\n * @class PoweredUP\n * @extends EventEmitter\n */\nexport class PoweredUP extends EventEmitter {\n\n\n private _connectedHubs: {[uuid: string]: BaseHub} = {};\n\n\n constructor () {\n super();\n this._discoveryEventHandler = this._discoveryEventHandler.bind(this);\n }\n\n\n /**\n * Begin scanning for Powered UP Hub devices.\n * @method PoweredUP#scan\n */\n public async scan () {\n\n try {\n\n const device = await navigator.bluetooth.requestDevice({\n filters: [\n {\n services: [\n Consts.BLEService.WEDO2_SMART_HUB\n ]\n },\n {\n services: [\n Consts.BLEService.LPF2_HUB\n ]\n }\n ],\n optionalServices: [\n Consts.BLEService.WEDO2_SMART_HUB_2,\n \"battery_service\",\n \"device_information\"\n ]\n });\n\n // @ts-ignore\n const server = await device.gatt.connect();\n this._discoveryEventHandler.call(this, server);\n return true;\n\n } catch (err) {\n return false;\n }\n\n }\n\n\n /**\n * Retrieve a list of Powered UP Hubs.\n * @method PoweredUP#getHubs\n * @returns {BaseHub[]}\n */\n public getHubs () {\n return Object.values(this._connectedHubs);\n }\n\n\n /**\n * Retrieve a Powered UP Hub by UUID.\n * @method PoweredUP#getHubByUUID\n * @param {string} uuid\n * @returns {BaseHub | null}\n */\n public getHubByUUID (uuid: string) {\n return this._connectedHubs[uuid];\n }\n\n\n /**\n * Retrieve a Powered UP Hub by primary MAC address.\n * @method PoweredUP#getHubByPrimaryMACAddress\n * @param {string} address\n * @returns {BaseHub}\n */\n public getHubByPrimaryMACAddress (address: string) {\n return Object.values(this._connectedHubs).filter((hub) => hub.primaryMACAddress === address)[0];\n }\n\n\n /**\n * Retrieve a list of Powered UP Hub by name.\n * @method PoweredUP#getHubsByName\n * @param {string} name\n * @returns {BaseHub[]}\n */\n public getHubsByName (name: string) {\n return Object.values(this._connectedHubs).filter((hub) => hub.name === name);\n }\n\n\n /**\n * Retrieve a list of Powered UP Hub by type.\n * @method PoweredUP#getHubsByType\n * @param {string} name\n * @returns {BaseHub[]}\n */\n public getHubsByType (hubType: number) {\n return Object.values(this._connectedHubs).filter((hub) => hub.type === hubType);\n }\n\n\n private _determineLPF2HubType (device: IBLEAbstraction): Promise<Consts.HubType> {\n return new Promise((resolve) => {\n let buf: Buffer = Buffer.alloc(0);\n device.subscribeToCharacteristic(Consts.BLECharacteristic.LPF2_ALL, (data: Buffer) => {\n buf = Buffer.concat([buf, data]);\n while (buf[0] <= buf.length) {\n const len = buf[0];\n const message = buf.slice(0, len);\n buf = buf.slice(len);\n if (message[2] === 0x01 && message[3] === 0x0b) {\n switch (message[5]) {\n case Consts.BLEManufacturerData.REMOTE_CONTROL_ID:\n resolve(Consts.HubType.REMOTE_CONTROL);\n break;\n case Consts.BLEManufacturerData.MOVE_HUB_ID:\n resolve(Consts.HubType.MOVE_HUB);\n break;\n case Consts.BLEManufacturerData.HUB_ID:\n resolve(Consts.HubType.HUB);\n break;\n case Consts.BLEManufacturerData.DUPLO_TRAIN_BASE_ID:\n resolve(Consts.HubType.DUPLO_TRAIN_BASE);\n break;\n case Consts.BLEManufacturerData.TECHNIC_SMALL_HUB_ID:\n resolve(Consts.HubType.TECHNIC_SMALL_HUB);\n break;\n case Consts.BLEManufacturerData.TECHNIC_MEDIUM_HUB_ID:\n resolve(Consts.HubType.TECHNIC_MEDIUM_HUB);\n break;\n }\n debug(\"Hub type determined\");\n } else {\n debug(\"Stashed in mailbox (LPF2_ALL)\", message);\n device.addToCharacteristicMailbox(Consts.BLECharacteristic.LPF2_ALL, message);\n }\n }\n });\n device.writeToCharacteristic(Consts.BLECharacteristic.LPF2_ALL, Buffer.from([0x05, 0x00, 0x01, 0x0b, 0x05]));\n });\n }\n\n\n private async _discoveryEventHandler (server: BluetoothRemoteGATTServer) {\n\n const device = new WebBLEDevice(server);\n\n let hub: BaseHub;\n\n let hubType = Consts.HubType.UNKNOWN;\n let isLPF2Hub = false;\n try {\n await device.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB);\n hubType = Consts.HubType.WEDO2_SMART_HUB;\n // tslint:disable-next-line\n } catch (error) {}\n try {\n if (hubType !== Consts.HubType.WEDO2_SMART_HUB) {\n await device.discoverCharacteristicsForService(Consts.BLEService.LPF2_HUB);\n isLPF2Hub = true;\n }\n // tslint:disable-next-line\n } catch (error) {}\n\n if (isLPF2Hub) {\n hubType = await this._determineLPF2HubType(device);\n }\n\n switch (hubType) {\n case Consts.HubType.WEDO2_SMART_HUB:\n hub = new WeDo2SmartHub(device);\n break;\n case Consts.HubType.MOVE_HUB:\n hub = new MoveHub(device);\n break;\n case Consts.HubType.HUB:\n hub = new Hub(device);\n break;\n case Consts.HubType.REMOTE_CONTROL:\n hub = new RemoteControl(device);\n break;\n case Consts.HubType.DUPLO_TRAIN_BASE:\n hub = new DuploTrainBase(device);\n break;\n case Consts.HubType.TECHNIC_SMALL_HUB:\n hub = new TechnicSmallHub(device);\n break;\n case Consts.HubType.TECHNIC_MEDIUM_HUB:\n hub = new TechnicMediumHub(device);\n break;\n case Consts.HubType.MARIO:\n hub = new Mario(device);\n break;\n default:\n return;\n }\n\n device.on(\"discoverComplete\", () => {\n\n hub.on(\"connect\", () => {\n debug(`Hub ${hub.uuid} connected`);\n this._connectedHubs[hub.uuid] = hub;\n });\n\n hub.on(\"disconnect\", () => {\n debug(`Hub ${hub.uuid} disconnected`);\n delete this._connectedHubs[hub.uuid];\n });\n\n debug(`Hub ${hub.uuid} discovered`);\n\n /**\n * Emits when a Powered UP Hub device is found.\n * @event PoweredUP#discover\n * @param {WeDo2SmartHub | MoveHub | TechnicMediumHub | RemoteControl | DuploTrainBase} hub\n */\n this.emit(\"discover\", hub);\n\n });\n\n }\n\n}\n","import { EventEmitter } from \"events\";\nimport { Device } from \"./devices/device\";\n\n// @ts-ignore\nexport const isWebBluetooth = !!(typeof navigator !== \"undefined\" && navigator && navigator.bluetooth);\n\nexport const toHex = (value: number, length: number = 2) => {\n return value.toString(16).padStart(length, \"0\");\n};\n\nexport const toBin = (value: number, length: number = 8) => {\n return value.toString(2).padStart(length, \"0\");\n};\n\nexport const mapSpeed = (speed: number) => {\n if (speed === 127) {\n return 127;\n }\n if (speed > 100) {\n speed = 100;\n } else if (speed < -100) {\n speed = -100;\n }\n return speed;\n};\n\nexport const decodeVersion = (version: number) => {\n const parts = version.toString(16).padStart(8, \"0\");\n return [parts[0], parts[1], parts.substring(2, 4), parts.substring(4)].join(\".\");\n};\n\nexport const decodeMACAddress = (address: Uint8Array) => {\n return Array.from(address).map((part) => toHex(part, 2)).join(\":\");\n};\n\nexport const normalizeAngle = (angle: number) => {\n if (angle >= 180) {\n return angle - (360 * ((angle + 180) / 360));\n } else if (angle < -180) {\n return angle + (360 * ((180 - angle) / 360));\n }\n return angle;\n};\n\nexport const roundAngleToNearest90 = (angle: number) => {\n angle = normalizeAngle(angle);\n if (angle < -135) {\n return -180;\n }\n if (angle < -45) {\n return -90;\n }\n if (angle < 45) {\n return 0;\n }\n if (angle < 135) {\n return 90;\n }\n return -180;\n};\n\nexport const calculateRamp = (device: Device, fromPower: number, toPower: number, time: number) => {\n const emitter = new EventEmitter();\n const steps = Math.abs(toPower - fromPower);\n let delay = time / steps;\n let increment = 1;\n if (delay < 50 && steps > 0) {\n increment = 50 / delay;\n delay = 50;\n }\n if (fromPower > toPower) {\n increment = -increment;\n }\n let i = 0;\n const interval = setInterval(() => {\n let power = Math.round(fromPower + (++i * increment));\n if (toPower > fromPower && power > toPower) {\n power = toPower;\n } else if (fromPower > toPower && power < toPower) {\n power = toPower;\n }\n emitter.emit(\"changePower\", power);\n if (power === toPower) {\n clearInterval(interval);\n emitter.emit(\"finished\");\n }\n }, delay);\n device.setEventTimer(interval);\n return emitter;\n};\n\nexport const parseColor = (color: number) => {\n if (color === 1 || color === 5) {\n color = color + 1;\n }\n return color;\n}","import Debug = require(\"debug\");\nimport { EventEmitter } from \"events\";\nimport { IBLEAbstraction } from \"./interfaces\";\nconst debug = Debug(\"bledevice\");\n\n\nexport class WebBLEDevice extends EventEmitter implements IBLEAbstraction {\n\n private _webBLEServer: any;\n\n private _uuid: string;\n private _name: string = \"\";\n\n private _listeners: {[uuid: string]: any} = {};\n private _characteristics: {[uuid: string]: any} = {};\n\n private _queue: Promise<void> = Promise.resolve();\n private _mailbox: Buffer[] = [];\n\n private _connected: boolean = false;\n private _connecting: boolean = false;\n\n\n constructor (device: any) {\n super();\n this._webBLEServer = device;\n this._uuid = device.device.id;\n this._name = device.device.name;\n device.device.addEventListener(\"gattserverdisconnected\", () => {\n this._connecting = false;\n this._connected = false;\n this.emit(\"disconnect\");\n });\n setTimeout(() => {\n this.emit(\"discoverComplete\");\n }, 2000);\n }\n\n\n public get uuid () {\n return this._uuid;\n }\n\n\n public get name () {\n return this._name;\n }\n\n\n public get connecting () {\n return this._connecting;\n }\n\n\n public get connected () {\n return this._connected;\n }\n\n\n public connect () {\n return new Promise<void>((resolve) => {\n this._connected = true;\n return resolve();\n });\n }\n\n\n public disconnect () {\n return new Promise<void>((resolve) => {\n this._webBLEServer.device.gatt.disconnect();\n this._connected = false;\n return resolve();\n });\n }\n\n\n public async discoverCharacteristicsForService (uuid: string) {\n debug(\"Service/characteristic discovery started\");\n const service = await this._webBLEServer.getPrimaryService(uuid);\n const characteristics = await service.getCharacteristics();\n for (const characteristic of characteristics) {\n this._characteristics[characteristic.uuid] = characteristic;\n }\n debug(\"Service/characteristic discovery finished\");\n }\n\n\n public subscribeToCharacteristic (uuid: string, callback: (data: Buffer) => void) {\n if (this._listeners[uuid]) {\n this._characteristics[uuid].removeEventListener(\"characteristicvaluechanged\", this._listeners[uuid]);\n }\n // @ts-ignore\n this._listeners[uuid] = (event) => {\n const buf = Buffer.alloc(event.target.value.buffer.byteLength);\n const view = new Uint8Array(event.target.value.buffer);\n for (let i = 0; i < buf.length; i++) {\n buf[i] = view[i];\n }\n debug(\"Incoming data\", buf);\n return callback(buf);\n };\n this._characteristics[uuid].addEventListener(\"characteristicvaluechanged\", this._listeners[uuid]);\n\n const mailbox = Array.from(this._mailbox);\n this._mailbox = [];\n for (const data of mailbox) {\n debug(\"Replayed from mailbox (LPF2_ALL)\", data);\n callback(data);\n }\n\n this._characteristics[uuid].startNotifications();\n }\n\n\n public addToCharacteristicMailbox (uuid: string, data: Buffer) {\n this._mailbox.push(data);\n }\n\n\n public readFromCharacteristic (uuid: string, callback: (err: string | null, data: Buffer | null) => void) {\n // @ts-ignore\n this._characteristics[uuid].readValue().then((data) => {\n const buf = Buffer.alloc(data.buffer.byteLength);\n const view = new Uint8Array(data.buffer);\n for (let i = 0; i < buf.length; i++) {\n buf[i] = view[i];\n }\n callback(null, buf);\n });\n }\n\n\n public writeToCharacteristic (uuid: string, data: Buffer) {\n return this._queue = this._queue.then(() => this._characteristics[uuid].writeValueWithoutResponse(data));\n }\n\n\n private _sanitizeUUID (uuid: string) {\n return uuid.replace(/-/g, \"\");\n }\n\n\n}\n","export default function compareVersions(v1, v2) {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0) return r;\n\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n } else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n\n return 0;\n}\n\nexport const validate = (v) =>\n typeof v === 'string' && /^[v\\d]/.test(v) && semver.test(v);\n\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n\n return operatorResMap[operator].includes(res);\n};\n\nexport const satisfies = (v, r) => {\n // if no range operator then \"=\"\n const m = r.match(/^([<>=~^]+)/);\n const op = m ? m[1] : '=';\n\n // if gt/lt/eq then operator compare\n if (op !== '^' && op !== '~') return compare(v, r, op);\n\n // else range of either \"~\" or \"^\" is assumed\n const [v1, v2, v3] = validateAndParse(v);\n const [r1, r2, r3] = validateAndParse(r);\n if (compareStrings(v1, r1) !== 0) return false;\n if (op === '^') {\n return compareSegments([v2, v3], [r2, r3]) >= 0;\n }\n if (compareStrings(v2, r2) !== 0) return false;\n return compareStrings(v3, r3) >= 0;\n};\n\n// export CJS style for parity\ncompareVersions.validate = validate;\ncompareVersions.compare = compare;\ncompareVersions.sastisfies = satisfies;\n\nconst semver =\n /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\n\nconst validateAndParse = (v) => {\n if (typeof v !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = v.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${v}' received)`);\n }\n match.shift();\n return match;\n};\n\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\n\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\n\nconst forceType = (a, b) =>\n typeof a !== typeof b ? [String(a), String(b)] : [a, b];\n\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b)) return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp) return 1;\n if (ap < bp) return -1;\n return 0;\n};\n\nconst compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || 0, b[i] || 0);\n if (r !== 0) return r;\n }\n return 0;\n};\n\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n};\n\nconst allowedOperators = Object.keys(operatorResMap);\n\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(\n `Invalid operator type, expected string but got ${typeof op}`\n );\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(\n `Invalid operator, expected one of ${allowedOperators.join('|')}`\n );\n }\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(389);\n"],"names":["exports","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","i","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","push","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","start","end","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","SlowBuffer","alloc","INSPECT_MAX_BYTES","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","prototype","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","b","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","fromObject","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","this","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","c","hi","lo","utf16leToBytes","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","kMaxLength","TYPED_ARRAY_SUPPORT","proto","foo","e","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","fill","allocUnsafeSlow","_isBuffer","compare","a","x","y","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","constructor","alphabet","table","i16","fn","BufferBigIntNotDefined","formatArgs","args","useColors","namespace","module","humanize","diff","color","splice","index","lastC","match","save","namespaces","storage","setItem","removeItem","load","r","getItem","process","env","DEBUG","window","__nwjs","navigator","userAgent","document","documentElement","style","WebkitAppearance","firebug","exception","RegExp","$1","localStorage","localstorage","destroy","warned","warn","colors","log","debug","formatters","v","JSON","stringify","createDebug","prevTime","namespacesCache","enabledCache","enableOverride","enabled","self","curr","Date","ms","prev","coerce","unshift","format","formatter","selectColor","extend","init","delimiter","newDebug","toNamespace","regexp","substring","default","disable","names","map","skips","enable","test","keys","forEach","key","hash","ReflectOwnKeys","R","Reflect","ReflectApply","receiver","Function","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","NumberIsNaN","isNaN","EventEmitter","once","emitter","Promise","resolve","reject","errorListener","err","removeListener","resolver","eventTargetAgnosticAddListener","handler","flags","on","addErrorHandlerIfEventEmitter","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","_getMaxListeners","that","_addListener","prepend","events","existing","warning","create","newListener","emit","w","count","onceWrapper","fired","wrapFn","_onceWrap","state","wrapped","bind","_listeners","unwrap","evlistener","unwrapListeners","arrayClone","listenerCount","addEventListener","wrapListener","removeEventListener","getPrototypeOf","setMaxListeners","getMaxListeners","doError","er","context","listeners","addListener","prependListener","prependOnceListener","position","originalListener","shift","pop","spliceOne","off","removeAllListeners","rawListeners","eventNames","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","s","NaN","rt","LN2","h","plural","msAbs","isPlural","round","options","exec","parseFloat","parse","long","fmtShort","brightness","_brightness","_color","Consts","Color","NONE","HubType","DeviceType","MarioColor","MarioPantsType","PortInputFormatSetupSubCommand","ModeInformationType","HWNetworkSubFamily","HWNetworkFamily","HWNetWorkCommandType","ErrorCode","IOTypeID","Event","AlertPayload","AlertOperation","AlertType","ActionType","HubPropertyPayload","HubPropertyOperation","HubPropertyReference","MessageType","BLECharacteristic","BLEService","BLEManufacturerData","DuploTrainBaseSound","BrakingStyle","ButtonState","HubTypeNames","DeviceTypeNames","ColorNames","AbsoluteMotor","TachoMotor","hub","portId","modeMap","UNKNOWN","assign","ModeMap","_mode","Mode","ABSOLUTE","angle","normalizeAngle","isWeDo2SmartHub","notify","receive","speed","isVirtualPort","cancelEventTimer","mapSpeed","_maxPower","_brakeStyle","useProfile","send","_finishedCallbacks","oldMode","mode","calibrated","async","rotateByDegrees","subscribe","requestUpdate","ROTATION","BasicMotor","Device","power","interrupt","writeDirect","fromPower","toPower","time","calculateRamp","setPower","BRAKE","ColorDistanceSensor","COLOR_DISTANCE_SENSOR","COLOR","parseColor","DISTANCE","distance","DISTANCE_COUNT","REFLECT","reflect","AMBIENT","ambient","RGB_I","red","green","blue","COLOR_AND_DISTANCE","partial","channel","address","sendPFIRMessage","_pfPowerToPWM","powerBlue","powerRed","payload","PF_IR","LED","Output","CurrentSensor","CURRENT_SENSOR","CURRENT","current","maxCurrentValue","MaxCurrentValue","maxCurrentRaw","MaxCurrentRaw","TECHNIC_MEDIUM_HUB","autoSubscribe","values","_busy","_connected","_modeMap","_isVirtualPort","_eventTimer","_hub","_portId","_type","_isWeDo2SmartHub","WEDO2_SMART_HUB","isPortVirtual","eventAttachListener","event","deviceDetachListener","device","getPortNameForPortId","WEDO2_MOTOR_VALUE_WRITE","LPF2_ALL","characteristic","_ensureConnected","callback","timer","clearTimeout","connected","DuploTrainBaseColorSensor","DUPLO_TRAIN_BASE_COLOR_SENSOR","INTENSITY","intensity","REFLECTIVITY","RGB","DuploTrainBaseMotor","DUPLO_TRAIN_BASE_MOTOR","DuploTrainBaseSpeaker","DUPLO_TRAIN_BASE_SPEAKER","sound","SOUND","tone","TONE","DuploTrainBaseSpeedometer","DUPLO_TRAIN_BASE_SPEEDOMETER","SPEED","HubLED","HUB_LED","WEDO2_PORT_TYPE_WRITE","Light","LIGHT","fromBrightness","toBrightness","setBrightness","MarioAccelerometer","MARIO_ACCELEROMETER","ACCEL","z","GEST","gesture","MarioBarcodeSensor","MARIO_BARCODE_SENSOR","BARCODE","barcode","g","MarioPantsSensor","MARIO_PANTS_SENSOR","PANTS","pants","MediumLinearMotor","MEDIUM_LINEAR_MOTOR","MotionSensor","MOTION_SENSOR","MoveHubMediumLinearMotor","MOVE_HUB_MEDIUM_LINEAR_MOTOR","MoveHubTiltSensor","MOVE_HUB_TILT_SENSOR","TILT","PiezoBuzzer","PIEZO_BUZZER","frequency","setTimeout","RemoteControlButton","REMOTE_CONTROL_BUTTON","BUTTON_EVENTS","SimpleMediumLinearMotor","SIMPLE_MEDIUM_LINEAR_MOTOR","useAccelerationProfile","useDecelerationProfile","degrees","maxPower","profile","Technic3x3ColorLightMatrix","TECHNIC_3X3_COLOR_LIGHT_MATRIX","PIX_0","colorArray","toValue","TechnicColorSensor","TECHNIC_COLOR_SENSOR","AMBIENT_LIGHT","firstSegment","secondSegment","thirdSegment","TechnicDistanceSensor","TECHNIC_DISTANCE_SENSOR","FAST_DISTANCE","fastDistance","topLeft","bottomLeft","topRight","bottomRight","TechnicForceSensor","TECHNIC_FORCE_SENSOR","FORCE","force","TOUCHED","touched","TAPPED","tapped","TechnicLargeAngularMotor","TECHNIC_LARGE_ANGULAR_MOTOR","TechnicLargeLinearMotor","TECHNIC_LARGE_LINEAR_MOTOR","TechnicMediumAngularMotor","TECHNIC_MEDIUM_ANGULAR_MOTOR","TechnicMediumHubAccelerometerSensor","TECHNIC_MEDIUM_HUB_ACCELEROMETER","TechnicMediumHubGyroSensor","TECHNIC_MEDIUM_HUB_GYRO_SENSOR","GYRO","TechnicMediumHubTiltSensor","TECHNIC_MEDIUM_HUB_TILT_SENSOR","_impactThreshold","_impactHoldoff","sign","IMPACT_COUNT","threshold","holdoff","TechnicSmallAngularMotor","TECHNIC_SMALL_ANGULAR_MOTOR","TechnicXLargeLinearMotor","TECHNIC_XLARGE_LINEAR_MOTOR","TiltSensor","TILT_SENSOR","TrainMotor","TRAIN_MOTOR","VoltageSensor","VOLTAGE_SENSOR","VOLTAGE","voltage","maxVoltageValue","MaxVoltageValue","maxVoltageRaw","MaxVoltageRaw","DUPLO_TRAIN_BASE","REMOTE_CONTROL","Debug","BaseHub","bleDevice","portMap","_attachedDevices","_name","_firmwareVersion","_hardwareVersion","_primaryMACAddress","_batteryLevel","_rssi","_portMap","_virtualPorts","_attachCallbacks","_bleDevice","connecting","uuid","connect","disconnect","portName","existingDevice","getDeviceAtPort","deviceType","getDevices","filter","existingDevices","getDevicesByType","port","delay","commands","all","_createDevice","_attachDevice","TECHNIC_MEDIUM_ANGULAR_MOTOR_GREY","TECHNIC_LARGE_ANGULAR_MOTOR_GREY","DuploTrainBase","LPF2Hub","peripheral","advertisement","serviceUuids","LPF2_HUB","manufacturerData","DUPLO_TRAIN_BASE_ID","PortMap","Hub","HUB","_currentPort","HUB_ID","version","modeInfoDebug","_messageBuffer","_propertyRequestCallbacks","discoverCharacteristicsForService","subscribeToCharacteristic","_parseMessage","_requestHubPropertyReports","BUTTON_STATE","_requestHubPropertyValue","FW_VERSION","HW_VERSION","RSSI","BATTERY_VOLTAGE","PRIMARY_MAC_ADDRESS","writeToCharacteristic","firstPortName","secondPortName","firstDevice","secondDevice","HUB_PROPERTIES","property","_parseHubPropertyResponse","HUB_ATTACHED_IO","_parsePortMessage","PORT_INFORMATION","_parsePortInformationResponse","PORT_MODE_INFORMATION","_parseModeInformationResponse","PORT_VALUE_SINGLE","_parseSensorMessage","PORT_OUTPUT_COMMAND_FEEDBACK","_parsePortAction","PRESSED","RELEASED","decodeVersion","_checkFirmware","rssi","decodeMACAddress","batteryLevel","ATTACHED_IO","deviceTypeName","toHex","hwVersion","swVersion","_sendPortInformationRequest","DETACHED_IO","_getDeviceByPortId","_detachDevice","virtualPortId","ATTACHED_VIRTUAL_IO","virtualPortName","modeCombinationMasks","toBin","_sendModeInformationRequest","NAME","RAW","PCT","SI","SYMBOL","VALUE_FORMAT","numValues","dataType","totalFigures","decimals","finish","Mario","MARIO_ID","MARIO","MoveHub","MOVE_HUB_ID","MOVE_HUB","RemoteControl","REMOTE_CONTROL_ID","TechnicMediumHub","TECHNIC_MEDIUM_HUB_ID","TechnicSmallHub","TECHNIC_SMALL_HUB","TECHNIC_SMALL_HUB_ID","WeDo2SmartHub","_lastTiltX","_lastTiltY","WEDO2_SMART_HUB_2","isWebBluetooth","WEDO2_SMART_HUB_3","WEDO2_SMART_HUB_4","WEDO2_SMART_HUB_5","WEDO2_PORT_TYPE","WEDO2_SENSOR_VALUE","WEDO2_BUTTON","readFromCharacteristic","_parseBatteryMessage","_parseHighCurrentAlert","WEDO2_BATTERY","WEDO2_HIGH_CURRENT_ALERT","_parseFirmwareRevisionString","WEDO2_FIRMWARE_REVISION","WEDO2_DISCONNECT","WEDO2_NAME_ID","_getCharacteristicNameFromUUID","PoweredUP","_connectedHubs","_discoveryEventHandler","bluetooth","requestDevice","filters","services","optionalServices","server","gatt","primaryMACAddress","hubType","addToCharacteristicMailbox","WebBLEDevice","isLPF2Hub","_determineLPF2HubType","padStart","part","roundAngleToNearest90","steps","increment","interval","setInterval","clearInterval","setEventTimer","_characteristics","_queue","_mailbox","_connecting","_webBLEServer","_uuid","id","service","getPrimaryService","characteristics","getCharacteristics","view","mailbox","startNotifications","readValue","then","writeValueWithoutResponse","compareVersions","v1","v2","n1","validateAndParse","n2","p1","p2","compareSegments","validate","semver","operator","assertValidOperator","operatorResMap","satisfies","op","v3","r1","r2","r3","compareStrings","sastisfies","isWildcard","tryParse","ap","bp","forceType","allowedOperators","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","o","globalThis","prop","hasOwnProperty","toStringTag"],"sourceRoot":""}
1
+ {"version":3,"file":"poweredup.js","mappings":"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CH,CAxCD,CAAYA,IAAU,aAAVA,EAAU,KA4CT,EAAA0B,gBAAkB1B,EAkB/B,SAAYH,GACR,qBACA,mBACA,uBACA,mBACA,+BACA,mBACA,qBACA,uBACA,uBACA,iBACA,sBACA,oBACH,CAbD,CAAYA,IAAK,QAALA,EAAK,KAiBJ,EAAA8B,WAAa9B,EAW1B,SAAYI,GACR,yBACA,2BACA,eACA,qBACA,oBACH,CAND,CAAYA,IAAW,cAAXA,EAAW,KAevB,SAAYC,GACR,qBACA,qBACA,sBACH,CAJD,CAAYA,IAAY,eAAZA,EAAY,KAexB,SAAYC,GACR,qBACA,6CACA,mCACA,mBACA,qBACH,CAND,CAAYA,IAAmB,sBAAnBA,EAAmB,KAS/B,SAAYC,GACR,kDACA,kCACA,wBACA,8CACA,4BACA,uDACA,oDACH,CARD,CAAYA,IAAmB,sBAAnBA,EAAmB,KAW/B,SAAYC,GACR,yDACA,2DACA,2BACA,2BACA,2BACA,iDACH,CAPD,CAAYA,IAAU,aAAVA,EAAU,KAUtB,SAAYC,GACR,uBACA,iCACA,sDACA,yDACA,iEACA,kEACA,gEACA,0DACA,4DACA,4DACA,+DACA,iEACA,uDACA,iDACH,CAfD,CAAYA,IAAiB,oBAAjBA,EAAiB,KA6C7B,SAAYC,GACR,uCACA,iCACA,+BACA,yCACA,uDACA,iDACA,kEACA,sDACA,sEACA,wCACA,4DACA,sEACA,wEACA,oFACA,4CACA,sDACA,8CACA,0DACA,4DACA,wEACA,gDACA,mDACA,oEACH,CAxBD,CAAYA,IAAW,cAAXA,EAAW,KA8CvB,SAAYC,GACR,2CACA,uBACA,+BACA,+BACA,mBACA,yCACA,mCACA,6CACA,uDACA,wEACA,wCACA,sCACA,kDACA,sDACA,yDACH,CAhBD,CAAYA,IAAoB,uBAApBA,EAAoB,KA6BhC,SAAYC,GACR,uCACA,6DACA,+DACA,2CACA,6DACA,wCACH,CAPD,CAAYA,IAAoB,uBAApBA,EAAoB,KA6BhC,SAAYC,GACR,2CACA,mCACA,+BACA,+BACA,mBACA,yCACA,mCACA,6CACA,uDACA,oDACA,wCACA,sCACA,kDACA,sDACA,6CACH,CAhBD,CAAYA,IAAkB,qBAAlBA,EAAkB,KAiC9B,SAAYC,GACR,uCACA,+BACA,iDACA,mDACA,2DACA,qDACA,4BACA,kDACA,kDACA,+DACH,CAXD,CAAYA,IAAU,aAAVA,EAAU,KAsBtB,SAAYC,GACR,iCACA,mCACA,iDACA,kDACH,CALD,CAAYA,IAAS,YAATA,EAAS,KAgBrB,SAAYC,GACR,iCACA,mCACA,iDACA,kDACH,CALD,CAAYA,IAAc,iBAAdA,EAAc,KAc1B,SAAYC,GACR,6BACA,sBACH,CAHD,CAAYA,IAAY,eAAZA,EAAY,KAaxB,SAAYC,GACR,iCACA,iCACA,gDACH,CAJD,CAAYA,IAAK,QAALA,EAAK,KAyBjB,SAAYC,GACR,qBACA,+CACA,uBACA,6BACA,0BACA,0BACA,4CACA,8BACA,oDACA,sCACA,sCACA,wCACA,wCACA,qCACH,CAfD,CAAYA,IAAQ,WAARA,EAAQ,KA8BpB,SAAYC,GACR,iBACA,mBACA,yCACA,yBACA,uDACA,iCACA,iCACA,sCACH,CATD,CAAYA,IAAS,YAATA,EAAS,KA6BrB,SAAYC,GACR,+CACA,uCACA,+BACA,iCACA,+BACA,uBACA,qCACA,6BACA,sCACA,kDACA,0CACA,kDACA,yDACH,CAdD,CAAYA,IAAoB,uBAApBA,EAAoB,KA8BhC,SAAYC,GACR,qBACA,uBACA,iBACA,mBACA,uBACA,+BACA,mBACA,mBACA,oBACH,CAVD,CAAYA,IAAe,kBAAfA,EAAe,KAwB3B,SAAYC,GACR,6BACA,iCACA,qCACA,mCACA,mCACA,iCACA,oCACH,CARD,CAAYA,IAAkB,qBAAlBA,EAAkB,KAyB9B,SAAYC,GACR,mBACA,iBACA,iBACA,eACA,uBACA,yBACA,yCACA,+BACA,yCACA,oCACH,CAXD,CAAYA,IAAmB,sBAAnBA,EAAmB,KAwB/B,SAAYC,GACR,yEACA,+DACA,mFACA,qFACA,2BACA,kCACH,CAPD,CAAYA,IAA8B,iCAA9BA,EAA8B,KAmB1C,SAAYC,GACR,mBACA,6BACA,kBACA,oBACA,wBACA,yBA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","sources":["webpack://node-poweredup/./node_modules/base64-js/index.js","webpack://node-poweredup/./node_modules/buffer/index.js","webpack://node-poweredup/./node_modules/compare-versions/lib/esm/utils.js","webpack://node-poweredup/./node_modules/compare-versions/lib/esm/compareVersions.js","webpack://node-poweredup/./node_modules/compare-versions/lib/esm/compare.js","webpack://node-poweredup/./node_modules/compare-versions/lib/esm/satisfies.js","webpack://node-poweredup/./node_modules/compare-versions/lib/esm/validate.js","webpack://node-poweredup/./node_modules/debug/src/browser.js","webpack://node-poweredup/./node_modules/debug/src/common.js","webpack://node-poweredup/./node_modules/events/events.js","webpack://node-poweredup/./node_modules/ieee754/index.js","webpack://node-poweredup/./node_modules/ms/index.js","webpack://node-poweredup/./src/color.ts","webpack://node-poweredup/./src/consts.ts","webpack://node-poweredup/./src/devices/absolutemotor.ts","webpack://node-poweredup/./src/devices/basicmotor.ts","webpack://node-poweredup/./src/devices/colordistancesensor.ts","webpack://node-poweredup/./src/devices/currentsensor.ts","webpack://node-poweredup/./src/devices/device.ts","webpack://node-poweredup/./src/devices/duplotrainbasecolorsensor.ts","webpack://node-poweredup/./src/devices/duplotrainbasemotor.ts","webpack://node-poweredup/./src/devices/duplotrainbasespeaker.ts","webpack://node-poweredup/./src/devices/duplotrainbasespeedometer.ts","webpack://node-poweredup/./src/devices/hubled.ts","webpack://node-poweredup/./src/devices/light.ts","webpack://node-poweredup/./src/devices/marioaccelerometer.ts","webpack://node-poweredup/./src/devices/mariobarcodesensor.ts","webpack://node-poweredup/./src/devices/mariopantssensor.ts","webpack://node-poweredup/./src/devices/mediumlinearmotor.ts","webpack://node-poweredup/./src/devices/motionsensor.ts","webpack://node-poweredup/./src/devices/movehubmediumlinearmotor.ts","webpack://node-poweredup/./src/devices/movehubtiltsensor.ts","webpack://node-poweredup/./src/devices/piezobuzzer.ts","webpack://node-poweredup/./src/devices/remotecontrolbutton.ts","webpack://node-poweredup/./src/devices/simplemediumlinearmotor.ts","webpack://node-poweredup/./src/devices/tachomotor.ts","webpack://node-poweredup/./src/devices/technic3x3colorlightmatrix.ts","webpack://node-poweredup/./src/devices/techniccolorsensor.ts","webpack://node-poweredup/./src/devices/technicdistancesensor.ts","webpack://node-poweredup/./src/devices/technicforcesensor.ts","webpack://node-poweredup/./src/devices/techniclargeangularmotor.ts","webpack://node-poweredup/./src/devices/techniclargelinearmotor.ts","webpack://node-poweredup/./src/devices/technicmediumangularmotor.ts","webpack://node-poweredup/./src/devices/technicmediumhubaccelerometersensor.ts","webpack://node-poweredup/./src/devices/technicmediumhubgyrosensor.ts","webpack://node-poweredup/./src/devices/technicmediumhubtiltsensor.ts","webpack://node-poweredup/./src/devices/technicsmallangularmotor.ts","webpack://node-poweredup/./src/devices/technicxlargelinearmotor.ts","webpack://node-poweredup/./src/devices/tiltsensor.ts","webpack://node-poweredup/./src/devices/trainmotor.ts","webpack://node-poweredup/./src/devices/voltagesensor.ts","webpack://node-poweredup/./src/hubs/basehub.ts","webpack://node-poweredup/./src/hubs/duplotrainbase.ts","webpack://node-poweredup/./src/hubs/hub.ts","webpack://node-poweredup/./src/hubs/lpf2hub.ts","webpack://node-poweredup/./src/hubs/mario.ts","webpack://node-poweredup/./src/hubs/movehub.ts","webpack://node-poweredup/./src/hubs/remotecontrol.ts","webpack://node-poweredup/./src/hubs/technicmediumhub.ts","webpack://node-poweredup/./src/hubs/technicsmallhub.ts","webpack://node-poweredup/./src/hubs/wedo2smarthub.ts","webpack://node-poweredup/./src/index-browser.ts","webpack://node-poweredup/./src/poweredup-browser.ts","webpack://node-poweredup/./src/utils.ts","webpack://node-poweredup/./src/webbleabstraction.ts","webpack://node-poweredup/webpack/bootstrap","webpack://node-poweredup/webpack/runtime/define property getters","webpack://node-poweredup/webpack/runtime/global","webpack://node-poweredup/webpack/runtime/hasOwnProperty shorthand","webpack://node-poweredup/webpack/runtime/make namespace object","webpack://node-poweredup/webpack/startup"],"sourcesContent":["'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","export const semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nexport const validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nexport const compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\n//# sourceMappingURL=utils.js.map","import { compareSegments, validateAndParse } from './utils';\n/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n//# sourceMappingURL=compareVersions.js.map","import { compareVersions } from './compareVersions';\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n '!=': [-1, 1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=compare.js.map","import { compare } from './compare';\nimport { compareSegments, validateAndParse } from './utils';\n/**\n * Match [npm semver](https://docs.npmjs.com/cli/v6/using-npm/semver) version range.\n *\n * @param version Version number to match\n * @param range Range pattern for version\n * @returns `true` if the version number is within the range, `false` otherwise.\n *\n * @example\n * ```\n * satisfies('1.1.0', '^1.0.0'); // return true\n * satisfies('1.1.0', '~1.0.0'); // return false\n * ```\n */\nexport const satisfies = (version, range) => {\n // clean input\n range = range.replace(/([><=]+)\\s+/g, '$1');\n // handle multiple comparators\n if (range.includes('||')) {\n return range.split('||').some((r) => satisfies(version, r));\n }\n else if (range.includes(' - ')) {\n const [a, b] = range.split(' - ', 2);\n return satisfies(version, `>=${a} <=${b}`);\n }\n else if (range.includes(' ')) {\n return range\n .trim()\n .replace(/\\s{2,}/g, ' ')\n .split(' ')\n .every((r) => satisfies(version, r));\n }\n // if no range operator then \"=\"\n const m = range.match(/^([<>=~^]+)/);\n const op = m ? m[1] : '=';\n // if gt/lt/eq then operator compare\n if (op !== '^' && op !== '~')\n return compare(version, range, op);\n // else range of either \"~\" or \"^\" is assumed\n const [v1, v2, v3, , vp] = validateAndParse(version);\n const [r1, r2, r3, , rp] = validateAndParse(range);\n const v = [v1, v2, v3];\n const r = [r1, r2 !== null && r2 !== void 0 ? r2 : 'x', r3 !== null && r3 !== void 0 ? r3 : 'x'];\n // validate pre-release\n if (rp) {\n if (!vp)\n return false;\n if (compareSegments(v, r) !== 0)\n return false;\n if (compareSegments(vp.split('.'), rp.split('.')) === -1)\n return false;\n }\n // first non-zero number\n const nonZero = r.findIndex((v) => v !== '0') + 1;\n // pointer to where segments can be >=\n const i = op === '~' ? 2 : nonZero > 1 ? nonZero : 1;\n // before pointer must be equal\n if (compareSegments(v.slice(0, i), r.slice(0, i)) !== 0)\n return false;\n // after pointer must be >=\n if (compareSegments(v.slice(i), r.slice(i)) === -1)\n return false;\n return true;\n};\n//# sourceMappingURL=satisfies.js.map","import { semver } from './utils';\n/**\n * Validate [semver](https://semver.org/) version strings.\n *\n * @param version Version number to validate\n * @returns `true` if the version number is a valid semver version number, `false` otherwise.\n *\n * @example\n * ```\n * validate('1.0.0-rc.1'); // return true\n * validate('1.0-rc.1'); // return false\n * validate('foo'); // return false\n * ```\n */\nexport const validate = (version) => typeof version === 'string' && /^[v\\d]/.test(version) && semver.test(version);\n/**\n * Validate [semver](https://semver.org/) version strings strictly. Will not accept wildcards and version ranges.\n *\n * @param version Version number to validate\n * @returns `true` if the version number is a valid semver version number `false` otherwise\n *\n * @example\n * ```\n * validate('1.0.0-rc.1'); // return true\n * validate('1.0-rc.1'); // return false\n * validate('foo'); // return false\n * ```\n */\nexport const validateStrict = (version) => typeof version === 'string' &&\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/.test(version);\n//# sourceMappingURL=validate.js.map","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","import * as Consts from \"./consts\";\n\nexport class Color {\n\n private _color: number;\n private _brightness: number = 100;\n\n constructor (color: number, brightness?: number) {\n this._color = color;\n this._brightness = brightness || 100;\n }\n\n public toValue () {\n if (this._color === Consts.Color.NONE) {\n return this._color;\n }\n return this._color + (Math.round(this._brightness / 10) << 4);\n }\n\n}","/**\n * @typedef HubType\n * @property {number} UNKNOWN 0\n * @property {number} WEDO2_SMART_HUB 1\n * @property {number} MOVE_HUB 2\n * @property {number} HUB 3\n * @property {number} REMOTE_CONTROL 4\n * @property {number} DUPLO_TRAIN_BASE 5\n * @property {number} TECHNIC_MEDIUM_HUB 6\n * @property {number} MARIO 7\n * @property {number} TECHNIC_SMALL_HUB 8\n */\nexport enum HubType {\n UNKNOWN = 0,\n WEDO2_SMART_HUB = 1,\n MOVE_HUB = 2,\n HUB = 3,\n REMOTE_CONTROL = 4,\n DUPLO_TRAIN_BASE = 5,\n TECHNIC_MEDIUM_HUB = 6,\n MARIO = 7,\n TECHNIC_SMALL_HUB = 8,\n}\n\n\n// tslint:disable-next-line\nexport const HubTypeNames = HubType;\n\n\n/**\n * @typedef DeviceType\n * @property {number} UNKNOWN 0\n * @property {number} SIMPLE_MEDIUM_LINEAR_MOTOR 1\n * @property {number} TRAIN_MOTOR 2\n * @property {number} LIGHT 8\n * @property {number} VOLTAGE_SENSOR 20\n * @property {number} CURRENT_SENSOR 21\n * @property {number} PIEZO_BUZZER 22\n * @property {number} HUB_LED 23\n * @property {number} TILT_SENSOR 34\n * @property {number} MOTION_SENSOR 35\n * @property {number} COLOR_DISTANCE_SENSOR 37\n * @property {number} MEDIUM_LINEAR_MOTOR 38\n * @property {number} MOVE_HUB_MEDIUM_LINEAR_MOTOR 39\n * @property {number} MOVE_HUB_TILT_SENSOR 40\n * @property {number} DUPLO_TRAIN_BASE_MOTOR 41\n * @property {number} DUPLO_TRAIN_BASE_SPEAKER 42\n * @property {number} DUPLO_TRAIN_BASE_COLOR_SENSOR 43\n * @property {number} DUPLO_TRAIN_BASE_SPEEDOMETER 44\n * @property {number} TECHNIC_LARGE_LINEAR_MOTOR 46\n * @property {number} TECHNIC_XLARGE_LINEAR_MOTOR 47\n * @property {number} TECHNIC_MEDIUM_ANGULAR_MOTOR 48\n * @property {number} TECHNIC_LARGE_ANGULAR_MOTOR 49\n * @property {number} TECHNIC_MEDIUM_HUB_GEST_SENSOR 54\n * @property {number} REMOTE_CONTROL_BUTTON 55\n * @property {number} REMOTE_CONTROL_RSSI 56\n * @property {number} TECHNIC_MEDIUM_HUB_ACCELEROMETER 57\n * @property {number} TECHNIC_MEDIUM_HUB_GYRO_SENSOR 58\n * @property {number} TECHNIC_MEDIUM_HUB_TILT_SENSOR 59\n * @property {number} TECHNIC_MEDIUM_HUB_TEMPERATURE_SENSOR 60\n * @property {number} TECHNIC_COLOR_SENSOR 61\n * @property {number} TECHNIC_DISTANCE_SENSOR 62\n * @property {number} TECHNIC_FORCE_SENSOR 63\n * @property {number} TECHNIC_3X3_COLOR_LIGHT_MATRIX 64\n * @property {number} TECHNIC_SMALL_ANGULAR_MOTOR 65\n * @property {number} MARIO_ACCELEROMETER 71\n * @property {number} MARIO_BARCODE_SENSOR 73\n * @property {number} MARIO_PANTS_SENSOR 74\n * @property {number} TECHNIC_MEDIUM_ANGULAR_MOTOR_GREY 75\n * @property {number} TECHNIC_LARGE_ANGULAR_MOTOR_GREY 76\n */\nexport enum DeviceType {\n UNKNOWN = 0,\n SIMPLE_MEDIUM_LINEAR_MOTOR = 1,\n TRAIN_MOTOR = 2,\n LIGHT = 8,\n VOLTAGE_SENSOR = 20,\n CURRENT_SENSOR = 21,\n PIEZO_BUZZER = 22,\n HUB_LED = 23,\n TILT_SENSOR = 34,\n MOTION_SENSOR = 35,\n COLOR_DISTANCE_SENSOR = 37,\n MEDIUM_LINEAR_MOTOR = 38,\n MOVE_HUB_MEDIUM_LINEAR_MOTOR = 39,\n MOVE_HUB_TILT_SENSOR = 40,\n DUPLO_TRAIN_BASE_MOTOR = 41,\n DUPLO_TRAIN_BASE_SPEAKER = 42,\n DUPLO_TRAIN_BASE_COLOR_SENSOR = 43,\n DUPLO_TRAIN_BASE_SPEEDOMETER = 44,\n TECHNIC_LARGE_LINEAR_MOTOR = 46, // Technic Control+\n TECHNIC_XLARGE_LINEAR_MOTOR = 47, // Technic Control+\n TECHNIC_MEDIUM_ANGULAR_MOTOR = 48, // Spike Prime\n TECHNIC_LARGE_ANGULAR_MOTOR = 49, // Spike Prime\n TECHNIC_MEDIUM_HUB_GEST_SENSOR = 54,\n REMOTE_CONTROL_BUTTON = 55,\n REMOTE_CONTROL_RSSI = 56,\n TECHNIC_MEDIUM_HUB_ACCELEROMETER = 57,\n TECHNIC_MEDIUM_HUB_GYRO_SENSOR = 58,\n TECHNIC_MEDIUM_HUB_TILT_SENSOR = 59,\n TECHNIC_MEDIUM_HUB_TEMPERATURE_SENSOR = 60,\n TECHNIC_COLOR_SENSOR = 61, // Spike Prime\n TECHNIC_DISTANCE_SENSOR = 62, // Spike Prime\n TECHNIC_FORCE_SENSOR = 63, // Spike Prime\n TECHNIC_3X3_COLOR_LIGHT_MATRIX = 64, // Spike Essential\n TECHNIC_SMALL_ANGULAR_MOTOR = 65, // Spike Essential\n MARIO_ACCELEROMETER = 71,\n MARIO_BARCODE_SENSOR = 73,\n MARIO_PANTS_SENSOR = 74,\n TECHNIC_MEDIUM_ANGULAR_MOTOR_GREY = 75, // Mindstorms\n TECHNIC_LARGE_ANGULAR_MOTOR_GREY = 76, // Technic Control+\n}\n\n\n// tslint:disable-next-line\nexport const DeviceTypeNames = DeviceType;\n\n\n/**\n * @typedef Color\n * @property {number} BLACK 0\n * @property {number} PINK 1\n * @property {number} PURPLE 2\n * @property {number} BLUE 3\n * @property {number} LIGHT_BLUE 4\n * @property {number} CYAN 5\n * @property {number} GREEN 6\n * @property {number} YELLOW 7\n * @property {number} ORANGE 8\n * @property {number} RED 9\n * @property {number} WHITE 10\n * @property {number} NONE 255\n */\nexport enum Color {\n BLACK = 0,\n PINK = 1,\n PURPLE = 2,\n BLUE = 3,\n LIGHT_BLUE = 4,\n CYAN = 5,\n GREEN = 6,\n YELLOW = 7,\n ORANGE = 8,\n RED = 9,\n WHITE = 10,\n NONE = 255\n}\n\n\n// tslint:disable-next-line\nexport const ColorNames = Color;\n\n\n/**\n * @typedef ButtonState\n * @property {number} PRESSED 2\n * @property {number} RELEASED 0\n * @property {number} UP 1\n * @property {number} DOWN 255\n * @property {number} STOP 127\n */\nexport enum ButtonState {\n PRESSED = 2,\n RELEASED = 0,\n UP = 1,\n DOWN = 255,\n STOP = 127\n}\n\n\n/**\n * @typedef BrakingStyle\n * @property {number} FLOAT 0\n * @property {number} HOLD 127\n * @property {number} BRAKE 128\n */\nexport enum BrakingStyle {\n FLOAT = 0,\n HOLD = 126,\n BRAKE = 127\n}\n\n\n/**\n * @typedef DuploTrainBaseSound\n * @property {number} BRAKE 3\n * @property {number} STATION_DEPARTURE 5\n * @property {number} WATER_REFILL 7\n * @property {number} HORN 9\n * @property {number} STEAM 10\n */\nexport enum DuploTrainBaseSound {\n BRAKE = 3,\n STATION_DEPARTURE = 5,\n WATER_REFILL = 7,\n HORN = 9,\n STEAM = 10\n}\n\n\nexport enum BLEManufacturerData {\n DUPLO_TRAIN_BASE_ID = 32,\n MOVE_HUB_ID = 64,\n HUB_ID = 65,\n REMOTE_CONTROL_ID = 66,\n MARIO_ID = 67,\n TECHNIC_MEDIUM_HUB_ID = 128,\n TECHNIC_SMALL_HUB_ID = 131\n}\n\n\nexport enum BLEService {\n WEDO2_SMART_HUB = \"00001523-1212-efde-1523-785feabcd123\",\n WEDO2_SMART_HUB_2 = \"00004f0e-1212-efde-1523-785feabcd123\",\n WEDO2_SMART_HUB_3 = \"2a19\",\n WEDO2_SMART_HUB_4 = \"180f\",\n WEDO2_SMART_HUB_5 = \"180a\",\n LPF2_HUB = \"00001623-1212-efde-1623-785feabcd123\"\n}\n\n\nexport enum BLECharacteristic {\n WEDO2_BATTERY = \"2a19\",\n WEDO2_FIRMWARE_REVISION = \"2a26\",\n WEDO2_BUTTON = \"00001526-1212-efde-1523-785feabcd123\", // \"1526\"\n WEDO2_PORT_TYPE = \"00001527-1212-efde-1523-785feabcd123\", // \"1527\" // Handles plugging and unplugging of devices on WeDo 2.0 Smart Hub\n WEDO2_LOW_VOLTAGE_ALERT = \"00001528-1212-efde-1523-785feabcd123\", // \"1528\"\n WEDO2_HIGH_CURRENT_ALERT = \"00001529-1212-efde-1523-785feabcd123\", // \"1529\"\n WEDO2_LOW_SIGNAL_ALERT = \"0000152a-1212-efde-1523-785feabcd123\", // \"152a\",\n WEDO2_DISCONNECT = \"0000152b-1212-efde-1523-785feabcd123\", // \"152b\"\n WEDO2_SENSOR_VALUE = \"00001560-1212-efde-1523-785feabcd123\", // \"1560\"\n WEDO2_VALUE_FORMAT = \"00001561-1212-efde-1523-785feabcd123\", // \"1561\"\n WEDO2_PORT_TYPE_WRITE = \"00001563-1212-efde-1523-785feabcd123\", // \"1563\"\n WEDO2_MOTOR_VALUE_WRITE = \"00001565-1212-efde-1523-785feabcd123\", // \"1565\"\n WEDO2_NAME_ID = \"00001524-1212-efde-1523-785feabcd123\", // \"1524\"\n LPF2_ALL = \"00001624-1212-efde-1623-785feabcd123\"\n}\n\n\n/**\n * @typedef MessageType\n * @property {number} HUB_PROPERTIES 0x01\n * @property {number} HUB_ACTIONS 0x02\n * @property {number} HUB_ALERTS 0x03\n * @property {number} HUB_ATTACHED_IO 0x04\n * @property {number} GENERIC_ERROR_MESSAGES 0x05\n * @property {number} HW_NETWORK_COMMANDS 0x08\n * @property {number} FW_UPDATE_GO_INTO_BOOT_MODE 0x10\n * @property {number} FW_UPDATE_LOCK_MEMORY 0x11\n * @property {number} FW_UPDATE_LOCK_STATUS_REQUEST 0x12\n * @property {number} FW_LOCK_STATUS 0x13\n * @property {number} PORT_INFORMATION_REQUEST 0x21\n * @property {number} PORT_MODE_INFORMATION_REQUEST 0x22\n * @property {number} PORT_INPUT_FORMAT_SETUP_SINGLE 0x41\n * @property {number} PORT_INPUT_FORMAT_SETUP_COMBINEDMODE 0x42\n * @property {number} PORT_INFORMATION 0x43\n * @property {number} PORT_MODE_INFORMATION 0x44\n * @property {number} PORT_VALUE_SINGLE 0x45\n * @property {number} PORT_VALUE_COMBINEDMODE 0x46\n * @property {number} PORT_INPUT_FORMAT_SINGLE 0x47\n * @property {number} PORT_INPUT_FORMAT_COMBINEDMODE 0x48\n * @property {number} VIRTUAL_PORT_SETUP 0x61\n * @property {number} PORT_OUTPUT_COMMAND 0x81\n * @property {number} PORT_OUTPUT_COMMAND_FEEDBACK 0x82\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#message-types\n */\nexport enum MessageType {\n HUB_PROPERTIES = 0x01,\n HUB_ACTIONS = 0x02,\n HUB_ALERTS = 0x03,\n HUB_ATTACHED_IO = 0x04,\n GENERIC_ERROR_MESSAGES = 0x05,\n HW_NETWORK_COMMANDS = 0x08,\n FW_UPDATE_GO_INTO_BOOT_MODE = 0x10,\n FW_UPDATE_LOCK_MEMORY = 0x11,\n FW_UPDATE_LOCK_STATUS_REQUEST = 0x12,\n FW_LOCK_STATUS = 0x13,\n PORT_INFORMATION_REQUEST = 0x21,\n PORT_MODE_INFORMATION_REQUEST = 0x22,\n PORT_INPUT_FORMAT_SETUP_SINGLE = 0x41,\n PORT_INPUT_FORMAT_SETUP_COMBINEDMODE = 0x42,\n PORT_INFORMATION = 0x43,\n PORT_MODE_INFORMATION = 0x44,\n PORT_VALUE_SINGLE = 0x45,\n PORT_VALUE_COMBINEDMODE = 0x46,\n PORT_INPUT_FORMAT_SINGLE = 0x47,\n PORT_INPUT_FORMAT_COMBINEDMODE = 0x48,\n VIRTUAL_PORT_SETUP = 0x61,\n PORT_OUTPUT_COMMAND = 0x81,\n PORT_OUTPUT_COMMAND_FEEDBACK = 0x82,\n}\n\n\n/**\n * @typedef HubPropertyReference\n * @param {number} ADVERTISING_NAME 0x01\n * @param {number} BUTTON 0x02\n * @param {number} FW_VERSION 0x03\n * @param {number} HW_VERSION 0x04\n * @param {number} RSSI 0x05\n * @param {number} BATTERY_VOLTAGE 0x06\n * @param {number} BATTERY_TYPE 0x07\n * @param {number} MANUFACTURER_NAME 0x08\n * @param {number} RADIO_FIRMWARE_VERSION 0x09\n * @param {number} LEGO_WIRELESS_PROTOCOL_VERSION 0x0A\n * @param {number} SYSTEM_TYPE_ID 0x0B\n * @param {number} HW_NETWORK_ID 0x0C\n * @param {number} PRIMARY_MAC_ADDRESS 0x0D\n * @param {number} SECONDARY_MAC_ADDRESS 0x0E\n * @param {number} HARDWARE_NETWORK_FAMILY 0x0F\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#hub-property-reference\n */\nexport enum HubPropertyReference {\n ADVERTISING_NAME = 0x01,\n BUTTON = 0x02,\n FW_VERSION = 0x03,\n HW_VERSION = 0x04,\n RSSI = 0x05,\n BATTERY_VOLTAGE = 0x06,\n BATTERY_TYPE = 0x07,\n MANUFACTURER_NAME = 0x08,\n RADIO_FIRMWARE_VERSION = 0x09,\n LEGO_WIRELESS_PROTOCOL_VERSION = 0x0A,\n SYSTEM_TYPE_ID = 0x0B,\n HW_NETWORK_ID = 0x0C,\n PRIMARY_MAC_ADDRESS = 0x0D,\n SECONDARY_MAC_ADDRESS = 0x0E,\n HARDWARE_NETWORK_FAMILY = 0x0F,\n}\n\n\n/**\n * @typedef HubPropertyOperation\n * @param {number} SET_DOWNSTREAM 0x01\n * @param {number} ENABLE_UPDATES_DOWNSTREAM 0x02\n * @param {number} DISABLE_UPDATES_DOWNSTREAM 0x03\n * @param {number} RESET_DOWNSTREAM 0x04\n * @param {number} REQUEST_UPDATE_DOWNSTREAM 0x05\n * @param {number} UPDATE_UPSTREAM 0x06\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#hub-property-reference\n */\nexport enum HubPropertyOperation {\n SET_DOWNSTREAM = 0x01,\n ENABLE_UPDATES_DOWNSTREAM = 0x02,\n DISABLE_UPDATES_DOWNSTREAM = 0x03,\n RESET_DOWNSTREAM = 0x04,\n REQUEST_UPDATE_DOWNSTREAM = 0x05,\n UPDATE_UPSTREAM = 0x06,\n}\n\n\n/**\n * @typedef HubPropertyPayload\n * @param {number} ADVERTISING_NAME 0x01\n * @param {number} BUTTON_STATE 0x02\n * @param {number} FW_VERSION 0x03\n * @param {number} HW_VERSION 0x04\n * @param {number} RSSI 0x05\n * @param {number} BATTERY_VOLTAGE 0x06\n * @param {number} BATTERY_TYPE 0x07\n * @param {number} MANUFACTURER_NAME 0x08\n * @param {number} RADIO_FIRMWARE_VERSION 0x09\n * @param {number} LWP_PROTOCOL_VERSION 0x0A\n * @param {number} SYSTEM_TYPE_ID 0x0B\n * @param {number} HW_NETWORK_ID 0x0C\n * @param {number} PRIMARY_MAC_ADDRESS 0x0D\n * @param {number} SECONDARY_MAC_ADDRESS 0x0E\n * @param {number} HW_NETWORK_FAMILY 0x0F\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#hub-property-reference\n */\nexport enum HubPropertyPayload {\n ADVERTISING_NAME = 0x01,\n BUTTON_STATE = 0x02,\n FW_VERSION = 0x03,\n HW_VERSION = 0x04,\n RSSI = 0x05,\n BATTERY_VOLTAGE = 0x06,\n BATTERY_TYPE = 0x07,\n MANUFACTURER_NAME = 0x08,\n RADIO_FIRMWARE_VERSION = 0x09,\n LWP_PROTOCOL_VERSION = 0x0A,\n SYSTEM_TYPE_ID = 0x0B,\n HW_NETWORK_ID = 0x0C,\n PRIMARY_MAC_ADDRESS = 0x0D,\n SECONDARY_MAC_ADDRESS = 0x0E,\n HW_NETWORK_FAMILY = 0x0F,\n}\n\n\n/**\n * @typedef ActionType\n * @param {number} SWITCH_OFF_HUB 0x01\n * @param {number} DISCONNECT 0x02\n * @param {number} VCC_PORT_CONTROL_ON 0x03\n * @param {number} VCC_PORT_CONTROL_OFF 0x04\n * @param {number} ACTIVATE_BUSY_INDICATION 0x05\n * @param {number} RESET_BUSY_INDICATION 0x06\n * @param {number} SHUTDOWN 0x2F\n * @param {number} HUB_WILL_SWITCH_OFF 0x30\n * @param {number} HUB_WILL_DISCONNECT 0x31\n * @param {number} HUB_WILL_GO_INTO_BOOT_MODE 0x32\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#action-types\n */\nexport enum ActionType {\n SWITCH_OFF_HUB = 0x01,\n DISCONNECT = 0x02,\n VCC_PORT_CONTROL_ON = 0x03,\n VCC_PORT_CONTROL_OFF = 0x04,\n ACTIVATE_BUSY_INDICATION = 0x05,\n RESET_BUSY_INDICATION = 0x06,\n SHUTDOWN = 0x2F,\n HUB_WILL_SWITCH_OFF = 0x30,\n HUB_WILL_DISCONNECT = 0x31,\n HUB_WILL_GO_INTO_BOOT_MODE = 0x32,\n}\n\n\n/**\n * @typedef AlertType\n * @param {number} LOW_VOLTAGE 0x01\n * @param {number} HIGH_CURRENT 0x02\n * @param {number} LOW_SIGNAL_STRENGTH 0x03\n * @param {number} OVER_POWER_CONDITION 0x04\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#alert-type\n */\nexport enum AlertType {\n LOW_VOLTAGE = 0x01,\n HIGH_CURRENT = 0x02,\n LOW_SIGNAL_STRENGTH = 0x03,\n OVER_POWER_CONDITION = 0x04,\n}\n\n\n/**\n * @typedef AlertOperation\n * @param {number} ENABLE_UPDATE 0x01\n * @param {number} DISABLE_UPDATE 0x02\n * @param {number} REQUEST_UPDATE 0x03\n * @param {number} UPDATE 0x04\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#alert-operation\n */\nexport enum AlertOperation {\n LOW_VOLTAGE = 0x01,\n HIGH_CURRENT = 0x02,\n LOW_SIGNAL_STRENGTH = 0x03,\n OVER_POWER_CONDITION = 0x04,\n}\n\n\n/**\n * @typedef AlertPayload\n * @param {number} STATUS_OK 0x00\n * @param {number} ALERT 0xFF\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#alert-payload\n */\nexport enum AlertPayload {\n STATUS_OK = 0x00,\n ALERT = 0xFF,\n}\n\n\n/**\n * @typedef Event\n * @param {number} DETACHED_IO 0x00\n * @param {number} ATTACHED_IO 0x01\n * @param {number} ATTACHED_VIRTUAL_IO 0x02\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#event\n */\nexport enum Event {\n DETACHED_IO = 0x00,\n ATTACHED_IO = 0x01,\n ATTACHED_VIRTUAL_IO = 0x02,\n}\n\n\n/**\n * @typedef IOTypeID\n * @param {number} MOTOR 0x0001\n * @param {number} SYSTEM_TRAIN_MOTOR 0x0002\n * @param {number} BUTTON 0x0005\n * @param {number} LED_LIGHT 0x0008\n * @param {number} VOLTAGE 0x0014\n * @param {number} CURRENT 0x0015\n * @param {number} PIEZO_TONE_SOUND 0x0016\n * @param {number} RGB_LIGHT 0x0017\n * @param {number} EXTERNAL_TILT_SENSOR 0x0022\n * @param {number} MOTION_SENSOR 0x0023\n * @param {number} VISION_SENSOR 0x0025\n * @param {number} EXTERNAL_MOTOR 0x0026\n * @param {number} INTERNAL_MOTOR 0x0027\n * @param {number} INTERNAL_TILT 0x0028\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#io-type-id\n */\nexport enum IOTypeID {\n MOTOR = 0x0001,\n SYSTEM_TRAIN_MOTOR = 0x0002,\n BUTTON = 0x0005,\n LED_LIGHT = 0x0008,\n VOLTAGE = 0x0014,\n CURRENT = 0x0015,\n PIEZO_TONE_SOUND = 0x0016,\n RGB_LIGHT = 0x0017,\n EXTERNAL_TILT_SENSOR = 0x0022,\n MOTION_SENSOR = 0x0023,\n VISION_SENSOR = 0x0025,\n EXTERNAL_MOTOR = 0x0026,\n INTERNAL_MOTOR = 0x0027,\n INTERNAL_TILT = 0x0028,\n}\n\n\n/**\n * @typedef ErrorCode\n * @param {number} ACK 0x01\n * @param {number} MACK 0x02\n * @param {number} BUFFER_OVERFLOW 0x03\n * @param {number} TIMEOUT 0x04\n * @param {number} COMMAND_NOT_RECOGNIZED 0x05\n * @param {number} INVALID_USE 0x06\n * @param {number} OVERCURRENT 0x07\n * @param {number} INTERNAL_ERROR 0x08\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#error-codes\n */\nexport enum ErrorCode {\n ACK = 0x01,\n MACK = 0x02,\n BUFFER_OVERFLOW = 0x03,\n TIMEOUT = 0x04,\n COMMAND_NOT_RECOGNIZED = 0x05,\n INVALID_USE = 0x06,\n OVERCURRENT = 0x07,\n INTERNAL_ERROR = 0x08,\n}\n\n\n/**\n * @typedef HWNetWorkCommandType\n * @param {number} CONNECTION_REQUEST 0x02\n * @param {number} FAMILY_REQUEST 0x03\n * @param {number} FAMILY_SET 0x04\n * @param {number} JOIN_DENIED 0x05\n * @param {number} GET_FAMILY 0x06\n * @param {number} FAMILY 0x07\n * @param {number} GET_SUBFAMILY 0x08\n * @param {number} SUBFAMILY 0x09\n * @param {number} SUBFAMILY_SET 0x0A\n * @param {number} GET_EXTENDED_FAMILY 0x0B\n * @param {number} EXTENDED_FAMILY 0x0C\n * @param {number} EXTENDED_FAMILY_SET 0x0D\n * @param {number} RESET_LONG_PRESS_TIMING 0x0E\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#h-w-network-command-type\n */\nexport enum HWNetWorkCommandType {\n CONNECTION_REQUEST = 0x02,\n FAMILY_REQUEST = 0x03,\n FAMILY_SET = 0x04,\n JOIN_DENIED = 0x05,\n GET_FAMILY = 0x06,\n FAMILY = 0x07,\n GET_SUBFAMILY = 0x08,\n SUBFAMILY = 0x09,\n SUBFAMILY_SET = 0x0A,\n GET_EXTENDED_FAMILY = 0x0B,\n EXTENDED_FAMILY = 0x0C,\n EXTENDED_FAMILY_SET = 0x0D,\n RESET_LONG_PRESS_TIMING = 0x0E,\n}\n\n\n/**\n * @typedef HWNetworkFamily\n * @param {number} GREEN 0x01\n * @param {number} YELLOW 0x02\n * @param {number} RED 0x03\n * @param {number} BLUE 0x04\n * @param {number} PURPLE 0x05\n * @param {number} LIGHT_BLUE 0x06\n * @param {number} TEAL 0x07\n * @param {number} PINK 0x08\n * @param {number} WHITE 0x00\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#h-w-network-family\n */\nexport enum HWNetworkFamily {\n GREEN = 0x01,\n YELLOW = 0x02,\n RED = 0x03,\n BLUE = 0x04,\n PURPLE = 0x05,\n LIGHT_BLUE = 0x06,\n TEAL = 0x07,\n PINK = 0x08,\n WHITE = 0x00,\n}\n\n\n/**\n * @typedef HWNetworkSubFamily\n * @param {number} ONE_FLASH 0x01\n * @param {number} TWO_FLASHES 0x02\n * @param {number} THREE_FLASHES 0x03\n * @param {number} FOUR_FLASHES 0x04\n * @param {number} FIVE_FLASHES 0x05\n * @param {number} SIX_FLASHES 0x06\n * @param {number} SEVEN_FLASHES 0x07\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#h-w-network-sub-family\n */\nexport enum HWNetworkSubFamily {\n ONE_FLASH = 0x01,\n TWO_FLASHES = 0x02,\n THREE_FLASHES = 0x03,\n FOUR_FLASHES = 0x04,\n FIVE_FLASHES = 0x05,\n SIX_FLASHES = 0x06,\n SEVEN_FLASHES = 0x07,\n}\n\n\n/**\n * @typedef ModeInformationType\n * @param {number} NAME 0x00\n * @param {number} RAW 0x01\n * @param {number} PCT 0x02\n * @param {number} SI 0x03\n * @param {number} SYMBOL 0x04\n * @param {number} MAPPING 0x05\n * @param {number} USED_INTERNALLY 0x06\n * @param {number} MOTOR_BIAS 0x07\n * @param {number} CAPABILITY_BITS 0x08\n * @param {number} VALUE_FORMAT 0x80\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#mode-information-types\n */\nexport enum ModeInformationType {\n NAME = 0x00,\n RAW = 0x01,\n PCT = 0x02,\n SI = 0x03,\n SYMBOL = 0x04,\n MAPPING = 0x05,\n USED_INTERNALLY = 0x06,\n MOTOR_BIAS = 0x07,\n CAPABILITY_BITS = 0x08,\n VALUE_FORMAT = 0x80,\n}\n\n\n/**\n * @typedef PortInputFormatSetupSubCommand\n * @param {number} SET_MODEANDDATASET_COMBINATIONS 0x01\n * @param {number} LOCK_LPF2_DEVICE_FOR_SETUP 0x02\n * @param {number} UNLOCKANDSTARTWITHMULTIUPDATEENABLED 0x03\n * @param {number} UNLOCKANDSTARTWITHMULTIUPDATEDISABLED 0x04\n * @param {number} NOT_USED 0x05\n * @param {number} RESET_SENSOR 0x06\n * @description https://lego.github.io/lego-ble-wireless-protocol-docs/index.html#port-input-format-setup-sub-commands\n */\nexport enum PortInputFormatSetupSubCommand {\n SET_MODEANDDATASET_COMBINATIONS = 0x01,\n LOCK_LPF2_DEVICE_FOR_SETUP = 0x02,\n UNLOCKANDSTARTWITHMULTIUPDATEENABLED = 0x03,\n UNLOCKANDSTARTWITHMULTIUPDATEDISABLED = 0x04,\n NOT_USED = 0x05,\n RESET_SENSOR = 0x06,\n}\n\n\n/**\n * @typedef MarioPantsType\n * @param {number} NONE 0x00\n * @param {number} PROPELLER 0x06\n * @param {number} CAT 0x11\n * @param {number} FIRE 0x12\n * @param {number} NORMAL 0x21\n * @param {number} BUILDER 0x22\n */\nexport enum MarioPantsType {\n NONE = 0x00,\n PROPELLER = 0x06,\n CAT = 0x11,\n FIRE = 0x12,\n NORMAL = 0x21,\n BUILDER = 0x22,\n}\n\n\n/**\n * @typedef MarioColor\n * @param {number} WHITE 0x1300\n * @param {number} RED 0x1500\n * @param {number} BLUE 0x1700\n * @param {number} YELLOW 0x1800\n * @param {number} BLACK 0x1a00\n * @param {number} GREEN 0x2500\n * @param {number} BROWN 0x6a00\n * @param {number} CYAN 0x4201\n */\nexport enum MarioColor {\n WHITE = 0x1300,\n RED = 0x1500,\n BLUE = 0x1700,\n YELLOW = 0x1800,\n BLACK = 0x1a00,\n GREEN = 0x2500,\n BROWN = 0x6a00,\n CYAN = 0x4201,\n}\n","import { TachoMotor } from \"./tachomotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { mapSpeed, normalizeAngle, roundAngleToNearest90 } from \"../utils\";\n\n/**\n * @class AbsoluteMotor\n * @extends TachoMotor\n */\nexport class AbsoluteMotor extends TachoMotor {\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.UNKNOWN) {\n super(hub, portId, Object.assign({}, modeMap, ModeMap), type);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.ABSOLUTE:\n const angle = normalizeAngle(message.readInt16LE(this.isWeDo2SmartHub ? 2 : 4));\n /**\n * Emits when a the motors absolute position is changed.\n * @event AbsoluteMotor#absolute\n * @type {object}\n * @param {number} absolute\n */\n this.notify(\"absolute\", { angle });\n break;\n default:\n super.receive(message);\n break;\n }\n }\n\n /**\n * Rotate a motor by a given angle.\n * @method AbsoluteMotor#gotoAngle\n * @param {number} angle Absolute position the motor should go to (degrees from 0).\n * @param {number} [speed=100] For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100.\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public gotoAngle (angle: [number, number] | number, speed: number = 100) {\n if (!this.isVirtualPort && angle instanceof Array) {\n throw new Error(\"Only virtual ports can accept multiple positions\");\n }\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Absolute positioning is not available on the WeDo 2.0 Smart Hub\");\n }\n this.cancelEventTimer();\n return new Promise<void>((resolve) => {\n if (speed === undefined || speed === null) {\n speed = 100;\n }\n let message;\n if (angle instanceof Array) {\n message = Buffer.from([0x81, this.portId, 0x11, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, mapSpeed(speed), this._maxPower, this._brakeStyle, this.useProfile()]);\n message.writeInt32LE(normalizeAngle(angle[0]), 4);\n message.writeInt32LE(normalizeAngle(angle[1]), 8);\n } else {\n message = Buffer.from([0x81, this.portId, 0x11, 0x0d, 0x00, 0x00, 0x00, 0x00, mapSpeed(speed), this._maxPower, this._brakeStyle, this.useProfile()]);\n message.writeInt32LE(normalizeAngle(angle), 4);\n }\n this.send(message);\n this._finishedCallbacks.push(() => {\n return resolve();\n });\n });\n }\n\n\n /**\n * Rotate motor to real zero position.\n *\n * Real zero is marked on Technic angular motors (SPIKE Prime). It is also available on Technic linear motors (Control+) but is unmarked.\n * @method AbsoluteMotor#gotoRealZero\n * @param {number} [speed=100] Speed between 1 - 100. Note that this will always take the shortest path to zero.\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public gotoRealZero (speed: number = 100) {\n return new Promise<void>((resolve) => {\n const oldMode = this.mode;\n let calibrated = false;\n this.on(\"absolute\", async ({ angle }) => {\n if (!calibrated) {\n calibrated = true;\n if (angle < 0) {\n angle = Math.abs(angle);\n } else {\n speed = -speed;\n }\n await this.rotateByDegrees(angle, speed);\n if (oldMode) {\n this.subscribe(oldMode);\n }\n return resolve();\n }\n });\n this.requestUpdate();\n });\n }\n\n\n /**\n * Reset zero to current position\n * @method AbsoluteMotor#resetZero\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public resetZero () {\n return new Promise<void>((resolve) => {\n const data = Buffer.from([0x81, this.portId, 0x11, 0x51, 0x02, 0x00, 0x00, 0x00, 0x00]);\n this.send(data);\n return resolve();\n });\n }\n\n\n}\n\nexport enum Mode {\n ROTATION = 0x02,\n ABSOLUTE = 0x03\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"rotate\": Mode.ROTATION,\n \"absolute\": Mode.ABSOLUTE\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\nimport { calculateRamp, mapSpeed } from \"../utils\";\n\n/**\n * @class BasicMotor\n * @extends Device\n */\nexport class BasicMotor extends Device {\n\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number}, type: Consts.DeviceType = Consts.DeviceType.UNKNOWN) {\n super(hub, portId, modeMap, type);\n }\n\n\n /**\n * Set the motor power.\n * @method BasicMotor#setPower\n * @param {number} power For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100. Stop is 0.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setPower (power: number, interrupt: boolean = true) {\n if (interrupt) {\n this.cancelEventTimer();\n }\n return this.writeDirect(0x00, Buffer.from([mapSpeed(power)]));\n }\n\n\n /**\n * Ramp the motor power.\n * @method BasicMotor#rampPower\n * @param {number} fromPower For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100. Stop is 0.\n * @param {number} toPower For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100. Stop is 0.\n * @param {number} time How long the ramp should last (in milliseconds).\n * @returns {Promise} Resolved upon successful completion of command.\n */\n public rampPower (fromPower: number, toPower: number, time: number) {\n this.cancelEventTimer();\n return new Promise((resolve) => {\n calculateRamp(this, fromPower, toPower, time)\n .on(\"changePower\", (power) => {\n this.setPower(power, false);\n })\n .on(\"finished\", resolve);\n });\n }\n\n\n /**\n * Stop the motor.\n * @method BasicMotor#stop\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public stop () {\n this.cancelEventTimer();\n return this.setPower(0);\n }\n\n\n /**\n * Brake the motor.\n * @method BasicMotor#brake\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public brake () {\n this.cancelEventTimer();\n return this.setPower(Consts.BrakingStyle.BRAKE);\n }\n\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { parseColor } from \"../utils\";\n\n/**\n * @class ColorDistanceSensor\n * @extends Device\n */\nexport class ColorDistanceSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.COLOR_DISTANCE_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.COLOR:\n if (message[this.isWeDo2SmartHub ? 2 : 4] <= 10) {\n const color = parseColor(message[this.isWeDo2SmartHub ? 2 : 4]);\n\n /**\n * Emits when a color sensor is activated.\n * @event ColorDistanceSensor#color\n * @type {object}\n * @param {Color} color\n */\n this.notify(\"color\", { color });\n }\n break;\n\n case Mode.DISTANCE:\n if (this.isWeDo2SmartHub) {\n break;\n }\n if (message[4] <= 10) {\n let distance = Math.floor(message[4] * 25.4) - 20;\n\n if (distance < 0) {\n distance = 0;\n }\n\n /**\n * Emits when a distance sensor is activated.\n * @event ColorDistanceSensor#distance\n * @type {object}\n * @param {number} distance Distance, in millimeters.\n */\n this.notify(\"distance\", { distance });\n }\n break;\n\n case Mode.DISTANCE_COUNT:\n if (this.isWeDo2SmartHub) {\n break;\n }\n if (message.length !== 8) {\n // if mode of device has not changed to this._mode yet\n break;\n }\n const count = message.readUInt32LE(4);\n /**\n * Emits when distance is reduced to less than 10 centimeters.\n * @event ColorDistanceSensor#distanceCount\n * @type {object}\n * @param {number} number of distance events.\n */\n this.notify(\"distanceCount\", { count });\n break;\n\n case Mode.REFLECT:\n if (this.isWeDo2SmartHub) {\n break;\n }\n const reflect = message[4];\n /**\n * Event measuring reflection change, emits when the sensor is activated.\n * @event ColorDistanceSensor#reflect\n * @type {object}\n * @param {number} percentage from 0 to 100.\n */\n this.notify(\"reflect\", { reflect });\n break;\n\n case Mode.AMBIENT:\n if (this.isWeDo2SmartHub) {\n break;\n }\n const ambient = message[4];\n /**\n * Event measuring abient light change, emits when the sensor is activated.\n * @event ColorDistanceSensor#ambient\n * @type {object}\n * @param {number} percentage from 0 to 100.\n */\n this.notify(\"ambient\", { ambient });\n break;\n\n case Mode.RGB_I:\n if (this.isWeDo2SmartHub) {\n break;\n }\n if (message.length !== 10) {\n // if mode of device has not changed to this._mode yet\n break;\n }\n const red = message.readUInt16LE(4);\n const green = message.readUInt16LE(6);\n const blue = message.readUInt16LE(8);\n /**\n * Emits when a color sensor is activated.\n * @event ColorDistanceSensor#rgbIntensity\n * @type {object}\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n */\n this.notify(\"rgbIntensity\", { red, green, blue });\n break;\n\n case Mode.COLOR_AND_DISTANCE:\n if (this.isWeDo2SmartHub) {\n break;\n }\n\n let distance = message[5];\n const partial = message[7];\n\n if (partial > 0) {\n distance += 1.0 / partial;\n }\n\n distance = Math.floor(distance * 25.4) - 20;\n\n /**\n * A combined color and distance event, emits when the sensor is activated.\n * @event ColorDistanceSensor#colorAndDistance\n * @type {object}\n * @param {Color} color\n * @param {number} distance Distance, in millimeters.\n */\n if (message[4] <= 10) {\n const color = message[4];\n this.notify(\"colorAndDistance\", { color, distance });\n }\n break;\n\n }\n }\n\n\n /**\n * Switches the IR receiver into extended channel mode. After setting this, use channels 5-8 instead of 1-4 for this receiver.\n *\n * NOTE: Calling this with channel 5-8 with switch off extended channel mode for this receiver.\n * @method ColorDistanceSensor#setPFExtendedChannel\n * @param {number} channel Channel number, between 1-8\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setPFExtendedChannel (channel: number) {\n let address = 0;\n if (channel >= 4) {\n channel -= 4;\n address = 1;\n }\n const message = Buffer.alloc(2);\n // Send \"Extended toggle address command\"\n message[0] = ((channel - 1) << 4) + (address << 3);\n message[1] = 6 << 4;\n return this.sendPFIRMessage(message);\n }\n\n\n /**\n * Set the power of a Power Functions motor via IR\n * @method ColorDistanceSensor#setPFPower\n * @param {number} channel Channel number, between 1-4\n * @param {string} output Outport port, \"RED\" (A) or \"BLUE\" (B)\n * @param {number} power -7 (full reverse) to 7 (full forward). 0 is stop. 8 is brake.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setPFPower (channel: number, output: Output, power: number) {\n let address = 0;\n if (channel > 4) {\n channel -= 4;\n address = 1;\n }\n const message = Buffer.alloc(2);\n // Send \"Single output mode\"\n message[0] = ((channel - 1) << 4) + (address << 3) + (output === \"RED\" ? 4 : 5);\n message[1] = this._pfPowerToPWM(power) << 4;\n return this.sendPFIRMessage(message);\n }\n\n\n /**\n * Start Power Functions motors running via IR\n *\n * NOTE: This command is designed for bang-bang style operation. To keep the motors running, the sensor needs to be within range of the IR receiver constantly.\n * @method ColorDistanceSensor#startPFMotors\n * @param {Buffer} channel Channel number, between 1-4\n * @param {Buffer} powerA -7 (full reverse) to 7 (full forward). 0 is stop. 8 is brake.\n * @param {Buffer} powerB -7 (full reverse) to 7 (full forward). 0 is stop. 8 is brake.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public startPFMotors (channel: number, powerBlue: number, powerRed: number) {\n let address = 0;\n if (channel > 4) {\n channel -= 4;\n address = 1;\n }\n const message = Buffer.alloc(2);\n // Send \"Combo PWM mode\"\n message[0] = (((channel - 1) + 4 + (address << 3)) << 4) + this._pfPowerToPWM(powerBlue);\n message[1] = this._pfPowerToPWM(powerRed) << 4;\n return this.sendPFIRMessage(message);\n }\n\n\n /**\n * Send a raw Power Functions IR command\n * @method ColorDistanceSensor#sendPFIRMessage\n * @param {Buffer} message 2 byte payload making up a Power Functions protocol command. NOTE: Only specify nibbles 1-3, nibble 4 should be zeroed.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public sendPFIRMessage (message: Buffer) {\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Power Functions IR is not available on the WeDo 2.0 Smart Hub\");\n } else {\n const payload = Buffer.alloc(2);\n payload[0] = (message[0] << 4) + (message[1] >> 4);\n payload[1] = message[0] >> 4;\n this.subscribe(Mode.PF_IR);\n return this.writeDirect(0x07, payload);\n }\n }\n\n\n /**\n * Set the color of the LED on the sensor via a color value.\n * @method ColorDistanceSensor#setColor\n * @param {Color} color\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setColor (color: number | boolean) {\n return new Promise<void>((resolve) => {\n if (color === false) {\n color = 0;\n }\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Setting LED color is not available on the WeDo 2.0 Smart Hub\");\n } else {\n this.subscribe(Mode.LED);\n this.writeDirect(0x05, Buffer.from([color as number]));\n }\n return resolve();\n });\n }\n\n /**\n * Set the distance count value.\n * @method ColorDistanceSensor#setDistanceCount\n * @param {count} distance count between 0 and 2^32\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setDistanceCount (count: number) {\n return new Promise<void>((resolve) => {\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Setting distance count is not available on the WeDo 2.0 Smart Hub\");\n } else {\n\t\tconst payload = Buffer.alloc(4);\n\t\tpayload.writeUInt32LE(count % 2**32);\n // no need to subscribe, can be set in different mode\n this.writeDirect(0x02, payload);\n }\n return resolve();\n });\n }\n\n private _pfPowerToPWM (power: number) {\n return power & 15;\n }\n\n}\n\nexport enum Mode {\n COLOR = 0x00,\n DISTANCE = 0x01,\n DISTANCE_COUNT = 0x02,\n REFLECT = 0x03,\n AMBIENT = 0x04,\n LED = 0x05,\n RGB_I = 0x06,\n PF_IR = 0x07,\n COLOR_AND_DISTANCE = 0x08\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"color\": Mode.COLOR,\n \"distance\": Mode.DISTANCE,\n \"distanceCount\": Mode.DISTANCE_COUNT,\n \"reflect\": Mode.REFLECT,\n \"ambient\": Mode.AMBIENT,\n \"rgbIntensity\": Mode.RGB_I,\n \"colorAndDistance\": Mode.COLOR_AND_DISTANCE\n};\n\nexport enum Output {\n RED = \"RED\",\n BLUE = \"BLUE\"\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class CurrentSensor\n * @extends Device\n */\nexport class CurrentSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.CURRENT_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this.mode;\n\n switch (mode) {\n case Mode.CURRENT:\n if (this.isWeDo2SmartHub) {\n const current = message.readInt16LE(2) / 1000;\n this.notify(\"current\", { current });\n } else {\n let maxCurrentValue = MaxCurrentValue[this.hub.type];\n if (maxCurrentValue === undefined) {\n maxCurrentValue = MaxCurrentValue[Consts.HubType.UNKNOWN];\n }\n let maxCurrentRaw = MaxCurrentRaw[this.hub.type];\n if (maxCurrentRaw === undefined) {\n maxCurrentRaw = MaxCurrentRaw[Consts.HubType.UNKNOWN];\n }\n const current = message.readUInt16LE(4) * maxCurrentValue / maxCurrentRaw;\n /**\n * Emits when a current change is detected.\n * @event CurrentSensor#current\n * @type {object}\n * @param {number} current\n */\n this.notify(\"current\", { current });\n }\n break;\n }\n }\n\n}\n\nexport enum Mode {\n CURRENT = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"current\": Mode.CURRENT\n};\n\nconst MaxCurrentValue: {[hubType: number]: number} = {\n [Consts.HubType.UNKNOWN]: 2444,\n [Consts.HubType.TECHNIC_MEDIUM_HUB]: 4175,\n};\n\nconst MaxCurrentRaw: {[hubType: number]: number} = {\n [Consts.HubType.UNKNOWN]: 4095,\n};\n","import { EventEmitter } from \"events\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class Device\n * @extends EventEmitter\n */\nexport class Device extends EventEmitter {\n\n public autoSubscribe: boolean = true;\n public values: {[event: string]: any} = {};\n\n protected _mode: number | undefined;\n protected _busy: boolean = false;\n protected _finishedCallbacks: (() => void)[] = [];\n\n private _hub: IDeviceInterface;\n private _portId: number;\n private _connected: boolean = true;\n private _type: Consts.DeviceType;\n private _modeMap: {[event: string]: number} = {};\n\n private _isWeDo2SmartHub: boolean;\n private _isVirtualPort: boolean = false;\n private _eventTimer: NodeJS.Timeout | null = null;\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.UNKNOWN) {\n super();\n this._hub = hub;\n this._portId = portId;\n this._type = type;\n this._modeMap = modeMap;\n this._isWeDo2SmartHub = (this.hub.type === Consts.HubType.WEDO2_SMART_HUB);\n this._isVirtualPort = this.hub.isPortVirtual(portId);\n\n const eventAttachListener = (event: string) => {\n if (event === \"detach\") {\n return;\n }\n if (this.autoSubscribe) {\n if (this._modeMap[event] !== undefined) {\n this.subscribe(this._modeMap[event]);\n }\n }\n };\n\n const deviceDetachListener = (device: Device) => {\n if (device.portId === this.portId) {\n this._connected = false;\n this.hub.removeListener(\"detach\", deviceDetachListener);\n this.emit(\"detach\");\n }\n };\n\n for (const event in this._modeMap) {\n if (this.hub.listenerCount(event) > 0) {\n eventAttachListener(event);\n }\n }\n\n this.hub.on(\"newListener\", eventAttachListener);\n this.on(\"newListener\", eventAttachListener);\n this.hub.on(\"detach\", deviceDetachListener);\n }\n\n /**\n * @readonly\n * @property {boolean} connected Check if the device is still attached.\n */\n public get connected () {\n return this._connected;\n }\n\n /**\n * @readonly\n * @property {Hub} hub The Hub the device is attached to.\n */\n public get hub () {\n return this._hub;\n }\n\n public get portId () {\n return this._portId;\n }\n\n /**\n * @readonly\n * @property {string} portName The port the device is attached to.\n */\n public get portName () {\n return this.hub.getPortNameForPortId(this.portId);\n }\n\n /**\n * @readonly\n * @property {number} type The type of the device\n */\n public get type () {\n return this._type;\n }\n\n public get typeName () {\n return Consts.DeviceTypeNames[this.type];\n }\n\n /**\n * @readonly\n * @property {number} mode The mode the device is currently in\n */\n public get mode () {\n return this._mode;\n }\n\n protected get isWeDo2SmartHub () {\n return this._isWeDo2SmartHub;\n }\n\n /**\n * @readonly\n * @property {boolean} isVirtualPort Is this device attached to a virtual port (ie. a combined device)\n */\n protected get isVirtualPort () {\n return this._isVirtualPort;\n }\n\n public writeDirect (mode: number, data: Buffer) {\n if (this.isWeDo2SmartHub) {\n return this.send(Buffer.concat([Buffer.from([this.portId, 0x01, 0x02]), data]), Consts.BLECharacteristic.WEDO2_MOTOR_VALUE_WRITE);\n } else {\n return this.send(Buffer.concat([Buffer.from([0x81, this.portId, 0x11, 0x51, mode]), data]), Consts.BLECharacteristic.LPF2_ALL);\n }\n }\n\n public send (data: Buffer, characteristic: string = Consts.BLECharacteristic.LPF2_ALL) {\n this._ensureConnected();\n return this.hub.send(data, characteristic);\n }\n\n public subscribe (mode: number) {\n this._ensureConnected();\n if (mode !== this._mode) {\n this._mode = mode;\n this.hub.subscribe(this.portId, this.type, mode);\n }\n }\n\n public unsubscribe (mode: number) {\n this._ensureConnected();\n }\n\n public receive (message: Buffer) {\n this.notify(\"receive\", { message });\n }\n\n public notify (event: string, values: any) {\n this.values[event] = values;\n this.emit(event, values);\n if (this.hub.listenerCount(event) > 0) {\n this.hub.emit(event, this, values);\n }\n }\n\n public requestUpdate () {\n this.send(Buffer.from([0x21, this.portId, 0x00]));\n }\n\n public finish (message: number) {\n if((message & 0x10) === 0x10) return; // \"busy/full\"\n this._busy = (message & 0x01) === 0x01;\n while(this._finishedCallbacks.length > Number(this._busy)) {\n const callback = this._finishedCallbacks.shift();\n if(callback) {\n callback();\n }\n }\n }\n\n public setEventTimer (timer: NodeJS.Timeout) {\n this._eventTimer = timer;\n }\n\n public cancelEventTimer () {\n if (this._eventTimer) {\n clearTimeout(this._eventTimer);\n this._eventTimer = null;\n }\n }\n\n private _ensureConnected () {\n if (!this.connected) {\n throw new Error(\"Device is not connected\");\n }\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { parseColor } from \"../utils\";\n\n/**\n * @class DuploTrainBaseColorSensor\n * @extends Device\n */\nexport class DuploTrainBaseColorSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.DUPLO_TRAIN_BASE_COLOR_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.INTENSITY:\n const intensity = message[4];\n\n /**\n * Emits when intensity of the color/light changes.\n * @event DuploTrainBaseColorSensor#intensity\n * @type {object}\n * @param {number} intensity\n */\n this.notify(\"intensity\", { intensity });\n break;\n\n case Mode.COLOR:\n if (message[4] <= 10) {\n const color = parseColor(message[4]);\n\n /**\n * Emits when a color sensor is activated.\n * @event DuploTrainBaseColorSensor#color\n * @type {object}\n * @param {Color} color\n */\n this.notify(\"color\", { color });\n }\n break;\n\n case Mode.REFLECTIVITY:\n const reflect = message[4];\n\n /**\n * Emits when the light reflectivity changes.\n * @event DuploTrainBaseColorSensor#reflect\n * @type {object}\n * @param {number} reflect Percentage, from 0 to 100.\n */\n this.notify(\"reflect\", { reflect });\n break;\n\n case Mode.RGB:\n const red = Math.floor(message.readUInt16LE(4) / 4);\n const green = Math.floor(message.readUInt16LE(6) / 4);\n const blue = Math.floor(message.readUInt16LE(8) / 4);\n\n /**\n * Emits when the light reflectivity changes.\n * @event DuploTrainBaseColorSensor#rgb\n * @type {object}\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n */\n this.notify(\"rgb\", { red, green, blue });\n break;\n\n }\n }\n\n}\n\nexport enum Mode {\n INTENSITY = 0x00,\n COLOR = 0x01,\n REFLECTIVITY = 0x02,\n RGB = 0x03\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"intensity\": Mode.INTENSITY,\n \"color\": Mode.COLOR,\n \"reflect\": Mode.REFLECTIVITY,\n \"rgb\": Mode.RGB\n};\n","import { BasicMotor } from \"./basicmotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class DuploTrainBaseMotor\n * @extends BasicMotor\n */\nexport class DuploTrainBaseMotor extends BasicMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.DUPLO_TRAIN_BASE_MOTOR);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class DuploTrainBaseSpeaker\n * @extends Device\n */\nexport class DuploTrainBaseSpeaker extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.DUPLO_TRAIN_BASE_SPEAKER);\n }\n\n /**\n * Play a built-in train sound.\n * @method DuploTrainBaseSpeaker#playSound\n * @param {DuploTrainBaseSound} sound\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public playSound (sound: Consts.DuploTrainBaseSound) {\n return new Promise<void>((resolve) => {\n this.subscribe(Mode.SOUND);\n this.writeDirect(0x01, Buffer.from([sound]));\n return resolve();\n });\n }\n\n /**\n * Play a built-in system tone.\n * @method DuploTrainBaseSpeaker#playTone\n * @param {number} tone\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public playTone (tone: number) {\n this.subscribe(Mode.TONE);\n this.writeDirect(0x02, Buffer.from([tone]));\n }\n\n}\n\nexport enum Mode {\n SOUND = 0x01,\n TONE = 0x02\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class DuploTraniBaseSpeedometer\n * @extends Device\n */\nexport class DuploTrainBaseSpeedometer extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.DUPLO_TRAIN_BASE_SPEEDOMETER);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.SPEED:\n const speed = message.readInt16LE(4);\n\n /**\n * Emits on a speed change.\n * @event DuploTrainBaseSpeedometer#speed\n * @type {object}\n * @param {number} speed\n */\n this.notify(\"speed\", { speed });\n break;\n\n }\n }\n\n}\n\nexport enum Mode {\n SPEED = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"speed\": Mode.SPEED\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class HubLED\n * @extends Device\n */\nexport class HubLED extends Device {\n\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.HUB_LED);\n }\n\n\n /**\n * Set the color of the LED on the Hub via a color value.\n * @method HubLED#setColor\n * @param {Color} color\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setColor (color: number | boolean) {\n return new Promise<void>((resolve) => {\n if (typeof color === \"boolean\") {\n color = 0;\n }\n if (this.isWeDo2SmartHub) {\n this.send(Buffer.from([0x06, 0x17, 0x01, 0x01]), Consts.BLECharacteristic.WEDO2_PORT_TYPE_WRITE);\n this.send(Buffer.from([0x06, 0x04, 0x01, color]), Consts.BLECharacteristic.WEDO2_MOTOR_VALUE_WRITE);\n } else {\n this.subscribe(Mode.COLOR);\n this.writeDirect(0x00, Buffer.from([color]));\n }\n return resolve();\n });\n }\n\n\n /**\n * Set the color of the LED on the Hub via RGB values.\n * @method HubLED#setRGB\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setRGB (red: number, green: number, blue: number) {\n return new Promise<void>((resolve) => {\n if (this.isWeDo2SmartHub) {\n this.send(Buffer.from([0x06, 0x17, 0x01, 0x02]), Consts.BLECharacteristic.WEDO2_PORT_TYPE_WRITE);\n this.send(Buffer.from([0x06, 0x04, 0x03, red, green, blue]), Consts.BLECharacteristic.WEDO2_MOTOR_VALUE_WRITE);\n } else {\n this.subscribe(Mode.RGB);\n this.writeDirect(0x01, Buffer.from([red, green, blue]));\n }\n return resolve();\n });\n }\n\n\n}\n\nexport enum Mode {\n COLOR = 0x00,\n RGB = 0x01\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { calculateRamp } from \"../utils\";\n\n/**\n * @class Light\n * @extends Device\n */\nexport class Light extends Device {\n\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.LIGHT);\n }\n\n\n /**\n * Set the light brightness.\n * @method Light#setBrightness\n * @param {number} brightness Brightness value between 0-100 (0 is off)\n * @returns {Promise} Resolved upon successful completion of command.\n */\n public setBrightness (brightness: number, interrupt: boolean = true) {\n if (interrupt) {\n this.cancelEventTimer();\n }\n return new Promise<void>((resolve) => {\n this.writeDirect(0x00, Buffer.from([brightness]));\n return resolve();\n });\n }\n\n\n /**\n * Ramp the light brightness.\n * @method Light#rampBrightness\n * @param {number} fromBrightness Brightness value between 0-100 (0 is off)\n * @param {number} toBrightness Brightness value between 0-100 (0 is off)\n * @param {number} time How long the ramp should last (in milliseconds).\n * @returns {Promise} Resolved upon successful completion of command.\n */\n public rampBrightness (fromBrightness: number, toBrightness: number, time: number) {\n this.cancelEventTimer();\n return new Promise((resolve) => {\n calculateRamp(this, fromBrightness, toBrightness, time)\n .on(\"changePower\", (power) => {\n this.setBrightness(power, false);\n })\n .on(\"finished\", resolve);\n });\n }\n\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MarioAccelerometer\n * @extends Device\n */\nexport class MarioAccelerometer extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.MARIO_ACCELEROMETER);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.ACCEL:\n /**\n * Emits when accelerometer detects movement. Measured in mG.\n * @event MarioAccelerometer#accel\n * @type {object}\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\n const x = message[4];\n const y = message[5];\n const z = message[6];\n this.notify(\"accel\", { x, y, z });\n break;\n case Mode.GEST:\n /**\n * Emits when a gesture is detected\n * @event MarioAccelerometer#gest\n * @type {object}\n * @param {number} gesture\n */\n const gesture = message[4];\n this.notify(\"gesture\", { gesture });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n ACCEL = 0x00,\n GEST = 0x01,\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"accel\": Mode.ACCEL,\n \"gesture\": Mode.GEST,\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MarioBarcodeSensor\n * @extends Device\n */\nexport class MarioBarcodeSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.MARIO_BARCODE_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.BARCODE:\n /**\n * Emits when the barcode sensor sees a barcode.\n * @event MarioBarcodeSensor#barcode\n * @type {object}\n * @param {number} id\n */\n const barcode = message.readUInt16LE(4);\n const color = message.readUInt16LE(6);\n if (color === 0xffff) {\n // This is a barcode\n this.notify(\"barcode\", { barcode });\n } else if (barcode === 0xffff) {\n // This is a color\n this.notify(\"barcode\", { color });\n }\n break;\n case Mode.RGB:\n /**\n * Emits when the barcode sensor sees a RGB color.\n * @event MarioBarcodeSensor#rgb\n * @type {object}\n * @param {number} r\n * @param {number} g\n * @param {number} b\n */\n const r = message[4];\n const g = message[5];\n const b = message[6];\n this.notify(\"rgb\", { r, g, b });\n break;\n\n }\n }\n\n}\n\nexport enum Mode {\n BARCODE = 0x00,\n RGB = 0x01,\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"barcode\": Mode.BARCODE,\n \"rgb\": Mode.RGB,\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MarioPantsSensor\n * @extends Device\n */\nexport class MarioPantsSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.MARIO_PANTS_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.PANTS:\n /**\n * Emits when the user changes the pants on Mario.\n * @event MarioPantsSensor#pants\n * @type {object}\n * @param {number} pants\n */\n const pants = message[4];\n this.notify(\"pants\", { pants });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n PANTS = 0x00,\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"pants\": Mode.PANTS,\n};\n","import { TachoMotor } from \"./tachomotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MediumLinearMotor\n * @extends TachoMotor\n */\nexport class MediumLinearMotor extends TachoMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.MEDIUM_LINEAR_MOTOR);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MotionSensor\n * @extends Device\n */\nexport class MotionSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.MOTION_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.DISTANCE:\n let distance = message[this.isWeDo2SmartHub ? 2 : 4];\n if (message[this.isWeDo2SmartHub ? 3 : 5] === 1) {\n distance = distance + 255;\n }\n distance *= 10;\n /**\n * Emits when a distance sensor is activated.\n * @event MotionSensor#distance\n * @type {object}\n * @param {number} distance Distance, in millimeters.\n */\n this.notify(\"distance\", { distance });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n DISTANCE = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"distance\": Mode.DISTANCE\n};\n","import { TachoMotor } from \"./tachomotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MoveHubMediumLinearMotor\n * @extends TachoMotor\n */\nexport class MoveHubMediumLinearMotor extends TachoMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.MOVE_HUB_MEDIUM_LINEAR_MOTOR);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class MoveHubTiltSensor\n * @extends Device\n */\nexport class MoveHubTiltSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.MOVE_HUB_TILT_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.TILT:\n /**\n * Emits when a tilt sensor is activated.\n * @event MoveHubTiltSensor#tilt\n * @type {object}\n * @param {number} x\n * @param {number} y\n */\n const x = -message.readInt8(4);\n const y = message.readInt8(5);\n this.notify(\"tilt\", { x, y });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n TILT = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"tilt\": Mode.TILT\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class PiezoBuzzer\n * @extends Device\n */\nexport class PiezoBuzzer extends Device {\n\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.PIEZO_BUZZER);\n }\n\n\n /**\n * Play a tone on the Hub's in-built buzzer\n * @method PiezoBuzzer#playTone\n * @param {number} frequency\n * @param {number} time How long the tone should play for (in milliseconds).\n * @returns {Promise} Resolved upon successful completion of command (ie. once the tone has finished playing).\n */\n public playTone (frequency: number, time: number) {\n return new Promise((resolve) => {\n const data = Buffer.from([0x05, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00]);\n data.writeUInt16LE(frequency, 3);\n data.writeUInt16LE(time, 5);\n this.send(data, Consts.BLECharacteristic.WEDO2_MOTOR_VALUE_WRITE);\n global.setTimeout(resolve, time);\n });\n }\n\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class RemoteControlButton\n * @extends Device\n */\nexport class RemoteControlButton extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.REMOTE_CONTROL_BUTTON);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.BUTTON_EVENTS:\n /**\n * Emits when a button on the remote is pressed or released.\n * @event RemoteControlButton#remoteButton\n * @type {object}\n * @param {number} event\n */\n const event = message[4];\n this.notify(\"remoteButton\", { event });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n BUTTON_EVENTS = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"remoteButton\": Mode.BUTTON_EVENTS\n};\n\nexport const ButtonState: {[state: string]: number} = {\n \"UP\": 0x01,\n \"DOWN\": 0xff,\n \"STOP\": 0x7f,\n \"RELEASED\": 0x00,\n};\n","import { BasicMotor } from \"./basicmotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class SimpleMediumLinearMotor\n * @extends Device\n */\nexport class SimpleMediumLinearMotor extends BasicMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.SIMPLE_MEDIUM_LINEAR_MOTOR);\n }\n\n}\n","import { BasicMotor } from \"./basicmotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { mapSpeed } from \"../utils\";\n\n/**\n * @class TachoMotor\n * @extends BasicMotor\n */\nexport class TachoMotor extends BasicMotor {\n\n protected _brakeStyle: Consts.BrakingStyle = Consts.BrakingStyle.BRAKE;\n protected _maxPower: number = 100;\n public useAccelerationProfile: boolean = true;\n public useDecelerationProfile: boolean = true;\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.UNKNOWN) {\n super(hub, portId, Object.assign({}, modeMap, ModeMap), type);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.ROTATION:\n const degrees = message.readInt32LE(this.isWeDo2SmartHub ? 2 : 4);\n /**\n * Emits when a rotation sensor is activated.\n * @event TachoMotor#rotate\n * @type {object}\n * @param {number} rotation\n */\n this.notify(\"rotate\", { degrees });\n break;\n }\n }\n\n\n /**\n * Set the braking style of the motor.\n *\n * Note: This applies to setSpeed, rotateByDegrees, and gotoAngle.\n * @method TachoMotor#setBrakingStyle\n * @param {number} style Either BRAKE or HOLD\n */\n public setBrakingStyle (style: Consts.BrakingStyle) {\n this._brakeStyle = style;\n }\n\n\n /**\n * Set the max power of the motor.\n *\n * Note: This applies to setSpeed, rotateByDegrees, and gotoAngle.\n * @method TachoMotor#setMaxPower\n * @param {number} style Either BRAKE or HOLD\n */\n public setMaxPower (maxPower: number) {\n this._maxPower = maxPower;\n }\n\n\n /**\n * Set the global acceleration time\n * @method TachoMotor#setAccelerationTime\n * @param {number} time How long acceleration should last (in milliseconds).\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public setAccelerationTime (time: number, profile: number = 0x00) {\n const message = Buffer.from([0x81, this.portId, 0x11, 0x05, 0x00, 0x00, profile]);\n message.writeUInt16LE(time, 4);\n this.send(message);\n }\n\n\n /**\n * Set the global deceleration time\n * @method TachoMotor#setDecelerationTime\n * @param {number} time How long deceleration should last (in milliseconds).\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public setDecelerationTime (time: number, profile: number = 0x00) {\n const message = Buffer.from([0x81, this.portId, 0x11, 0x06, 0x00, 0x00, profile]);\n message.writeUInt16LE(time, 4);\n this.send(message);\n }\n\n\n /**\n * Set the motor speed.\n * @method TachoMotor#setSpeed\n * @param {number} speed For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100. Stop is 0.\n * @param {number} time How long the motor should run for (in milliseconds).\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setSpeed (speed: [number, number] | number, time: number | undefined) {\n if (!this.isVirtualPort && speed instanceof Array) {\n throw new Error(\"Only virtual ports can accept multiple speeds\");\n }\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Motor speed is not available on the WeDo 2.0 Smart Hub\");\n }\n this.cancelEventTimer();\n return new Promise<void>((resolve) => {\n if (speed === undefined || speed === null) {\n speed = 100;\n }\n let message;\n if (time !== undefined) {\n if (speed instanceof Array) {\n message = Buffer.from([0x81, this.portId, 0x11, 0x0a, 0x00, 0x00, mapSpeed(speed[0]), mapSpeed(speed[1]), this._maxPower, this._brakeStyle, this.useProfile()]);\n } else {\n message = Buffer.from([0x81, this.portId, 0x11, 0x09, 0x00, 0x00, mapSpeed(speed), this._maxPower, this._brakeStyle, this.useProfile()]);\n }\n message.writeUInt16LE(time, 4);\n } else {\n if (speed instanceof Array) {\n message = Buffer.from([0x81, this.portId, 0x11, 0x08, mapSpeed(speed[0]), mapSpeed(speed[1]), this._maxPower, this.useProfile()]);\n } else {\n message = Buffer.from([0x81, this.portId, 0x11, 0x07, mapSpeed(speed), this._maxPower, this.useProfile()]);\n }\n }\n this.send(message);\n this._finishedCallbacks.push(() => {\n return resolve();\n });\n });\n }\n\n /**\n * Rotate a motor by a given amount of degrees.\n * @method TachoMotor#rotateByDegrees\n * @param {number} degrees How much the motor should be rotated (in degrees).\n * @param {number} [speed=100] For forward, a value between 1 - 100 should be set. For reverse, a value between -1 to -100.\n * @returns {Promise} Resolved upon successful completion of command (ie. once the motor is finished).\n */\n public rotateByDegrees (degrees: number, speed: [number, number] | number) {\n if (!this.isVirtualPort && speed instanceof Array) {\n throw new Error(\"Only virtual ports can accept multiple speeds\");\n }\n if (this.isWeDo2SmartHub) {\n throw new Error(\"Rotation is not available on the WeDo 2.0 Smart Hub\");\n }\n this.cancelEventTimer();\n return new Promise<void>((resolve) => {\n if (speed === undefined || speed === null) {\n speed = 100;\n }\n let message;\n if (speed instanceof Array) {\n message = Buffer.from([0x81, this.portId, 0x11, 0x0c, 0x00, 0x00, 0x00, 0x00, mapSpeed(speed[0]), mapSpeed(speed[1]), this._maxPower, this._brakeStyle, this.useProfile()]);\n } else {\n message = Buffer.from([0x81, this.portId, 0x11, 0x0b, 0x00, 0x00, 0x00, 0x00, mapSpeed(speed), this._maxPower, this._brakeStyle, this.useProfile()]);\n }\n message.writeUInt32LE(degrees, 4);\n this.send(message);\n this._finishedCallbacks.push(() => {\n return resolve();\n });\n });\n }\n\n\n protected useProfile () {\n let value = 0x00;\n if (this.useAccelerationProfile) {\n value += 0x01;\n }\n if (this.useDecelerationProfile) {\n value += 0x02;\n }\n return value;\n }\n\n\n}\n\nexport enum Mode {\n ROTATION = 0x02\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"rotate\": Mode.ROTATION\n};\n","import { Color } from \"../color\";\n\nimport { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class Technic3x3ColorLightMatrix\n * @extends Device\n */\nexport class Technic3x3ColorLightMatrix extends Device {\n\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.TECHNIC_3X3_COLOR_LIGHT_MATRIX);\n }\n\n\n /**\n * Set the LED matrix, one color per LED\n * @method Technic3x3ColorLightMatrix#setMatrix\n * @param {Color[] | Color} colors Array of 9 colors, 9 Color objects, or a single color\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setMatrix (colors: number[] | number) {\n return new Promise<void>((resolve) => {\n this.subscribe(Mode.PIX_0);\n const colorArray = new Array(9);\n for (let i = 0; i < colorArray.length; i++) {\n if (typeof colors === 'number') {\n // @ts-ignore\n colorArray[i] = colors + (10 << 4);\n }\n // @ts-ignore\n if (colors[i] instanceof Color) {\n // @ts-ignore\n colorArray[i] = colors[i].toValue();\n }\n // @ts-ignore\n if (colors[i] === Consts.Color.NONE) {\n colorArray[i] = Consts.Color.NONE;\n }\n // @ts-ignore\n if (colors[i] <= 10) {\n // @ts-ignore\n colorArray[i] = colors[i] + (10 << 4); // If a raw color value, set it to max brightness (10)\n }\n }\n this.writeDirect(Mode.PIX_0, Buffer.from(colorArray));\n return resolve();\n });\n }\n\n\n}\n\nexport enum Mode {\n LEV_0 = 0x00,\n COL_0 = 0x01,\n PIX_0 = 0x02,\n TRANS = 0x03\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\nimport { parseColor } from \"../utils\";\n\n/**\n * @class TechnicColorSensor\n * @extends Device\n */\nexport class TechnicColorSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_COLOR_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.COLOR:\n if (message[4] <= 10) {\n const color = parseColor(message[4]);\n\n /**\n * Emits when a color sensor is activated.\n * @event TechnicColorSensor#color\n * @type {object}\n * @param {Color} color\n */\n this.notify(\"color\", { color });\n }\n break;\n\n case Mode.REFLECTIVITY:\n const reflect = message[4];\n\n /**\n * Emits when the light reflectivity changes.\n * @event TechnicColorSensor#reflect\n * @type {object}\n * @param {number} reflect Percentage, from 0 to 100.\n */\n this.notify(\"reflect\", { reflect });\n break;\n\n case Mode.AMBIENT_LIGHT:\n const ambient = message[4];\n\n /**\n * Emits when the ambient light changes.\n * @event TechnicColorSensor#ambient\n * @type {object}\n * @param {number} ambient Percentage, from 0 to 100.\n */\n this.notify(\"ambient\", { ambient });\n break;\n }\n }\n\n /**\n * Set the brightness (or turn on/off) of the lights around the sensor.\n * @method TechnicColorSensor#setBrightness\n * @param {number} firstSegment First light segment. 0-100 brightness.\n * @param {number} secondSegment Second light segment. 0-100 brightness.\n * @param {number} thirdSegment Third light segment. 0-100 brightness.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setBrightness (firstSegment: number, secondSegment: number, thirdSegment: number) {\n this.writeDirect(0x03, Buffer.from([firstSegment, secondSegment, thirdSegment]));\n }\n\n}\n\nexport enum Mode {\n COLOR = 0x00,\n REFLECTIVITY = 0x01,\n AMBIENT_LIGHT = 0x02\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"color\": Mode.COLOR,\n \"reflect\": Mode.REFLECTIVITY,\n \"ambient\": Mode.AMBIENT_LIGHT\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicDistanceSensor\n * @extends Device\n */\nexport class TechnicDistanceSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_DISTANCE_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.DISTANCE:\n const distance = message.readUInt16LE(4);\n\n /**\n * Emits when the detected distance changes (Slow sampling covers 40mm to 2500mm).\n * @event TechnicDistanceSensor#distance\n * @type {object}\n * @param {number} distance Distance, from 40 to 2500mm\n */\n this.notify(\"distance\", { distance });\n break;\n\n case Mode.FAST_DISTANCE:\n const fastDistance = message.readUInt16LE(4);\n\n /**\n * Emits when the detected distance changes (Fast sampling covers 50mm to 320mm).\n * @event TechnicDistanceSensor#fastDistance\n * @type {object}\n * @param {number} fastDistance Distance, from 50 to 320mm\n */\n this.notify(\"fastDistance\", { fastDistance });\n break;\n }\n }\n\n /**\n * Set the brightness (or turn on/off) of the lights around the eyes.\n * @method TechnicDistanceSensor#setBrightness\n * @param {number} topLeft Top left quadrant (above left eye). 0-100 brightness.\n * @param {number} bottomLeft Bottom left quadrant (below left eye). 0-100 brightness.\n * @param {number} topRight Top right quadrant (above right eye). 0-100 brightness.\n * @param {number} bottomRight Bottom right quadrant (below right eye). 0-100 brightness.\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setBrightness (topLeft: number, bottomLeft: number, topRight: number, bottomRight: number) {\n this.writeDirect(0x05, Buffer.from([topLeft, topRight, bottomLeft, bottomRight]));\n }\n\n}\n\nexport enum Mode {\n DISTANCE = 0x00,\n FAST_DISTANCE = 0x01\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"distance\": Mode.DISTANCE,\n \"fastDistance\": Mode.FAST_DISTANCE\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicForceSensor\n * @extends Device\n */\nexport class TechnicForceSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_FORCE_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.FORCE:\n const force = message[this.isWeDo2SmartHub ? 2 : 4] / 10;\n\n /**\n * Emits when force is applied.\n * @event TechnicForceSensor#force\n * @type {object}\n * @param {number} force Force, in newtons (0-10).\n */\n this.notify(\"force\", { force });\n break;\n\n case Mode.TOUCHED:\n const touched = message[4] ? true : false;\n\n /**\n * Emits when the sensor is touched.\n * @event TechnicForceSensor#touch\n * @type {object}\n * @param {boolean} touch Touched on/off (boolean).\n */\n this.notify(\"touched\", { touched });\n break;\n\n case Mode.TAPPED:\n const tapped = message[4];\n\n /**\n * Emits when the sensor is tapped.\n * @event TechnicForceSensor#tapped\n * @type {object}\n * @param {number} tapped How hard the sensor was tapped, from 0-3.\n */\n this.notify(\"tapped\", { tapped });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n FORCE = 0x00,\n TOUCHED = 0x01,\n TAPPED = 0x02\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"force\": Mode.FORCE,\n \"touched\": Mode.TOUCHED,\n \"tapped\": Mode.TAPPED\n};\n","import { AbsoluteMotor } from \"./absolutemotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicLargeAngularMotor\n * @extends AbsoluteMotor\n */\nexport class TechnicLargeAngularMotor extends AbsoluteMotor {\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.TECHNIC_LARGE_ANGULAR_MOTOR) {\n super(hub, portId, {}, type);\n }\n\n}\n","import { AbsoluteMotor } from \"./absolutemotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicLargeLinearMotor\n * @extends AbsoluteMotor\n */\nexport class TechnicLargeLinearMotor extends AbsoluteMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.TECHNIC_LARGE_LINEAR_MOTOR);\n }\n\n}\n","import { AbsoluteMotor } from \"./absolutemotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicMediumAngularMotor\n * @extends AbsoluteMotor\n */\nexport class TechnicMediumAngularMotor extends AbsoluteMotor {\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.TECHNIC_MEDIUM_ANGULAR_MOTOR) {\n super(hub, portId, {}, type);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicMediumHubAccelerometerSensor\n * @extends Device\n */\nexport class TechnicMediumHubAccelerometerSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_MEDIUM_HUB_ACCELEROMETER);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.ACCEL:\n /**\n * Emits when accelerometer detects movement. Measured in mG.\n * @event TechnicMediumHubAccelerometerSensor#accel\n * @type {object}\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\n const x = Math.round(message.readInt16LE(4) / 4.096);\n const y = Math.round(message.readInt16LE(6) / 4.096);\n const z = Math.round(message.readInt16LE(8) / 4.096);\n this.notify(\"accel\", { x, y, z });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n ACCEL = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"accel\": Mode.ACCEL\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicMediumHubGyroSensor\n * @extends Device\n */\nexport class TechnicMediumHubGyroSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_MEDIUM_HUB_GYRO_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.GYRO:\n /**\n * Emits when gyroscope detects movement. Measured in DPS - degrees per second.\n * @event TechnicMediumHubGyroSensor#gyro\n * @type {object}\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\n const x = Math.round(message.readInt16LE(4) * 7 / 400);\n const y = Math.round(message.readInt16LE(6) * 7 / 400);\n const z = Math.round(message.readInt16LE(8) * 7 / 400);\n this.notify(\"gyro\", { x, y, z });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n GYRO = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"gyro\": Mode.GYRO\n};\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicMediumHubTiltSensor\n * @extends Device\n */\nexport class TechnicMediumHubTiltSensor extends Device {\n\n protected _impactThreshold: number = 10; // guess of default value\n protected _impactHoldoff: number = 10; // guess of default value\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_MEDIUM_HUB_TILT_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.TILT:\n /**\n * Emits when a tilt sensor is activated.\n *\n * @event TechnicMediumHubTiltSensor#tilt\n * @type {object}\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\n let z = -message.readInt16LE(4);\n const y = message.readInt16LE(6);\n const x = message.readInt16LE(8);\n\n // workaround for calibration problem or bug in technicMediumHub firmware 1.1.00.0000\n if(y === 90 || y === -90) {\n z = Math.sign(y)*(z + 180);\n if(z > 180) z -= 360;\n if(z < -180) z += 360;\n }\n\n this.notify(\"tilt\", { x, y, z });\n break;\n\n case Mode.IMPACT_COUNT:\n if (message.length !== 8) {\n // if mode of device has not changed to this._mode yet\n break;\n }\n const count = message.readUInt32LE(4);\n /**\n * Emits when proper acceleration is above threshold (e.g. on impact when being thrown to the ground).\n * @event TechnicMediumHubTiltSensor#impactCount\n * @type {object}\n * @param {number} number of impact events.\n */\n this.notify(\"impactCount\", { count });\n break;\n }\n }\n\n /**\n * Set the impact count value.\n * @method TechnicMediumHubTiltSensor#setImpactCount\n * @param {count} impact count between 0 and 2^32\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setImpactCount (count: number) {\n return new Promise<void>((resolve) => {\n const payload = Buffer.alloc(4);\n\t payload.writeUInt32LE(count % 2**32);\n // no need to subscribe, can be set in different mode\n this.writeDirect(0x01, payload);\n return resolve();\n });\n }\n\n /**\n * Set the impact threshold.\n * @method TechnicMediumHubTiltSensor#setImpactThreshold\n * @param {threshold} value between 1 and 127\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setImpactThreshold (threshold: number) {\n this._impactThreshold = threshold;\n return new Promise<void>((resolve) => {\n this.writeDirect(0x02, Buffer.from([this._impactThreshold, this._impactHoldoff]));\n return resolve();\n });\n }\n\n /**\n * Set the impact holdoff time.\n * @method TechnicMediumHubTiltSensor#setImpactHoldoff\n * @param {holdoff} value between 1 and 127\n * @returns {Promise} Resolved upon successful issuance of the command.\n */\n public setImpactHoldoff (holdoff: number) {\n this._impactHoldoff = holdoff;\n return new Promise<void>((resolve) => {\n this.writeDirect(0x02, Buffer.from([this._impactThreshold, this._impactHoldoff]));\n return resolve();\n });\n }\n}\n\nexport enum Mode {\n TILT = 0x00,\n IMPACT_COUNT = 0x01\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"tilt\": Mode.TILT,\n \"impactCount\": Mode.IMPACT_COUNT\n};\n","import { AbsoluteMotor } from \"./absolutemotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicSmallAngularMotor\n * @extends AbsoluteMotor\n */\nexport class TechnicSmallAngularMotor extends AbsoluteMotor {\n\n constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.TECHNIC_SMALL_ANGULAR_MOTOR) {\n super(hub, portId, {}, type);\n }\n\n}\n","import { AbsoluteMotor } from \"./absolutemotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TechnicXLargeLinearMotor\n * @extends AbsoluteMotor\n */\nexport class TechnicXLargeLinearMotor extends AbsoluteMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.TECHNIC_XLARGE_LINEAR_MOTOR);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TiltSensor\n * @extends Device\n */\nexport class TiltSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.TILT_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.TILT:\n const x = message.readInt8(this.isWeDo2SmartHub ? 2 : 4);\n const y = message.readInt8(this.isWeDo2SmartHub ? 3 : 5);\n /**\n * Emits when a tilt sensor is activated.\n * @event TiltSensor#tilt\n * @type {object}\n * @param {number} x\n * @param {number} y\n */\n this.notify(\"tilt\", { x, y });\n break;\n }\n }\n\n}\n\nexport enum Mode {\n TILT = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"tilt\": Mode.TILT\n};\n","import { BasicMotor } from \"./basicmotor\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class TrainMotor\n * @extends BasicMotor\n */\nexport class TrainMotor extends BasicMotor {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, {}, Consts.DeviceType.TRAIN_MOTOR);\n }\n\n}\n","import { Device } from \"./device\";\n\nimport { IDeviceInterface } from \"../interfaces\";\n\nimport * as Consts from \"../consts\";\n\n/**\n * @class VoltageSensor\n * @extends Device\n */\nexport class VoltageSensor extends Device {\n\n constructor (hub: IDeviceInterface, portId: number) {\n super(hub, portId, ModeMap, Consts.DeviceType.VOLTAGE_SENSOR);\n }\n\n public receive (message: Buffer) {\n const mode = this._mode;\n\n switch (mode) {\n case Mode.VOLTAGE:\n if (this.isWeDo2SmartHub) {\n const voltage = message.readInt16LE(2) / 40;\n this.notify(\"voltage\", { voltage });\n } else {\n let maxVoltageValue = MaxVoltageValue[this.hub.type];\n if (maxVoltageValue === undefined) {\n maxVoltageValue = MaxVoltageValue[Consts.HubType.UNKNOWN];\n }\n let maxVoltageRaw = MaxVoltageRaw[this.hub.type];\n if (maxVoltageRaw === undefined) {\n maxVoltageRaw = MaxVoltageRaw[Consts.HubType.UNKNOWN];\n }\n const voltage = message.readUInt16LE(4) * maxVoltageValue / maxVoltageRaw;\n /**\n * Emits when a voltage change is detected.\n * @event VoltageSensor#voltage\n * @type {object}\n * @param {number} voltage\n */\n this.notify(\"voltage\", { voltage });\n }\n break;\n }\n }\n\n}\n\nexport enum Mode {\n VOLTAGE = 0x00\n}\n\nexport const ModeMap: {[event: string]: number} = {\n \"voltage\": Mode.VOLTAGE\n};\n\nconst MaxVoltageValue: {[hubType: number]: number} = {\n [Consts.HubType.UNKNOWN]: 9.615,\n [Consts.HubType.DUPLO_TRAIN_BASE]: 6.4,\n [Consts.HubType.REMOTE_CONTROL]: 6.4,\n};\n\nconst MaxVoltageRaw: {[hubType: number]: number} = {\n [Consts.HubType.UNKNOWN]: 3893,\n [Consts.HubType.DUPLO_TRAIN_BASE]: 3047,\n [Consts.HubType.REMOTE_CONTROL]: 3200,\n [Consts.HubType.TECHNIC_MEDIUM_HUB]: 4095,\n};\n","import { EventEmitter } from \"events\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { ColorDistanceSensor } from \"../devices/colordistancesensor\";\nimport { CurrentSensor } from \"../devices/currentsensor\";\nimport { Device } from \"../devices/device\";\n\nimport { DuploTrainBaseColorSensor } from \"../devices/duplotrainbasecolorsensor\";\nimport { DuploTrainBaseMotor } from \"../devices/duplotrainbasemotor\";\nimport { DuploTrainBaseSpeaker } from \"../devices/duplotrainbasespeaker\";\nimport { DuploTrainBaseSpeedometer } from \"../devices/duplotrainbasespeedometer\";\n\nimport { HubLED } from \"../devices/hubled\";\nimport { Light } from \"../devices/light\";\nimport { MarioAccelerometer } from \"../devices/marioaccelerometer\";\nimport { MarioBarcodeSensor } from \"../devices/mariobarcodesensor\";\nimport { MarioPantsSensor } from \"../devices/mariopantssensor\";\nimport { MediumLinearMotor } from \"../devices/mediumlinearmotor\";\nimport { MotionSensor } from \"../devices/motionsensor\";\nimport { MoveHubMediumLinearMotor } from \"../devices/movehubmediumlinearmotor\";\nimport { MoveHubTiltSensor } from \"../devices/movehubtiltsensor\";\nimport { PiezoBuzzer } from \"../devices/piezobuzzer\";\nimport { RemoteControlButton } from \"../devices/remotecontrolbutton\";\nimport { SimpleMediumLinearMotor } from \"../devices/simplemediumlinearmotor\";\nimport { TechnicColorSensor } from \"../devices/techniccolorsensor\";\nimport { TechnicDistanceSensor } from \"../devices/technicdistancesensor\";\nimport { TechnicForceSensor } from \"../devices/technicforcesensor\";\nimport { TechnicLargeAngularMotor } from \"../devices/techniclargeangularmotor\";\nimport { TechnicLargeLinearMotor } from \"../devices/techniclargelinearmotor\";\nimport { TechnicSmallAngularMotor } from \"../devices/technicsmallangularmotor\";\nimport { TechnicMediumAngularMotor } from \"../devices/technicmediumangularmotor\";\nimport { TechnicMediumHubAccelerometerSensor } from \"../devices/technicmediumhubaccelerometersensor\";\nimport { TechnicMediumHubGyroSensor } from \"../devices/technicmediumhubgyrosensor\";\nimport { TechnicMediumHubTiltSensor } from \"../devices/technicmediumhubtiltsensor\";\nimport { TechnicXLargeLinearMotor } from \"../devices/technicxlargelinearmotor\";\nimport { TiltSensor } from \"../devices/tiltsensor\";\nimport { TrainMotor } from \"../devices/trainmotor\";\nimport { VoltageSensor } from \"../devices/voltagesensor\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nimport { Technic3x3ColorLightMatrix } from \"../devices/technic3x3colorlightmatrix\";\nconst debug = Debug(\"basehub\");\n\n\n/**\n * @class BaseHub\n * @extends EventEmitter\n */\nexport class BaseHub extends EventEmitter {\n\n protected _attachedDevices: {[portId: number]: Device} = {};\n\n protected _name: string = \"\";\n protected _firmwareVersion: string = \"0.0.00.0000\";\n protected _hardwareVersion: string = \"0.0.00.0000\";\n protected _primaryMACAddress: string = \"00:00:00:00:00:00\";\n protected _batteryLevel: number = 100;\n protected _rssi: number = -60;\n protected _portMap: {[portName: string]: number} = {};\n protected _virtualPorts: number[] = [];\n\n protected _bleDevice: IBLEAbstraction;\n\n private _type: Consts.HubType;\n private _attachCallbacks: ((device: Device) => boolean)[] = [];\n\n constructor (bleDevice: IBLEAbstraction, portMap: {[portName: string]: number} = {}, type: Consts.HubType = Consts.HubType.UNKNOWN) {\n super();\n this.setMaxListeners(23); // Technic Medium Hub has 9 built in devices + 4 external ports. Node.js throws a warning after 10 attached event listeners.\n this._type = type;\n this._bleDevice = bleDevice;\n this._portMap = Object.assign({}, portMap);\n bleDevice.on(\"disconnect\", () => {\n /**\n * Emits when the hub is disconnected.\n * @event Hub#disconnect\n */\n this.emit(\"disconnect\");\n });\n }\n\n\n /**\n * @readonly\n * @property {string} name Name of the hub\n */\n public get name () {\n return this._bleDevice.name;\n }\n\n\n /**\n * @readonly\n * @property {string} connected Connected status\n */\n public get connected () {\n return this._bleDevice.connected;\n }\n\n\n /**\n * @readonly\n * @property {string} connecting Connecting status\n */\n public get connecting () {\n return this._bleDevice.connecting;\n }\n\n\n /**\n * @readonly\n * @property {string} type Hub type\n */\n public get type () {\n return this._type;\n }\n\n\n /**\n * @readonly\n * @property {string[]} ports Array of port names\n */\n public get ports () {\n return Object.keys(this._portMap);\n }\n\n\n /**\n * @readonly\n * @property {string} firmwareVersion Firmware version of the hub\n */\n public get firmwareVersion () {\n return this._firmwareVersion;\n }\n\n\n /**\n * @readonly\n * @property {string} hardwareVersion Hardware version of the hub\n */\n public get hardwareVersion () {\n return this._hardwareVersion;\n }\n\n\n /**\n * @readonly\n * @property {string} primaryMACAddress Primary MAC address of the hub\n */\n public get primaryMACAddress () {\n return this._primaryMACAddress;\n }\n\n\n /**\n * @readonly\n * @property {string} uuid UUID of the hub\n */\n public get uuid () {\n return this._bleDevice.uuid;\n }\n\n\n /**\n * @readonly\n * @property {number} batteryLevel Battery level of the hub (Percentage between 0-100)\n */\n public get batteryLevel () {\n return this._batteryLevel;\n }\n\n\n /**\n * @readonly\n * @property {number} rssi Signal strength of the hub\n */\n public get rssi () {\n return this._rssi;\n }\n\n\n /**\n * Connect to the Hub.\n * @method Hub#connect\n * @returns {Promise} Resolved upon successful connect.\n */\n public connect () {\n if (this._bleDevice.connecting) {\n throw new Error(\"Already connecting\");\n } else if (this._bleDevice.connected) {\n throw new Error(\"Already connected\");\n }\n return this._bleDevice.connect();\n }\n\n\n /**\n * Disconnect the Hub.\n * @method Hub#disconnect\n * @returns {Promise} Resolved upon successful disconnect.\n */\n public disconnect () {\n return this._bleDevice.disconnect();\n }\n\n\n /**\n * Retrieves the device attached to a given port.\n * @method Hub#getDeviceAtPort\n * @param {string} portName The name of the port to retrieve the device from.\n * @returns {Device | undefined} The device attached to the port.\n */\n public getDeviceAtPort (portName: string) {\n const portId = this._portMap[portName];\n if (portId !== undefined) {\n return this._attachedDevices[portId];\n } else {\n return undefined;\n }\n }\n\n\n /**\n * Retrieves the device attached to a given port, waiting until one is attached if there isn't one.\n *\n * Note: If a device is never attached, the returned promise may never resolve.\n * @method Hub#waitForDeviceAtPort\n * @param {string} portName The name of the port to retrieve the device from.\n * @returns {Promise} Resolved once a device is attached, or resolved immediately if a device is already attached.\n */\n public waitForDeviceAtPort (portName: string) {\n return new Promise((resolve) => {\n const existingDevice = this.getDeviceAtPort(portName);\n if (existingDevice) {\n return resolve(existingDevice);\n }\n this._attachCallbacks.push((device) => {\n if (device.portName === portName) {\n resolve(device);\n return true;\n } else {\n return false;\n }\n });\n });\n }\n\n\n /**\n * Retrieves all attached devices.\n * @method Hub#getDevices\n * @returns {Device[]} Array of all attached devices.\n */\n public getDevices () {\n return Object.values(this._attachedDevices);\n }\n\n\n /**\n * Retrieves an array of devices of the specified type.\n * @method Hub#getDevicesByType\n * @param {number} deviceType The device type to lookup.\n * @returns {Device[]} Array of all devices of the specified type.\n */\n public getDevicesByType (deviceType: number) {\n return this.getDevices().filter((device) => device.type === deviceType);\n }\n\n\n /**\n * Retrieves the first device attached of the specified type, waiting until one is attached if there isn't one.\n *\n * Note: If a device is never attached, the returned promise may never resolve.\n * @method Hub#waitForDeviceByType\n * @param {number} deviceType The device type to lookup.\n * @returns {Promise} Resolved once a device is attached, or resolved immediately if a device is already attached.\n */\n public waitForDeviceByType (deviceType: number) {\n return new Promise((resolve) => {\n const existingDevices = this.getDevicesByType(deviceType);\n if (existingDevices.length >= 1) {\n return resolve(existingDevices[0]);\n }\n this._attachCallbacks.push((device) => {\n if (device.type === deviceType) {\n resolve(device);\n return true;\n } else {\n return false;\n }\n });\n });\n }\n\n\n public getPortNameForPortId (portId: number) {\n for (const port of Object.keys(this._portMap)) {\n if (this._portMap[port] === portId) {\n return port;\n }\n }\n return;\n }\n\n\n public isPortVirtual (portId: number) {\n return (this._virtualPorts.indexOf(portId) > -1);\n }\n\n\n /**\n * Sleep a given amount of time.\n *\n * Note: This is a helper method to make it easier to add delays into a chain of commands.\n * @method Hub#sleep\n * @param {number} delay How long to sleep (in milliseconds).\n * @returns {Promise} Resolved after the delay is finished.\n */\n public sleep (delay: number) {\n return new Promise((resolve) => {\n global.setTimeout(resolve, delay);\n });\n }\n\n\n /**\n * Wait until a given list of concurrently running commands are complete.\n *\n * Note: This is a helper method to make it easier to wait for concurrent commands to complete.\n * @method Hub#wait\n * @param {Array<Promise<any>>} commands Array of executing commands.\n * @returns {Promise} Resolved after the commands are finished.\n */\n public wait (commands: Promise<any>[]) {\n return Promise.all(commands);\n }\n\n\n public send (message: Buffer, uuid: string) {\n return Promise.resolve();\n }\n\n\n public subscribe (portId: number, deviceType: number, mode: number) {\n // NK Do nothing here\n }\n\n\n public unsubscribe (portId: number, deviceType: number, mode: number) {\n // NK Do nothing here\n }\n\n\n public manuallyAttachDevice(deviceType: number, portId: number) {\n if (!this._attachedDevices[portId]) {\n debug(`No device attached to portId ${portId}, creating and attaching device type ${deviceType}`);\n const device = this._createDevice(deviceType, portId);\n this._attachDevice(device);\n return device;\n } else {\n if (this._attachedDevices[portId].type === deviceType) {\n debug(`Device of ${deviceType} already attached to portId ${portId}, returning existing device`);\n return this._attachedDevices[portId];\n } else {\n throw new Error(`Already a different type of device attached to portId ${portId}. Only use this method when you are certain what's attached.`);\n }\n }\n }\n\n\n protected _attachDevice (device: Device) {\n if (this._attachedDevices[device.portId] && this._attachedDevices[device.portId].type === device.type) {\n return;\n }\n this._attachedDevices[device.portId] = device;\n\n /**\n * Emits when a device is attached to the Hub.\n * @event Hub#attach\n * @param {Device} device\n */\n this.emit(\"attach\", device);\n debug(`Attached device type ${device.type} (${Consts.DeviceTypeNames[device.type]}) on port ${device.portName} (${device.portId})`);\n\n let i = this._attachCallbacks.length;\n while (i--) {\n const callback = this._attachCallbacks[i];\n if (callback(device)) {\n this._attachCallbacks.splice(i, 1);\n }\n }\n }\n\n\n protected _detachDevice (device: Device) {\n delete this._attachedDevices[device.portId];\n /**\n * Emits when a device is detached from the Hub.\n * @event Hub#detach\n * @param {Device} device\n */\n this.emit(\"detach\", device);\n debug(`Detached device type ${device.type} (${Consts.DeviceTypeNames[device.type]}) on port ${device.portName} (${device.portId})`);\n }\n\n\n protected _createDevice (deviceType: number, portId: number) {\n let constructor;\n\n // NK TODO: This needs to go in a better place\n const deviceConstructors: {[type: number]: typeof Device} = {\n [Consts.DeviceType.LIGHT]: Light,\n [Consts.DeviceType.TRAIN_MOTOR]: TrainMotor,\n [Consts.DeviceType.SIMPLE_MEDIUM_LINEAR_MOTOR]: SimpleMediumLinearMotor,\n [Consts.DeviceType.MOVE_HUB_MEDIUM_LINEAR_MOTOR]: MoveHubMediumLinearMotor,\n [Consts.DeviceType.MOTION_SENSOR]: MotionSensor,\n [Consts.DeviceType.TILT_SENSOR]: TiltSensor,\n [Consts.DeviceType.MOVE_HUB_TILT_SENSOR]: MoveHubTiltSensor,\n [Consts.DeviceType.PIEZO_BUZZER]: PiezoBuzzer,\n [Consts.DeviceType.TECHNIC_COLOR_SENSOR]: TechnicColorSensor,\n [Consts.DeviceType.TECHNIC_DISTANCE_SENSOR]: TechnicDistanceSensor,\n [Consts.DeviceType.TECHNIC_FORCE_SENSOR]: TechnicForceSensor,\n [Consts.DeviceType.TECHNIC_MEDIUM_HUB_TILT_SENSOR]: TechnicMediumHubTiltSensor,\n [Consts.DeviceType.TECHNIC_MEDIUM_HUB_GYRO_SENSOR]: TechnicMediumHubGyroSensor,\n [Consts.DeviceType.TECHNIC_MEDIUM_HUB_ACCELEROMETER]: TechnicMediumHubAccelerometerSensor,\n [Consts.DeviceType.MEDIUM_LINEAR_MOTOR]: MediumLinearMotor,\n [Consts.DeviceType.TECHNIC_SMALL_ANGULAR_MOTOR]: TechnicSmallAngularMotor,\n [Consts.DeviceType.TECHNIC_MEDIUM_ANGULAR_MOTOR]: TechnicMediumAngularMotor,\n [Consts.DeviceType.TECHNIC_LARGE_ANGULAR_MOTOR]: TechnicLargeAngularMotor,\n [Consts.DeviceType.TECHNIC_LARGE_LINEAR_MOTOR]: TechnicLargeLinearMotor,\n [Consts.DeviceType.TECHNIC_XLARGE_LINEAR_MOTOR]: TechnicXLargeLinearMotor,\n [Consts.DeviceType.COLOR_DISTANCE_SENSOR]: ColorDistanceSensor,\n [Consts.DeviceType.VOLTAGE_SENSOR]: VoltageSensor,\n [Consts.DeviceType.CURRENT_SENSOR]: CurrentSensor,\n [Consts.DeviceType.REMOTE_CONTROL_BUTTON]: RemoteControlButton,\n [Consts.DeviceType.HUB_LED]: HubLED,\n [Consts.DeviceType.DUPLO_TRAIN_BASE_COLOR_SENSOR]: DuploTrainBaseColorSensor,\n [Consts.DeviceType.DUPLO_TRAIN_BASE_MOTOR]: DuploTrainBaseMotor,\n [Consts.DeviceType.DUPLO_TRAIN_BASE_SPEAKER]: DuploTrainBaseSpeaker,\n [Consts.DeviceType.DUPLO_TRAIN_BASE_SPEEDOMETER]: DuploTrainBaseSpeedometer,\n [Consts.DeviceType.MARIO_ACCELEROMETER]: MarioAccelerometer,\n [Consts.DeviceType.MARIO_BARCODE_SENSOR]: MarioBarcodeSensor,\n [Consts.DeviceType.MARIO_PANTS_SENSOR]: MarioPantsSensor,\n [Consts.DeviceType.TECHNIC_MEDIUM_ANGULAR_MOTOR_GREY]: TechnicMediumAngularMotor,\n [Consts.DeviceType.TECHNIC_LARGE_ANGULAR_MOTOR_GREY]: TechnicLargeAngularMotor,\n [Consts.DeviceType.TECHNIC_3X3_COLOR_LIGHT_MATRIX]: Technic3x3ColorLightMatrix,\n };\n\n constructor = deviceConstructors[deviceType as Consts.DeviceType];\n\n if (constructor) {\n return new constructor(this, portId, undefined, deviceType);\n } else {\n return new Device(this, portId, undefined, deviceType);\n }\n\n }\n\n\n protected _getDeviceByPortId (portId: number) {\n return this._attachedDevices[portId];\n }\n\n\n}\n","import { Peripheral } from \"@abandonware/noble\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nimport { IBLEAbstraction } from \"../interfaces\";\nconst debug = Debug(\"duplotrainbase\");\n\n\n/**\n * The DuploTrainBase is emitted if the discovered device is a Duplo Train Base.\n * @class DuploTrainBase\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class DuploTrainBase extends LPF2Hub {\n\n\n public static IsDuploTrainBase (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.DUPLO_TRAIN_BASE_ID\n );\n }\n\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.DUPLO_TRAIN_BASE);\n debug(\"Discovered Duplo Train Base\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Duplo Train Base\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"MOTOR\": 0,\n \"COLOR\": 18,\n \"SPEEDOMETER\": 19\n};\n\n","import { Peripheral } from \"@abandonware/noble\";\nimport { compareVersions } from \"compare-versions\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"hub\");\n\n\n/**\n * The Hub is emitted if the discovered device is a Hub.\n * @class Hub\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class Hub extends LPF2Hub {\n\n\n public static IsHub (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.HUB_ID\n );\n }\n\n protected _currentPort = 0x3b;\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.HUB);\n debug(\"Discovered Powered UP Hub\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Powered UP Hub\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n protected _checkFirmware (version: string) {\n if (compareVersions(\"1.1.00.0004\", version) === 1) {\n throw new Error(`Your Powered Up Hub's (${this.name}) firmware is out of date and unsupported by this library. Please update it via the official Powered Up app.`);\n }\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"A\": 0,\n \"B\": 1,\n \"HUB_LED\": 50,\n \"CURRENT_SENSOR\": 59,\n \"VOLTAGE_SENSOR\": 60\n};\n","import { BaseHub } from \"./basehub\";\n\nimport * as Consts from \"../consts\";\n\nimport { decodeMACAddress, decodeVersion, toBin, toHex } from \"../utils\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"lpf2hub\");\nconst modeInfoDebug = Debug(\"lpf2hubmodeinfo\");\n\n\n/**\n * @class LPF2Hub\n * @extends BaseHub\n */\nexport class LPF2Hub extends BaseHub {\n\n private _messageBuffer: Buffer = Buffer.alloc(0);\n\n private _propertyRequestCallbacks: {[property: number]: ((data: Buffer) => void)} = {};\n\n\n public async connect () {\n debug(\"LPF2Hub connecting\");\n await super.connect();\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.LPF2_HUB);\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.LPF2_ALL, this._parseMessage.bind(this));\n await this._requestHubPropertyReports(Consts.HubPropertyPayload.BUTTON_STATE);\n await this._requestHubPropertyValue(Consts.HubPropertyPayload.FW_VERSION);\n await this._requestHubPropertyValue(Consts.HubPropertyPayload.HW_VERSION);\n await this._requestHubPropertyReports(Consts.HubPropertyPayload.RSSI);\n await this._requestHubPropertyReports(Consts.HubPropertyPayload.BATTERY_VOLTAGE);\n await this._requestHubPropertyValue(Consts.HubPropertyPayload.PRIMARY_MAC_ADDRESS);\n this.emit(\"connect\");\n debug(\"LPF2Hub connected\");\n }\n\n\n /**\n * Shutdown the Hub.\n * @method LPF2Hub#shutdown\n * @returns {Promise} Resolved upon successful disconnect.\n */\n public shutdown () {\n return this.send(Buffer.from([0x02, 0x01]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n /**\n * Set the name of the Hub.\n * @method LPF2Hub#setName\n * @param {string} name New name of the hub (14 characters or less, ASCII only).\n * @returns {Promise} Resolved upon successful issuance of command.\n */\n public async setName (name: string) {\n if (name.length > 14) {\n throw new Error(\"Name must be 14 characters or less\");\n }\n let data = Buffer.from([0x01, 0x01, 0x01]);\n data = Buffer.concat([data, Buffer.from(name, \"ascii\")]);\n // Send this twice, as sometimes the first time doesn't take\n await this.send(data, Consts.BLECharacteristic.LPF2_ALL);\n await this.send(data, Consts.BLECharacteristic.LPF2_ALL);\n this._name = name;\n }\n\n\n public send (message: Buffer, uuid: string) {\n message = Buffer.concat([Buffer.alloc(2), message]);\n message[0] = message.length;\n debug(\"Sent Message (LPF2_ALL)\", message);\n return this._bleDevice.writeToCharacteristic(uuid, message);\n }\n\n\n public subscribe (portId: number, deviceType: number, mode: number) {\n return this.send(Buffer.from([0x41, portId, mode, 0x01, 0x00, 0x00, 0x00, 0x01]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n public unsubscribe (portId: number, mode: number) {\n return this.send(Buffer.from([0x41, portId, mode, 0x01, 0x00, 0x00, 0x00, 0x00]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n /**\n * Combines two ports with into a single virtual port.\n *\n * Note: The devices attached to the ports must be of the same device type.\n * @method LPF2Hub#createVirtualPort\n * @param {string} firstPortName First port name\n * @param {string} secondPortName Second port name\n * @returns {Promise} Resolved upon successful issuance of command.\n */\n public createVirtualPort (firstPortName: string, secondPortName: string) {\n const firstDevice = this.getDeviceAtPort(firstPortName);\n if (!firstDevice) {\n throw new Error(`Port ${firstPortName} does not have an attached device`);\n }\n const secondDevice = this.getDeviceAtPort(secondPortName);\n if (!secondDevice) {\n throw new Error(`Port ${secondPortName} does not have an attached device`);\n }\n if (firstDevice.type !== secondDevice.type) {\n throw new Error(`Both devices must be of the same type to create a virtual port`);\n }\n return this.send(Buffer.from([0x61, 0x01, firstDevice.portId, secondDevice.portId]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n protected _checkFirmware (version: string) {\n return;\n }\n\n\n private _parseMessage (data?: Buffer) {\n\n if (data) {\n this._messageBuffer = Buffer.concat([this._messageBuffer, data]);\n }\n\n if (this._messageBuffer.length <= 0) {\n return;\n }\n\n const len = this._messageBuffer[0];\n if (len <= this._messageBuffer.length) {\n\n const message = this._messageBuffer.slice(0, len);\n this._messageBuffer = this._messageBuffer.slice(len);\n\n debug(\"Received Message (LPF2_ALL)\", message);\n\n switch (message[2]) {\n case Consts.MessageType.HUB_PROPERTIES: {\n const property = message[3];\n const callback = this._propertyRequestCallbacks[property];\n if (callback) {\n callback(message);\n } else {\n this._parseHubPropertyResponse(message);\n }\n delete this._propertyRequestCallbacks[property];\n break;\n }\n case Consts.MessageType.HUB_ATTACHED_IO: {\n this._parsePortMessage(message);\n break;\n }\n case Consts.MessageType.PORT_INFORMATION: {\n this._parsePortInformationResponse(message);\n break;\n }\n case Consts.MessageType.PORT_MODE_INFORMATION: {\n this._parseModeInformationResponse(message);\n break;\n }\n case Consts.MessageType.PORT_VALUE_SINGLE: {\n this._parseSensorMessage(message);\n break;\n }\n case Consts.MessageType.PORT_OUTPUT_COMMAND_FEEDBACK: {\n this._parsePortAction(message);\n break;\n }\n }\n\n if (this._messageBuffer.length > 0) {\n this._parseMessage();\n }\n\n }\n }\n\n\n private _requestHubPropertyValue (property: number) {\n return new Promise<void>((resolve) => {\n this._propertyRequestCallbacks[property] = (message) => {\n this._parseHubPropertyResponse(message);\n return resolve();\n };\n this.send(Buffer.from([0x01, property, 0x05]), Consts.BLECharacteristic.LPF2_ALL);\n });\n }\n\n\n private _requestHubPropertyReports (property: number) {\n return this.send(Buffer.from([0x01, property, 0x02]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n private _parseHubPropertyResponse (message: Buffer) {\n if (message[3] === Consts.HubPropertyPayload.BUTTON_STATE) {\n if (message[5] === 1) {\n /**\n * Emits when a button is pressed.\n * @event LPF2Hub#button\n * @param {string} button\n * @param {ButtonState} state\n */\n this.emit(\"button\", { event: Consts.ButtonState.PRESSED });\n return;\n } else if (message[5] === 0) {\n this.emit(\"button\", { event: Consts.ButtonState.RELEASED });\n return;\n }\n\n } else if (message[3] === Consts.HubPropertyPayload.FW_VERSION) {\n this._firmwareVersion = decodeVersion(message.readInt32LE(5));\n this._checkFirmware(this._firmwareVersion);\n\n } else if (message[3] === Consts.HubPropertyPayload.HW_VERSION) {\n this._hardwareVersion = decodeVersion(message.readInt32LE(5));\n\n } else if (message[3] === Consts.HubPropertyPayload.RSSI) {\n const rssi = message.readInt8(5);\n if (rssi !== 0) {\n this._rssi = rssi;\n this.emit(\"rssi\", { rssi: this._rssi });\n }\n\n } else if (message[3] === Consts.HubPropertyPayload.PRIMARY_MAC_ADDRESS) {\n this._primaryMACAddress = decodeMACAddress(message.slice(5));\n\n } else if (message[3] === Consts.HubPropertyPayload.BATTERY_VOLTAGE) {\n const batteryLevel = message[5];\n if (batteryLevel !== this._batteryLevel) {\n this._batteryLevel = batteryLevel;\n this.emit(\"batteryLevel\", { batteryLevel });\n }\n }\n\n }\n\n private async _parsePortMessage (message: Buffer) {\n\n const portId = message[3];\n const event = message[4];\n const deviceType = event ? message.readUInt16LE(5) : 0;\n\n if (event === Consts.Event.ATTACHED_IO) {\n\n if (modeInfoDebug.enabled) {\n const deviceTypeName = Consts.DeviceTypeNames[message[5]] || \"Unknown\";\n modeInfoDebug(`Port ${toHex(portId)}, type ${toHex(deviceType, 4)} (${deviceTypeName})`);\n const hwVersion = decodeVersion(message.readInt32LE(7));\n const swVersion = decodeVersion(message.readInt32LE(11));\n modeInfoDebug(`Port ${toHex(portId)}, hardware version ${hwVersion}, software version ${swVersion}`);\n await this._sendPortInformationRequest(portId);\n }\n\n const device = this._createDevice(deviceType, portId);\n this._attachDevice(device);\n\n } else if (event === Consts.Event.DETACHED_IO) {\n const device = this._getDeviceByPortId(portId);\n if (device) {\n this._detachDevice(device);\n if (this.isPortVirtual(portId)) {\n const portName = this.getPortNameForPortId(portId);\n if (portName) {\n delete this._portMap[portName];\n }\n this._virtualPorts = this._virtualPorts.filter((virtualPortId) => virtualPortId !== portId);\n }\n }\n\n } else if (event === Consts.Event.ATTACHED_VIRTUAL_IO) {\n const firstPortName = this.getPortNameForPortId(message[7]);\n const secondPortName = this.getPortNameForPortId(message[8]);\n // @ts-ignore NK These should never be undefined\n const virtualPortName = firstPortName + secondPortName;\n const virtualPortId = message[3];\n this._portMap[virtualPortName] = virtualPortId;\n this._virtualPorts.push(virtualPortId);\n const device = this._createDevice(deviceType, virtualPortId);\n this._attachDevice(device);\n }\n\n }\n\n\n private async _sendPortInformationRequest (port: number) {\n await this.send(Buffer.from([0x21, port, 0x01]), Consts.BLECharacteristic.LPF2_ALL);\n await this.send(Buffer.from([0x21, port, 0x02]), Consts.BLECharacteristic.LPF2_ALL); // Mode combinations\n }\n\n\n private async _parsePortInformationResponse (message: Buffer) {\n const port = message[3];\n if (message[4] === 2) {\n const modeCombinationMasks: number[] = [];\n for (let i = 5; i < message.length; i += 2) {\n modeCombinationMasks.push(message.readUInt16LE(i));\n }\n modeInfoDebug(`Port ${toHex(port)}, mode combinations [${modeCombinationMasks.map((c) => toBin(c, 0)).join(\", \")}]`);\n return;\n }\n const count = message[6];\n const input = toBin(message.readUInt16LE(7), count);\n const output = toBin(message.readUInt16LE(9), count);\n modeInfoDebug(`Port ${toHex(port)}, total modes ${count}, input modes ${input}, output modes ${output}`);\n\n for (let i = 0; i < count; i++) {\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.NAME);\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.RAW);\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.PCT);\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.SI);\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.SYMBOL);\n await this._sendModeInformationRequest(port, i, Consts.ModeInformationType.VALUE_FORMAT);\n }\n }\n\n\n private _sendModeInformationRequest (port: number, mode: number, type: number) {\n return this.send(Buffer.from([0x22, port, mode, type]), Consts.BLECharacteristic.LPF2_ALL);\n }\n\n\n private _parseModeInformationResponse (message: Buffer) {\n const port = toHex(message[3]);\n const mode = message[4];\n const type = message[5];\n switch (type) {\n case Consts.ModeInformationType.NAME:\n modeInfoDebug(`Port ${port}, mode ${mode}, name ${message.slice(6, message.length).toString()}`);\n break;\n case Consts.ModeInformationType.RAW:\n modeInfoDebug(`Port ${port}, mode ${mode}, RAW min ${message.readFloatLE(6)}, max ${message.readFloatLE(10)}`);\n break;\n case Consts.ModeInformationType.PCT:\n modeInfoDebug(`Port ${port}, mode ${mode}, PCT min ${message.readFloatLE(6)}, max ${message.readFloatLE(10)}`);\n break;\n case Consts.ModeInformationType.SI:\n modeInfoDebug(`Port ${port}, mode ${mode}, SI min ${message.readFloatLE(6)}, max ${message.readFloatLE(10)}`);\n break;\n case Consts.ModeInformationType.SYMBOL:\n modeInfoDebug(`Port ${port}, mode ${mode}, SI symbol ${message.slice(6, message.length).toString()}`);\n break;\n case Consts.ModeInformationType.VALUE_FORMAT:\n const numValues = message[6];\n const dataType = [\"8bit\", \"16bit\", \"32bit\", \"float\"][message[7]];\n const totalFigures = message[8];\n const decimals = message[9];\n modeInfoDebug(`Port ${port}, mode ${mode}, Value ${numValues} x ${dataType}, Decimal format ${totalFigures}.${decimals}`);\n }\n }\n\n\n private _parsePortAction (message: Buffer) {\n for (let offset = 3; offset < message.length; offset += 2) {\n const device = this._getDeviceByPortId(message[offset]);\n\n if (device) {\n device.finish(message[offset+1]);\n }\n }\n }\n\n\n private _parseSensorMessage (message: Buffer) {\n\n const portId = message[3];\n const device = this._getDeviceByPortId(portId);\n\n if (device) {\n device.receive(message);\n }\n\n }\n\n\n}\n","import { Peripheral } from \"@abandonware/noble\";\nimport compareVersion from \"compare-versions\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"movehub\");\n\n\n/**\n * Mario is emitted if the discovered device is a LEGO Super Mario brick.\n * @class Mario\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class Mario extends LPF2Hub {\n\n\n public static IsMario (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.MARIO_ID\n );\n }\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.MARIO);\n debug(\"Discovered Mario\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Mario\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n};\n","import { Peripheral } from \"@abandonware/noble\";\nimport { compareVersions } from \"compare-versions\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"movehub\");\n\n\n/**\n * The MoveHub is emitted if the discovered device is a Move Hub.\n * @class MoveHub\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class MoveHub extends LPF2Hub {\n\n\n public static IsMoveHub (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.MOVE_HUB_ID\n );\n }\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.MOVE_HUB);\n debug(\"Discovered Move Hub\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Move Hub\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n protected _checkFirmware (version: string) {\n if (compareVersions(\"2.0.00.0017\", version) === 1) {\n throw new Error(`Your Move Hub's (${this.name}) firmware is out of date and unsupported by this library. Please update it via the official Powered Up app.`);\n }\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"A\": 0,\n \"B\": 1,\n \"C\": 2,\n \"D\": 3,\n \"HUB_LED\": 50,\n \"TILT_SENSOR\": 58,\n \"CURRENT_SENSOR\": 59,\n \"VOLTAGE_SENSOR\": 60\n};\n","import { Peripheral } from \"@abandonware/noble\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"remotecontrol\");\n\n\n/**\n * The RemoteControl is emitted if the discovered device is a Remote Control.\n * @class RemoteControl\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class RemoteControl extends LPF2Hub {\n\n\n public static IsRemoteControl (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.REMOTE_CONTROL_ID\n );\n }\n\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.REMOTE_CONTROL);\n debug(\"Discovered Powered UP Remote\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Powered UP Remote\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"LEFT\": 0,\n \"RIGHT\": 1,\n \"HUB_LED\": 52,\n \"VOLTAGE_SENSOR\": 59,\n \"REMOTE_CONTROL_RSSI\": 60\n};\n","import { Peripheral } from \"@abandonware/noble\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"technicmediumhub\");\n\n\n/**\n * The TechnicMediumHub is emitted if the discovered device is a Technic Medium Hub.\n * @class TechnicMediumHub\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class TechnicMediumHub extends LPF2Hub {\n\n\n public static IsTechnicMediumHub (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.TECHNIC_MEDIUM_HUB_ID\n );\n }\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.TECHNIC_MEDIUM_HUB);\n debug(\"Discovered Control+ Hub\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Control+ Hub\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"A\": 0,\n \"B\": 1,\n \"C\": 2,\n \"D\": 3,\n \"HUB_LED\": 50,\n \"CURRENT_SENSOR\": 59,\n \"VOLTAGE_SENSOR\": 60,\n \"ACCELEROMETER\": 97,\n \"GYRO_SENSOR\": 98,\n \"TILT_SENSOR\": 99\n};\n","import { Peripheral } from \"@abandonware/noble\";\nimport compareVersion from \"compare-versions\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { LPF2Hub } from \"./lpf2hub\";\n\nimport * as Consts from \"../consts\";\n\nimport Debug = require(\"debug\");\nconst debug = Debug(\"hub\");\n\n\n/**\n * The TechnicSmallHub is emitted if the discovered device is a Technic Small Hub.\n * @class Hub\n * @extends LPF2Hub\n * @extends BaseHub\n */\nexport class TechnicSmallHub extends LPF2Hub {\n\n\n public static IsTechnicSmallHub (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, \"\")) >= 0 &&\n peripheral.advertisement.manufacturerData &&\n peripheral.advertisement.manufacturerData.length > 3 &&\n peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.TECHNIC_SMALL_HUB_ID\n );\n }\n\n protected _currentPort = 0x3b;\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.TECHNIC_SMALL_HUB);\n debug(\"Discovered Spike Essential Hub\");\n }\n\n\n public async connect () {\n debug(\"Connecting to Spike Essential Hub\");\n await super.connect();\n debug(\"Connect completed\");\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"A\": 0,\n \"B\": 1,\n \"HUB_LED\": 49,\n \"CURRENT_SENSOR\": 59,\n \"VOLTAGE_SENSOR\": 60,\n \"ACCELEROMETER\": 97,\n \"GYRO_SENSOR\": 98,\n \"TILT_SENSOR\": 99\n};\n","import { Peripheral } from \"@abandonware/noble\";\n\nimport { IBLEAbstraction } from \"../interfaces\";\n\nimport { BaseHub } from \"./basehub\";\n\nimport * as Consts from \"../consts\";\n\nimport { isWebBluetooth } from \"../utils\";\n\nimport Debug = require(\"debug\");\nimport { HubLED } from \"../devices/hubled\";\nconst debug = Debug(\"wedo2smarthub\");\n\n\n/**\n * The WeDo2SmartHub is emitted if the discovered device is a WeDo 2.0 Smart Hub.\n * @class WeDo2SmartHub\n * @extends BaseHub\n */\nexport class WeDo2SmartHub extends BaseHub {\n\n\n public static IsWeDo2SmartHub (peripheral: Peripheral) {\n return (\n peripheral.advertisement &&\n peripheral.advertisement.serviceUuids &&\n peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.WEDO2_SMART_HUB.replace(/-/g, \"\")) >= 0\n );\n }\n\n\n private _lastTiltX: number = 0;\n private _lastTiltY: number = 0;\n\n\n constructor (device: IBLEAbstraction) {\n super(device, PortMap, Consts.HubType.WEDO2_SMART_HUB);\n debug(\"Discovered WeDo 2.0 Smart Hub\");\n }\n\n\n public connect () {\n return new Promise<void>(async (resolve) => {\n debug(\"Connecting to WeDo 2.0 Smart Hub\");\n await super.connect();\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB);\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB_2);\n if (!isWebBluetooth) {\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB_3);\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB_4);\n await this._bleDevice.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB_5);\n } else {\n await this._bleDevice.discoverCharacteristicsForService(\"battery_service\");\n await this._bleDevice.discoverCharacteristicsForService(\"device_information\");\n }\n debug(\"Connect completed\");\n this.emit(\"connect\");\n resolve();\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.WEDO2_PORT_TYPE, this._parsePortMessage.bind(this));\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.WEDO2_SENSOR_VALUE, this._parseSensorMessage.bind(this));\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.WEDO2_BUTTON, this._parseSensorMessage.bind(this));\n if (!isWebBluetooth) {\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.WEDO2_BATTERY, this._parseBatteryMessage.bind(this));\n this._bleDevice.readFromCharacteristic(Consts.BLECharacteristic.WEDO2_BATTERY, (err, data) => {\n if (data) {\n this._parseBatteryMessage(data);\n }\n });\n } else {\n this._bleDevice.readFromCharacteristic(\"00002a19-0000-1000-8000-00805f9b34fb\", (err, data) => {\n if (data) {\n this._parseBatteryMessage(data);\n }\n });\n this._bleDevice.subscribeToCharacteristic(\"00002a19-0000-1000-8000-00805f9b34fb\", this._parseHighCurrentAlert.bind(this));\n }\n this._bleDevice.subscribeToCharacteristic(Consts.BLECharacteristic.WEDO2_HIGH_CURRENT_ALERT, this._parseHighCurrentAlert.bind(this));\n if (!isWebBluetooth) {\n this._bleDevice.readFromCharacteristic(Consts.BLECharacteristic.WEDO2_FIRMWARE_REVISION, (err, data) => {\n if (data) {\n this._parseFirmwareRevisionString(data);\n }\n });\n } else {\n this._bleDevice.readFromCharacteristic(\"00002a26-0000-1000-8000-00805f9b34fb\", (err, data) => {\n if (data) {\n this._parseFirmwareRevisionString(data);\n }\n });\n }\n });\n }\n\n\n /**\n * Shutdown the Hub.\n * @method WeDo2SmartHub#shutdown\n * @returns {Promise} Resolved upon successful disconnect.\n */\n public shutdown () {\n return this.send(Buffer.from([0x00]), Consts.BLECharacteristic.WEDO2_DISCONNECT);\n }\n\n\n /**\n * Set the name of the Hub.\n * @method WeDo2SmartHub#setName\n * @param {string} name New name of the hub (14 characters or less, ASCII only).\n * @returns {Promise} Resolved upon successful issuance of command.\n */\n public setName (name: string) {\n if (name.length > 14) {\n throw new Error(\"Name must be 14 characters or less\");\n }\n return new Promise<void>((resolve) => {\n const data = Buffer.from(name, \"ascii\");\n // Send this twice, as sometimes the first time doesn't take\n this.send(data, Consts.BLECharacteristic.WEDO2_NAME_ID);\n this.send(data, Consts.BLECharacteristic.WEDO2_NAME_ID);\n this._name = name;\n return resolve();\n });\n }\n\n\n public send (message: Buffer, uuid: string) {\n if (debug.enabled) {\n debug(`Sent Message (${this._getCharacteristicNameFromUUID(uuid)})`, message);\n }\n return this._bleDevice.writeToCharacteristic(uuid, message);\n }\n\n\n public subscribe (portId: number, deviceType: number, mode: number) {\n this.send(Buffer.from([0x01, 0x02, portId, deviceType, mode, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01]), Consts.BLECharacteristic.WEDO2_PORT_TYPE_WRITE);\n }\n\n\n public unsubscribe (portId: number, deviceType: number, mode: number) {\n this.send(Buffer.from([0x01, 0x02, portId, deviceType, mode, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00]), Consts.BLECharacteristic.WEDO2_PORT_TYPE_WRITE);\n }\n\n\n private _getCharacteristicNameFromUUID (uuid: string) {\n const keys = Object.keys(Consts.BLECharacteristic);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (Consts.BLECharacteristic[key as keyof typeof Consts.BLECharacteristic] === uuid) {\n return key;\n }\n }\n return \"UNKNOWN\";\n }\n\n\n private _parseHighCurrentAlert (data: Buffer) {\n debug(\"Received Message (WEDO2_HIGH_CURRENT_ALERT)\", data);\n }\n\n\n private _parseBatteryMessage (data: Buffer) {\n debug(\"Received Message (WEDO2_BATTERY)\", data);\n const batteryLevel = data[0];\n if (batteryLevel !== this._batteryLevel) {\n this._batteryLevel = batteryLevel;\n this.emit(\"batteryLevel\", { batteryLevel });\n }\n }\n\n\n private _parseFirmwareRevisionString (data: Buffer) {\n debug(\"Received Message (WEDO2_FIRMWARE_REVISION)\", data);\n this._firmwareVersion = data.toString();\n }\n\n\n private _parsePortMessage (data: Buffer) {\n debug(\"Received Message (WEDO2_PORT_TYPE)\", data);\n\n const portId = data[0];\n const event = data[1];\n const deviceType = event ? data[3] : 0;\n\n if (event === 0x01) {\n const device = this._createDevice(deviceType, portId);\n this._attachDevice(device);\n } else if (event === 0x00) {\n const device = this._getDeviceByPortId(portId);\n if (device) {\n this._detachDevice(device);\n }\n }\n }\n\n\n private _parseSensorMessage (message: Buffer) {\n\n debug(\"Received Message (WEDO2_SENSOR_VALUE)\", message);\n\n if (message[0] === 0x01) {\n /**\n * Emits when a button is pressed.\n * @event WeDo2SmartHub#button\n * @param {string} button\n * @param {ButtonState} state\n */\n this.emit(\"button\", { event: Consts.ButtonState.PRESSED });\n return;\n } else if (message[0] === 0x00) {\n this.emit(\"button\", { event: Consts.ButtonState.RELEASED });\n return;\n }\n\n const portId = message[1];\n const device = this._getDeviceByPortId(portId);\n\n if (device) {\n device.receive(message);\n }\n\n }\n\n\n}\n\nexport const PortMap: {[portName: string]: number} = {\n \"A\": 1,\n \"B\": 2,\n \"CURRENT_SENSOR\": 3,\n \"VOLTAGE_SENSOR\": 4,\n \"PIEZO_BUZZER\": 5,\n \"HUB_LED\": 6\n};\n","import * as Consts from \"./consts\";\n\nimport { PoweredUP } from \"./poweredup-browser\";\nimport { Color } from \"./color\";\n\nimport { BaseHub } from \"./hubs/basehub\";\nimport { DuploTrainBase } from \"./hubs/duplotrainbase\";\nimport { Hub } from \"./hubs/hub\";\nimport { Mario } from \"./hubs/mario\";\nimport { MoveHub } from \"./hubs/movehub\";\nimport { RemoteControl } from \"./hubs/remotecontrol\";\nimport { TechnicMediumHub } from \"./hubs/technicmediumhub\";\nimport { WeDo2SmartHub } from \"./hubs/wedo2smarthub\";\n\nimport { ColorDistanceSensor } from \"./devices/colordistancesensor\";\nimport { CurrentSensor } from \"./devices/currentsensor\";\nimport { Device } from \"./devices/device\";\nimport { DuploTrainBaseColorSensor } from \"./devices/duplotrainbasecolorsensor\";\nimport { DuploTrainBaseMotor } from \"./devices/duplotrainbasemotor\";\nimport { DuploTrainBaseSpeaker } from \"./devices/duplotrainbasespeaker\";\nimport { DuploTrainBaseSpeedometer } from \"./devices/duplotrainbasespeedometer\";\nimport { HubLED } from \"./devices/hubled\";\nimport { Light } from \"./devices/light\";\nimport { MediumLinearMotor } from \"./devices/mediumlinearmotor\";\nimport { MotionSensor } from \"./devices/motionsensor\";\nimport { MoveHubMediumLinearMotor } from \"./devices/movehubmediumlinearmotor\";\nimport { MoveHubTiltSensor } from \"./devices/movehubtiltsensor\";\nimport { PiezoBuzzer } from \"./devices/piezobuzzer\";\nimport { RemoteControlButton } from \"./devices/remotecontrolbutton\";\nimport { SimpleMediumLinearMotor } from \"./devices/simplemediumlinearmotor\";\nimport { TechnicColorSensor } from \"./devices/techniccolorsensor\";\nimport { TechnicDistanceSensor } from \"./devices/technicdistancesensor\";\nimport { TechnicForceSensor } from \"./devices/technicforcesensor\";\nimport { TechnicLargeAngularMotor } from \"./devices/techniclargeangularmotor\";\nimport { TechnicLargeLinearMotor } from \"./devices/techniclargelinearmotor\";\nimport { TechnicSmallAngularMotor } from \"./devices/technicsmallangularmotor\";\nimport { TechnicMediumAngularMotor } from \"./devices/technicmediumangularmotor\";\nimport { TechnicMediumHubAccelerometerSensor } from \"./devices/technicmediumhubaccelerometersensor\";\nimport { TechnicMediumHubGyroSensor } from \"./devices/technicmediumhubgyrosensor\";\nimport { TechnicMediumHubTiltSensor } from \"./devices/technicmediumhubtiltsensor\";\nimport { TechnicXLargeLinearMotor } from \"./devices/technicxlargelinearmotor\";\nimport { Technic3x3ColorLightMatrix } from \"./devices/technic3x3colorlightmatrix\";\nimport { TiltSensor } from \"./devices/tiltsensor\";\nimport { TrainMotor } from \"./devices/trainmotor\";\nimport { VoltageSensor } from \"./devices/voltagesensor\";\nimport { TachoMotor } from \"./devices/tachomotor\";\nimport { AbsoluteMotor } from \"./devices/absolutemotor\";\nimport { BasicMotor } from \"./devices/basicmotor\";\n\nimport { isWebBluetooth } from \"./utils\";\n\n// @ts-ignore\nwindow.PoweredUP = {\n PoweredUP,\n BaseHub,\n WeDo2SmartHub,\n TechnicMediumHub,\n Hub,\n RemoteControl,\n DuploTrainBase,\n Consts,\n Color,\n ColorDistanceSensor,\n Device,\n DuploTrainBaseColorSensor,\n DuploTrainBaseMotor,\n DuploTrainBaseSpeaker,\n DuploTrainBaseSpeedometer,\n HubLED,\n Light,\n Mario,\n MediumLinearMotor,\n MotionSensor,\n MoveHub,\n MoveHubMediumLinearMotor,\n MoveHubTiltSensor,\n PiezoBuzzer,\n RemoteControlButton,\n SimpleMediumLinearMotor,\n TechnicColorSensor,\n TechnicDistanceSensor,\n TechnicForceSensor,\n TechnicMediumHubAccelerometerSensor,\n TechnicMediumHubGyroSensor,\n TechnicMediumHubTiltSensor,\n TechnicSmallAngularMotor,\n TechnicMediumAngularMotor,\n TechnicLargeAngularMotor,\n TechnicLargeLinearMotor,\n TechnicXLargeLinearMotor,\n Technic3x3ColorLightMatrix,\n TiltSensor,\n TrainMotor,\n VoltageSensor,\n CurrentSensor,\n TachoMotor,\n AbsoluteMotor,\n BasicMotor,\n isWebBluetooth\n};\n\n","import { WebBLEDevice } from \"./webbleabstraction\";\n\nimport { BaseHub } from \"./hubs/basehub\";\nimport { DuploTrainBase } from \"./hubs/duplotrainbase\";\nimport { Hub } from \"./hubs/hub\";\nimport { Mario } from \"./hubs/mario\";\nimport { MoveHub } from \"./hubs/movehub\";\nimport { RemoteControl } from \"./hubs/remotecontrol\";\nimport { TechnicMediumHub } from \"./hubs/technicmediumhub\";\nimport { WeDo2SmartHub } from \"./hubs/wedo2smarthub\";\n\nimport * as Consts from \"./consts\";\n\nimport { EventEmitter } from \"events\";\n\nimport Debug = require(\"debug\");\nimport { IBLEAbstraction } from \"./interfaces\";\nimport { TechnicSmallHub } from \"./hubs/technicsmallhub\";\nconst debug = Debug(\"poweredup\");\n\n\n/**\n * @class PoweredUP\n * @extends EventEmitter\n */\nexport class PoweredUP extends EventEmitter {\n\n\n private _connectedHubs: {[uuid: string]: BaseHub} = {};\n\n\n constructor () {\n super();\n this._discoveryEventHandler = this._discoveryEventHandler.bind(this);\n }\n\n\n /**\n * Begin scanning for Powered UP Hub devices.\n * @method PoweredUP#scan\n */\n public async scan () {\n\n try {\n\n const device = await navigator.bluetooth.requestDevice({\n filters: [\n {\n services: [\n Consts.BLEService.WEDO2_SMART_HUB\n ]\n },\n {\n services: [\n Consts.BLEService.LPF2_HUB\n ]\n }\n ],\n optionalServices: [\n Consts.BLEService.WEDO2_SMART_HUB_2,\n \"battery_service\",\n \"device_information\"\n ]\n });\n\n // @ts-ignore\n const server = await device.gatt.connect();\n this._discoveryEventHandler.call(this, server);\n return true;\n\n } catch (err) {\n return false;\n }\n\n }\n\n\n /**\n * Retrieve a list of Powered UP Hubs.\n * @method PoweredUP#getHubs\n * @returns {BaseHub[]}\n */\n public getHubs () {\n return Object.values(this._connectedHubs);\n }\n\n\n /**\n * Retrieve a Powered UP Hub by UUID.\n * @method PoweredUP#getHubByUUID\n * @param {string} uuid\n * @returns {BaseHub | null}\n */\n public getHubByUUID (uuid: string) {\n return this._connectedHubs[uuid];\n }\n\n\n /**\n * Retrieve a Powered UP Hub by primary MAC address.\n * @method PoweredUP#getHubByPrimaryMACAddress\n * @param {string} address\n * @returns {BaseHub}\n */\n public getHubByPrimaryMACAddress (address: string) {\n return Object.values(this._connectedHubs).filter((hub) => hub.primaryMACAddress === address)[0];\n }\n\n\n /**\n * Retrieve a list of Powered UP Hub by name.\n * @method PoweredUP#getHubsByName\n * @param {string} name\n * @returns {BaseHub[]}\n */\n public getHubsByName (name: string) {\n return Object.values(this._connectedHubs).filter((hub) => hub.name === name);\n }\n\n\n /**\n * Retrieve a list of Powered UP Hub by type.\n * @method PoweredUP#getHubsByType\n * @param {string} name\n * @returns {BaseHub[]}\n */\n public getHubsByType (hubType: number) {\n return Object.values(this._connectedHubs).filter((hub) => hub.type === hubType);\n }\n\n\n private _determineLPF2HubType (device: IBLEAbstraction): Promise<Consts.HubType> {\n return new Promise(async (resolve) => {\n let buf: Buffer = Buffer.alloc(0);\n await device.subscribeToCharacteristic(Consts.BLECharacteristic.LPF2_ALL, (data: Buffer) => {\n buf = Buffer.concat([buf, data]);\n while (buf[0] <= buf.length) {\n const len = buf[0];\n const message = buf.slice(0, len);\n buf = buf.slice(len);\n if (message[2] === 0x01 && message[3] === 0x0b) {\n switch (message[5]) {\n case Consts.BLEManufacturerData.REMOTE_CONTROL_ID:\n resolve(Consts.HubType.REMOTE_CONTROL);\n break;\n case Consts.BLEManufacturerData.MOVE_HUB_ID:\n resolve(Consts.HubType.MOVE_HUB);\n break;\n case Consts.BLEManufacturerData.HUB_ID:\n resolve(Consts.HubType.HUB);\n break;\n case Consts.BLEManufacturerData.DUPLO_TRAIN_BASE_ID:\n resolve(Consts.HubType.DUPLO_TRAIN_BASE);\n break;\n case Consts.BLEManufacturerData.TECHNIC_SMALL_HUB_ID:\n resolve(Consts.HubType.TECHNIC_SMALL_HUB);\n break;\n case Consts.BLEManufacturerData.TECHNIC_MEDIUM_HUB_ID:\n resolve(Consts.HubType.TECHNIC_MEDIUM_HUB);\n break;\n case Consts.BLEManufacturerData.MARIO_ID:\n resolve(Consts.HubType.MARIO);\n break;\n }\n debug(\"Hub type determined\");\n } else {\n debug(\"Stashed in mailbox (LPF2_ALL)\", message);\n device.addToCharacteristicMailbox(Consts.BLECharacteristic.LPF2_ALL, message);\n }\n }\n });\n device.writeToCharacteristic(Consts.BLECharacteristic.LPF2_ALL, Buffer.from([0x05, 0x00, 0x01, 0x0b, 0x05]));\n });\n }\n\n\n private async _discoveryEventHandler (server: BluetoothRemoteGATTServer) {\n\n const device = new WebBLEDevice(server);\n\n let hub: BaseHub;\n\n let hubType = Consts.HubType.UNKNOWN;\n let isLPF2Hub = false;\n try {\n await device.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB);\n hubType = Consts.HubType.WEDO2_SMART_HUB;\n // tslint:disable-next-line\n } catch (error) {}\n try {\n if (hubType !== Consts.HubType.WEDO2_SMART_HUB) {\n await device.discoverCharacteristicsForService(Consts.BLEService.LPF2_HUB);\n isLPF2Hub = true;\n }\n // tslint:disable-next-line\n } catch (error) {}\n\n if (isLPF2Hub) {\n hubType = await this._determineLPF2HubType(device);\n }\n\n switch (hubType) {\n case Consts.HubType.WEDO2_SMART_HUB:\n hub = new WeDo2SmartHub(device);\n break;\n case Consts.HubType.MOVE_HUB:\n hub = new MoveHub(device);\n break;\n case Consts.HubType.HUB:\n hub = new Hub(device);\n break;\n case Consts.HubType.REMOTE_CONTROL:\n hub = new RemoteControl(device);\n break;\n case Consts.HubType.DUPLO_TRAIN_BASE:\n hub = new DuploTrainBase(device);\n break;\n case Consts.HubType.TECHNIC_SMALL_HUB:\n hub = new TechnicSmallHub(device);\n break;\n case Consts.HubType.TECHNIC_MEDIUM_HUB:\n hub = new TechnicMediumHub(device);\n break;\n case Consts.HubType.MARIO:\n hub = new Mario(device);\n break;\n default:\n return;\n }\n\n device.on(\"discoverComplete\", () => {\n\n hub.on(\"connect\", () => {\n debug(`Hub ${hub.uuid} connected`);\n this._connectedHubs[hub.uuid] = hub;\n });\n\n hub.on(\"disconnect\", () => {\n debug(`Hub ${hub.uuid} disconnected`);\n delete this._connectedHubs[hub.uuid];\n });\n\n debug(`Hub ${hub.uuid} discovered`);\n\n /**\n * Emits when a Powered UP Hub device is found.\n * @event PoweredUP#discover\n * @param {WeDo2SmartHub | MoveHub | TechnicMediumHub | RemoteControl | DuploTrainBase} hub\n */\n this.emit(\"discover\", hub);\n\n });\n\n }\n\n}\n","import { EventEmitter } from \"events\";\nimport { Device } from \"./devices/device\";\n\n// @ts-ignore\nexport const isWebBluetooth = !!(typeof navigator !== \"undefined\" && navigator && navigator.bluetooth);\n\nexport const toHex = (value: number, length: number = 2) => {\n return value.toString(16).padStart(length, \"0\");\n};\n\nexport const toBin = (value: number, length: number = 8) => {\n return value.toString(2).padStart(length, \"0\");\n};\n\nexport const mapSpeed = (speed: number) => {\n if (speed === 127) {\n return 127;\n }\n if (speed > 100) {\n speed = 100;\n } else if (speed < -100) {\n speed = -100;\n }\n return speed;\n};\n\nexport const decodeVersion = (version: number) => {\n const parts = version.toString(16).padStart(8, \"0\");\n return [parts[0], parts[1], parts.substring(2, 4), parts.substring(4)].join(\".\");\n};\n\nexport const decodeMACAddress = (address: Uint8Array) => {\n return Array.from(address).map((part) => toHex(part, 2)).join(\":\");\n};\n\nexport const normalizeAngle = (angle: number) => {\n if (angle >= 180) {\n return angle - (360 * ((angle + 180) / 360));\n } else if (angle < -180) {\n return angle + (360 * ((180 - angle) / 360));\n }\n return angle;\n};\n\nexport const roundAngleToNearest90 = (angle: number) => {\n angle = normalizeAngle(angle);\n if (angle < -135) {\n return -180;\n }\n if (angle < -45) {\n return -90;\n }\n if (angle < 45) {\n return 0;\n }\n if (angle < 135) {\n return 90;\n }\n return -180;\n};\n\nexport const calculateRamp = (device: Device, fromPower: number, toPower: number, time: number) => {\n const emitter = new EventEmitter();\n const steps = Math.abs(toPower - fromPower);\n let delay = time / steps;\n let increment = 1;\n if (delay < 50 && steps > 0) {\n increment = 50 / delay;\n delay = 50;\n }\n if (fromPower > toPower) {\n increment = -increment;\n }\n let i = 0;\n const interval = setInterval(() => {\n let power = Math.round(fromPower + (++i * increment));\n if (toPower > fromPower && power > toPower) {\n power = toPower;\n } else if (fromPower > toPower && power < toPower) {\n power = toPower;\n }\n emitter.emit(\"changePower\", power);\n if (power === toPower) {\n clearInterval(interval);\n emitter.emit(\"finished\");\n }\n }, delay);\n device.setEventTimer(interval);\n return emitter;\n};\n\nexport const parseColor = (color: number) => {\n if (color === 1 || color === 5) {\n color = color + 1;\n }\n return color;\n}","import Debug = require(\"debug\");\nimport { EventEmitter } from \"events\";\nimport { IBLEAbstraction } from \"./interfaces\";\nconst debug = Debug(\"bledevice\");\n\n\nexport class WebBLEDevice extends EventEmitter implements IBLEAbstraction {\n\n private _webBLEServer: any;\n\n private _uuid: string;\n private _name: string = \"\";\n\n private _listeners: {[uuid: string]: any} = {};\n private _characteristics: {[uuid: string]: any} = {};\n\n private _queue: Promise<void> = Promise.resolve();\n private _mailbox: Buffer[] = [];\n\n private _connected: boolean = false;\n private _connecting: boolean = false;\n\n\n constructor (device: any) {\n super();\n this._webBLEServer = device;\n this._uuid = device.device.id;\n this._name = device.device.name;\n device.device.addEventListener(\"gattserverdisconnected\", () => {\n this._connecting = false;\n this._connected = false;\n this.emit(\"disconnect\");\n });\n setTimeout(() => {\n this.emit(\"discoverComplete\");\n }, 2000);\n }\n\n\n public get uuid () {\n return this._uuid;\n }\n\n\n public get name () {\n return this._name;\n }\n\n\n public get connecting () {\n return this._connecting;\n }\n\n\n public get connected () {\n return this._connected;\n }\n\n\n public connect () {\n return new Promise<void>((resolve) => {\n this._connected = true;\n return resolve();\n });\n }\n\n\n public disconnect () {\n return new Promise<void>((resolve) => {\n this._webBLEServer.device.gatt.disconnect();\n this._connected = false;\n return resolve();\n });\n }\n\n\n public async discoverCharacteristicsForService (uuid: string) {\n debug(\"Service/characteristic discovery started\");\n const service = await this._webBLEServer.getPrimaryService(uuid);\n const characteristics = await service.getCharacteristics();\n for (const characteristic of characteristics) {\n this._characteristics[characteristic.uuid] = characteristic;\n }\n debug(\"Service/characteristic discovery finished\");\n }\n\n\n public subscribeToCharacteristic (uuid: string, callback: (data: Buffer) => void): Promise<any> {\n if (this._listeners[uuid]) {\n this._characteristics[uuid].removeEventListener(\"characteristicvaluechanged\", this._listeners[uuid]);\n }\n // @ts-ignore\n this._listeners[uuid] = (event) => {\n const buf = Buffer.alloc(event.target.value.buffer.byteLength);\n const view = new Uint8Array(event.target.value.buffer);\n for (let i = 0; i < buf.length; i++) {\n buf[i] = view[i];\n }\n debug(\"Incoming data\", buf);\n return callback(buf);\n };\n this._characteristics[uuid].addEventListener(\"characteristicvaluechanged\", this._listeners[uuid]);\n\n const mailbox = Array.from(this._mailbox);\n this._mailbox = [];\n for (const data of mailbox) {\n debug(\"Replayed from mailbox (LPF2_ALL)\", data);\n callback(data);\n }\n\n return this._characteristics[uuid].startNotifications();\n }\n\n\n public addToCharacteristicMailbox (uuid: string, data: Buffer) {\n this._mailbox.push(data);\n }\n\n\n public readFromCharacteristic (uuid: string, callback: (err: string | null, data: Buffer | null) => void) {\n // @ts-ignore\n this._characteristics[uuid].readValue().then((data) => {\n const buf = Buffer.alloc(data.buffer.byteLength);\n const view = new Uint8Array(data.buffer);\n for (let i = 0; i < buf.length; i++) {\n buf[i] = view[i];\n }\n callback(null, buf);\n });\n }\n\n\n public writeToCharacteristic (uuid: string, data: Buffer) {\n return this._queue = this._queue.then(() => this._characteristics[uuid].writeValueWithoutResponse(data));\n }\n\n\n private _sanitizeUUID (uuid: string) {\n return uuid.replace(/-/g, \"\");\n }\n\n\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(1681);\n"],"names":["exports","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","i","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","push","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","start","end","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","prototype","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","b","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","fromObject","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","this","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","c","hi","lo","utf16leToBytes","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","TYPED_ARRAY_SUPPORT","proto","foo","e","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","alloc","fill","allocUnsafeSlow","_isBuffer","compare","a","x","y","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","semver","validateAndParse","version","match","shift","isWildcard","s","tryParse","v","isNaN","compareStrings","ap","bp","forceType","compareSegments","r","compareVersions","v1","v2","n1","n2","p1","pop","p2","operator","assertValidOperator","operatorResMap","allowedOperators","keys","op","satisfies","some","every","v3","vp","r1","r2","r3","rp","nonZero","findIndex","validate","test","validateStrict","formatArgs","args","useColors","namespace","module","humanize","diff","color","splice","index","lastC","save","namespaces","storage","setItem","removeItem","load","getItem","process","env","DEBUG","window","__nwjs","navigator","userAgent","document","documentElement","style","WebkitAppearance","firebug","exception","RegExp","$1","localStorage","localstorage","destroy","warned","warn","colors","log","debug","formatters","JSON","stringify","createDebug","prevTime","namespacesCache","enabledCache","enableOverride","enabled","self","curr","Date","ms","prev","coerce","unshift","format","formatter","selectColor","extend","init","delimiter","newDebug","toNamespace","regexp","substring","default","disable","names","map","skips","enable","forEach","key","hash","ReflectOwnKeys","R","Reflect","ReflectApply","receiver","Function","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","NumberIsNaN","EventEmitter","once","emitter","Promise","resolve","reject","errorListener","err","removeListener","resolver","eventTargetAgnosticAddListener","handler","flags","on","addErrorHandlerIfEventEmitter","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","_getMaxListeners","that","_addListener","prepend","events","existing","warning","create","newListener","emit","w","count","onceWrapper","fired","wrapFn","_onceWrap","state","wrapped","bind","_listeners","unwrap","evlistener","unwrapListeners","arrayClone","listenerCount","addEventListener","wrapListener","removeEventListener","getPrototypeOf","setMaxListeners","getMaxListeners","doError","er","context","listeners","addListener","prependListener","prependOnceListener","position","originalListener","spliceOne","off","removeAllListeners","rawListeners","eventNames","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","NaN","rt","LN2","h","plural","msAbs","isPlural","round","options","exec","parseFloat","parse","long","fmtShort","brightness","_brightness","_color","toValue","Consts","Color","NONE","HubType","DeviceType","ButtonState","BrakingStyle","DuploTrainBaseSound","BLEManufacturerData","BLEService","BLECharacteristic","MessageType","HubPropertyReference","HubPropertyOperation","HubPropertyPayload","ActionType","AlertType","AlertOperation","AlertPayload","Event","IOTypeID","ErrorCode","HWNetWorkCommandType","HWNetworkFamily","HWNetworkSubFamily","ModeInformationType","PortInputFormatSetupSubCommand","MarioPantsType","MarioColor","HubTypeNames","DeviceTypeNames","ColorNames","AbsoluteMotor","TachoMotor","hub","portId","modeMap","UNKNOWN","assign","ModeMap","receive","_mode","Mode","ABSOLUTE","angle","normalizeAngle","isWeDo2SmartHub","notify","gotoAngle","speed","isVirtualPort","cancelEventTimer","mapSpeed","_maxPower","_brakeStyle","useProfile","send","_finishedCallbacks","gotoRealZero","oldMode","mode","calibrated","async","rotateByDegrees","subscribe","requestUpdate","resetZero","ROTATION","BasicMotor","Device","setPower","power","interrupt","writeDirect","rampPower","fromPower","toPower","time","calculateRamp","stop","brake","BRAKE","ColorDistanceSensor","COLOR_DISTANCE_SENSOR","COLOR","parseColor","DISTANCE","distance","DISTANCE_COUNT","REFLECT","reflect","AMBIENT","ambient","RGB_I","red","green","blue","COLOR_AND_DISTANCE","partial","setPFExtendedChannel","channel","address","sendPFIRMessage","setPFPower","_pfPowerToPWM","startPFMotors","powerBlue","powerRed","payload","PF_IR","setColor","LED","setDistanceCount","Output","CurrentSensor","CURRENT_SENSOR","CURRENT","current","maxCurrentValue","MaxCurrentValue","maxCurrentRaw","MaxCurrentRaw","TECHNIC_MEDIUM_HUB","autoSubscribe","values","_busy","_connected","_modeMap","_isVirtualPort","_eventTimer","_hub","_portId","_type","_isWeDo2SmartHub","WEDO2_SMART_HUB","isPortVirtual","eventAttachListener","event","deviceDetachListener","device","connected","portName","getPortNameForPortId","typeName","WEDO2_MOTOR_VALUE_WRITE","LPF2_ALL","characteristic","_ensureConnected","unsubscribe","finish","callback","setEventTimer","timer","clearTimeout","DuploTrainBaseColorSensor","DUPLO_TRAIN_BASE_COLOR_SENSOR","INTENSITY","intensity","REFLECTIVITY","RGB","DuploTrainBaseMotor","DUPLO_TRAIN_BASE_MOTOR","DuploTrainBaseSpeaker","DUPLO_TRAIN_BASE_SPEAKER","playSound","sound","SOUND","playTone","tone","TONE","DuploTrainBaseSpeedometer","DUPLO_TRAIN_BASE_SPEEDOMETER","SPEED","HubLED","HUB_LED","WEDO2_PORT_TYPE_WRITE","setRGB","Light","LIGHT","setBrightness","rampBrightness","fromBrightness","toBrightness","MarioAccelerometer","MARIO_ACCELEROMETER","ACCEL","z","GEST","gesture","MarioBarcodeSensor","MARIO_BARCODE_SENSOR","BARCODE","barcode","g","MarioPantsSensor","MARIO_PANTS_SENSOR","PANTS","pants","MediumLinearMotor","MEDIUM_LINEAR_MOTOR","MotionSensor","MOTION_SENSOR","MoveHubMediumLinearMotor","MOVE_HUB_MEDIUM_LINEAR_MOTOR","MoveHubTiltSensor","MOVE_HUB_TILT_SENSOR","TILT","PiezoBuzzer","PIEZO_BUZZER","frequency","setTimeout","RemoteControlButton","REMOTE_CONTROL_BUTTON","BUTTON_EVENTS","SimpleMediumLinearMotor","SIMPLE_MEDIUM_LINEAR_MOTOR","useAccelerationProfile","useDecelerationProfile","degrees","setBrakingStyle","setMaxPower","maxPower","setAccelerationTime","profile","setDecelerationTime","setSpeed","Technic3x3ColorLightMatrix","TECHNIC_3X3_COLOR_LIGHT_MATRIX","setMatrix","PIX_0","colorArray","TechnicColorSensor","TECHNIC_COLOR_SENSOR","AMBIENT_LIGHT","firstSegment","secondSegment","thirdSegment","TechnicDistanceSensor","TECHNIC_DISTANCE_SENSOR","FAST_DISTANCE","fastDistance","topLeft","bottomLeft","topRight","bottomRight","TechnicForceSensor","TECHNIC_FORCE_SENSOR","FORCE","force","TOUCHED","touched","TAPPED","tapped","TechnicLargeAngularMotor","TECHNIC_LARGE_ANGULAR_MOTOR","TechnicLargeLinearMotor","TECHNIC_LARGE_LINEAR_MOTOR","TechnicMediumAngularMotor","TECHNIC_MEDIUM_ANGULAR_MOTOR","TechnicMediumHubAccelerometerSensor","TECHNIC_MEDIUM_HUB_ACCELEROMETER","TechnicMediumHubGyroSensor","TECHNIC_MEDIUM_HUB_GYRO_SENSOR","GYRO","TechnicMediumHubTiltSensor","TECHNIC_MEDIUM_HUB_TILT_SENSOR","_impactThreshold","_impactHoldoff","sign","IMPACT_COUNT","setImpactCount","setImpactThreshold","threshold","setImpactHoldoff","holdoff","TechnicSmallAngularMotor","TECHNIC_SMALL_ANGULAR_MOTOR","TechnicXLargeLinearMotor","TECHNIC_XLARGE_LINEAR_MOTOR","TiltSensor","TILT_SENSOR","TrainMotor","TRAIN_MOTOR","VoltageSensor","VOLTAGE_SENSOR","VOLTAGE","voltage","maxVoltageValue","MaxVoltageValue","maxVoltageRaw","MaxVoltageRaw","DUPLO_TRAIN_BASE","REMOTE_CONTROL","Debug","BaseHub","bleDevice","portMap","_attachedDevices","_name","_firmwareVersion","_hardwareVersion","_primaryMACAddress","_batteryLevel","_rssi","_portMap","_virtualPorts","_attachCallbacks","_bleDevice","connecting","ports","firmwareVersion","hardwareVersion","primaryMACAddress","uuid","batteryLevel","rssi","connect","disconnect","getDeviceAtPort","waitForDeviceAtPort","existingDevice","getDevices","getDevicesByType","deviceType","filter","waitForDeviceByType","existingDevices","port","sleep","delay","wait","commands","all","manuallyAttachDevice","_createDevice","_attachDevice","_detachDevice","TECHNIC_MEDIUM_ANGULAR_MOTOR_GREY","TECHNIC_LARGE_ANGULAR_MOTOR_GREY","_getDeviceByPortId","DuploTrainBase","LPF2Hub","IsDuploTrainBase","peripheral","advertisement","serviceUuids","LPF2_HUB","manufacturerData","DUPLO_TRAIN_BASE_ID","PortMap","Hub","IsHub","HUB_ID","HUB","_currentPort","_checkFirmware","modeInfoDebug","_messageBuffer","_propertyRequestCallbacks","discoverCharacteristicsForService","subscribeToCharacteristic","_parseMessage","_requestHubPropertyReports","BUTTON_STATE","_requestHubPropertyValue","FW_VERSION","HW_VERSION","RSSI","BATTERY_VOLTAGE","PRIMARY_MAC_ADDRESS","shutdown","setName","writeToCharacteristic","createVirtualPort","firstPortName","secondPortName","firstDevice","secondDevice","HUB_PROPERTIES","property","_parseHubPropertyResponse","HUB_ATTACHED_IO","_parsePortMessage","PORT_INFORMATION","_parsePortInformationResponse","PORT_MODE_INFORMATION","_parseModeInformationResponse","PORT_VALUE_SINGLE","_parseSensorMessage","PORT_OUTPUT_COMMAND_FEEDBACK","_parsePortAction","PRESSED","RELEASED","decodeVersion","decodeMACAddress","ATTACHED_IO","deviceTypeName","toHex","hwVersion","swVersion","_sendPortInformationRequest","DETACHED_IO","virtualPortId","ATTACHED_VIRTUAL_IO","virtualPortName","modeCombinationMasks","toBin","_sendModeInformationRequest","NAME","RAW","PCT","SI","SYMBOL","VALUE_FORMAT","numValues","dataType","totalFigures","decimals","Mario","IsMario","MARIO_ID","MARIO","MoveHub","IsMoveHub","MOVE_HUB_ID","MOVE_HUB","RemoteControl","IsRemoteControl","REMOTE_CONTROL_ID","TechnicMediumHub","IsTechnicMediumHub","TECHNIC_MEDIUM_HUB_ID","TechnicSmallHub","IsTechnicSmallHub","TECHNIC_SMALL_HUB_ID","TECHNIC_SMALL_HUB","WeDo2SmartHub","IsWeDo2SmartHub","_lastTiltX","_lastTiltY","WEDO2_SMART_HUB_2","isWebBluetooth","WEDO2_SMART_HUB_3","WEDO2_SMART_HUB_4","WEDO2_SMART_HUB_5","WEDO2_PORT_TYPE","WEDO2_SENSOR_VALUE","WEDO2_BUTTON","readFromCharacteristic","_parseBatteryMessage","_parseHighCurrentAlert","WEDO2_BATTERY","WEDO2_HIGH_CURRENT_ALERT","_parseFirmwareRevisionString","WEDO2_FIRMWARE_REVISION","WEDO2_DISCONNECT","WEDO2_NAME_ID","_getCharacteristicNameFromUUID","PoweredUP","_connectedHubs","_discoveryEventHandler","scan","bluetooth","requestDevice","filters","services","optionalServices","server","gatt","getHubs","getHubByUUID","getHubByPrimaryMACAddress","getHubsByName","getHubsByType","hubType","_determineLPF2HubType","addToCharacteristicMailbox","WebBLEDevice","isLPF2Hub","padStart","part","roundAngleToNearest90","steps","increment","interval","setInterval","clearInterval","_characteristics","_queue","_mailbox","_connecting","_webBLEServer","_uuid","id","service","getPrimaryService","characteristics","getCharacteristics","view","mailbox","startNotifications","readValue","then","writeValueWithoutResponse","_sanitizeUUID","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","o","globalThis","prop","hasOwnProperty","toStringTag"],"sourceRoot":""}