dspx 0.1.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/.github/workflows/ci.yml +185 -0
  2. package/.vscode/c_cpp_properties.json +17 -0
  3. package/.vscode/settings.json +68 -0
  4. package/.vscode/tasks.json +28 -0
  5. package/DISCLAIMER.md +32 -0
  6. package/LICENSE +21 -0
  7. package/README.md +1803 -0
  8. package/ROADMAP.md +192 -0
  9. package/TECHNICAL_DEBT.md +165 -0
  10. package/binding.gyp +65 -0
  11. package/docs/ADVANCED_LOGGER_FEATURES.md +598 -0
  12. package/docs/AUTHENTICATION_SECURITY.md +396 -0
  13. package/docs/BACKEND_IMPROVEMENTS.md +399 -0
  14. package/docs/CHEBYSHEV_BIQUAD_EQ_IMPLEMENTATION.md +405 -0
  15. package/docs/FFT_IMPLEMENTATION.md +490 -0
  16. package/docs/FFT_IMPROVEMENTS_SUMMARY.md +387 -0
  17. package/docs/FFT_USER_GUIDE.md +494 -0
  18. package/docs/FILTERS_IMPLEMENTATION.md +260 -0
  19. package/docs/FILTER_API_GUIDE.md +418 -0
  20. package/docs/FIR_SIMD_OPTIMIZATION.md +175 -0
  21. package/docs/LOGGER_API_REFERENCE.md +350 -0
  22. package/docs/NOTCH_FILTER_QUICK_REF.md +121 -0
  23. package/docs/PHASE2_TESTS_AND_NOTCH_FILTER.md +341 -0
  24. package/docs/PHASES_5_7_SUMMARY.md +403 -0
  25. package/docs/PIPELINE_FILTER_INTEGRATION.md +446 -0
  26. package/docs/SIMD_OPTIMIZATIONS.md +211 -0
  27. package/docs/TEST_MIGRATION_SUMMARY.md +173 -0
  28. package/docs/TIMESERIES_IMPLEMENTATION_SUMMARY.md +322 -0
  29. package/docs/TIMESERIES_QUICK_REF.md +85 -0
  30. package/docs/advanced.md +559 -0
  31. package/docs/time-series-guide.md +617 -0
  32. package/docs/time-series-migration.md +376 -0
  33. package/jest.config.js +37 -0
  34. package/package.json +42 -0
  35. package/prebuilds/linux-x64/dsp-ts-redis.node +0 -0
  36. package/prebuilds/win32-x64/dsp-ts-redis.node +0 -0
  37. package/scripts/test.js +24 -0
  38. package/src/build/dsp-ts-redis.node +0 -0
  39. package/src/native/DspPipeline.cc +675 -0
  40. package/src/native/DspPipeline.h +44 -0
  41. package/src/native/FftBindings.cc +817 -0
  42. package/src/native/FilterBindings.cc +1001 -0
  43. package/src/native/IDspStage.h +53 -0
  44. package/src/native/adapters/InterpolatorStage.h +201 -0
  45. package/src/native/adapters/MeanAbsoluteValueStage.h +289 -0
  46. package/src/native/adapters/MovingAverageStage.h +306 -0
  47. package/src/native/adapters/RectifyStage.h +88 -0
  48. package/src/native/adapters/ResamplerStage.h +238 -0
  49. package/src/native/adapters/RmsStage.h +299 -0
  50. package/src/native/adapters/SscStage.h +121 -0
  51. package/src/native/adapters/VarianceStage.h +307 -0
  52. package/src/native/adapters/WampStage.h +114 -0
  53. package/src/native/adapters/WaveformLengthStage.h +115 -0
  54. package/src/native/adapters/ZScoreNormalizeStage.h +326 -0
  55. package/src/native/core/FftEngine.cc +441 -0
  56. package/src/native/core/FftEngine.h +224 -0
  57. package/src/native/core/FirFilter.cc +324 -0
  58. package/src/native/core/FirFilter.h +149 -0
  59. package/src/native/core/IirFilter.cc +576 -0
  60. package/src/native/core/IirFilter.h +210 -0
  61. package/src/native/core/MovingAbsoluteValueFilter.cc +17 -0
  62. package/src/native/core/MovingAbsoluteValueFilter.h +135 -0
  63. package/src/native/core/MovingAverageFilter.cc +18 -0
  64. package/src/native/core/MovingAverageFilter.h +135 -0
  65. package/src/native/core/MovingFftFilter.cc +291 -0
  66. package/src/native/core/MovingFftFilter.h +203 -0
  67. package/src/native/core/MovingVarianceFilter.cc +194 -0
  68. package/src/native/core/MovingVarianceFilter.h +114 -0
  69. package/src/native/core/MovingZScoreFilter.cc +215 -0
  70. package/src/native/core/MovingZScoreFilter.h +113 -0
  71. package/src/native/core/Policies.h +352 -0
  72. package/src/native/core/RmsFilter.cc +18 -0
  73. package/src/native/core/RmsFilter.h +131 -0
  74. package/src/native/core/SscFilter.cc +16 -0
  75. package/src/native/core/SscFilter.h +137 -0
  76. package/src/native/core/WampFilter.cc +16 -0
  77. package/src/native/core/WampFilter.h +101 -0
  78. package/src/native/core/WaveformLengthFilter.cc +17 -0
  79. package/src/native/core/WaveformLengthFilter.h +98 -0
  80. package/src/native/utils/CircularBufferArray.cc +336 -0
  81. package/src/native/utils/CircularBufferArray.h +62 -0
  82. package/src/native/utils/CircularBufferVector.cc +145 -0
  83. package/src/native/utils/CircularBufferVector.h +45 -0
  84. package/src/native/utils/NapiUtils.cc +53 -0
  85. package/src/native/utils/NapiUtils.h +21 -0
  86. package/src/native/utils/SimdOps.h +870 -0
  87. package/src/native/utils/SlidingWindowFilter.cc +239 -0
  88. package/src/native/utils/SlidingWindowFilter.h +159 -0
  89. package/src/native/utils/TimeSeriesBuffer.cc +205 -0
  90. package/src/native/utils/TimeSeriesBuffer.h +140 -0
  91. package/src/ts/CircularLogBuffer.ts +87 -0
  92. package/src/ts/DriftDetector.ts +331 -0
  93. package/src/ts/TopicRouter.ts +428 -0
  94. package/src/ts/__tests__/AdvancedDsp.test.ts +585 -0
  95. package/src/ts/__tests__/AuthAndEdgeCases.test.ts +241 -0
  96. package/src/ts/__tests__/Chaining.test.ts +387 -0
  97. package/src/ts/__tests__/ChebyshevBiquad.test.ts +229 -0
  98. package/src/ts/__tests__/CircularLogBuffer.test.ts +158 -0
  99. package/src/ts/__tests__/DriftDetector.test.ts +389 -0
  100. package/src/ts/__tests__/Fft.test.ts +484 -0
  101. package/src/ts/__tests__/ListState.test.ts +153 -0
  102. package/src/ts/__tests__/Logger.test.ts +208 -0
  103. package/src/ts/__tests__/LoggerAdvanced.test.ts +319 -0
  104. package/src/ts/__tests__/LoggerMinor.test.ts +247 -0
  105. package/src/ts/__tests__/MeanAbsoluteValue.test.ts +398 -0
  106. package/src/ts/__tests__/MovingAverage.test.ts +322 -0
  107. package/src/ts/__tests__/RMS.test.ts +315 -0
  108. package/src/ts/__tests__/Rectify.test.ts +272 -0
  109. package/src/ts/__tests__/Redis.test.ts +456 -0
  110. package/src/ts/__tests__/SlopeSignChange.test.ts +166 -0
  111. package/src/ts/__tests__/Tap.test.ts +164 -0
  112. package/src/ts/__tests__/TimeBasedExpiration.test.ts +124 -0
  113. package/src/ts/__tests__/TimeBasedRmsAndMav.test.ts +231 -0
  114. package/src/ts/__tests__/TimeBasedVarianceAndZScore.test.ts +284 -0
  115. package/src/ts/__tests__/TimeSeries.test.ts +254 -0
  116. package/src/ts/__tests__/TopicRouter.test.ts +332 -0
  117. package/src/ts/__tests__/TopicRouterAdvanced.test.ts +483 -0
  118. package/src/ts/__tests__/TopicRouterPriority.test.ts +487 -0
  119. package/src/ts/__tests__/Variance.test.ts +509 -0
  120. package/src/ts/__tests__/WaveformLength.test.ts +147 -0
  121. package/src/ts/__tests__/WillisonAmplitude.test.ts +197 -0
  122. package/src/ts/__tests__/ZScoreNormalize.test.ts +459 -0
  123. package/src/ts/advanced-dsp.ts +566 -0
  124. package/src/ts/backends.ts +1137 -0
  125. package/src/ts/bindings.ts +1225 -0
  126. package/src/ts/easter-egg.ts +42 -0
  127. package/src/ts/examples/MeanAbsoluteValue/test-state.ts +99 -0
  128. package/src/ts/examples/MeanAbsoluteValue/test-streaming.ts +269 -0
  129. package/src/ts/examples/MovingAverage/test-state.ts +85 -0
  130. package/src/ts/examples/MovingAverage/test-streaming.ts +188 -0
  131. package/src/ts/examples/RMS/test-state.ts +97 -0
  132. package/src/ts/examples/RMS/test-streaming.ts +253 -0
  133. package/src/ts/examples/Rectify/test-state.ts +107 -0
  134. package/src/ts/examples/Rectify/test-streaming.ts +242 -0
  135. package/src/ts/examples/Variance/test-state.ts +195 -0
  136. package/src/ts/examples/Variance/test-streaming.ts +260 -0
  137. package/src/ts/examples/ZScoreNormalize/test-state.ts +277 -0
  138. package/src/ts/examples/ZScoreNormalize/test-streaming.ts +306 -0
  139. package/src/ts/examples/advanced-dsp-examples.ts +397 -0
  140. package/src/ts/examples/callbacks/advanced-router-features.ts +326 -0
  141. package/src/ts/examples/callbacks/benchmark-circular-buffer.ts +109 -0
  142. package/src/ts/examples/callbacks/monitoring-example.ts +265 -0
  143. package/src/ts/examples/callbacks/pipeline-callbacks-example.ts +137 -0
  144. package/src/ts/examples/callbacks/pooled-callbacks-example.ts +274 -0
  145. package/src/ts/examples/callbacks/priority-routing-example.ts +277 -0
  146. package/src/ts/examples/callbacks/production-topic-router.ts +214 -0
  147. package/src/ts/examples/callbacks/topic-based-logging.ts +161 -0
  148. package/src/ts/examples/chaining/test-chaining-redis.ts +113 -0
  149. package/src/ts/examples/chaining/test-chaining.ts +52 -0
  150. package/src/ts/examples/emg-features-example.ts +284 -0
  151. package/src/ts/examples/fft-example.ts +309 -0
  152. package/src/ts/examples/fft-examples.ts +349 -0
  153. package/src/ts/examples/filter-examples.ts +320 -0
  154. package/src/ts/examples/list-state-example.ts +131 -0
  155. package/src/ts/examples/logger-example.ts +91 -0
  156. package/src/ts/examples/notch-filter-examples.ts +243 -0
  157. package/src/ts/examples/phase5/drift-detection-example.ts +290 -0
  158. package/src/ts/examples/phase6-7/production-observability.ts +476 -0
  159. package/src/ts/examples/phase6-7/redis-timeseries-integration.ts +446 -0
  160. package/src/ts/examples/redis/redis-example.ts +202 -0
  161. package/src/ts/examples/redis-example.ts +202 -0
  162. package/src/ts/examples/simd-benchmark.ts +126 -0
  163. package/src/ts/examples/tap-debugging.ts +230 -0
  164. package/src/ts/examples/timeseries/comparison-example.ts +290 -0
  165. package/src/ts/examples/timeseries/iot-sensor-example.ts +143 -0
  166. package/src/ts/examples/timeseries/redis-streaming-example.ts +233 -0
  167. package/src/ts/examples/waveform-length-example.ts +139 -0
  168. package/src/ts/fft.ts +722 -0
  169. package/src/ts/filters.ts +1078 -0
  170. package/src/ts/index.ts +120 -0
  171. package/src/ts/types.ts +589 -0
  172. package/tsconfig.json +15 -0
