motion-master-client 0.0.21 → 0.0.22
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/.babelrc +3 -0
- package/.eslintrc.json +18 -0
- package/jest.config.ts +16 -0
- package/motion-master.proto +1822 -0
- package/package.json +2 -17
- package/project.json +45 -0
- package/src/lib/cia402.spec.ts +77 -0
- package/src/lib/cia402.ts +414 -0
- package/src/lib/config-file.spec.ts +114 -0
- package/src/lib/config-file.ts +63 -0
- package/src/lib/device-log-line.ts +5 -0
- package/src/lib/device-parameter.spec.ts +85 -0
- package/src/lib/device-parameter.ts +79 -0
- package/src/lib/device.ts +10 -0
- package/src/lib/hardware-description.spec.ts +253 -0
- package/src/lib/hardware-description.ts +129 -0
- package/src/lib/logger.ts +5 -0
- package/src/lib/monitoring-config.ts +6 -0
- package/src/lib/{monitoring-entry.d.ts → monitoring-entry.ts} +5 -4
- package/src/lib/motion-master-client.ts +221 -0
- package/src/lib/motion-master-pub-sub-client.ts +95 -0
- package/src/lib/motion-master-pub-sub-socket.ts +40 -0
- package/src/lib/motion-master-pub-sub-web-socket.ts +78 -0
- package/src/lib/motion-master-pub-sub-worker-socket.ts +51 -0
- package/src/lib/motion-master-req-res-client.spec.ts +740 -0
- package/src/lib/motion-master-req-res-client.ts +2120 -0
- package/src/lib/motion-master-req-res-socket.ts +62 -0
- package/src/lib/motion-master-req-res-web-socket.ts +124 -0
- package/src/lib/motion-master-req-res-worker-socket.ts +87 -0
- package/src/lib/motion-master.proto.js +2 -2
- package/src/lib/operators.ts +90 -0
- package/src/lib/options.ts +12 -0
- package/src/lib/parameter.spec.ts +160 -0
- package/src/lib/parameter.ts +170 -0
- package/src/lib/product-id-range.ts +8 -0
- package/src/lib/request-status-resolver.ts +403 -0
- package/src/lib/system-log-line.ts +9 -0
- package/src/lib/{types.d.ts → types.ts} +74 -143
- package/src/lib/urls.ts +6 -0
- package/src/lib/util.ts +305 -0
- package/tsconfig.json +23 -0
- package/tsconfig.lib.json +10 -0
- package/tsconfig.spec.json +20 -0
- package/typedoc.json +10 -0
- package/src/index.js +0 -29
- package/src/index.js.map +0 -1
- package/src/lib/cia402.d.ts +0 -182
- package/src/lib/cia402.js +0 -392
- package/src/lib/cia402.js.map +0 -1
- package/src/lib/config-file.d.ts +0 -13
- package/src/lib/config-file.js +0 -50
- package/src/lib/config-file.js.map +0 -1
- package/src/lib/device-log-line.d.ts +0 -5
- package/src/lib/device-log-line.js +0 -3
- package/src/lib/device-log-line.js.map +0 -1
- package/src/lib/device-parameter.d.ts +0 -56
- package/src/lib/device-parameter.js +0 -39
- package/src/lib/device-parameter.js.map +0 -1
- package/src/lib/device.d.ts +0 -9
- package/src/lib/device.js +0 -3
- package/src/lib/device.js.map +0 -1
- package/src/lib/hardware-description.d.ts +0 -41
- package/src/lib/hardware-description.js +0 -94
- package/src/lib/hardware-description.js.map +0 -1
- package/src/lib/logger.d.ts +0 -1
- package/src/lib/logger.js +0 -8
- package/src/lib/logger.js.map +0 -1
- package/src/lib/monitoring-config.d.ts +0 -6
- package/src/lib/monitoring-config.js +0 -3
- package/src/lib/monitoring-config.js.map +0 -1
- package/src/lib/monitoring-entry.js +0 -3
- package/src/lib/monitoring-entry.js.map +0 -1
- package/src/lib/motion-master-client.d.ts +0 -52
- package/src/lib/motion-master-client.js +0 -151
- package/src/lib/motion-master-client.js.map +0 -1
- package/src/lib/motion-master-pub-sub-client.d.ts +0 -16
- package/src/lib/motion-master-pub-sub-client.js +0 -68
- package/src/lib/motion-master-pub-sub-client.js.map +0 -1
- package/src/lib/motion-master-pub-sub-socket.d.ts +0 -34
- package/src/lib/motion-master-pub-sub-socket.js +0 -3
- package/src/lib/motion-master-pub-sub-socket.js.map +0 -1
- package/src/lib/motion-master-pub-sub-web-socket.d.ts +0 -14
- package/src/lib/motion-master-pub-sub-web-socket.js +0 -67
- package/src/lib/motion-master-pub-sub-web-socket.js.map +0 -1
- package/src/lib/motion-master-pub-sub-worker-socket.d.ts +0 -14
- package/src/lib/motion-master-pub-sub-worker-socket.js +0 -42
- package/src/lib/motion-master-pub-sub-worker-socket.js.map +0 -1
- package/src/lib/motion-master-req-res-client.d.ts +0 -920
- package/src/lib/motion-master-req-res-client.js +0 -1680
- package/src/lib/motion-master-req-res-client.js.map +0 -1
- package/src/lib/motion-master-req-res-socket.d.ts +0 -52
- package/src/lib/motion-master-req-res-socket.js +0 -3
- package/src/lib/motion-master-req-res-socket.js.map +0 -1
- package/src/lib/motion-master-req-res-web-socket.d.ts +0 -24
- package/src/lib/motion-master-req-res-web-socket.js +0 -99
- package/src/lib/motion-master-req-res-web-socket.js.map +0 -1
- package/src/lib/motion-master-req-res-worker-socket.d.ts +0 -20
- package/src/lib/motion-master-req-res-worker-socket.js +0 -69
- package/src/lib/motion-master-req-res-worker-socket.js.map +0 -1
- package/src/lib/operators.d.ts +0 -18
- package/src/lib/operators.js +0 -76
- package/src/lib/operators.js.map +0 -1
- package/src/lib/options.d.ts +0 -10
- package/src/lib/options.js +0 -14
- package/src/lib/options.js.map +0 -1
- package/src/lib/parameter.d.ts +0 -72
- package/src/lib/parameter.js +0 -119
- package/src/lib/parameter.js.map +0 -1
- package/src/lib/product-id-range.d.ts +0 -7
- package/src/lib/product-id-range.js +0 -12
- package/src/lib/product-id-range.js.map +0 -1
- package/src/lib/request-status-resolver.d.ts +0 -4
- package/src/lib/request-status-resolver.js +0 -345
- package/src/lib/request-status-resolver.js.map +0 -1
- package/src/lib/system-log-line.d.ts +0 -9
- package/src/lib/system-log-line.js +0 -3
- package/src/lib/system-log-line.js.map +0 -1
- package/src/lib/types.js +0 -28
- package/src/lib/types.js.map +0 -1
- package/src/lib/urls.d.ts +0 -3
- package/src/lib/urls.js +0 -10
- package/src/lib/urls.js.map +0 -1
- package/src/lib/util.d.ts +0 -40
- package/src/lib/util.js +0 -316
- package/src/lib/util.js.map +0 -1
- /package/src/{index.d.ts → index.ts} +0 -0
|
@@ -1,26 +1,43 @@
|
|
|
1
1
|
import { motionmaster } from "./motion-master.proto";
|
|
2
|
+
|
|
2
3
|
export import MotionMasterMessage = motionmaster.MotionMasterMessage;
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
3
5
|
export import IMotionMasterMessage = motionmaster.IMotionMasterMessage;
|
|
6
|
+
|
|
4
7
|
export type StatusKey = keyof MotionMasterMessage.IStatus;
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
export type RequestStatus =
|
|
10
|
+
| 'succeeded'
|
|
11
|
+
| 'failed'
|
|
12
|
+
| 'running';
|
|
13
|
+
|
|
14
|
+
export class RequestError extends Error { }
|
|
15
|
+
|
|
16
|
+
export type ParameterAddress = [number, number]; // index, subindex
|
|
9
17
|
export type ParameterTypeValue = Omit<MotionMasterMessage.Request.SetDeviceParameterValues.IParameterValue, 'index' | 'subindex'>;
|
|
10
18
|
export type ParameterTypeValueKey = keyof ParameterTypeValue;
|
|
11
19
|
export type ParameterValueType = string | number | Uint8Array;
|
|
12
|
-
export type ParameterAddressValue = [number, number, ParameterValueType, ParameterTypeValueKey?];
|
|
13
|
-
export type DeviceParameterAddressValue = [DeviceRef, number, number, ParameterValueType, ParameterTypeValueKey?];
|
|
20
|
+
export type ParameterAddressValue = [number, number, ParameterValueType, ParameterTypeValueKey?]; // index, subindex, value, typeValue
|
|
21
|
+
export type DeviceParameterAddressValue = [DeviceRef, number, number, ParameterValueType, ParameterTypeValueKey?]; // index, subindex, value, typeValue
|
|
14
22
|
export type DeviceParameterIds = string[] | [DeviceRef, number, number][];
|
|
23
|
+
|
|
15
24
|
export type DeviceRefObj = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
25
|
+
deviceAddress?: (number | null); // already defined in the proto request messages
|
|
26
|
+
deviceSerialNumber?: (string | null);
|
|
27
|
+
devicePosition?: (number | null);
|
|
19
28
|
};
|
|
29
|
+
|
|
20
30
|
export type DeviceRef = number | string;
|
|
21
|
-
|
|
31
|
+
|
|
32
|
+
export type ParameterInfoAndValue = MotionMasterMessage.Status.DeviceParameterInfo.IParameter
|
|
33
|
+
& MotionMasterMessage.Status.DeviceParameterValues.IParameterValue;
|
|
34
|
+
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
22
36
|
export import EthercatNetworkState = MotionMasterMessage.Request.SetEthercatNetworkState.State;
|
|
37
|
+
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
23
39
|
export import ControllerType = MotionMasterMessage.Request.EnableMotionController.ControllerType;
|
|
40
|
+
|
|
24
41
|
export type GetDeviceParameterInfoRequest = MotionMasterMessage.Request.IGetDeviceParameterInfo & DeviceRefObj;
|
|
25
42
|
export type GetDeviceParameterValuesRequest = MotionMasterMessage.Request.IGetDeviceParameterValues & DeviceRefObj;
|
|
26
43
|
export type GetMultiDeviceParameterValuesRequest = MotionMasterMessage.Request.IGetMultiDeviceParameterValues;
|
|
@@ -64,139 +81,53 @@ export type StopFullAutoTuningRequest = MotionMasterMessage.Request.IStopFullAut
|
|
|
64
81
|
export type StartCirculoEncoderConfigurationRequest = MotionMasterMessage.Request.IStartCirculoEncoderConfiguration & DeviceRefObj;
|
|
65
82
|
export type StopCirculoEncoderNarrowAngleCalibrationProcedureRequest = MotionMasterMessage.Request.IStopCirculoEncoderNarrowAngleCalibrationProcedure & DeviceRefObj;
|
|
66
83
|
export type StartOsCommandRequest = MotionMasterMessage.Request.IStartOsCommand & DeviceRefObj;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
};
|
|
71
|
-
export type
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
};
|
|
75
|
-
export type
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
};
|
|
79
|
-
export type
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
};
|
|
83
|
-
export type
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
};
|
|
87
|
-
export type
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
};
|
|
91
|
-
export type
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
};
|
|
95
|
-
export type
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
messageId?: string;
|
|
102
|
-
};
|
|
103
|
-
export type DeviceFirmwareInstallationStatus = MotionMasterMessage.Status.IDeviceFirmwareInstallation & {
|
|
104
|
-
request: RequestStatus;
|
|
105
|
-
messageId?: string;
|
|
106
|
-
};
|
|
107
|
-
export type DeviceLogStatus = MotionMasterMessage.Status.IDeviceLog & {
|
|
108
|
-
request: RequestStatus;
|
|
109
|
-
messageId?: string;
|
|
110
|
-
};
|
|
111
|
-
export type CoggingTorqueRecordingStatus = MotionMasterMessage.Status.ICoggingTorqueRecording & {
|
|
112
|
-
request: RequestStatus;
|
|
113
|
-
messageId?: string;
|
|
114
|
-
};
|
|
115
|
-
export type CoggingTorqueDataStatus = MotionMasterMessage.Status.ICoggingTorqueData & {
|
|
116
|
-
request: RequestStatus;
|
|
117
|
-
messageId?: string;
|
|
118
|
-
};
|
|
119
|
-
export type OffsetDetectionStatus = MotionMasterMessage.Status.IOffsetDetection & {
|
|
120
|
-
request: RequestStatus;
|
|
121
|
-
messageId?: string;
|
|
122
|
-
};
|
|
123
|
-
export type PlantIdentificationStatus = MotionMasterMessage.Status.IPlantIdentification & {
|
|
124
|
-
request: RequestStatus;
|
|
125
|
-
messageId?: string;
|
|
126
|
-
};
|
|
127
|
-
export type AutoTuningStatus = MotionMasterMessage.Status.IAutoTuning & {
|
|
128
|
-
request: RequestStatus;
|
|
129
|
-
messageId?: string;
|
|
130
|
-
};
|
|
131
|
-
export type MotionControllerStatus = MotionMasterMessage.Status.IMotionController & {
|
|
132
|
-
request: RequestStatus;
|
|
133
|
-
messageId?: string;
|
|
134
|
-
};
|
|
135
|
-
export type SignalGeneratorStatus = MotionMasterMessage.Status.ISignalGenerator & {
|
|
136
|
-
request: RequestStatus;
|
|
137
|
-
messageId?: string;
|
|
138
|
-
};
|
|
139
|
-
export type MonitoringParameterValuesStatus = MotionMasterMessage.Status.IMonitoringParameterValues & {
|
|
140
|
-
request: RequestStatus;
|
|
141
|
-
messageId?: string;
|
|
142
|
-
};
|
|
143
|
-
export type EthercatNetworkStateStatus = MotionMasterMessage.Status.IEthercatNetworkState & {
|
|
144
|
-
request: RequestStatus;
|
|
145
|
-
messageId?: string;
|
|
146
|
-
};
|
|
147
|
-
export type NarrowAngleCalibrationStatus = MotionMasterMessage.Status.INarrowAngleCalibration & {
|
|
148
|
-
request: RequestStatus;
|
|
149
|
-
messageId?: string;
|
|
150
|
-
};
|
|
151
|
-
export type SystemIdentificationStatus = MotionMasterMessage.Status.ISystemIdentification & {
|
|
152
|
-
request: RequestStatus;
|
|
153
|
-
messageId?: string;
|
|
154
|
-
};
|
|
155
|
-
export type CirculoEncoderMagnetDistanceStatus = MotionMasterMessage.Status.ICirculoEncoderMagnetDistance & {
|
|
156
|
-
request: RequestStatus;
|
|
157
|
-
messageId?: string;
|
|
158
|
-
};
|
|
159
|
-
export type CirculoEncoderNarrowAngleCalibrationProcedureStatus = MotionMasterMessage.Status.ICirculoEncoderNarrowAngleCalibrationProcedure & {
|
|
160
|
-
request: RequestStatus;
|
|
161
|
-
messageId?: string;
|
|
162
|
-
};
|
|
163
|
-
export type DeviceCiA402StateStatus = MotionMasterMessage.Status.IDeviceCiA402State & {
|
|
164
|
-
request: RequestStatus;
|
|
165
|
-
messageId?: string;
|
|
166
|
-
};
|
|
167
|
-
export type SystemLogStatus = MotionMasterMessage.Status.ISystemLog & {
|
|
168
|
-
request: RequestStatus;
|
|
169
|
-
messageId?: string;
|
|
170
|
-
};
|
|
171
|
-
export type DeviceSiiRestoreStatus = MotionMasterMessage.Status.IDeviceSiiRestore & {
|
|
172
|
-
request: RequestStatus;
|
|
173
|
-
messageId?: string;
|
|
174
|
-
};
|
|
175
|
-
export type OpenLoopFieldControlStatus = MotionMasterMessage.Status.IOpenLoopFieldControl & {
|
|
176
|
-
request: RequestStatus;
|
|
177
|
-
messageId?: string;
|
|
178
|
-
};
|
|
179
|
-
export type FullAutoTuningStatus = MotionMasterMessage.Status.IFullAutoTuning & {
|
|
180
|
-
request: RequestStatus;
|
|
181
|
-
messageId?: string;
|
|
182
|
-
};
|
|
183
|
-
export type CirculoEncoderConfigurationStatus = MotionMasterMessage.Status.ICirculoEncoderConfiguration & {
|
|
184
|
-
request: RequestStatus;
|
|
185
|
-
messageId?: string;
|
|
186
|
-
};
|
|
187
|
-
export type OsCommandStatus = MotionMasterMessage.Status.IOsCommand & {
|
|
188
|
-
request: RequestStatus;
|
|
189
|
-
messageId?: string;
|
|
190
|
-
};
|
|
84
|
+
|
|
85
|
+
export type SystemVersionStatus = MotionMasterMessage.Status.ISystemVersion & { request: RequestStatus, messageId?: string };
|
|
86
|
+
export type DeviceInfoStatus = MotionMasterMessage.Status.IDeviceInfo & { request: RequestStatus, messageId?: string };
|
|
87
|
+
export type DeviceParameterInfoStatus = MotionMasterMessage.Status.IDeviceParameterInfo & { request: RequestStatus, messageId?: string };
|
|
88
|
+
export type DeviceParameterValuesStatus = MotionMasterMessage.Status.IDeviceParameterValues & { request: RequestStatus, messageId?: string };
|
|
89
|
+
export type MultiDeviceParameterValuesStatus = MotionMasterMessage.Status.IMultiDeviceParameterValues & { request: RequestStatus, messageId?: string };
|
|
90
|
+
export type DeviceFileListStatus = MotionMasterMessage.Status.IDeviceFileList & { request: RequestStatus, messageId?: string };
|
|
91
|
+
export type DeviceFileStatus = MotionMasterMessage.Status.IDeviceFile & { request: RequestStatus, messageId?: string };
|
|
92
|
+
export type DeviceFaultResetStatus = MotionMasterMessage.Status.IDeviceFaultReset & { request: RequestStatus, messageId?: string };
|
|
93
|
+
export type DeviceStopStatus = MotionMasterMessage.Status.IDeviceStop & { request: RequestStatus, messageId?: string };
|
|
94
|
+
export type DeviceFirmwareInstallationStatus = MotionMasterMessage.Status.IDeviceFirmwareInstallation & { request: RequestStatus, messageId?: string };
|
|
95
|
+
export type DeviceLogStatus = MotionMasterMessage.Status.IDeviceLog & { request: RequestStatus, messageId?: string };
|
|
96
|
+
export type CoggingTorqueRecordingStatus = MotionMasterMessage.Status.ICoggingTorqueRecording & { request: RequestStatus, messageId?: string };
|
|
97
|
+
export type CoggingTorqueDataStatus = MotionMasterMessage.Status.ICoggingTorqueData & { request: RequestStatus, messageId?: string };
|
|
98
|
+
export type OffsetDetectionStatus = MotionMasterMessage.Status.IOffsetDetection & { request: RequestStatus, messageId?: string };
|
|
99
|
+
export type PlantIdentificationStatus = MotionMasterMessage.Status.IPlantIdentification & { request: RequestStatus, messageId?: string };
|
|
100
|
+
export type AutoTuningStatus = MotionMasterMessage.Status.IAutoTuning & { request: RequestStatus, messageId?: string };
|
|
101
|
+
export type MotionControllerStatus = MotionMasterMessage.Status.IMotionController & { request: RequestStatus, messageId?: string };
|
|
102
|
+
export type SignalGeneratorStatus = MotionMasterMessage.Status.ISignalGenerator & { request: RequestStatus, messageId?: string };
|
|
103
|
+
export type MonitoringParameterValuesStatus = MotionMasterMessage.Status.IMonitoringParameterValues & { request: RequestStatus, messageId?: string };
|
|
104
|
+
export type EthercatNetworkStateStatus = MotionMasterMessage.Status.IEthercatNetworkState & { request: RequestStatus, messageId?: string };
|
|
105
|
+
export type NarrowAngleCalibrationStatus = MotionMasterMessage.Status.INarrowAngleCalibration & { request: RequestStatus, messageId?: string };
|
|
106
|
+
export type SystemIdentificationStatus = MotionMasterMessage.Status.ISystemIdentification & { request: RequestStatus, messageId?: string };
|
|
107
|
+
export type CirculoEncoderMagnetDistanceStatus = MotionMasterMessage.Status.ICirculoEncoderMagnetDistance & { request: RequestStatus, messageId?: string };
|
|
108
|
+
export type CirculoEncoderNarrowAngleCalibrationProcedureStatus = MotionMasterMessage.Status.ICirculoEncoderNarrowAngleCalibrationProcedure & { request: RequestStatus, messageId?: string };
|
|
109
|
+
export type DeviceCiA402StateStatus = MotionMasterMessage.Status.IDeviceCiA402State & { request: RequestStatus, messageId?: string };
|
|
110
|
+
export type SystemLogStatus = MotionMasterMessage.Status.ISystemLog & { request: RequestStatus, messageId?: string };
|
|
111
|
+
export type DeviceSiiRestoreStatus = MotionMasterMessage.Status.IDeviceSiiRestore & { request: RequestStatus, messageId?: string };
|
|
112
|
+
export type OpenLoopFieldControlStatus = MotionMasterMessage.Status.IOpenLoopFieldControl & { request: RequestStatus, messageId?: string };
|
|
113
|
+
export type FullAutoTuningStatus = MotionMasterMessage.Status.IFullAutoTuning & { request: RequestStatus, messageId?: string };
|
|
114
|
+
export type CirculoEncoderConfigurationStatus = MotionMasterMessage.Status.ICirculoEncoderConfiguration & { request: RequestStatus, messageId?: string };
|
|
115
|
+
export type OsCommandStatus = MotionMasterMessage.Status.IOsCommand & { request: RequestStatus, messageId?: string };
|
|
116
|
+
|
|
117
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
191
118
|
export import ValueType = MotionMasterMessage.Status.DeviceParameterInfo.Parameter.ValueType;
|
|
192
|
-
|
|
193
|
-
export
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
119
|
+
|
|
120
|
+
export function isArrayOfDeviceSerialNumbers(ids: DeviceParameterIds): ids is string[] {
|
|
121
|
+
return ids.length > 0 && typeof ids[0] === 'string';
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function isObjectOfDeviceSerialNumberToValues(ids: { [deviceParameterId: string]: ParameterValueType } | DeviceParameterAddressValue[]): ids is { [deviceParameterId: string]: ParameterValueType } {
|
|
125
|
+
return !Array.isArray(ids);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export enum RestoreDefaultParametersType {
|
|
129
|
+
RESTORE_ALL_DEFAULT_PARAMETERS = 1,
|
|
130
|
+
RESTORE_MANUFACTURER_DEFAULT_PARAMETERS = 4,
|
|
201
131
|
}
|
|
132
|
+
|
|
202
133
|
export type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
|
package/src/lib/urls.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const firmwarePackageBaseUrl = 'https://synapticon.s3.amazonaws.com/somanet-software/releases/';
|
|
2
|
+
export const listFirmwarePackagesUrl = 'https://pc27e3jixd.execute-api.us-east-1.amazonaws.com/default/listFirmwarePackages';
|
|
3
|
+
|
|
4
|
+
export function getFirmwarePackageUrl(filename: string) {
|
|
5
|
+
return firmwarePackageBaseUrl + filename;
|
|
6
|
+
}
|
package/src/lib/util.ts
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { inRange } from "lodash";
|
|
2
|
+
import { DeviceLogLine } from "./device-log-line";
|
|
3
|
+
import { Parameter, ParameterIndexSubindex } from "./parameter";
|
|
4
|
+
import { SystemLogLine } from "./system-log-line";
|
|
5
|
+
import { DeviceRef, DeviceRefObj, IMotionMasterMessage, MotionMasterMessage, ParameterAddressValue, ParameterTypeValue, ParameterTypeValueKey, ParameterValueType, ValueType } from "./types";
|
|
6
|
+
|
|
7
|
+
export function getParameterTypeValueDefault(key: ParameterTypeValueKey) {
|
|
8
|
+
if (key === 'floatValue' || key === 'intValue' || key === 'uintValue') {
|
|
9
|
+
return 0;
|
|
10
|
+
} else if (key === 'rawValue') {
|
|
11
|
+
return Uint8Array.from([]);
|
|
12
|
+
} else if (key === 'stringValue') {
|
|
13
|
+
return '';
|
|
14
|
+
} else {
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function getParameterTypeValue(parameter: MotionMasterMessage.Status.DeviceParameterValues.IParameterValue): ParameterTypeValueKey | undefined {
|
|
20
|
+
return (MotionMasterMessage.Status.DeviceParameterValues.ParameterValue.create(parameter)).typeValue;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function getParameterValue(parameter: MotionMasterMessage.Status.DeviceParameterValues.IParameterValue): ParameterValueType {
|
|
24
|
+
const key = getParameterTypeValue(parameter);
|
|
25
|
+
if (key && key in parameter) {
|
|
26
|
+
return parameter[key] ?? getParameterTypeValueDefault(key);
|
|
27
|
+
}
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function makeDeviceRefObj(deviceRef: DeviceRef): DeviceRefObj {
|
|
32
|
+
if (typeof deviceRef === 'number') {
|
|
33
|
+
if (deviceRef <= 0xFFFF) {
|
|
34
|
+
return { devicePosition: deviceRef };
|
|
35
|
+
} else {
|
|
36
|
+
return { deviceAddress: deviceRef };
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
return { deviceSerialNumber: deviceRef };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// TODO: Write unit tests.
|
|
44
|
+
export function parseSystemLogLine(line: string): SystemLogLine | undefined {
|
|
45
|
+
const re = /(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{1,3})\s\((.+)\)\s\[(.+)\](.+:\d+)(.+?)\|(.*)/s;
|
|
46
|
+
const result = re.exec(line);
|
|
47
|
+
if (result) {
|
|
48
|
+
return {
|
|
49
|
+
line,
|
|
50
|
+
date: new Date(result[1]),
|
|
51
|
+
uptime: result[2].trim(),
|
|
52
|
+
id: result[3].trim(),
|
|
53
|
+
file: result[4].trim(),
|
|
54
|
+
level: result[5].trim(),
|
|
55
|
+
message: result[6],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// TODO: Write unit tests.
|
|
62
|
+
export function parseSystemLogContent(content: string): SystemLogLine[] {
|
|
63
|
+
const re = /(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{1,3}.+?)(?=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{1,3}|$)/gs;
|
|
64
|
+
return content.split(re)
|
|
65
|
+
.filter((l) => l !== '')
|
|
66
|
+
.map((v) => parseSystemLogLine(v))
|
|
67
|
+
.filter((l): l is SystemLogLine => l !== undefined);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function parseDeviceLog(line: string): DeviceLogLine | undefined {
|
|
71
|
+
const re = /^(\d{2}:\d{2}:\d{2}\.\d+)\s(.*)\|(.*)$/gm;
|
|
72
|
+
const result = re.exec(line);
|
|
73
|
+
if (result) {
|
|
74
|
+
return {
|
|
75
|
+
time: result[1].trim(),
|
|
76
|
+
level: result[2].trim(),
|
|
77
|
+
message: result[3].trim(),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function parseDeviceLogContent(content: string): DeviceLogLine[] {
|
|
84
|
+
return content.split('\n')
|
|
85
|
+
.map((v) => parseDeviceLog(v))
|
|
86
|
+
.filter((l): l is DeviceLogLine => l !== undefined);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function mapParameterTypeValueToObject(type: keyof ParameterTypeValue, value: number | string): ParameterTypeValue {
|
|
90
|
+
const p: ParameterTypeValue = {};
|
|
91
|
+
if (type === 'floatValue') {
|
|
92
|
+
p['floatValue'] = typeof value === 'number' ? value : parseFloat(value);
|
|
93
|
+
} else if (type === 'intValue') {
|
|
94
|
+
p['intValue'] = typeof value === 'number' ? value : parseInt(value, 10);
|
|
95
|
+
} else if (type === 'rawValue') {
|
|
96
|
+
if (typeof value === 'number') {
|
|
97
|
+
p['rawValue'] = Uint8Array.from([value]);
|
|
98
|
+
} else {
|
|
99
|
+
let bytes: number[] = [];
|
|
100
|
+
if (value.startsWith('0x')) {
|
|
101
|
+
bytes = value.slice(2).match(/.{1,2}/g)?.map((h) => parseInt(h, 16)) ?? [];
|
|
102
|
+
} else {
|
|
103
|
+
bytes = value.split(',').map((c) => c.trim()).map((c) => parseInt(c, 10));
|
|
104
|
+
}
|
|
105
|
+
p['rawValue'] = Uint8Array.from(bytes);
|
|
106
|
+
}
|
|
107
|
+
} else if (type === 'stringValue') {
|
|
108
|
+
p['stringValue'] = typeof value === 'string' ? value : value.toString();
|
|
109
|
+
} else if (type === 'uintValue') {
|
|
110
|
+
p['uintValue'] = typeof value === 'number' ? value : parseInt(value, 10);
|
|
111
|
+
}
|
|
112
|
+
return p;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Using bytes fixes: ERROR TypeError: Cannot freeze array buffer views with elements in NgRx
|
|
116
|
+
export function createPlainObjectFromMotionMasterMessage(motionMasterMessage: MotionMasterMessage) {
|
|
117
|
+
return MotionMasterMessage.toObject(motionMasterMessage, {
|
|
118
|
+
bytes: Array, // Valid values are `Array`
|
|
119
|
+
defaults: true, // Also sets default values on the resulting object
|
|
120
|
+
arrays: true, // Sets empty arrays for missing repeated fields even if `defaults=false`
|
|
121
|
+
objects: true, // Sets empty objects for missing map fields even if `defaults=false`
|
|
122
|
+
oneofs: true, // Includes virtual oneof properties set to the present field's name, if any
|
|
123
|
+
json: true, // Performs additional JSON compatibility conversions, i.e. NaN and Infinity to strings
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function convertMotionMasterMessageToLoggerContext(motionMasterMessage: IMotionMasterMessage, namespace = 'reqResMessage') {
|
|
128
|
+
let type;
|
|
129
|
+
let name;
|
|
130
|
+
|
|
131
|
+
if (motionMasterMessage.request) {
|
|
132
|
+
type = 'request';
|
|
133
|
+
name = Object.keys(motionMasterMessage.request).join();
|
|
134
|
+
} else if (motionMasterMessage.status) {
|
|
135
|
+
type = 'status';
|
|
136
|
+
name = Object.keys(motionMasterMessage.status).join();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return { namespace, motionMasterMessage, type, name };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function decodeTextContent(content: Uint8Array): string {
|
|
143
|
+
const decoder = new TextDecoder();
|
|
144
|
+
const buffer = Uint8Array.from(content);
|
|
145
|
+
return decoder.decode(buffer);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function isRxPdoIndex(index: number): boolean {
|
|
149
|
+
return inRange(index, 0x1600, 0x1800);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function isTxPdoIndex(index: number): boolean {
|
|
153
|
+
return inRange(index, 0x1A00, 0x1C00);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function filterRxPdoParameters<T extends ParameterIndexSubindex>(parameters: T[], excludeSubIndex000 = false): T[] {
|
|
157
|
+
return parameters.filter((p) => isRxPdoIndex(p.index) && (excludeSubIndex000 ? p.subindex > 0 : true)); // RxPDOs: Index area 0x1600 to 0x17FF
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function filterTxPdoParameters<T extends ParameterIndexSubindex>(parameters: T[], excludeSubIndex000 = false): T[] {
|
|
161
|
+
return parameters.filter((p) => isTxPdoIndex(p.index) && (excludeSubIndex000 ? p.subindex > 0 : true)); // TxPDOs: Index area 0x1A00 to 0x1BFF
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function fillPdoParametersWithMappingEntries(parameters: Parameter[], entriesPerPdo = 10): Parameter[] {
|
|
165
|
+
const output: Parameter[] = [];
|
|
166
|
+
let i = 0;
|
|
167
|
+
while (i < parameters.length) {
|
|
168
|
+
if (parameters[i].subindex === 0) {
|
|
169
|
+
let j = i;
|
|
170
|
+
while (parameters[j] && (parameters[j].index === parameters[i].index)) {
|
|
171
|
+
output.push(parameters[j]);
|
|
172
|
+
j++;
|
|
173
|
+
}
|
|
174
|
+
let d = j - i;
|
|
175
|
+
while (d <= entriesPerPdo) {
|
|
176
|
+
output.push({
|
|
177
|
+
index: parameters[i].index,
|
|
178
|
+
subindex: d,
|
|
179
|
+
name: parameters[i].name,
|
|
180
|
+
uintValue: 0,
|
|
181
|
+
value: 0,
|
|
182
|
+
valueType: ValueType.UNSIGNED32,
|
|
183
|
+
group: parameters[i].group,
|
|
184
|
+
typeValue: "uintValue",
|
|
185
|
+
readAccess: true,
|
|
186
|
+
writeAccess: true,
|
|
187
|
+
});
|
|
188
|
+
d++;
|
|
189
|
+
}
|
|
190
|
+
i = j;
|
|
191
|
+
} else {
|
|
192
|
+
i++;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return output;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export function mapParameterToPdoSubItemValue(parameter: Parameter): number {
|
|
199
|
+
const { index, subindex } = parameter;
|
|
200
|
+
if (parameter.valueType && parameter.valueType < ValueType.VISIBLE_STRING) {
|
|
201
|
+
const buffer = new ArrayBuffer(4);
|
|
202
|
+
const view = new DataView(buffer);
|
|
203
|
+
const bitSize = mapValueTypeToBitSize(parameter.valueType);
|
|
204
|
+
view.setUint16(0, index);
|
|
205
|
+
view.setUint8(2, subindex);
|
|
206
|
+
view.setUint8(3, bitSize);
|
|
207
|
+
return view.getUint32(0);
|
|
208
|
+
}
|
|
209
|
+
return 0;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export function mapValueTypeToBitSize(valueType: ValueType): number {
|
|
213
|
+
switch (valueType) {
|
|
214
|
+
case ValueType.UNSPECIFIED:
|
|
215
|
+
return 0;
|
|
216
|
+
case ValueType.BOOLEAN:
|
|
217
|
+
return 1;
|
|
218
|
+
case ValueType.INTEGER8:
|
|
219
|
+
case ValueType.UNSIGNED8:
|
|
220
|
+
return 8;
|
|
221
|
+
case ValueType.INTEGER16:
|
|
222
|
+
case ValueType.UNSIGNED16:
|
|
223
|
+
return 16;
|
|
224
|
+
case ValueType.INTEGER32:
|
|
225
|
+
case ValueType.UNSIGNED32:
|
|
226
|
+
case ValueType.REAL32:
|
|
227
|
+
return 32;
|
|
228
|
+
}
|
|
229
|
+
throw new Error(`Non-numeric value type "${valueType}" (data types with variable length) cannot be mapped to bit size. You will have to get this info from ESI.`);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export const valueTypeToParameterTypeValueKeyMap = new Map<ValueType, keyof Required<ParameterTypeValue>>([
|
|
233
|
+
[ValueType.BOOLEAN, 'uintValue'],
|
|
234
|
+
[ValueType.INTEGER8, 'intValue'],
|
|
235
|
+
[ValueType.INTEGER16, 'intValue'],
|
|
236
|
+
[ValueType.INTEGER32, 'intValue'],
|
|
237
|
+
[ValueType.UNSIGNED8, 'uintValue'],
|
|
238
|
+
[ValueType.UNSIGNED16, 'uintValue'],
|
|
239
|
+
[ValueType.UNSIGNED32, 'uintValue'],
|
|
240
|
+
[ValueType.REAL32, 'floatValue'],
|
|
241
|
+
[ValueType.VISIBLE_STRING, 'stringValue'],
|
|
242
|
+
[ValueType.OCTET_STRING, 'stringValue'],
|
|
243
|
+
[ValueType.UNICODE_STRING, 'stringValue'],
|
|
244
|
+
]);
|
|
245
|
+
|
|
246
|
+
export function isValidDeviceRefObj(obj: DeviceRefObj): boolean {
|
|
247
|
+
return Number.isFinite(Number(obj.deviceAddress))
|
|
248
|
+
|| (typeof obj.devicePosition === 'number' && obj.devicePosition >= 0)
|
|
249
|
+
|| typeof obj.deviceSerialNumber === 'string';
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export function createPdoParameterValues(parameters: Array<{ index: number, subindex: number, typeValue?: ParameterTypeValueKey }>, values: Array<ParameterValueType>) {
|
|
253
|
+
const output = parameters.map((parameter, i, arr) => {
|
|
254
|
+
const { index, subindex, typeValue } = parameter;
|
|
255
|
+
let value = values[i];
|
|
256
|
+
if (subindex === 0) {
|
|
257
|
+
value = arr.reduce((n, p, j) => (p.index === index && p.subindex > 0 && values[j]) ? n + 1 : n, 0);
|
|
258
|
+
}
|
|
259
|
+
return [index, subindex, value, typeValue];
|
|
260
|
+
}) as ParameterAddressValue[];
|
|
261
|
+
|
|
262
|
+
for (let i = 0; i < output.length - 1; i++) {
|
|
263
|
+
const [, subindex1, value1] = output[i];
|
|
264
|
+
if (subindex1 > 0 && value1 === 0) {
|
|
265
|
+
let j = i + 1;
|
|
266
|
+
let [, subindex2, value2] = output[j];
|
|
267
|
+
while (subindex2 > subindex1 && output[j]) {
|
|
268
|
+
if (typeof value2 === 'number' && value2 > 0) {
|
|
269
|
+
output[i][2] = value2;
|
|
270
|
+
output[j][2] = 0;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
if (output[++j]) {
|
|
274
|
+
[, subindex2, value2] = output[j];
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return output;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export function resolveAfter(ms: number, value?: unknown) {
|
|
284
|
+
return new Promise(function (resolve) {
|
|
285
|
+
setTimeout(resolve.bind(null, value), ms);
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export function convertRgbToLedColor(value: number) {
|
|
290
|
+
const r = (value >> 16) & 0xFF;
|
|
291
|
+
const g = (value >> 8) & 0xFF;
|
|
292
|
+
const b = value & 0xFF;
|
|
293
|
+
const ledColorValue = (g << 16) | (r << 8) | b;
|
|
294
|
+
return ledColorValue;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export function createRandomColor(brightness: number) {
|
|
298
|
+
function randomChannel(brightness: number) {
|
|
299
|
+
const r = 255 - brightness;
|
|
300
|
+
const n = 0 | ((Math.random() * r) + brightness);
|
|
301
|
+
const s = n.toString(16);
|
|
302
|
+
return (s.length == 1) ? '0' + s : s;
|
|
303
|
+
}
|
|
304
|
+
return '#' + randomChannel(brightness) + randomChannel(brightness) + randomChannel(brightness);
|
|
305
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"forceConsistentCasingInFileNames": true,
|
|
6
|
+
"strict": true,
|
|
7
|
+
"noImplicitOverride": true,
|
|
8
|
+
"noPropertyAccessFromIndexSignature": true,
|
|
9
|
+
"noImplicitReturns": true,
|
|
10
|
+
"noFallthroughCasesInSwitch": true,
|
|
11
|
+
"allowJs": true
|
|
12
|
+
},
|
|
13
|
+
"files": [],
|
|
14
|
+
"include": [],
|
|
15
|
+
"references": [
|
|
16
|
+
{
|
|
17
|
+
"path": "./tsconfig.lib.json"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"path": "./tsconfig.spec.json"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "../../dist/out-tsc",
|
|
5
|
+
"module": "commonjs",
|
|
6
|
+
"types": ["jest", "node"]
|
|
7
|
+
},
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*.test.ts",
|
|
10
|
+
"**/*.spec.ts",
|
|
11
|
+
"**/*.test.tsx",
|
|
12
|
+
"**/*.spec.tsx",
|
|
13
|
+
"**/*.test.js",
|
|
14
|
+
"**/*.spec.js",
|
|
15
|
+
"**/*.test.jsx",
|
|
16
|
+
"**/*.spec.jsx",
|
|
17
|
+
"**/*.d.ts",
|
|
18
|
+
"jest.config.ts"
|
|
19
|
+
]
|
|
20
|
+
}
|
package/typedoc.json
ADDED
package/src/index.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
|
-
tslib_1.__exportStar(require("./lib/cia402"), exports);
|
|
5
|
-
tslib_1.__exportStar(require("./lib/config-file"), exports);
|
|
6
|
-
tslib_1.__exportStar(require("./lib/device-log-line"), exports);
|
|
7
|
-
tslib_1.__exportStar(require("./lib/device-parameter"), exports);
|
|
8
|
-
tslib_1.__exportStar(require("./lib/device"), exports);
|
|
9
|
-
tslib_1.__exportStar(require("./lib/hardware-description"), exports);
|
|
10
|
-
tslib_1.__exportStar(require("./lib/monitoring-config"), exports);
|
|
11
|
-
tslib_1.__exportStar(require("./lib/monitoring-entry"), exports);
|
|
12
|
-
tslib_1.__exportStar(require("./lib/motion-master-client"), exports);
|
|
13
|
-
tslib_1.__exportStar(require("./lib/motion-master-pub-sub-client"), exports);
|
|
14
|
-
tslib_1.__exportStar(require("./lib/motion-master-pub-sub-socket"), exports);
|
|
15
|
-
tslib_1.__exportStar(require("./lib/motion-master-pub-sub-web-socket"), exports);
|
|
16
|
-
tslib_1.__exportStar(require("./lib/motion-master-pub-sub-worker-socket"), exports);
|
|
17
|
-
tslib_1.__exportStar(require("./lib/motion-master-req-res-client"), exports);
|
|
18
|
-
tslib_1.__exportStar(require("./lib/motion-master-req-res-socket"), exports);
|
|
19
|
-
tslib_1.__exportStar(require("./lib/motion-master-req-res-web-socket"), exports);
|
|
20
|
-
tslib_1.__exportStar(require("./lib/motion-master-req-res-worker-socket"), exports);
|
|
21
|
-
tslib_1.__exportStar(require("./lib/operators"), exports);
|
|
22
|
-
tslib_1.__exportStar(require("./lib/options"), exports);
|
|
23
|
-
tslib_1.__exportStar(require("./lib/parameter"), exports);
|
|
24
|
-
tslib_1.__exportStar(require("./lib/request-status-resolver"), exports);
|
|
25
|
-
tslib_1.__exportStar(require("./lib/system-log-line"), exports);
|
|
26
|
-
tslib_1.__exportStar(require("./lib/types"), exports);
|
|
27
|
-
tslib_1.__exportStar(require("./lib/urls"), exports);
|
|
28
|
-
tslib_1.__exportStar(require("./lib/util"), exports);
|
|
29
|
-
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/motion-master-client/src/index.ts"],"names":[],"mappings":";;;AAAA,uDAA6B;AAC7B,4DAAkC;AAClC,gEAAsC;AACtC,iEAAuC;AACvC,uDAA6B;AAC7B,qEAA2C;AAC3C,kEAAwC;AACxC,iEAAuC;AACvC,qEAA2C;AAC3C,6EAAmD;AACnD,6EAAmD;AACnD,iFAAuD;AACvD,oFAA0D;AAC1D,6EAAmD;AACnD,6EAAmD;AACnD,iFAAuD;AACvD,oFAA0D;AAC1D,0DAAgC;AAChC,wDAA8B;AAC9B,0DAAgC;AAChC,wEAA8C;AAC9C,gEAAsC;AACtC,sDAA4B;AAC5B,qDAA2B;AAC3B,qDAA2B"}
|