recker 1.0.2-0 → 1.0.3

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 (287) hide show
  1. package/LICENSE +0 -2
  2. package/README.md +121 -72
  3. package/dist/cache/memory-storage.d.ts.map +1 -1
  4. package/dist/cache/memory-storage.js +7 -1
  5. package/dist/constants/http-status.d.ts +74 -0
  6. package/dist/constants/http-status.d.ts.map +1 -0
  7. package/dist/constants/http-status.js +156 -0
  8. package/dist/constants.d.ts.map +1 -1
  9. package/dist/constants.js +6 -6
  10. package/dist/cookies/memory-cookie-jar.d.ts +31 -0
  11. package/dist/cookies/memory-cookie-jar.d.ts.map +1 -0
  12. package/dist/cookies/memory-cookie-jar.js +210 -0
  13. package/dist/core/client.d.ts +9 -0
  14. package/dist/core/client.d.ts.map +1 -1
  15. package/dist/core/client.js +252 -53
  16. package/dist/core/errors.d.ts +18 -2
  17. package/dist/core/errors.d.ts.map +1 -1
  18. package/dist/core/errors.js +66 -5
  19. package/dist/core/index.d.ts +6 -0
  20. package/dist/core/index.d.ts.map +1 -0
  21. package/dist/core/index.js +5 -0
  22. package/dist/core/request-promise.d.ts.map +1 -1
  23. package/dist/core/request-promise.js +8 -2
  24. package/dist/core/request.d.ts +7 -1
  25. package/dist/core/request.d.ts.map +1 -1
  26. package/dist/core/request.js +32 -0
  27. package/dist/core/response.d.ts +2 -0
  28. package/dist/core/response.d.ts.map +1 -1
  29. package/dist/core/response.js +44 -19
  30. package/dist/events/request-events.d.ts +48 -0
  31. package/dist/events/request-events.d.ts.map +1 -0
  32. package/dist/events/request-events.js +85 -0
  33. package/dist/index.d.ts +28 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +28 -2
  36. package/dist/mcp/client.d.ts.map +1 -1
  37. package/dist/mcp/client.js +16 -5
  38. package/dist/mcp/contract.d.ts +77 -0
  39. package/dist/mcp/contract.d.ts.map +1 -0
  40. package/dist/mcp/contract.js +278 -0
  41. package/dist/mcp/types.d.ts +1 -0
  42. package/dist/mcp/types.d.ts.map +1 -1
  43. package/dist/plugins/auth.d.ts +45 -0
  44. package/dist/plugins/auth.d.ts.map +1 -0
  45. package/dist/plugins/auth.js +268 -0
  46. package/dist/plugins/cache.d.ts +7 -1
  47. package/dist/plugins/cache.d.ts.map +1 -1
  48. package/dist/plugins/cache.js +470 -49
  49. package/dist/plugins/circuit-breaker.js +1 -1
  50. package/dist/plugins/compression.d.ts.map +1 -1
  51. package/dist/plugins/compression.js +3 -3
  52. package/dist/plugins/dedup.d.ts.map +1 -1
  53. package/dist/plugins/dedup.js +2 -1
  54. package/dist/plugins/graphql.d.ts +4 -3
  55. package/dist/plugins/graphql.d.ts.map +1 -1
  56. package/dist/plugins/graphql.js +24 -5
  57. package/dist/plugins/grpc-web.d.ts +80 -0
  58. package/dist/plugins/grpc-web.d.ts.map +1 -0
  59. package/dist/plugins/grpc-web.js +261 -0
  60. package/dist/plugins/har-player.d.ts.map +1 -1
  61. package/dist/plugins/har-player.js +11 -2
  62. package/dist/plugins/hls.d.ts +33 -0
  63. package/dist/plugins/hls.d.ts.map +1 -0
  64. package/dist/plugins/hls.js +225 -0
  65. package/dist/plugins/http2-push.d.ts +64 -0
  66. package/dist/plugins/http2-push.d.ts.map +1 -0
  67. package/dist/plugins/http2-push.js +274 -0
  68. package/dist/plugins/http3.d.ts +76 -0
  69. package/dist/plugins/http3.d.ts.map +1 -0
  70. package/dist/plugins/http3.js +231 -0
  71. package/dist/plugins/interface-rotator.d.ts +10 -0
  72. package/dist/plugins/interface-rotator.d.ts.map +1 -0
  73. package/dist/plugins/interface-rotator.js +57 -0
  74. package/dist/plugins/jsonrpc.d.ts +76 -0
  75. package/dist/plugins/jsonrpc.d.ts.map +1 -0
  76. package/dist/plugins/jsonrpc.js +143 -0
  77. package/dist/plugins/logger.d.ts +8 -5
  78. package/dist/plugins/logger.d.ts.map +1 -1
  79. package/dist/plugins/logger.js +66 -30
  80. package/dist/plugins/odata.d.ts +182 -0
  81. package/dist/plugins/odata.d.ts.map +1 -0
  82. package/dist/plugins/odata.js +561 -0
  83. package/dist/plugins/retry.d.ts +1 -0
  84. package/dist/plugins/retry.d.ts.map +1 -1
  85. package/dist/plugins/retry.js +26 -2
  86. package/dist/plugins/scrape.d.ts +22 -0
  87. package/dist/plugins/scrape.d.ts.map +1 -0
  88. package/dist/plugins/scrape.js +87 -0
  89. package/dist/plugins/soap.d.ts +73 -0
  90. package/dist/plugins/soap.d.ts.map +1 -0
  91. package/dist/plugins/soap.js +347 -0
  92. package/dist/plugins/user-agent.d.ts +8 -0
  93. package/dist/plugins/user-agent.d.ts.map +1 -0
  94. package/dist/plugins/user-agent.js +46 -0
  95. package/dist/plugins/xml.d.ts +10 -0
  96. package/dist/plugins/xml.d.ts.map +1 -0
  97. package/dist/plugins/xml.js +194 -0
  98. package/dist/presets/anthropic.d.ts +7 -0
  99. package/dist/presets/anthropic.d.ts.map +1 -0
  100. package/dist/presets/anthropic.js +17 -0
  101. package/dist/presets/azure-openai.d.ts +9 -0
  102. package/dist/presets/azure-openai.d.ts.map +1 -0
  103. package/dist/presets/azure-openai.js +25 -0
  104. package/dist/presets/cloudflare.d.ts +13 -0
  105. package/dist/presets/cloudflare.d.ts.map +1 -0
  106. package/dist/presets/cloudflare.js +39 -0
  107. package/dist/presets/cohere.d.ts +6 -0
  108. package/dist/presets/cohere.d.ts.map +1 -0
  109. package/dist/presets/cohere.js +16 -0
  110. package/dist/presets/deepseek.d.ts +6 -0
  111. package/dist/presets/deepseek.d.ts.map +1 -0
  112. package/dist/presets/deepseek.js +16 -0
  113. package/dist/presets/digitalocean.d.ts +6 -0
  114. package/dist/presets/digitalocean.d.ts.map +1 -0
  115. package/dist/presets/digitalocean.js +16 -0
  116. package/dist/presets/discord.d.ts +7 -0
  117. package/dist/presets/discord.d.ts.map +1 -0
  118. package/dist/presets/discord.js +17 -0
  119. package/dist/presets/fireworks.d.ts +6 -0
  120. package/dist/presets/fireworks.d.ts.map +1 -0
  121. package/dist/presets/fireworks.js +16 -0
  122. package/dist/presets/gemini.d.ts +6 -0
  123. package/dist/presets/gemini.d.ts.map +1 -0
  124. package/dist/presets/gemini.js +16 -0
  125. package/dist/presets/github.d.ts +7 -0
  126. package/dist/presets/github.d.ts.map +1 -0
  127. package/dist/presets/github.js +17 -0
  128. package/dist/presets/gitlab.d.ts +7 -0
  129. package/dist/presets/gitlab.d.ts.map +1 -0
  130. package/dist/presets/gitlab.js +16 -0
  131. package/dist/presets/groq.d.ts +6 -0
  132. package/dist/presets/groq.d.ts.map +1 -0
  133. package/dist/presets/groq.js +16 -0
  134. package/dist/presets/huggingface.d.ts +6 -0
  135. package/dist/presets/huggingface.d.ts.map +1 -0
  136. package/dist/presets/huggingface.js +16 -0
  137. package/dist/presets/index.d.ts +28 -0
  138. package/dist/presets/index.d.ts.map +1 -0
  139. package/dist/presets/index.js +27 -0
  140. package/dist/presets/linear.d.ts +6 -0
  141. package/dist/presets/linear.d.ts.map +1 -0
  142. package/dist/presets/linear.js +16 -0
  143. package/dist/presets/mistral.d.ts +6 -0
  144. package/dist/presets/mistral.d.ts.map +1 -0
  145. package/dist/presets/mistral.js +16 -0
  146. package/dist/presets/notion.d.ts +7 -0
  147. package/dist/presets/notion.d.ts.map +1 -0
  148. package/dist/presets/notion.js +17 -0
  149. package/dist/presets/openai.d.ts +8 -0
  150. package/dist/presets/openai.d.ts.map +1 -0
  151. package/dist/presets/openai.js +23 -0
  152. package/dist/presets/perplexity.d.ts +6 -0
  153. package/dist/presets/perplexity.d.ts.map +1 -0
  154. package/dist/presets/perplexity.js +16 -0
  155. package/dist/presets/registry.d.ts +20 -0
  156. package/dist/presets/registry.d.ts.map +1 -0
  157. package/dist/presets/registry.js +311 -0
  158. package/dist/presets/replicate.d.ts +6 -0
  159. package/dist/presets/replicate.d.ts.map +1 -0
  160. package/dist/presets/replicate.js +16 -0
  161. package/dist/presets/slack.d.ts +6 -0
  162. package/dist/presets/slack.d.ts.map +1 -0
  163. package/dist/presets/slack.js +16 -0
  164. package/dist/presets/stripe.d.ts +8 -0
  165. package/dist/presets/stripe.d.ts.map +1 -0
  166. package/dist/presets/stripe.js +23 -0
  167. package/dist/presets/supabase.d.ts +7 -0
  168. package/dist/presets/supabase.d.ts.map +1 -0
  169. package/dist/presets/supabase.js +18 -0
  170. package/dist/presets/together.d.ts +6 -0
  171. package/dist/presets/together.d.ts.map +1 -0
  172. package/dist/presets/together.js +16 -0
  173. package/dist/presets/twilio.d.ts +7 -0
  174. package/dist/presets/twilio.d.ts.map +1 -0
  175. package/dist/presets/twilio.js +17 -0
  176. package/dist/presets/vercel.d.ts +7 -0
  177. package/dist/presets/vercel.d.ts.map +1 -0
  178. package/dist/presets/vercel.js +23 -0
  179. package/dist/presets/xai.d.ts +7 -0
  180. package/dist/presets/xai.d.ts.map +1 -0
  181. package/dist/presets/xai.js +17 -0
  182. package/dist/protocols/ftp.d.ts +63 -0
  183. package/dist/protocols/ftp.d.ts.map +1 -0
  184. package/dist/protocols/ftp.js +388 -0
  185. package/dist/protocols/index.d.ts +4 -0
  186. package/dist/protocols/index.d.ts.map +1 -0
  187. package/dist/protocols/index.js +3 -0
  188. package/dist/protocols/sftp.d.ts +65 -0
  189. package/dist/protocols/sftp.d.ts.map +1 -0
  190. package/dist/protocols/sftp.js +346 -0
  191. package/dist/protocols/telnet.d.ts +50 -0
  192. package/dist/protocols/telnet.d.ts.map +1 -0
  193. package/dist/protocols/telnet.js +139 -0
  194. package/dist/runner/request-runner.d.ts.map +1 -1
  195. package/dist/runner/request-runner.js +1 -0
  196. package/dist/scrape/document.d.ts +44 -0
  197. package/dist/scrape/document.d.ts.map +1 -0
  198. package/dist/scrape/document.js +198 -0
  199. package/dist/scrape/element.d.ts +50 -0
  200. package/dist/scrape/element.d.ts.map +1 -0
  201. package/dist/scrape/element.js +176 -0
  202. package/dist/scrape/extractors.d.ts +17 -0
  203. package/dist/scrape/extractors.d.ts.map +1 -0
  204. package/dist/scrape/extractors.js +356 -0
  205. package/dist/scrape/index.d.ts +5 -0
  206. package/dist/scrape/index.d.ts.map +1 -0
  207. package/dist/scrape/index.js +3 -0
  208. package/dist/scrape/types.d.ts +108 -0
  209. package/dist/scrape/types.d.ts.map +1 -0
  210. package/dist/scrape/types.js +1 -0
  211. package/dist/testing/index.d.ts +3 -0
  212. package/dist/testing/index.d.ts.map +1 -0
  213. package/dist/testing/index.js +1 -0
  214. package/dist/testing/mock.d.ts +58 -0
  215. package/dist/testing/mock.d.ts.map +1 -0
  216. package/dist/testing/mock.js +252 -0
  217. package/dist/transport/fetch.d.ts.map +1 -1
  218. package/dist/transport/fetch.js +12 -4
  219. package/dist/transport/undici.d.ts +17 -1
  220. package/dist/transport/undici.d.ts.map +1 -1
  221. package/dist/transport/undici.js +708 -47
  222. package/dist/types/index.d.ts +111 -10
  223. package/dist/types/index.d.ts.map +1 -1
  224. package/dist/types/index.js +1 -1
  225. package/dist/types/logger.d.ts +17 -0
  226. package/dist/types/logger.d.ts.map +1 -0
  227. package/dist/types/logger.js +66 -0
  228. package/dist/utils/agent-manager.d.ts.map +1 -1
  229. package/dist/utils/agent-manager.js +20 -4
  230. package/dist/utils/body.d.ts.map +1 -1
  231. package/dist/utils/body.js +14 -2
  232. package/dist/utils/charset.d.ts +16 -0
  233. package/dist/utils/charset.d.ts.map +1 -0
  234. package/dist/utils/charset.js +169 -0
  235. package/dist/utils/client-pool.d.ts +21 -0
  236. package/dist/utils/client-pool.d.ts.map +1 -0
  237. package/dist/utils/client-pool.js +49 -0
  238. package/dist/utils/concurrency.d.ts.map +1 -1
  239. package/dist/utils/concurrency.js +8 -4
  240. package/dist/utils/dns-toolkit.d.ts +13 -0
  241. package/dist/utils/dns-toolkit.d.ts.map +1 -0
  242. package/dist/utils/dns-toolkit.js +48 -0
  243. package/dist/utils/doh.d.ts.map +1 -1
  244. package/dist/utils/doh.js +16 -3
  245. package/dist/utils/download.d.ts +15 -0
  246. package/dist/utils/download.d.ts.map +1 -0
  247. package/dist/utils/download.js +44 -0
  248. package/dist/utils/env-proxy.d.ts +13 -0
  249. package/dist/utils/env-proxy.d.ts.map +1 -0
  250. package/dist/utils/env-proxy.js +105 -0
  251. package/dist/utils/header-parser.d.ts +15 -1
  252. package/dist/utils/header-parser.d.ts.map +1 -1
  253. package/dist/utils/header-parser.js +161 -1
  254. package/dist/utils/link-header.d.ts +70 -0
  255. package/dist/utils/link-header.d.ts.map +1 -0
  256. package/dist/utils/link-header.js +190 -0
  257. package/dist/utils/progress.d.ts +7 -2
  258. package/dist/utils/progress.d.ts.map +1 -1
  259. package/dist/utils/progress.js +48 -15
  260. package/dist/utils/rdap.d.ts +17 -0
  261. package/dist/utils/rdap.d.ts.map +1 -0
  262. package/dist/utils/rdap.js +32 -0
  263. package/dist/utils/request-pool.d.ts.map +1 -1
  264. package/dist/utils/request-pool.js +4 -3
  265. package/dist/utils/sse.d.ts.map +1 -1
  266. package/dist/utils/sse.js +8 -2
  267. package/dist/utils/status-codes.d.ts +84 -0
  268. package/dist/utils/status-codes.d.ts.map +1 -0
  269. package/dist/utils/status-codes.js +204 -0
  270. package/dist/utils/streaming.d.ts.map +1 -1
  271. package/dist/utils/streaming.js +1 -0
  272. package/dist/utils/tls-inspector.d.ts +21 -0
  273. package/dist/utils/tls-inspector.d.ts.map +1 -0
  274. package/dist/utils/tls-inspector.js +39 -0
  275. package/dist/utils/try-fn.d.ts.map +1 -1
  276. package/dist/utils/try-fn.js +11 -5
  277. package/dist/utils/upload.d.ts +1 -0
  278. package/dist/utils/upload.d.ts.map +1 -1
  279. package/dist/utils/upload.js +20 -3
  280. package/dist/utils/user-agent.d.ts +9 -9
  281. package/dist/utils/user-agent.js +9 -9
  282. package/dist/utils/whois.d.ts.map +1 -1
  283. package/dist/utils/whois.js +11 -2
  284. package/dist/websocket/client.d.ts +29 -1
  285. package/dist/websocket/client.d.ts.map +1 -1
  286. package/dist/websocket/client.js +145 -13
  287. package/package.json +45 -8
