@uipath/flow-tool 1.201.0-preview.115 → 1.201.0-preview.121

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 (119) hide show
  1. package/dist/{authoring-vbbqwp0v.js → authoring-rezk32bm.js} +64 -20
  2. package/dist/{conversion-MQ7TJMHW-5zbdb6y2.js → conversion-W6HMHBWW-jnk9z7rw.js} +42 -34
  3. package/dist/{de-JT3SUGT4-msgpbdge.js → de-B2KIY5TC-81f703v3.js} +14 -5
  4. package/dist/{de-3RMZHIP6-1na18a74.js → de-K6MLR24N-00fjz82b.js} +474 -51
  5. package/dist/{de-3RMZHIP6-QW5DEMLQ-fw64syvn.js → de-K6MLR24N-5N5XGLH6-gbwpvdz4.js} +476 -53
  6. package/dist/{de-LVBY3VVG-tc58p3x6.js → de-WMKOGI7B-r1821wpe.js} +16 -7
  7. package/dist/de-XLT4QPIP-0rtw349w.js +32 -0
  8. package/dist/{en-JGJNQYMG-BSN3EE6C-mhg57v8h.js → en-ILA4HPE5-ALHGESZE-zrv4qss8.js} +267 -7
  9. package/dist/{en-JGJNQYMG-xq29xvhk.js → en-ILA4HPE5-fhwvq92r.js} +264 -4
  10. package/dist/{en-H54NJOH6-30ht8n64.js → en-P6PNWNTO-g1f6cjh5.js} +10 -4
  11. package/dist/{en-4UFXRW7N-mqabr9tf.js → en-X4DLPKLJ-dt1wtdm7.js} +17 -5
  12. package/dist/{es-GJOELELT-w1d3agm2.js → es-BBX4AUJX-h99fcr53.js} +14 -5
  13. package/dist/{es-CI4AE5B5-55sgqk64.js → es-BVPGJUWA-9gk2g9yb.js} +16 -7
  14. package/dist/{es-EYHYM5C4-RMLHZ2LF-s0fc3pd6.js → es-HTQSD352-YTAEDCE5-nhsbg581.js} +470 -47
  15. package/dist/{es-EYHYM5C4-3bajghda.js → es-HTQSD352-m9rr3f0g.js} +468 -45
  16. package/dist/{es-MX-AMZIGU27-5pembt6k.js → es-MX-3SP2SSV6-f20qspbr.js} +14 -5
  17. package/dist/{es-MX-QSQP2KWV-qvgkwvz2.js → es-MX-FOX525CG-87g500gr.js} +474 -51
  18. package/dist/{es-MX-QSQP2KWV-XR5DWKNF-kp7pk2s4.js → es-MX-FOX525CG-HLM27OEL-whr0t9v3.js} +476 -53
  19. package/dist/es-MX-OKNDG2NH-c1k1s1tg.js +32 -0
  20. package/dist/{es-MX-OLZNAYY5-30cmv1dx.js → es-MX-U6YL5KQX-ynwxdjr8.js} +16 -7
  21. package/dist/es-NQICVYSQ-aa9z3nhs.js +32 -0
  22. package/dist/{fr-FXFJQRD3-F5HV2VS7-pwdze89j.js → fr-54THJ4QH-IGABNGU6-fpzw2mba.js} +475 -52
  23. package/dist/{fr-FXFJQRD3-rfztd3e5.js → fr-54THJ4QH-d6ezjbhw.js} +473 -50
  24. package/dist/{fr-CCN6ZO5E-x2akzsjt.js → fr-EKTTDR7Z-bmpwp31r.js} +16 -7
  25. package/dist/{fr-LYFYWWCC-nn4reak0.js → fr-FSTBVVGK-t3y57xrb.js} +14 -5
  26. package/dist/fr-PFHIL7YZ-cxnshwa8.js +32 -0
  27. package/dist/index-6hp3p3eq.js +16489 -0
  28. package/dist/{index-w23k88b5.js → index-p50kx6jv.js} +202 -64
  29. package/dist/{index-hzp6y5m7.js → index-q59ephfh.js} +57 -3
  30. package/dist/index.js +19 -16
  31. package/dist/init.js +14 -11
  32. package/dist/{ja-IRXXIG6Q-b3att2bw.js → ja-FW33BJBW-htfk4d8t.js} +14 -5
  33. package/dist/{ja-G7NJYQ42-ve4gadd7.js → ja-MHUPLSWO-3qwy4jc0.js} +470 -47
  34. package/dist/{ja-G7NJYQ42-X76DVL7A-9p8b5115.js → ja-MHUPLSWO-CS3KE4Y3-mbtkzwd7.js} +472 -49
  35. package/dist/ja-P4OSE367-8ywxep9a.js +32 -0
  36. package/dist/{ja-O2NEV5D6-nt9rhd8c.js → ja-Y2YBTXNN-96cvy5av.js} +16 -7
  37. package/dist/{ko-M32WKZ3I-5td5jsw7.js → ko-PDO5AXNW-d653t4pc.js} +14 -5
  38. package/dist/ko-PYOS2KJP-5sbj5bp8.js +32 -0
  39. package/dist/{ko-7XWV2SEQ-chk3y7aj.js → ko-S33XAV26-cxf4dn2t.js} +16 -7
  40. package/dist/{ko-QDHECDTM-6WJAKMQI-0fpd4dqj.js → ko-XPJTXIKK-DNSW4KYQ-956vp61f.js} +469 -46
  41. package/dist/{ko-QDHECDTM-zmbqs9pr.js → ko-XPJTXIKK-w1hs4px7.js} +467 -44
  42. package/dist/{node-6xp9wf15.js → node-f062h75p.js} +11 -5
  43. package/dist/{node-strategy-fwj45942.js → node-strategy-8gzp67xs.js} +4 -4
  44. package/dist/{packager-tool-kvgt1s4z.js → packager-tool-03knb0er.js} +287 -22
  45. package/dist/{packager-tool-9ae2gt84.js → packager-tool-1g6958de.js} +19 -8
  46. package/dist/{packager-tool-vz3b1ea9.js → packager-tool-1gt6js73.js} +7 -914
  47. package/dist/{packager-tool-973f0r2g.js → packager-tool-1yy9x4vk.js} +17 -5
  48. package/dist/{packager-tool-jqtspg41.js → packager-tool-3wf3tkrc.js} +11 -5
  49. package/dist/packager-tool-6a7wdv5z.js +36187 -0
  50. package/dist/{packager-tool-mtrz8981.js → packager-tool-9x76z587.js} +140 -239
  51. package/dist/packager-tool-b0s5d4ek.js +10671 -0
  52. package/dist/{packager-tool-htc0z863.js → packager-tool-cqrsre00.js} +282 -27
  53. package/dist/{packager-tool-q9zrqwxw.js → packager-tool-ef2aypt3.js} +3257 -2669
  54. package/dist/{packager-tool-h3gpqv5a.js → packager-tool-jeh5j2xy.js} +6939 -3736
  55. package/dist/packager-tool-jpcm3xas.js +12 -0
  56. package/dist/{packager-tool-3gmj73c5.js → packager-tool-neavt1k3.js} +1 -1
  57. package/dist/packager-tool-nkrmjr3a.js +915 -0
  58. package/dist/{packager-tool-p1ts5b0h.js → packager-tool-ny53xmsd.js} +129 -49
  59. package/dist/{packager-tool-fr5b9qs6.js → packager-tool-pvgqbm48.js} +3 -3
  60. package/dist/{packager-tool-9qhez6bh.js → packager-tool-qfp49pq4.js} +964 -526
  61. package/dist/packager-tool-v2p6g3fd.js +41 -0
  62. package/dist/{packager-tool-2vme4a8e.js → packager-tool-xa2xwzrq.js} +9864 -16886
  63. package/dist/packager-tool.js +9 -8
  64. package/dist/{pt-VXJT4WUJ-nwkc9k2p.js → pt-4JEPEAST-40npwxyw.js} +471 -48
  65. package/dist/{pt-VXJT4WUJ-M3IR7CL5-1f2ph8gm.js → pt-4JEPEAST-JO5WN33S-ccdbdab2.js} +473 -50
  66. package/dist/{pt-BR-Z4J3LEEO-cf33d2zv.js → pt-BR-JO45SCNI-4kbfnzc4.js} +16 -7
  67. package/dist/{pt-BR-57EHXZKB-8g83gr5g.js → pt-BR-LQH3RSBB-kyb4jmcw.js} +14 -5
  68. package/dist/{pt-BR-SADBLGXA-WG4Q265J-w9tshygt.js → pt-BR-TV7NR3ID-PDSSHRHU-nddwzj29.js} +472 -49
  69. package/dist/{pt-BR-SADBLGXA-yd89fdy2.js → pt-BR-TV7NR3ID-vgd26pj1.js} +470 -47
  70. package/dist/pt-BR-Z3TUDJHM-n7ngej6s.js +32 -0
  71. package/dist/{pt-VNM2XWHA-62z625rh.js → pt-JLZYSSXX-7jth254x.js} +14 -5
  72. package/dist/pt-KSBWHAVQ-hd52bpsz.js +32 -0
  73. package/dist/{pt-CRSN3TCU-txxbbcxm.js → pt-W3NA4LIZ-f02gapvs.js} +16 -7
  74. package/dist/{ro-RISZ75LL-zwztp9j5.js → ro-E2EBPQGT-vn573vcr.js} +14 -5
  75. package/dist/{ro-7JHKFGCH-H3RYKSCL-4w49rx4m.js → ro-RKJ74FV3-QS3I6XKJ-kb31d85k.js} +475 -52
  76. package/dist/{ro-7JHKFGCH-hbtkeqdr.js → ro-RKJ74FV3-qn0ey39v.js} +473 -50
  77. package/dist/ro-VZUZTAMR-tccygznf.js +32 -0
  78. package/dist/{ro-WMQEVD7D-6mtq0e6b.js → ro-WLKX6HF5-fcbe2zz8.js} +16 -7
  79. package/dist/ru-GSCT4ARZ-3TVTUGWP-bbg6360z.js +15 -0
  80. package/dist/{serialization-JNQMGOXW-mj06e5pv.js → serialization-GTFWODSH-ajd6b7n2.js} +10 -8
  81. package/dist/services/flow-validate-service.d.ts +108 -0
  82. package/dist/services/node-service.d.ts +46 -0
  83. package/dist/services/node-validators/ceql-query-validator.d.ts +36 -10
  84. package/dist/services/node-validators/expression-prefix-validator.d.ts +3 -2
  85. package/dist/services/node-validators/index.d.ts +2 -1
  86. package/dist/services/project-artifacts.d.ts +14 -1
  87. package/dist/tool.js +17 -14
  88. package/dist/{tr-UCMB7W3T-xmxp2naq.js → tr-3U2W2XCA-zg3zcmq3.js} +15 -6
  89. package/dist/tr-W4AVRSQ4-bt3qqqdy.js +32 -0
  90. package/dist/{tr-Q6IHBFK7-BEUWO5CI-29rgfwjy.js → tr-X7R6GQNB-VMEZAWRJ-vdbjqw23.js} +484 -61
  91. package/dist/{tr-Q6IHBFK7-zs9rsm1b.js → tr-X7R6GQNB-shwv16dz.js} +482 -59
  92. package/dist/{tr-AUPQF34V-y3dhtj0w.js → tr-ZUUSMHER-pfn5dq1r.js} +14 -5
  93. package/dist/validation.js +14 -11
  94. package/dist/zh-CN-6YRAN57T-j7jp34ws.js +32 -0
  95. package/dist/{zh-CN-3BPA3WIX-JDICNKGH-m87940q5.js → zh-CN-FEZ24J4A-LSEMG63K-db8kf6rm.js} +472 -49
  96. package/dist/{zh-CN-3BPA3WIX-c5ts2m5v.js → zh-CN-FEZ24J4A-q5b5x20w.js} +470 -47
  97. package/dist/{zh-CN-2QOHEFC5-ryjb2byk.js → zh-CN-IPZYQR3P-1h76csc4.js} +16 -7
  98. package/dist/{zh-CN-3INOX2E5-txhr8e18.js → zh-CN-YFKQ7HBX-w98q5zqf.js} +14 -5
  99. package/dist/{zh-TW-UI34YLZQ-j79rg6b7.js → zh-TW-CP5PCVEJ-wvbxf7c7.js} +14 -5
  100. package/dist/{zh-TW-QCJEQC5S-b1v637hd.js → zh-TW-GKSCT6NW-4n1yfre0.js} +464 -41
  101. package/dist/{zh-TW-QCJEQC5S-DQ3454QP-y8vvrebz.js → zh-TW-GKSCT6NW-JLMWTDAF-g2smq1gm.js} +466 -43
  102. package/dist/zh-TW-SO2245GN-m5kh88bg.js +32 -0
  103. package/dist/{zh-TW-Q5QSSTS6-6y7yjbbn.js → zh-TW-YPVSQVGT-wbybwpwt.js} +16 -7
  104. package/package.json +2 -2
  105. package/dist/de-CS2KUCZ6-j5a38g9p.js +0 -20
  106. package/dist/es-MX-3MRZG6V4-9z56akxp.js +0 -20
  107. package/dist/es-QBAGOKHO-b2azze22.js +0 -20
  108. package/dist/fr-HVOCQCNI-1zn75qzy.js +0 -20
  109. package/dist/ja-VYAZOLWC-nbagzgre.js +0 -20
  110. package/dist/ko-EZTVBPMZ-9qq2mrrz.js +0 -20
  111. package/dist/packager-tool-ahm4ymrp.js +0 -12
  112. package/dist/packager-tool-hcdc89cf.js +0 -14010
  113. package/dist/pt-3TKAWGMJ-58y42w7x.js +0 -20
  114. package/dist/pt-BR-ASMQE3WA-9wb74cqx.js +0 -20
  115. package/dist/ro-A65KBZGL-qnwqqezz.js +0 -20
  116. package/dist/ru-GSCT4ARZ-YSDBAAM2-ha88ztsj.js +0 -15
  117. package/dist/tr-Z7YHMEX6-daq3vjbh.js +0 -20
  118. package/dist/zh-CN-W7FK4GLU-vn3n8fcq.js +0 -20
  119. package/dist/zh-TW-PHOEUN3F-t56cjsgw.js +0 -20
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  registerPackagerFactories
3
- } from "./packager-tool-3gmj73c5.js";
3
+ } from "./packager-tool-neavt1k3.js";
4
4
  import {
5
5
  flowInitAsync
6
- } from "./packager-tool-9ae2gt84.js";
6
+ } from "./packager-tool-1g6958de.js";
7
7
  import {
8
8
  ERROR_SOURCE_PORT,
9
9
  FlowEvalFileStore,
@@ -35,18 +35,14 @@ import {
35
35
  stageInlineAgentPackageFiles,
36
36
  writePackagingArtifacts,
37
37
  writePackagingArtifactsDetailed
38
- } from "./packager-tool-9qhez6bh.js";
38
+ } from "./packager-tool-qfp49pq4.js";
39
39
  import {
40
40
  ensureProjectId
41
41
  } from "./packager-tool-7yjpwj92.js";
