openalgo-script 0.5.0 → 0.7.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 (343) hide show
  1. package/CHANGELOG.md +226 -0
  2. package/README.md +53 -22
  3. package/dist/adapters/charts/run.d.ts.map +1 -1
  4. package/dist/adapters/charts/run.js +6 -0
  5. package/dist/adapters/charts/run.js.map +1 -1
  6. package/dist/adapters/charts/tables.d.ts +6 -19
  7. package/dist/adapters/charts/tables.d.ts.map +1 -1
  8. package/dist/adapters/charts/tables.js.map +1 -1
  9. package/dist/adapters/charts/undrawable.d.ts +4 -0
  10. package/dist/adapters/charts/undrawable.d.ts.map +1 -0
  11. package/dist/adapters/charts/undrawable.js +47 -0
  12. package/dist/adapters/charts/undrawable.js.map +1 -0
  13. package/dist/core/backtest/drive.d.ts +36 -1
  14. package/dist/core/backtest/drive.d.ts.map +1 -1
  15. package/dist/core/backtest/drive.js +13 -107
  16. package/dist/core/backtest/drive.js.map +1 -1
  17. package/dist/core/backtest/index.d.ts +2 -0
  18. package/dist/core/backtest/index.d.ts.map +1 -1
  19. package/dist/core/backtest/index.js.map +1 -1
  20. package/dist/core/backtest/walk.d.ts +39 -0
  21. package/dist/core/backtest/walk.d.ts.map +1 -0
  22. package/dist/core/backtest/walk.js +125 -0
  23. package/dist/core/backtest/walk.js.map +1 -0
  24. package/dist/core/catalogue/catalogue.generated.d.ts +178 -1
  25. package/dist/core/catalogue/catalogue.generated.d.ts.map +1 -1
  26. package/dist/core/catalogue/catalogue.generated.js +18 -1
  27. package/dist/core/catalogue/catalogue.generated.js.map +1 -1
  28. package/dist/core/catalogue/types.d.ts +8 -2
  29. package/dist/core/catalogue/types.d.ts.map +1 -1
  30. package/dist/core/catalogue/values.generated.d.ts +51 -0
  31. package/dist/core/catalogue/values.generated.d.ts.map +1 -1
  32. package/dist/core/check/assigned.d.ts +19 -0
  33. package/dist/core/check/assigned.d.ts.map +1 -0
  34. package/dist/core/check/assigned.js +14 -0
  35. package/dist/core/check/assigned.js.map +1 -0
  36. package/dist/core/check/call-sites.d.ts.map +1 -1
  37. package/dist/core/check/call-sites.js +9 -4
  38. package/dist/core/check/call-sites.js.map +1 -1
  39. package/dist/core/check/calls.d.ts.map +1 -1
  40. package/dist/core/check/calls.js +12 -4
  41. package/dist/core/check/calls.js.map +1 -1
  42. package/dist/core/check/check.d.ts.map +1 -1
  43. package/dist/core/check/check.js +15 -2
  44. package/dist/core/check/check.js.map +1 -1
  45. package/dist/core/check/checker.d.ts +26 -0
  46. package/dist/core/check/checker.d.ts.map +1 -1
  47. package/dist/core/check/checker.js +38 -2
  48. package/dist/core/check/checker.js.map +1 -1
  49. package/dist/core/check/constant.d.ts +16 -0
  50. package/dist/core/check/constant.d.ts.map +1 -1
  51. package/dist/core/check/constant.js +52 -0
  52. package/dist/core/check/constant.js.map +1 -1
  53. package/dist/core/check/deleted.d.ts +3 -0
  54. package/dist/core/check/deleted.d.ts.map +1 -0
  55. package/dist/core/check/deleted.js +109 -0
  56. package/dist/core/check/deleted.js.map +1 -0
  57. package/dist/core/check/expressions.js +1 -1
  58. package/dist/core/check/expressions.js.map +1 -1
  59. package/dist/core/check/library-output.d.ts.map +1 -1
  60. package/dist/core/check/library-output.js +1 -0
  61. package/dist/core/check/library-output.js.map +1 -1
  62. package/dist/core/check/library-prose.generated.js +10 -10
  63. package/dist/core/check/library-prose.generated.js.map +1 -1
  64. package/dist/core/check/library.d.ts +7 -0
  65. package/dist/core/check/library.d.ts.map +1 -1
  66. package/dist/core/check/library.js +1 -0
  67. package/dist/core/check/library.js.map +1 -1
  68. package/dist/core/check/surface.d.ts +9 -0
  69. package/dist/core/check/surface.d.ts.map +1 -1
  70. package/dist/core/check/surface.js +13 -0
  71. package/dist/core/check/surface.js.map +1 -1
  72. package/dist/core/engine/bar-source.d.ts +65 -0
  73. package/dist/core/engine/bar-source.d.ts.map +1 -0
  74. package/dist/core/engine/bar-source.js +58 -0
  75. package/dist/core/engine/bar-source.js.map +1 -0
  76. package/dist/core/engine/channels.js +2 -2
  77. package/dist/core/engine/channels.js.map +1 -1
  78. package/dist/core/engine/engine.d.ts +9 -11
  79. package/dist/core/engine/engine.d.ts.map +1 -1
  80. package/dist/core/engine/engine.js +26 -27
  81. package/dist/core/engine/engine.js.map +1 -1
  82. package/dist/core/engine/guard.d.ts.map +1 -1
  83. package/dist/core/engine/guard.js +10 -0
  84. package/dist/core/engine/guard.js.map +1 -1
  85. package/dist/core/engine/host.d.ts +4 -2
  86. package/dist/core/engine/host.d.ts.map +1 -1
  87. package/dist/core/engine/host.js.map +1 -1
  88. package/dist/core/engine/index.d.ts +1 -0
  89. package/dist/core/engine/index.d.ts.map +1 -1
  90. package/dist/core/engine/index.js.map +1 -1
  91. package/dist/core/engine/library/binding.d.ts +2 -0
  92. package/dist/core/engine/library/binding.d.ts.map +1 -1
  93. package/dist/core/engine/library/binding.js.map +1 -1
  94. package/dist/core/engine/library/index.d.ts +8 -0
  95. package/dist/core/engine/library/index.d.ts.map +1 -1
  96. package/dist/core/engine/library/index.js +10 -0
  97. package/dist/core/engine/library/index.js.map +1 -1
  98. package/dist/core/engine/library/maths.js +2 -2
  99. package/dist/core/engine/library/maths.js.map +1 -1
  100. package/dist/core/engine/library/objects.d.ts.map +1 -1
  101. package/dist/core/engine/library/objects.js +1 -1
  102. package/dist/core/engine/library/objects.js.map +1 -1
  103. package/dist/core/engine/machine.js +5 -5
  104. package/dist/core/engine/machine.js.map +1 -1
  105. package/dist/core/engine/memory.js +2 -2
  106. package/dist/core/engine/memory.js.map +1 -1
  107. package/dist/core/engine/registers.js +2 -2
  108. package/dist/core/engine/registers.js.map +1 -1
  109. package/dist/core/engine/request-body.d.ts +3 -1
  110. package/dist/core/engine/request-body.d.ts.map +1 -1
  111. package/dist/core/engine/request-body.js +3 -1
  112. package/dist/core/engine/request-body.js.map +1 -1
  113. package/dist/core/engine/request-plan.d.ts +3 -3
  114. package/dist/core/engine/request-plan.js +3 -3
  115. package/dist/core/engine/requests.d.ts +2 -2
  116. package/dist/core/engine/requests.d.ts.map +1 -1
  117. package/dist/core/engine/requests.js +5 -4
  118. package/dist/core/engine/requests.js.map +1 -1
  119. package/dist/core/engine/series.d.ts +18 -6
  120. package/dist/core/engine/series.d.ts.map +1 -1
  121. package/dist/core/engine/series.js +24 -5
  122. package/dist/core/engine/series.js.map +1 -1
  123. package/dist/core/engine/session/record.d.ts +4 -4
  124. package/dist/core/engine/session/record.js +4 -4
  125. package/dist/core/engine/values/index.d.ts +1 -1
  126. package/dist/core/engine/values/index.d.ts.map +1 -1
  127. package/dist/core/engine/values/index.js +1 -1
  128. package/dist/core/engine/values/index.js.map +1 -1
  129. package/dist/core/engine/values/value.d.ts +2 -0
  130. package/dist/core/engine/values/value.d.ts.map +1 -1
  131. package/dist/core/engine/values/value.js +4 -0
  132. package/dist/core/engine/values/value.js.map +1 -1
  133. package/dist/core/importer/calls.d.ts +29 -0
  134. package/dist/core/importer/calls.d.ts.map +1 -0
  135. package/dist/core/importer/calls.js +267 -0
  136. package/dist/core/importer/calls.js.map +1 -0
  137. package/dist/core/importer/context.d.ts +118 -0
  138. package/dist/core/importer/context.d.ts.map +1 -0
  139. package/dist/core/importer/context.js +120 -0
  140. package/dist/core/importer/context.js.map +1 -0
  141. package/dist/core/importer/expressions.d.ts +44 -0
  142. package/dist/core/importer/expressions.d.ts.map +1 -0
  143. package/dist/core/importer/expressions.js +223 -0
  144. package/dist/core/importer/expressions.js.map +1 -0
  145. package/dist/core/importer/importer.d.ts +13 -0
  146. package/dist/core/importer/importer.d.ts.map +1 -0
  147. package/dist/core/importer/importer.js +220 -0
  148. package/dist/core/importer/importer.js.map +1 -0
  149. package/dist/core/importer/index.d.ts +20 -0
  150. package/dist/core/importer/index.d.ts.map +1 -0
  151. package/dist/core/importer/index.js +18 -0
  152. package/dist/core/importer/index.js.map +1 -0
  153. package/dist/core/importer/lexer.d.ts +68 -0
  154. package/dist/core/importer/lexer.d.ts.map +1 -0
  155. package/dist/core/importer/lexer.js +207 -0
  156. package/dist/core/importer/lexer.js.map +1 -0
  157. package/dist/core/importer/names.d.ts +41 -0
  158. package/dist/core/importer/names.d.ts.map +1 -0
  159. package/dist/core/importer/names.js +78 -0
  160. package/dist/core/importer/names.js.map +1 -0
  161. package/dist/core/importer/orders.d.ts +8 -0
  162. package/dist/core/importer/orders.d.ts.map +1 -0
  163. package/dist/core/importer/orders.js +332 -0
  164. package/dist/core/importer/orders.js.map +1 -0
  165. package/dist/core/importer/outputs.d.ts +19 -0
  166. package/dist/core/importer/outputs.d.ts.map +1 -0
  167. package/dist/core/importer/outputs.js +266 -0
  168. package/dist/core/importer/outputs.js.map +1 -0
  169. package/dist/core/importer/parser.d.ts +5 -0
  170. package/dist/core/importer/parser.d.ts.map +1 -0
  171. package/dist/core/importer/parser.js +439 -0
  172. package/dist/core/importer/parser.js.map +1 -0
  173. package/dist/core/importer/presence.d.ts +32 -0
  174. package/dist/core/importer/presence.d.ts.map +1 -0
  175. package/dist/core/importer/presence.js +146 -0
  176. package/dist/core/importer/presence.js.map +1 -0
  177. package/dist/core/importer/settle.d.ts +23 -0
  178. package/dist/core/importer/settle.d.ts.map +1 -0
  179. package/dist/core/importer/settle.js +135 -0
  180. package/dist/core/importer/settle.js.map +1 -0
  181. package/dist/core/importer/statements.d.ts +4 -0
  182. package/dist/core/importer/statements.d.ts.map +1 -0
  183. package/dist/core/importer/statements.js +339 -0
  184. package/dist/core/importer/statements.js.map +1 -0
  185. package/dist/core/importer/syntax.d.ts +182 -0
  186. package/dist/core/importer/syntax.d.ts.map +1 -0
  187. package/dist/core/importer/syntax.js +14 -0
  188. package/dist/core/importer/syntax.js.map +1 -0
  189. package/dist/core/importer/table.d.ts +52 -0
  190. package/dist/core/importer/table.d.ts.map +1 -0
  191. package/dist/core/importer/table.js +156 -0
  192. package/dist/core/importer/table.js.map +1 -0
  193. package/dist/core/importer/values.d.ts +27 -0
  194. package/dist/core/importer/values.d.ts.map +1 -0
  195. package/dist/core/importer/values.js +236 -0
  196. package/dist/core/importer/values.js.map +1 -0
  197. package/dist/core/index.d.ts +12 -0
  198. package/dist/core/index.d.ts.map +1 -1
  199. package/dist/core/index.js +11 -0
  200. package/dist/core/index.js.map +1 -1
  201. package/dist/core/stdlib/averages/exponential.d.ts.map +1 -1
  202. package/dist/core/stdlib/averages/exponential.js +3 -6
  203. package/dist/core/stdlib/averages/exponential.js.map +1 -1
  204. package/dist/core/stdlib/averages/gaussian.d.ts +15 -0
  205. package/dist/core/stdlib/averages/gaussian.d.ts.map +1 -0
  206. package/dist/core/stdlib/averages/gaussian.js +55 -0
  207. package/dist/core/stdlib/averages/gaussian.js.map +1 -0
  208. package/dist/core/stdlib/averages/shaped.d.ts +2 -6
  209. package/dist/core/stdlib/averages/shaped.d.ts.map +1 -1
  210. package/dist/core/stdlib/averages/shaped.js +8 -22
  211. package/dist/core/stdlib/averages/shaped.js.map +1 -1
  212. package/dist/core/stdlib/calendar/civil.d.ts.map +1 -1
  213. package/dist/core/stdlib/calendar/civil.js +5 -2
  214. package/dist/core/stdlib/calendar/civil.js.map +1 -1
  215. package/dist/core/stdlib/maths/arithmetic.d.ts.map +1 -1
  216. package/dist/core/stdlib/maths/arithmetic.js +2 -1
  217. package/dist/core/stdlib/maths/arithmetic.js.map +1 -1
  218. package/dist/core/stdlib/maths/elementary.d.ts +3 -20
  219. package/dist/core/stdlib/maths/elementary.d.ts.map +1 -1
  220. package/dist/core/stdlib/maths/elementary.js +17 -13
  221. package/dist/core/stdlib/maths/elementary.js.map +1 -1
  222. package/dist/core/stdlib/maths/hypot.d.ts +8 -0
  223. package/dist/core/stdlib/maths/hypot.d.ts.map +1 -0
  224. package/dist/core/stdlib/maths/hypot.js +68 -0
  225. package/dist/core/stdlib/maths/hypot.js.map +1 -0
  226. package/dist/core/stdlib/maths/power.d.ts +3 -0
  227. package/dist/core/stdlib/maths/power.d.ts.map +1 -0
  228. package/dist/core/stdlib/maths/power.js +83 -0
  229. package/dist/core/stdlib/maths/power.js.map +1 -0
  230. package/dist/core/stdlib/maths/transcendental.d.ts +15 -0
  231. package/dist/core/stdlib/maths/transcendental.d.ts.map +1 -0
  232. package/dist/core/stdlib/maths/transcendental.js +185 -0
  233. package/dist/core/stdlib/maths/transcendental.js.map +1 -0
  234. package/dist/core/stdlib/maths/trigonometric.d.ts +4 -0
  235. package/dist/core/stdlib/maths/trigonometric.d.ts.map +1 -0
  236. package/dist/core/stdlib/maths/trigonometric.js +196 -0
  237. package/dist/core/stdlib/maths/trigonometric.js.map +1 -0
  238. package/dist/core/stdlib/series/conditions.d.ts +2 -4
  239. package/dist/core/stdlib/series/conditions.d.ts.map +1 -1
  240. package/dist/core/stdlib/series/conditions.js +9 -13
  241. package/dist/core/stdlib/series/conditions.js.map +1 -1
  242. package/dist/core/stdlib/series/statistics.d.ts.map +1 -1
  243. package/dist/core/stdlib/series/statistics.js +2 -0
  244. package/dist/core/stdlib/series/statistics.js.map +1 -1
  245. package/dist/core/stdlib/values/history.d.ts +26 -0
  246. package/dist/core/stdlib/values/history.d.ts.map +1 -0
  247. package/dist/core/stdlib/values/history.js +52 -0
  248. package/dist/core/stdlib/values/history.js.map +1 -0
  249. package/dist/core/stdlib/values/index.d.ts +1 -0
  250. package/dist/core/stdlib/values/index.d.ts.map +1 -1
  251. package/dist/core/stdlib/values/index.js +1 -0
  252. package/dist/core/stdlib/values/index.js.map +1 -1
  253. package/dist/core/stdlib/values/lookback.d.ts +4 -1
  254. package/dist/core/stdlib/values/lookback.d.ts.map +1 -1
  255. package/dist/core/stdlib/values/lookback.js +48 -45
  256. package/dist/core/stdlib/values/lookback.js.map +1 -1
  257. package/dist/core/stdlib/values/region.d.ts +6 -5
  258. package/dist/core/stdlib/values/region.d.ts.map +1 -1
  259. package/dist/core/stdlib/values/region.js +3 -3
  260. package/dist/core/stdlib/values/region.js.map +1 -1
  261. package/dist/core/stdlib/volatility/measures.d.ts.map +1 -1
  262. package/dist/core/stdlib/volatility/measures.js +6 -4
  263. package/dist/core/stdlib/volatility/measures.js.map +1 -1
  264. package/dist/core/version/version.generated.d.ts +1 -1
  265. package/dist/core/version/version.generated.js +1 -1
  266. package/package.json +13 -2
  267. package/spec/errors.json +380 -20
  268. package/src/adapters/charts/run.ts +6 -0
  269. package/src/adapters/charts/tables.ts +6 -19
  270. package/src/adapters/charts/undrawable.ts +51 -0
  271. package/src/core/backtest/drive.ts +66 -154
  272. package/src/core/backtest/index.ts +2 -0
  273. package/src/core/backtest/walk.ts +182 -0
  274. package/src/core/catalogue/catalogue.generated.ts +18 -1
  275. package/src/core/catalogue/types.ts +8 -2
  276. package/src/core/catalogue/values.generated.ts +16 -0
  277. package/src/core/check/assigned.ts +31 -0
  278. package/src/core/check/call-sites.ts +11 -4
  279. package/src/core/check/calls.ts +13 -4
  280. package/src/core/check/check.ts +14 -2
  281. package/src/core/check/checker.ts +39 -2
  282. package/src/core/check/constant.ts +57 -0
  283. package/src/core/check/deleted.ts +135 -0
  284. package/src/core/check/expressions.ts +1 -1
  285. package/src/core/check/library-output.ts +1 -0
  286. package/src/core/check/library-prose.generated.ts +10 -10
  287. package/src/core/check/library.ts +8 -0
  288. package/src/core/check/surface.ts +16 -0
  289. package/src/core/engine/bar-source.ts +113 -0
  290. package/src/core/engine/channels.ts +2 -2
  291. package/src/core/engine/engine.ts +29 -28
  292. package/src/core/engine/guard.ts +12 -1
  293. package/src/core/engine/host.ts +4 -2
  294. package/src/core/engine/index.ts +1 -0
  295. package/src/core/engine/library/binding.ts +2 -0
  296. package/src/core/engine/library/index.ts +11 -0
  297. package/src/core/engine/library/maths.ts +2 -2
  298. package/src/core/engine/library/objects.ts +1 -6
  299. package/src/core/engine/machine.ts +5 -5
  300. package/src/core/engine/memory.ts +2 -2
  301. package/src/core/engine/registers.ts +2 -2
  302. package/src/core/engine/request-body.ts +5 -7
  303. package/src/core/engine/request-plan.ts +3 -3
  304. package/src/core/engine/requests.ts +11 -8
  305. package/src/core/engine/series.ts +30 -6
  306. package/src/core/engine/session/record.ts +4 -4
  307. package/src/core/engine/values/index.ts +1 -0
  308. package/src/core/engine/values/value.ts +5 -0
  309. package/src/core/importer/calls.ts +274 -0
  310. package/src/core/importer/context.ts +197 -0
  311. package/src/core/importer/expressions.ts +247 -0
  312. package/src/core/importer/importer.ts +226 -0
  313. package/src/core/importer/index.ts +19 -0
  314. package/src/core/importer/lexer.ts +285 -0
  315. package/src/core/importer/names.ts +104 -0
  316. package/src/core/importer/orders.ts +307 -0
  317. package/src/core/importer/outputs.ts +245 -0
  318. package/src/core/importer/parser.ts +436 -0
  319. package/src/core/importer/presence.ts +164 -0
  320. package/src/core/importer/settle.ts +141 -0
  321. package/src/core/importer/statements.ts +331 -0
  322. package/src/core/importer/syntax.ts +144 -0
  323. package/src/core/importer/table.ts +191 -0
  324. package/src/core/importer/values.ts +241 -0
  325. package/src/core/index.ts +13 -0
  326. package/src/core/stdlib/averages/exponential.ts +3 -4
  327. package/src/core/stdlib/averages/gaussian.ts +52 -0
  328. package/src/core/stdlib/averages/shaped.ts +8 -21
  329. package/src/core/stdlib/calendar/civil.ts +5 -2
  330. package/src/core/stdlib/maths/arithmetic.ts +2 -1
  331. package/src/core/stdlib/maths/elementary.ts +20 -33
  332. package/src/core/stdlib/maths/hypot.ts +63 -0
  333. package/src/core/stdlib/maths/power.ts +57 -0
  334. package/src/core/stdlib/maths/transcendental.ts +160 -0
  335. package/src/core/stdlib/maths/trigonometric.ts +160 -0
  336. package/src/core/stdlib/series/conditions.ts +9 -12
  337. package/src/core/stdlib/series/statistics.ts +1 -0
  338. package/src/core/stdlib/values/history.ts +70 -0
  339. package/src/core/stdlib/values/index.ts +1 -0
  340. package/src/core/stdlib/values/lookback.ts +51 -47
  341. package/src/core/stdlib/values/region.ts +7 -5
  342. package/src/core/stdlib/volatility/measures.ts +6 -4
  343. package/src/core/version/version.generated.ts +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../../src/core/importer/expressions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,KAAK,EAAO,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpD,8DAA8D;AAC9D,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM;CAKzC;AAUD,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAIjD;AAED,eAAO,MAAM,MAAM,qDAAqD,CAAC;AAEzE,qBAAa,MAAM;IACjB,KAAK,SAAK;IACV,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;gBAEtB,MAAM,EAAE,SAAS,KAAK,EAAE;IAIpC,IAAI,CAAC,KAAK,SAAI,GAAG,KAAK,GAAG,SAAS;IAIlC,uDAAuD;IACvD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO;IAKtC,IAAI,IAAI,OAAO;IAIf,IAAI,IAAI,KAAK;IAOb,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IAK3B,8EAA8E;IAC9E,IAAI,IAAI,KAAK;IAOb,6CAA6C;IAC7C,QAAQ,IAAI,KAAK;CAIlB;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE3C;AAwBD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAE1C"}
