lego-front-web-sdk 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -1022,6 +1022,8 @@ var WebBluetoothTransport = class WebBluetoothTransport {
|
|
|
1022
1022
|
this.live.delete(device.id);
|
|
1023
1023
|
this.rejectAllWaiters(/* @__PURE__ */ new Error("Device disconnected"));
|
|
1024
1024
|
handlers === null || handlers === void 0 || (_handlers$onDisconnec = handlers.onDisconnect) === null || _handlers$onDisconnec === void 0 || _handlers$onDisconnec.call(handlers);
|
|
1025
|
+
console.log("注销方法!");
|
|
1026
|
+
device.removeEventListener("gattserverdisconnected", onGattDisconnected);
|
|
1025
1027
|
};
|
|
1026
1028
|
device.addEventListener("gattserverdisconnected", onGattDisconnected);
|
|
1027
1029
|
const onNotify = (event) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["nav"],"sources":["../src/protocol/colors.ts","../src/constants.ts","../src/protocol/uuids.ts","../src/protocol/opcodes.ts","../src/protocol/frames.ts","../src/protocol/notifications.ts","../src/protocol/codec.ts","../src/transport/types.ts","../src/transport/mock.ts","../src/transport/web-bluetooth.ts","../src/devices/base.ts","../src/devices/single-motor.ts","../src/devices/double-motor.ts","../src/devices/color-sensor.ts","../src/devices/controller.ts"],"sourcesContent":["/**\n * App-aligned LEGO colors (match Python public API / Coding Canvas).\n * Wire frames use firmware numbers via appColorToFirmware().\n */\n\n/** App-aligned (what callers pass to lightColor / filters). */\nexport const LEGO_COLOR_NOCOLOR = 0;\nexport const LEGO_COLOR_NONE = 0;\nexport const LEGO_COLOR_RED = 1;\nexport const LEGO_COLOR_YELLOW = 2;\nexport const LEGO_COLOR_BLUE = 3;\nexport const LEGO_COLOR_TEAL = 4;\nexport const LEGO_COLOR_GREEN = 5;\nexport const LEGO_COLOR_PURPLE = 6;\nexport const LEGO_COLOR_WHITE = 7;\nexport const LEGO_COLOR_MAGENTA = 8;\nexport const LEGO_COLOR_ORANGE = 9;\nexport const LEGO_COLOR_AZURE = 10;\n\n/** Firmware wire values (rpc_message). */\nconst FW_NONE = -1;\nconst FW_BLACK = 0;\nconst FW_MAGENTA = 1;\nconst FW_PURPLE = 2;\nconst FW_BLUE = 3;\nconst FW_AZURE = 4;\nconst FW_TURQUOISE = 5;\nconst FW_GREEN = 6;\nconst FW_YELLOW = 7;\nconst FW_ORANGE = 8;\nconst FW_RED = 9;\nconst FW_WHITE = 10;\n\nconst APP_TO_FW: Record<number, number> = {\n [LEGO_COLOR_NOCOLOR]: FW_NONE,\n [LEGO_COLOR_RED]: FW_RED,\n [LEGO_COLOR_YELLOW]: FW_YELLOW,\n [LEGO_COLOR_BLUE]: FW_BLUE,\n [LEGO_COLOR_TEAL]: FW_TURQUOISE,\n [LEGO_COLOR_GREEN]: FW_GREEN,\n [LEGO_COLOR_PURPLE]: FW_PURPLE,\n [LEGO_COLOR_WHITE]: FW_WHITE,\n [LEGO_COLOR_MAGENTA]: FW_MAGENTA,\n [LEGO_COLOR_ORANGE]: FW_ORANGE,\n [LEGO_COLOR_AZURE]: FW_AZURE,\n};\n\nconst FW_TO_APP: Record<number, number> = {\n [FW_NONE]: LEGO_COLOR_NOCOLOR,\n [FW_BLACK]: LEGO_COLOR_NOCOLOR,\n [FW_MAGENTA]: LEGO_COLOR_MAGENTA,\n [FW_PURPLE]: LEGO_COLOR_PURPLE,\n [FW_BLUE]: LEGO_COLOR_BLUE,\n [FW_AZURE]: LEGO_COLOR_AZURE,\n [FW_TURQUOISE]: LEGO_COLOR_TEAL,\n [FW_GREEN]: LEGO_COLOR_GREEN,\n [FW_YELLOW]: LEGO_COLOR_YELLOW,\n [FW_ORANGE]: LEGO_COLOR_ORANGE,\n [FW_RED]: LEGO_COLOR_RED,\n [FW_WHITE]: LEGO_COLOR_WHITE,\n};\n\nexport function appColorToFirmware(appColor: number): number {\n return APP_TO_FW[appColor] ?? FW_NONE;\n}\n\nexport function firmwareColorToApp(firmwareColor: number): number {\n return FW_TO_APP[firmwareColor] ?? LEGO_COLOR_NOCOLOR;\n}\n","/** Constants aligned with the LEGO Education Python public API. */\n\nexport const UNCHANGED = -1;\nexport const DEFAULT_MOTOR = 0;\nexport const DEFAULT_DEVICE_NOTIFICATION_DELAY = 100;\n\nexport {\n LEGO_COLOR_NOCOLOR,\n LEGO_COLOR_NONE,\n LEGO_COLOR_RED,\n LEGO_COLOR_YELLOW,\n LEGO_COLOR_BLUE,\n LEGO_COLOR_TEAL,\n LEGO_COLOR_GREEN,\n LEGO_COLOR_PURPLE,\n LEGO_COLOR_WHITE,\n LEGO_COLOR_MAGENTA,\n LEGO_COLOR_ORANGE,\n LEGO_COLOR_AZURE,\n appColorToFirmware,\n firmwareColorToApp,\n} from \"./protocol/colors.js\";\n\nexport const MOTOR_END_STATE_DEFAULT = -1;\nexport const MOTOR_END_STATE_COAST = 0;\nexport const MOTOR_END_STATE_BRAKE = 1;\nexport const MOTOR_END_STATE_HOLD = 2;\nexport const MOTOR_END_STATE_CONTINUE = 3;\nexport const MOTOR_END_STATE_SMART_COAST = 4;\nexport const MOTOR_END_STATE_SMART_BRAKE = 5;\n\nexport const MOTOR_MOVE_DIRECTION_CLOCKWISE = 0;\nexport const MOTOR_MOVE_DIRECTION_COUNTERCLOCKWISE = 1;\nexport const MOTOR_MOVE_DIRECTION_SHORTEST = 2;\nexport const MOTOR_MOVE_DIRECTION_LONGEST = 3;\n\nexport const MOTOR_LEFT = 0;\nexport const MOTOR_RIGHT = 1;\nexport const MOTOR_BOTH = 2;\n\nexport const MOVEMENT_DIRECTION_FORWARD = 0;\nexport const MOVEMENT_DIRECTION_BACKWARD = 1;\nexport const MOVEMENT_DIRECTION_LEFT = 2;\nexport const MOVEMENT_DIRECTION_RIGHT = 3;\n\nexport const MOVEMENT_MOVE_DIRECTION_FORWARD = 0;\nexport const MOVEMENT_MOVE_DIRECTION_BACKWARD = 1;\n\nexport const MOVEMENT_TURN_DIRECTION_LEFT = 2;\nexport const MOVEMENT_TURN_DIRECTION_RIGHT = 3;\n\nexport const DEVICE_FACE_TOP = 0;\nexport const DEVICE_FACE_FRONT = 1;\nexport const DEVICE_FACE_RIGHT = 2;\nexport const DEVICE_FACE_BOTTOM = 3;\nexport const DEVICE_FACE_BACK = 4;\nexport const DEVICE_FACE_LEFT = 5;\n\nexport const SOUND_PATTERN_BEEP_SINGLE = 0;\nexport const SOUND_PATTERN_BEEP_DOUBLE = 1;\nexport const SOUND_PATTERN_BEEP_TRIPLE = 2;\nexport const SOUND_PATTERN_BEEP_UP_MIDDLE_DOWN = 3;\n\nexport const LIGHT_PATTERN_SOLID = 0;\nexport const LIGHT_PATTERN_BREATHE = 1;\nexport const LIGHT_PATTERN_PULSE = 2;\nexport const LIGHT_PATTERN_SHORT_BLINK = 3;\nexport const LIGHT_PATTERN_LONG_BLINK = 4;\nexport const LIGHT_PATTERN_DOUBLE_BLINK = 5;\n\nexport const PROGRAM_ACTION_START = 0;\nexport const PROGRAM_ACTION_STOP = 1;\n","/** GATT UUIDs — aligned with legoeducation `basic_ble.py` / Coral fd02 docs. */\n\nexport const SERVICE_UUID = \"0000fd02-0000-1000-8000-00805f9b34fb\";\nexport const WRITE_UUID = \"0000fd02-0001-1000-8000-00805f9b34fb\";\nexport const NOTIFY_UUID = \"0000fd02-0002-1000-8000-00805f9b34fb\";\n\n/** LEGO Bluetooth company identifier (manufacturer data). */\nexport const LEGO_COMPANY_ID = 0x0397;\n\n/** productGroupDevice values from legoeducation rpc_message. */\nexport const PRODUCT_GROUP_DEVICE_SINGLE_MOTOR = 512;\nexport const PRODUCT_GROUP_DEVICE_DOUBLE_MOTOR = 513;\nexport const PRODUCT_GROUP_DEVICE_COLOR_SENSOR = 514;\nexport const PRODUCT_GROUP_DEVICE_CONTROLLER = 515;\n\n/** Client RPC version expected by legoeducation 1.0.6. */\nexport const RPC_VERSION = { major: 1, minor: 0, build: 73 } as const;\n","/** Message type IDs — legoeducation 1.0.6 `rpc_message.py`. */\n\nexport const INFO_REQUEST = 0;\nexport const INFO_RESPONSE = 1;\nexport const PROGRAM_FLOW_NOTIFICATION = 32;\nexport const DEVICE_NOTIFICATION_REQUEST = 40;\nexport const DEVICE_NOTIFICATION_RESPONSE = 41;\nexport const DEVICE_NOTIFICATION = 60;\n\nexport const LIGHT_COLOR_COMMAND = 110;\nexport const LIGHT_COLOR_RESULT = 111;\nexport const PLAY_BEEP_COMMAND = 112;\nexport const PLAY_BEEP_RESULT = 113;\nexport const STOP_SOUND_COMMAND = 114;\nexport const STOP_SOUND_RESULT = 115;\n\nexport const MOTOR_RESET_RELATIVE_POSITION_COMMAND = 120;\nexport const MOTOR_RESET_RELATIVE_POSITION_RESULT = 121;\nexport const MOTOR_RUN_COMMAND = 122;\nexport const MOTOR_RUN_RESULT = 123;\nexport const MOTOR_RUN_FOR_DEGREES_COMMAND = 124;\nexport const MOTOR_RUN_FOR_DEGREES_RESULT = 125;\nexport const MOTOR_RUN_FOR_TIME_COMMAND = 126;\nexport const MOTOR_RUN_FOR_TIME_RESULT = 127;\nexport const MOTOR_RUN_TO_ABSOLUTE_POSITION_COMMAND = 128;\nexport const MOTOR_RUN_TO_ABSOLUTE_POSITION_RESULT = 129;\nexport const MOTOR_RUN_TO_RELATIVE_POSITION_COMMAND = 130;\nexport const MOTOR_RUN_TO_RELATIVE_POSITION_RESULT = 131;\nexport const MOTOR_SET_DUTY_CYCLE_COMMAND = 132;\nexport const MOTOR_SET_DUTY_CYCLE_RESULT = 133;\nexport const MOTOR_STOP_COMMAND = 138;\nexport const MOTOR_STOP_RESULT = 139;\nexport const MOTOR_SET_SPEED_COMMAND = 140;\nexport const MOTOR_SET_SPEED_RESULT = 141;\nexport const MOTOR_SET_END_STATE_COMMAND = 142;\nexport const MOTOR_SET_END_STATE_RESULT = 143;\nexport const MOTOR_SET_ACCELERATION_COMMAND = 144;\nexport const MOTOR_SET_ACCELERATION_RESULT = 145;\n\nexport const MOVEMENT_MOVE_COMMAND = 150;\nexport const MOVEMENT_MOVE_RESULT = 151;\nexport const MOVEMENT_MOVE_FOR_TIME_COMMAND = 152;\nexport const MOVEMENT_MOVE_FOR_TIME_RESULT = 153;\nexport const MOVEMENT_MOVE_FOR_DEGREES_COMMAND = 154;\nexport const MOVEMENT_MOVE_FOR_DEGREES_RESULT = 155;\nexport const MOVEMENT_MOVE_TANK_COMMAND = 156;\nexport const MOVEMENT_MOVE_TANK_RESULT = 157;\nexport const MOVEMENT_MOVE_TANK_FOR_DEGREES_COMMAND = 158;\nexport const MOVEMENT_MOVE_TANK_FOR_DEGREES_RESULT = 159;\nexport const MOVEMENT_TURN_FOR_DEGREES_COMMAND = 160;\nexport const MOVEMENT_TURN_FOR_DEGREES_RESULT = 161;\nexport const MOVEMENT_STOP_COMMAND = 168;\nexport const MOVEMENT_STOP_RESULT = 169;\nexport const MOVEMENT_SET_SPEED_COMMAND = 170;\nexport const MOVEMENT_SET_SPEED_RESULT = 171;\nexport const MOVEMENT_SET_END_STATE_COMMAND = 172;\nexport const MOVEMENT_SET_END_STATE_RESULT = 173;\nexport const MOVEMENT_SET_ACCELERATION_COMMAND = 174;\nexport const MOVEMENT_SET_ACCELERATION_RESULT = 175;\nexport const MOVEMENT_SET_TURN_STEERING_COMMAND = 176;\nexport const MOVEMENT_SET_TURN_STEERING_RESULT = 177;\n\nexport const IMU_SET_YAW_FACE_COMMAND = 190;\nexport const IMU_SET_YAW_FACE_RESULT = 191;\nexport const IMU_RESET_YAW_AXIS_COMMAND = 192;\nexport const IMU_RESET_YAW_AXIS_RESULT = 193;\n\n/** Nested types inside DEVICE_NOTIFICATION deviceData. */\nexport const INFO_DEVICE_NOTIFICATION = 0;\nexport const IMU_DEVICE_NOTIFICATION = 1;\nexport const CARD_NOTIFICATION = 3;\nexport const BUTTON_STATE_NOTIFICATION = 4;\nexport const MOTOR_NOTIFICATION = 10;\nexport const COLOR_SENSOR_NOTIFICATION = 12;\nexport const CONTROLLER_NOTIFICATION = 15;\nexport const IMU_GESTURE_NOTIFICATION = 16;\n\nexport const MOTOR_BITS_LEFT = 1;\nexport const MOTOR_BITS_RIGHT = 2;\nexport const MOTOR_BITS_BOTH = 3;\n\n/** Body sizes (without nested type byte). */\nexport const NESTED_NOTIFICATION_SIZES: Record<number, number> = {\n [INFO_DEVICE_NOTIFICATION]: 2,\n [IMU_DEVICE_NOTIFICATION]: 20,\n [CARD_NOTIFICATION]: 3,\n [BUTTON_STATE_NOTIFICATION]: 1,\n [MOTOR_NOTIFICATION]: 12,\n [COLOR_SENSOR_NOTIFICATION]: 12,\n [CONTROLLER_NOTIFICATION]: 6,\n [IMU_GESTURE_NOTIFICATION]: 1,\n};\n\nexport function motorIndexToBitMask(motorIndex: number): number {\n if (motorIndex === 2) return MOTOR_BITS_BOTH;\n return 1 << motorIndex;\n}\n\nexport function resultOpcodeForMethod(method: string): number | undefined {\n const map: Record<string, number> = {\n info_request: INFO_RESPONSE,\n device_notification_request: DEVICE_NOTIFICATION_RESPONSE,\n light_color: LIGHT_COLOR_RESULT,\n beep: PLAY_BEEP_RESULT,\n stop_beep: STOP_SOUND_RESULT,\n motor_reset_relative_position: MOTOR_RESET_RELATIVE_POSITION_RESULT,\n motor_run: MOTOR_RUN_RESULT,\n motor_run_for_degrees: MOTOR_RUN_FOR_DEGREES_RESULT,\n motor_run_for_time: MOTOR_RUN_FOR_TIME_RESULT,\n motor_run_to_absolute_position: MOTOR_RUN_TO_ABSOLUTE_POSITION_RESULT,\n motor_run_to_relative_position: MOTOR_RUN_TO_RELATIVE_POSITION_RESULT,\n motor_set_duty_cycle: MOTOR_SET_DUTY_CYCLE_RESULT,\n motor_stop: MOTOR_STOP_RESULT,\n motor_set_speed: MOTOR_SET_SPEED_RESULT,\n motor_set_end_state: MOTOR_SET_END_STATE_RESULT,\n motor_set_acceleration: MOTOR_SET_ACCELERATION_RESULT,\n movement_move: MOVEMENT_MOVE_RESULT,\n movement_move_for_time: MOVEMENT_MOVE_FOR_TIME_RESULT,\n movement_move_for_degrees: MOVEMENT_MOVE_FOR_DEGREES_RESULT,\n movement_move_tank: MOVEMENT_MOVE_TANK_RESULT,\n movement_move_tank_for_degrees: MOVEMENT_MOVE_TANK_FOR_DEGREES_RESULT,\n movement_turn_for_degrees: MOVEMENT_TURN_FOR_DEGREES_RESULT,\n movement_stop: MOVEMENT_STOP_RESULT,\n movement_set_speed: MOVEMENT_SET_SPEED_RESULT,\n movement_set_end_state: MOVEMENT_SET_END_STATE_RESULT,\n movement_set_acceleration: MOVEMENT_SET_ACCELERATION_RESULT,\n movement_set_turn_steering: MOVEMENT_SET_TURN_STEERING_RESULT,\n imu_set_yaw_face: IMU_SET_YAW_FACE_RESULT,\n imu_reset_yaw_axis: IMU_RESET_YAW_AXIS_RESULT,\n };\n return map[method];\n}\n","/**\n * Split concatenated RPC notify buffers into individual frames.\n * Web Bluetooth sometimes delivers DEVICE_NOTIFICATION + result in one packet.\n */\n\nimport {\n DEVICE_NOTIFICATION,\n DEVICE_NOTIFICATION_RESPONSE,\n INFO_RESPONSE,\n LIGHT_COLOR_RESULT,\n MOTOR_RUN_FOR_DEGREES_RESULT,\n MOTOR_RUN_FOR_TIME_RESULT,\n MOTOR_RUN_RESULT,\n MOTOR_RUN_TO_ABSOLUTE_POSITION_RESULT,\n MOTOR_RUN_TO_RELATIVE_POSITION_RESULT,\n MOTOR_SET_ACCELERATION_RESULT,\n MOTOR_SET_DUTY_CYCLE_RESULT,\n MOTOR_SET_END_STATE_RESULT,\n MOTOR_SET_SPEED_RESULT,\n MOTOR_STOP_RESULT,\n MOTOR_RESET_RELATIVE_POSITION_RESULT,\n MOVEMENT_MOVE_FOR_DEGREES_RESULT,\n MOVEMENT_MOVE_FOR_TIME_RESULT,\n MOVEMENT_MOVE_RESULT,\n MOVEMENT_MOVE_TANK_FOR_DEGREES_RESULT,\n MOVEMENT_MOVE_TANK_RESULT,\n MOVEMENT_SET_ACCELERATION_RESULT,\n MOVEMENT_SET_END_STATE_RESULT,\n MOVEMENT_SET_SPEED_RESULT,\n MOVEMENT_SET_TURN_STEERING_RESULT,\n MOVEMENT_STOP_RESULT,\n MOVEMENT_TURN_FOR_DEGREES_RESULT,\n PLAY_BEEP_RESULT,\n STOP_SOUND_RESULT,\n IMU_RESET_YAW_AXIS_RESULT,\n IMU_SET_YAW_FACE_RESULT,\n} from \"./opcodes.js\";\n\n/** Total frame size including opcode byte (fixed-layout replies). */\nconst FIXED_FRAME_SIZE: Record<number, number> = {\n [INFO_RESPONSE]: 17,\n [DEVICE_NOTIFICATION_RESPONSE]: 2,\n [LIGHT_COLOR_RESULT]: 2,\n [PLAY_BEEP_RESULT]: 2,\n [STOP_SOUND_RESULT]: 2,\n [MOTOR_RESET_RELATIVE_POSITION_RESULT]: 3,\n [MOTOR_RUN_RESULT]: 3,\n [MOTOR_RUN_FOR_DEGREES_RESULT]: 3,\n [MOTOR_RUN_FOR_TIME_RESULT]: 3,\n [MOTOR_RUN_TO_ABSOLUTE_POSITION_RESULT]: 3,\n [MOTOR_RUN_TO_RELATIVE_POSITION_RESULT]: 3,\n [MOTOR_SET_DUTY_CYCLE_RESULT]: 3,\n [MOTOR_STOP_RESULT]: 3,\n [MOTOR_SET_SPEED_RESULT]: 3,\n [MOTOR_SET_END_STATE_RESULT]: 3,\n [MOTOR_SET_ACCELERATION_RESULT]: 3,\n [MOVEMENT_MOVE_RESULT]: 2,\n [MOVEMENT_MOVE_FOR_TIME_RESULT]: 2,\n [MOVEMENT_MOVE_FOR_DEGREES_RESULT]: 2,\n [MOVEMENT_MOVE_TANK_RESULT]: 2,\n [MOVEMENT_MOVE_TANK_FOR_DEGREES_RESULT]: 2,\n [MOVEMENT_TURN_FOR_DEGREES_RESULT]: 2,\n [MOVEMENT_STOP_RESULT]: 2,\n [MOVEMENT_SET_SPEED_RESULT]: 2,\n [MOVEMENT_SET_END_STATE_RESULT]: 2,\n [MOVEMENT_SET_ACCELERATION_RESULT]: 2,\n [MOVEMENT_SET_TURN_STEERING_RESULT]: 2,\n [IMU_SET_YAW_FACE_RESULT]: 2,\n [IMU_RESET_YAW_AXIS_RESULT]: 2,\n};\n\nexport function splitNotifyFrames(buffer: Uint8Array): Uint8Array[] {\n if (buffer.length === 0) return [];\n const frames: Uint8Array[] = [];\n let o = 0;\n\n while (o < buffer.length) {\n const opcode = buffer[o]!;\n let size: number | undefined;\n\n if (opcode === DEVICE_NOTIFICATION && o + 3 <= buffer.length) {\n const dataLen = buffer[o + 1]! | (buffer[o + 2]! << 8);\n size = 3 + dataLen;\n } else {\n size = FIXED_FRAME_SIZE[opcode];\n }\n\n if (size == null || o + size > buffer.length) {\n frames.push(buffer.subarray(o));\n break;\n }\n\n frames.push(buffer.subarray(o, o + size));\n o += size;\n }\n\n return frames;\n}\n","/**\n * Parse DEVICE_NOTIFICATION (opcode 60) nested payloads.\n */\n\nimport { firmwareColorToApp } from \"./colors.js\";\nimport {\n BUTTON_STATE_NOTIFICATION,\n CARD_NOTIFICATION,\n COLOR_SENSOR_NOTIFICATION,\n CONTROLLER_NOTIFICATION,\n DEVICE_NOTIFICATION,\n IMU_DEVICE_NOTIFICATION,\n IMU_GESTURE_NOTIFICATION,\n INFO_DEVICE_NOTIFICATION,\n MOTOR_NOTIFICATION,\n NESTED_NOTIFICATION_SIZES,\n} from \"./opcodes.js\";\n\nexport interface MotorNotificationReading {\n motorBitMask: number;\n motorState: number;\n absolutePosition: number;\n power: number;\n speed: number;\n position: number;\n gesture: number;\n}\n\nexport interface ColorSensorNotificationReading {\n color: number;\n reflection: number;\n rawRed: number;\n rawGreen: number;\n rawBlue: number;\n hue: number;\n saturation: number;\n value: number;\n}\n\nexport interface ControllerNotificationReading {\n leftPercent: number;\n rightPercent: number;\n leftAngle: number;\n rightAngle: number;\n}\n\nexport interface ImuNotificationReading {\n orientation: number;\n yawFace: number;\n yaw: number;\n pitch: number;\n roll: number;\n accelerometerX: number;\n accelerometerY: number;\n accelerometerZ: number;\n gyroscopeX: number;\n gyroscopeY: number;\n gyroscopeZ: number;\n}\n\nexport interface ParsedDeviceNotifications {\n motors: MotorNotificationReading[];\n color?: ColorSensorNotificationReading;\n controller?: ControllerNotificationReading;\n imu?: ImuNotificationReading;\n imuGesture?: number;\n card?: { color: number; serial: number };\n buttonState?: number;\n}\n\nfunction decodeMotor(body: Uint8Array): MotorNotificationReading {\n const v = new DataView(body.buffer, body.byteOffset, body.byteLength);\n let o = 0;\n const motorBitMask = v.getUint8(o++);\n const motorState = v.getUint8(o++);\n const absolutePosition = v.getUint16(o, true);\n o += 2;\n const power = v.getInt16(o, true);\n o += 2;\n const speed = v.getInt8(o++);\n const position = v.getInt32(o, true);\n o += 4;\n const gesture = v.getInt8(o);\n return {\n motorBitMask,\n motorState,\n absolutePosition,\n power,\n speed,\n position,\n gesture,\n };\n}\n\nfunction decodeColor(body: Uint8Array): ColorSensorNotificationReading {\n const v = new DataView(body.buffer, body.byteOffset, body.byteLength);\n let o = 0;\n const color = v.getInt8(o++);\n const reflection = v.getUint8(o++);\n const rawRed = v.getUint16(o, true);\n o += 2;\n const rawGreen = v.getUint16(o, true);\n o += 2;\n const rawBlue = v.getUint16(o, true);\n o += 2;\n const hue = v.getUint16(o, true);\n o += 2;\n const saturation = v.getUint8(o++);\n const value = v.getUint8(o);\n return {\n color,\n reflection,\n rawRed,\n rawGreen,\n rawBlue,\n hue,\n saturation,\n value,\n };\n}\n\nfunction decodeController(body: Uint8Array): ControllerNotificationReading {\n const v = new DataView(body.buffer, body.byteOffset, body.byteLength);\n return {\n leftPercent: v.getInt8(0),\n rightPercent: v.getInt8(1),\n leftAngle: v.getInt16(2, true),\n rightAngle: v.getInt16(4, true),\n };\n}\n\nfunction decodeImu(body: Uint8Array): ImuNotificationReading {\n const v = new DataView(body.buffer, body.byteOffset, body.byteLength);\n let o = 0;\n const orientation = v.getUint8(o++);\n const yawFace = v.getUint8(o++);\n const yaw = v.getInt16(o, true);\n o += 2;\n const pitch = v.getInt16(o, true);\n o += 2;\n const roll = v.getInt16(o, true);\n o += 2;\n const accelerometerX = v.getInt16(o, true);\n o += 2;\n const accelerometerY = v.getInt16(o, true);\n o += 2;\n const accelerometerZ = v.getInt16(o, true);\n o += 2;\n const gyroscopeX = v.getInt16(o, true);\n o += 2;\n const gyroscopeY = v.getInt16(o, true);\n o += 2;\n const gyroscopeZ = v.getInt16(o, true);\n return {\n orientation,\n yawFace,\n yaw,\n pitch,\n roll,\n accelerometerX,\n accelerometerY,\n accelerometerZ,\n gyroscopeX,\n gyroscopeY,\n gyroscopeZ,\n };\n}\n\n/** Extract typed readings from a raw notify frame. */\nexport function parseDeviceNotifications(\n payload: Uint8Array,\n): ParsedDeviceNotifications {\n let deviceData: Uint8Array;\n if (payload.length >= 1 && payload[0] === DEVICE_NOTIFICATION) {\n if (payload.length < 3) return { motors: [] };\n const len = new DataView(\n payload.buffer,\n payload.byteOffset + 1,\n 2,\n ).getUint16(0, true);\n deviceData = payload.subarray(3, 3 + len);\n } else {\n deviceData = payload;\n }\n\n const out: ParsedDeviceNotifications = { motors: [] };\n let offset = 0;\n while (offset < deviceData.length) {\n const type = deviceData[offset];\n offset += 1;\n const size = NESTED_NOTIFICATION_SIZES[type];\n if (size == null || offset + size > deviceData.length) break;\n const body = deviceData.subarray(offset, offset + size);\n offset += size;\n\n switch (type) {\n case MOTOR_NOTIFICATION:\n out.motors.push(decodeMotor(body));\n break;\n case COLOR_SENSOR_NOTIFICATION: {\n const c = decodeColor(body);\n c.color = firmwareColorToApp(c.color);\n out.color = c;\n break;\n }\n case CONTROLLER_NOTIFICATION:\n out.controller = decodeController(body);\n break;\n case IMU_DEVICE_NOTIFICATION:\n out.imu = decodeImu(body);\n break;\n case IMU_GESTURE_NOTIFICATION:\n out.imuGesture = body[0];\n break;\n case CARD_NOTIFICATION: {\n const v = new DataView(body.buffer, body.byteOffset, body.byteLength);\n out.card = {\n color: firmwareColorToApp(v.getInt8(0)),\n serial: v.getUint16(1, true),\n };\n break;\n }\n case BUTTON_STATE_NOTIFICATION:\n out.buttonState = body[0];\n break;\n case INFO_DEVICE_NOTIFICATION:\n break;\n default:\n break;\n }\n }\n return out;\n}\n\n/** Convenience: motor readings only (back-compat). */\nexport function parseMotorNotifications(\n payload: Uint8Array,\n): MotorNotificationReading[] {\n return parseDeviceNotifications(payload).motors;\n}\n","/**\n * RPC codec for CS&AI hubs (fd02).\n * Layouts follow legoeducation 1.0.6 `rpc_message.py`.\n */\n\nimport { UNCHANGED } from \"../constants.js\";\nimport { appColorToFirmware } from \"./colors.js\";\nimport {\n DEVICE_NOTIFICATION_REQUEST,\n INFO_REQUEST,\n INFO_RESPONSE,\n IMU_RESET_YAW_AXIS_COMMAND,\n IMU_SET_YAW_FACE_COMMAND,\n LIGHT_COLOR_COMMAND,\n MOTOR_BITS_LEFT,\n MOTOR_RESET_RELATIVE_POSITION_COMMAND,\n MOTOR_RUN_COMMAND,\n MOTOR_RUN_FOR_DEGREES_COMMAND,\n MOTOR_RUN_FOR_TIME_COMMAND,\n MOTOR_RUN_TO_ABSOLUTE_POSITION_COMMAND,\n MOTOR_RUN_TO_RELATIVE_POSITION_COMMAND,\n MOTOR_SET_ACCELERATION_COMMAND,\n MOTOR_SET_DUTY_CYCLE_COMMAND,\n MOTOR_SET_END_STATE_COMMAND,\n MOTOR_SET_SPEED_COMMAND,\n MOTOR_STOP_COMMAND,\n MOVEMENT_MOVE_COMMAND,\n MOVEMENT_MOVE_FOR_DEGREES_COMMAND,\n MOVEMENT_MOVE_FOR_TIME_COMMAND,\n MOVEMENT_MOVE_TANK_COMMAND,\n MOVEMENT_MOVE_TANK_FOR_DEGREES_COMMAND,\n MOVEMENT_SET_ACCELERATION_COMMAND,\n MOVEMENT_SET_END_STATE_COMMAND,\n MOVEMENT_SET_SPEED_COMMAND,\n MOVEMENT_SET_TURN_STEERING_COMMAND,\n MOVEMENT_STOP_COMMAND,\n MOVEMENT_TURN_FOR_DEGREES_COMMAND,\n PLAY_BEEP_COMMAND,\n PROGRAM_FLOW_NOTIFICATION,\n STOP_SOUND_COMMAND,\n motorIndexToBitMask,\n resultOpcodeForMethod,\n} from \"./opcodes.js\";\nimport {\n parseDeviceNotifications,\n parseMotorNotifications,\n type ParsedDeviceNotifications,\n} from \"./notifications.js\";\n\nfunction u8(n: number): number {\n return n & 0xff;\n}\nfunction i8(n: number): number {\n return (n << 24) >> 24;\n}\nfunction packI16LE(value: number): Uint8Array {\n const b = new ArrayBuffer(2);\n new DataView(b).setInt16(0, value, true);\n return new Uint8Array(b);\n}\nfunction packU16LE(value: number): Uint8Array {\n const b = new ArrayBuffer(2);\n new DataView(b).setUint16(0, value, true);\n return new Uint8Array(b);\n}\nfunction packI32LE(value: number): Uint8Array {\n const b = new ArrayBuffer(4);\n new DataView(b).setInt32(0, value, true);\n return new Uint8Array(b);\n}\nfunction packU32LE(value: number): Uint8Array {\n const b = new ArrayBuffer(4);\n new DataView(b).setUint32(0, value, true);\n return new Uint8Array(b);\n}\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((n, p) => n + p.length, 0);\n const out = new Uint8Array(total);\n let o = 0;\n for (const p of parts) {\n out.set(p, o);\n o += p.length;\n }\n return out;\n}\nfunction bitMask(motor?: number): number {\n return motorIndexToBitMask(motor ?? 0) || MOTOR_BITS_LEFT;\n}\n\nexport function encodeInfoRequest(): Uint8Array {\n return new Uint8Array([INFO_REQUEST]);\n}\nexport function encodeProgramFlow(action: number): Uint8Array {\n return new Uint8Array([PROGRAM_FLOW_NOTIFICATION, u8(action)]);\n}\nexport function encodeDeviceNotificationRequest(delayMs: number): Uint8Array {\n return concat(new Uint8Array([DEVICE_NOTIFICATION_REQUEST]), packU16LE(delayMs));\n}\nexport function encodeLightColor(\n color: number,\n pattern = 0,\n intensity = 100,\n): Uint8Array {\n // Public API uses App color ids; wire needs firmware ids (like Python _app_to_firmware).\n const fwColor = appColorToFirmware(color);\n const clampedIntensity = Math.max(0, Math.min(100, Math.round(intensity)));\n return new Uint8Array([\n LIGHT_COLOR_COMMAND,\n i8(fwColor),\n u8(pattern),\n u8(clampedIntensity),\n ]);\n}\nexport function encodeBeep(\n pattern = 0,\n frequency = 440,\n count = 1,\n): Uint8Array {\n // Firmware field = repeats after first play → count - 1 (official Python).\n const repetitions = Math.max(0, Math.min(255, Math.round(count) - 1));\n const hz = Math.max(0, Math.min(2700, Math.round(frequency)));\n return concat(\n new Uint8Array([PLAY_BEEP_COMMAND, u8(pattern)]),\n packU16LE(hz),\n new Uint8Array([u8(repetitions)]),\n );\n}\nexport function encodeStopBeep(): Uint8Array {\n return new Uint8Array([STOP_SOUND_COMMAND]);\n}\n\nexport function encodeMotorSetSpeed(speed: number, motor?: number): Uint8Array {\n return new Uint8Array([MOTOR_SET_SPEED_COMMAND, u8(bitMask(motor)), i8(speed)]);\n}\nexport function encodeMotorRun(direction = 0, motor?: number): Uint8Array {\n return new Uint8Array([MOTOR_RUN_COMMAND, u8(bitMask(motor)), u8(direction)]);\n}\nexport function encodeMotorStop(motor?: number): Uint8Array {\n return new Uint8Array([MOTOR_STOP_COMMAND, u8(bitMask(motor))]);\n}\nexport function encodeMotorRunForDegrees(\n degrees: number,\n direction = 0,\n motor?: number,\n): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_RUN_FOR_DEGREES_COMMAND, u8(bitMask(motor))]),\n packI32LE(degrees),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMotorRunForTime(\n timeMs: number,\n direction = 0,\n motor?: number,\n): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_RUN_FOR_TIME_COMMAND, u8(bitMask(motor))]),\n packU32LE(timeMs),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMotorResetRelativePosition(\n position = 0,\n motor?: number,\n): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_RESET_RELATIVE_POSITION_COMMAND, u8(bitMask(motor))]),\n packI32LE(position),\n );\n}\nexport function encodeMotorRunToRelativePosition(\n position: number,\n motor?: number,\n): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_RUN_TO_RELATIVE_POSITION_COMMAND, u8(bitMask(motor))]),\n packI32LE(position),\n );\n}\nexport function encodeMotorRunToAbsolutePosition(\n position: number,\n direction = 2,\n motor?: number,\n): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_RUN_TO_ABSOLUTE_POSITION_COMMAND, u8(bitMask(motor))]),\n packU16LE(position),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMotorSetDutyCycle(dutyCycle: number, motor?: number): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_SET_DUTY_CYCLE_COMMAND, u8(bitMask(motor))]),\n packI16LE(100 * dutyCycle),\n );\n}\nexport function encodeMotorSetEndState(endState: number, motor?: number): Uint8Array {\n return new Uint8Array([MOTOR_SET_END_STATE_COMMAND, u8(bitMask(motor)), i8(endState)]);\n}\nexport function encodeMotorSetAcceleration(\n acceleration: number,\n deceleration: number,\n motor?: number,\n): Uint8Array {\n return new Uint8Array([\n MOTOR_SET_ACCELERATION_COMMAND,\n u8(bitMask(motor)),\n u8(acceleration),\n u8(deceleration),\n ]);\n}\n\nexport function encodeMovementSetSpeed(speed: number): Uint8Array {\n return new Uint8Array([MOVEMENT_SET_SPEED_COMMAND, i8(speed)]);\n}\nexport function encodeMovementMove(direction = 0): Uint8Array {\n return new Uint8Array([MOVEMENT_MOVE_COMMAND, u8(direction)]);\n}\nexport function encodeMovementMoveForTime(timeMs: number, direction = 0): Uint8Array {\n return concat(\n new Uint8Array([MOVEMENT_MOVE_FOR_TIME_COMMAND]),\n packU32LE(timeMs),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMovementMoveForDegrees(degrees: number, direction = 0): Uint8Array {\n return concat(\n new Uint8Array([MOVEMENT_MOVE_FOR_DEGREES_COMMAND]),\n packI32LE(degrees),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMovementMoveTank(speedLeft: number, speedRight: number): Uint8Array {\n return new Uint8Array([MOVEMENT_MOVE_TANK_COMMAND, i8(speedLeft), i8(speedRight)]);\n}\nexport function encodeMovementMoveTankForDegrees(\n degrees: number,\n speedLeft = 50,\n speedRight = 50,\n): Uint8Array {\n return concat(\n new Uint8Array([MOVEMENT_MOVE_TANK_FOR_DEGREES_COMMAND]),\n packI32LE(degrees),\n new Uint8Array([i8(speedLeft), i8(speedRight)]),\n );\n}\nexport function encodeMovementTurnForDegrees(degrees: number, direction = 2): Uint8Array {\n return concat(\n new Uint8Array([MOVEMENT_TURN_FOR_DEGREES_COMMAND]),\n packI32LE(degrees),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMovementStop(): Uint8Array {\n return new Uint8Array([MOVEMENT_STOP_COMMAND]);\n}\nexport function encodeMovementSetEndState(endState: number): Uint8Array {\n return new Uint8Array([MOVEMENT_SET_END_STATE_COMMAND, i8(endState)]);\n}\nexport function encodeMovementSetAcceleration(\n acceleration: number,\n deceleration: number,\n): Uint8Array {\n return new Uint8Array([\n MOVEMENT_SET_ACCELERATION_COMMAND,\n u8(acceleration),\n u8(deceleration),\n ]);\n}\nexport function encodeMovementSetTurnSteering(steering: number): Uint8Array {\n return new Uint8Array([MOVEMENT_SET_TURN_STEERING_COMMAND, u8(steering)]);\n}\nexport function encodeImuSetYawFace(yawFace: number): Uint8Array {\n return new Uint8Array([IMU_SET_YAW_FACE_COMMAND, u8(yawFace)]);\n}\nexport function encodeImuResetYawAxis(value = 0): Uint8Array {\n return concat(new Uint8Array([IMU_RESET_YAW_AXIS_COMMAND]), packI16LE(value));\n}\n\nfunction withMotorSpeed(\n speed: number | undefined,\n motor: number | undefined,\n command: Uint8Array,\n): Uint8Array {\n if (speed === undefined || speed === UNCHANGED) return command;\n return concat(encodeMotorSetSpeed(speed, motor), command);\n}\nfunction withMovementSpeed(speed: number | undefined, command: Uint8Array): Uint8Array {\n if (speed === undefined || speed === UNCHANGED) return command;\n return concat(encodeMovementSetSpeed(speed), command);\n}\n\nexport interface InfoResponse {\n rpcMajor: number;\n rpcMinor: number;\n rpcBuild: number;\n firmwareMajor: number;\n firmwareMinor: number;\n firmwareBuild: number;\n bootloaderMajor: number;\n bootloaderMinor: number;\n bootloaderBuild: number;\n maxPacketSize: number;\n productGroupDevice: number;\n}\n\nexport function decodeInfoResponse(payload: Uint8Array): InfoResponse {\n const body =\n payload.length >= 1 && payload[0] === INFO_RESPONSE\n ? payload.subarray(1)\n : payload;\n if (body.length < 16) {\n throw new Error(\n `INFO_RESPONSE too short: got ${payload.length} wire bytes (need 17)`,\n );\n }\n const view = new DataView(body.buffer, body.byteOffset, body.byteLength);\n let o = 0;\n const rpcMajor = view.getUint8(o++);\n const rpcMinor = view.getUint8(o++);\n const rpcBuild = view.getUint16(o, true);\n o += 2;\n const firmwareMajor = view.getUint8(o++);\n const firmwareMinor = view.getUint8(o++);\n const firmwareBuild = view.getUint16(o, true);\n o += 2;\n const bootloaderMajor = view.getUint8(o++);\n const bootloaderMinor = view.getUint8(o++);\n const bootloaderBuild = view.getUint16(o, true);\n o += 2;\n const maxPacketSize = view.getUint16(o, true);\n o += 2;\n const productGroupDevice = view.getUint16(o, true);\n return {\n rpcMajor,\n rpcMinor,\n rpcBuild,\n firmwareMajor,\n firmwareMinor,\n firmwareBuild,\n bootloaderMajor,\n bootloaderMinor,\n bootloaderBuild,\n maxPacketSize,\n productGroupDevice,\n };\n}\n\nexport function encodeRpcCommand(\n method: string,\n args: Record<string, unknown> = {},\n): Uint8Array {\n const motor = Number(args.motor ?? 0);\n const direction = Number(args.direction ?? 0);\n const speed = args.speed !== undefined ? Number(args.speed) : UNCHANGED;\n\n switch (method) {\n case \"info_request\":\n return encodeInfoRequest();\n case \"program_flow_notification\":\n return encodeProgramFlow(Number(args.action ?? 0));\n case \"device_notification_request\":\n return encodeDeviceNotificationRequest(Number(args.delay_ms ?? 100));\n case \"light_color\":\n return encodeLightColor(\n Number(args.color ?? 0),\n Number(args.pattern ?? 0),\n Number(args.intensity ?? 100),\n );\n case \"beep\":\n return encodeBeep(\n Number(args.pattern ?? 0),\n Number(args.frequency ?? 440),\n Number(args.count ?? 1),\n );\n case \"stop_beep\":\n return encodeStopBeep();\n case \"motor_set_speed\":\n return encodeMotorSetSpeed(Number(args.speed ?? 0), motor);\n case \"motor_run\":\n return withMotorSpeed(speed, motor, encodeMotorRun(direction, motor));\n case \"motor_stop\":\n return encodeMotorStop(motor);\n case \"motor_run_for_degrees\":\n return withMotorSpeed(\n speed,\n motor,\n encodeMotorRunForDegrees(Number(args.degrees ?? 0), direction, motor),\n );\n case \"motor_run_for_time\":\n return withMotorSpeed(\n speed,\n motor,\n encodeMotorRunForTime(Number(args.time_ms ?? 0), direction, motor),\n );\n case \"motor_reset_relative_position\":\n return encodeMotorResetRelativePosition(Number(args.position ?? 0), motor);\n case \"motor_run_to_relative_position\":\n return withMotorSpeed(\n speed,\n motor,\n encodeMotorRunToRelativePosition(Number(args.position ?? 0), motor),\n );\n case \"motor_run_to_absolute_position\":\n return withMotorSpeed(\n speed,\n motor,\n encodeMotorRunToAbsolutePosition(Number(args.position ?? 0), direction || 2, motor),\n );\n case \"motor_set_duty_cycle\":\n return encodeMotorSetDutyCycle(Number(args.duty_cycle ?? 0), motor);\n case \"motor_set_end_state\":\n return encodeMotorSetEndState(Number(args.end_state ?? 0), motor);\n case \"motor_set_acceleration\":\n return encodeMotorSetAcceleration(\n Number(args.acceleration ?? 0),\n Number(args.deceleration ?? 0),\n motor,\n );\n case \"movement_set_speed\":\n return encodeMovementSetSpeed(Number(args.speed ?? 0));\n case \"movement_move\":\n return withMovementSpeed(speed, encodeMovementMove(direction));\n case \"movement_move_for_time\":\n return withMovementSpeed(\n speed,\n encodeMovementMoveForTime(Number(args.time_ms ?? 0), direction),\n );\n case \"movement_move_for_degrees\":\n return withMovementSpeed(\n speed,\n encodeMovementMoveForDegrees(Number(args.degrees ?? 0), direction),\n );\n case \"movement_move_tank\":\n return encodeMovementMoveTank(\n Number(args.speed_left ?? 0),\n Number(args.speed_right ?? 0),\n );\n case \"movement_move_tank_for_degrees\":\n return encodeMovementMoveTankForDegrees(\n Number(args.degrees ?? 0),\n Number(args.speed_left ?? 50),\n Number(args.speed_right ?? 50),\n );\n case \"movement_turn_for_degrees\":\n return withMovementSpeed(\n speed,\n encodeMovementTurnForDegrees(Number(args.degrees ?? 0), direction || 2),\n );\n case \"movement_stop\":\n return encodeMovementStop();\n case \"movement_set_end_state\":\n return encodeMovementSetEndState(Number(args.end_state ?? 0));\n case \"movement_set_acceleration\":\n return encodeMovementSetAcceleration(\n Number(args.acceleration ?? 0),\n Number(args.deceleration ?? 0),\n );\n case \"movement_set_turn_steering\":\n return encodeMovementSetTurnSteering(Number(args.steering ?? 0));\n case \"imu_set_yaw_face\":\n return encodeImuSetYawFace(Number(args.yaw_face ?? 0));\n case \"imu_reset_yaw_axis\":\n return encodeImuResetYawAxis(Number(args.value ?? 0));\n default:\n throw new Error(`RpcCodec: unsupported method \"${method}\"`);\n }\n}\n\nexport {\n parseDeviceNotifications,\n parseMotorNotifications,\n resultOpcodeForMethod,\n packU16LE,\n type ParsedDeviceNotifications,\n};\n","/**\n * Pluggable BLE transport — mirrors the Python package's BLETransport idea:\n * Device APIs stay stable; swap Mock ↔ WebBluetooth (or a future bridge).\n */\n\nexport type DeviceKind =\n | \"single-motor\"\n | \"double-motor\"\n | \"color-sensor\"\n | \"controller\";\n\nexport interface ConnectFilters {\n deviceName?: string;\n deviceMac?: string;\n cardColor?: number;\n cardSerial?: string;\n}\n\nexport interface ScannedDevice {\n id: string;\n name?: string;\n kind: DeviceKind;\n cardColor?: number;\n cardSerial?: string;\n}\n\nexport type NotificationHandler = (payload: Uint8Array) => void;\nexport type DisconnectHandler = () => void;\n\nexport interface TransportConnection {\n deviceId: string;\n kind: DeviceKind;\n}\n\n/**\n * Low-level transport contract.\n * Implementations: MockTransport (dev), WebBluetoothTransport (browser).\n */\nexport interface Transport {\n readonly name: string;\n\n scan(\n kind: DeviceKind,\n filters?: ConnectFilters,\n timeoutMs?: number,\n ): Promise<ScannedDevice[]>;\n\n connect(\n kind: DeviceKind,\n filters?: ConnectFilters,\n handlers?: {\n onNotification?: NotificationHandler;\n onDisconnect?: DisconnectHandler;\n },\n ): Promise<TransportConnection>;\n\n /** Send a raw RPC / protocol frame (already encoded). */\n send(connection: TransportConnection, message: Uint8Array): Promise<void>;\n\n disconnect(connection: TransportConnection): Promise<void>;\n\n shutdownAll(): Promise<void>;\n\n /**\n * Optional: map high-level method → wire bytes.\n * Mock omits this (DeviceBase falls back to JSON mock frames).\n * WebBluetooth provides real RPC packing.\n */\n encodeCommand?(method: string, args?: Record<string, unknown>): Uint8Array;\n\n /** Optional: wait until a notify frame with this opcode arrives. */\n waitForOpcode?(opcode: number, timeoutMs?: number): Promise<Uint8Array>;\n}\n\n/** Encode a high-level command for MockTransport (not the real LEGO RPC wire format). */\nexport function encodeMockCommand(\n method: string,\n args: Record<string, unknown> = {},\n): Uint8Array {\n const text = JSON.stringify({ method, args, t: Date.now() });\n return new TextEncoder().encode(text);\n}\n\nexport function decodeMockCommand(message: Uint8Array): {\n method: string;\n args: Record<string, unknown>;\n} {\n const parsed = JSON.parse(new TextDecoder().decode(message)) as {\n method: string;\n args?: Record<string, unknown>;\n };\n return { method: parsed.method, args: parsed.args ?? {} };\n}\n","import type {\n ConnectFilters,\n DeviceKind,\n DisconnectHandler,\n NotificationHandler,\n ScannedDevice,\n Transport,\n TransportConnection,\n} from \"./types.js\";\nimport { decodeMockCommand } from \"./types.js\";\n\nexport interface MockTransportOptions {\n /** Auto-succeed connect without requiring a prior scan. Default true. */\n autoConnect?: boolean;\n /** Log send/connect activity. Default true. */\n verbose?: boolean;\n /** Simulated devices available to scan/connect. */\n devices?: ScannedDevice[];\n}\n\nconst defaultDevices: ScannedDevice[] = [\n {\n id: \"mock-single-motor-1\",\n name: \"Mock Single Motor\",\n kind: \"single-motor\",\n cardColor: 4, // LEGO_COLOR_AZURE (official wire)\n cardSerial: \"3683\",\n },\n {\n id: \"mock-double-motor-1\",\n name: \"Mock Double Motor\",\n kind: \"double-motor\",\n cardColor: 4,\n cardSerial: \"3683\",\n },\n {\n id: \"mock-color-sensor-1\",\n name: \"Mock Color Sensor\",\n kind: \"color-sensor\",\n cardColor: 4,\n cardSerial: \"3683\",\n },\n {\n id: \"mock-controller-1\",\n name: \"Mock Controller\",\n kind: \"controller\",\n cardColor: 4,\n cardSerial: \"3683\",\n },\n];\n\nfunction matchesFilters(device: ScannedDevice, filters?: ConnectFilters): boolean {\n if (!filters) return true;\n if (filters.deviceName && device.name !== filters.deviceName) return false;\n if (filters.cardColor != null && device.cardColor !== filters.cardColor) return false;\n if (filters.cardSerial && device.cardSerial !== filters.cardSerial) return false;\n return true;\n}\n\n/**\n * In-memory transport for development and demos — no Bluetooth required.\n * Command frames use the skeleton's mock JSON encoding (see encodeMockCommand).\n */\nexport class MockTransport implements Transport {\n readonly name = \"mock\";\n\n private readonly autoConnect: boolean;\n private readonly verbose: boolean;\n private readonly catalog: ScannedDevice[];\n private readonly active = new Map<string, TransportConnection>();\n private notificationHandler?: NotificationHandler;\n\n /** Mutable mock sensor / motor state for demos. */\n readonly state = {\n position: 0,\n speed: 0,\n color: 0,\n leftPercent: 0,\n rightPercent: 0,\n };\n\n constructor(options: MockTransportOptions = {}) {\n this.autoConnect = options.autoConnect ?? true;\n this.verbose = options.verbose ?? true;\n this.catalog = options.devices ?? [...defaultDevices];\n }\n\n async scan(\n kind: DeviceKind,\n filters?: ConnectFilters,\n _timeoutMs = 5000,\n ): Promise<ScannedDevice[]> {\n return this.catalog.filter(\n (d) => d.kind === kind && matchesFilters(d, filters),\n );\n }\n\n async connect(\n kind: DeviceKind,\n filters?: ConnectFilters,\n handlers?: {\n onNotification?: NotificationHandler;\n onDisconnect?: DisconnectHandler;\n },\n ): Promise<TransportConnection> {\n this.notificationHandler = handlers?.onNotification;\n\n const found = (await this.scan(kind, filters))[0];\n if (!found && !this.autoConnect) {\n throw new Error(`MockTransport: no ${kind} matching filters`);\n }\n\n const device: ScannedDevice = found ?? {\n id: `mock-${kind}-auto`,\n name: `Mock ${kind}`,\n kind,\n cardColor: filters?.cardColor,\n cardSerial: filters?.cardSerial,\n };\n\n const connection: TransportConnection = {\n deviceId: device.id,\n kind: device.kind,\n };\n this.active.set(device.id, connection);\n this.log(`connected ${device.kind} (${device.id})`);\n return connection;\n }\n\n async send(connection: TransportConnection, message: Uint8Array): Promise<void> {\n if (!this.active.has(connection.deviceId)) {\n throw new Error(`MockTransport: not connected (${connection.deviceId})`);\n }\n\n const { method, args } = decodeMockCommand(message);\n this.log(`send ${method}`, args);\n this.applyCommand(method, args);\n\n // Emit a simple notification after motor-ish commands so callback demos work.\n if (method.startsWith(\"motor_\") || method.startsWith(\"movement_\")) {\n const note = new TextEncoder().encode(\n JSON.stringify({\n type: \"MotorNotification\",\n position: this.state.position,\n speed: this.state.speed,\n }),\n );\n this.notificationHandler?.(note);\n }\n }\n\n async disconnect(connection: TransportConnection): Promise<void> {\n this.active.delete(connection.deviceId);\n this.log(`disconnected ${connection.deviceId}`);\n }\n\n async shutdownAll(): Promise<void> {\n this.active.clear();\n this.log(\"shutdownAll\");\n }\n\n private applyCommand(method: string, args: Record<string, unknown>): void {\n switch (method) {\n case \"motor_run\":\n case \"motor_set_speed\":\n this.state.speed = Number(args.speed ?? 0);\n break;\n case \"motor_run_for_degrees\":\n this.state.position += Number(args.degrees ?? 0);\n this.state.speed = Number(args.speed ?? this.state.speed);\n break;\n case \"motor_run_for_time\":\n this.state.speed = Number(args.speed ?? this.state.speed);\n break;\n case \"motor_reset_relative_position\":\n this.state.position = Number(args.position ?? 0);\n break;\n case \"motor_run_to_relative_position\":\n case \"motor_run_to_absolute_position\":\n this.state.position = Number(args.position ?? 0);\n break;\n case \"motor_stop\":\n case \"movement_stop\":\n this.state.speed = 0;\n break;\n case \"movement_move_tank\":\n this.state.speed =\n (Number(args.speed_left ?? 0) + Number(args.speed_right ?? 0)) / 2;\n break;\n default:\n break;\n }\n }\n\n private log(message: string, extra?: unknown): void {\n if (!this.verbose) return;\n if (extra !== undefined) {\n console.log(`[MockTransport] ${message}`, extra);\n } else {\n console.log(`[MockTransport] ${message}`);\n }\n }\n}\n","import {\n decodeInfoResponse,\n encodeDeviceNotificationRequest,\n encodeInfoRequest,\n encodeRpcCommand,\n type InfoResponse,\n} from \"../protocol/codec.js\";\nimport { splitNotifyFrames } from \"../protocol/frames.js\";\nimport {\n DEVICE_NOTIFICATION_RESPONSE,\n INFO_RESPONSE,\n} from \"../protocol/opcodes.js\";\nimport {\n NOTIFY_UUID,\n PRODUCT_GROUP_DEVICE_COLOR_SENSOR,\n PRODUCT_GROUP_DEVICE_CONTROLLER,\n PRODUCT_GROUP_DEVICE_DOUBLE_MOTOR,\n PRODUCT_GROUP_DEVICE_SINGLE_MOTOR,\n RPC_VERSION,\n SERVICE_UUID,\n WRITE_UUID,\n} from \"../protocol/uuids.js\";\nimport type {\n ConnectFilters,\n DeviceKind,\n DisconnectHandler,\n NotificationHandler,\n ScannedDevice,\n Transport,\n TransportConnection,\n} from \"./types.js\";\n\ntype BluetoothNavigator = Navigator & {\n bluetooth: {\n requestDevice(options: {\n filters?: Array<{ services?: string[]; namePrefix?: string }>;\n optionalServices?: string[];\n acceptAllDevices?: boolean;\n }): Promise<BluetoothDeviceLike>;\n };\n};\n\ninterface BluetoothDeviceLike extends EventTarget {\n id: string;\n name?: string;\n gatt?: {\n connected: boolean;\n connect(): Promise<BluetoothRemoteGATTServerLike>;\n disconnect(): void;\n };\n}\n\ninterface BluetoothRemoteGATTServerLike {\n connected: boolean;\n connect(): Promise<BluetoothRemoteGATTServerLike>;\n getPrimaryService(uuid: string): Promise<BluetoothRemoteGATTServiceLike>;\n device: BluetoothDeviceLike;\n}\n\ninterface BluetoothRemoteGATTServiceLike {\n getCharacteristic(uuid: string): Promise<BluetoothRemoteGATTCharacteristicLike>;\n}\n\ninterface BluetoothRemoteGATTCharacteristicLike extends EventTarget {\n writeValueWithoutResponse?(value: BufferSource): Promise<void>;\n writeValue?(value: BufferSource): Promise<void>;\n startNotifications(): Promise<BluetoothRemoteGATTCharacteristicLike>;\n stopNotifications(): Promise<BluetoothRemoteGATTCharacteristicLike>;\n value?: DataView;\n}\n\ninterface LiveConnection extends TransportConnection {\n device: BluetoothDeviceLike;\n server: BluetoothRemoteGATTServerLike;\n writeChar: BluetoothRemoteGATTCharacteristicLike;\n notifyChar: BluetoothRemoteGATTCharacteristicLike;\n onNotification?: NotificationHandler;\n onDisconnect?: DisconnectHandler;\n info?: InfoResponse;\n}\n\nexport interface WebBluetoothTransportOptions {\n /** Reject connect if INFO_RESPONSE productGroupDevice mismatches kind. Default true. */\n enforceProductGroup?: boolean;\n /** Warn (default) or throw when RPC version ≠ package expectation. */\n rpcVersionMode?: \"warn\" | \"throw\" | \"ignore\";\n /** Default timeout waiting for RPC result notify. */\n defaultTimeoutMs?: number;\n}\n\n/**\n * Browser Web Bluetooth transport (Chrome / Edge, HTTPS or localhost).\n *\n * Connect skeleton: requestDevice(fd02) → GATT → notify → INFO_REQUEST handshake.\n * Command encoding uses `encodeRpcCommand` (official-aligned frames).\n */\nexport class WebBluetoothTransport implements Transport {\n readonly name = \"web-bluetooth\";\n\n private readonly enforceProductGroup: boolean;\n private readonly rpcVersionMode: \"warn\" | \"throw\" | \"ignore\";\n private readonly defaultTimeoutMs: number;\n private readonly live = new Map<string, LiveConnection>();\n /** FIFO waiters per opcode (matches official Python deque). */\n private readonly waiters = new Map<\n number,\n Array<{\n resolve: (p: Uint8Array) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }>\n >();\n\n constructor(options: WebBluetoothTransportOptions = {}) {\n this.enforceProductGroup = options.enforceProductGroup ?? true;\n this.rpcVersionMode = options.rpcVersionMode ?? \"warn\";\n this.defaultTimeoutMs = options.defaultTimeoutMs ?? 15_000;\n }\n\n encodeCommand(method: string, args: Record<string, unknown> = {}): Uint8Array {\n return encodeRpcCommand(method, args);\n }\n\n async scan(\n _kind: DeviceKind,\n _filters?: ConnectFilters,\n _timeoutMs?: number,\n ): Promise<ScannedDevice[]> {\n this.assertBrowser();\n // Web Bluetooth has no background scan API like bleak; selection happens in connect().\n return [];\n }\n\n async connect(\n kind: DeviceKind,\n _filters?: ConnectFilters,\n handlers?: {\n onNotification?: NotificationHandler;\n onDisconnect?: DisconnectHandler;\n },\n ): Promise<TransportConnection> {\n this.assertBrowser();\n\n const nav = navigator as BluetoothNavigator;\n // Must run from a user gesture (button click).\n const device = await nav.bluetooth.requestDevice({\n filters: [{ services: [SERVICE_UUID] }],\n optionalServices: [SERVICE_UUID],\n });\n\n if (!device.gatt) {\n throw new Error(\"WebBluetoothTransport: device has no GATT\");\n }\n\n const server = await device.gatt.connect();\n const service = await server.getPrimaryService(SERVICE_UUID);\n const writeChar = await service.getCharacteristic(WRITE_UUID);\n const notifyChar = await service.getCharacteristic(NOTIFY_UUID);\n\n const live: LiveConnection = {\n deviceId: device.id,\n kind,\n device,\n server,\n writeChar,\n notifyChar,\n onNotification: handlers?.onNotification,\n onDisconnect: handlers?.onDisconnect,\n };\n\n const onGattDisconnected = () => {\n this.live.delete(device.id);\n this.rejectAllWaiters(new Error(\"Device disconnected\"));\n handlers?.onDisconnect?.();\n };\n device.addEventListener(\"gattserverdisconnected\", onGattDisconnected);\n\n // 接收设备数据\n const onNotify = (event: Event) => {\n const target = event.target as BluetoothRemoteGATTCharacteristicLike;\n const value = target.value;\n if (!value) return;\n const raw = new Uint8Array(\n value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength),\n );\n // One GATT notify may contain DEVICE_NOTIFICATION + RPC result back-to-back.\n for (const payload of splitNotifyFrames(raw)) {\n live.onNotification?.(payload);\n this.resolveWaiter(payload[0]!, payload);\n }\n };\n notifyChar.addEventListener(\"characteristicvaluechanged\", onNotify);\n await notifyChar.startNotifications();\n\n this.live.set(device.id, live);\n\n // Register waiter before write to avoid missing a fast INFO_RESPONSE.\n const infoWait = this.waitForOpcode(INFO_RESPONSE, 8_000);\n await this.writeRaw(live, encodeInfoRequest());\n const infoPayload = await infoWait;\n const info = decodeInfoResponse(infoPayload);\n live.info = info;\n this.checkRpcVersion(info);\n this.checkProductGroup(kind, info);\n\n // Enable periodic DEVICE_NOTIFICATION (position / speed), like official connect().\n const notifWait = this.waitForOpcode(DEVICE_NOTIFICATION_RESPONSE, 5_000);\n await this.writeRaw(live, encodeDeviceNotificationRequest(100));\n await notifWait;\n\n return live;\n }\n\n async send(connection: TransportConnection, message: Uint8Array): Promise<void> {\n const live = this.requireLive(connection.deviceId);\n await this.writeRaw(live, message);\n }\n\n async waitForOpcode(opcode: number, timeoutMs = this.defaultTimeoutMs): Promise<Uint8Array> {\n return new Promise<Uint8Array>((resolve, reject) => {\n const entry = {\n resolve: (payload: Uint8Array) => {\n clearTimeout(entry.timer);\n resolve(payload);\n },\n reject: (err: Error) => {\n clearTimeout(entry.timer);\n reject(err);\n },\n timer: setTimeout(() => {\n const q = this.waiters.get(opcode);\n if (q) {\n const idx = q.indexOf(entry);\n if (idx >= 0) q.splice(idx, 1);\n if (q.length === 0) this.waiters.delete(opcode);\n }\n reject(new Error(`Timeout waiting for opcode ${opcode}`));\n }, timeoutMs),\n };\n\n const q = this.waiters.get(opcode) ?? [];\n q.push(entry);\n this.waiters.set(opcode, q);\n });\n }\n\n async disconnect(connection: TransportConnection): Promise<void> {\n const live = this.live.get(connection.deviceId);\n if (!live) return;\n try {\n await live.notifyChar.stopNotifications().catch(() => undefined);\n } finally {\n live.device.gatt?.disconnect();\n this.live.delete(connection.deviceId);\n }\n }\n\n async shutdownAll(): Promise<void> {\n for (const id of [...this.live.keys()]) {\n await this.disconnect({ deviceId: id, kind: \"single-motor\" });\n }\n this.rejectAllWaiters(new Error(\"shutdownAll\"));\n }\n\n /** Last INFO_RESPONSE for a connection (if handshake completed). */\n getInfo(connection: TransportConnection): InfoResponse | undefined {\n return this.live.get(connection.deviceId)?.info;\n }\n\n static isSupported(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n typeof (navigator as Navigator & { bluetooth?: unknown }).bluetooth !==\n \"undefined\"\n );\n }\n\n private async writeRaw(live: LiveConnection, message: Uint8Array): Promise<void> {\n const { writeChar } = live;\n // Copy into a plain ArrayBuffer view for DOM BufferSource typing.\n const bytes = new Uint8Array(message);\n if (writeChar.writeValueWithoutResponse) {\n await writeChar.writeValueWithoutResponse(bytes);\n } else if (writeChar.writeValue) {\n await writeChar.writeValue(bytes);\n } else {\n throw new Error(\"WebBluetoothTransport: characteristic is not writable\");\n }\n }\n\n private requireLive(deviceId: string): LiveConnection {\n const live = this.live.get(deviceId);\n if (!live) throw new Error(`WebBluetoothTransport: not connected (${deviceId})`);\n return live;\n }\n\n private checkRpcVersion(info: InfoResponse): void {\n if (this.rpcVersionMode === \"ignore\") return;\n const match =\n info.rpcMajor === RPC_VERSION.major &&\n info.rpcMinor === RPC_VERSION.minor &&\n info.rpcBuild === RPC_VERSION.build;\n if (match) return;\n const msg =\n `RPC version mismatch: device=${info.rpcMajor}.${info.rpcMinor}.${info.rpcBuild}, ` +\n `expected=${RPC_VERSION.major}.${RPC_VERSION.minor}.${RPC_VERSION.build}. ` +\n `Update firmware via Coding Canvas or adjust client.`;\n if (this.rpcVersionMode === \"throw\") throw new Error(msg);\n console.warn(`[WebBluetoothTransport] ${msg}`);\n }\n\n private checkProductGroup(kind: DeviceKind, info: InfoResponse): void {\n if (!this.enforceProductGroup) return;\n const expected: Record<DeviceKind, number> = {\n \"single-motor\": PRODUCT_GROUP_DEVICE_SINGLE_MOTOR,\n \"double-motor\": PRODUCT_GROUP_DEVICE_DOUBLE_MOTOR,\n \"color-sensor\": PRODUCT_GROUP_DEVICE_COLOR_SENSOR,\n controller: PRODUCT_GROUP_DEVICE_CONTROLLER,\n };\n const want = expected[kind];\n if (info.productGroupDevice !== want) {\n throw new Error(\n `Expected ${kind} (productGroupDevice=${want}), got ${info.productGroupDevice}`,\n );\n }\n }\n\n private resolveWaiter(opcode: number, payload: Uint8Array): void {\n const q = this.waiters.get(opcode);\n if (!q?.length) return;\n const waiter = q.shift()!;\n if (q.length === 0) this.waiters.delete(opcode);\n waiter.resolve(payload);\n }\n\n private rejectAllWaiters(err: Error): void {\n for (const [, q] of this.waiters) {\n for (const w of q) w.reject(err);\n }\n this.waiters.clear();\n }\n\n private assertBrowser(): void {\n if (!WebBluetoothTransport.isSupported()) {\n throw new Error(\n \"Web Bluetooth is not available (need Chromium + HTTPS/localhost).\",\n );\n }\n }\n}\n","import { PROGRAM_ACTION_START } from \"../constants.js\";\nimport { resultOpcodeForMethod } from \"../protocol/opcodes.js\";\nimport type {\n ConnectFilters,\n DeviceKind,\n Transport,\n TransportConnection,\n} from \"../transport/types.js\";\nimport { encodeMockCommand } from \"../transport/types.js\";\n\nexport type DeviceNotificationCallback = (data: Uint8Array) => void;\n\nexport interface DeviceOptions {\n transport?: Transport;\n}\n\nlet defaultTransport: Transport | undefined;\n\nexport function setDefaultTransport(transport: Transport): void {\n defaultTransport = transport;\n}\n\nexport function getDefaultTransport(): Transport | undefined {\n return defaultTransport;\n}\n\nfunction concatFrames(frames: Uint8Array[]): Uint8Array {\n const total = frames.reduce((n, f) => n + f.length, 0);\n const out = new Uint8Array(total);\n let o = 0;\n for (const f of frames) {\n out.set(f, o);\n o += f.length;\n }\n return out;\n}\n\n/**\n * Shared connect / disconnect / send plumbing for all hardware classes.\n */\nexport abstract class DeviceBase {\n abstract readonly kind: DeviceKind;\n\n protected transport: Transport;\n protected connection: TransportConnection | null = null;\n protected notificationCallback: DeviceNotificationCallback | null = null;\n private batchBuffer: Uint8Array[] | null = null;\n\n get connected(): boolean {\n return this.connection !== null;\n }\n\n get deviceId(): string | null {\n return this.connection?.deviceId ?? null;\n }\n\n constructor(options: DeviceOptions = {}) {\n const transport = options.transport ?? defaultTransport;\n if (!transport) {\n throw new Error(\n `${this.constructor.name}: pass { transport } or call setDefaultTransport(...) first`,\n );\n }\n this.transport = transport;\n }\n\n async connect(\n filters: ConnectFilters = {},\n _options?: { deviceNotificationDelay?: number, onDisconnect?: (() => void) },\n ): Promise<void> {\n void _options;\n this.connection = await this.transport.connect(this.kind, filters, {\n onNotification: (payload) => {\n this.applyNotification(payload);\n this.notificationCallback?.(payload);\n },\n onDisconnect: () => {\n this.connection = null;\n if (_options && _options.onDisconnect && typeof _options.onDisconnect === 'function') {\n _options.onDisconnect();\n }\n },\n });\n // LED / beep RPCs need an active program session on many firmwares.\n await this.programFlowNotification(PROGRAM_ACTION_START, { blocking: false });\n }\n\n protected applyNotification(_payload: Uint8Array): void {}\n\n async disconnect(): Promise<void> {\n if (!this.connection) return;\n await this.transport.disconnect(this.connection);\n this.connection = null;\n }\n\n setNotificationCallback(callback: DeviceNotificationCallback | null): void {\n this.notificationCallback = callback;\n }\n\n async search(\n filters?: ConnectFilters,\n timeoutMs = 5000,\n ): Promise<Awaited<ReturnType<Transport[\"scan\"]>>> {\n return this.transport.scan(this.kind, filters, timeoutMs);\n }\n\n /** Python: `light_color(color, ...)` */\n async lightColor(\n color: number,\n options: { pattern?: number; intensity?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"light_color\", {\n color,\n pattern: options.pattern ?? 0,\n intensity: options.intensity ?? 100,\n blocking: options.blocking ?? true,\n });\n }\n\n /** Python: `beep(...)` */\n async beep(\n options: {\n pattern?: number;\n frequency?: number;\n count?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"beep\", {\n pattern: options.pattern ?? 0,\n frequency: options.frequency ?? 440,\n count: options.count ?? 1,\n blocking: options.blocking ?? true,\n });\n }\n\n /** Python: `stop_beep(...)` */\n async stopBeep(options: { blocking?: boolean } = {}): Promise<void> {\n await this.sendCommand(\"stop_beep\", {\n blocking: options.blocking ?? true,\n });\n }\n\n /** Python: `program_flow_notification(action, ...)` */\n async programFlowNotification(\n action: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"program_flow_notification\", {\n action,\n blocking: options.blocking ?? false,\n });\n }\n\n /** Python: `device_notification_request(delay_ms, ...)` */\n async deviceNotificationRequest(\n delayMs: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"device_notification_request\", {\n delay_ms: delayMs,\n blocking: options.blocking ?? true,\n });\n }\n\n /** Python: `begin_batch()` — client-side queue (motor commands only). */\n beginBatch(): void {\n this.batchBuffer = [];\n }\n\n /** Python: `end_batch()` — flush queued frames in one BLE write. */\n async endBatch(options: { blocking?: boolean } = {}): Promise<void> {\n if (!this.batchBuffer) return;\n if (!this.connection) {\n this.batchBuffer = null;\n throw new Error(`${this.constructor.name}: not connected`);\n }\n const frames = this.batchBuffer;\n this.batchBuffer = null;\n if (frames.length === 0) return;\n await this.transport.send(this.connection, concatFrames(frames));\n void options;\n }\n\n /** Python: `cancel_batch()` */\n cancelBatch(): number {\n const n = this.batchBuffer?.length ?? 0;\n this.batchBuffer = null;\n return n;\n }\n\n protected async sendCommand(\n method: string,\n args: Record<string, unknown> = {},\n ): Promise<void> {\n if (!this.connection) {\n throw new Error(`${this.constructor.name}: not connected`);\n }\n\n if (this.batchBuffer && method.startsWith(\"movement_\")) {\n throw new Error(\n \"Movement commands cannot be called inside a batch. Use motor_* commands instead.\",\n );\n }\n\n const blocking = args.blocking !== false;\n const frame =\n this.transport.encodeCommand?.(method, args) ??\n encodeMockCommand(method, args);\n\n if (this.batchBuffer) {\n this.batchBuffer.push(frame);\n return;\n }\n\n const resultOpcode = resultOpcodeForMethod(method);\n const waitForOpcode = this.transport.waitForOpcode;\n let waitPromise: Promise<Uint8Array> | undefined;\n if (blocking && resultOpcode != null && waitForOpcode) {\n const degrees = Number(args.degrees ?? 0);\n const timeMs = Number(args.time_ms ?? 0);\n const quickRpc =\n method === \"light_color\" ||\n method === \"beep\" ||\n method === \"stop_beep\" ||\n method === \"device_notification_request\";\n const timeoutMs = quickRpc\n ? 5_000\n : Math.max(15_000, Math.abs(degrees) * 50 + 5_000, timeMs + 5_000);\n waitPromise = waitForOpcode.call(this.transport, resultOpcode, timeoutMs);\n }\n\n await this.transport.send(this.connection, frame);\n if (waitPromise) await waitPromise;\n }\n}\n","import {\n DEFAULT_MOTOR,\n MOTOR_MOVE_DIRECTION_CLOCKWISE,\n MOTOR_MOVE_DIRECTION_SHORTEST,\n UNCHANGED,\n} from \"../constants.js\";\nimport { parseDeviceNotifications } from \"../protocol/notifications.js\";\nimport type { DeviceKind } from \"../transport/types.js\";\nimport { DeviceBase, type DeviceOptions } from \"./base.js\";\n\nexport interface MotorReading {\n position: number;\n speed: number;\n absolutePosition?: number;\n motorState?: number;\n power?: number;\n gesture?: number;\n}\n\n/** Python: `le.SingleMotor()` */\nexport class SingleMotor extends DeviceBase {\n readonly kind: DeviceKind = \"single-motor\";\n readonly motor: MotorReading = { position: 0, speed: 0 };\n\n constructor(options: DeviceOptions = {}) {\n super(options);\n }\n\n protected applyNotification(payload: Uint8Array): void {\n const { motors } = parseDeviceNotifications(payload);\n for (const reading of motors) {\n this.motor.position = reading.position;\n this.motor.speed = reading.speed;\n this.motor.absolutePosition = reading.absolutePosition;\n this.motor.motorState = reading.motorState;\n this.motor.power = reading.power;\n this.motor.gesture = reading.gesture;\n }\n }\n\n private get useCommandSideEstimates(): boolean {\n return this.transport.name === \"mock\";\n }\n\n async motorSetSpeed(\n speed: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_speed\", {\n speed,\n motor: options.motor ?? DEFAULT_MOTOR,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.speed = speed;\n }\n\n async motorRun(\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n const speed = options.speed ?? UNCHANGED;\n await this.sendCommand(\"motor_run\", {\n direction: options.direction ?? MOTOR_MOVE_DIRECTION_CLOCKWISE,\n motor: options.motor ?? DEFAULT_MOTOR,\n speed,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates && speed !== UNCHANGED) {\n this.motor.speed = speed;\n }\n }\n\n async motorRunForTime(\n timeMs: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_for_time\", {\n time_ms: timeMs,\n direction: options.direction ?? MOTOR_MOVE_DIRECTION_CLOCKWISE,\n motor: options.motor ?? DEFAULT_MOTOR,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorRunForDegrees(\n degrees: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_for_degrees\", {\n degrees,\n direction: options.direction ?? MOTOR_MOVE_DIRECTION_CLOCKWISE,\n motor: options.motor ?? DEFAULT_MOTOR,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.position += degrees;\n }\n\n async motorResetRelativePosition(\n options: { motor?: number; position?: number; blocking?: boolean } = {},\n ): Promise<void> {\n const position = options.position ?? 0;\n await this.sendCommand(\"motor_reset_relative_position\", {\n motor: options.motor ?? DEFAULT_MOTOR,\n position,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.position = position;\n }\n\n async motorRunToRelativePosition(\n position: number,\n options: { motor?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_to_relative_position\", {\n position,\n motor: options.motor ?? DEFAULT_MOTOR,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.position = position;\n }\n\n async motorRunToAbsolutePosition(\n position: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_to_absolute_position\", {\n position,\n direction: options.direction ?? MOTOR_MOVE_DIRECTION_SHORTEST,\n motor: options.motor ?? DEFAULT_MOTOR,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.position = position;\n }\n\n async motorSetDutyCycle(\n dutyCycle: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_duty_cycle\", {\n duty_cycle: dutyCycle,\n motor: options.motor ?? DEFAULT_MOTOR,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorStop(\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_stop\", {\n motor: options.motor ?? DEFAULT_MOTOR,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.speed = 0;\n }\n\n async motorSetEndState(\n endState: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_end_state\", {\n end_state: endState,\n motor: options.motor ?? DEFAULT_MOTOR,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorSetAcceleration(\n acceleration: number,\n deceleration: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_acceleration\", {\n acceleration,\n deceleration,\n motor: options.motor ?? DEFAULT_MOTOR,\n blocking: options.blocking ?? true,\n });\n }\n}\n","import {\n MOTOR_BOTH,\n MOTOR_LEFT,\n MOTOR_RIGHT,\n MOVEMENT_DIRECTION_FORWARD,\n MOVEMENT_MOVE_DIRECTION_FORWARD,\n MOVEMENT_TURN_DIRECTION_LEFT,\n UNCHANGED,\n} from \"../constants.js\";\nimport { parseDeviceNotifications } from \"../protocol/notifications.js\";\nimport type { DeviceKind } from \"../transport/types.js\";\nimport { DeviceBase, type DeviceOptions } from \"./base.js\";\nimport type { MotorReading } from \"./single-motor.js\";\n\nexport interface ImuReading {\n orientation: number;\n yawFace: number;\n yaw: number;\n pitch: number;\n roll: number;\n accelerometerX: number;\n accelerometerY: number;\n accelerometerZ: number;\n gyroscopeX: number;\n gyroscopeY: number;\n gyroscopeZ: number;\n gesture?: number;\n}\n\n/** Python: `le.DoubleMotor()` */\nexport class DoubleMotor extends DeviceBase {\n readonly kind: DeviceKind = \"double-motor\";\n\n readonly motor: Record<number, MotorReading> = {\n [MOTOR_LEFT]: { position: 0, speed: 0 },\n [MOTOR_RIGHT]: { position: 0, speed: 0 },\n };\n\n readonly imu: ImuReading = {\n orientation: 0,\n yawFace: 0,\n yaw: 0,\n pitch: 0,\n roll: 0,\n accelerometerX: 0,\n accelerometerY: 0,\n accelerometerZ: 0,\n gyroscopeX: 0,\n gyroscopeY: 0,\n gyroscopeZ: 0,\n };\n\n constructor(options: DeviceOptions = {}) {\n super(options);\n }\n\n protected applyNotification(payload: Uint8Array): void {\n const parsed = parseDeviceNotifications(payload);\n for (const reading of parsed.motors) {\n const sides: number[] = [];\n if (reading.motorBitMask & 1) sides.push(MOTOR_LEFT);\n if (reading.motorBitMask & 2) sides.push(MOTOR_RIGHT);\n for (const side of sides) {\n this.motor[side].position = reading.position;\n this.motor[side].speed = reading.speed;\n this.motor[side].absolutePosition = reading.absolutePosition;\n this.motor[side].motorState = reading.motorState;\n this.motor[side].power = reading.power;\n this.motor[side].gesture = reading.gesture;\n }\n }\n if (parsed.imu) Object.assign(this.imu, parsed.imu);\n if (parsed.imuGesture !== undefined) this.imu.gesture = parsed.imuGesture;\n }\n\n private get useCommandSideEstimates(): boolean {\n return this.transport.name === \"mock\";\n }\n\n async motorSetSpeed(\n speed: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n const motor = options.motor ?? MOTOR_BOTH;\n await this.sendCommand(\"motor_set_speed\", {\n speed,\n motor,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.touchMotor(motor, { speed });\n }\n\n async motorRun(\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n const motor = options.motor ?? MOTOR_BOTH;\n const speed = options.speed ?? UNCHANGED;\n await this.sendCommand(\"motor_run\", {\n direction: options.direction ?? 0,\n motor,\n speed,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates && speed !== UNCHANGED) {\n this.touchMotor(motor, { speed });\n }\n }\n\n async motorRunForTime(\n timeMs: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_for_time\", {\n time_ms: timeMs,\n direction: options.direction ?? 0,\n motor: options.motor ?? MOTOR_BOTH,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorRunForDegrees(\n degrees: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n const motor = options.motor ?? MOTOR_BOTH;\n await this.sendCommand(\"motor_run_for_degrees\", {\n degrees,\n direction: options.direction ?? 0,\n motor,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) {\n this.touchMotor(motor, { positionDelta: degrees });\n }\n }\n\n async motorResetRelativePosition(\n options: { motor?: number; position?: number; blocking?: boolean } = {},\n ): Promise<void> {\n const position = options.position ?? 0;\n const motor = options.motor ?? MOTOR_BOTH;\n await this.sendCommand(\"motor_reset_relative_position\", {\n motor,\n position,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) {\n this.touchMotor(motor, { position });\n }\n }\n\n async motorRunToRelativePosition(\n position: number,\n options: { motor?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n const motor = options.motor ?? MOTOR_BOTH;\n await this.sendCommand(\"motor_run_to_relative_position\", {\n position,\n motor,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.touchMotor(motor, { position });\n }\n\n async motorRunToAbsolutePosition(\n position: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_to_absolute_position\", {\n position,\n direction: options.direction ?? 2,\n motor: options.motor ?? MOTOR_BOTH,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorSetDutyCycle(\n dutyCycle: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_duty_cycle\", {\n duty_cycle: dutyCycle,\n motor: options.motor ?? MOTOR_BOTH,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorStop(\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n const motor = options.motor ?? MOTOR_BOTH;\n await this.sendCommand(\"motor_stop\", {\n motor,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.touchMotor(motor, { speed: 0 });\n }\n\n async motorSetEndState(\n endState: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_end_state\", {\n end_state: endState,\n motor: options.motor ?? MOTOR_BOTH,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorSetAcceleration(\n acceleration: number,\n deceleration: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_acceleration\", {\n acceleration,\n deceleration,\n motor: options.motor ?? MOTOR_BOTH,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementMove(\n options: { direction?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_move\", {\n direction: options.direction ?? MOVEMENT_DIRECTION_FORWARD,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementMoveForTime(\n timeMs: number,\n options: { direction?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_move_for_time\", {\n time_ms: timeMs,\n direction: options.direction ?? MOVEMENT_DIRECTION_FORWARD,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementMoveForDegrees(\n degrees: number,\n options: { direction?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_move_for_degrees\", {\n degrees,\n direction: options.direction ?? MOVEMENT_MOVE_DIRECTION_FORWARD,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementMoveTank(\n speedLeft: number,\n speedRight: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_move_tank\", {\n speed_left: speedLeft,\n speed_right: speedRight,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) {\n this.motor[MOTOR_LEFT].speed = speedLeft;\n this.motor[MOTOR_RIGHT].speed = speedRight;\n }\n }\n\n async movementMoveTankForDegrees(\n degrees: number,\n options: {\n speedLeft?: number;\n speedRight?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_move_tank_for_degrees\", {\n degrees,\n speed_left: options.speedLeft ?? 50,\n speed_right: options.speedRight ?? 50,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementTurnForDegrees(\n degrees: number,\n options: { direction?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_turn_for_degrees\", {\n degrees,\n direction: options.direction ?? MOVEMENT_TURN_DIRECTION_LEFT,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementStop(options: { blocking?: boolean } = {}): Promise<void> {\n await this.sendCommand(\"movement_stop\", {\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) {\n this.motor[MOTOR_LEFT].speed = 0;\n this.motor[MOTOR_RIGHT].speed = 0;\n }\n }\n\n async movementSetSpeed(\n speed: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_set_speed\", {\n speed,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementSetEndState(\n endState: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_set_end_state\", {\n end_state: endState,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementSetAcceleration(\n acceleration: number,\n deceleration: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_set_acceleration\", {\n acceleration,\n deceleration,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementSetTurnSteering(\n steering: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_set_turn_steering\", {\n steering,\n blocking: options.blocking ?? true,\n });\n }\n\n async imuSetYawFace(\n yawFace: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"imu_set_yaw_face\", {\n yaw_face: yawFace,\n blocking: options.blocking ?? true,\n });\n }\n\n async imuResetYawAxis(\n value = 0,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"imu_reset_yaw_axis\", {\n value,\n blocking: options.blocking ?? true,\n });\n }\n\n private touchMotor(\n motor: number,\n patch: { speed?: number; positionDelta?: number; position?: number },\n ): void {\n const targets =\n motor === MOTOR_BOTH\n ? [MOTOR_LEFT, MOTOR_RIGHT]\n : motor === MOTOR_LEFT || motor === MOTOR_RIGHT\n ? [motor]\n : [MOTOR_LEFT];\n\n for (const side of targets) {\n if (patch.speed !== undefined) this.motor[side].speed = patch.speed;\n if (patch.positionDelta !== undefined) {\n this.motor[side].position += patch.positionDelta;\n }\n if (patch.position !== undefined) this.motor[side].position = patch.position;\n }\n }\n}\n","import { parseDeviceNotifications } from \"../protocol/notifications.js\";\nimport type { DeviceKind } from \"../transport/types.js\";\nimport { DeviceBase, type DeviceOptions } from \"./base.js\";\n\n/** Python: `colorsensor.sensor` */\nexport interface ColorSensorReading {\n color: number;\n rawRed: number;\n rawGreen: number;\n rawBlue: number;\n reflection: number;\n hue?: number;\n saturation?: number;\n value?: number;\n}\n\n/** Python: `le.ColorSensor()` */\nexport class ColorSensor extends DeviceBase {\n readonly kind: DeviceKind = \"color-sensor\";\n\n readonly sensor: ColorSensorReading = {\n color: 0,\n rawRed: 0,\n rawGreen: 0,\n rawBlue: 0,\n reflection: 0,\n };\n\n constructor(options: DeviceOptions = {}) {\n super(options);\n }\n\n // 收到消息\n protected applyNotification(payload: Uint8Array): void {\n const { color } = parseDeviceNotifications(payload);\n if (!color) return;\n this.sensor.color = color.color;\n this.sensor.reflection = color.reflection;\n this.sensor.rawRed = color.rawRed;\n this.sensor.rawGreen = color.rawGreen;\n this.sensor.rawBlue = color.rawBlue;\n this.sensor.hue = color.hue;\n this.sensor.saturation = color.saturation;\n this.sensor.value = color.value;\n }\n\n /** Demo helper for MockTransport. */\n mockSetColor(partial: Partial<ColorSensorReading>): void {\n Object.assign(this.sensor, partial);\n }\n}\n","import { parseDeviceNotifications } from \"../protocol/notifications.js\";\nimport type { DeviceKind } from \"../transport/types.js\";\nimport { DeviceBase, type DeviceOptions } from \"./base.js\";\n\n/** Python: `controller.sensor` */\nexport interface ControllerReading {\n leftPercent: number;\n rightPercent: number;\n leftAngle: number;\n rightAngle: number;\n}\n\n/** Python: `le.Controller()` */\nexport class Controller extends DeviceBase {\n readonly kind: DeviceKind = \"controller\";\n\n readonly sensor: ControllerReading = {\n leftPercent: 0,\n rightPercent: 0,\n leftAngle: 0,\n rightAngle: 0,\n };\n\n buttonState = 0;\n\n constructor(options: DeviceOptions = {}) {\n super(options);\n }\n\n protected applyNotification(payload: Uint8Array): void {\n const parsed = parseDeviceNotifications(payload);\n if (parsed.controller) {\n // console.log(parsed.controller, 'parsed.controller!!!!')\n this.sensor.leftPercent = parsed.controller.leftPercent;\n this.sensor.rightPercent = parsed.controller.rightPercent;\n this.sensor.leftAngle = parsed.controller.leftAngle;\n this.sensor.rightAngle = parsed.controller.rightAngle;\n }\n if (parsed.buttonState !== undefined) {\n this.buttonState = parsed.buttonState;\n }\n }\n\n /** Demo helper for MockTransport. */\n mockSetLevers(partial: Partial<ControllerReading>): void {\n Object.assign(this.sensor, partial);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["nav"],"sources":["../src/protocol/colors.ts","../src/constants.ts","../src/protocol/uuids.ts","../src/protocol/opcodes.ts","../src/protocol/frames.ts","../src/protocol/notifications.ts","../src/protocol/codec.ts","../src/transport/types.ts","../src/transport/mock.ts","../src/transport/web-bluetooth.ts","../src/devices/base.ts","../src/devices/single-motor.ts","../src/devices/double-motor.ts","../src/devices/color-sensor.ts","../src/devices/controller.ts"],"sourcesContent":["/**\n * App-aligned LEGO colors (match Python public API / Coding Canvas).\n * Wire frames use firmware numbers via appColorToFirmware().\n */\n\n/** App-aligned (what callers pass to lightColor / filters). */\nexport const LEGO_COLOR_NOCOLOR = 0;\nexport const LEGO_COLOR_NONE = 0;\nexport const LEGO_COLOR_RED = 1;\nexport const LEGO_COLOR_YELLOW = 2;\nexport const LEGO_COLOR_BLUE = 3;\nexport const LEGO_COLOR_TEAL = 4;\nexport const LEGO_COLOR_GREEN = 5;\nexport const LEGO_COLOR_PURPLE = 6;\nexport const LEGO_COLOR_WHITE = 7;\nexport const LEGO_COLOR_MAGENTA = 8;\nexport const LEGO_COLOR_ORANGE = 9;\nexport const LEGO_COLOR_AZURE = 10;\n\n/** Firmware wire values (rpc_message). */\nconst FW_NONE = -1;\nconst FW_BLACK = 0;\nconst FW_MAGENTA = 1;\nconst FW_PURPLE = 2;\nconst FW_BLUE = 3;\nconst FW_AZURE = 4;\nconst FW_TURQUOISE = 5;\nconst FW_GREEN = 6;\nconst FW_YELLOW = 7;\nconst FW_ORANGE = 8;\nconst FW_RED = 9;\nconst FW_WHITE = 10;\n\nconst APP_TO_FW: Record<number, number> = {\n [LEGO_COLOR_NOCOLOR]: FW_NONE,\n [LEGO_COLOR_RED]: FW_RED,\n [LEGO_COLOR_YELLOW]: FW_YELLOW,\n [LEGO_COLOR_BLUE]: FW_BLUE,\n [LEGO_COLOR_TEAL]: FW_TURQUOISE,\n [LEGO_COLOR_GREEN]: FW_GREEN,\n [LEGO_COLOR_PURPLE]: FW_PURPLE,\n [LEGO_COLOR_WHITE]: FW_WHITE,\n [LEGO_COLOR_MAGENTA]: FW_MAGENTA,\n [LEGO_COLOR_ORANGE]: FW_ORANGE,\n [LEGO_COLOR_AZURE]: FW_AZURE,\n};\n\nconst FW_TO_APP: Record<number, number> = {\n [FW_NONE]: LEGO_COLOR_NOCOLOR,\n [FW_BLACK]: LEGO_COLOR_NOCOLOR,\n [FW_MAGENTA]: LEGO_COLOR_MAGENTA,\n [FW_PURPLE]: LEGO_COLOR_PURPLE,\n [FW_BLUE]: LEGO_COLOR_BLUE,\n [FW_AZURE]: LEGO_COLOR_AZURE,\n [FW_TURQUOISE]: LEGO_COLOR_TEAL,\n [FW_GREEN]: LEGO_COLOR_GREEN,\n [FW_YELLOW]: LEGO_COLOR_YELLOW,\n [FW_ORANGE]: LEGO_COLOR_ORANGE,\n [FW_RED]: LEGO_COLOR_RED,\n [FW_WHITE]: LEGO_COLOR_WHITE,\n};\n\nexport function appColorToFirmware(appColor: number): number {\n return APP_TO_FW[appColor] ?? FW_NONE;\n}\n\nexport function firmwareColorToApp(firmwareColor: number): number {\n return FW_TO_APP[firmwareColor] ?? LEGO_COLOR_NOCOLOR;\n}\n","/** Constants aligned with the LEGO Education Python public API. */\n\nexport const UNCHANGED = -1;\nexport const DEFAULT_MOTOR = 0;\nexport const DEFAULT_DEVICE_NOTIFICATION_DELAY = 100;\n\nexport {\n LEGO_COLOR_NOCOLOR,\n LEGO_COLOR_NONE,\n LEGO_COLOR_RED,\n LEGO_COLOR_YELLOW,\n LEGO_COLOR_BLUE,\n LEGO_COLOR_TEAL,\n LEGO_COLOR_GREEN,\n LEGO_COLOR_PURPLE,\n LEGO_COLOR_WHITE,\n LEGO_COLOR_MAGENTA,\n LEGO_COLOR_ORANGE,\n LEGO_COLOR_AZURE,\n appColorToFirmware,\n firmwareColorToApp,\n} from \"./protocol/colors.js\";\n\nexport const MOTOR_END_STATE_DEFAULT = -1;\nexport const MOTOR_END_STATE_COAST = 0;\nexport const MOTOR_END_STATE_BRAKE = 1;\nexport const MOTOR_END_STATE_HOLD = 2;\nexport const MOTOR_END_STATE_CONTINUE = 3;\nexport const MOTOR_END_STATE_SMART_COAST = 4;\nexport const MOTOR_END_STATE_SMART_BRAKE = 5;\n\nexport const MOTOR_MOVE_DIRECTION_CLOCKWISE = 0;\nexport const MOTOR_MOVE_DIRECTION_COUNTERCLOCKWISE = 1;\nexport const MOTOR_MOVE_DIRECTION_SHORTEST = 2;\nexport const MOTOR_MOVE_DIRECTION_LONGEST = 3;\n\nexport const MOTOR_LEFT = 0;\nexport const MOTOR_RIGHT = 1;\nexport const MOTOR_BOTH = 2;\n\nexport const MOVEMENT_DIRECTION_FORWARD = 0;\nexport const MOVEMENT_DIRECTION_BACKWARD = 1;\nexport const MOVEMENT_DIRECTION_LEFT = 2;\nexport const MOVEMENT_DIRECTION_RIGHT = 3;\n\nexport const MOVEMENT_MOVE_DIRECTION_FORWARD = 0;\nexport const MOVEMENT_MOVE_DIRECTION_BACKWARD = 1;\n\nexport const MOVEMENT_TURN_DIRECTION_LEFT = 2;\nexport const MOVEMENT_TURN_DIRECTION_RIGHT = 3;\n\nexport const DEVICE_FACE_TOP = 0;\nexport const DEVICE_FACE_FRONT = 1;\nexport const DEVICE_FACE_RIGHT = 2;\nexport const DEVICE_FACE_BOTTOM = 3;\nexport const DEVICE_FACE_BACK = 4;\nexport const DEVICE_FACE_LEFT = 5;\n\nexport const SOUND_PATTERN_BEEP_SINGLE = 0;\nexport const SOUND_PATTERN_BEEP_DOUBLE = 1;\nexport const SOUND_PATTERN_BEEP_TRIPLE = 2;\nexport const SOUND_PATTERN_BEEP_UP_MIDDLE_DOWN = 3;\n\nexport const LIGHT_PATTERN_SOLID = 0;\nexport const LIGHT_PATTERN_BREATHE = 1;\nexport const LIGHT_PATTERN_PULSE = 2;\nexport const LIGHT_PATTERN_SHORT_BLINK = 3;\nexport const LIGHT_PATTERN_LONG_BLINK = 4;\nexport const LIGHT_PATTERN_DOUBLE_BLINK = 5;\n\nexport const PROGRAM_ACTION_START = 0;\nexport const PROGRAM_ACTION_STOP = 1;\n","/** GATT UUIDs — aligned with legoeducation `basic_ble.py` / Coral fd02 docs. */\n\nexport const SERVICE_UUID = \"0000fd02-0000-1000-8000-00805f9b34fb\";\nexport const WRITE_UUID = \"0000fd02-0001-1000-8000-00805f9b34fb\";\nexport const NOTIFY_UUID = \"0000fd02-0002-1000-8000-00805f9b34fb\";\n\n/** LEGO Bluetooth company identifier (manufacturer data). */\nexport const LEGO_COMPANY_ID = 0x0397;\n\n/** productGroupDevice values from legoeducation rpc_message. */\nexport const PRODUCT_GROUP_DEVICE_SINGLE_MOTOR = 512;\nexport const PRODUCT_GROUP_DEVICE_DOUBLE_MOTOR = 513;\nexport const PRODUCT_GROUP_DEVICE_COLOR_SENSOR = 514;\nexport const PRODUCT_GROUP_DEVICE_CONTROLLER = 515;\n\n/** Client RPC version expected by legoeducation 1.0.6. */\nexport const RPC_VERSION = { major: 1, minor: 0, build: 73 } as const;\n","/** Message type IDs — legoeducation 1.0.6 `rpc_message.py`. */\n\nexport const INFO_REQUEST = 0;\nexport const INFO_RESPONSE = 1;\nexport const PROGRAM_FLOW_NOTIFICATION = 32;\nexport const DEVICE_NOTIFICATION_REQUEST = 40;\nexport const DEVICE_NOTIFICATION_RESPONSE = 41;\nexport const DEVICE_NOTIFICATION = 60;\n\nexport const LIGHT_COLOR_COMMAND = 110;\nexport const LIGHT_COLOR_RESULT = 111;\nexport const PLAY_BEEP_COMMAND = 112;\nexport const PLAY_BEEP_RESULT = 113;\nexport const STOP_SOUND_COMMAND = 114;\nexport const STOP_SOUND_RESULT = 115;\n\nexport const MOTOR_RESET_RELATIVE_POSITION_COMMAND = 120;\nexport const MOTOR_RESET_RELATIVE_POSITION_RESULT = 121;\nexport const MOTOR_RUN_COMMAND = 122;\nexport const MOTOR_RUN_RESULT = 123;\nexport const MOTOR_RUN_FOR_DEGREES_COMMAND = 124;\nexport const MOTOR_RUN_FOR_DEGREES_RESULT = 125;\nexport const MOTOR_RUN_FOR_TIME_COMMAND = 126;\nexport const MOTOR_RUN_FOR_TIME_RESULT = 127;\nexport const MOTOR_RUN_TO_ABSOLUTE_POSITION_COMMAND = 128;\nexport const MOTOR_RUN_TO_ABSOLUTE_POSITION_RESULT = 129;\nexport const MOTOR_RUN_TO_RELATIVE_POSITION_COMMAND = 130;\nexport const MOTOR_RUN_TO_RELATIVE_POSITION_RESULT = 131;\nexport const MOTOR_SET_DUTY_CYCLE_COMMAND = 132;\nexport const MOTOR_SET_DUTY_CYCLE_RESULT = 133;\nexport const MOTOR_STOP_COMMAND = 138;\nexport const MOTOR_STOP_RESULT = 139;\nexport const MOTOR_SET_SPEED_COMMAND = 140;\nexport const MOTOR_SET_SPEED_RESULT = 141;\nexport const MOTOR_SET_END_STATE_COMMAND = 142;\nexport const MOTOR_SET_END_STATE_RESULT = 143;\nexport const MOTOR_SET_ACCELERATION_COMMAND = 144;\nexport const MOTOR_SET_ACCELERATION_RESULT = 145;\n\nexport const MOVEMENT_MOVE_COMMAND = 150;\nexport const MOVEMENT_MOVE_RESULT = 151;\nexport const MOVEMENT_MOVE_FOR_TIME_COMMAND = 152;\nexport const MOVEMENT_MOVE_FOR_TIME_RESULT = 153;\nexport const MOVEMENT_MOVE_FOR_DEGREES_COMMAND = 154;\nexport const MOVEMENT_MOVE_FOR_DEGREES_RESULT = 155;\nexport const MOVEMENT_MOVE_TANK_COMMAND = 156;\nexport const MOVEMENT_MOVE_TANK_RESULT = 157;\nexport const MOVEMENT_MOVE_TANK_FOR_DEGREES_COMMAND = 158;\nexport const MOVEMENT_MOVE_TANK_FOR_DEGREES_RESULT = 159;\nexport const MOVEMENT_TURN_FOR_DEGREES_COMMAND = 160;\nexport const MOVEMENT_TURN_FOR_DEGREES_RESULT = 161;\nexport const MOVEMENT_STOP_COMMAND = 168;\nexport const MOVEMENT_STOP_RESULT = 169;\nexport const MOVEMENT_SET_SPEED_COMMAND = 170;\nexport const MOVEMENT_SET_SPEED_RESULT = 171;\nexport const MOVEMENT_SET_END_STATE_COMMAND = 172;\nexport const MOVEMENT_SET_END_STATE_RESULT = 173;\nexport const MOVEMENT_SET_ACCELERATION_COMMAND = 174;\nexport const MOVEMENT_SET_ACCELERATION_RESULT = 175;\nexport const MOVEMENT_SET_TURN_STEERING_COMMAND = 176;\nexport const MOVEMENT_SET_TURN_STEERING_RESULT = 177;\n\nexport const IMU_SET_YAW_FACE_COMMAND = 190;\nexport const IMU_SET_YAW_FACE_RESULT = 191;\nexport const IMU_RESET_YAW_AXIS_COMMAND = 192;\nexport const IMU_RESET_YAW_AXIS_RESULT = 193;\n\n/** Nested types inside DEVICE_NOTIFICATION deviceData. */\nexport const INFO_DEVICE_NOTIFICATION = 0;\nexport const IMU_DEVICE_NOTIFICATION = 1;\nexport const CARD_NOTIFICATION = 3;\nexport const BUTTON_STATE_NOTIFICATION = 4;\nexport const MOTOR_NOTIFICATION = 10;\nexport const COLOR_SENSOR_NOTIFICATION = 12;\nexport const CONTROLLER_NOTIFICATION = 15;\nexport const IMU_GESTURE_NOTIFICATION = 16;\n\nexport const MOTOR_BITS_LEFT = 1;\nexport const MOTOR_BITS_RIGHT = 2;\nexport const MOTOR_BITS_BOTH = 3;\n\n/** Body sizes (without nested type byte). */\nexport const NESTED_NOTIFICATION_SIZES: Record<number, number> = {\n [INFO_DEVICE_NOTIFICATION]: 2,\n [IMU_DEVICE_NOTIFICATION]: 20,\n [CARD_NOTIFICATION]: 3,\n [BUTTON_STATE_NOTIFICATION]: 1,\n [MOTOR_NOTIFICATION]: 12,\n [COLOR_SENSOR_NOTIFICATION]: 12,\n [CONTROLLER_NOTIFICATION]: 6,\n [IMU_GESTURE_NOTIFICATION]: 1,\n};\n\nexport function motorIndexToBitMask(motorIndex: number): number {\n if (motorIndex === 2) return MOTOR_BITS_BOTH;\n return 1 << motorIndex;\n}\n\nexport function resultOpcodeForMethod(method: string): number | undefined {\n const map: Record<string, number> = {\n info_request: INFO_RESPONSE,\n device_notification_request: DEVICE_NOTIFICATION_RESPONSE,\n light_color: LIGHT_COLOR_RESULT,\n beep: PLAY_BEEP_RESULT,\n stop_beep: STOP_SOUND_RESULT,\n motor_reset_relative_position: MOTOR_RESET_RELATIVE_POSITION_RESULT,\n motor_run: MOTOR_RUN_RESULT,\n motor_run_for_degrees: MOTOR_RUN_FOR_DEGREES_RESULT,\n motor_run_for_time: MOTOR_RUN_FOR_TIME_RESULT,\n motor_run_to_absolute_position: MOTOR_RUN_TO_ABSOLUTE_POSITION_RESULT,\n motor_run_to_relative_position: MOTOR_RUN_TO_RELATIVE_POSITION_RESULT,\n motor_set_duty_cycle: MOTOR_SET_DUTY_CYCLE_RESULT,\n motor_stop: MOTOR_STOP_RESULT,\n motor_set_speed: MOTOR_SET_SPEED_RESULT,\n motor_set_end_state: MOTOR_SET_END_STATE_RESULT,\n motor_set_acceleration: MOTOR_SET_ACCELERATION_RESULT,\n movement_move: MOVEMENT_MOVE_RESULT,\n movement_move_for_time: MOVEMENT_MOVE_FOR_TIME_RESULT,\n movement_move_for_degrees: MOVEMENT_MOVE_FOR_DEGREES_RESULT,\n movement_move_tank: MOVEMENT_MOVE_TANK_RESULT,\n movement_move_tank_for_degrees: MOVEMENT_MOVE_TANK_FOR_DEGREES_RESULT,\n movement_turn_for_degrees: MOVEMENT_TURN_FOR_DEGREES_RESULT,\n movement_stop: MOVEMENT_STOP_RESULT,\n movement_set_speed: MOVEMENT_SET_SPEED_RESULT,\n movement_set_end_state: MOVEMENT_SET_END_STATE_RESULT,\n movement_set_acceleration: MOVEMENT_SET_ACCELERATION_RESULT,\n movement_set_turn_steering: MOVEMENT_SET_TURN_STEERING_RESULT,\n imu_set_yaw_face: IMU_SET_YAW_FACE_RESULT,\n imu_reset_yaw_axis: IMU_RESET_YAW_AXIS_RESULT,\n };\n return map[method];\n}\n","/**\n * Split concatenated RPC notify buffers into individual frames.\n * Web Bluetooth sometimes delivers DEVICE_NOTIFICATION + result in one packet.\n */\n\nimport {\n DEVICE_NOTIFICATION,\n DEVICE_NOTIFICATION_RESPONSE,\n INFO_RESPONSE,\n LIGHT_COLOR_RESULT,\n MOTOR_RUN_FOR_DEGREES_RESULT,\n MOTOR_RUN_FOR_TIME_RESULT,\n MOTOR_RUN_RESULT,\n MOTOR_RUN_TO_ABSOLUTE_POSITION_RESULT,\n MOTOR_RUN_TO_RELATIVE_POSITION_RESULT,\n MOTOR_SET_ACCELERATION_RESULT,\n MOTOR_SET_DUTY_CYCLE_RESULT,\n MOTOR_SET_END_STATE_RESULT,\n MOTOR_SET_SPEED_RESULT,\n MOTOR_STOP_RESULT,\n MOTOR_RESET_RELATIVE_POSITION_RESULT,\n MOVEMENT_MOVE_FOR_DEGREES_RESULT,\n MOVEMENT_MOVE_FOR_TIME_RESULT,\n MOVEMENT_MOVE_RESULT,\n MOVEMENT_MOVE_TANK_FOR_DEGREES_RESULT,\n MOVEMENT_MOVE_TANK_RESULT,\n MOVEMENT_SET_ACCELERATION_RESULT,\n MOVEMENT_SET_END_STATE_RESULT,\n MOVEMENT_SET_SPEED_RESULT,\n MOVEMENT_SET_TURN_STEERING_RESULT,\n MOVEMENT_STOP_RESULT,\n MOVEMENT_TURN_FOR_DEGREES_RESULT,\n PLAY_BEEP_RESULT,\n STOP_SOUND_RESULT,\n IMU_RESET_YAW_AXIS_RESULT,\n IMU_SET_YAW_FACE_RESULT,\n} from \"./opcodes.js\";\n\n/** Total frame size including opcode byte (fixed-layout replies). */\nconst FIXED_FRAME_SIZE: Record<number, number> = {\n [INFO_RESPONSE]: 17,\n [DEVICE_NOTIFICATION_RESPONSE]: 2,\n [LIGHT_COLOR_RESULT]: 2,\n [PLAY_BEEP_RESULT]: 2,\n [STOP_SOUND_RESULT]: 2,\n [MOTOR_RESET_RELATIVE_POSITION_RESULT]: 3,\n [MOTOR_RUN_RESULT]: 3,\n [MOTOR_RUN_FOR_DEGREES_RESULT]: 3,\n [MOTOR_RUN_FOR_TIME_RESULT]: 3,\n [MOTOR_RUN_TO_ABSOLUTE_POSITION_RESULT]: 3,\n [MOTOR_RUN_TO_RELATIVE_POSITION_RESULT]: 3,\n [MOTOR_SET_DUTY_CYCLE_RESULT]: 3,\n [MOTOR_STOP_RESULT]: 3,\n [MOTOR_SET_SPEED_RESULT]: 3,\n [MOTOR_SET_END_STATE_RESULT]: 3,\n [MOTOR_SET_ACCELERATION_RESULT]: 3,\n [MOVEMENT_MOVE_RESULT]: 2,\n [MOVEMENT_MOVE_FOR_TIME_RESULT]: 2,\n [MOVEMENT_MOVE_FOR_DEGREES_RESULT]: 2,\n [MOVEMENT_MOVE_TANK_RESULT]: 2,\n [MOVEMENT_MOVE_TANK_FOR_DEGREES_RESULT]: 2,\n [MOVEMENT_TURN_FOR_DEGREES_RESULT]: 2,\n [MOVEMENT_STOP_RESULT]: 2,\n [MOVEMENT_SET_SPEED_RESULT]: 2,\n [MOVEMENT_SET_END_STATE_RESULT]: 2,\n [MOVEMENT_SET_ACCELERATION_RESULT]: 2,\n [MOVEMENT_SET_TURN_STEERING_RESULT]: 2,\n [IMU_SET_YAW_FACE_RESULT]: 2,\n [IMU_RESET_YAW_AXIS_RESULT]: 2,\n};\n\nexport function splitNotifyFrames(buffer: Uint8Array): Uint8Array[] {\n if (buffer.length === 0) return [];\n const frames: Uint8Array[] = [];\n let o = 0;\n\n while (o < buffer.length) {\n const opcode = buffer[o]!;\n let size: number | undefined;\n\n if (opcode === DEVICE_NOTIFICATION && o + 3 <= buffer.length) {\n const dataLen = buffer[o + 1]! | (buffer[o + 2]! << 8);\n size = 3 + dataLen;\n } else {\n size = FIXED_FRAME_SIZE[opcode];\n }\n\n if (size == null || o + size > buffer.length) {\n frames.push(buffer.subarray(o));\n break;\n }\n\n frames.push(buffer.subarray(o, o + size));\n o += size;\n }\n\n return frames;\n}\n","/**\n * Parse DEVICE_NOTIFICATION (opcode 60) nested payloads.\n */\n\nimport { firmwareColorToApp } from \"./colors.js\";\nimport {\n BUTTON_STATE_NOTIFICATION,\n CARD_NOTIFICATION,\n COLOR_SENSOR_NOTIFICATION,\n CONTROLLER_NOTIFICATION,\n DEVICE_NOTIFICATION,\n IMU_DEVICE_NOTIFICATION,\n IMU_GESTURE_NOTIFICATION,\n INFO_DEVICE_NOTIFICATION,\n MOTOR_NOTIFICATION,\n NESTED_NOTIFICATION_SIZES,\n} from \"./opcodes.js\";\n\nexport interface MotorNotificationReading {\n motorBitMask: number;\n motorState: number;\n absolutePosition: number;\n power: number;\n speed: number;\n position: number;\n gesture: number;\n}\n\nexport interface ColorSensorNotificationReading {\n color: number;\n reflection: number;\n rawRed: number;\n rawGreen: number;\n rawBlue: number;\n hue: number;\n saturation: number;\n value: number;\n}\n\nexport interface ControllerNotificationReading {\n leftPercent: number;\n rightPercent: number;\n leftAngle: number;\n rightAngle: number;\n}\n\nexport interface ImuNotificationReading {\n orientation: number;\n yawFace: number;\n yaw: number;\n pitch: number;\n roll: number;\n accelerometerX: number;\n accelerometerY: number;\n accelerometerZ: number;\n gyroscopeX: number;\n gyroscopeY: number;\n gyroscopeZ: number;\n}\n\nexport interface ParsedDeviceNotifications {\n motors: MotorNotificationReading[];\n color?: ColorSensorNotificationReading;\n controller?: ControllerNotificationReading;\n imu?: ImuNotificationReading;\n imuGesture?: number;\n card?: { color: number; serial: number };\n buttonState?: number;\n}\n\nfunction decodeMotor(body: Uint8Array): MotorNotificationReading {\n const v = new DataView(body.buffer, body.byteOffset, body.byteLength);\n let o = 0;\n const motorBitMask = v.getUint8(o++);\n const motorState = v.getUint8(o++);\n const absolutePosition = v.getUint16(o, true);\n o += 2;\n const power = v.getInt16(o, true);\n o += 2;\n const speed = v.getInt8(o++);\n const position = v.getInt32(o, true);\n o += 4;\n const gesture = v.getInt8(o);\n return {\n motorBitMask,\n motorState,\n absolutePosition,\n power,\n speed,\n position,\n gesture,\n };\n}\n\nfunction decodeColor(body: Uint8Array): ColorSensorNotificationReading {\n const v = new DataView(body.buffer, body.byteOffset, body.byteLength);\n let o = 0;\n const color = v.getInt8(o++);\n const reflection = v.getUint8(o++);\n const rawRed = v.getUint16(o, true);\n o += 2;\n const rawGreen = v.getUint16(o, true);\n o += 2;\n const rawBlue = v.getUint16(o, true);\n o += 2;\n const hue = v.getUint16(o, true);\n o += 2;\n const saturation = v.getUint8(o++);\n const value = v.getUint8(o);\n return {\n color,\n reflection,\n rawRed,\n rawGreen,\n rawBlue,\n hue,\n saturation,\n value,\n };\n}\n\nfunction decodeController(body: Uint8Array): ControllerNotificationReading {\n const v = new DataView(body.buffer, body.byteOffset, body.byteLength);\n return {\n leftPercent: v.getInt8(0),\n rightPercent: v.getInt8(1),\n leftAngle: v.getInt16(2, true),\n rightAngle: v.getInt16(4, true),\n };\n}\n\nfunction decodeImu(body: Uint8Array): ImuNotificationReading {\n const v = new DataView(body.buffer, body.byteOffset, body.byteLength);\n let o = 0;\n const orientation = v.getUint8(o++);\n const yawFace = v.getUint8(o++);\n const yaw = v.getInt16(o, true);\n o += 2;\n const pitch = v.getInt16(o, true);\n o += 2;\n const roll = v.getInt16(o, true);\n o += 2;\n const accelerometerX = v.getInt16(o, true);\n o += 2;\n const accelerometerY = v.getInt16(o, true);\n o += 2;\n const accelerometerZ = v.getInt16(o, true);\n o += 2;\n const gyroscopeX = v.getInt16(o, true);\n o += 2;\n const gyroscopeY = v.getInt16(o, true);\n o += 2;\n const gyroscopeZ = v.getInt16(o, true);\n return {\n orientation,\n yawFace,\n yaw,\n pitch,\n roll,\n accelerometerX,\n accelerometerY,\n accelerometerZ,\n gyroscopeX,\n gyroscopeY,\n gyroscopeZ,\n };\n}\n\n/** Extract typed readings from a raw notify frame. */\nexport function parseDeviceNotifications(\n payload: Uint8Array,\n): ParsedDeviceNotifications {\n let deviceData: Uint8Array;\n if (payload.length >= 1 && payload[0] === DEVICE_NOTIFICATION) {\n if (payload.length < 3) return { motors: [] };\n const len = new DataView(\n payload.buffer,\n payload.byteOffset + 1,\n 2,\n ).getUint16(0, true);\n deviceData = payload.subarray(3, 3 + len);\n } else {\n deviceData = payload;\n }\n\n const out: ParsedDeviceNotifications = { motors: [] };\n let offset = 0;\n while (offset < deviceData.length) {\n const type = deviceData[offset];\n offset += 1;\n const size = NESTED_NOTIFICATION_SIZES[type];\n if (size == null || offset + size > deviceData.length) break;\n const body = deviceData.subarray(offset, offset + size);\n offset += size;\n\n switch (type) {\n case MOTOR_NOTIFICATION:\n out.motors.push(decodeMotor(body));\n break;\n case COLOR_SENSOR_NOTIFICATION: {\n const c = decodeColor(body);\n c.color = firmwareColorToApp(c.color);\n out.color = c;\n break;\n }\n case CONTROLLER_NOTIFICATION:\n out.controller = decodeController(body);\n break;\n case IMU_DEVICE_NOTIFICATION:\n out.imu = decodeImu(body);\n break;\n case IMU_GESTURE_NOTIFICATION:\n out.imuGesture = body[0];\n break;\n case CARD_NOTIFICATION: {\n const v = new DataView(body.buffer, body.byteOffset, body.byteLength);\n out.card = {\n color: firmwareColorToApp(v.getInt8(0)),\n serial: v.getUint16(1, true),\n };\n break;\n }\n case BUTTON_STATE_NOTIFICATION:\n out.buttonState = body[0];\n break;\n case INFO_DEVICE_NOTIFICATION:\n break;\n default:\n break;\n }\n }\n return out;\n}\n\n/** Convenience: motor readings only (back-compat). */\nexport function parseMotorNotifications(\n payload: Uint8Array,\n): MotorNotificationReading[] {\n return parseDeviceNotifications(payload).motors;\n}\n","/**\n * RPC codec for CS&AI hubs (fd02).\n * Layouts follow legoeducation 1.0.6 `rpc_message.py`.\n */\n\nimport { UNCHANGED } from \"../constants.js\";\nimport { appColorToFirmware } from \"./colors.js\";\nimport {\n DEVICE_NOTIFICATION_REQUEST,\n INFO_REQUEST,\n INFO_RESPONSE,\n IMU_RESET_YAW_AXIS_COMMAND,\n IMU_SET_YAW_FACE_COMMAND,\n LIGHT_COLOR_COMMAND,\n MOTOR_BITS_LEFT,\n MOTOR_RESET_RELATIVE_POSITION_COMMAND,\n MOTOR_RUN_COMMAND,\n MOTOR_RUN_FOR_DEGREES_COMMAND,\n MOTOR_RUN_FOR_TIME_COMMAND,\n MOTOR_RUN_TO_ABSOLUTE_POSITION_COMMAND,\n MOTOR_RUN_TO_RELATIVE_POSITION_COMMAND,\n MOTOR_SET_ACCELERATION_COMMAND,\n MOTOR_SET_DUTY_CYCLE_COMMAND,\n MOTOR_SET_END_STATE_COMMAND,\n MOTOR_SET_SPEED_COMMAND,\n MOTOR_STOP_COMMAND,\n MOVEMENT_MOVE_COMMAND,\n MOVEMENT_MOVE_FOR_DEGREES_COMMAND,\n MOVEMENT_MOVE_FOR_TIME_COMMAND,\n MOVEMENT_MOVE_TANK_COMMAND,\n MOVEMENT_MOVE_TANK_FOR_DEGREES_COMMAND,\n MOVEMENT_SET_ACCELERATION_COMMAND,\n MOVEMENT_SET_END_STATE_COMMAND,\n MOVEMENT_SET_SPEED_COMMAND,\n MOVEMENT_SET_TURN_STEERING_COMMAND,\n MOVEMENT_STOP_COMMAND,\n MOVEMENT_TURN_FOR_DEGREES_COMMAND,\n PLAY_BEEP_COMMAND,\n PROGRAM_FLOW_NOTIFICATION,\n STOP_SOUND_COMMAND,\n motorIndexToBitMask,\n resultOpcodeForMethod,\n} from \"./opcodes.js\";\nimport {\n parseDeviceNotifications,\n parseMotorNotifications,\n type ParsedDeviceNotifications,\n} from \"./notifications.js\";\n\nfunction u8(n: number): number {\n return n & 0xff;\n}\nfunction i8(n: number): number {\n return (n << 24) >> 24;\n}\nfunction packI16LE(value: number): Uint8Array {\n const b = new ArrayBuffer(2);\n new DataView(b).setInt16(0, value, true);\n return new Uint8Array(b);\n}\nfunction packU16LE(value: number): Uint8Array {\n const b = new ArrayBuffer(2);\n new DataView(b).setUint16(0, value, true);\n return new Uint8Array(b);\n}\nfunction packI32LE(value: number): Uint8Array {\n const b = new ArrayBuffer(4);\n new DataView(b).setInt32(0, value, true);\n return new Uint8Array(b);\n}\nfunction packU32LE(value: number): Uint8Array {\n const b = new ArrayBuffer(4);\n new DataView(b).setUint32(0, value, true);\n return new Uint8Array(b);\n}\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((n, p) => n + p.length, 0);\n const out = new Uint8Array(total);\n let o = 0;\n for (const p of parts) {\n out.set(p, o);\n o += p.length;\n }\n return out;\n}\nfunction bitMask(motor?: number): number {\n return motorIndexToBitMask(motor ?? 0) || MOTOR_BITS_LEFT;\n}\n\nexport function encodeInfoRequest(): Uint8Array {\n return new Uint8Array([INFO_REQUEST]);\n}\nexport function encodeProgramFlow(action: number): Uint8Array {\n return new Uint8Array([PROGRAM_FLOW_NOTIFICATION, u8(action)]);\n}\nexport function encodeDeviceNotificationRequest(delayMs: number): Uint8Array {\n return concat(new Uint8Array([DEVICE_NOTIFICATION_REQUEST]), packU16LE(delayMs));\n}\nexport function encodeLightColor(\n color: number,\n pattern = 0,\n intensity = 100,\n): Uint8Array {\n // Public API uses App color ids; wire needs firmware ids (like Python _app_to_firmware).\n const fwColor = appColorToFirmware(color);\n const clampedIntensity = Math.max(0, Math.min(100, Math.round(intensity)));\n return new Uint8Array([\n LIGHT_COLOR_COMMAND,\n i8(fwColor),\n u8(pattern),\n u8(clampedIntensity),\n ]);\n}\nexport function encodeBeep(\n pattern = 0,\n frequency = 440,\n count = 1,\n): Uint8Array {\n // Firmware field = repeats after first play → count - 1 (official Python).\n const repetitions = Math.max(0, Math.min(255, Math.round(count) - 1));\n const hz = Math.max(0, Math.min(2700, Math.round(frequency)));\n return concat(\n new Uint8Array([PLAY_BEEP_COMMAND, u8(pattern)]),\n packU16LE(hz),\n new Uint8Array([u8(repetitions)]),\n );\n}\nexport function encodeStopBeep(): Uint8Array {\n return new Uint8Array([STOP_SOUND_COMMAND]);\n}\n\nexport function encodeMotorSetSpeed(speed: number, motor?: number): Uint8Array {\n return new Uint8Array([MOTOR_SET_SPEED_COMMAND, u8(bitMask(motor)), i8(speed)]);\n}\nexport function encodeMotorRun(direction = 0, motor?: number): Uint8Array {\n return new Uint8Array([MOTOR_RUN_COMMAND, u8(bitMask(motor)), u8(direction)]);\n}\nexport function encodeMotorStop(motor?: number): Uint8Array {\n return new Uint8Array([MOTOR_STOP_COMMAND, u8(bitMask(motor))]);\n}\nexport function encodeMotorRunForDegrees(\n degrees: number,\n direction = 0,\n motor?: number,\n): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_RUN_FOR_DEGREES_COMMAND, u8(bitMask(motor))]),\n packI32LE(degrees),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMotorRunForTime(\n timeMs: number,\n direction = 0,\n motor?: number,\n): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_RUN_FOR_TIME_COMMAND, u8(bitMask(motor))]),\n packU32LE(timeMs),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMotorResetRelativePosition(\n position = 0,\n motor?: number,\n): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_RESET_RELATIVE_POSITION_COMMAND, u8(bitMask(motor))]),\n packI32LE(position),\n );\n}\nexport function encodeMotorRunToRelativePosition(\n position: number,\n motor?: number,\n): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_RUN_TO_RELATIVE_POSITION_COMMAND, u8(bitMask(motor))]),\n packI32LE(position),\n );\n}\nexport function encodeMotorRunToAbsolutePosition(\n position: number,\n direction = 2,\n motor?: number,\n): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_RUN_TO_ABSOLUTE_POSITION_COMMAND, u8(bitMask(motor))]),\n packU16LE(position),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMotorSetDutyCycle(dutyCycle: number, motor?: number): Uint8Array {\n return concat(\n new Uint8Array([MOTOR_SET_DUTY_CYCLE_COMMAND, u8(bitMask(motor))]),\n packI16LE(100 * dutyCycle),\n );\n}\nexport function encodeMotorSetEndState(endState: number, motor?: number): Uint8Array {\n return new Uint8Array([MOTOR_SET_END_STATE_COMMAND, u8(bitMask(motor)), i8(endState)]);\n}\nexport function encodeMotorSetAcceleration(\n acceleration: number,\n deceleration: number,\n motor?: number,\n): Uint8Array {\n return new Uint8Array([\n MOTOR_SET_ACCELERATION_COMMAND,\n u8(bitMask(motor)),\n u8(acceleration),\n u8(deceleration),\n ]);\n}\n\nexport function encodeMovementSetSpeed(speed: number): Uint8Array {\n return new Uint8Array([MOVEMENT_SET_SPEED_COMMAND, i8(speed)]);\n}\nexport function encodeMovementMove(direction = 0): Uint8Array {\n return new Uint8Array([MOVEMENT_MOVE_COMMAND, u8(direction)]);\n}\nexport function encodeMovementMoveForTime(timeMs: number, direction = 0): Uint8Array {\n return concat(\n new Uint8Array([MOVEMENT_MOVE_FOR_TIME_COMMAND]),\n packU32LE(timeMs),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMovementMoveForDegrees(degrees: number, direction = 0): Uint8Array {\n return concat(\n new Uint8Array([MOVEMENT_MOVE_FOR_DEGREES_COMMAND]),\n packI32LE(degrees),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMovementMoveTank(speedLeft: number, speedRight: number): Uint8Array {\n return new Uint8Array([MOVEMENT_MOVE_TANK_COMMAND, i8(speedLeft), i8(speedRight)]);\n}\nexport function encodeMovementMoveTankForDegrees(\n degrees: number,\n speedLeft = 50,\n speedRight = 50,\n): Uint8Array {\n return concat(\n new Uint8Array([MOVEMENT_MOVE_TANK_FOR_DEGREES_COMMAND]),\n packI32LE(degrees),\n new Uint8Array([i8(speedLeft), i8(speedRight)]),\n );\n}\nexport function encodeMovementTurnForDegrees(degrees: number, direction = 2): Uint8Array {\n return concat(\n new Uint8Array([MOVEMENT_TURN_FOR_DEGREES_COMMAND]),\n packI32LE(degrees),\n new Uint8Array([u8(direction)]),\n );\n}\nexport function encodeMovementStop(): Uint8Array {\n return new Uint8Array([MOVEMENT_STOP_COMMAND]);\n}\nexport function encodeMovementSetEndState(endState: number): Uint8Array {\n return new Uint8Array([MOVEMENT_SET_END_STATE_COMMAND, i8(endState)]);\n}\nexport function encodeMovementSetAcceleration(\n acceleration: number,\n deceleration: number,\n): Uint8Array {\n return new Uint8Array([\n MOVEMENT_SET_ACCELERATION_COMMAND,\n u8(acceleration),\n u8(deceleration),\n ]);\n}\nexport function encodeMovementSetTurnSteering(steering: number): Uint8Array {\n return new Uint8Array([MOVEMENT_SET_TURN_STEERING_COMMAND, u8(steering)]);\n}\nexport function encodeImuSetYawFace(yawFace: number): Uint8Array {\n return new Uint8Array([IMU_SET_YAW_FACE_COMMAND, u8(yawFace)]);\n}\nexport function encodeImuResetYawAxis(value = 0): Uint8Array {\n return concat(new Uint8Array([IMU_RESET_YAW_AXIS_COMMAND]), packI16LE(value));\n}\n\nfunction withMotorSpeed(\n speed: number | undefined,\n motor: number | undefined,\n command: Uint8Array,\n): Uint8Array {\n if (speed === undefined || speed === UNCHANGED) return command;\n return concat(encodeMotorSetSpeed(speed, motor), command);\n}\nfunction withMovementSpeed(speed: number | undefined, command: Uint8Array): Uint8Array {\n if (speed === undefined || speed === UNCHANGED) return command;\n return concat(encodeMovementSetSpeed(speed), command);\n}\n\nexport interface InfoResponse {\n rpcMajor: number;\n rpcMinor: number;\n rpcBuild: number;\n firmwareMajor: number;\n firmwareMinor: number;\n firmwareBuild: number;\n bootloaderMajor: number;\n bootloaderMinor: number;\n bootloaderBuild: number;\n maxPacketSize: number;\n productGroupDevice: number;\n}\n\nexport function decodeInfoResponse(payload: Uint8Array): InfoResponse {\n const body =\n payload.length >= 1 && payload[0] === INFO_RESPONSE\n ? payload.subarray(1)\n : payload;\n if (body.length < 16) {\n throw new Error(\n `INFO_RESPONSE too short: got ${payload.length} wire bytes (need 17)`,\n );\n }\n const view = new DataView(body.buffer, body.byteOffset, body.byteLength);\n let o = 0;\n const rpcMajor = view.getUint8(o++);\n const rpcMinor = view.getUint8(o++);\n const rpcBuild = view.getUint16(o, true);\n o += 2;\n const firmwareMajor = view.getUint8(o++);\n const firmwareMinor = view.getUint8(o++);\n const firmwareBuild = view.getUint16(o, true);\n o += 2;\n const bootloaderMajor = view.getUint8(o++);\n const bootloaderMinor = view.getUint8(o++);\n const bootloaderBuild = view.getUint16(o, true);\n o += 2;\n const maxPacketSize = view.getUint16(o, true);\n o += 2;\n const productGroupDevice = view.getUint16(o, true);\n return {\n rpcMajor,\n rpcMinor,\n rpcBuild,\n firmwareMajor,\n firmwareMinor,\n firmwareBuild,\n bootloaderMajor,\n bootloaderMinor,\n bootloaderBuild,\n maxPacketSize,\n productGroupDevice,\n };\n}\n\nexport function encodeRpcCommand(\n method: string,\n args: Record<string, unknown> = {},\n): Uint8Array {\n const motor = Number(args.motor ?? 0);\n const direction = Number(args.direction ?? 0);\n const speed = args.speed !== undefined ? Number(args.speed) : UNCHANGED;\n\n switch (method) {\n case \"info_request\":\n return encodeInfoRequest();\n case \"program_flow_notification\":\n return encodeProgramFlow(Number(args.action ?? 0));\n case \"device_notification_request\":\n return encodeDeviceNotificationRequest(Number(args.delay_ms ?? 100));\n case \"light_color\":\n return encodeLightColor(\n Number(args.color ?? 0),\n Number(args.pattern ?? 0),\n Number(args.intensity ?? 100),\n );\n case \"beep\":\n return encodeBeep(\n Number(args.pattern ?? 0),\n Number(args.frequency ?? 440),\n Number(args.count ?? 1),\n );\n case \"stop_beep\":\n return encodeStopBeep();\n case \"motor_set_speed\":\n return encodeMotorSetSpeed(Number(args.speed ?? 0), motor);\n case \"motor_run\":\n return withMotorSpeed(speed, motor, encodeMotorRun(direction, motor));\n case \"motor_stop\":\n return encodeMotorStop(motor);\n case \"motor_run_for_degrees\":\n return withMotorSpeed(\n speed,\n motor,\n encodeMotorRunForDegrees(Number(args.degrees ?? 0), direction, motor),\n );\n case \"motor_run_for_time\":\n return withMotorSpeed(\n speed,\n motor,\n encodeMotorRunForTime(Number(args.time_ms ?? 0), direction, motor),\n );\n case \"motor_reset_relative_position\":\n return encodeMotorResetRelativePosition(Number(args.position ?? 0), motor);\n case \"motor_run_to_relative_position\":\n return withMotorSpeed(\n speed,\n motor,\n encodeMotorRunToRelativePosition(Number(args.position ?? 0), motor),\n );\n case \"motor_run_to_absolute_position\":\n return withMotorSpeed(\n speed,\n motor,\n encodeMotorRunToAbsolutePosition(Number(args.position ?? 0), direction || 2, motor),\n );\n case \"motor_set_duty_cycle\":\n return encodeMotorSetDutyCycle(Number(args.duty_cycle ?? 0), motor);\n case \"motor_set_end_state\":\n return encodeMotorSetEndState(Number(args.end_state ?? 0), motor);\n case \"motor_set_acceleration\":\n return encodeMotorSetAcceleration(\n Number(args.acceleration ?? 0),\n Number(args.deceleration ?? 0),\n motor,\n );\n case \"movement_set_speed\":\n return encodeMovementSetSpeed(Number(args.speed ?? 0));\n case \"movement_move\":\n return withMovementSpeed(speed, encodeMovementMove(direction));\n case \"movement_move_for_time\":\n return withMovementSpeed(\n speed,\n encodeMovementMoveForTime(Number(args.time_ms ?? 0), direction),\n );\n case \"movement_move_for_degrees\":\n return withMovementSpeed(\n speed,\n encodeMovementMoveForDegrees(Number(args.degrees ?? 0), direction),\n );\n case \"movement_move_tank\":\n return encodeMovementMoveTank(\n Number(args.speed_left ?? 0),\n Number(args.speed_right ?? 0),\n );\n case \"movement_move_tank_for_degrees\":\n return encodeMovementMoveTankForDegrees(\n Number(args.degrees ?? 0),\n Number(args.speed_left ?? 50),\n Number(args.speed_right ?? 50),\n );\n case \"movement_turn_for_degrees\":\n return withMovementSpeed(\n speed,\n encodeMovementTurnForDegrees(Number(args.degrees ?? 0), direction || 2),\n );\n case \"movement_stop\":\n return encodeMovementStop();\n case \"movement_set_end_state\":\n return encodeMovementSetEndState(Number(args.end_state ?? 0));\n case \"movement_set_acceleration\":\n return encodeMovementSetAcceleration(\n Number(args.acceleration ?? 0),\n Number(args.deceleration ?? 0),\n );\n case \"movement_set_turn_steering\":\n return encodeMovementSetTurnSteering(Number(args.steering ?? 0));\n case \"imu_set_yaw_face\":\n return encodeImuSetYawFace(Number(args.yaw_face ?? 0));\n case \"imu_reset_yaw_axis\":\n return encodeImuResetYawAxis(Number(args.value ?? 0));\n default:\n throw new Error(`RpcCodec: unsupported method \"${method}\"`);\n }\n}\n\nexport {\n parseDeviceNotifications,\n parseMotorNotifications,\n resultOpcodeForMethod,\n packU16LE,\n type ParsedDeviceNotifications,\n};\n","/**\n * Pluggable BLE transport — mirrors the Python package's BLETransport idea:\n * Device APIs stay stable; swap Mock ↔ WebBluetooth (or a future bridge).\n */\n\nexport type DeviceKind =\n | \"single-motor\"\n | \"double-motor\"\n | \"color-sensor\"\n | \"controller\";\n\nexport interface ConnectFilters {\n deviceName?: string;\n deviceMac?: string;\n cardColor?: number;\n cardSerial?: string;\n}\n\nexport interface ScannedDevice {\n id: string;\n name?: string;\n kind: DeviceKind;\n cardColor?: number;\n cardSerial?: string;\n}\n\nexport type NotificationHandler = (payload: Uint8Array) => void;\nexport type DisconnectHandler = () => void;\n\nexport interface TransportConnection {\n deviceId: string;\n kind: DeviceKind;\n}\n\n/**\n * Low-level transport contract.\n * Implementations: MockTransport (dev), WebBluetoothTransport (browser).\n */\nexport interface Transport {\n readonly name: string;\n\n scan(\n kind: DeviceKind,\n filters?: ConnectFilters,\n timeoutMs?: number,\n ): Promise<ScannedDevice[]>;\n\n connect(\n kind: DeviceKind,\n filters?: ConnectFilters,\n handlers?: {\n onNotification?: NotificationHandler;\n onDisconnect?: DisconnectHandler;\n },\n ): Promise<TransportConnection>;\n\n /** Send a raw RPC / protocol frame (already encoded). */\n send(connection: TransportConnection, message: Uint8Array): Promise<void>;\n\n disconnect(connection: TransportConnection): Promise<void>;\n\n shutdownAll(): Promise<void>;\n\n /**\n * Optional: map high-level method → wire bytes.\n * Mock omits this (DeviceBase falls back to JSON mock frames).\n * WebBluetooth provides real RPC packing.\n */\n encodeCommand?(method: string, args?: Record<string, unknown>): Uint8Array;\n\n /** Optional: wait until a notify frame with this opcode arrives. */\n waitForOpcode?(opcode: number, timeoutMs?: number): Promise<Uint8Array>;\n}\n\n/** Encode a high-level command for MockTransport (not the real LEGO RPC wire format). */\nexport function encodeMockCommand(\n method: string,\n args: Record<string, unknown> = {},\n): Uint8Array {\n const text = JSON.stringify({ method, args, t: Date.now() });\n return new TextEncoder().encode(text);\n}\n\nexport function decodeMockCommand(message: Uint8Array): {\n method: string;\n args: Record<string, unknown>;\n} {\n const parsed = JSON.parse(new TextDecoder().decode(message)) as {\n method: string;\n args?: Record<string, unknown>;\n };\n return { method: parsed.method, args: parsed.args ?? {} };\n}\n","import type {\n ConnectFilters,\n DeviceKind,\n DisconnectHandler,\n NotificationHandler,\n ScannedDevice,\n Transport,\n TransportConnection,\n} from \"./types.js\";\nimport { decodeMockCommand } from \"./types.js\";\n\nexport interface MockTransportOptions {\n /** Auto-succeed connect without requiring a prior scan. Default true. */\n autoConnect?: boolean;\n /** Log send/connect activity. Default true. */\n verbose?: boolean;\n /** Simulated devices available to scan/connect. */\n devices?: ScannedDevice[];\n}\n\nconst defaultDevices: ScannedDevice[] = [\n {\n id: \"mock-single-motor-1\",\n name: \"Mock Single Motor\",\n kind: \"single-motor\",\n cardColor: 4, // LEGO_COLOR_AZURE (official wire)\n cardSerial: \"3683\",\n },\n {\n id: \"mock-double-motor-1\",\n name: \"Mock Double Motor\",\n kind: \"double-motor\",\n cardColor: 4,\n cardSerial: \"3683\",\n },\n {\n id: \"mock-color-sensor-1\",\n name: \"Mock Color Sensor\",\n kind: \"color-sensor\",\n cardColor: 4,\n cardSerial: \"3683\",\n },\n {\n id: \"mock-controller-1\",\n name: \"Mock Controller\",\n kind: \"controller\",\n cardColor: 4,\n cardSerial: \"3683\",\n },\n];\n\nfunction matchesFilters(device: ScannedDevice, filters?: ConnectFilters): boolean {\n if (!filters) return true;\n if (filters.deviceName && device.name !== filters.deviceName) return false;\n if (filters.cardColor != null && device.cardColor !== filters.cardColor) return false;\n if (filters.cardSerial && device.cardSerial !== filters.cardSerial) return false;\n return true;\n}\n\n/**\n * In-memory transport for development and demos — no Bluetooth required.\n * Command frames use the skeleton's mock JSON encoding (see encodeMockCommand).\n */\nexport class MockTransport implements Transport {\n readonly name = \"mock\";\n\n private readonly autoConnect: boolean;\n private readonly verbose: boolean;\n private readonly catalog: ScannedDevice[];\n private readonly active = new Map<string, TransportConnection>();\n private notificationHandler?: NotificationHandler;\n\n /** Mutable mock sensor / motor state for demos. */\n readonly state = {\n position: 0,\n speed: 0,\n color: 0,\n leftPercent: 0,\n rightPercent: 0,\n };\n\n constructor(options: MockTransportOptions = {}) {\n this.autoConnect = options.autoConnect ?? true;\n this.verbose = options.verbose ?? true;\n this.catalog = options.devices ?? [...defaultDevices];\n }\n\n async scan(\n kind: DeviceKind,\n filters?: ConnectFilters,\n _timeoutMs = 5000,\n ): Promise<ScannedDevice[]> {\n return this.catalog.filter(\n (d) => d.kind === kind && matchesFilters(d, filters),\n );\n }\n\n async connect(\n kind: DeviceKind,\n filters?: ConnectFilters,\n handlers?: {\n onNotification?: NotificationHandler;\n onDisconnect?: DisconnectHandler;\n },\n ): Promise<TransportConnection> {\n this.notificationHandler = handlers?.onNotification;\n\n const found = (await this.scan(kind, filters))[0];\n if (!found && !this.autoConnect) {\n throw new Error(`MockTransport: no ${kind} matching filters`);\n }\n\n const device: ScannedDevice = found ?? {\n id: `mock-${kind}-auto`,\n name: `Mock ${kind}`,\n kind,\n cardColor: filters?.cardColor,\n cardSerial: filters?.cardSerial,\n };\n\n const connection: TransportConnection = {\n deviceId: device.id,\n kind: device.kind,\n };\n this.active.set(device.id, connection);\n this.log(`connected ${device.kind} (${device.id})`);\n return connection;\n }\n\n async send(connection: TransportConnection, message: Uint8Array): Promise<void> {\n if (!this.active.has(connection.deviceId)) {\n throw new Error(`MockTransport: not connected (${connection.deviceId})`);\n }\n\n const { method, args } = decodeMockCommand(message);\n this.log(`send ${method}`, args);\n this.applyCommand(method, args);\n\n // Emit a simple notification after motor-ish commands so callback demos work.\n if (method.startsWith(\"motor_\") || method.startsWith(\"movement_\")) {\n const note = new TextEncoder().encode(\n JSON.stringify({\n type: \"MotorNotification\",\n position: this.state.position,\n speed: this.state.speed,\n }),\n );\n this.notificationHandler?.(note);\n }\n }\n\n async disconnect(connection: TransportConnection): Promise<void> {\n this.active.delete(connection.deviceId);\n this.log(`disconnected ${connection.deviceId}`);\n }\n\n async shutdownAll(): Promise<void> {\n this.active.clear();\n this.log(\"shutdownAll\");\n }\n\n private applyCommand(method: string, args: Record<string, unknown>): void {\n switch (method) {\n case \"motor_run\":\n case \"motor_set_speed\":\n this.state.speed = Number(args.speed ?? 0);\n break;\n case \"motor_run_for_degrees\":\n this.state.position += Number(args.degrees ?? 0);\n this.state.speed = Number(args.speed ?? this.state.speed);\n break;\n case \"motor_run_for_time\":\n this.state.speed = Number(args.speed ?? this.state.speed);\n break;\n case \"motor_reset_relative_position\":\n this.state.position = Number(args.position ?? 0);\n break;\n case \"motor_run_to_relative_position\":\n case \"motor_run_to_absolute_position\":\n this.state.position = Number(args.position ?? 0);\n break;\n case \"motor_stop\":\n case \"movement_stop\":\n this.state.speed = 0;\n break;\n case \"movement_move_tank\":\n this.state.speed =\n (Number(args.speed_left ?? 0) + Number(args.speed_right ?? 0)) / 2;\n break;\n default:\n break;\n }\n }\n\n private log(message: string, extra?: unknown): void {\n if (!this.verbose) return;\n if (extra !== undefined) {\n console.log(`[MockTransport] ${message}`, extra);\n } else {\n console.log(`[MockTransport] ${message}`);\n }\n }\n}\n","import {\n decodeInfoResponse,\n encodeDeviceNotificationRequest,\n encodeInfoRequest,\n encodeRpcCommand,\n type InfoResponse,\n} from \"../protocol/codec.js\";\nimport { splitNotifyFrames } from \"../protocol/frames.js\";\nimport {\n DEVICE_NOTIFICATION_RESPONSE,\n INFO_RESPONSE,\n} from \"../protocol/opcodes.js\";\nimport {\n NOTIFY_UUID,\n PRODUCT_GROUP_DEVICE_COLOR_SENSOR,\n PRODUCT_GROUP_DEVICE_CONTROLLER,\n PRODUCT_GROUP_DEVICE_DOUBLE_MOTOR,\n PRODUCT_GROUP_DEVICE_SINGLE_MOTOR,\n RPC_VERSION,\n SERVICE_UUID,\n WRITE_UUID,\n} from \"../protocol/uuids.js\";\nimport type {\n ConnectFilters,\n DeviceKind,\n DisconnectHandler,\n NotificationHandler,\n ScannedDevice,\n Transport,\n TransportConnection,\n} from \"./types.js\";\n\ntype BluetoothNavigator = Navigator & {\n bluetooth: {\n requestDevice(options: {\n filters?: Array<{ services?: string[]; namePrefix?: string }>;\n optionalServices?: string[];\n acceptAllDevices?: boolean;\n }): Promise<BluetoothDeviceLike>;\n };\n};\n\ninterface BluetoothDeviceLike extends EventTarget {\n id: string;\n name?: string;\n gatt?: {\n connected: boolean;\n connect(): Promise<BluetoothRemoteGATTServerLike>;\n disconnect(): void;\n };\n}\n\ninterface BluetoothRemoteGATTServerLike {\n connected: boolean;\n connect(): Promise<BluetoothRemoteGATTServerLike>;\n getPrimaryService(uuid: string): Promise<BluetoothRemoteGATTServiceLike>;\n device: BluetoothDeviceLike;\n}\n\ninterface BluetoothRemoteGATTServiceLike {\n getCharacteristic(uuid: string): Promise<BluetoothRemoteGATTCharacteristicLike>;\n}\n\ninterface BluetoothRemoteGATTCharacteristicLike extends EventTarget {\n writeValueWithoutResponse?(value: BufferSource): Promise<void>;\n writeValue?(value: BufferSource): Promise<void>;\n startNotifications(): Promise<BluetoothRemoteGATTCharacteristicLike>;\n stopNotifications(): Promise<BluetoothRemoteGATTCharacteristicLike>;\n value?: DataView;\n}\n\ninterface LiveConnection extends TransportConnection {\n device: BluetoothDeviceLike;\n server: BluetoothRemoteGATTServerLike;\n writeChar: BluetoothRemoteGATTCharacteristicLike;\n notifyChar: BluetoothRemoteGATTCharacteristicLike;\n onNotification?: NotificationHandler;\n onDisconnect?: DisconnectHandler;\n info?: InfoResponse;\n}\n\nexport interface WebBluetoothTransportOptions {\n /** Reject connect if INFO_RESPONSE productGroupDevice mismatches kind. Default true. */\n enforceProductGroup?: boolean;\n /** Warn (default) or throw when RPC version ≠ package expectation. */\n rpcVersionMode?: \"warn\" | \"throw\" | \"ignore\";\n /** Default timeout waiting for RPC result notify. */\n defaultTimeoutMs?: number;\n}\n\n/**\n * Browser Web Bluetooth transport (Chrome / Edge, HTTPS or localhost).\n *\n * Connect skeleton: requestDevice(fd02) → GATT → notify → INFO_REQUEST handshake.\n * Command encoding uses `encodeRpcCommand` (official-aligned frames).\n */\nexport class WebBluetoothTransport implements Transport {\n readonly name = \"web-bluetooth\";\n\n private readonly enforceProductGroup: boolean;\n private readonly rpcVersionMode: \"warn\" | \"throw\" | \"ignore\";\n private readonly defaultTimeoutMs: number;\n private readonly live = new Map<string, LiveConnection>();\n /** FIFO waiters per opcode (matches official Python deque). */\n private readonly waiters = new Map<\n number,\n Array<{\n resolve: (p: Uint8Array) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }>\n >();\n\n constructor(options: WebBluetoothTransportOptions = {}) {\n this.enforceProductGroup = options.enforceProductGroup ?? true;\n this.rpcVersionMode = options.rpcVersionMode ?? \"warn\";\n this.defaultTimeoutMs = options.defaultTimeoutMs ?? 15_000;\n }\n\n encodeCommand(method: string, args: Record<string, unknown> = {}): Uint8Array {\n return encodeRpcCommand(method, args);\n }\n\n async scan(\n _kind: DeviceKind,\n _filters?: ConnectFilters,\n _timeoutMs?: number,\n ): Promise<ScannedDevice[]> {\n this.assertBrowser();\n // Web Bluetooth has no background scan API like bleak; selection happens in connect().\n return [];\n }\n\n async connect(\n kind: DeviceKind,\n _filters?: ConnectFilters,\n handlers?: {\n onNotification?: NotificationHandler;\n onDisconnect?: DisconnectHandler;\n },\n ): Promise<TransportConnection> {\n this.assertBrowser();\n\n const nav = navigator as BluetoothNavigator;\n // Must run from a user gesture (button click).\n const device = await nav.bluetooth.requestDevice({\n filters: [{ services: [SERVICE_UUID] }],\n optionalServices: [SERVICE_UUID],\n });\n\n if (!device.gatt) {\n throw new Error(\"WebBluetoothTransport: device has no GATT\");\n }\n\n const server = await device.gatt.connect();\n const service = await server.getPrimaryService(SERVICE_UUID);\n const writeChar = await service.getCharacteristic(WRITE_UUID);\n const notifyChar = await service.getCharacteristic(NOTIFY_UUID);\n\n const live: LiveConnection = {\n deviceId: device.id,\n kind,\n device,\n server,\n writeChar,\n notifyChar,\n onNotification: handlers?.onNotification,\n onDisconnect: handlers?.onDisconnect,\n };\n\n const onGattDisconnected = () => {\n this.live.delete(device.id);\n this.rejectAllWaiters(new Error(\"Device disconnected\"));\n handlers?.onDisconnect?.();\n console.log('注销方法!')\n device.removeEventListener(\"gattserverdisconnected\", onGattDisconnected)\n };\n device.addEventListener(\"gattserverdisconnected\", onGattDisconnected);\n\n // 接收设备数据\n const onNotify = (event: Event) => {\n const target = event.target as BluetoothRemoteGATTCharacteristicLike;\n const value = target.value;\n if (!value) return;\n const raw = new Uint8Array(\n value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength),\n );\n // One GATT notify may contain DEVICE_NOTIFICATION + RPC result back-to-back.\n for (const payload of splitNotifyFrames(raw)) {\n live.onNotification?.(payload);\n this.resolveWaiter(payload[0]!, payload);\n }\n };\n notifyChar.addEventListener(\"characteristicvaluechanged\", onNotify);\n await notifyChar.startNotifications();\n\n this.live.set(device.id, live);\n\n // Register waiter before write to avoid missing a fast INFO_RESPONSE.\n const infoWait = this.waitForOpcode(INFO_RESPONSE, 8_000);\n await this.writeRaw(live, encodeInfoRequest());\n const infoPayload = await infoWait;\n const info = decodeInfoResponse(infoPayload);\n live.info = info;\n this.checkRpcVersion(info);\n this.checkProductGroup(kind, info);\n\n // Enable periodic DEVICE_NOTIFICATION (position / speed), like official connect().\n const notifWait = this.waitForOpcode(DEVICE_NOTIFICATION_RESPONSE, 5_000);\n await this.writeRaw(live, encodeDeviceNotificationRequest(100));\n await notifWait;\n\n return live;\n }\n\n async send(connection: TransportConnection, message: Uint8Array): Promise<void> {\n const live = this.requireLive(connection.deviceId);\n await this.writeRaw(live, message);\n }\n\n async waitForOpcode(opcode: number, timeoutMs = this.defaultTimeoutMs): Promise<Uint8Array> {\n return new Promise<Uint8Array>((resolve, reject) => {\n const entry = {\n resolve: (payload: Uint8Array) => {\n clearTimeout(entry.timer);\n resolve(payload);\n },\n reject: (err: Error) => {\n clearTimeout(entry.timer);\n reject(err);\n },\n timer: setTimeout(() => {\n const q = this.waiters.get(opcode);\n if (q) {\n const idx = q.indexOf(entry);\n if (idx >= 0) q.splice(idx, 1);\n if (q.length === 0) this.waiters.delete(opcode);\n }\n reject(new Error(`Timeout waiting for opcode ${opcode}`));\n }, timeoutMs),\n };\n\n const q = this.waiters.get(opcode) ?? [];\n q.push(entry);\n this.waiters.set(opcode, q);\n });\n }\n\n async disconnect(connection: TransportConnection): Promise<void> {\n const live = this.live.get(connection.deviceId);\n if (!live) return;\n try {\n await live.notifyChar.stopNotifications().catch(() => undefined);\n } finally {\n live.device.gatt?.disconnect();\n this.live.delete(connection.deviceId);\n }\n }\n\n async shutdownAll(): Promise<void> {\n for (const id of [...this.live.keys()]) {\n await this.disconnect({ deviceId: id, kind: \"single-motor\" });\n }\n this.rejectAllWaiters(new Error(\"shutdownAll\"));\n }\n\n /** Last INFO_RESPONSE for a connection (if handshake completed). */\n getInfo(connection: TransportConnection): InfoResponse | undefined {\n return this.live.get(connection.deviceId)?.info;\n }\n\n static isSupported(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n typeof (navigator as Navigator & { bluetooth?: unknown }).bluetooth !==\n \"undefined\"\n );\n }\n\n private async writeRaw(live: LiveConnection, message: Uint8Array): Promise<void> {\n const { writeChar } = live;\n // Copy into a plain ArrayBuffer view for DOM BufferSource typing.\n const bytes = new Uint8Array(message);\n if (writeChar.writeValueWithoutResponse) {\n await writeChar.writeValueWithoutResponse(bytes);\n } else if (writeChar.writeValue) {\n await writeChar.writeValue(bytes);\n } else {\n throw new Error(\"WebBluetoothTransport: characteristic is not writable\");\n }\n }\n\n private requireLive(deviceId: string): LiveConnection {\n const live = this.live.get(deviceId);\n if (!live) throw new Error(`WebBluetoothTransport: not connected (${deviceId})`);\n return live;\n }\n\n private checkRpcVersion(info: InfoResponse): void {\n if (this.rpcVersionMode === \"ignore\") return;\n const match =\n info.rpcMajor === RPC_VERSION.major &&\n info.rpcMinor === RPC_VERSION.minor &&\n info.rpcBuild === RPC_VERSION.build;\n if (match) return;\n const msg =\n `RPC version mismatch: device=${info.rpcMajor}.${info.rpcMinor}.${info.rpcBuild}, ` +\n `expected=${RPC_VERSION.major}.${RPC_VERSION.minor}.${RPC_VERSION.build}. ` +\n `Update firmware via Coding Canvas or adjust client.`;\n if (this.rpcVersionMode === \"throw\") throw new Error(msg);\n console.warn(`[WebBluetoothTransport] ${msg}`);\n }\n\n private checkProductGroup(kind: DeviceKind, info: InfoResponse): void {\n if (!this.enforceProductGroup) return;\n const expected: Record<DeviceKind, number> = {\n \"single-motor\": PRODUCT_GROUP_DEVICE_SINGLE_MOTOR,\n \"double-motor\": PRODUCT_GROUP_DEVICE_DOUBLE_MOTOR,\n \"color-sensor\": PRODUCT_GROUP_DEVICE_COLOR_SENSOR,\n controller: PRODUCT_GROUP_DEVICE_CONTROLLER,\n };\n const want = expected[kind];\n if (info.productGroupDevice !== want) {\n throw new Error(\n `Expected ${kind} (productGroupDevice=${want}), got ${info.productGroupDevice}`,\n );\n }\n }\n\n private resolveWaiter(opcode: number, payload: Uint8Array): void {\n const q = this.waiters.get(opcode);\n if (!q?.length) return;\n const waiter = q.shift()!;\n if (q.length === 0) this.waiters.delete(opcode);\n waiter.resolve(payload);\n }\n\n private rejectAllWaiters(err: Error): void {\n for (const [, q] of this.waiters) {\n for (const w of q) w.reject(err);\n }\n this.waiters.clear();\n }\n\n private assertBrowser(): void {\n if (!WebBluetoothTransport.isSupported()) {\n throw new Error(\n \"Web Bluetooth is not available (need Chromium + HTTPS/localhost).\",\n );\n }\n }\n}\n","import { PROGRAM_ACTION_START } from \"../constants.js\";\nimport { resultOpcodeForMethod } from \"../protocol/opcodes.js\";\nimport type {\n ConnectFilters,\n DeviceKind,\n Transport,\n TransportConnection,\n} from \"../transport/types.js\";\nimport { encodeMockCommand } from \"../transport/types.js\";\n\nexport type DeviceNotificationCallback = (data: Uint8Array) => void;\n\nexport interface DeviceOptions {\n transport?: Transport;\n}\n\nlet defaultTransport: Transport | undefined;\n\nexport function setDefaultTransport(transport: Transport): void {\n defaultTransport = transport;\n}\n\nexport function getDefaultTransport(): Transport | undefined {\n return defaultTransport;\n}\n\nfunction concatFrames(frames: Uint8Array[]): Uint8Array {\n const total = frames.reduce((n, f) => n + f.length, 0);\n const out = new Uint8Array(total);\n let o = 0;\n for (const f of frames) {\n out.set(f, o);\n o += f.length;\n }\n return out;\n}\n\n/**\n * Shared connect / disconnect / send plumbing for all hardware classes.\n */\nexport abstract class DeviceBase {\n abstract readonly kind: DeviceKind;\n\n protected transport: Transport;\n protected connection: TransportConnection | null = null;\n protected notificationCallback: DeviceNotificationCallback | null = null;\n private batchBuffer: Uint8Array[] | null = null;\n\n get connected(): boolean {\n return this.connection !== null;\n }\n\n get deviceId(): string | null {\n return this.connection?.deviceId ?? null;\n }\n\n constructor(options: DeviceOptions = {}) {\n const transport = options.transport ?? defaultTransport;\n if (!transport) {\n throw new Error(\n `${this.constructor.name}: pass { transport } or call setDefaultTransport(...) first`,\n );\n }\n this.transport = transport;\n }\n\n async connect(\n filters: ConnectFilters = {},\n _options?: { deviceNotificationDelay?: number, onDisconnect?: (() => void) },\n ): Promise<void> {\n void _options;\n this.connection = await this.transport.connect(this.kind, filters, {\n onNotification: (payload) => {\n this.applyNotification(payload);\n this.notificationCallback?.(payload);\n },\n onDisconnect: () => {\n this.connection = null;\n if (_options && _options.onDisconnect && typeof _options.onDisconnect === 'function') {\n _options.onDisconnect();\n }\n },\n });\n // LED / beep RPCs need an active program session on many firmwares.\n await this.programFlowNotification(PROGRAM_ACTION_START, { blocking: false });\n }\n\n protected applyNotification(_payload: Uint8Array): void {}\n\n async disconnect(): Promise<void> {\n if (!this.connection) return;\n await this.transport.disconnect(this.connection);\n this.connection = null;\n }\n\n setNotificationCallback(callback: DeviceNotificationCallback | null): void {\n this.notificationCallback = callback;\n }\n\n async search(\n filters?: ConnectFilters,\n timeoutMs = 5000,\n ): Promise<Awaited<ReturnType<Transport[\"scan\"]>>> {\n return this.transport.scan(this.kind, filters, timeoutMs);\n }\n\n /** Python: `light_color(color, ...)` */\n async lightColor(\n color: number,\n options: { pattern?: number; intensity?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"light_color\", {\n color,\n pattern: options.pattern ?? 0,\n intensity: options.intensity ?? 100,\n blocking: options.blocking ?? true,\n });\n }\n\n /** Python: `beep(...)` */\n async beep(\n options: {\n pattern?: number;\n frequency?: number;\n count?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"beep\", {\n pattern: options.pattern ?? 0,\n frequency: options.frequency ?? 440,\n count: options.count ?? 1,\n blocking: options.blocking ?? true,\n });\n }\n\n /** Python: `stop_beep(...)` */\n async stopBeep(options: { blocking?: boolean } = {}): Promise<void> {\n await this.sendCommand(\"stop_beep\", {\n blocking: options.blocking ?? true,\n });\n }\n\n /** Python: `program_flow_notification(action, ...)` */\n async programFlowNotification(\n action: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"program_flow_notification\", {\n action,\n blocking: options.blocking ?? false,\n });\n }\n\n /** Python: `device_notification_request(delay_ms, ...)` */\n async deviceNotificationRequest(\n delayMs: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"device_notification_request\", {\n delay_ms: delayMs,\n blocking: options.blocking ?? true,\n });\n }\n\n /** Python: `begin_batch()` — client-side queue (motor commands only). */\n beginBatch(): void {\n this.batchBuffer = [];\n }\n\n /** Python: `end_batch()` — flush queued frames in one BLE write. */\n async endBatch(options: { blocking?: boolean } = {}): Promise<void> {\n if (!this.batchBuffer) return;\n if (!this.connection) {\n this.batchBuffer = null;\n throw new Error(`${this.constructor.name}: not connected`);\n }\n const frames = this.batchBuffer;\n this.batchBuffer = null;\n if (frames.length === 0) return;\n await this.transport.send(this.connection, concatFrames(frames));\n void options;\n }\n\n /** Python: `cancel_batch()` */\n cancelBatch(): number {\n const n = this.batchBuffer?.length ?? 0;\n this.batchBuffer = null;\n return n;\n }\n\n protected async sendCommand(\n method: string,\n args: Record<string, unknown> = {},\n ): Promise<void> {\n if (!this.connection) {\n throw new Error(`${this.constructor.name}: not connected`);\n }\n\n if (this.batchBuffer && method.startsWith(\"movement_\")) {\n throw new Error(\n \"Movement commands cannot be called inside a batch. Use motor_* commands instead.\",\n );\n }\n\n const blocking = args.blocking !== false;\n const frame =\n this.transport.encodeCommand?.(method, args) ??\n encodeMockCommand(method, args);\n\n if (this.batchBuffer) {\n this.batchBuffer.push(frame);\n return;\n }\n\n const resultOpcode = resultOpcodeForMethod(method);\n const waitForOpcode = this.transport.waitForOpcode;\n let waitPromise: Promise<Uint8Array> | undefined;\n if (blocking && resultOpcode != null && waitForOpcode) {\n const degrees = Number(args.degrees ?? 0);\n const timeMs = Number(args.time_ms ?? 0);\n const quickRpc =\n method === \"light_color\" ||\n method === \"beep\" ||\n method === \"stop_beep\" ||\n method === \"device_notification_request\";\n const timeoutMs = quickRpc\n ? 5_000\n : Math.max(15_000, Math.abs(degrees) * 50 + 5_000, timeMs + 5_000);\n waitPromise = waitForOpcode.call(this.transport, resultOpcode, timeoutMs);\n }\n\n await this.transport.send(this.connection, frame);\n if (waitPromise) await waitPromise;\n }\n}\n","import {\n DEFAULT_MOTOR,\n MOTOR_MOVE_DIRECTION_CLOCKWISE,\n MOTOR_MOVE_DIRECTION_SHORTEST,\n UNCHANGED,\n} from \"../constants.js\";\nimport { parseDeviceNotifications } from \"../protocol/notifications.js\";\nimport type { DeviceKind } from \"../transport/types.js\";\nimport { DeviceBase, type DeviceOptions } from \"./base.js\";\n\nexport interface MotorReading {\n position: number;\n speed: number;\n absolutePosition?: number;\n motorState?: number;\n power?: number;\n gesture?: number;\n}\n\n/** Python: `le.SingleMotor()` */\nexport class SingleMotor extends DeviceBase {\n readonly kind: DeviceKind = \"single-motor\";\n readonly motor: MotorReading = { position: 0, speed: 0 };\n\n constructor(options: DeviceOptions = {}) {\n super(options);\n }\n\n protected applyNotification(payload: Uint8Array): void {\n const { motors } = parseDeviceNotifications(payload);\n for (const reading of motors) {\n this.motor.position = reading.position;\n this.motor.speed = reading.speed;\n this.motor.absolutePosition = reading.absolutePosition;\n this.motor.motorState = reading.motorState;\n this.motor.power = reading.power;\n this.motor.gesture = reading.gesture;\n }\n }\n\n private get useCommandSideEstimates(): boolean {\n return this.transport.name === \"mock\";\n }\n\n async motorSetSpeed(\n speed: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_speed\", {\n speed,\n motor: options.motor ?? DEFAULT_MOTOR,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.speed = speed;\n }\n\n async motorRun(\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n const speed = options.speed ?? UNCHANGED;\n await this.sendCommand(\"motor_run\", {\n direction: options.direction ?? MOTOR_MOVE_DIRECTION_CLOCKWISE,\n motor: options.motor ?? DEFAULT_MOTOR,\n speed,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates && speed !== UNCHANGED) {\n this.motor.speed = speed;\n }\n }\n\n async motorRunForTime(\n timeMs: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_for_time\", {\n time_ms: timeMs,\n direction: options.direction ?? MOTOR_MOVE_DIRECTION_CLOCKWISE,\n motor: options.motor ?? DEFAULT_MOTOR,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorRunForDegrees(\n degrees: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_for_degrees\", {\n degrees,\n direction: options.direction ?? MOTOR_MOVE_DIRECTION_CLOCKWISE,\n motor: options.motor ?? DEFAULT_MOTOR,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.position += degrees;\n }\n\n async motorResetRelativePosition(\n options: { motor?: number; position?: number; blocking?: boolean } = {},\n ): Promise<void> {\n const position = options.position ?? 0;\n await this.sendCommand(\"motor_reset_relative_position\", {\n motor: options.motor ?? DEFAULT_MOTOR,\n position,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.position = position;\n }\n\n async motorRunToRelativePosition(\n position: number,\n options: { motor?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_to_relative_position\", {\n position,\n motor: options.motor ?? DEFAULT_MOTOR,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.position = position;\n }\n\n async motorRunToAbsolutePosition(\n position: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_to_absolute_position\", {\n position,\n direction: options.direction ?? MOTOR_MOVE_DIRECTION_SHORTEST,\n motor: options.motor ?? DEFAULT_MOTOR,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.position = position;\n }\n\n async motorSetDutyCycle(\n dutyCycle: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_duty_cycle\", {\n duty_cycle: dutyCycle,\n motor: options.motor ?? DEFAULT_MOTOR,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorStop(\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_stop\", {\n motor: options.motor ?? DEFAULT_MOTOR,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.motor.speed = 0;\n }\n\n async motorSetEndState(\n endState: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_end_state\", {\n end_state: endState,\n motor: options.motor ?? DEFAULT_MOTOR,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorSetAcceleration(\n acceleration: number,\n deceleration: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_acceleration\", {\n acceleration,\n deceleration,\n motor: options.motor ?? DEFAULT_MOTOR,\n blocking: options.blocking ?? true,\n });\n }\n}\n","import {\n MOTOR_BOTH,\n MOTOR_LEFT,\n MOTOR_RIGHT,\n MOVEMENT_DIRECTION_FORWARD,\n MOVEMENT_MOVE_DIRECTION_FORWARD,\n MOVEMENT_TURN_DIRECTION_LEFT,\n UNCHANGED,\n} from \"../constants.js\";\nimport { parseDeviceNotifications } from \"../protocol/notifications.js\";\nimport type { DeviceKind } from \"../transport/types.js\";\nimport { DeviceBase, type DeviceOptions } from \"./base.js\";\nimport type { MotorReading } from \"./single-motor.js\";\n\nexport interface ImuReading {\n orientation: number;\n yawFace: number;\n yaw: number;\n pitch: number;\n roll: number;\n accelerometerX: number;\n accelerometerY: number;\n accelerometerZ: number;\n gyroscopeX: number;\n gyroscopeY: number;\n gyroscopeZ: number;\n gesture?: number;\n}\n\n/** Python: `le.DoubleMotor()` */\nexport class DoubleMotor extends DeviceBase {\n readonly kind: DeviceKind = \"double-motor\";\n\n readonly motor: Record<number, MotorReading> = {\n [MOTOR_LEFT]: { position: 0, speed: 0 },\n [MOTOR_RIGHT]: { position: 0, speed: 0 },\n };\n\n readonly imu: ImuReading = {\n orientation: 0,\n yawFace: 0,\n yaw: 0,\n pitch: 0,\n roll: 0,\n accelerometerX: 0,\n accelerometerY: 0,\n accelerometerZ: 0,\n gyroscopeX: 0,\n gyroscopeY: 0,\n gyroscopeZ: 0,\n };\n\n constructor(options: DeviceOptions = {}) {\n super(options);\n }\n\n protected applyNotification(payload: Uint8Array): void {\n const parsed = parseDeviceNotifications(payload);\n for (const reading of parsed.motors) {\n const sides: number[] = [];\n if (reading.motorBitMask & 1) sides.push(MOTOR_LEFT);\n if (reading.motorBitMask & 2) sides.push(MOTOR_RIGHT);\n for (const side of sides) {\n this.motor[side].position = reading.position;\n this.motor[side].speed = reading.speed;\n this.motor[side].absolutePosition = reading.absolutePosition;\n this.motor[side].motorState = reading.motorState;\n this.motor[side].power = reading.power;\n this.motor[side].gesture = reading.gesture;\n }\n }\n if (parsed.imu) Object.assign(this.imu, parsed.imu);\n if (parsed.imuGesture !== undefined) this.imu.gesture = parsed.imuGesture;\n }\n\n private get useCommandSideEstimates(): boolean {\n return this.transport.name === \"mock\";\n }\n\n async motorSetSpeed(\n speed: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n const motor = options.motor ?? MOTOR_BOTH;\n await this.sendCommand(\"motor_set_speed\", {\n speed,\n motor,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.touchMotor(motor, { speed });\n }\n\n async motorRun(\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n const motor = options.motor ?? MOTOR_BOTH;\n const speed = options.speed ?? UNCHANGED;\n await this.sendCommand(\"motor_run\", {\n direction: options.direction ?? 0,\n motor,\n speed,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates && speed !== UNCHANGED) {\n this.touchMotor(motor, { speed });\n }\n }\n\n async motorRunForTime(\n timeMs: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_for_time\", {\n time_ms: timeMs,\n direction: options.direction ?? 0,\n motor: options.motor ?? MOTOR_BOTH,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorRunForDegrees(\n degrees: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n const motor = options.motor ?? MOTOR_BOTH;\n await this.sendCommand(\"motor_run_for_degrees\", {\n degrees,\n direction: options.direction ?? 0,\n motor,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) {\n this.touchMotor(motor, { positionDelta: degrees });\n }\n }\n\n async motorResetRelativePosition(\n options: { motor?: number; position?: number; blocking?: boolean } = {},\n ): Promise<void> {\n const position = options.position ?? 0;\n const motor = options.motor ?? MOTOR_BOTH;\n await this.sendCommand(\"motor_reset_relative_position\", {\n motor,\n position,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) {\n this.touchMotor(motor, { position });\n }\n }\n\n async motorRunToRelativePosition(\n position: number,\n options: { motor?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n const motor = options.motor ?? MOTOR_BOTH;\n await this.sendCommand(\"motor_run_to_relative_position\", {\n position,\n motor,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.touchMotor(motor, { position });\n }\n\n async motorRunToAbsolutePosition(\n position: number,\n options: {\n direction?: number;\n motor?: number;\n speed?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_run_to_absolute_position\", {\n position,\n direction: options.direction ?? 2,\n motor: options.motor ?? MOTOR_BOTH,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorSetDutyCycle(\n dutyCycle: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_duty_cycle\", {\n duty_cycle: dutyCycle,\n motor: options.motor ?? MOTOR_BOTH,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorStop(\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n const motor = options.motor ?? MOTOR_BOTH;\n await this.sendCommand(\"motor_stop\", {\n motor,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) this.touchMotor(motor, { speed: 0 });\n }\n\n async motorSetEndState(\n endState: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_end_state\", {\n end_state: endState,\n motor: options.motor ?? MOTOR_BOTH,\n blocking: options.blocking ?? true,\n });\n }\n\n async motorSetAcceleration(\n acceleration: number,\n deceleration: number,\n options: { motor?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"motor_set_acceleration\", {\n acceleration,\n deceleration,\n motor: options.motor ?? MOTOR_BOTH,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementMove(\n options: { direction?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_move\", {\n direction: options.direction ?? MOVEMENT_DIRECTION_FORWARD,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementMoveForTime(\n timeMs: number,\n options: { direction?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_move_for_time\", {\n time_ms: timeMs,\n direction: options.direction ?? MOVEMENT_DIRECTION_FORWARD,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementMoveForDegrees(\n degrees: number,\n options: { direction?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_move_for_degrees\", {\n degrees,\n direction: options.direction ?? MOVEMENT_MOVE_DIRECTION_FORWARD,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementMoveTank(\n speedLeft: number,\n speedRight: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_move_tank\", {\n speed_left: speedLeft,\n speed_right: speedRight,\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) {\n this.motor[MOTOR_LEFT].speed = speedLeft;\n this.motor[MOTOR_RIGHT].speed = speedRight;\n }\n }\n\n async movementMoveTankForDegrees(\n degrees: number,\n options: {\n speedLeft?: number;\n speedRight?: number;\n blocking?: boolean;\n } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_move_tank_for_degrees\", {\n degrees,\n speed_left: options.speedLeft ?? 50,\n speed_right: options.speedRight ?? 50,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementTurnForDegrees(\n degrees: number,\n options: { direction?: number; speed?: number; blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_turn_for_degrees\", {\n degrees,\n direction: options.direction ?? MOVEMENT_TURN_DIRECTION_LEFT,\n speed: options.speed ?? UNCHANGED,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementStop(options: { blocking?: boolean } = {}): Promise<void> {\n await this.sendCommand(\"movement_stop\", {\n blocking: options.blocking ?? true,\n });\n if (this.useCommandSideEstimates) {\n this.motor[MOTOR_LEFT].speed = 0;\n this.motor[MOTOR_RIGHT].speed = 0;\n }\n }\n\n async movementSetSpeed(\n speed: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_set_speed\", {\n speed,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementSetEndState(\n endState: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_set_end_state\", {\n end_state: endState,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementSetAcceleration(\n acceleration: number,\n deceleration: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_set_acceleration\", {\n acceleration,\n deceleration,\n blocking: options.blocking ?? true,\n });\n }\n\n async movementSetTurnSteering(\n steering: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"movement_set_turn_steering\", {\n steering,\n blocking: options.blocking ?? true,\n });\n }\n\n async imuSetYawFace(\n yawFace: number,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"imu_set_yaw_face\", {\n yaw_face: yawFace,\n blocking: options.blocking ?? true,\n });\n }\n\n async imuResetYawAxis(\n value = 0,\n options: { blocking?: boolean } = {},\n ): Promise<void> {\n await this.sendCommand(\"imu_reset_yaw_axis\", {\n value,\n blocking: options.blocking ?? true,\n });\n }\n\n private touchMotor(\n motor: number,\n patch: { speed?: number; positionDelta?: number; position?: number },\n ): void {\n const targets =\n motor === MOTOR_BOTH\n ? [MOTOR_LEFT, MOTOR_RIGHT]\n : motor === MOTOR_LEFT || motor === MOTOR_RIGHT\n ? [motor]\n : [MOTOR_LEFT];\n\n for (const side of targets) {\n if (patch.speed !== undefined) this.motor[side].speed = patch.speed;\n if (patch.positionDelta !== undefined) {\n this.motor[side].position += patch.positionDelta;\n }\n if (patch.position !== undefined) this.motor[side].position = patch.position;\n }\n }\n}\n","import { parseDeviceNotifications } from \"../protocol/notifications.js\";\nimport type { DeviceKind } from \"../transport/types.js\";\nimport { DeviceBase, type DeviceOptions } from \"./base.js\";\n\n/** Python: `colorsensor.sensor` */\nexport interface ColorSensorReading {\n color: number;\n rawRed: number;\n rawGreen: number;\n rawBlue: number;\n reflection: number;\n hue?: number;\n saturation?: number;\n value?: number;\n}\n\n/** Python: `le.ColorSensor()` */\nexport class ColorSensor extends DeviceBase {\n readonly kind: DeviceKind = \"color-sensor\";\n\n readonly sensor: ColorSensorReading = {\n color: 0,\n rawRed: 0,\n rawGreen: 0,\n rawBlue: 0,\n reflection: 0,\n };\n\n constructor(options: DeviceOptions = {}) {\n super(options);\n }\n\n // 收到消息\n protected applyNotification(payload: Uint8Array): void {\n const { color } = parseDeviceNotifications(payload);\n if (!color) return;\n this.sensor.color = color.color;\n this.sensor.reflection = color.reflection;\n this.sensor.rawRed = color.rawRed;\n this.sensor.rawGreen = color.rawGreen;\n this.sensor.rawBlue = color.rawBlue;\n this.sensor.hue = color.hue;\n this.sensor.saturation = color.saturation;\n this.sensor.value = color.value;\n }\n\n /** Demo helper for MockTransport. */\n mockSetColor(partial: Partial<ColorSensorReading>): void {\n Object.assign(this.sensor, partial);\n }\n}\n","import { parseDeviceNotifications } from \"../protocol/notifications.js\";\nimport type { DeviceKind } from \"../transport/types.js\";\nimport { DeviceBase, type DeviceOptions } from \"./base.js\";\n\n/** Python: `controller.sensor` */\nexport interface ControllerReading {\n leftPercent: number;\n rightPercent: number;\n leftAngle: number;\n rightAngle: number;\n}\n\n/** Python: `le.Controller()` */\nexport class Controller extends DeviceBase {\n readonly kind: DeviceKind = \"controller\";\n\n readonly sensor: ControllerReading = {\n leftPercent: 0,\n rightPercent: 0,\n leftAngle: 0,\n rightAngle: 0,\n };\n\n buttonState = 0;\n\n constructor(options: DeviceOptions = {}) {\n super(options);\n }\n\n protected applyNotification(payload: Uint8Array): void {\n const parsed = parseDeviceNotifications(payload);\n if (parsed.controller) {\n // console.log(parsed.controller, 'parsed.controller!!!!')\n this.sensor.leftPercent = parsed.controller.leftPercent;\n this.sensor.rightPercent = parsed.controller.rightPercent;\n this.sensor.leftAngle = parsed.controller.leftAngle;\n this.sensor.rightAngle = parsed.controller.rightAngle;\n }\n if (parsed.buttonState !== undefined) {\n this.buttonState = parsed.buttonState;\n }\n }\n\n /** Demo helper for MockTransport. */\n mockSetLevers(partial: Partial<ControllerReading>): void {\n Object.assign(this.sensor, partial);\n }\n}\n"],"mappings":";;;;;;AAMA,IAAa,qBAAqB;AAClC,IAAa,kBAAkB;AAC/B,IAAa,iBAAiB;AAC9B,IAAa,oBAAoB;AACjC,IAAa,kBAAkB;AAC/B,IAAa,kBAAkB;AAC/B,IAAa,mBAAmB;AAChC,IAAa,oBAAoB;AACjC,IAAa,mBAAmB;AAChC,IAAa,qBAAqB;AAClC,IAAa,oBAAoB;AACjC,IAAa,mBAAmB;;AAGhC,IAAM,UAAU;AAChB,IAAM,WAAW;AACjB,IAAM,aAAa;AACnB,IAAM,YAAY;AAClB,IAAM,UAAU;AAChB,IAAM,WAAW;AACjB,IAAM,eAAe;AACrB,IAAM,WAAW;AACjB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,SAAS;AACf,IAAM,WAAW;AAEjB,IAAM,YAAoC;EAClB,IAAA;EACJ,IAAA;EACG,IAAA;EACF,IAAA;EACA,IAAA;EACC,IAAA;EACC,IAAA;EACD,IAAA;EACE,IAAA;EACD,IAAA;EACD,KAAA;AACtB;AAEA,IAAM,YAAoC;EACvC,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;EACA,WAAA;EACA,eAAA;EACA,WAAA;EACA,YAAA;EACA,YAAA;EACA,SAAA;EACA,WAAA;AACH;AAEA,SAAgB,mBAAmB,UAA0B;;CAC3D,QAAA,sBAAO,UAAU,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAa;AAChC;AAEA,SAAgB,mBAAmB,eAA+B;;CAChE,QAAA,wBAAO,UAAU,oBAAA,QAAA,0BAAA,KAAA,IAAA,wBAAA;AACnB;;;;AClEA,IAAa,YAAY;AACzB,IAAa,gBAAgB;AAC7B,IAAa,oCAAoC;AAmBjD,IAAa,0BAA0B;AACvC,IAAa,wBAAwB;AACrC,IAAa,wBAAwB;AACrC,IAAa,uBAAuB;AACpC,IAAa,2BAA2B;AACxC,IAAa,8BAA8B;AAC3C,IAAa,8BAA8B;AAE3C,IAAa,iCAAiC;AAC9C,IAAa,wCAAwC;AACrD,IAAa,gCAAgC;AAC7C,IAAa,+BAA+B;AAE5C,IAAa,aAAa;AAC1B,IAAa,cAAc;AAC3B,IAAa,aAAa;AAE1B,IAAa,6BAA6B;AAC1C,IAAa,8BAA8B;AAC3C,IAAa,0BAA0B;AACvC,IAAa,2BAA2B;AAExC,IAAa,kCAAkC;AAC/C,IAAa,mCAAmC;AAEhD,IAAa,+BAA+B;AAC5C,IAAa,gCAAgC;AAE7C,IAAa,kBAAkB;AAC/B,IAAa,oBAAoB;AACjC,IAAa,oBAAoB;AACjC,IAAa,qBAAqB;AAClC,IAAa,mBAAmB;AAChC,IAAa,mBAAmB;AAEhC,IAAa,4BAA4B;AACzC,IAAa,4BAA4B;AACzC,IAAa,4BAA4B;AACzC,IAAa,oCAAoC;AAEjD,IAAa,sBAAsB;AACnC,IAAa,wBAAwB;AACrC,IAAa,sBAAsB;AACnC,IAAa,4BAA4B;AACzC,IAAa,2BAA2B;AACxC,IAAa,6BAA6B;AAE1C,IAAa,uBAAuB;AACpC,IAAa,sBAAsB;;;;ACrEnC,IAAa,eAAe;AAC5B,IAAa,aAAa;AAC1B,IAAa,cAAc;;AAG3B,IAAa,kBAAkB;;AAG/B,IAAa,oCAAoC;AACjD,IAAa,oCAAoC;AACjD,IAAa,oCAAoC;AACjD,IAAa,kCAAkC;;AAG/C,IAAa,cAAc;CAAE,OAAO;CAAG,OAAO;CAAG,OAAO;AAAG;;;;ACd3D,IAAa,eAAe;AAC5B,IAAa,gBAAgB;AAC7B,IAAa,4BAA4B;AACzC,IAAa,8BAA8B;AAC3C,IAAa,+BAA+B;AAC5C,IAAa,sBAAsB;AAEnC,IAAa,sBAAsB;AACnC,IAAa,qBAAqB;AAClC,IAAa,oBAAoB;AACjC,IAAa,mBAAmB;AAChC,IAAa,qBAAqB;AAClC,IAAa,oBAAoB;AAEjC,IAAa,wCAAwC;AACrD,IAAa,uCAAuC;AACpD,IAAa,oBAAoB;AACjC,IAAa,mBAAmB;AAChC,IAAa,gCAAgC;AAC7C,IAAa,+BAA+B;AAC5C,IAAa,6BAA6B;AAC1C,IAAa,4BAA4B;AACzC,IAAa,yCAAyC;AACtD,IAAa,wCAAwC;AACrD,IAAa,yCAAyC;AACtD,IAAa,wCAAwC;AACrD,IAAa,+BAA+B;AAC5C,IAAa,8BAA8B;AAC3C,IAAa,qBAAqB;AAClC,IAAa,oBAAoB;AACjC,IAAa,0BAA0B;AACvC,IAAa,yBAAyB;AACtC,IAAa,8BAA8B;AAC3C,IAAa,6BAA6B;AAC1C,IAAa,iCAAiC;AAC9C,IAAa,gCAAgC;AAE7C,IAAa,wBAAwB;AACrC,IAAa,uBAAuB;AACpC,IAAa,iCAAiC;AAC9C,IAAa,gCAAgC;AAC7C,IAAa,oCAAoC;AACjD,IAAa,mCAAmC;AAChD,IAAa,6BAA6B;AAC1C,IAAa,4BAA4B;AACzC,IAAa,yCAAyC;AACtD,IAAa,wCAAwC;AACrD,IAAa,oCAAoC;AACjD,IAAa,mCAAmC;AAChD,IAAa,wBAAwB;AACrC,IAAa,uBAAuB;AACpC,IAAa,6BAA6B;AAC1C,IAAa,4BAA4B;AACzC,IAAa,iCAAiC;AAC9C,IAAa,gCAAgC;AAC7C,IAAa,oCAAoC;AACjD,IAAa,mCAAmC;AAChD,IAAa,qCAAqC;AAClD,IAAa,oCAAoC;AAEjD,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;AACvC,IAAa,6BAA6B;AAC1C,IAAa,4BAA4B;;AAGzC,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;AACvC,IAAa,oBAAoB;AACjC,IAAa,4BAA4B;AACzC,IAAa,qBAAqB;AAClC,IAAa,4BAA4B;AACzC,IAAa,0BAA0B;AACvC,IAAa,2BAA2B;AAExC,IAAa,kBAAkB;AAC/B,IAAa,mBAAmB;AAChC,IAAa,kBAAkB;;AAG/B,IAAa,4BAAoD;EACnC,IAAA;EACD,IAAA;EACN,IAAA;EACQ,IAAA;EACP,KAAA;EACO,KAAA;EACF,KAAA;EACC,KAAA;AAC9B;AAEA,SAAgB,oBAAoB,YAA4B;CAC9D,IAAI,eAAe,GAAG,OAAA;CACtB,OAAO,KAAK;AACd;AAEA,SAAgB,sBAAsB,QAAoC;CAgCxE,OAAO;EA9BL,cAAA;EACA,6BAAA;EACA,aAAA;EACA,MAAA;EACA,WAAA;EACA,+BAAA;EACA,WAAA;EACA,uBAAA;EACA,oBAAA;EACA,gCAAA;EACA,gCAAA;EACA,sBAAA;EACA,YAAA;EACA,iBAAA;EACA,qBAAA;EACA,wBAAA;EACA,eAAA;EACA,wBAAA;EACA,2BAAA;EACA,oBAAA;EACA,gCAAA;EACA,2BAAA;EACA,eAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;EACA,4BAAA;EACA,kBAAA;EACA,oBAAA;CAEK,EAAI;AACb;;;;;;;;AC5FA,IAAM,mBAA2C;EAC9B,IAAA;EACe,KAAA;EACV,MAAA;EACF,MAAA;EACC,MAAA;EACmB,MAAA;EACpB,MAAA;EACY,MAAA;EACH,MAAA;EACY,MAAA;EACA,MAAA;EACV,MAAA;EACV,MAAA;EACK,MAAA;EACI,MAAA;EACG,MAAA;EACT,MAAA;EACS,MAAA;EACG,MAAA;EACP,MAAA;EACY,MAAA;EACL,MAAA;EACZ,MAAA;EACK,MAAA;EACI,MAAA;EACG,MAAA;EACC,MAAA;EACV,MAAA;EACE,MAAA;AAC/B;AAEA,SAAgB,kBAAkB,QAAkC;CAClE,IAAI,OAAO,WAAW,GAAG,OAAO,CAAC;CACjC,MAAM,SAAuB,CAAC;CAC9B,IAAI,IAAI;CAER,OAAO,IAAI,OAAO,QAAQ;EACxB,MAAM,SAAS,OAAO;EACtB,IAAI;EAEJ,IAAI,WAAA,MAAkC,IAAI,KAAK,OAAO,QAEpD,OAAO,KADS,OAAO,IAAI,KAAO,OAAO,IAAI,MAAO;OAGpD,OAAO,iBAAiB;EAG1B,IAAI,QAAQ,QAAQ,IAAI,OAAO,OAAO,QAAQ;GAC5C,OAAO,KAAK,OAAO,SAAS,CAAC,CAAC;GAC9B;EACF;EAEA,OAAO,KAAK,OAAO,SAAS,GAAG,IAAI,IAAI,CAAC;EACxC,KAAK;CACP;CAEA,OAAO;AACT;;;;;;AC3BA,SAAS,YAAY,MAA4C;CAC/D,MAAM,IAAI,IAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;CACpE,IAAI,IAAI;CACR,MAAM,eAAe,EAAE,SAAS,GAAG;CACnC,MAAM,aAAa,EAAE,SAAS,GAAG;CACjC,MAAM,mBAAmB,EAAE,UAAU,GAAG,IAAI;CAC5C,KAAK;CACL,MAAM,QAAQ,EAAE,SAAS,GAAG,IAAI;CAChC,KAAK;CACL,MAAM,QAAQ,EAAE,QAAQ,GAAG;CAC3B,MAAM,WAAW,EAAE,SAAS,GAAG,IAAI;CACnC,KAAK;CAEL,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,SARc,EAAE,QAAQ,CAQxB;CACF;AACF;AAEA,SAAS,YAAY,MAAkD;CACrE,MAAM,IAAI,IAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;CACpE,IAAI,IAAI;CACR,MAAM,QAAQ,EAAE,QAAQ,GAAG;CAC3B,MAAM,aAAa,EAAE,SAAS,GAAG;CACjC,MAAM,SAAS,EAAE,UAAU,GAAG,IAAI;CAClC,KAAK;CACL,MAAM,WAAW,EAAE,UAAU,GAAG,IAAI;CACpC,KAAK;CACL,MAAM,UAAU,EAAE,UAAU,GAAG,IAAI;CACnC,KAAK;CACL,MAAM,MAAM,EAAE,UAAU,GAAG,IAAI;CAC/B,KAAK;CAGL,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,YATiB,EAAE,SAAS,GAS5B;EACA,OATY,EAAE,SAAS,CASvB;CACF;AACF;AAEA,SAAS,iBAAiB,MAAiD;CACzE,MAAM,IAAI,IAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;CACpE,OAAO;EACL,aAAa,EAAE,QAAQ,CAAC;EACxB,cAAc,EAAE,QAAQ,CAAC;EACzB,WAAW,EAAE,SAAS,GAAG,IAAI;EAC7B,YAAY,EAAE,SAAS,GAAG,IAAI;CAChC;AACF;AAEA,SAAS,UAAU,MAA0C;CAC3D,MAAM,IAAI,IAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;CACpE,IAAI,IAAI;CACR,MAAM,cAAc,EAAE,SAAS,GAAG;CAClC,MAAM,UAAU,EAAE,SAAS,GAAG;CAC9B,MAAM,MAAM,EAAE,SAAS,GAAG,IAAI;CAC9B,KAAK;CACL,MAAM,QAAQ,EAAE,SAAS,GAAG,IAAI;CAChC,KAAK;CACL,MAAM,OAAO,EAAE,SAAS,GAAG,IAAI;CAC/B,KAAK;CACL,MAAM,iBAAiB,EAAE,SAAS,GAAG,IAAI;CACzC,KAAK;CACL,MAAM,iBAAiB,EAAE,SAAS,GAAG,IAAI;CACzC,KAAK;CACL,MAAM,iBAAiB,EAAE,SAAS,GAAG,IAAI;CACzC,KAAK;CACL,MAAM,aAAa,EAAE,SAAS,GAAG,IAAI;CACrC,KAAK;CACL,MAAM,aAAa,EAAE,SAAS,GAAG,IAAI;CACrC,KAAK;CAEL,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YAZiB,EAAE,SAAS,GAAG,IAY/B;CACF;AACF;;AAGA,SAAgB,yBACd,SAC2B;CAC3B,IAAI;CACJ,IAAI,QAAQ,UAAU,KAAK,QAAQ,OAAA,IAA4B;EAC7D,IAAI,QAAQ,SAAS,GAAG,OAAO,EAAE,QAAQ,CAAC,EAAE;EAC5C,MAAM,MAAM,IAAI,SACd,QAAQ,QACR,QAAQ,aAAa,GACrB,CACF,CAAC,CAAC,UAAU,GAAG,IAAI;EACnB,aAAa,QAAQ,SAAS,GAAG,IAAI,GAAG;CAC1C,OACE,aAAa;CAGf,MAAM,MAAiC,EAAE,QAAQ,CAAC,EAAE;CACpD,IAAI,SAAS;CACb,OAAO,SAAS,WAAW,QAAQ;EACjC,MAAM,OAAO,WAAW;EACxB,UAAU;EACV,MAAM,OAAO,0BAA0B;EACvC,IAAI,QAAQ,QAAQ,SAAS,OAAO,WAAW,QAAQ;EACvD,MAAM,OAAO,WAAW,SAAS,QAAQ,SAAS,IAAI;EACtD,UAAU;EAEV,QAAQ,MAAR;GACE,KAAA;IACE,IAAI,OAAO,KAAK,YAAY,IAAI,CAAC;IACjC;GACF,KAAA,IAAgC;IAC9B,MAAM,IAAI,YAAY,IAAI;IAC1B,EAAE,QAAQ,mBAAmB,EAAE,KAAK;IACpC,IAAI,QAAQ;IACZ;GACF;GACA,KAAA;IACE,IAAI,aAAa,iBAAiB,IAAI;IACtC;GACF,KAAA;IACE,IAAI,MAAM,UAAU,IAAI;IACxB;GACF,KAAA;IACE,IAAI,aAAa,KAAK;IACtB;GACF,KAAA,GAAwB;IACtB,MAAM,IAAI,IAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;IACpE,IAAI,OAAO;KACT,OAAO,mBAAmB,EAAE,QAAQ,CAAC,CAAC;KACtC,QAAQ,EAAE,UAAU,GAAG,IAAI;IAC7B;IACA;GACF;GACA,KAAA,GACE,IAAI,cAAc,KAAK;EAM3B;CACF;CACA,OAAO;AACT;;AAGA,SAAgB,wBACd,SAC4B;CAC5B,OAAO,yBAAyB,OAAO,CAAC,CAAC;AAC3C;;;;;;;AC9LA,SAAS,GAAG,GAAmB;CAC7B,OAAO,IAAI;AACb;AACA,SAAS,GAAG,GAAmB;CAC7B,OAAQ,KAAK,MAAO;AACtB;AACA,SAAS,UAAU,OAA2B;CAC5C,MAAM,oBAAI,IAAI,YAAY,CAAC;CAC3B,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,OAAO,IAAI;CACvC,OAAO,IAAI,WAAW,CAAC;AACzB;AACA,SAAS,UAAU,OAA2B;CAC5C,MAAM,oBAAI,IAAI,YAAY,CAAC;CAC3B,IAAI,SAAS,CAAC,CAAC,CAAC,UAAU,GAAG,OAAO,IAAI;CACxC,OAAO,IAAI,WAAW,CAAC;AACzB;AACA,SAAS,UAAU,OAA2B;CAC5C,MAAM,oBAAI,IAAI,YAAY,CAAC;CAC3B,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,OAAO,IAAI;CACvC,OAAO,IAAI,WAAW,CAAC;AACzB;AACA,SAAS,UAAU,OAA2B;CAC5C,MAAM,oBAAI,IAAI,YAAY,CAAC;CAC3B,IAAI,SAAS,CAAC,CAAC,CAAC,UAAU,GAAG,OAAO,IAAI;CACxC,OAAO,IAAI,WAAW,CAAC;AACzB;AACA,SAAS,OAAO,GAAG,OAAiC;CAClD,MAAM,QAAQ,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;CACpD,MAAM,MAAM,IAAI,WAAW,KAAK;CAChC,IAAI,IAAI;CACR,KAAK,MAAM,KAAK,OAAO;EACrB,IAAI,IAAI,GAAG,CAAC;EACZ,KAAK,EAAE;CACT;CACA,OAAO;AACT;AACA,SAAS,QAAQ,OAAwB;CACvC,OAAO,oBAAoB,UAAA,QAAA,UAAA,KAAA,IAAA,QAAS,CAAC,KAAA;AACvC;AAEA,SAAgB,oBAAgC;CAC9C,OAAO,IAAI,WAAW,CAAA,CAAa,CAAC;AACtC;AACA,SAAgB,kBAAkB,QAA4B;CAC5D,OAAO,IAAI,WAAW,CAAA,IAA4B,GAAG,MAAM,CAAC,CAAC;AAC/D;AACA,SAAgB,gCAAgC,SAA6B;CAC3E,OAAO,OAAO,IAAI,WAAW,CAAA,EAA4B,CAAC,GAAG,UAAU,OAAO,CAAC;AACjF;AACA,SAAgB,iBACd,OACA,UAAU,GACV,YAAY,KACA;CAEZ,MAAM,UAAU,mBAAmB,KAAK;CACxC,MAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,SAAS,CAAC,CAAC;CACzE,OAAO,IAAI,WAAW;;EAEpB,GAAG,OAAO;EACV,GAAG,OAAO;EACV,GAAG,gBAAgB;CACrB,CAAC;AACH;AACA,SAAgB,WACd,UAAU,GACV,YAAY,KACZ,QAAQ,GACI;CAEZ,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC;CACpE,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC;CAC5D,OAAO,OACL,IAAI,WAAW,CAAA,KAAoB,GAAG,OAAO,CAAC,CAAC,GAC/C,UAAU,EAAE,GACZ,IAAI,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC,CAClC;AACF;AACA,SAAgB,iBAA6B;CAC3C,OAAO,IAAI,WAAW,CAAA,GAAmB,CAAC;AAC5C;AAEA,SAAgB,oBAAoB,OAAe,OAA4B;CAC7E,OAAO,IAAI,WAAW;;EAA0B,GAAG,QAAQ,KAAK,CAAC;EAAG,GAAG,KAAK;CAAC,CAAC;AAChF;AACA,SAAgB,eAAe,YAAY,GAAG,OAA4B;CACxE,OAAO,IAAI,WAAW;;EAAoB,GAAG,QAAQ,KAAK,CAAC;EAAG,GAAG,SAAS;CAAC,CAAC;AAC9E;AACA,SAAgB,gBAAgB,OAA4B;CAC1D,OAAO,IAAI,WAAW,CAAA,KAAqB,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC;AAChE;AACA,SAAgB,yBACd,SACA,YAAY,GACZ,OACY;CACZ,OAAO,OACL,IAAI,WAAW,CAAA,KAAgC,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,GAClE,UAAU,OAAO,GACjB,IAAI,WAAW,CAAC,GAAG,SAAS,CAAC,CAAC,CAChC;AACF;AACA,SAAgB,sBACd,QACA,YAAY,GACZ,OACY;CACZ,OAAO,OACL,IAAI,WAAW,CAAA,KAA6B,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,GAC/D,UAAU,MAAM,GAChB,IAAI,WAAW,CAAC,GAAG,SAAS,CAAC,CAAC,CAChC;AACF;AACA,SAAgB,iCACd,WAAW,GACX,OACY;CACZ,OAAO,OACL,IAAI,WAAW,CAAA,KAAwC,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,GAC1E,UAAU,QAAQ,CACpB;AACF;AACA,SAAgB,iCACd,UACA,OACY;CACZ,OAAO,OACL,IAAI,WAAW,CAAA,KAAyC,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,GAC3E,UAAU,QAAQ,CACpB;AACF;AACA,SAAgB,iCACd,UACA,YAAY,GACZ,OACY;CACZ,OAAO,OACL,IAAI,WAAW,CAAA,KAAyC,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,GAC3E,UAAU,QAAQ,GAClB,IAAI,WAAW,CAAC,GAAG,SAAS,CAAC,CAAC,CAChC;AACF;AACA,SAAgB,wBAAwB,WAAmB,OAA4B;CACrF,OAAO,OACL,IAAI,WAAW,CAAA,KAA+B,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,GACjE,UAAU,MAAM,SAAS,CAC3B;AACF;AACA,SAAgB,uBAAuB,UAAkB,OAA4B;CACnF,OAAO,IAAI,WAAW;;EAA8B,GAAG,QAAQ,KAAK,CAAC;EAAG,GAAG,QAAQ;CAAC,CAAC;AACvF;AACA,SAAgB,2BACd,cACA,cACA,OACY;CACZ,OAAO,IAAI,WAAW;;EAEpB,GAAG,QAAQ,KAAK,CAAC;EACjB,GAAG,YAAY;EACf,GAAG,YAAY;CACjB,CAAC;AACH;AAEA,SAAgB,uBAAuB,OAA2B;CAChE,OAAO,IAAI,WAAW,CAAA,KAA6B,GAAG,KAAK,CAAC,CAAC;AAC/D;AACA,SAAgB,mBAAmB,YAAY,GAAe;CAC5D,OAAO,IAAI,WAAW,CAAA,KAAwB,GAAG,SAAS,CAAC,CAAC;AAC9D;AACA,SAAgB,0BAA0B,QAAgB,YAAY,GAAe;CACnF,OAAO,OACL,IAAI,WAAW,CAAA,GAA+B,CAAC,GAC/C,UAAU,MAAM,GAChB,IAAI,WAAW,CAAC,GAAG,SAAS,CAAC,CAAC,CAChC;AACF;AACA,SAAgB,6BAA6B,SAAiB,YAAY,GAAe;CACvF,OAAO,OACL,IAAI,WAAW,CAAA,GAAkC,CAAC,GAClD,UAAU,OAAO,GACjB,IAAI,WAAW,CAAC,GAAG,SAAS,CAAC,CAAC,CAChC;AACF;AACA,SAAgB,uBAAuB,WAAmB,YAAgC;CACxF,OAAO,IAAI,WAAW;;EAA6B,GAAG,SAAS;EAAG,GAAG,UAAU;CAAC,CAAC;AACnF;AACA,SAAgB,iCACd,SACA,YAAY,IACZ,aAAa,IACD;CACZ,OAAO,OACL,IAAI,WAAW,CAAA,GAAuC,CAAC,GACvD,UAAU,OAAO,GACjB,IAAI,WAAW,CAAC,GAAG,SAAS,GAAG,GAAG,UAAU,CAAC,CAAC,CAChD;AACF;AACA,SAAgB,6BAA6B,SAAiB,YAAY,GAAe;CACvF,OAAO,OACL,IAAI,WAAW,CAAA,GAAkC,CAAC,GAClD,UAAU,OAAO,GACjB,IAAI,WAAW,CAAC,GAAG,SAAS,CAAC,CAAC,CAChC;AACF;AACA,SAAgB,qBAAiC;CAC/C,OAAO,IAAI,WAAW,CAAA,GAAsB,CAAC;AAC/C;AACA,SAAgB,0BAA0B,UAA8B;CACtE,OAAO,IAAI,WAAW,CAAA,KAAiC,GAAG,QAAQ,CAAC,CAAC;AACtE;AACA,SAAgB,8BACd,cACA,cACY;CACZ,OAAO,IAAI,WAAW;;EAEpB,GAAG,YAAY;EACf,GAAG,YAAY;CACjB,CAAC;AACH;AACA,SAAgB,8BAA8B,UAA8B;CAC1E,OAAO,IAAI,WAAW,CAAA,KAAqC,GAAG,QAAQ,CAAC,CAAC;AAC1E;AACA,SAAgB,oBAAoB,SAA6B;CAC/D,OAAO,IAAI,WAAW,CAAA,KAA2B,GAAG,OAAO,CAAC,CAAC;AAC/D;AACA,SAAgB,sBAAsB,QAAQ,GAAe;CAC3D,OAAO,OAAO,IAAI,WAAW,CAAA,GAA2B,CAAC,GAAG,UAAU,KAAK,CAAC;AAC9E;AAEA,SAAS,eACP,OACA,OACA,SACY;CACZ,IAAI,UAAU,KAAA,KAAa,UAAA,IAAqB,OAAO;CACvD,OAAO,OAAO,oBAAoB,OAAO,KAAK,GAAG,OAAO;AAC1D;AACA,SAAS,kBAAkB,OAA2B,SAAiC;CACrF,IAAI,UAAU,KAAA,KAAa,UAAA,IAAqB,OAAO;CACvD,OAAO,OAAO,uBAAuB,KAAK,GAAG,OAAO;AACtD;AAgBA,SAAgB,mBAAmB,SAAmC;CACpE,MAAM,OACJ,QAAQ,UAAU,KAAK,QAAQ,OAAA,IAC3B,QAAQ,SAAS,CAAC,IAClB;CACN,IAAI,KAAK,SAAS,IAChB,MAAM,IAAI,MACR,gCAAgC,QAAQ,OAAO,sBACjD;CAEF,MAAM,OAAO,IAAI,SAAS,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;CACvE,IAAI,IAAI;CACR,MAAM,WAAW,KAAK,SAAS,GAAG;CAClC,MAAM,WAAW,KAAK,SAAS,GAAG;CAClC,MAAM,WAAW,KAAK,UAAU,GAAG,IAAI;CACvC,KAAK;CACL,MAAM,gBAAgB,KAAK,SAAS,GAAG;CACvC,MAAM,gBAAgB,KAAK,SAAS,GAAG;CACvC,MAAM,gBAAgB,KAAK,UAAU,GAAG,IAAI;CAC5C,KAAK;CACL,MAAM,kBAAkB,KAAK,SAAS,GAAG;CACzC,MAAM,kBAAkB,KAAK,SAAS,GAAG;CACzC,MAAM,kBAAkB,KAAK,UAAU,GAAG,IAAI;CAC9C,KAAK;CACL,MAAM,gBAAgB,KAAK,UAAU,GAAG,IAAI;CAC5C,KAAK;CAEL,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,oBAZyB,KAAK,UAAU,GAAG,IAY3C;CACF;AACF;AAEA,SAAgB,iBACd,QACA,OAAgC,CAAC,GACrB;;CACZ,MAAM,QAAQ,QAAA,cAAO,KAAK,WAAA,QAAA,gBAAA,KAAA,IAAA,cAAS,CAAC;CACpC,MAAM,YAAY,QAAA,kBAAO,KAAK,eAAA,QAAA,oBAAA,KAAA,IAAA,kBAAa,CAAC;CAC5C,MAAM,QAAQ,KAAK,UAAU,KAAA,IAAY,OAAO,KAAK,KAAK,IAAA;CAE1D,QAAQ,QAAR;EACE,KAAK,gBACH,OAAO,kBAAkB;EAC3B,KAAK;;GACH,OAAO,kBAAkB,QAAA,eAAO,KAAK,YAAA,QAAA,iBAAA,KAAA,IAAA,eAAU,CAAC,CAAC;EACnD,KAAK;;GACH,OAAO,gCAAgC,QAAA,iBAAO,KAAK,cAAA,QAAA,mBAAA,KAAA,IAAA,iBAAY,GAAG,CAAC;EACrE,KAAK;;GACH,OAAO,iBACL,QAAA,cAAO,KAAK,WAAA,QAAA,gBAAA,KAAA,IAAA,cAAS,CAAC,GACtB,QAAA,gBAAO,KAAK,aAAA,QAAA,kBAAA,KAAA,IAAA,gBAAW,CAAC,GACxB,QAAA,kBAAO,KAAK,eAAA,QAAA,oBAAA,KAAA,IAAA,kBAAa,GAAG,CAC9B;EACF,KAAK;;GACH,OAAO,WACL,QAAA,iBAAO,KAAK,aAAA,QAAA,mBAAA,KAAA,IAAA,iBAAW,CAAC,GACxB,QAAA,kBAAO,KAAK,eAAA,QAAA,oBAAA,KAAA,IAAA,kBAAa,GAAG,GAC5B,QAAA,cAAO,KAAK,WAAA,QAAA,gBAAA,KAAA,IAAA,cAAS,CAAC,CACxB;EACF,KAAK,aACH,OAAO,eAAe;EACxB,KAAK;;GACH,OAAO,oBAAoB,QAAA,cAAO,KAAK,WAAA,QAAA,gBAAA,KAAA,IAAA,cAAS,CAAC,GAAG,KAAK;EAC3D,KAAK,aACH,OAAO,eAAe,OAAO,OAAO,eAAe,WAAW,KAAK,CAAC;EACtE,KAAK,cACH,OAAO,gBAAgB,KAAK;EAC9B,KAAK;;GACH,OAAO,eACL,OACA,OACA,yBAAyB,QAAA,gBAAO,KAAK,aAAA,QAAA,kBAAA,KAAA,IAAA,gBAAW,CAAC,GAAG,WAAW,KAAK,CACtE;EACF,KAAK;;GACH,OAAO,eACL,OACA,OACA,sBAAsB,QAAA,gBAAO,KAAK,aAAA,QAAA,kBAAA,KAAA,IAAA,gBAAW,CAAC,GAAG,WAAW,KAAK,CACnE;EACF,KAAK;;GACH,OAAO,iCAAiC,QAAA,iBAAO,KAAK,cAAA,QAAA,mBAAA,KAAA,IAAA,iBAAY,CAAC,GAAG,KAAK;EAC3E,KAAK;;GACH,OAAO,eACL,OACA,OACA,iCAAiC,QAAA,kBAAO,KAAK,cAAA,QAAA,oBAAA,KAAA,IAAA,kBAAY,CAAC,GAAG,KAAK,CACpE;EACF,KAAK;;GACH,OAAO,eACL,OACA,OACA,iCAAiC,QAAA,kBAAO,KAAK,cAAA,QAAA,oBAAA,KAAA,IAAA,kBAAY,CAAC,GAAG,aAAa,GAAG,KAAK,CACpF;EACF,KAAK;;GACH,OAAO,wBAAwB,QAAA,mBAAO,KAAK,gBAAA,QAAA,qBAAA,KAAA,IAAA,mBAAc,CAAC,GAAG,KAAK;EACpE,KAAK;;GACH,OAAO,uBAAuB,QAAA,kBAAO,KAAK,eAAA,QAAA,oBAAA,KAAA,IAAA,kBAAa,CAAC,GAAG,KAAK;EAClE,KAAK;;GACH,OAAO,2BACL,QAAA,qBAAO,KAAK,kBAAA,QAAA,uBAAA,KAAA,IAAA,qBAAgB,CAAC,GAC7B,QAAA,qBAAO,KAAK,kBAAA,QAAA,uBAAA,KAAA,IAAA,qBAAgB,CAAC,GAC7B,KACF;EACF,KAAK;;GACH,OAAO,uBAAuB,QAAA,eAAO,KAAK,WAAA,QAAA,iBAAA,KAAA,IAAA,eAAS,CAAC,CAAC;EACvD,KAAK,iBACH,OAAO,kBAAkB,OAAO,mBAAmB,SAAS,CAAC;EAC/D,KAAK;;GACH,OAAO,kBACL,OACA,0BAA0B,QAAA,iBAAO,KAAK,aAAA,QAAA,mBAAA,KAAA,IAAA,iBAAW,CAAC,GAAG,SAAS,CAChE;EACF,KAAK;;GACH,OAAO,kBACL,OACA,6BAA6B,QAAA,iBAAO,KAAK,aAAA,QAAA,mBAAA,KAAA,IAAA,iBAAW,CAAC,GAAG,SAAS,CACnE;EACF,KAAK;;GACH,OAAO,uBACL,QAAA,mBAAO,KAAK,gBAAA,QAAA,qBAAA,KAAA,IAAA,mBAAc,CAAC,GAC3B,QAAA,oBAAO,KAAK,iBAAA,QAAA,sBAAA,KAAA,IAAA,oBAAe,CAAC,CAC9B;EACF,KAAK;;GACH,OAAO,iCACL,QAAA,iBAAO,KAAK,aAAA,QAAA,mBAAA,KAAA,IAAA,iBAAW,CAAC,GACxB,QAAA,oBAAO,KAAK,gBAAA,QAAA,sBAAA,KAAA,IAAA,oBAAc,EAAE,GAC5B,QAAA,qBAAO,KAAK,iBAAA,QAAA,uBAAA,KAAA,IAAA,qBAAe,EAAE,CAC/B;EACF,KAAK;;GACH,OAAO,kBACL,OACA,6BAA6B,QAAA,iBAAO,KAAK,aAAA,QAAA,mBAAA,KAAA,IAAA,iBAAW,CAAC,GAAG,aAAa,CAAC,CACxE;EACF,KAAK,iBACH,OAAO,mBAAmB;EAC5B,KAAK;;GACH,OAAO,0BAA0B,QAAA,mBAAO,KAAK,eAAA,QAAA,qBAAA,KAAA,IAAA,mBAAa,CAAC,CAAC;EAC9D,KAAK;;GACH,OAAO,8BACL,QAAA,sBAAO,KAAK,kBAAA,QAAA,wBAAA,KAAA,IAAA,sBAAgB,CAAC,GAC7B,QAAA,sBAAO,KAAK,kBAAA,QAAA,wBAAA,KAAA,IAAA,sBAAgB,CAAC,CAC/B;EACF,KAAK;;GACH,OAAO,8BAA8B,QAAA,iBAAO,KAAK,cAAA,QAAA,mBAAA,KAAA,IAAA,iBAAY,CAAC,CAAC;EACjE,KAAK;;GACH,OAAO,oBAAoB,QAAA,iBAAO,KAAK,cAAA,QAAA,mBAAA,KAAA,IAAA,iBAAY,CAAC,CAAC;EACvD,KAAK;;GACH,OAAO,sBAAsB,QAAA,cAAO,KAAK,WAAA,QAAA,gBAAA,KAAA,IAAA,cAAS,CAAC,CAAC;EACtD,SACE,MAAM,IAAI,MAAM,iCAAiC,OAAO,EAAE;CAC9D;AACF;;;;ACzYA,SAAgB,kBACd,QACA,OAAgC,CAAC,GACrB;CACZ,MAAM,OAAO,KAAK,UAAU;EAAE;EAAQ;EAAM,GAAG,KAAK,IAAI;CAAE,CAAC;CAC3D,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI;AACtC;AAEA,SAAgB,kBAAkB,SAGhC;;CACA,MAAM,SAAS,KAAK,MAAM,IAAI,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC;CAI3D,OAAO;EAAE,QAAQ,OAAO;EAAQ,OAAA,eAAM,OAAO,UAAA,QAAA,iBAAA,KAAA,IAAA,eAAQ,CAAC;CAAE;AAC1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxEA,IAAM,iBAAkC;CACtC;EACE,IAAI;EACJ,MAAM;EACN,MAAM;EACN,WAAW;EACX,YAAY;CACd;CACA;EACE,IAAI;EACJ,MAAM;EACN,MAAM;EACN,WAAW;EACX,YAAY;CACd;CACA;EACE,IAAI;EACJ,MAAM;EACN,MAAM;EACN,WAAW;EACX,YAAY;CACd;CACA;EACE,IAAI;EACJ,MAAM;EACN,MAAM;EACN,WAAW;EACX,YAAY;CACd;AACF;AAEA,SAAS,eAAe,QAAuB,SAAmC;CAChF,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,QAAQ,cAAc,OAAO,SAAS,QAAQ,YAAY,OAAO;CACrE,IAAI,QAAQ,aAAa,QAAQ,OAAO,cAAc,QAAQ,WAAW,OAAO;CAChF,IAAI,QAAQ,cAAc,OAAO,eAAe,QAAQ,YAAY,OAAO;CAC3E,OAAO;AACT;;;;;AAMA,IAAa,gBAAb,MAAgD;CAkB9C,YAAY,UAAgC,CAAC,GAAG;;EAjBhD,gBAAA,MAAA,QAAgB,MAAA;EAEhB,gBAAA,MAAA,eAAA,KAAA,CAAA;EACA,gBAAA,MAAA,WAAA,KAAA,CAAA;EACA,gBAAA,MAAA,WAAA,KAAA,CAAA;EACA,gBAAA,MAAA,0BAA0B,IAAI,IAAiC,CAAA;EAC/D,gBAAA,MAAA,uBAAA,KAAA,CAAA;;;;GAGA;GAAiB;IACf,UAAU;IACV,OAAO;IACP,OAAO;IACP,aAAa;IACb,cAAc;GAChB;;EAGE,KAAK,eAAA,uBAAc,QAAQ,iBAAA,QAAA,yBAAA,KAAA,IAAA,uBAAe;EAC1C,KAAK,WAAA,mBAAU,QAAQ,aAAA,QAAA,qBAAA,KAAA,IAAA,mBAAW;EAClC,KAAK,WAAA,mBAAU,QAAQ,aAAA,QAAA,qBAAA,KAAA,IAAA,mBAAW,CAAC,GAAG,cAAc;CACtD;CAEA,MAAM,KACJ,MACA,SACA,aAAa,KACa;EAC1B,OAAO,KAAK,QAAQ,QACjB,MAAM,EAAE,SAAS,QAAQ,eAAe,GAAG,OAAO,CACrD;CACF;CAEA,MAAM,QACJ,MACA,SACA,UAI8B;EAC9B,KAAK,sBAAA,aAAA,QAAA,aAAA,KAAA,IAAA,KAAA,IAAsB,SAAU;EAErC,MAAM,SAAS,MAAM,KAAK,KAAK,MAAM,OAAO,EAAA,CAAG;EAC/C,IAAI,CAAC,SAAS,CAAC,KAAK,aAClB,MAAM,IAAI,MAAM,qBAAqB,KAAK,kBAAkB;EAG9D,MAAM,SAAwB,UAAA,QAAA,UAAA,KAAA,IAAA,QAAS;GACrC,IAAI,QAAQ,KAAK;GACjB,MAAM,QAAQ;GACd;GACA,WAAA,YAAA,QAAA,YAAA,KAAA,IAAA,KAAA,IAAW,QAAS;GACpB,YAAA,YAAA,QAAA,YAAA,KAAA,IAAA,KAAA,IAAY,QAAS;EACvB;EAEA,MAAM,aAAkC;GACtC,UAAU,OAAO;GACjB,MAAM,OAAO;EACf;EACA,KAAK,OAAO,IAAI,OAAO,IAAI,UAAU;EACrC,KAAK,IAAI,aAAa,OAAO,KAAK,IAAI,OAAO,GAAG,EAAE;EAClD,OAAO;CACT;CAEA,MAAM,KAAK,YAAiC,SAAoC;EAC9E,IAAI,CAAC,KAAK,OAAO,IAAI,WAAW,QAAQ,GACtC,MAAM,IAAI,MAAM,iCAAiC,WAAW,SAAS,EAAE;EAGzE,MAAM,EAAE,QAAQ,SAAS,kBAAkB,OAAO;EAClD,KAAK,IAAI,QAAQ,UAAU,IAAI;EAC/B,KAAK,aAAa,QAAQ,IAAI;EAG9B,IAAI,OAAO,WAAW,QAAQ,KAAK,OAAO,WAAW,WAAW,GAAG;;GACjE,MAAM,OAAO,IAAI,YAAY,CAAC,CAAC,OAC7B,KAAK,UAAU;IACb,MAAM;IACN,UAAU,KAAK,MAAM;IACrB,OAAO,KAAK,MAAM;GACpB,CAAC,CACH;GACA,CAAA,wBAAA,KAAK,yBAAA,QAAA,0BAAA,KAAA,KAAA,sBAAA,KAAA,MAAsB,IAAI;EACjC;CACF;CAEA,MAAM,WAAW,YAAgD;EAC/D,KAAK,OAAO,OAAO,WAAW,QAAQ;EACtC,KAAK,IAAI,gBAAgB,WAAW,UAAU;CAChD;CAEA,MAAM,cAA6B;EACjC,KAAK,OAAO,MAAM;EAClB,KAAK,IAAI,aAAa;CACxB;CAEA,aAAqB,QAAgB,MAAqC;EACxE,QAAQ,QAAR;GACE,KAAK;GACL,KAAK;;IACH,KAAK,MAAM,QAAQ,QAAA,cAAO,KAAK,WAAA,QAAA,gBAAA,KAAA,IAAA,cAAS,CAAC;IACzC;GACF,KAAK;;IACH,KAAK,MAAM,YAAY,QAAA,gBAAO,KAAK,aAAA,QAAA,kBAAA,KAAA,IAAA,gBAAW,CAAC;IAC/C,KAAK,MAAM,QAAQ,QAAA,eAAO,KAAK,WAAA,QAAA,iBAAA,KAAA,IAAA,eAAS,KAAK,MAAM,KAAK;IACxD;GACF,KAAK;;IACH,KAAK,MAAM,QAAQ,QAAA,eAAO,KAAK,WAAA,QAAA,iBAAA,KAAA,IAAA,eAAS,KAAK,MAAM,KAAK;IACxD;GACF,KAAK;;IACH,KAAK,MAAM,WAAW,QAAA,iBAAO,KAAK,cAAA,QAAA,mBAAA,KAAA,IAAA,iBAAY,CAAC;IAC/C;GACF,KAAK;GACL,KAAK;;IACH,KAAK,MAAM,WAAW,QAAA,kBAAO,KAAK,cAAA,QAAA,oBAAA,KAAA,IAAA,kBAAY,CAAC;IAC/C;GACF,KAAK;GACL,KAAK;IACH,KAAK,MAAM,QAAQ;IACnB;GACF,KAAK;;IACH,KAAK,MAAM,SACR,QAAA,mBAAO,KAAK,gBAAA,QAAA,qBAAA,KAAA,IAAA,mBAAc,CAAC,IAAI,QAAA,oBAAO,KAAK,iBAAA,QAAA,sBAAA,KAAA,IAAA,oBAAe,CAAC,KAAK;EAIvE;CACF;CAEA,IAAY,SAAiB,OAAuB;EAClD,IAAI,CAAC,KAAK,SAAS;EACnB,IAAI,UAAU,KAAA,GACZ,QAAQ,IAAI,mBAAmB,WAAW,KAAK;OAE/C,QAAQ,IAAI,mBAAmB,SAAS;CAE5C;AACF;;;;;;;;;AC1GA,IAAa,wBAAb,MAAa,sBAA2C;CAiBtD,YAAY,UAAwC,CAAC,GAAG;;EAhBxD,gBAAA,MAAA,QAAgB,eAAA;EAEhB,gBAAA,MAAA,uBAAA,KAAA,CAAA;EACA,gBAAA,MAAA,kBAAA,KAAA,CAAA;EACA,gBAAA,MAAA,oBAAA,KAAA,CAAA;EACA,gBAAA,MAAA,wBAAwB,IAAI,IAA4B,CAAA;;;;GAExD;mBAA2B,IAAI,IAO7B;;EAGA,KAAK,uBAAA,wBAAsB,QAAQ,yBAAA,QAAA,0BAAA,KAAA,IAAA,wBAAuB;EAC1D,KAAK,kBAAA,wBAAiB,QAAQ,oBAAA,QAAA,0BAAA,KAAA,IAAA,wBAAkB;EAChD,KAAK,oBAAA,wBAAmB,QAAQ,sBAAA,QAAA,0BAAA,KAAA,IAAA,wBAAoB;CACtD;CAEA,cAAc,QAAgB,OAAgC,CAAC,GAAe;EAC5E,OAAO,iBAAiB,QAAQ,IAAI;CACtC;CAEA,MAAM,KACJ,OACA,UACA,YAC0B;EAC1B,KAAK,cAAc;EAEnB,OAAO,CAAC;CACV;CAEA,MAAM,QACJ,MACA,UACA,UAI8B;EAC9B,KAAK,cAAc;EAInB,MAAM,SAAS,MAAMA,UAAI,UAAU,cAAc;GAC/C,SAAS,CAAC,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC;GACtC,kBAAkB,CAAC,YAAY;EACjC,CAAC;EAED,IAAI,CAAC,OAAO,MACV,MAAM,IAAI,MAAM,2CAA2C;EAG7D,MAAM,SAAS,MAAM,OAAO,KAAK,QAAQ;EACzC,MAAM,UAAU,MAAM,OAAO,kBAAkB,YAAY;EAC3D,MAAM,YAAY,MAAM,QAAQ,kBAAkB,UAAU;EAC5D,MAAM,aAAa,MAAM,QAAQ,kBAAkB,WAAW;EAE9D,MAAM,OAAuB;GAC3B,UAAU,OAAO;GACjB;GACA;GACA;GACA;GACA;GACA,gBAAA,aAAA,QAAA,aAAA,KAAA,IAAA,KAAA,IAAgB,SAAU;GAC1B,cAAA,aAAA,QAAA,aAAA,KAAA,IAAA,KAAA,IAAc,SAAU;EAC1B;EAEA,MAAM,2BAA2B;;GAC/B,KAAK,KAAK,OAAO,OAAO,EAAE;GAC1B,KAAK,iCAAiB,IAAI,MAAM,qBAAqB,CAAC;GACtD,aAAA,QAAA,aAAA,KAAA,MAAA,wBAAA,SAAU,kBAAA,QAAA,0BAAA,KAAA,KAAA,sBAAA,KAAA,QAAe;GACzB,QAAQ,IAAI,OAAO;GACnB,OAAO,oBAAoB,0BAA0B,kBAAkB;EACzE;EACA,OAAO,iBAAiB,0BAA0B,kBAAkB;EAGpE,MAAM,YAAY,UAAiB;GAEjC,MAAM,QADS,MAAM,OACA;GACrB,IAAI,CAAC,OAAO;GACZ,MAAM,MAAM,IAAI,WACd,MAAM,OAAO,MAAM,MAAM,YAAY,MAAM,aAAa,MAAM,UAAU,CAC1E;GAEA,KAAK,MAAM,WAAW,kBAAkB,GAAG,GAAG;;IAC5C,CAAA,uBAAA,KAAK,oBAAA,QAAA,yBAAA,KAAA,KAAA,qBAAA,KAAA,MAAiB,OAAO;IAC7B,KAAK,cAAc,QAAQ,IAAK,OAAO;GACzC;EACF;EACA,WAAW,iBAAiB,8BAA8B,QAAQ;EAClE,MAAM,WAAW,mBAAmB;EAEpC,KAAK,KAAK,IAAI,OAAO,IAAI,IAAI;EAG7B,MAAM,WAAW,KAAK,cAAA,GAA6B,GAAK;EACxD,MAAM,KAAK,SAAS,MAAM,kBAAkB,CAAC;EAE7C,MAAM,OAAO,mBAAmB,MADN,QACiB;EAC3C,KAAK,OAAO;EACZ,KAAK,gBAAgB,IAAI;EACzB,KAAK,kBAAkB,MAAM,IAAI;EAGjC,MAAM,YAAY,KAAK,cAAA,IAA4C,GAAK;EACxE,MAAM,KAAK,SAAS,MAAM,gCAAgC,GAAG,CAAC;EAC9D,MAAM;EAEN,OAAO;CACT;CAEA,MAAM,KAAK,YAAiC,SAAoC;EAC9E,MAAM,OAAO,KAAK,YAAY,WAAW,QAAQ;EACjD,MAAM,KAAK,SAAS,MAAM,OAAO;CACnC;CAEA,MAAM,cAAc,QAAgB,YAAY,KAAK,kBAAuC;EAC1F,OAAO,IAAI,SAAqB,SAAS,WAAW;;GAClD,MAAM,QAAQ;IACZ,UAAU,YAAwB;KAChC,aAAa,MAAM,KAAK;KACxB,QAAQ,OAAO;IACjB;IACA,SAAS,QAAe;KACtB,aAAa,MAAM,KAAK;KACxB,OAAO,GAAG;IACZ;IACA,OAAO,iBAAiB;KACtB,MAAM,IAAI,KAAK,QAAQ,IAAI,MAAM;KACjC,IAAI,GAAG;MACL,MAAM,MAAM,EAAE,QAAQ,KAAK;MAC3B,IAAI,OAAO,GAAG,EAAE,OAAO,KAAK,CAAC;MAC7B,IAAI,EAAE,WAAW,GAAG,KAAK,QAAQ,OAAO,MAAM;KAChD;KACA,uBAAO,IAAI,MAAM,8BAA8B,QAAQ,CAAC;IAC1D,GAAG,SAAS;GACd;GAEA,MAAM,KAAA,oBAAI,KAAK,QAAQ,IAAI,MAAM,OAAA,QAAA,sBAAA,KAAA,IAAA,oBAAK,CAAC;GACvC,EAAE,KAAK,KAAK;GACZ,KAAK,QAAQ,IAAI,QAAQ,CAAC;EAC5B,CAAC;CACH;CAEA,MAAM,WAAW,YAAgD;EAC/D,MAAM,OAAO,KAAK,KAAK,IAAI,WAAW,QAAQ;EAC9C,IAAI,CAAC,MAAM;EACX,IAAI;GACF,MAAM,KAAK,WAAW,kBAAkB,CAAC,CAAC,YAAY,KAAA,CAAS;EACjE,UAAU;;GACR,CAAA,oBAAA,KAAK,OAAO,UAAA,QAAA,sBAAA,KAAA,KAAA,kBAAM,WAAW;GAC7B,KAAK,KAAK,OAAO,WAAW,QAAQ;EACtC;CACF;CAEA,MAAM,cAA6B;EACjC,KAAK,MAAM,MAAM,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,GACnC,MAAM,KAAK,WAAW;GAAE,UAAU;GAAI,MAAM;EAAe,CAAC;EAE9D,KAAK,iCAAiB,IAAI,MAAM,aAAa,CAAC;CAChD;;CAGA,QAAQ,YAA2D;;EACjE,QAAA,iBAAO,KAAK,KAAK,IAAI,WAAW,QAAQ,OAAA,QAAA,mBAAA,KAAA,IAAA,KAAA,IAAA,eAAG;CAC7C;CAEA,OAAO,cAAuB;EAC5B,OACE,OAAO,cAAc,eACrB,OAAQ,UAAkD,cACxD;CAEN;CAEA,MAAc,SAAS,MAAsB,SAAoC;EAC/E,MAAM,EAAE,cAAc;EAEtB,MAAM,QAAQ,IAAI,WAAW,OAAO;EACpC,IAAI,UAAU,2BACZ,MAAM,UAAU,0BAA0B,KAAK;OAC1C,IAAI,UAAU,YACnB,MAAM,UAAU,WAAW,KAAK;OAEhC,MAAM,IAAI,MAAM,uDAAuD;CAE3E;CAEA,YAAoB,UAAkC;EACpD,MAAM,OAAO,KAAK,KAAK,IAAI,QAAQ;EACnC,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,yCAAyC,SAAS,EAAE;EAC/E,OAAO;CACT;CAEA,gBAAwB,MAA0B;EAChD,IAAI,KAAK,mBAAmB,UAAU;EAKtC,IAHE,KAAK,aAAa,YAAY,SAC9B,KAAK,aAAa,YAAY,SAC9B,KAAK,aAAa,YAAY,OACrB;EACX,MAAM,MACJ,gCAAgC,KAAK,SAAS,GAAG,KAAK,SAAS,GAAG,KAAK,SAAS,aACpE,YAAY,MAAM,GAAG,YAAY,MAAM,GAAG,YAAY,MAAM;EAE1E,IAAI,KAAK,mBAAmB,SAAS,MAAM,IAAI,MAAM,GAAG;EACxD,QAAQ,KAAK,2BAA2B,KAAK;CAC/C;CAEA,kBAA0B,MAAkB,MAA0B;EACpE,IAAI,CAAC,KAAK,qBAAqB;EAO/B,MAAM,OAAO;GALX,gBAAA;GACA,gBAAA;GACA,gBAAA;GACA,YAAA;EAEW,EAAS;EACtB,IAAI,KAAK,uBAAuB,MAC9B,MAAM,IAAI,MACR,YAAY,KAAK,uBAAuB,KAAK,SAAS,KAAK,oBAC7D;CAEJ;CAEA,cAAsB,QAAgB,SAA2B;EAC/D,MAAM,IAAI,KAAK,QAAQ,IAAI,MAAM;EACjC,IAAI,EAAA,MAAA,QAAA,MAAA,KAAA,IAAA,KAAA,IAAC,EAAG,SAAQ;EAChB,MAAM,SAAS,EAAE,MAAM;EACvB,IAAI,EAAE,WAAW,GAAG,KAAK,QAAQ,OAAO,MAAM;EAC9C,OAAO,QAAQ,OAAO;CACxB;CAEA,iBAAyB,KAAkB;EACzC,KAAK,MAAM,GAAG,MAAM,KAAK,SACvB,KAAK,MAAM,KAAK,GAAG,EAAE,OAAO,GAAG;EAEjC,KAAK,QAAQ,MAAM;CACrB;CAEA,gBAA8B;EAC5B,IAAI,CAAC,sBAAsB,YAAY,GACrC,MAAM,IAAI,MACR,mEACF;CAEJ;AACF;;;AC/UA,IAAI;AAEJ,SAAgB,oBAAoB,WAA4B;CAC9D,mBAAmB;AACrB;AAEA,SAAgB,sBAA6C;CAC3D,OAAO;AACT;AAEA,SAAS,aAAa,QAAkC;CACtD,MAAM,QAAQ,OAAO,QAAQ,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;CACrD,MAAM,MAAM,IAAI,WAAW,KAAK;CAChC,IAAI,IAAI;CACR,KAAK,MAAM,KAAK,QAAQ;EACtB,IAAI,IAAI,GAAG,CAAC;EACZ,KAAK,EAAE;CACT;CACA,OAAO;AACT;;;;AAKA,IAAsB,aAAtB,MAAiC;CAQ/B,IAAI,YAAqB;EACvB,OAAO,KAAK,eAAe;CAC7B;CAEA,IAAI,WAA0B;;EAC5B,QAAA,yBAAA,mBAAO,KAAK,gBAAA,QAAA,qBAAA,KAAA,IAAA,KAAA,IAAA,iBAAY,cAAA,QAAA,0BAAA,KAAA,IAAA,wBAAY;CACtC;CAEA,YAAY,UAAyB,CAAC,GAAG;;EAbzC,gBAAA,MAAA,aAAA,KAAA,CAAA;EACA,gBAAA,MAAA,cAAmD,IAAA;EACnD,gBAAA,MAAA,wBAAoE,IAAA;EACpE,gBAAA,MAAA,eAA2C,IAAA;EAWzC,MAAM,aAAA,qBAAY,QAAQ,eAAA,QAAA,uBAAA,KAAA,IAAA,qBAAa;EACvC,IAAI,CAAC,WACH,MAAM,IAAI,MACR,GAAG,KAAK,YAAY,KAAK,4DAC3B;EAEF,KAAK,YAAY;CACnB;CAEA,MAAM,QACJ,UAA0B,CAAC,GAC3B,UACe;EAEf,KAAK,aAAa,MAAM,KAAK,UAAU,QAAQ,KAAK,MAAM,SAAS;GACjE,iBAAiB,YAAY;;IAC3B,KAAK,kBAAkB,OAAO;IAC9B,CAAA,wBAAA,KAAK,0BAAA,QAAA,0BAAA,KAAA,KAAA,sBAAA,KAAA,MAAuB,OAAO;GACrC;GACA,oBAAoB;IAClB,KAAK,aAAa;IAClB,IAAI,YAAY,SAAS,gBAAgB,OAAO,SAAS,iBAAiB,YACxE,SAAS,aAAa;GAE1B;EACF,CAAC;EAED,MAAM,KAAK,wBAAA,GAA8C,EAAE,UAAU,MAAM,CAAC;CAC9E;CAEA,kBAA4B,UAA4B,CAAC;CAEzD,MAAM,aAA4B;EAChC,IAAI,CAAC,KAAK,YAAY;EACtB,MAAM,KAAK,UAAU,WAAW,KAAK,UAAU;EAC/C,KAAK,aAAa;CACpB;CAEA,wBAAwB,UAAmD;EACzE,KAAK,uBAAuB;CAC9B;CAEA,MAAM,OACJ,SACA,YAAY,KACqC;EACjD,OAAO,KAAK,UAAU,KAAK,KAAK,MAAM,SAAS,SAAS;CAC1D;;CAGA,MAAM,WACJ,OACA,UAAwE,CAAC,GAC1D;;EACf,MAAM,KAAK,YAAY,eAAe;GACpC;GACA,UAAA,mBAAS,QAAQ,aAAA,QAAA,qBAAA,KAAA,IAAA,mBAAW;GAC5B,YAAA,qBAAW,QAAQ,eAAA,QAAA,uBAAA,KAAA,IAAA,qBAAa;GAChC,WAAA,oBAAU,QAAQ,cAAA,QAAA,sBAAA,KAAA,IAAA,oBAAY;EAChC,CAAC;CACH;;CAGA,MAAM,KACJ,UAKI,CAAC,GACU;;EACf,MAAM,KAAK,YAAY,QAAQ;GAC7B,UAAA,oBAAS,QAAQ,aAAA,QAAA,sBAAA,KAAA,IAAA,oBAAW;GAC5B,YAAA,qBAAW,QAAQ,eAAA,QAAA,uBAAA,KAAA,IAAA,qBAAa;GAChC,QAAA,iBAAO,QAAQ,WAAA,QAAA,mBAAA,KAAA,IAAA,iBAAS;GACxB,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;CACH;;CAGA,MAAM,SAAS,UAAkC,CAAC,GAAkB;;EAClE,MAAM,KAAK,YAAY,aAAa,EAClC,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY,KAChC,CAAC;CACH;;CAGA,MAAM,wBACJ,QACA,UAAkC,CAAC,GACpB;;EACf,MAAM,KAAK,YAAY,6BAA6B;GAClD;GACA,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;CACH;;CAGA,MAAM,0BACJ,SACA,UAAkC,CAAC,GACpB;;EACf,MAAM,KAAK,YAAY,+BAA+B;GACpD,UAAU;GACV,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;CACH;;CAGA,aAAmB;EACjB,KAAK,cAAc,CAAC;CACtB;;CAGA,MAAM,SAAS,UAAkC,CAAC,GAAkB;EAClE,IAAI,CAAC,KAAK,aAAa;EACvB,IAAI,CAAC,KAAK,YAAY;GACpB,KAAK,cAAc;GACnB,MAAM,IAAI,MAAM,GAAG,KAAK,YAAY,KAAK,gBAAgB;EAC3D;EACA,MAAM,SAAS,KAAK;EACpB,KAAK,cAAc;EACnB,IAAI,OAAO,WAAW,GAAG;EACzB,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,aAAa,MAAM,CAAC;CAEjE;;CAGA,cAAsB;;EACpB,MAAM,KAAA,yBAAA,oBAAI,KAAK,iBAAA,QAAA,sBAAA,KAAA,IAAA,KAAA,IAAA,kBAAa,YAAA,QAAA,0BAAA,KAAA,IAAA,wBAAU;EACtC,KAAK,cAAc;EACnB,OAAO;CACT;CAEA,MAAgB,YACd,QACA,OAAgC,CAAC,GAClB;;EACf,IAAI,CAAC,KAAK,YACR,MAAM,IAAI,MAAM,GAAG,KAAK,YAAY,KAAK,gBAAgB;EAG3D,IAAI,KAAK,eAAe,OAAO,WAAW,WAAW,GACnD,MAAM,IAAI,MACR,kFACF;EAGF,MAAM,WAAW,KAAK,aAAa;EACnC,MAAM,SAAA,yBAAA,0BAAA,kBACJ,KAAK,UAAA,CAAU,mBAAA,QAAA,2BAAA,KAAA,IAAA,KAAA,IAAA,uBAAA,KAAA,iBAAgB,QAAQ,IAAI,OAAA,QAAA,0BAAA,KAAA,IAAA,wBAC3C,kBAAkB,QAAQ,IAAI;EAEhC,IAAI,KAAK,aAAa;GACpB,KAAK,YAAY,KAAK,KAAK;GAC3B;EACF;EAEA,MAAM,eAAe,sBAAsB,MAAM;EACjD,MAAM,gBAAgB,KAAK,UAAU;EACrC,IAAI;EACJ,IAAI,YAAY,gBAAgB,QAAQ,eAAe;;GACrD,MAAM,UAAU,QAAA,gBAAO,KAAK,aAAA,QAAA,kBAAA,KAAA,IAAA,gBAAW,CAAC;GACxC,MAAM,SAAS,QAAA,gBAAO,KAAK,aAAA,QAAA,kBAAA,KAAA,IAAA,gBAAW,CAAC;GAMvC,MAAM,YAJJ,WAAW,iBACX,WAAW,UACX,WAAW,eACX,WAAW,gCAET,MACA,KAAK,IAAI,MAAQ,KAAK,IAAI,OAAO,IAAI,KAAK,KAAO,SAAS,GAAK;GACnE,cAAc,cAAc,KAAK,KAAK,WAAW,cAAc,SAAS;EAC1E;EAEA,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,KAAK;EAChD,IAAI,aAAa,MAAM;CACzB;AACF;;;;ACvNA,IAAa,cAAb,cAAiC,WAAW;CAI1C,YAAY,UAAyB,CAAC,GAAG;EACvC,MAAM,OAAO;EAJf,gBAAA,MAAA,QAA4B,cAAA;EAC5B,gBAAA,MAAA,SAA+B;GAAE,UAAU;GAAG,OAAO;EAAE,CAAA;CAIvD;CAEA,kBAA4B,SAA2B;EACrD,MAAM,EAAE,WAAW,yBAAyB,OAAO;EACnD,KAAK,MAAM,WAAW,QAAQ;GAC5B,KAAK,MAAM,WAAW,QAAQ;GAC9B,KAAK,MAAM,QAAQ,QAAQ;GAC3B,KAAK,MAAM,mBAAmB,QAAQ;GACtC,KAAK,MAAM,aAAa,QAAQ;GAChC,KAAK,MAAM,QAAQ,QAAQ;GAC3B,KAAK,MAAM,UAAU,QAAQ;EAC/B;CACF;CAEA,IAAY,0BAAmC;EAC7C,OAAO,KAAK,UAAU,SAAS;CACjC;CAEA,MAAM,cACJ,OACA,UAAkD,CAAC,GACpC;;EACf,MAAM,KAAK,YAAY,mBAAmB;GACxC;GACA,QAAA,iBAAO,QAAQ,WAAA,QAAA,mBAAA,KAAA,IAAA,iBAAA;GACf,WAAA,oBAAU,QAAQ,cAAA,QAAA,sBAAA,KAAA,IAAA,oBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBAAyB,KAAK,MAAM,QAAQ;CACvD;CAEA,MAAM,SACJ,UAKI,CAAC,GACU;;EACf,MAAM,SAAA,iBAAQ,QAAQ,WAAA,QAAA,mBAAA,KAAA,IAAA,iBAAA;EACtB,MAAM,KAAK,YAAY,aAAa;GAClC,YAAA,qBAAW,QAAQ,eAAA,QAAA,uBAAA,KAAA,IAAA,qBAAA;GACnB,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf;GACA,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,2BAA2B,UAAA,IAClC,KAAK,MAAM,QAAQ;CAEvB;CAEA,MAAM,gBACJ,QACA,UAKI,CAAC,GACU;;EACf,MAAM,KAAK,YAAY,sBAAsB;GAC3C,SAAS;GACT,YAAA,sBAAW,QAAQ,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAA;GACnB,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;CACH;CAEA,MAAM,mBACJ,SACA,UAKI,CAAC,GACU;;EACf,MAAM,KAAK,YAAY,yBAAyB;GAC9C;GACA,YAAA,sBAAW,QAAQ,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAA;GACnB,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBAAyB,KAAK,MAAM,YAAY;CAC3D;CAEA,MAAM,2BACJ,UAAqE,CAAC,GACvD;;EACf,MAAM,YAAA,oBAAW,QAAQ,cAAA,QAAA,sBAAA,KAAA,IAAA,oBAAY;EACrC,MAAM,KAAK,YAAY,iCAAiC;GACtD,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf;GACA,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBAAyB,KAAK,MAAM,WAAW;CAC1D;CAEA,MAAM,2BACJ,UACA,UAAkE,CAAC,GACpD;;EACf,MAAM,KAAK,YAAY,kCAAkC;GACvD;GACA,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBAAyB,KAAK,MAAM,WAAW;CAC1D;CAEA,MAAM,2BACJ,UACA,UAKI,CAAC,GACU;;EACf,MAAM,KAAK,YAAY,kCAAkC;GACvD;GACA,YAAA,sBAAW,QAAQ,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAA;GACnB,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBAAyB,KAAK,MAAM,WAAW;CAC1D;CAEA,MAAM,kBACJ,WACA,UAAkD,CAAC,GACpC;;EACf,MAAM,KAAK,YAAY,wBAAwB;GAC7C,YAAY;GACZ,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;CACH;CAEA,MAAM,UACJ,UAAkD,CAAC,GACpC;;EACf,MAAM,KAAK,YAAY,cAAc;GACnC,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBAAyB,KAAK,MAAM,QAAQ;CACvD;CAEA,MAAM,iBACJ,UACA,UAAkD,CAAC,GACpC;;EACf,MAAM,KAAK,YAAY,uBAAuB;GAC5C,WAAW;GACX,QAAA,mBAAO,QAAQ,WAAA,QAAA,qBAAA,KAAA,IAAA,mBAAA;GACf,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,qBACJ,cACA,cACA,UAAkD,CAAC,GACpC;;EACf,MAAM,KAAK,YAAY,0BAA0B;GAC/C;GACA;GACA,QAAA,mBAAO,QAAQ,WAAA,QAAA,qBAAA,KAAA,IAAA,mBAAA;GACf,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;AACF;;;;AC3KA,IAAa,cAAb,cAAiC,WAAW;CAsB1C,YAAY,UAAyB,CAAC,GAAG;EACvC,MAAM,OAAO;EAtBf,gBAAA,MAAA,QAA4B,cAAA;EAE5B,gBAAA,MAAA,SAA+C;IAC/B,IAAA;IAAE,UAAU;IAAG,OAAO;GAAE;IACvB,IAAA;IAAE,UAAU;IAAG,OAAO;GAAE;EACzC,CAAA;EAEA,gBAAA,MAAA,OAA2B;GACzB,aAAa;GACb,SAAS;GACT,KAAK;GACL,OAAO;GACP,MAAM;GACN,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,YAAY;GACZ,YAAY;GACZ,YAAY;EACd,CAAA;CAIA;CAEA,kBAA4B,SAA2B;EACrD,MAAM,SAAS,yBAAyB,OAAO;EAC/C,KAAK,MAAM,WAAW,OAAO,QAAQ;GACnC,MAAM,QAAkB,CAAC;GACzB,IAAI,QAAQ,eAAe,GAAG,MAAM,KAAA,CAAe;GACnD,IAAI,QAAQ,eAAe,GAAG,MAAM,KAAA,CAAgB;GACpD,KAAK,MAAM,QAAQ,OAAO;IACxB,KAAK,MAAM,KAAK,CAAC,WAAW,QAAQ;IACpC,KAAK,MAAM,KAAK,CAAC,QAAQ,QAAQ;IACjC,KAAK,MAAM,KAAK,CAAC,mBAAmB,QAAQ;IAC5C,KAAK,MAAM,KAAK,CAAC,aAAa,QAAQ;IACtC,KAAK,MAAM,KAAK,CAAC,QAAQ,QAAQ;IACjC,KAAK,MAAM,KAAK,CAAC,UAAU,QAAQ;GACrC;EACF;EACA,IAAI,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK,OAAO,GAAG;EAClD,IAAI,OAAO,eAAe,KAAA,GAAW,KAAK,IAAI,UAAU,OAAO;CACjE;CAEA,IAAY,0BAAmC;EAC7C,OAAO,KAAK,UAAU,SAAS;CACjC;CAEA,MAAM,cACJ,OACA,UAAkD,CAAC,GACpC;;EACf,MAAM,SAAA,iBAAQ,QAAQ,WAAA,QAAA,mBAAA,KAAA,IAAA,iBAAA;EACtB,MAAM,KAAK,YAAY,mBAAmB;GACxC;GACA;GACA,WAAA,oBAAU,QAAQ,cAAA,QAAA,sBAAA,KAAA,IAAA,oBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBAAyB,KAAK,WAAW,OAAO,EAAE,MAAM,CAAC;CACpE;CAEA,MAAM,SACJ,UAKI,CAAC,GACU;;EACf,MAAM,SAAA,kBAAQ,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;EACtB,MAAM,SAAA,iBAAQ,QAAQ,WAAA,QAAA,mBAAA,KAAA,IAAA,iBAAA;EACtB,MAAM,KAAK,YAAY,aAAa;GAClC,YAAA,qBAAW,QAAQ,eAAA,QAAA,uBAAA,KAAA,IAAA,qBAAa;GAChC;GACA;GACA,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,2BAA2B,UAAA,IAClC,KAAK,WAAW,OAAO,EAAE,MAAM,CAAC;CAEpC;CAEA,MAAM,gBACJ,QACA,UAKI,CAAC,GACU;;EACf,MAAM,KAAK,YAAY,sBAAsB;GAC3C,SAAS;GACT,YAAA,sBAAW,QAAQ,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAa;GAChC,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;CACH;CAEA,MAAM,mBACJ,SACA,UAKI,CAAC,GACU;;EACf,MAAM,SAAA,kBAAQ,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;EACtB,MAAM,KAAK,YAAY,yBAAyB;GAC9C;GACA,YAAA,sBAAW,QAAQ,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAa;GAChC;GACA,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBACP,KAAK,WAAW,OAAO,EAAE,eAAe,QAAQ,CAAC;CAErD;CAEA,MAAM,2BACJ,UAAqE,CAAC,GACvD;;EACf,MAAM,YAAA,oBAAW,QAAQ,cAAA,QAAA,sBAAA,KAAA,IAAA,oBAAY;EACrC,MAAM,SAAA,kBAAQ,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;EACtB,MAAM,KAAK,YAAY,iCAAiC;GACtD;GACA;GACA,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBACP,KAAK,WAAW,OAAO,EAAE,SAAS,CAAC;CAEvC;CAEA,MAAM,2BACJ,UACA,UAAkE,CAAC,GACpD;;EACf,MAAM,SAAA,kBAAQ,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;EACtB,MAAM,KAAK,YAAY,kCAAkC;GACvD;GACA;GACA,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBAAyB,KAAK,WAAW,OAAO,EAAE,SAAS,CAAC;CACvE;CAEA,MAAM,2BACJ,UACA,UAKI,CAAC,GACU;;EACf,MAAM,KAAK,YAAY,kCAAkC;GACvD;GACA,YAAA,sBAAW,QAAQ,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAa;GAChC,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;CACH;CAEA,MAAM,kBACJ,WACA,UAAkD,CAAC,GACpC;;EACf,MAAM,KAAK,YAAY,wBAAwB;GAC7C,YAAY;GACZ,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;CACH;CAEA,MAAM,UACJ,UAAkD,CAAC,GACpC;;EACf,MAAM,SAAA,kBAAQ,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;EACtB,MAAM,KAAK,YAAY,cAAc;GACnC;GACA,WAAA,qBAAU,QAAQ,cAAA,QAAA,uBAAA,KAAA,IAAA,qBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBAAyB,KAAK,WAAW,OAAO,EAAE,OAAO,EAAE,CAAC;CACvE;CAEA,MAAM,iBACJ,UACA,UAAkD,CAAC,GACpC;;EACf,MAAM,KAAK,YAAY,uBAAuB;GAC5C,WAAW;GACX,QAAA,mBAAO,QAAQ,WAAA,QAAA,qBAAA,KAAA,IAAA,mBAAA;GACf,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,qBACJ,cACA,cACA,UAAkD,CAAC,GACpC;;EACf,MAAM,KAAK,YAAY,0BAA0B;GAC/C;GACA;GACA,QAAA,mBAAO,QAAQ,WAAA,QAAA,qBAAA,KAAA,IAAA,mBAAA;GACf,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,aACJ,UAAsE,CAAC,GACxD;;EACf,MAAM,KAAK,YAAY,iBAAiB;GACtC,YAAA,sBAAW,QAAQ,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAA;GACnB,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,oBACJ,QACA,UAAsE,CAAC,GACxD;;EACf,MAAM,KAAK,YAAY,0BAA0B;GAC/C,SAAS;GACT,YAAA,sBAAW,QAAQ,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAA;GACnB,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,uBACJ,SACA,UAAsE,CAAC,GACxD;;EACf,MAAM,KAAK,YAAY,6BAA6B;GAClD;GACA,YAAA,sBAAW,QAAQ,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAA;GACnB,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,iBACJ,WACA,YACA,UAAkC,CAAC,GACpB;;EACf,MAAM,KAAK,YAAY,sBAAsB;GAC3C,YAAY;GACZ,aAAa;GACb,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;EACD,IAAI,KAAK,yBAAyB;GAChC,KAAK,MAAA,EAAiB,CAAC,QAAQ;GAC/B,KAAK,MAAA,EAAkB,CAAC,QAAQ;EAClC;CACF;CAEA,MAAM,2BACJ,SACA,UAII,CAAC,GACU;;EACf,MAAM,KAAK,YAAY,kCAAkC;GACvD;GACA,aAAA,qBAAY,QAAQ,eAAA,QAAA,uBAAA,KAAA,IAAA,qBAAa;GACjC,cAAA,sBAAa,QAAQ,gBAAA,QAAA,wBAAA,KAAA,IAAA,sBAAc;GACnC,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,uBACJ,SACA,UAAsE,CAAC,GACxD;;EACf,MAAM,KAAK,YAAY,6BAA6B;GAClD;GACA,YAAA,sBAAW,QAAQ,eAAA,QAAA,wBAAA,KAAA,IAAA,sBAAA;GACnB,QAAA,kBAAO,QAAQ,WAAA,QAAA,oBAAA,KAAA,IAAA,kBAAA;GACf,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,aAAa,UAAkC,CAAC,GAAkB;;EACtE,MAAM,KAAK,YAAY,iBAAiB,EACtC,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY,KAChC,CAAC;EACD,IAAI,KAAK,yBAAyB;GAChC,KAAK,MAAA,EAAiB,CAAC,QAAQ;GAC/B,KAAK,MAAA,EAAkB,CAAC,QAAQ;EAClC;CACF;CAEA,MAAM,iBACJ,OACA,UAAkC,CAAC,GACpB;;EACf,MAAM,KAAK,YAAY,sBAAsB;GAC3C;GACA,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,oBACJ,UACA,UAAkC,CAAC,GACpB;;EACf,MAAM,KAAK,YAAY,0BAA0B;GAC/C,WAAW;GACX,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,wBACJ,cACA,cACA,UAAkC,CAAC,GACpB;;EACf,MAAM,KAAK,YAAY,6BAA6B;GAClD;GACA;GACA,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,wBACJ,UACA,UAAkC,CAAC,GACpB;;EACf,MAAM,KAAK,YAAY,8BAA8B;GACnD;GACA,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,cACJ,SACA,UAAkC,CAAC,GACpB;;EACf,MAAM,KAAK,YAAY,oBAAoB;GACzC,UAAU;GACV,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,MAAM,gBACJ,QAAQ,GACR,UAAkC,CAAC,GACpB;;EACf,MAAM,KAAK,YAAY,sBAAsB;GAC3C;GACA,WAAA,sBAAU,QAAQ,cAAA,QAAA,wBAAA,KAAA,IAAA,sBAAY;EAChC,CAAC;CACH;CAEA,WACE,OACA,OACM;EACN,MAAM,UACJ,UAAA,IACI,CAAA,GAAA,CAAwB,IACxB,UAAA,KAAwB,UAAA,IACtB,CAAC,KAAK,IACN,CAAA,CAAW;EAEnB,KAAK,MAAM,QAAQ,SAAS;GAC1B,IAAI,MAAM,UAAU,KAAA,GAAW,KAAK,MAAM,KAAK,CAAC,QAAQ,MAAM;GAC9D,IAAI,MAAM,kBAAkB,KAAA,GAC1B,KAAK,MAAM,KAAK,CAAC,YAAY,MAAM;GAErC,IAAI,MAAM,aAAa,KAAA,GAAW,KAAK,MAAM,KAAK,CAAC,WAAW,MAAM;EACtE;CACF;AACF;;;;AC9YA,IAAa,cAAb,cAAiC,WAAW;CAW1C,YAAY,UAAyB,CAAC,GAAG;EACvC,MAAM,OAAO;EAXf,gBAAA,MAAA,QAA4B,cAAA;EAE5B,gBAAA,MAAA,UAAsC;GACpC,OAAO;GACP,QAAQ;GACR,UAAU;GACV,SAAS;GACT,YAAY;EACd,CAAA;CAIA;CAGA,kBAA4B,SAA2B;EACrD,MAAM,EAAE,UAAU,yBAAyB,OAAO;EAClD,IAAI,CAAC,OAAO;EACZ,KAAK,OAAO,QAAQ,MAAM;EAC1B,KAAK,OAAO,aAAa,MAAM;EAC/B,KAAK,OAAO,SAAS,MAAM;EAC3B,KAAK,OAAO,WAAW,MAAM;EAC7B,KAAK,OAAO,UAAU,MAAM;EAC5B,KAAK,OAAO,MAAM,MAAM;EACxB,KAAK,OAAO,aAAa,MAAM;EAC/B,KAAK,OAAO,QAAQ,MAAM;CAC5B;;CAGA,aAAa,SAA4C;EACvD,OAAO,OAAO,KAAK,QAAQ,OAAO;CACpC;AACF;;;;ACrCA,IAAa,aAAb,cAAgC,WAAW;CAYzC,YAAY,UAAyB,CAAC,GAAG;EACvC,MAAM,OAAO;EAZf,gBAAA,MAAA,QAA4B,YAAA;EAE5B,gBAAA,MAAA,UAAqC;GACnC,aAAa;GACb,cAAc;GACd,WAAW;GACX,YAAY;EACd,CAAA;EAEA,gBAAA,MAAA,eAAc,CAAA;CAId;CAEA,kBAA4B,SAA2B;EACrD,MAAM,SAAS,yBAAyB,OAAO;EAC/C,IAAI,OAAO,YAAY;GAErB,KAAK,OAAO,cAAc,OAAO,WAAW;GAC5C,KAAK,OAAO,eAAe,OAAO,WAAW;GAC7C,KAAK,OAAO,YAAY,OAAO,WAAW;GAC1C,KAAK,OAAO,aAAa,OAAO,WAAW;EAC7C;EACA,IAAI,OAAO,gBAAgB,KAAA,GACzB,KAAK,cAAc,OAAO;CAE9B;;CAGA,cAAc,SAA2C;EACvD,OAAO,OAAO,KAAK,QAAQ,OAAO;CACpC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-bluetooth.d.ts","sourceRoot":"","sources":["../../src/transport/web-bluetooth.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAgB9B,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,SAAS,EACT,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAmDpB,MAAM,WAAW,4BAA4B;IAC3C,wFAAwF;IACxF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,YAAW,SAAS;IACrD,QAAQ,CAAC,IAAI,mBAAmB;IAEhC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;IAC7D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqC;IAC1D,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAOpB;gBAEQ,OAAO,GAAE,4BAAiC;IAMtD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,UAAU;IAIvE,IAAI,CACR,KAAK,EAAE,UAAU,EACjB,QAAQ,CAAC,EAAE,cAAc,EACzB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,EAAE,CAAC;IAMrB,OAAO,CACX,IAAI,EAAE,UAAU,EAChB,QAAQ,CAAC,EAAE,cAAc,EACzB,QAAQ,CAAC,EAAE;QACT,cAAc,CAAC,EAAE,mBAAmB,CAAC;QACrC,YAAY,CAAC,EAAE,iBAAiB,CAAC;KAClC,GACA,OAAO,CAAC,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"web-bluetooth.d.ts","sourceRoot":"","sources":["../../src/transport/web-bluetooth.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAgB9B,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,SAAS,EACT,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAmDpB,MAAM,WAAW,4BAA4B;IAC3C,wFAAwF;IACxF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,YAAW,SAAS;IACrD,QAAQ,CAAC,IAAI,mBAAmB;IAEhC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;IAC7D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqC;IAC1D,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAOpB;gBAEQ,OAAO,GAAE,4BAAiC;IAMtD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,UAAU;IAIvE,IAAI,CACR,KAAK,EAAE,UAAU,EACjB,QAAQ,CAAC,EAAE,cAAc,EACzB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,EAAE,CAAC;IAMrB,OAAO,CACX,IAAI,EAAE,UAAU,EAChB,QAAQ,CAAC,EAAE,cAAc,EACzB,QAAQ,CAAC,EAAE;QACT,cAAc,CAAC,EAAE,mBAAmB,CAAC;QACrC,YAAY,CAAC,EAAE,iBAAiB,CAAC;KAClC,GACA,OAAO,CAAC,mBAAmB,CAAC;IA2EzB,IAAI,CAAC,UAAU,EAAE,mBAAmB,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAwB,GAAG,OAAO,CAAC,UAAU,CAAC;IA4BrF,UAAU,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1D,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAOlC,oEAAoE;IACpE,OAAO,CAAC,UAAU,EAAE,mBAAmB,GAAG,YAAY,GAAG,SAAS;IAIlE,MAAM,CAAC,WAAW,IAAI,OAAO;YAQf,QAAQ;IAatB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,aAAa;CAOtB"}
|
package/package.json
CHANGED