@@ -0,0 +1,346 @@
1
+ import SFTPClient from 'ssh2-sftp-client';
2
+ export class SFTP {
3
+ client;
4
+ config;
5
+ connected = false;
6
+ constructor(config) {
7
+ this.config = config;
8
+ this.client = new SFTPClient();
9
+ }
10
+ async connect() {
11
+ try {
12
+ const options = {
13
+ host: this.config.host,
14
+ port: this.config.port ?? 22,
15
+ username: this.config.username,
16
+ password: this.config.password,
17
+ privateKey: this.config.privateKey,
18
+ passphrase: this.config.passphrase,
19
+ readyTimeout: this.config.readyTimeout ?? 20000,
20
+ retries: this.config.retries ?? 1,
21
+ retry_factor: this.config.retry_factor ?? 2,
22
+ retry_minTimeout: this.config.retry_minTimeout ?? 2000,
23
+ };
24
+ await this.client.connect(options);
25
+ this.connected = true;
26
+ return {
27
+ success: true,
28
+ message: 'Connected successfully'
29
+ };
30
+ }
31
+ catch (error) {
32
+ return {
33
+ success: false,
34
+ message: error instanceof Error ? error.message : 'Connection failed'
35
+ };
36
+ }
37
+ }
38
+ isConnected() {
39
+ return this.connected;
40
+ }
41
+ async list(remotePath = '/') {
42
+ this.ensureConnected();
43
+ try {
44
+ const files = await this.client.list(remotePath);
45
+ const items = files.map((file) => ({
46
+ name: file.name,
47
+ type: this.mapFileType(file.type),
48
+ size: file.size,
49
+ modifyTime: file.modifyTime,
50
+ accessTime: file.accessTime,
51
+ rights: file.rights,
52
+ owner: file.owner,
53
+ group: file.group
54
+ }));
55
+ return {
56
+ success: true,
57
+ data: items
58
+ };
59
+ }
60
+ catch (error) {
61
+ return {
62
+ success: false,
63
+ message: error instanceof Error ? error.message : 'List failed'
64
+ };
65
+ }
66
+ }
67
+ async exists(remotePath) {
68
+ this.ensureConnected();
69
+ try {
70
+ return await this.client.exists(remotePath);
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }
76
+ async stat(remotePath) {
77
+ this.ensureConnected();
78
+ try {
79
+ const stats = await this.client.stat(remotePath);
80
+ return {
81
+ success: true,
82
+ data: stats
83
+ };
84
+ }
85
+ catch (error) {
86
+ return {
87
+ success: false,
88
+ message: error instanceof Error ? error.message : 'Stat failed'
89
+ };
90
+ }
91
+ }
92
+ async download(remotePath, localPath) {
93
+ this.ensureConnected();
94
+ try {
95
+ await this.client.fastGet(remotePath, localPath);
96
+ return {
97
+ success: true,
98
+ message: `Downloaded ${remotePath} to ${localPath}`
99
+ };
100
+ }
101
+ catch (error) {
102
+ return {
103
+ success: false,
104
+ message: error instanceof Error ? error.message : 'Download failed'
105
+ };
106
+ }
107
+ }
108
+ async downloadToStream(remotePath, stream) {
109
+ this.ensureConnected();
110
+ try {
111
+ await this.client.get(remotePath, stream);
112
+ return {
113
+ success: true,
114
+ message: `Downloaded ${remotePath}`
115
+ };
116
+ }
117
+ catch (error) {
118
+ return {
119
+ success: false,
120
+ message: error instanceof Error ? error.message : 'Download failed'
121
+ };
122
+ }
123
+ }
124
+ async downloadToBuffer(remotePath) {
125
+ this.ensureConnected();
126
+ try {
127
+ const data = await this.client.get(remotePath);
128
+ if (Buffer.isBuffer(data)) {
129
+ return {
130
+ success: true,
131
+ data
132
+ };
133
+ }
134
+ return {
135
+ success: true,
136
+ data: Buffer.from(data)
137
+ };
138
+ }
139
+ catch (error) {
140
+ return {
141
+ success: false,
142
+ message: error instanceof Error ? error.message : 'Download failed'
143
+ };
144
+ }
145
+ }
146
+ async upload(localPath, remotePath) {
147
+ this.ensureConnected();
148
+ try {
149
+ await this.client.fastPut(localPath, remotePath);
150
+ return {
151
+ success: true,
152
+ message: `Uploaded ${localPath} to ${remotePath}`
153
+ };
154
+ }
155
+ catch (error) {
156
+ return {
157
+ success: false,
158
+ message: error instanceof Error ? error.message : 'Upload failed'
159
+ };
160
+ }
161
+ }
162
+ async uploadFromStream(stream, remotePath) {
163
+ this.ensureConnected();
164
+ try {
165
+ await this.client.put(stream, remotePath);
166
+ return {
167
+ success: true,
168
+ message: `Uploaded to ${remotePath}`
169
+ };
170
+ }
171
+ catch (error) {
172
+ return {
173
+ success: false,
174
+ message: error instanceof Error ? error.message : 'Upload failed'
175
+ };
176
+ }
177
+ }
178
+ async uploadFromBuffer(data, remotePath) {
179
+ this.ensureConnected();
180
+ try {
181
+ await this.client.put(Buffer.from(data), remotePath);
182
+ return {
183
+ success: true,
184
+ message: `Uploaded to ${remotePath}`
185
+ };
186
+ }
187
+ catch (error) {
188
+ return {
189
+ success: false,
190
+ message: error instanceof Error ? error.message : 'Upload failed'
191
+ };
192
+ }
193
+ }
194
+ async delete(remotePath) {
195
+ this.ensureConnected();
196
+ try {
197
+ await this.client.delete(remotePath);
198
+ return {
199
+ success: true,
200
+ message: `Deleted ${remotePath}`
201
+ };
202
+ }
203
+ catch (error) {
204
+ return {
205
+ success: false,
206
+ message: error instanceof Error ? error.message : 'Delete failed'
207
+ };
208
+ }
209
+ }
210
+ async mkdir(remotePath, recursive = true) {
211
+ this.ensureConnected();
212
+ try {
213
+ await this.client.mkdir(remotePath, recursive);
214
+ return {
215
+ success: true,
216
+ message: `Created directory ${remotePath}`
217
+ };
218
+ }
219
+ catch (error) {
220
+ return {
221
+ success: false,
222
+ message: error instanceof Error ? error.message : 'Mkdir failed'
223
+ };
224
+ }
225
+ }
226
+ async rmdir(remotePath, recursive = false) {
227
+ this.ensureConnected();
228
+ try {
229
+ await this.client.rmdir(remotePath, recursive);
230
+ return {
231
+ success: true,
232
+ message: `Removed directory ${remotePath}`
233
+ };
234
+ }
235
+ catch (error) {
236
+ return {
237
+ success: false,
238
+ message: error instanceof Error ? error.message : 'Rmdir failed'
239
+ };
240
+ }
241
+ }
242
+ async rename(oldPath, newPath) {
243
+ this.ensureConnected();
244
+ try {
245
+ await this.client.rename(oldPath, newPath);
246
+ return {
247
+ success: true,
248
+ message: `Renamed ${oldPath} to ${newPath}`
249
+ };
250
+ }
251
+ catch (error) {
252
+ return {
253
+ success: false,
254
+ message: error instanceof Error ? error.message : 'Rename failed'
255
+ };
256
+ }
257
+ }
258
+ async chmod(remotePath, mode) {
259
+ this.ensureConnected();
260
+ try {
261
+ await this.client.chmod(remotePath, mode);
262
+ return {
263
+ success: true,
264
+ message: `Changed permissions of ${remotePath}`
265
+ };
266
+ }
267
+ catch (error) {
268
+ return {
269
+ success: false,
270
+ message: error instanceof Error ? error.message : 'Chmod failed'
271
+ };
272
+ }
273
+ }
274
+ async pwd() {
275
+ this.ensureConnected();
276
+ try {
277
+ const dir = await this.client.cwd();
278
+ return {
279
+ success: true,
280
+ data: dir
281
+ };
282
+ }
283
+ catch (error) {
284
+ return {
285
+ success: false,
286
+ message: error instanceof Error ? error.message : 'PWD failed'
287
+ };
288
+ }
289
+ }
290
+ async append(data, remotePath) {
291
+ this.ensureConnected();
292
+ try {
293
+ await this.client.append(Buffer.from(data), remotePath);
294
+ return {
295
+ success: true,
296
+ message: `Appended to ${remotePath}`
297
+ };
298
+ }
299
+ catch (error) {
300
+ return {
301
+ success: false,
302
+ message: error instanceof Error ? error.message : 'Append failed'
303
+ };
304
+ }
305
+ }
306
+ async close() {
307
+ this.connected = false;
308
+ await this.client.end();
309
+ }
310
+ getClient() {
311
+ return this.client;
312
+ }
313
+ ensureConnected() {
314
+ if (!this.connected) {
315
+ throw new Error('Not connected to SFTP server. Call connect() first.');
316
+ }
317
+ }
318
+ mapFileType(type) {
319
+ switch (type) {
320
+ case '-':
321
+ return 'file';
322
+ case 'd':
323
+ return 'directory';
324
+ case 'l':
325
+ return 'link';
326
+ default:
327
+ return 'unknown';
328
+ }
329
+ }
330
+ }
331
+ export function createSFTP(config) {
332
+ return new SFTP(config);
333
+ }
334
+ export async function sftp(config, operation) {
335
+ const client = createSFTP(config);
336
+ try {
337
+ const result = await client.connect();
338
+ if (!result.success) {
339
+ throw new Error(result.message || 'Failed to connect to SFTP server');
340
+ }
341
+ return await operation(client);
342
+ }
343
+ finally {
344
+ await client.close();
345
+ }
346
+ }
@@ -0,0 +1,50 @@
1
+ import { Telnet as TelnetClient } from 'telnet-client';
2
+ export interface TelnetConfig {
3
+ host: string;
4
+ port?: number;
5
+ timeout?: number;
6
+ shellPrompt?: string | RegExp;
7
+ loginPrompt?: string | RegExp;
8
+ passwordPrompt?: string | RegExp;
9
+ username?: string;
10
+ password?: string;
11
+ initialLFCR?: boolean;
12
+ pageSeparator?: string | RegExp;
13
+ negotiationMandatory?: boolean;
14
+ execTimeout?: number;
15
+ sendTimeout?: number;
16
+ maxBufferLength?: number;
17
+ debug?: boolean;
18
+ }
19
+ export interface TelnetResponse<T = void> {
20
+ success: boolean;
21
+ data?: T;
22
+ message?: string;
23
+ }
24
+ export interface TelnetExecOptions {
25
+ shellPrompt?: string | RegExp;
26
+ timeout?: number;
27
+ sendTimeout?: number;
28
+ }
29
+ export declare class Telnet {
30
+ private client;
31
+ private config;
32
+ private connected;
33
+ constructor(config: TelnetConfig);
34
+ connect(): Promise<TelnetResponse>;
35
+ isConnected(): boolean;
36
+ exec(command: string, options?: TelnetExecOptions): Promise<TelnetResponse<string>>;
37
+ send(data: string, options?: {
38
+ timeout?: number;
39
+ waitFor?: string | RegExp;
40
+ }): Promise<TelnetResponse<string>>;
41
+ shell(command: string): Promise<TelnetResponse<string>>;
42
+ waitFor(pattern: string | RegExp, timeout?: number): Promise<TelnetResponse<string>>;
43
+ getClient(): TelnetClient;
44
+ close(): Promise<void>;
45
+ destroy(): void;
46
+ private ensureConnected;
47
+ }
48
+ export declare function createTelnet(config: TelnetConfig): Telnet;
49
+ export declare function telnet<T>(config: TelnetConfig, operation: (client: Telnet) => Promise<T>): Promise<T>;
50
+ //# sourceMappingURL=telnet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telnet.d.ts","sourceRoot":"","sources":["../../src/protocols/telnet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,IAAI;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqBD,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,EAAE,YAAY;IAQ1B,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;IAsCxC,WAAW,IAAI,OAAO;IAOhB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAiCnF,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAqB9G,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAOvD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAqB1F,SAAS,IAAI,YAAY;IAOnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,eAAe;CAKxB;AAaD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEzD;AAmBD,wBAAsB,MAAM,CAAC,CAAC,EAC5B,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAaZ"}
@@ -0,0 +1,139 @@
1
+ import { Telnet as TelnetClient } from 'telnet-client';
2
+ export class Telnet {
3
+ client;
4
+ config;
5
+ connected = false;
6
+ constructor(config) {
7
+ this.config = config;
8
+ this.client = new TelnetClient();
9
+ }
10
+ async connect() {
11
+ try {
12
+ const params = {
13
+ host: this.config.host,
14
+ port: this.config.port ?? 23,
15
+ timeout: this.config.timeout ?? 10000,
16
+ shellPrompt: this.config.shellPrompt ?? /[$#>]\s*$/,
17
+ loginPrompt: this.config.loginPrompt ?? /login[: ]*$/i,
18
+ passwordPrompt: this.config.passwordPrompt ?? /password[: ]*$/i,
19
+ username: this.config.username,
20
+ password: this.config.password,
21
+ initialLFCR: this.config.initialLFCR ?? true,
22
+ pageSeparator: this.config.pageSeparator,
23
+ negotiationMandatory: this.config.negotiationMandatory ?? false,
24
+ execTimeout: this.config.execTimeout ?? 5000,
25
+ sendTimeout: this.config.sendTimeout ?? 2000,
26
+ maxBufferLength: this.config.maxBufferLength ?? 1024 * 1024,
27
+ debug: this.config.debug ?? false,
28
+ };
29
+ await this.client.connect(params);
30
+ this.connected = true;
31
+ return {
32
+ success: true,
33
+ message: 'Connected successfully'
34
+ };
35
+ }
36
+ catch (error) {
37
+ return {
38
+ success: false,
39
+ message: error instanceof Error ? error.message : 'Connection failed'
40
+ };
41
+ }
42
+ }
43
+ isConnected() {
44
+ return this.connected;
45
+ }
46
+ async exec(command, options) {
47
+ this.ensureConnected();
48
+ try {
49
+ const execOptions = {};
50
+ if (options?.shellPrompt) {
51
+ execOptions.shellPrompt = options.shellPrompt;
52
+ }
53
+ if (options?.timeout) {
54
+ execOptions.timeout = options.timeout;
55
+ }
56
+ if (options?.sendTimeout) {
57
+ execOptions.sendTimeout = options.sendTimeout;
58
+ }
59
+ const result = await this.client.exec(command, execOptions);
60
+ return {
61
+ success: true,
62
+ data: result
63
+ };
64
+ }
65
+ catch (error) {
66
+ return {
67
+ success: false,
68
+ message: error instanceof Error ? error.message : 'Exec failed'
69
+ };
70
+ }
71
+ }
72
+ async send(data, options) {
73
+ this.ensureConnected();
74
+ try {
75
+ const result = await this.client.send(data, options);
76
+ return {
77
+ success: true,
78
+ data: result
79
+ };
80
+ }
81
+ catch (error) {
82
+ return {
83
+ success: false,
84
+ message: error instanceof Error ? error.message : 'Send failed'
85
+ };
86
+ }
87
+ }
88
+ async shell(command) {
89
+ return this.exec(command);
90
+ }
91
+ async waitFor(pattern, timeout) {
92
+ this.ensureConnected();
93
+ try {
94
+ const result = await this.client.send('', { waitFor: pattern, timeout });
95
+ return {
96
+ success: true,
97
+ data: result
98
+ };
99
+ }
100
+ catch (error) {
101
+ return {
102
+ success: false,
103
+ message: error instanceof Error ? error.message : 'WaitFor failed'
104
+ };
105
+ }
106
+ }
107
+ getClient() {
108
+ return this.client;
109
+ }
110
+ async close() {
111
+ this.connected = false;
112
+ await this.client.end();
113
+ }
114
+ destroy() {
115
+ this.connected = false;
116
+ this.client.destroy();
117
+ }
118
+ ensureConnected() {
119
+ if (!this.connected) {
120
+ throw new Error('Not connected to Telnet server. Call connect() first.');
121
+ }
122
+ }
123
+ }
124
+ export function createTelnet(config) {
125
+ return new Telnet(config);
126
+ }
127
+ export async function telnet(config, operation) {
128
+ const client = createTelnet(config);
129
+ try {
130
+ const result = await client.connect();
131
+ if (!result.success) {
132
+ throw new Error(result.message || 'Failed to connect to Telnet server');
133
+ }
134
+ return await operation(client);
135
+ }
136
+ finally {
137
+ await client.close();
138
+ }
139
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"request-runner.d.ts","sourceRoot":"","sources":["../../src/runner/request-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,OAAO,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;IACvB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,SAAS,CAAa;gBAElB,OAAO,GAAE,aAAkB;IAKhC,GAAG,CAAC,CAAC,EACV,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/C,IAAI;IAWM,GAAG,CAAC,CAAC,EAChB,KAAK,EAAE,GAAG,EAAE,EACZ,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnD,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAClC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YA+Bb,WAAW;IA8BlB,WAAW;;;;;;;CAUnB"}
1
+ {"version":3,"file":"request-runner.d.ts","sourceRoot":"","sources":["../../src/runner/request-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,OAAO,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;IACvB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,SAAS,CAAa;gBAElB,OAAO,GAAE,aAAkB;IAKhC,GAAG,CAAC,CAAC,EACV,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/C,IAAI;IAWM,GAAG,CAAC,CAAC,EAChB,KAAK,EAAE,GAAG,EAAE,EACZ,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnD,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAClC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YA+Bb,WAAW;IA+BlB,WAAW;;;;;;;CAUnB"}
@@ -64,6 +64,7 @@ export class RequestRunner extends EventEmitter {
64
64
  this.emit('taskComplete', { task, result });
65
65
  }
66
66
  catch (error) {
67
+ console.error('[RequestRunner Debug]', error);
67
68
  this.stats.failed++;
68
69
  this.emit('taskError', { task, error });
69
70
  }
@@ -0,0 +1,44 @@
1
+ import { type CheerioAPI } from 'cheerio';
2
+ import { ScrapeElement } from './element.js';
3
+ import type { ScrapeOptions, ExtractionSchema, ExtractedLink, ExtractedImage, ExtractedMeta, OpenGraphData, TwitterCardData, JsonLdData, ExtractedForm, ExtractedTable, ExtractedScript, ExtractedStyle, LinkExtractionOptions, ImageExtractionOptions } from './types.js';
4
+ export declare class ScrapeDocument {
5
+ private $;
6
+ private options;
7
+ constructor(html: string, options?: ScrapeOptions);
8
+ select(selector: string): ScrapeElement;
9
+ selectFirst(selector: string): ScrapeElement;
10
+ selectAll(selector: string): ScrapeElement[];
11
+ query(selector: string): ScrapeElement;
12
+ queryAll(selector: string): ScrapeElement[];
13
+ text(selector: string): string;
14
+ texts(selector: string): string[];
15
+ attr(selector: string, attribute: string): string | undefined;
16
+ attrs(selector: string, attribute: string): string[];
17
+ innerHtml(selector: string): string | null;
18
+ outerHtml(selector: string): string;
19
+ links(options?: LinkExtractionOptions): ExtractedLink[];
20
+ images(options?: ImageExtractionOptions): ExtractedImage[];
21
+ meta(): ExtractedMeta;
22
+ openGraph(): OpenGraphData;
23
+ twitterCard(): TwitterCardData;
24
+ jsonLd(): JsonLdData[];
25
+ forms(selector?: string): ExtractedForm[];
26
+ tables(selector?: string): ExtractedTable[];
27
+ scripts(): ExtractedScript[];
28
+ styles(): ExtractedStyle[];
29
+ extract<T extends Record<string, unknown>>(schema: ExtractionSchema): T;
30
+ private extractField;
31
+ title(): string | undefined;
32
+ body(): ScrapeElement;
33
+ head(): ScrapeElement;
34
+ html(): string;
35
+ root(): ScrapeElement;
36
+ exists(selector: string): boolean;
37
+ count(selector: string): number;
38
+ findByText(text: string, selector?: string): ScrapeElement[];
39
+ findByExactText(text: string, selector?: string): ScrapeElement[];
40
+ findByData(name: string, value?: string): ScrapeElement[];
41
+ get raw(): CheerioAPI;
42
+ get baseUrl(): string | undefined;
43
+ }
44
+ //# sourceMappingURL=document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/scrape/document.ts"],"names":[],"mappings":"AAMA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAa7C,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAEhB,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,UAAU,EACV,aAAa,EACb,cAAc,EACd,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,qBAAa,cAAc;IACzB,OAAO,CAAC,CAAC,CAAa;IACtB,OAAO,CAAC,OAAO,CAAgB;gBAEnB,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa;IAWjD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa;IAOvC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa;IAO5C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAW5C,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa;IAOtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAS3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAO9B,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAcjC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO7D,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAcpD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAO1C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAUnC,KAAK,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,aAAa,EAAE;IAUvD,MAAM,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,cAAc,EAAE;IAU1D,IAAI,IAAI,aAAa;IAOrB,SAAS,IAAI,aAAa;IAO1B,WAAW,IAAI,eAAe;IAO9B,MAAM,IAAI,UAAU,EAAE;IAOtB,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAOzC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IAO3C,OAAO,IAAI,eAAe,EAAE;IAO5B,MAAM,IAAI,cAAc,EAAE;IAkB1B,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,gBAAgB,GAAG,CAAC;IAUvE,OAAO,CAAC,YAAY;IAgDpB,KAAK,IAAI,MAAM,GAAG,SAAS;IAQ3B,IAAI,IAAI,aAAa;IAOrB,IAAI,IAAI,aAAa;IAOrB,IAAI,IAAI,MAAM;IAOd,IAAI,IAAI,aAAa;IAOrB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOjC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAS/B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAiB5D,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAiBjE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAazD,IAAI,GAAG,IAAI,UAAU,CAEpB;IAKD,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAEhC;CACF"}