@@ -0,0 +1,223 @@
1
+ import { joined } from './syntax.js';
2
+ /** A form the reader does not accept, and where it starts. */
3
+ export class Unreadable extends Error {
4
+ at;
5
+ construct;
6
+ constructor(at, construct) {
7
+ super(construct);
8
+ this.at = at;
9
+ this.construct = construct;
10
+ }
11
+ }
12
+ /** Words that open a statement form and are never a value. */
13
+ const STATEMENT_WORDS = {
14
+ if: 'an if used as a value',
15
+ switch: 'a switch used as a value',
16
+ for: 'a for loop used as a value',
17
+ while: 'a while loop used as a value',
18
+ };
19
+ /** The words the reader takes for a form it does not read, per bad token. */
20
+ export function badConstruct(token) {
21
+ if (token.text.startsWith('"') || token.text.startsWith("'"))
22
+ return 'a string that is never closed';
23
+ if (token.text.startsWith('#'))
24
+ return `the colour literal ${token.text}`;
25
+ return `the character ${token.text}`;
26
+ }
27
+ export const UNREAD = 'a statement in a form its reader does not accept';
28
+ export class Cursor {
29
+ index = 0;
30
+ tokens;
31
+ constructor(tokens) {
32
+ this.tokens = tokens;
33
+ }
34
+ peek(ahead = 0) {
35
+ return this.tokens[this.index + ahead];
36
+ }
37
+ /** Whether the next token is this operator or word. */
38
+ sees(text, ahead = 0) {
39
+ const token = this.peek(ahead);
40
+ return token !== undefined && (token.kind === 'op' || token.kind === 'name') && token.text === text;
41
+ }
42
+ done() {
43
+ return this.index >= this.tokens.length;
44
+ }
45
+ take() {
46
+ const token = this.tokens[this.index];
47
+ if (token === undefined)
48
+ throw new Unreadable(this.endPlace(), UNREAD);
49
+ this.index += 1;
50
+ return token;
51
+ }
52
+ expect(text) {
53
+ if (!this.sees(text))
54
+ this.fail();
55
+ return this.take();
56
+ }
57
+ /** Refuse at the next token, or at the end of the line when there is none. */
58
+ fail() {
59
+ const token = this.peek();
60
+ if (token === undefined)
61
+ throw new Unreadable(this.endPlace(), UNREAD);
62
+ if (token.kind === 'bad')
63
+ throw new Unreadable(placeOf(token), badConstruct(token));
64
+ throw new Unreadable(placeOf(token), UNREAD);
65
+ }
66
+ /** Zero width, just after the last token. */
67
+ endPlace() {
68
+ const last = this.tokens[this.tokens.length - 1];
69
+ return last === undefined ? { offset: 0, length: 0 } : { offset: last.offset + last.length, length: 0 };
70
+ }
71
+ }
72
+ export function placeOf(token) {
73
+ return { offset: token.offset, length: token.length };
74
+ }
75
+ const COMPARISON = new Set(['<', '<=', '>', '>=']);
76
+ const EQUALITY = new Set(['==', '!=']);
77
+ const ADDITIVE = new Set(['+', '-']);
78
+ const MULTIPLICATIVE = new Set(['*', '/', '%']);
79
+ /** One left associative level of binary operators. */
80
+ function binaryLevel(operators, next, words = false) {
81
+ return (c) => {
82
+ let left = next(c);
83
+ for (;;) {
84
+ const token = c.peek();
85
+ if (token === undefined || !operators.has(token.text))
86
+ return left;
87
+ if (words ? token.kind !== 'name' : token.kind !== 'op')
88
+ return left;
89
+ c.take();
90
+ const right = next(c);
91
+ left = { kind: 'binary', op: token.text, left, right, at: joined(left.at, right.at), opAt: placeOf(token) };
92
+ }
93
+ };
94
+ }
95
+ export function expression(c) {
96
+ return ternary(c);
97
+ }
98
+ function ternary(c) {
99
+ const condition = orLevel(c);
100
+ if (!c.sees('?'))
101
+ return condition;
102
+ c.take();
103
+ const then = ternary(c);
104
+ c.expect(':');
105
+ const otherwise = ternary(c);
106
+ return { kind: 'ternary', condition, then, otherwise, at: joined(condition.at, otherwise.at) };
107
+ }
108
+ function unary(c) {
109
+ const token = c.peek();
110
+ if (token !== undefined) {
111
+ const sign = token.kind === 'op' && (token.text === '-' || token.text === '+');
112
+ const not = token.kind === 'name' && token.text === 'not';
113
+ if (sign || not) {
114
+ c.take();
115
+ const operand = unary(c);
116
+ return { kind: 'unary', op: token.text, operand, at: joined(placeOf(token), operand.at) };
117
+ }
118
+ }
119
+ return postfix(c);
120
+ }
121
+ const multiplicative = binaryLevel(MULTIPLICATIVE, unary);
122
+ const additive = binaryLevel(ADDITIVE, multiplicative);
123
+ const comparison = binaryLevel(COMPARISON, additive);
124
+ const equality = binaryLevel(EQUALITY, comparison);
125
+ const andLevel = binaryLevel(new Set(['and']), equality, true);
126
+ const orLevel = binaryLevel(new Set(['or']), andLevel, true);
127
+ function argumentsOf(c) {
128
+ const args = [];
129
+ if (c.sees(')'))
130
+ return args;
131
+ for (;;) {
132
+ const first = c.peek();
133
+ let label;
134
+ if (first !== undefined && first.kind === 'name' && c.sees('=', 1)) {
135
+ label = first.text;
136
+ c.take();
137
+ c.take();
138
+ }
139
+ const value = expression(c);
140
+ args.push({ label, value, at: first === undefined ? value.at : joined(placeOf(first), value.at) });
141
+ if (!c.sees(','))
142
+ return args;
143
+ c.take();
144
+ }
145
+ }
146
+ function postfix(c) {
147
+ let expr = primary(c);
148
+ for (;;) {
149
+ if (c.sees('(')) {
150
+ c.take();
151
+ const args = argumentsOf(c);
152
+ const close = c.expect(')');
153
+ expr = { kind: 'call', callee: expr, args, at: joined(expr.at, placeOf(close)) };
154
+ }
155
+ else if (c.sees('[')) {
156
+ c.take();
157
+ const index = expression(c);
158
+ const close = c.expect(']');
159
+ expr = { kind: 'index', target: expr, index, at: joined(expr.at, placeOf(close)) };
160
+ }
161
+ else if (c.sees('.')) {
162
+ c.take();
163
+ const property = c.take();
164
+ if (property.kind !== 'name')
165
+ throw new Unreadable(placeOf(property), UNREAD);
166
+ expr = { kind: 'member', object: expr, property: property.text, at: joined(expr.at, placeOf(property)) };
167
+ }
168
+ else {
169
+ return expr;
170
+ }
171
+ }
172
+ }
173
+ function primary(c) {
174
+ const token = c.peek();
175
+ if (token === undefined)
176
+ c.fail();
177
+ const at = placeOf(token);
178
+ switch (token.kind) {
179
+ case 'number':
180
+ c.take();
181
+ return { kind: 'number', text: token.text, at };
182
+ case 'string':
183
+ c.take();
184
+ return { kind: 'string', value: token.value, at };
185
+ case 'color':
186
+ c.take();
187
+ return { kind: 'color', text: token.text, at };
188
+ case 'bad':
189
+ throw new Unreadable(at, badConstruct(token));
190
+ case 'name': {
191
+ const word = STATEMENT_WORDS[token.text];
192
+ if (word !== undefined)
193
+ throw new Unreadable(at, word);
194
+ c.take();
195
+ if (token.text === 'true' || token.text === 'false') {
196
+ return { kind: 'bool', value: token.text === 'true', at };
197
+ }
198
+ return { kind: 'name', name: token.text, at };
199
+ }
200
+ case 'op':
201
+ break;
202
+ }
203
+ if (token.text === '(') {
204
+ c.take();
205
+ const inner = expression(c);
206
+ const close = c.expect(')');
207
+ return { kind: 'group', inner, at: joined(at, placeOf(close)) };
208
+ }
209
+ if (token.text === '[') {
210
+ c.take();
211
+ const items = [];
212
+ while (!c.sees(']')) {
213
+ items.push(expression(c));
214
+ if (!c.sees(','))
215
+ break;
216
+ c.take();
217
+ }
218
+ const close = c.expect(']');
219
+ return { kind: 'list', items, at: joined(at, placeOf(close)) };
220
+ }
221
+ return c.fail();
222
+ }
223
+ //# sourceMappingURL=expressions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../../src/core/importer/expressions.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,8DAA8D;AAC9D,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,EAAE,CAAQ;IACV,SAAS,CAAS;IAE3B,YAAY,EAAS,EAAE,SAAiB;QACtC,KAAK,CAAC,SAAS,CAAC,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,8DAA8D;AAC9D,MAAM,eAAe,GAAqC;IACxD,EAAE,EAAE,uBAAuB;IAC3B,MAAM,EAAE,0BAA0B;IAClC,GAAG,EAAE,4BAA4B;IACjC,KAAK,EAAE,8BAA8B;CACtC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,+BAA+B,CAAC;IACrG,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,sBAAsB,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1E,OAAO,iBAAiB,KAAK,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,kDAAkD,CAAC;AAEzE,MAAM,OAAO,MAAM;IACjB,KAAK,GAAG,CAAC,CAAC;IACD,MAAM,CAAmB;IAElC,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,KAAK,GAAG,CAAC;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,uDAAuD;IACvD,IAAI,CAAC,IAAY,EAAE,KAAK,GAAG,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;IACtG,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED,IAAI;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,8EAA8E;IAC9E,IAAI;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QACvE,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACpF,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,6CAA6C;IAC7C,QAAQ;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjD,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC1G,CAAC;CACF;AAED,MAAM,UAAU,OAAO,CAAC,KAAY;IAClC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACrC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAIhD,sDAAsD;AACtD,SAAS,WAAW,CAAC,SAA8B,EAAE,IAAW,EAAE,KAAK,GAAG,KAAK;IAC7E,OAAO,CAAC,CAAC,EAAE,EAAE;QACX,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACrE,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9G,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACnC,CAAC,CAAC,IAAI,EAAE,CAAC;IACT,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACd,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;AACjG,CAAC;AAED,SAAS,KAAK,CAAC,CAAS;IACtB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAC1D,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;YAChB,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AAC1D,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AACvD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACrD,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC/D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAE7D,SAAS,WAAW,CAAC,CAAS;IAC5B,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,SAAS,CAAC;QACR,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,KAAyB,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;YACnE,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;YACnB,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,CAAC,CAAC,IAAI,EAAE,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,SAAS,CAAC;QACR,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACnF,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACrF,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YAC9E,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC3G,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,KAAK,KAAK,SAAS;QAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QAClD,KAAK,QAAQ;YACX,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;QACpD,KAAK,OAAO;YACV,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QACjD,KAAK,KAAK;YACR,MAAM,IAAI,UAAU,CAAC,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,IAAI,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACvD,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACpD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,EAAE,EAAE,CAAC;YAC5D,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QAChD,CAAC;QACD,KAAK,IAAI;YACP,MAAM;IACV,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACvB,CAAC,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACvB,CAAC,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,MAAM;YACxB,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Diagnostic } from '../diagnostics/index.js';
2
+ export interface ImportResult {
3
+ /** The OpenScript text, or the empty string where nothing could be translated. */
4
+ readonly source: string;
5
+ /** Every finding, positioned in the imported text, in the order a reader walks it. */
6
+ readonly findings: readonly Diagnostic[];
7
+ }
8
+ export interface ImportOptions {
9
+ /** What the imported text is called, for the first line of a rendered finding. */
10
+ readonly name?: string;
11
+ }
12
+ export declare function importScript(text: string, options?: ImportOptions): ImportResult;
13
+ //# sourceMappingURL=importer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer.d.ts","sourceRoot":"","sources":["../../../src/core/importer/importer.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAgB1D,MAAM,WAAW,YAAY;IAC3B,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AA2GD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CA4EpF"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * The importer: a script in the source dialect in, OpenScript and findings out.
3
+ *
4
+ * The source dialect is the widely used chart scripting language whose scripts
5
+ * open with a version annotation comment, declare themselves with an
6
+ * `indicator` or `strategy` call and reach their built-ins through namespaces
7
+ * such as `ta` and `math`. Versions 5 and 6 are read.
8
+ *
9
+ * It is text to text and nothing else: no file is read, no global is touched
10
+ * and nothing is evaluated. What it cannot translate faithfully it does not
11
+ * approximate. A statement is translated whole, with the source dialect's
12
+ * meaning, or kept as a comment line per source line and reported; a
13
+ * translation whose meaning differs in a way the importer can state is written
14
+ * and reported with a warning. Every finding points into the imported text.
15
+ */
16
+ import { diagnosticFor } from '../diagnostics/index.js';
17
+ import { sourceFile } from '../source/index.js';
18
+ import { Context } from './context.js';
19
+ import { readItems } from './lexer.js';
20
+ import { binding } from './names.js';
21
+ import { declarationLine } from './orders.js';
22
+ import { readScript } from './parser.js';
23
+ import { findingsOf, settle } from './settle.js';
24
+ import { translateStatement } from './statements.js';
25
+ import { pathOf } from './syntax.js';
26
+ const ANNOTATION = /^\s*@version\s*=\s*(\d+)\s*$/;
27
+ /** The version annotation, if one comes before the first line of code. */
28
+ function annotationOf(items) {
29
+ for (const item of items) {
30
+ if (item.kind === 'code')
31
+ return undefined;
32
+ if (item.kind !== 'remark')
33
+ continue;
34
+ const found = ANNOTATION.exec(item.remark.text);
35
+ if (found !== null)
36
+ return { remark: item.remark, version: found[1] ?? '' };
37
+ }
38
+ return undefined;
39
+ }
40
+ function declaresOf(stmt) {
41
+ switch (stmt.kind) {
42
+ case 'declare':
43
+ case 'function':
44
+ return [stmt.name];
45
+ case 'tuple':
46
+ return stmt.names;
47
+ case 'refused':
48
+ return stmt.declares;
49
+ default:
50
+ return [];
51
+ }
52
+ }
53
+ function nodeOf(stmt, declaration) {
54
+ return {
55
+ stmt,
56
+ lines: stmt.lines,
57
+ declares: declaresOf(stmt),
58
+ reads: [],
59
+ output: [],
60
+ refusal: undefined,
61
+ failed: undefined,
62
+ lost: undefined,
63
+ notes: [],
64
+ declaration,
65
+ };
66
+ }
67
+ function visit(body, each) {
68
+ for (const entry of body) {
69
+ if (entry.kind !== 'stmt')
70
+ continue;
71
+ const stmt = entry.stmt;
72
+ each(stmt);
73
+ if (stmt.kind === 'if') {
74
+ for (const branch of stmt.branches)
75
+ visit(branch.body, each);
76
+ if (stmt.otherwise !== undefined)
77
+ visit(stmt.otherwise, each);
78
+ }
79
+ else if (stmt.kind === 'for' || stmt.kind === 'while')
80
+ visit(stmt.body, each);
81
+ else if (stmt.kind === 'switch')
82
+ for (const arm of stmt.arms)
83
+ visit(arm.body, each);
84
+ else if (stmt.kind === 'function' && Array.isArray(stmt.body))
85
+ visit(stmt.body, each);
86
+ }
87
+ }
88
+ /** The side each literal entry id opens, read from the script's entry calls. */
89
+ function entrySides(body) {
90
+ const sides = new Map();
91
+ visit(body, (stmt) => {
92
+ if (stmt.kind !== 'evaluate' || stmt.expr.kind !== 'call')
93
+ return;
94
+ if (pathOf(stmt.expr.callee) !== 'strategy.entry')
95
+ return;
96
+ const args = stmt.expr.args;
97
+ const id = args.find((arg) => arg.label === 'id') ?? args.find((arg, i) => arg.label === undefined && i === 0);
98
+ const side = args.find((arg) => arg.label === 'direction') ?? args.filter((arg) => arg.label === undefined)[1];
99
+ const direction = side === undefined ? undefined : pathOf(side.value);
100
+ if (id?.value.kind !== 'string')
101
+ return;
102
+ if (direction === 'strategy.long')
103
+ sides.set(id.value.value, 'long');
104
+ if (direction === 'strategy.short')
105
+ sides.set(id.value.value, 'short');
106
+ });
107
+ return sides;
108
+ }
109
+ function reassignments(body) {
110
+ const found = new Map();
111
+ visit(body, (stmt) => {
112
+ if (stmt.kind !== 'assign')
113
+ return;
114
+ const held = found.get(stmt.name.name) ?? [];
115
+ held.push({ op: stmt.op, value: stmt.value });
116
+ found.set(stmt.name.name, held);
117
+ });
118
+ return found;
119
+ }
120
+ function refusal(diagnostic) {
121
+ return { source: '', findings: [diagnostic] };
122
+ }
123
+ /** Zero width, where the first statement starts: where a declaration was expected. */
124
+ function firstStatement(file, body) {
125
+ const first = body.find((entry) => entry.kind === 'stmt');
126
+ return first?.kind === 'stmt' ? file.spanAt(first.stmt.at.offset, 0) : file.spanAt(file.text.length, 0);
127
+ }
128
+ function declarationOf(body) {
129
+ for (const entry of body) {
130
+ if (entry.kind !== 'stmt' || entry.stmt.kind !== 'evaluate' || entry.stmt.expr.kind !== 'call')
131
+ continue;
132
+ const path = pathOf(entry.stmt.expr.callee);
133
+ if (path === 'indicator' || path === 'strategy' || path === 'library') {
134
+ return { stmt: entry.stmt, call: entry.stmt.expr, path };
135
+ }
136
+ }
137
+ return undefined;
138
+ }
139
+ export function importScript(text, options = {}) {
140
+ const file = sourceFile(options.name ?? 'imported', text);
141
+ const items = readItems(file);
142
+ const annotation = annotationOf(items);
143
+ if (annotation === undefined || (annotation.version !== '5' && annotation.version !== '6')) {
144
+ const at = annotation === undefined ? file.spanAt(0, 0) : file.spanAt(annotation.remark.offset, annotation.remark.text.length + 2);
145
+ const found = annotation === undefined ? 'declares no version' : `declares version ${annotation.version}`;
146
+ return refusal(diagnosticFor('OS9001', at, { found }));
147
+ }
148
+ const body = readScript(items);
149
+ const declaration = declarationOf(body);
150
+ if (declaration === undefined)
151
+ return refusal(diagnosticFor('OS9004', firstStatement(file, body), { found: 'has none' }));
152
+ if (declaration.path === 'library') {
153
+ return refusal(diagnosticFor('OS9004', file.spanAt(declaration.call.callee.at.offset, declaration.call.callee.at.length), { found: 'declares a library' }));
154
+ }
155
+ const used = new Set();
156
+ for (const item of items) {
157
+ if (item.kind !== 'code')
158
+ continue;
159
+ for (const token of item.logical.tokens)
160
+ if (token.kind === 'name')
161
+ used.add(token.text);
162
+ }
163
+ const version = annotation.version === '5' ? 5 : 6;
164
+ const globals = new Set();
165
+ for (const entry of body)
166
+ if (entry.kind === 'stmt')
167
+ for (const one of declaresOf(entry.stmt))
168
+ globals.add(one.name);
169
+ const ctx = new Context({ file, version, used, globals, reassigned: reassignments(body), entries: entrySides(body) });
170
+ const declared = nodeOf(declaration.stmt, true);
171
+ ctx.node = declared;
172
+ const trailing = declaration.stmt.remarks.map((one) => ` //${one.text}`).join('');
173
+ declared.output = [{ depth: 0, text: `${declarationLine(ctx, declaration.call, declaration.path)}${trailing}` }];
174
+ ctx.node = undefined;
175
+ const nodes = [declared];
176
+ const pieces = [];
177
+ const later = [];
178
+ let stage = 'before';
179
+ for (const entry of body) {
180
+ if (entry.kind === 'remark' && entry.remark === annotation.remark) {
181
+ pieces.push({ kind: 'text', text: 'version 1' }, { kind: 'blank' });
182
+ stage = 'header';
183
+ continue;
184
+ }
185
+ if (entry.kind === 'stmt' && entry.stmt === declaration.stmt) {
186
+ pieces.push({ kind: 'node', node: declared }, ...later);
187
+ later.length = 0;
188
+ stage = 'body';
189
+ continue;
190
+ }
191
+ const piece = entry.kind === 'remark'
192
+ ? { kind: 'remark', remark: entry.remark, depth: 0 }
193
+ : entry.kind === 'blank'
194
+ ? { kind: 'blank' }
195
+ : undefined;
196
+ if (piece !== undefined) {
197
+ pieces.push(piece);
198
+ continue;
199
+ }
200
+ if (entry.kind !== 'stmt')
201
+ continue;
202
+ const node = nodeOf(entry.stmt, false);
203
+ ctx.node = node;
204
+ node.output = translateStatement(ctx, entry.stmt, 0);
205
+ for (const one of node.declares) {
206
+ if (!ctx.fileScope.names.has(one.name)) {
207
+ ctx.fileScope.names.set(one.name, binding(ctx.namer.declare(one.name, false), 'variable', true));
208
+ }
209
+ }
210
+ ctx.node = undefined;
211
+ nodes.push(node);
212
+ if (stage === 'body')
213
+ pieces.push({ kind: 'node', node });
214
+ else
215
+ later.push({ kind: 'node', node });
216
+ }
217
+ const source = settle(ctx, nodes, pieces);
218
+ return { source, findings: findingsOf(nodes) };
219
+ }
220
+ //# sourceMappingURL=importer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer.js","sourceRoot":"","sources":["../../../src/core/importer/importer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The importer: a script written in another chart language, as OpenScript.
3
+ *
4
+ * `importScript` reads a script in the version-annotated chart dialect, the one
5
+ * whose scripts open with a `//@version=` comment and reach their built-ins
6
+ * through namespaces, and returns the OpenScript text and a finding for every
7
+ * statement it kept as a comment and every translation whose meaning differs in
8
+ * a stated way. It is pure: text in, text and findings out, and nothing read,
9
+ * written or evaluated on the way.
10
+ *
11
+ * `MAPPINGS` and `COLOURS` are the table of what translates to what. They are
12
+ * behind this door for the documentation page's comparison test and for a tool
13
+ * that wants to show a reader the same table; the package surface is
14
+ * `importScript` and its two types.
15
+ */
16
+ export { importScript } from './importer.js';
17
+ export type { ImportOptions, ImportResult } from './importer.js';
18
+ export { COLOURS, MAPPINGS } from './table.js';
19
+ export type { Difference, Mapping } from './table.js';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/importer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The importer: a script written in another chart language, as OpenScript.
3
+ *
4
+ * `importScript` reads a script in the version-annotated chart dialect, the one
5
+ * whose scripts open with a `//@version=` comment and reach their built-ins
6
+ * through namespaces, and returns the OpenScript text and a finding for every
7
+ * statement it kept as a comment and every translation whose meaning differs in
8
+ * a stated way. It is pure: text in, text and findings out, and nothing read,
9
+ * written or evaluated on the way.
10
+ *
11
+ * `MAPPINGS` and `COLOURS` are the table of what translates to what. They are
12
+ * behind this door for the documentation page's comparison test and for a tool
13
+ * that wants to show a reader the same table; the package surface is
14
+ * `importScript` and its two types.
15
+ */
16
+ export { importScript } from './importer.js';
17
+ export { COLOURS, MAPPINGS } from './table.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/importer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Reading a script in the source dialect into logical lines of tokens.
3
+ *
4
+ * The source dialect is line oriented and indentation delimited, like
5
+ * OpenScript, and it differs in the two places a reader has to know about. A
6
+ * statement continues onto the next line when a bracket is still open, when
7
+ * the line ends on an operator that cannot end one, or when the next line is
8
+ * indented by an amount that is not a whole number of blocks: the dialect's
9
+ * blocks are four columns deep, and a continuation is told apart from a block
10
+ * by being indented off that grid. A tab in leading whitespace counts as one
11
+ * block.
12
+ *
13
+ * This reader is deliberately separate from OpenScript's lexer. The two
14
+ * languages share a shape and differ in almost every token rule that matters to
15
+ * a diagnostic: the source dialect has `:=`, `=>` and single quoted strings as
16
+ * ordinary tokens and no `none`, and running its text through OpenScript's
17
+ * lexer would report every one of those as a mistake in a file nobody wrote in
18
+ * OpenScript.
19
+ *
20
+ * Nothing here refuses anything. A character the dialect does not have becomes
21
+ * a `bad` token, and the parser decides what the statement holding it is.
22
+ */
23
+ import type { SourceFile } from '../source/index.js';
24
+ export type TokenKind = 'name' | 'number' | 'string' | 'color' | 'op' | 'bad';
25
+ export interface Token {
26
+ readonly kind: TokenKind;
27
+ /** The characters as written. */
28
+ readonly text: string;
29
+ /** A string literal's decoded value; for every other kind, the text. */
30
+ readonly value: string;
31
+ readonly offset: number;
32
+ readonly length: number;
33
+ }
34
+ /** A `//` comment, with the text after the two slashes. */
35
+ export interface Remark {
36
+ readonly text: string;
37
+ readonly offset: number;
38
+ readonly line: number;
39
+ }
40
+ /** One statement's worth of tokens, which may have spanned several lines. */
41
+ export interface Logical {
42
+ /** Leading columns of the first line, a tab counted as one block. */
43
+ readonly indent: number;
44
+ readonly tokens: readonly Token[];
45
+ /** Comments written after code on any of the statement's lines. */
46
+ readonly remarks: readonly Remark[];
47
+ readonly firstLine: number;
48
+ readonly lastLine: number;
49
+ }
50
+ export type Item = {
51
+ readonly kind: 'code';
52
+ readonly logical: Logical;
53
+ } | {
54
+ readonly kind: 'remark';
55
+ readonly remark: Remark;
56
+ readonly indent: number;
57
+ } | {
58
+ readonly kind: 'blank';
59
+ readonly line: number;
60
+ };
61
+ /**
62
+ * The whole file as items: statements, comment lines and blank lines, in order.
63
+ *
64
+ * A comment line or a blank line inside an open statement belongs to that
65
+ * statement and ends nothing, the same rule OpenScript gives them.
66
+ */
67
+ export declare function readItems(file: SourceFile): readonly Item[];
68
+ //# sourceMappingURL=lexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../../../src/core/importer/lexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC;AAE9E,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,2DAA2D;AAC3D,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,6EAA6E;AAC7E,MAAM,WAAW,OAAO;IACtB,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,IAAI,GACZ;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAuKtD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,IAAI,EAAE,CAsD3D"}