42
42
  import {
43
43
  FilterNotSupportedError,
44
- JobsApi,
45
44
  MANAGED_HTTP_CONNECTOR_KEY,
46
45
  MaestroHttpError,
47
- PackageFeedsApi,
48
- ProcessesApi,
49
- ReleasesApi,
50
46
  VALID_PACKAGE_NAME_REGEX,
51
47
  allDefinitions,
52
48
  applySavedFilterTree,
@@ -54,27 +50,20 @@ import {
54
50
  buildInputMetadata,
55
51
  buildManagedHttpEssentialConfiguration,
56
52
  buildSolutionPackageFromDir,
57
- createApiClient,
58
53
  createConfiguredActivityClient,
59
- createOrchestratorConfig,
60
54
  createZipFromDir,
61
55
  debugPimsGet,
62
56
  extractMultipartParameters,
63
57
  extractStartEventId,
64
58
  fetchConnectionInfo,
65
59
  fetchConnectorMetadata,
66
- findNearestParentUipxFile,
67
60
  findProjectFlowFile,
68
- findSolutionFile,
69
61
  formatTraceLine,
70
- getAuthContext,
71
62
  getFolderInfoById,
72
- getLoginStatusAsync,
73
63
  getPersonalFolderInfo,
74
64
  getPersonalFolderKey,
75
65
  getStudioWebSolutionProjects,
76
66
  inlineMultipartFileValues,
77
- isProjectRegisteredInSolution,
78
67
  isSuccessfulDebugStatus,
79
68
  nodeModuleRegistry,
80
69
  normalizeHttpMethod,
@@ -82,21 +71,34 @@ import {
82
71
  patchConnectionOverwrites,
83
72
  prepareForCustomDebug,
84
73
  readFlowWorkflow,
85
- readUipxFile,
86
74
  registerRegistryCommand,
87
75
  registerSharedDebugInstanceCommands,
88
76
  registerSharedIncidentCommands,
89
77
  registerSharedInstanceCommands,
90
78
  registerSharedProcessCommands,
91
79
  registerSharedProcessesCommands,
92
- resolveFolder,
93
80
  substituteFilterVariables,
94
- updateSolutionFile,
95
81
  uploadAndDebugSolution,
96
- uploadJobAttachment,
97
82
  uploadOrOverwriteSolution,
98
83
  writeFlowWorkflow
99
- } from "./packager-tool-2vme4a8e.js";
84
+ } from "./packager-tool-xa2xwzrq.js";
85
+ import {
86
+ JobsApi,
87
+ PackageFeedsApi,
88
+ ProcessesApi,
89
+ ReleasesApi,
90
+ createApiClient,
91
+ createOrchestratorConfig,
92
+ findNearestParentUipxFile,
93
+ findSolutionFile,
94
+ getAuthContext,
95
+ getLoginStatusAsync,
96
+ isProjectRegisteredInSolution,
97
+ readUipxFile,
98
+ resolveFolder,
99
+ updateSolutionFile,
100
+ uploadJobAttachment
101
+ } from "./packager-tool-b0s5d4ek.js";
100
102
  import {
101
103
  ATTACHMENT_INSTRUCTIONS,
102
104
  ATTACHMENT_UPLOAD_INSTRUCTIONS,
@@ -110,7 +112,6 @@ import {
110
112
  appendOption,
111
113
  catchError,
112
114
  createHiddenDeprecatedTenantOption,
113
- ensureToolModule,
114
115
  extractErrorMessage,
115
116
  extractErrorMessageSync,
116
117
  getSdkUserAgentToken,
@@ -128,7 +129,7 @@ import {
128
129
  readStdin,
129
130
  registerPackageMetadataOptions,
130
131
  resolveAttachmentInputs
131
- } from "./packager-tool-p1ts5b0h.js";
132
+ } from "./packager-tool-ny53xmsd.js";
132
133
  import {
133
134
  getFileSystem
134
135
  } from "./packager-tool-1cb0d5e0.js";
@@ -157,15 +158,17 @@ import {
157
158
  setPublishIntentOnInlineAgents,
158
159
  snapToGrid,
159
160
  validateIdentifier
160
- } from "./packager-tool-hcdc89cf.js";
161
+ } from "./packager-tool-6a7wdv5z.js";
161
162
  import {
162
163
  compareVersions,
163
164
  executeWritePlan,
164
165
  generatePackageDescriptor,
165
166
  generateRandomId,
166
167
  inMemoryWorkflowToFileFormat,
168
+ isExpressionValue,
169
+ isStartEventNode,
167
170
  planWriteThrough
168
- } from "./packager-tool-q9zrqwxw.js";
171
+ } from "./packager-tool-ef2aypt3.js";
169
172
  import {
170
173
  __require,
171
174
  __toESM
@@ -174,7 +177,7 @@ import {
174
177
  var package_default = {
175
178
  name: "@uipath/flow-tool",
176
179
  license: "MIT",
177
- version: "1.201.0-preview.115",
180
+ version: "1.201.0-preview.121",
178
181
  description: "Create, debug, and run UiPath Flow projects and jobs.",
179
182
  private: false,
180
183
  repository: {
@@ -223,11 +226,11 @@ var package_default = {
223
226
  "@uipath/builder-sdk": "workspace:*",
224
227
  "@uipath/common": "workspace:*",
225
228
  "@uipath/filesystem": "workspace:*",
226
- "@uipath/flow-core": "^0.34.3",
229
+ "@uipath/flow-core": "^0.68.0",
227
230
  elkjs: "^0.11.1",
228
- "@uipath/flow-converter": "^0.25.4",
229
- "@uipath/flow-migrations": "^0.15.4",
230
- "@uipath/flow-schema": "^0.22.4",
231
+ "@uipath/flow-converter": "^0.42.1",
232
+ "@uipath/flow-migrations": "^0.33.0",
233
+ "@uipath/flow-schema": "^0.42.0",
231
234
  "@uipath/integrationservice-sdk": "workspace:*",
232
235
  i18next: "^23.16.8",
233
236
  "@uipath/maestro-sdk": "workspace:*",
@@ -1306,7 +1309,7 @@ class FlowDebugService {
1306
1309
  ];
1307
1310
  const startNodeId = entryPoints[0]?.filePath.split("#")[1] ?? startEventId;
1308
1311
  entryPoint = `/${bpmnFileName}#${startNodeId}`;
1309
- const [refreshError, refreshResult] = await catchError(ensureToolModule("solution", "@uipath/solution-tool", "resource").then((mod) => mod.resourceRefreshAsync(stagingDir)));
1312
+ const [refreshError, refreshResult] = await catchError(import("./index-6hp3p3eq.js").then((mod) => mod.resourceRefreshAsync(stagingDir)));
1310
1313
  if (refreshError) {
1311
1314
  logger.warn(`Resource refresh threw before debug: ${refreshError.message}. Continuing without generated overwrites.`);
1312
1315
  } else if (refreshResult.ok) {
@@ -6771,10 +6774,32 @@ function buildAgentToolParamsFromMetadata(metadata, method) {
6771
6774
  }
6772
6775
  var UNRESOLVABLE_FILTER_MARKER = "${=js:";
6773
6776
  var MANGLED_FILTER_FRAGMENT = "${";
6774
- function assertCompiledFilterResolvable(compiled, filterParamName) {
6777
+ var DANGLING_TRAILING_OPERATOR = /(?:^|\s)(?:AND|OR)\s*$/i;
6778
+ var DANGLING_LEADING_OPERATOR = /^\s*(?:AND|OR)(?:\s|$)/i;
6779
+ var DOUBLED_OPERATOR = /(?:^|\s)(?:AND|OR)\s+(?:AND|OR)(?:\s|$)/i;
6780
+ function collectFilterFieldIds(tree) {
6781
+ const ids = (tree.filters ?? []).map((condition) => condition.id);
6782
+ for (const group of tree.groups ?? []) {
6783
+ ids.push(...collectFilterFieldIds(group));
6784
+ }
6785
+ return ids;
6786
+ }
6787
+ function assertCompiledFilterResolvable(compiled, filterParamName, authoredTree) {
6775
6788
  if (compiled.includes(MANGLED_FILTER_FRAGMENT)) {
6776
6789
  throw new Error(`Refusing to persist the compiled filter for '${filterParamName}': it embeds a '\${…}' fragment, which the runtime never resolves — the fragment reaches the connector as literal text and the filter silently matches nothing. Cause: either a dynamic operand escaped placeholder substitution, or the design-time client mis-marked a literal value as an expression (widget-metadata defect ENGCE-60123). Workaround: author the whole filter as one '=js:' template under --detail.queryParameters.${filterParamName} (activities), or re-author the filter with values the connector's picker supports (triggers).`);
6777
6790
  }
6791
+ if (!authoredTree)
6792
+ return;
6793
+ const fieldIds = collectFilterFieldIds(authoredTree);
6794
+ if (fieldIds.length === 0)
6795
+ return;
6796
+ const isEmpty = compiled.trim() === "";
6797
+ const isMalformed = DANGLING_TRAILING_OPERATOR.test(compiled) || DANGLING_LEADING_OPERATOR.test(compiled) || DOUBLED_OPERATOR.test(compiled);
6798
+ if (!isEmpty && !isMalformed)
6799
+ return;
6800
+ const outcome = isEmpty ? "The compiled expression is empty, so the filter disappears and the query returns every record." : `The compiled expression is broken: '${compiled}'. It holds a stray logical operator, so the connector faults at run time.`;
6801
+ const names = [...new Set(fieldIds)].map((id) => `'${id}'`).join(", ");
6802
+ throw new InvalidDetailError(`Refusing to persist the compiled filter for '${filterParamName}': the connector dropped at least one condition of --detail.filter. ${outcome} The filter tree names these fields: ${names}. Cause: a field id does not match the entity schema, or a condition has no operator. Field id matching is case-sensitive. Fix: read the supported field ids, then re-send --detail.filter with the exact ids. Run 'uip df entities get <ENTITY_ID> --output json' for a Data Service entity, or 'uip maestro flow registry get <NODE_TYPE> --connection-id <CONNECTION_ID> --output json' and read filterFields for a connector.`);
6778
6803
  }
6779
6804
  function assertLiteralEventParameters(eventParameters, nodeType) {
6780
6805
  const dynamic = Object.entries(eventParameters).filter(([, value]) => typeof value === "string" && value.startsWith("=js:")).map(([name]) => `'${name}'`);
@@ -6883,7 +6908,7 @@ async function configureActivity(workflow, node, config) {
6883
6908
  assertActivityMetadataResolved(activityClient.getEssentialConfiguration().essentialConfiguration, config.connectionId);
6884
6909
  if (filterInputName && authoredFilterTree) {
6885
6910
  const compiledFilter = activityClient.getCompiledFilter(filterInputName);
6886
- assertCompiledFilterResolvable(compiledFilter, filterInputName);
6911
+ assertCompiledFilterResolvable(compiledFilter, filterInputName, authoredFilterTree);
6887
6912
  detail.queryParameters = {
6888
6913
  ...detail.queryParameters ?? {},
6889
6914
  [filterInputName]: compiledFilter
@@ -6973,7 +6998,7 @@ async function configureTrigger(workflow, node, config) {
6973
6998
  });
6974
6999
  assertActivityMetadataResolved(triggerClient.getEssentialConfiguration().essentialConfiguration, config.connectionId);
6975
7000
  const compiledTriggerFilter = triggerClient.getCompiledFilter("filter");
6976
- assertCompiledFilterResolvable(compiledTriggerFilter, "filter");
7001
+ assertCompiledFilterResolvable(compiledTriggerFilter, "filter", filterTree);
6977
7002
  detail.filterExpression = compiledTriggerFilter;
6978
7003
  if (filterTree && Object.keys(filterVariables).length > 0) {
6979
7004
  detail.filterVariables = filterVariables;
@@ -7482,7 +7507,7 @@ Packing flow project...
7482
7507
  const packageId = `${packageName}.flow.Flow`;
7483
7508
  const version = options.version || "1.0.0";
7484
7509
  registerPackagerFactories();
7485
- const { createNodeProjectPackager, ProjectPackOptions } = await import("./node-6xp9wf15.js");
7510
+ const { createNodeProjectPackager, ProjectPackOptions } = await import("./node-f062h75p.js");
7486
7511
  const packager = await createNodeProjectPackager({
7487
7512
  logHandler: logger.handleLog
7488
7513
  });
@@ -8558,9 +8583,10 @@ var ElkLayoutEngine = class {
8558
8583
  const elk = await this.getElk();
8559
8584
  const layouted = await elk.layout(graph);
8560
8585
  const updatedNodes = this.extractNodePositions(nodes, layouted);
8586
+ const edgeWaypoints = this.extractEdgeWaypoints(layouted, new Set(edges.map((e) => e.id)));
8561
8587
  const endTime = performance.now();
8562
8588
  const metrics = this.calculateMetrics(layouted, endTime - startTime);
8563
- return { nodes: updatedNodes, metrics };
8589
+ return { nodes: updatedNodes, edgeWaypoints, metrics };
8564
8590
  }
8565
8591
  collectPorts(nodes, options, resolveNodePorts) {
8566
8592
  const nodePortsMap = /* @__PURE__ */ new Map;
@@ -8795,6 +8821,17 @@ var ElkLayoutEngine = class {
8795
8821
  return { ...node, position: { x: pos.x, y: pos.y } };
8796
8822
  });
8797
8823
  }
8824
+ extractEdgeWaypoints(root, realEdgeIds) {
8825
+ const result = /* @__PURE__ */ new Map;
8826
+ for (const edge of root.edges ?? []) {
8827
+ if (!realEdgeIds.has(edge.id))
8828
+ continue;
8829
+ const points = (edge.sections ?? []).flatMap((s) => s.bendPoints ?? []).map((p) => ({ x: p.x, y: p.y }));
8830
+ if (points.length > 0)
8831
+ result.set(edge.id, points);
8832
+ }
8833
+ return result;
8834
+ }
8798
8835
  getLayoutOptions(options) {
8799
8836
  const opts = {
8800
8837
  "elk.algorithm": options.algorithm,
@@ -8812,6 +8849,7 @@ var ElkLayoutEngine = class {
8812
8849
  }
8813
8850
  opts["elk.spacing.edgeNode"] = options.nodeSpacing.toString();
8814
8851
  opts["elk.spacing.edgeEdge"] = "16";
8852
+ opts["elk.edgeRouting"] = "ORTHOGONAL";
8815
8853
  break;
8816
8854
  case "mrtree":
8817
8855
  opts["elk.spacing.nodeNode"] = options.nodeSpacing.toString();
@@ -9424,7 +9462,7 @@ function querystringSingleKey(key, value, keyPrefix = "") {
9424
9462
  var package_default2 = {
9425
9463
  name: "@uipath/agent-sdk",
9426
9464
  license: "MIT",
9427
- version: "1.201.0-preview.115",
9465
+ version: "1.201.0-preview.121",
9428
9466
  description: "SDK for the UiPath Agent Runtime API — evaluation execution and debug sessions.",
9429
9467
  repository: {
9430
9468
  type: "git",
@@ -9633,6 +9671,13 @@ var registerValidateCommand = (program) => {
9633
9671
  };
9634
9672
 
9635
9673
  // src/services/variable-service.ts
9674
+ var expressionText = (expression) => {
9675
+ if (typeof expression === "string")
9676
+ return expression;
9677
+ if (isExpressionValue(expression))
9678
+ return expression.expression;
9679
+ return "";
9680
+ };
9636
9681
  var listVariablesInFlow = async (filePath) => {
9637
9682
  const { workflow } = await readFlowWorkflow(filePath);
9638
9683
  const globals = (workflow.variables?.globals ?? []).map((v) => ({
@@ -9640,7 +9685,10 @@ var listVariablesInFlow = async (filePath) => {
9640
9685
  type: v.type,
9641
9686
  direction: v.direction,
9642
9687
  ...v.defaultValue !== undefined && { defaultValue: v.defaultValue },
9643
- ...v.description !== undefined && { description: v.description }
9688
+ ...v.description !== undefined && { description: v.description },
9689
+ ...v.triggerNodeId !== undefined && {
9690
+ triggerNodeId: v.triggerNodeId
9691
+ }
9644
9692
  }));
9645
9693
  const nodes = (workflow.variables?.nodes ?? []).map((v) => ({
9646
9694
  id: v.id,
@@ -9652,14 +9700,44 @@ var listVariablesInFlow = async (filePath) => {
9652
9700
  const variables = [...globals, ...nodes];
9653
9701
  return { variables, count: variables.length };
9654
9702
  };
9703
+ var resolveTriggerNodeId = (nodes, explicitTriggerNodeId) => {
9704
+ const triggerNodes = nodes.filter((node) => isStartEventNode({
9705
+ id: node.id,
9706
+ type: node.type,
9707
+ typeVersion: node.typeVersion ?? "1.0"
9708
+ }));
9709
+ if (explicitTriggerNodeId !== undefined) {
9710
+ if (!nodes.some((node) => node.id === explicitTriggerNodeId)) {
9711
+ const available = nodes.map((node) => node.id).join(", ");
9712
+ throw new Error(available ? `Node '${explicitTriggerNodeId}' not found in the flow. Available nodes: ${available}` : `Node '${explicitTriggerNodeId}' not found. The flow has no nodes`);
9713
+ }
9714
+ if (!triggerNodes.some((node) => node.id === explicitTriggerNodeId)) {
9715
+ const triggerIds = triggerNodes.map((node) => node.id).join(", ");
9716
+ throw new Error(triggerIds ? `Node '${explicitTriggerNodeId}' is not a trigger node. Trigger nodes in this flow: ${triggerIds}` : `Node '${explicitTriggerNodeId}' is not a trigger node. The flow has no trigger nodes`);
9717
+ }
9718
+ return explicitTriggerNodeId;
9719
+ }
9720
+ if (triggerNodes.length === 0) {
9721
+ return;
9722
+ }
9723
+ if (triggerNodes.length > 1) {
9724
+ const triggerIds = triggerNodes.map((node) => node.id).join(", ");
9725
+ throw new Error(`Flow has multiple trigger nodes (${triggerIds}); each is a separate entry point. Pass --trigger-node-id <nodeId> to choose which one this input belongs to`);
9726
+ }
9727
+ return triggerNodes[0].id;
9728
+ };
9655
9729
  var addVariableToFlow = async (filePath, options) => {
9730
+ if (options.triggerNodeId !== undefined && options.direction !== "in") {
9731
+ throw new Error(`--trigger-node-id applies only to input variables (--direction in), but --direction is '${options.direction}'`);
9732
+ }
9656
9733
  const { workflow, refMap } = await readFlowWorkflow(filePath);
9657
9734
  const globals = workflow.variables?.globals ?? [];
9658
9735
  const duplicate = globals.find((v) => v.id === options.id);
9659
9736
  if (duplicate) {
9660
9737
  throw new Error(`Variable '${options.id}' already exists in the flow file`);
9661
9738
  }
9662
- const variable = createWorkflowVariable({
9739
+ const triggerNodeId = options.direction === "in" ? resolveTriggerNodeId(workflow.nodes ?? [], options.triggerNodeId) : undefined;
9740
+ const created = createWorkflowVariable({
9663
9741
  id: options.id,
9664
9742
  direction: options.direction,
9665
9743
  type: options.type,
@@ -9668,6 +9746,7 @@ var addVariableToFlow = async (filePath, options) => {
9668
9746
  description: options.description,
9669
9747
  schema: options.schema
9670
9748
  });
9749
+ const variable = triggerNodeId === undefined ? created : { ...created, triggerNodeId };
9671
9750
  addVariable(workflow, variable);
9672
9751
  await writeFlowWorkflow(filePath, workflow, refMap);
9673
9752
  return variable;
@@ -9686,7 +9765,7 @@ var deleteVariableFromFlow = async (filePath, variableId) => {
9686
9765
  const cleaned = {};
9687
9766
  for (const [nodeId, updates] of Object.entries(updatedVariableUpdates)) {
9688
9767
  const varRefPattern = new RegExp(`\\$vars\\.${variableId}\\b`);
9689
- const filtered = updates.filter((u) => u.variableId !== variableId && !varRefPattern.test(u.expression));
9768
+ const filtered = updates.filter((u) => u.variableId !== variableId && !varRefPattern.test(expressionText(u.expression)));
9690
9769
  if (filtered.length > 0) {
9691
9770
  cleaned[nodeId] = filtered;
9692
9771
  }
@@ -9705,7 +9784,7 @@ var deleteVariableFromFlow = async (filePath, variableId) => {
9705
9784
  // src/commands/variable.ts
9706
9785
  var VARIABLE_ADD_EXAMPLES = [
9707
9786
  {
9708
- Description: "Add a string input variable to a flow",
9787
+ Description: "Add a string input variable to a flow (auto-bound to the flow's trigger node, making it an entry-point input)",
9709
9788
  Command: "uip maestro flow variable add flow.json myInput --direction in --type string",
9710
9789
  Output: {
9711
9790
  Code: "VariableAddSuccess",
@@ -9713,7 +9792,23 @@ var VARIABLE_ADD_EXAMPLES = [
9713
9792
  Variable: {
9714
9793
  id: "myInput",
9715
9794
  direction: "in",
9716
- type: "string"
9795
+ type: "string",
9796
+ triggerNodeId: "manualTrigger1"
9797
+ }
9798
+ }
9799
+ }
9800
+ },
9801
+ {
9802
+ Description: "Bind an input to a specific trigger when the flow has several entry points",
9803
+ Command: "uip maestro flow variable add flow.json myInput --direction in --type string --trigger-node-id timerTrigger1",
9804
+ Output: {
9805
+ Code: "VariableAddSuccess",
9806
+ Data: {
9807
+ Variable: {
9808
+ id: "myInput",
9809
+ direction: "in",
9810
+ type: "string",
9811
+ triggerNodeId: "timerTrigger1"
9717
9812
  }
9718
9813
  }
9719
9814
  }
@@ -9800,7 +9895,7 @@ function parseDefaultValue(value, type) {
9800
9895
  }
9801
9896
  var registerVariableCommand = (program) => {
9802
9897
  const variable = program.command("variable").description("Manage variables in a Flow file");
9803
- variable.command("add").description("Add a variable to a Flow file").argument("<file>", "Path to the .flow file").argument("<variable-id>", "Variable identifier (e.g. myInputVar)").requiredOption("-d, --direction <direction>", `Variable direction (${VALID_DIRECTIONS.join(", ")})`).option("-t, --type <type>", `Data type (${VALID_TYPES.join(", ")})`, "string").option("--default-value <value>", "Default value (parsed based on --type)").option("--description <text>", "Human-readable description").option("--schema <json>", "JSON schema for object/array types").option("--sub-type <subType>", "Sub-type for complex types").examples(VARIABLE_ADD_EXAMPLES).trackedAction(processContext, async (file, variableId, options) => {
9898
+ variable.command("add").description("Add a variable to a Flow file").argument("<file>", "Path to the .flow file").argument("<variable-id>", "Variable identifier (e.g. myInputVar)").requiredOption("-d, --direction <direction>", `Variable direction (${VALID_DIRECTIONS.join(", ")})`).option("-t, --type <type>", `Data type (${VALID_TYPES.join(", ")})`, "string").option("--default-value <value>", "Default value (parsed based on --type)").option("--description <text>", "Human-readable description").option("--schema <json>", "JSON schema for object/array types").option("--sub-type <subType>", "Sub-type for complex types").option("--trigger-node-id <nodeId>", "Trigger node an input variable belongs to (defaults to the flow's only trigger node; required when the flow has several)").examples(VARIABLE_ADD_EXAMPLES).trackedAction(processContext, async (file, variableId, options) => {
9804
9899
  const identifierError = validateIdentifier(variableId, []);
9805
9900
  if (identifierError) {
9806
9901
  OutputFormatter.error({
@@ -9873,7 +9968,8 @@ var registerVariableCommand = (program) => {
9873
9968
  subType: options.subType,
9874
9969
  defaultValue,
9875
9970
  description: options.description,
9876
- schema
9971
+ schema,
9972
+ triggerNodeId: options.triggerNodeId
9877
9973
  }));
9878
9974
  if (error) {
9879
9975
  OutputFormatter.error({
@@ -9943,200 +10039,6 @@ var registerVariableCommand = (program) => {
9943
10039
  });
9944
10040
  };
9945
10041
 
9946
- // src/services/variable-update-service.ts
9947
- var addVariableUpdateToFlow = async (filePath, options) => {
9948
- const { workflow, refMap } = await readFlowWorkflow(filePath);
9949
- const nodeExists = (workflow.nodes ?? []).some((n) => n.id === options.nodeId);
9950
- if (!nodeExists) {
9951
- throw new Error(`Node '${options.nodeId}' not found in the workflow`);
9952
- }
9953
- const globals = workflow.variables?.globals ?? [];
9954
- const variable = globals.find((v) => v.id === options.variableId);
9955
- if (!variable) {
9956
- throw new Error(`Variable '${options.variableId}' not found in workflow globals`);
9957
- }
9958
- if (variable.direction === "in") {
9959
- throw new Error(`Variable '${options.variableId}' has direction 'in' and cannot be assigned to. Only 'out' or 'inout' variables can be updated`);
9960
- }
9961
- const variableUpdates = workflow.variables?.variableUpdates ?? {};
9962
- const nodeUpdates = variableUpdates[options.nodeId] ?? [];
9963
- const duplicate = nodeUpdates.find((u) => u.variableId === options.variableId);
9964
- if (duplicate) {
9965
- throw new Error(`Variable update for variable '${options.variableId}' on node '${options.nodeId}' already exists. Use 'variable-update set' to replace it`);
9966
- }
9967
- const expression = options.expression.startsWith("=js:") ? options.expression : `=js:${options.expression}`;
9968
- const update = { variableId: options.variableId, expression };
9969
- nodeUpdates.push(update);
9970
- variableUpdates[options.nodeId] = nodeUpdates;
9971
- if (!workflow.variables) {
9972
- workflow.variables = {};
9973
- }
9974
- workflow.variables.variableUpdates = variableUpdates;
9975
- await writeFlowWorkflow(filePath, workflow, refMap);
9976
- return {
9977
- nodeId: options.nodeId,
9978
- variableId: options.variableId,
9979
- expression
9980
- };
9981
- };
9982
- var deleteVariableUpdateFromFlow = async (filePath, nodeId, variableId) => {
9983
- const { workflow, refMap } = await readFlowWorkflow(filePath);
9984
- const updatesMap = workflow.variables?.variableUpdates;
9985
- const nodeUpdates = updatesMap?.[nodeId];
9986
- if (!nodeUpdates || nodeUpdates.length === 0) {
9987
- throw new Error(`No variable updates found for node "${nodeId}". Use 'uip maestro flow variable-update list' to see existing updates.`);
9988
- }
9989
- const entryIndex = nodeUpdates.findIndex((e) => e.variableId === variableId);
9990
- if (entryIndex === -1) {
9991
- throw new Error(`No update for variable "${variableId}" on node "${nodeId}". Use 'uip maestro flow variable-update list' to see existing updates.`);
9992
- }
9993
- const [deleted] = nodeUpdates.splice(entryIndex, 1);
9994
- if (nodeUpdates.length === 0 && updatesMap) {
9995
- delete updatesMap[nodeId];
9996
- }
9997
- await writeFlowWorkflow(filePath, workflow, refMap);
9998
- return {
9999
- deletedUpdate: {
10000
- nodeId,
10001
- variableId: deleted.variableId,
10002
- expression: deleted.expression
10003
- }
10004
- };
10005
- };
10006
- var listVariableUpdatesInFlow = async (filePath, options) => {
10007
- const { workflow } = await readFlowWorkflow(filePath);
10008
- const updatesRecord = workflow.variables?.variableUpdates ?? {};
10009
- let variableUpdates = Object.entries(updatesRecord).flatMap(([nodeId, updates]) => (Array.isArray(updates) ? updates : []).filter((u) => typeof u?.variableId === "string" && typeof u?.expression === "string").map((u) => ({
10010
- nodeId,
10011
- variableId: u.variableId,
10012
- expression: u.expression
10013
- })));
10014
- if (options?.nodeId) {
10015
- variableUpdates = variableUpdates.filter((u) => u.nodeId === options.nodeId);
10016
- }
10017
- return { variableUpdates, count: variableUpdates.length };
10018
- };
10019
-
10020
- // src/commands/variable-update.ts
10021
- var VARIABLE_UPDATE_ADD_EXAMPLES = [
10022
- {
10023
- Description: "Add a variable update expression to a node",
10024
- Command: 'uip maestro flow variable-update add flow.json --node-id node_a1b2c3d4 --variable-id var_1 --expression "=js:ctx.output"',
10025
- Output: {
10026
- Code: "VariableUpdateAddSuccess",
10027
- Data: {
10028
- VariableUpdate: {
10029
- nodeId: "node_a1b2c3d4",
10030
- variableId: "var_1",
10031
- expression: "=js:ctx.output"
10032
- }
10033
- }
10034
- }
10035
- }
10036
- ];
10037
- var VARIABLE_UPDATE_DELETE_EXAMPLES = [
10038
- {
10039
- Description: "Remove a variable update from a node",
10040
- Command: "uip maestro flow variable-update remove flow.json node_a1b2c3d4 var_1",
10041
- Output: {
10042
- Code: "VariableUpdateRemoveSuccess",
10043
- Data: {
10044
- DeletedUpdate: {
10045
- nodeId: "node_a1b2c3d4",
10046
- variableId: "var_1"
10047
- }
10048
- }
10049
- }
10050
- }
10051
- ];
10052
- var VARIABLE_UPDATE_LIST_EXAMPLES = [
10053
- {
10054
- Description: "List all variable updates in a flow",
10055
- Command: "uip maestro flow variable-update list flow.json",
10056
- Output: {
10057
- Code: "VariableUpdateListSuccess",
10058
- Data: {
10059
- VariableUpdates: [
10060
- {
10061
- nodeId: "node_a1b2c3d4",
10062
- variableId: "var_1",
10063
- expression: "=js:ctx.output"
10064
- }
10065
- ],
10066
- Count: 1
10067
- }
10068
- }
10069
- }
10070
- ];
10071
- var registerVariableUpdateCommand = (program) => {
10072
- const variableUpdate = program.command("variable-update").description("Manage variable updates in a Flow file");
10073
- variableUpdate.command("add").description("Add a variable update expression to a node").argument("<file>", "Path to the .flow file").requiredOption("--node-id <id>", "Node that triggers the update on completion").requiredOption("--variable-id <id>", "Global variable to assign to (must be out or inout)").requiredOption("--expression <expr>", "JS expression to evaluate (auto-prefixed with =js: if missing)").examples(VARIABLE_UPDATE_ADD_EXAMPLES).trackedAction(processContext, async (file, options) => {
10074
- const [error, result] = await catchError(addVariableUpdateToFlow(file, {
10075
- nodeId: options.nodeId,
10076
- variableId: options.variableId,
10077
- expression: options.expression
10078
- }));
10079
- if (error) {
10080
- OutputFormatter.error({
10081
- Result: RESULTS.Failure,
10082
- Message: "Error adding variable update",
10083
- Instructions: error.message
10084
- });
10085
- processContext.exit(1);
10086
- return;
10087
- }
10088
- OutputFormatter.success({
10089
- Result: RESULTS.Success,
10090
- Code: "VariableUpdateAddSuccess",
10091
- Data: {
10092
- VariableUpdate: result
10093
- }
10094
- });
10095
- });
10096
- variableUpdate.command("remove").description(`Remove a variable update from a node in a Flow file.
10097
- ` + "Use 'uip maestro flow variable-update list' to find node and variable IDs.").argument("<file>", "Path to the .flow file").argument("<node-id>", "ID of the node").argument("<variable-id>", "ID of the variable").examples(VARIABLE_UPDATE_DELETE_EXAMPLES).trackedAction(processContext, async (file, nodeId, variableId) => {
10098
- const [error, result] = await catchError(deleteVariableUpdateFromFlow(file, nodeId, variableId));
10099
- if (error) {
10100
- OutputFormatter.error({
10101
- Result: RESULTS.Failure,
10102
- Message: "Error deleting variable update",
10103
- Instructions: error.message
10104
- });
10105
- processContext.exit(1);
10106
- return;
10107
- }
10108
- OutputFormatter.success({
10109
- Result: RESULTS.Success,
10110
- Code: "VariableUpdateRemoveSuccess",
10111
- Data: {
10112
- DeletedUpdate: result.deletedUpdate
10113
- }
10114
- });
10115
- });
10116
- variableUpdate.command("list").description("List all variable updates in a Flow file").argument("<file>", "Path to the .flow file").option("--node-id <id>", "Filter to updates on a specific node").examples(VARIABLE_UPDATE_LIST_EXAMPLES).trackedAction(processContext, async (file, options) => {
10117
- const [error, result] = await catchError(listVariableUpdatesInFlow(file, {
10118
- nodeId: options.nodeId
10119
- }));
10120
- if (error) {
10121
- OutputFormatter.error({
10122
- Result: RESULTS.Failure,
10123
- Message: "Error listing variable updates",
10124
- Instructions: error.message
10125
- });
10126
- processContext.exit(1);
10127
- return;
10128
- }
10129
- OutputFormatter.success({
10130
- Result: RESULTS.Success,
10131
- Code: "VariableUpdateListSuccess",
10132
- Data: {
10133
- VariableUpdates: result.variableUpdates,
10134
- Count: result.count
10135
- }
10136
- });
10137
- });
10138
- };
10139
-
10140
10042
  // src/tool.ts
10141
10043
  var metadata = {
10142
10044
  name: "flow-tool",
@@ -10146,7 +10048,7 @@ var metadata = {
10146
10048
  };
10147
10049
  var registerCommands = async (program) => {
10148
10050
  if (isPreviewBuild()) {
10149
- const { registerFlowAuthoringCommands } = await import("./authoring-vbbqwp0v.js");
10051
+ const { registerFlowAuthoringCommands } = await import("./authoring-rezk32bm.js");
10150
10052
  registerFlowAuthoringCommands(program);
10151
10053
  }
10152
10054
  registerInitCommand(program);
@@ -10169,9 +10071,8 @@ var registerCommands = async (program) => {
10169
10071
  registerIncidentsCommand(program);
10170
10072
  registerTidyCommand(program);
10171
10073
  registerVariableCommand(program);
10172
- registerVariableUpdateCommand(program);
10173
10074
  };
10174
10075
 
10175
10076
  export { metadata, registerCommands };
10176
10077
 
10177
- //# debugId=84ABB506AA978E1F64756E2164756E21
10078
+ //# debugId=8FD717C3B3B7EC5B64756E2164756E21