@@ -0,0 +1,185 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ # Test on Ubuntu with Redis service
11
+ test-ubuntu:
12
+ name: Test on Ubuntu - Node ${{ matrix.node-version }} (with Redis)
13
+ runs-on: ubuntu-latest
14
+
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ node-version: [18.x, 20.x, 22.x]
19
+
20
+ services:
21
+ redis:
22
+ image: redis:7-alpine
23
+ ports:
24
+ - 6379:6379
25
+ options: >-
26
+ --health-cmd "redis-cli ping"
27
+ --health-interval 10s
28
+ --health-timeout 5s
29
+ --health-retries 5
30
+
31
+ steps:
32
+ - name: Checkout code
33
+ uses: actions/checkout@v4
34
+
35
+ - name: Setup Node.js ${{ matrix.node-version }}
36
+ uses: actions/setup-node@v4
37
+ with:
38
+ node-version: ${{ matrix.node-version }}
39
+ cache: "npm"
40
+
41
+ - name: Install build tools
42
+ run: sudo apt-get update && sudo apt-get install -y build-essential python3 redis-tools
43
+
44
+ - name: Install dependencies
45
+ run: npm install
46
+
47
+ - name: Build native addon
48
+ run: npm run build
49
+
50
+ - name: Copy native addon to src/build
51
+ run: |
52
+ mkdir -p src/build
53
+ cp build/Release/dspx.node src/build/
54
+
55
+ - name: Wait for Redis
56
+ run: |
57
+ timeout 30 bash -c 'until redis-cli ping; do sleep 1; done'
58
+ echo "✅ Redis is ready"
59
+
60
+ - name: Run all tests (with Redis integration tests)
61
+ run: npm test
62
+ env:
63
+ REDIS_URL: redis://localhost:6379
64
+
65
+ - name: Generate coverage report
66
+ if: matrix.node-version == '20.x'
67
+ run: npm run test:coverage || echo "⚠️ Coverage not configured"
68
+ continue-on-error: true
69
+
70
+ - name: Upload coverage to Codecov
71
+ if: matrix.node-version == '20.x'
72
+ uses: codecov/codecov-action@v4
73
+ with:
74
+ file: ./coverage/lcov.info
75
+ fail_ci_if_error: false
76
+ env:
77
+ CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
78
+
79
+ # Test on Windows and macOS (Redis optional)
80
+ test-other:
81
+ name: Test on ${{ matrix.os }} - Node ${{ matrix.node-version }}
82
+ runs-on: ${{ matrix.os }}
83
+
84
+ strategy:
85
+ fail-fast: false
86
+ matrix:
87
+ os: [windows-latest, macos-latest]
88
+ node-version: [18.x, 20.x, 22.x]
89
+
90
+ steps:
91
+ - name: Checkout code
92
+ uses: actions/checkout@v4
93
+
94
+ - name: Setup Node.js ${{ matrix.node-version }}
95
+ uses: actions/setup-node@v4
96
+ with:
97
+ node-version: ${{ matrix.node-version }}
98
+ cache: "npm"
99
+
100
+ - name: Setup Redis (macOS)
101
+ if: matrix.os == 'macos-latest'
102
+ run: |
103
+ brew install redis
104
+ brew services start redis
105
+ sleep 2
106
+ continue-on-error: true
107
+
108
+ - name: Install dependencies
109
+ run: npm install
110
+
111
+ - name: Build native addon
112
+ run: npm run build
113
+
114
+ - name: Copy native addon to src/build
115
+ shell: bash
116
+ run: |
117
+ mkdir -p src/build
118
+ cp build/Release/dspx.node src/build/
119
+
120
+ - name: Run all tests (Redis tests will skip if unavailable)
121
+ run: npm test
122
+ env:
123
+ REDIS_URL: redis://localhost:6379
124
+
125
+ prebuild:
126
+ name: Prebuild ${{ matrix.os }}
127
+ runs-on: ${{ matrix.os }}
128
+ needs: [test-ubuntu, test-other]
129
+
130
+ strategy:
131
+ fail-fast: false
132
+ matrix:
133
+ os: [ubuntu-latest, windows-latest, macos-latest]
134
+
135
+ steps:
136
+ - name: Checkout code
137
+ uses: actions/checkout@v4
138
+
139
+ - name: Setup Node.js
140
+ uses: actions/setup-node@v4
141
+ with:
142
+ node-version: 22.x
143
+ cache: "npm"
144
+
145
+ - name: Install build tools (Linux)
146
+ if: ${{ matrix.os == 'ubuntu-latest' }}
147
+ run: sudo apt-get update && sudo apt-get install -y build-essential python3
148
+
149
+ - name: Install dependencies
150
+ run: npm install
151
+
152
+ - name: Build prebuilds
153
+ run: npm run prebuildify
154
+
155
+ - name: Upload prebuilds
156
+ uses: actions/upload-artifact@v4
157
+ with:
158
+ name: prebuilds-${{ matrix.os }}
159
+ path: prebuilds/
160
+ retention-days: 90
161
+
162
+ lint:
163
+ name: Lint and Type Check
164
+ runs-on: ubuntu-latest
165
+
166
+ steps:
167
+ - name: Checkout code
168
+ uses: actions/checkout@v4
169
+
170
+ - name: Setup Node.js
171
+ uses: actions/setup-node@v4
172
+ with:
173
+ node-version: 22.x
174
+ cache: "npm"
175
+
176
+ - name: Install dependencies
177
+ run: npm install
178
+
179
+ - name: Run ESLint (if configured)
180
+ run: npx eslint src --max-warnings=0 || echo "⚠️ ESLint not configured, skipping"
181
+ continue-on-error: true
182
+
183
+ - name: TypeScript type check
184
+ run: npx tsx --noEmit || echo "⚠️ TypeScript check skipped"
185
+ continue-on-error: true
@@ -0,0 +1,17 @@
1
+ {
2
+ "configurations": [
3
+ {
4
+ "name": "Win32",
5
+ "includePath": [
6
+ "${workspaceFolder}/**",
7
+ "${workspaceFolder}/node_modules/node-addon-api"
8
+ ],
9
+ "defines": ["_DEBUG", "UNICODE", "_UNICODE"],
10
+ "windowsSdkVersion": "10.0.19041.0",
11
+ "cStandard": "c17",
12
+ "cppStandard": "c++17",
13
+ "intelliSenseMode": "windows-clang-x64"
14
+ }
15
+ ],
16
+ "version": 4
17
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "files.associations": {
3
+ ".fantomasignore": "ignore",
4
+ "algorithm": "cpp",
5
+ "limits": "cpp",
6
+ "utility": "cpp",
7
+ "xutility": "cpp",
8
+ "vector": "cpp",
9
+ "numeric": "cpp",
10
+ "memory": "cpp",
11
+ "atomic": "cpp",
12
+ "bit": "cpp",
13
+ "cctype": "cpp",
14
+ "charconv": "cpp",
15
+ "clocale": "cpp",
16
+ "cmath": "cpp",
17
+ "compare": "cpp",
18
+ "concepts": "cpp",
19
+ "cstdarg": "cpp",
20
+ "cstddef": "cpp",
21
+ "cstdint": "cpp",
22
+ "cstdio": "cpp",
23
+ "cstdlib": "cpp",
24
+ "cstring": "cpp",
25
+ "ctime": "cpp",
26
+ "cwchar": "cpp",
27
+ "deque": "cpp",
28
+ "exception": "cpp",
29
+ "format": "cpp",
30
+ "functional": "cpp",
31
+ "initializer_list": "cpp",
32
+ "ios": "cpp",
33
+ "iosfwd": "cpp",
34
+ "iostream": "cpp",
35
+ "istream": "cpp",
36
+ "iterator": "cpp",
37
+ "list": "cpp",
38
+ "locale": "cpp",
39
+ "mutex": "cpp",
40
+ "new": "cpp",
41
+ "optional": "cpp",
42
+ "ostream": "cpp",
43
+ "ratio": "cpp",
44
+ "stdexcept": "cpp",
45
+ "stop_token": "cpp",
46
+ "streambuf": "cpp",
47
+ "string": "cpp",
48
+ "system_error": "cpp",
49
+ "thread": "cpp",
50
+ "tuple": "cpp",
51
+ "type_traits": "cpp",
52
+ "typeinfo": "cpp",
53
+ "unordered_map": "cpp",
54
+ "xfacet": "cpp",
55
+ "xhash": "cpp",
56
+ "xiosbase": "cpp",
57
+ "xlocale": "cpp",
58
+ "xlocbuf": "cpp",
59
+ "xlocinfo": "cpp",
60
+ "xlocmes": "cpp",
61
+ "xlocmon": "cpp",
62
+ "xlocnum": "cpp",
63
+ "xloctime": "cpp",
64
+ "xmemory": "cpp",
65
+ "xstring": "cpp",
66
+ "xtr1common": "cpp"
67
+ }
68
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "tasks": [
3
+ {
4
+ "type": "cppbuild",
5
+ "label": "C/C++: cl.exe build active file",
6
+ "command": "cl.exe",
7
+ "args": [
8
+ "/Zi",
9
+ "/EHsc",
10
+ "/nologo",
11
+ "/Fe${fileDirname}\\${fileBasenameNoExtension}.exe",
12
+ "${file}"
13
+ ],
14
+ "options": {
15
+ "cwd": "${fileDirname}"
16
+ },
17
+ "problemMatcher": [
18
+ "$msCompile"
19
+ ],
20
+ "group": {
21
+ "kind": "build",
22
+ "isDefault": true
23
+ },
24
+ "detail": "Task generated by Debugger."
25
+ }
26
+ ],
27
+ "version": "2.0.0"
28
+ }
package/DISCLAIMER.md ADDED
@@ -0,0 +1,32 @@
1
+ # Medical Device Disclaimer
2
+
3
+ **NOT FOR CLINICAL USE**
4
+
5
+ This software is provided for research, development, and educational purposes only.
6
+
7
+ ⚠️ **Important Limitations:**
8
+
9
+ - This library has NOT been validated for medical diagnosis or treatment
10
+ - NOT FDA cleared, CE marked, or approved by any regulatory body
11
+ - NOT intended for use in medical devices or life-critical applications
12
+ - NO clinical validation studies have been performed
13
+ - NOT a substitute for professional medical advice or certified medical equipment
14
+
15
+ **For Developers:**
16
+
17
+ If you intend to use this software in medical devices or clinical applications:
18
+
19
+ - Consult with regulatory experts (FDA, MDR, IEC 62304)
20
+ - Conduct appropriate validation and verification studies
21
+ - Obtain necessary certifications and clearances
22
+ - Implement proper risk management per ISO 14971
23
+
24
+ **Liability:**
25
+
26
+ The authors and contributors assume no liability for any consequences arising
27
+ from the use of this software in medical or life-critical applications.
28
+
29
+ ---
30
+
31
+ For questions about clinical/regulatory use, please consult qualified regulatory
32
+ affairs professionals.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Alan Kochukalam George
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.