qsharp-lang 1.23.1-dev → 1.23.2-dev

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 (342) hide show
  1. package/dist/browser.d.ts +1 -1
  2. package/dist/katas-content.generated.js +1 -1
  3. package/dist/katas-content.generated.md.js +1 -1
  4. package/dist/main.d.ts +1 -0
  5. package/dist/samples.generated.js +1 -1
  6. package/docs/Microsoft.Quantum.Core/IsRangeEmpty.md +1 -1
  7. package/docs/Microsoft.Quantum.Core/Length.md +1 -1
  8. package/docs/Microsoft.Quantum.Core/RangeEnd.md +1 -1
  9. package/docs/Microsoft.Quantum.Core/RangeStart.md +1 -1
  10. package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
  11. package/docs/Microsoft.Quantum.Core/index.md +1 -1
  12. package/docs/Std.Arithmetic/AddLE.md +1 -1
  13. package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
  14. package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
  15. package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
  16. package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
  17. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
  18. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
  19. package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
  20. package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
  21. package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
  22. package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
  23. package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
  24. package/docs/Std.Arithmetic/IncByI.md +1 -1
  25. package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
  26. package/docs/Std.Arithmetic/IncByL.md +1 -1
  27. package/docs/Std.Arithmetic/IncByLE.md +1 -1
  28. package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
  29. package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
  30. package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
  31. package/docs/Std.Arithmetic/MAJ.md +1 -1
  32. package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
  33. package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
  34. package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
  35. package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
  36. package/docs/Std.Arithmetic/index.md +1 -1
  37. package/docs/Std.Arrays/All.md +1 -1
  38. package/docs/Std.Arrays/Any.md +1 -1
  39. package/docs/Std.Arrays/Chunks.md +1 -1
  40. package/docs/Std.Arrays/CircularlyShifted.md +1 -1
  41. package/docs/Std.Arrays/ColumnAt.md +1 -1
  42. package/docs/Std.Arrays/Count.md +1 -1
  43. package/docs/Std.Arrays/Diagonal.md +1 -1
  44. package/docs/Std.Arrays/DrawMany.md +1 -1
  45. package/docs/Std.Arrays/Enumerated.md +1 -1
  46. package/docs/Std.Arrays/Excluding.md +1 -1
  47. package/docs/Std.Arrays/Filtered.md +1 -1
  48. package/docs/Std.Arrays/FlatMapped.md +1 -1
  49. package/docs/Std.Arrays/Flattened.md +1 -1
  50. package/docs/Std.Arrays/Fold.md +1 -1
  51. package/docs/Std.Arrays/ForEach.md +1 -1
  52. package/docs/Std.Arrays/Head.md +1 -1
  53. package/docs/Std.Arrays/HeadAndRest.md +1 -1
  54. package/docs/Std.Arrays/IndexOf.md +1 -1
  55. package/docs/Std.Arrays/IndexRange.md +1 -1
  56. package/docs/Std.Arrays/Interleaved.md +1 -1
  57. package/docs/Std.Arrays/IsEmpty.md +1 -1
  58. package/docs/Std.Arrays/IsRectangularArray.md +1 -1
  59. package/docs/Std.Arrays/IsSorted.md +1 -1
  60. package/docs/Std.Arrays/IsSquareArray.md +1 -1
  61. package/docs/Std.Arrays/Mapped.md +1 -1
  62. package/docs/Std.Arrays/MappedByIndex.md +1 -1
  63. package/docs/Std.Arrays/MappedOverRange.md +1 -1
  64. package/docs/Std.Arrays/Most.md +1 -1
  65. package/docs/Std.Arrays/MostAndTail.md +1 -1
  66. package/docs/Std.Arrays/Padded.md +1 -1
  67. package/docs/Std.Arrays/Partitioned.md +1 -1
  68. package/docs/Std.Arrays/Rest.md +1 -1
  69. package/docs/Std.Arrays/Reversed.md +1 -1
  70. package/docs/Std.Arrays/SequenceI.md +1 -1
  71. package/docs/Std.Arrays/SequenceL.md +1 -1
  72. package/docs/Std.Arrays/Sorted.md +1 -1
  73. package/docs/Std.Arrays/Subarray.md +1 -1
  74. package/docs/Std.Arrays/Swapped.md +1 -1
  75. package/docs/Std.Arrays/Tail.md +1 -1
  76. package/docs/Std.Arrays/Transposed.md +1 -1
  77. package/docs/Std.Arrays/Unzipped.md +1 -1
  78. package/docs/Std.Arrays/Where.md +1 -1
  79. package/docs/Std.Arrays/Windows.md +1 -1
  80. package/docs/Std.Arrays/Zipped.md +1 -1
  81. package/docs/Std.Arrays/index.md +1 -1
  82. package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
  83. package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
  84. package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
  85. package/docs/Std.Canon/ApplyOperationPowerA.md +1 -1
  86. package/docs/Std.Canon/ApplyOperationPowerCA.md +1 -1
  87. package/docs/Std.Canon/ApplyP.md +1 -1
  88. package/docs/Std.Canon/ApplyPauli.md +1 -1
  89. package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
  90. package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
  91. package/docs/Std.Canon/ApplyQFT.md +1 -1
  92. package/docs/Std.Canon/ApplyQPE.md +1 -1
  93. package/docs/Std.Canon/ApplyToEach.md +1 -1
  94. package/docs/Std.Canon/ApplyToEachA.md +1 -1
  95. package/docs/Std.Canon/ApplyToEachC.md +1 -1
  96. package/docs/Std.Canon/ApplyToEachCA.md +1 -1
  97. package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
  98. package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
  99. package/docs/Std.Canon/CX.md +1 -1
  100. package/docs/Std.Canon/CY.md +1 -1
  101. package/docs/Std.Canon/CZ.md +1 -1
  102. package/docs/Std.Canon/Fst.md +1 -1
  103. package/docs/Std.Canon/MapPauliAxis.md +1 -1
  104. package/docs/Std.Canon/Relabel.md +1 -1
  105. package/docs/Std.Canon/Snd.md +1 -1
  106. package/docs/Std.Canon/SwapReverseRegister.md +1 -1
  107. package/docs/Std.Canon/index.md +1 -1
  108. package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
  109. package/docs/Std.Convert/BigIntAsInt.md +1 -1
  110. package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
  111. package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
  112. package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
  113. package/docs/Std.Convert/BoolAsResult.md +1 -1
  114. package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
  115. package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
  116. package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
  117. package/docs/Std.Convert/IntAsBigInt.md +1 -1
  118. package/docs/Std.Convert/IntAsBoolArray.md +1 -1
  119. package/docs/Std.Convert/IntAsDouble.md +1 -1
  120. package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
  121. package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
  122. package/docs/Std.Convert/ResultAsBool.md +1 -1
  123. package/docs/Std.Convert/index.md +1 -1
  124. package/docs/Std.Core/Complex.md +1 -1
  125. package/docs/Std.Core/Length.md +1 -1
  126. package/docs/Std.Core/Repeated.md +1 -1
  127. package/docs/Std.Core/index.md +1 -1
  128. package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
  129. package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
  130. package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
  131. package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
  132. package/docs/Std.Diagnostics/CheckZero.md +1 -1
  133. package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
  134. package/docs/Std.Diagnostics/ConfigureQubitLoss.md +1 -1
  135. package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
  136. package/docs/Std.Diagnostics/DumpMachine.md +1 -1
  137. package/docs/Std.Diagnostics/DumpOperation.md +1 -1
  138. package/docs/Std.Diagnostics/DumpRegister.md +1 -1
  139. package/docs/Std.Diagnostics/Fact.md +1 -1
  140. package/docs/Std.Diagnostics/NoNoise.md +1 -1
  141. package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
  142. package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
  143. package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
  144. package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
  145. package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
  146. package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
  147. package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
  148. package/docs/Std.Diagnostics/index.md +1 -1
  149. package/docs/Std.Intrinsic/AND.md +1 -1
  150. package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
  151. package/docs/Std.Intrinsic/CCNOT.md +1 -1
  152. package/docs/Std.Intrinsic/CNOT.md +1 -1
  153. package/docs/Std.Intrinsic/Exp.md +1 -1
  154. package/docs/Std.Intrinsic/H.md +1 -1
  155. package/docs/Std.Intrinsic/I.md +1 -1
  156. package/docs/Std.Intrinsic/M.md +1 -1
  157. package/docs/Std.Intrinsic/Measure.md +1 -1
  158. package/docs/Std.Intrinsic/Message.md +1 -1
  159. package/docs/Std.Intrinsic/R.md +1 -1
  160. package/docs/Std.Intrinsic/R1.md +1 -1
  161. package/docs/Std.Intrinsic/R1Frac.md +1 -1
  162. package/docs/Std.Intrinsic/RFrac.md +1 -1
  163. package/docs/Std.Intrinsic/Reset.md +1 -1
  164. package/docs/Std.Intrinsic/ResetAll.md +1 -1
  165. package/docs/Std.Intrinsic/Rx.md +1 -1
  166. package/docs/Std.Intrinsic/Rxx.md +1 -1
  167. package/docs/Std.Intrinsic/Ry.md +1 -1
  168. package/docs/Std.Intrinsic/Ryy.md +1 -1
  169. package/docs/Std.Intrinsic/Rz.md +1 -1
  170. package/docs/Std.Intrinsic/Rzz.md +1 -1
  171. package/docs/Std.Intrinsic/S.md +1 -1
  172. package/docs/Std.Intrinsic/SWAP.md +1 -1
  173. package/docs/Std.Intrinsic/SX.md +1 -1
  174. package/docs/Std.Intrinsic/T.md +1 -1
  175. package/docs/Std.Intrinsic/X.md +1 -1
  176. package/docs/Std.Intrinsic/Y.md +1 -1
  177. package/docs/Std.Intrinsic/Z.md +1 -1
  178. package/docs/Std.Intrinsic/index.md +1 -1
  179. package/docs/Std.Logical/Xor.md +1 -1
  180. package/docs/Std.Logical/index.md +1 -1
  181. package/docs/Std.Math/AbsComplex.md +1 -1
  182. package/docs/Std.Math/AbsComplexPolar.md +1 -1
  183. package/docs/Std.Math/AbsD.md +1 -1
  184. package/docs/Std.Math/AbsI.md +1 -1
  185. package/docs/Std.Math/AbsL.md +1 -1
  186. package/docs/Std.Math/AbsSquaredComplex.md +1 -1
  187. package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
  188. package/docs/Std.Math/ApproximateFactorial.md +1 -1
  189. package/docs/Std.Math/ArcCos.md +4 -3
  190. package/docs/Std.Math/ArcCosh.md +4 -4
  191. package/docs/Std.Math/ArcSin.md +4 -3
  192. package/docs/Std.Math/ArcSinh.md +4 -4
  193. package/docs/Std.Math/ArcTan.md +4 -3
  194. package/docs/Std.Math/ArcTan2.md +4 -3
  195. package/docs/Std.Math/ArcTanh.md +4 -4
  196. package/docs/Std.Math/ArgComplex.md +1 -1
  197. package/docs/Std.Math/ArgComplexPolar.md +1 -1
  198. package/docs/Std.Math/Binom.md +1 -1
  199. package/docs/Std.Math/BitSizeI.md +1 -1
  200. package/docs/Std.Math/BitSizeL.md +1 -1
  201. package/docs/Std.Math/Ceiling.md +1 -1
  202. package/docs/Std.Math/Complex.md +1 -1
  203. package/docs/Std.Math/ComplexPolar.md +1 -1
  204. package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
  205. package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
  206. package/docs/Std.Math/Cos.md +4 -3
  207. package/docs/Std.Math/Cosh.md +4 -4
  208. package/docs/Std.Math/DivRemI.md +1 -1
  209. package/docs/Std.Math/DivRemL.md +1 -1
  210. package/docs/Std.Math/DividedByC.md +1 -1
  211. package/docs/Std.Math/DividedByCP.md +1 -1
  212. package/docs/Std.Math/E.md +1 -1
  213. package/docs/Std.Math/ExpModI.md +1 -1
  214. package/docs/Std.Math/ExpModL.md +1 -1
  215. package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
  216. package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
  217. package/docs/Std.Math/FactorialI.md +1 -1
  218. package/docs/Std.Math/FactorialL.md +1 -1
  219. package/docs/Std.Math/Floor.md +1 -1
  220. package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
  221. package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
  222. package/docs/Std.Math/HammingWeightI.md +1 -1
  223. package/docs/Std.Math/InverseModI.md +1 -1
  224. package/docs/Std.Math/InverseModL.md +1 -1
  225. package/docs/Std.Math/IsCoprimeI.md +1 -1
  226. package/docs/Std.Math/IsCoprimeL.md +1 -1
  227. package/docs/Std.Math/IsInfinite.md +1 -1
  228. package/docs/Std.Math/IsNaN.md +1 -1
  229. package/docs/Std.Math/LargestFixedPoint.md +1 -1
  230. package/docs/Std.Math/Lg.md +1 -1
  231. package/docs/Std.Math/Log.md +1 -1
  232. package/docs/Std.Math/Log10.md +1 -1
  233. package/docs/Std.Math/LogFactorialD.md +1 -1
  234. package/docs/Std.Math/LogGammaD.md +1 -1
  235. package/docs/Std.Math/LogOf2.md +1 -1
  236. package/docs/Std.Math/Max.md +1 -1
  237. package/docs/Std.Math/MaxD.md +1 -1
  238. package/docs/Std.Math/MaxI.md +1 -1
  239. package/docs/Std.Math/MaxL.md +1 -1
  240. package/docs/Std.Math/Min.md +1 -1
  241. package/docs/Std.Math/MinD.md +1 -1
  242. package/docs/Std.Math/MinI.md +1 -1
  243. package/docs/Std.Math/MinL.md +1 -1
  244. package/docs/Std.Math/MinusC.md +1 -1
  245. package/docs/Std.Math/MinusCP.md +1 -1
  246. package/docs/Std.Math/ModulusI.md +1 -1
  247. package/docs/Std.Math/ModulusL.md +1 -1
  248. package/docs/Std.Math/NegationC.md +1 -1
  249. package/docs/Std.Math/NegationCP.md +1 -1
  250. package/docs/Std.Math/PI.md +1 -1
  251. package/docs/Std.Math/PNorm.md +1 -1
  252. package/docs/Std.Math/PNormalized.md +1 -1
  253. package/docs/Std.Math/PlusC.md +1 -1
  254. package/docs/Std.Math/PlusCP.md +1 -1
  255. package/docs/Std.Math/PowC.md +1 -1
  256. package/docs/Std.Math/PowCP.md +1 -1
  257. package/docs/Std.Math/RealMod.md +1 -1
  258. package/docs/Std.Math/Round.md +1 -1
  259. package/docs/Std.Math/RoundHalfAwayFromZero.md +1 -1
  260. package/docs/Std.Math/SignD.md +1 -1
  261. package/docs/Std.Math/SignI.md +1 -1
  262. package/docs/Std.Math/SignL.md +1 -1
  263. package/docs/Std.Math/Sin.md +4 -3
  264. package/docs/Std.Math/Sinh.md +4 -4
  265. package/docs/Std.Math/SmallestFixedPoint.md +1 -1
  266. package/docs/Std.Math/Sqrt.md +1 -1
  267. package/docs/Std.Math/SquaredNorm.md +1 -1
  268. package/docs/Std.Math/Tan.md +4 -3
  269. package/docs/Std.Math/Tanh.md +4 -4
  270. package/docs/Std.Math/TimesC.md +1 -1
  271. package/docs/Std.Math/TimesCP.md +1 -1
  272. package/docs/Std.Math/TrailingZeroCountI.md +1 -1
  273. package/docs/Std.Math/TrailingZeroCountL.md +1 -1
  274. package/docs/Std.Math/Truncate.md +1 -1
  275. package/docs/Std.Math/index.md +14 -14
  276. package/docs/Std.Measurement/IsLossResult.md +1 -1
  277. package/docs/Std.Measurement/MResetEachZ.md +1 -1
  278. package/docs/Std.Measurement/MResetX.md +1 -1
  279. package/docs/Std.Measurement/MResetY.md +1 -1
  280. package/docs/Std.Measurement/MResetZ.md +1 -1
  281. package/docs/Std.Measurement/MResetZChecked.md +1 -1
  282. package/docs/Std.Measurement/MeasureAllZ.md +1 -1
  283. package/docs/Std.Measurement/MeasureEachZ.md +1 -1
  284. package/docs/Std.Measurement/MeasureInteger.md +1 -1
  285. package/docs/Std.Measurement/index.md +1 -1
  286. package/docs/Std.Random/DrawRandomBool.md +1 -1
  287. package/docs/Std.Random/DrawRandomDouble.md +1 -1
  288. package/docs/Std.Random/DrawRandomInt.md +1 -1
  289. package/docs/Std.Random/index.md +1 -1
  290. package/docs/Std.Range/IsRangeEmpty.md +1 -1
  291. package/docs/Std.Range/RangeEnd.md +1 -1
  292. package/docs/Std.Range/RangeReverse.md +1 -1
  293. package/docs/Std.Range/RangeStart.md +1 -1
  294. package/docs/Std.Range/RangeStep.md +1 -1
  295. package/docs/Std.Range/index.md +1 -1
  296. package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
  297. package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
  298. package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
  299. package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
  300. package/docs/Std.ResourceEstimation/CczCount.md +1 -1
  301. package/docs/Std.ResourceEstimation/EnableMemoryComputeArchitecture.md +1 -1
  302. package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
  303. package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
  304. package/docs/Std.ResourceEstimation/LeastFrequentlyUsed.md +1 -1
  305. package/docs/Std.ResourceEstimation/LeastRecentlyUsed.md +1 -1
  306. package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
  307. package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
  308. package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
  309. package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
  310. package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
  311. package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
  312. package/docs/Std.ResourceEstimation/TCount.md +1 -1
  313. package/docs/Std.ResourceEstimation/index.md +1 -1
  314. package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
  315. package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
  316. package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
  317. package/docs/Std.StatePreparation/index.md +1 -1
  318. package/docs/Std.TableLookup/Select.md +1 -1
  319. package/docs/Std.TableLookup/index.md +1 -1
  320. package/docs/index.md +4 -4
  321. package/lib/nodejs/qsc_wasm.cjs +2 -2
  322. package/lib/nodejs/qsc_wasm.d.cts +23 -1
  323. package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
  324. package/lib/web/qsc_wasm.d.ts +23 -1
  325. package/lib/web/qsc_wasm.js +2 -2
  326. package/lib/web/qsc_wasm_bg.wasm +0 -0
  327. package/package.json +1 -1
  328. package/ux/circuit-vis/constants.ts +16 -13
  329. package/ux/circuit-vis/draggable.ts +4 -1
  330. package/ux/circuit-vis/formatters/gateFormatter.ts +97 -102
  331. package/ux/circuit-vis/formatters/inputFormatter.ts +116 -14
  332. package/ux/circuit-vis/gateRenderData.ts +4 -0
  333. package/ux/circuit-vis/panel.ts +4 -2
  334. package/ux/circuit-vis/process.ts +98 -28
  335. package/ux/circuit-vis/sqore.ts +159 -71
  336. package/ux/circuit-vis/utils.ts +58 -19
  337. package/ux/circuit.tsx +1 -1
  338. package/ux/estimatesPanel.tsx +1 -1
  339. package/ux/output_data.md +1 -1
  340. package/ux/qsharp-circuit.css +20 -14
  341. package/ux/qsharp-ux.css +84 -27
  342. package/ux/scatterChart.tsx +1 -1
@@ -9,9 +9,11 @@ import {
9
9
  argsFontSize,
10
10
  controlBtnRadius,
11
11
  controlBtnOffset,
12
- groupBoxPadding,
12
+ groupPaddingX,
13
13
  classicalRegHeight,
14
- nestedGroupPadding,
14
+ groupTopPadding,
15
+ labelPaddingX,
16
+ groupLabelPaddingY,
15
17
  } from "../constants.js";
16
18
  import {
17
19
  createSvgElement,
@@ -36,12 +38,9 @@ import { mathChars } from "../utils.js";
36
38
  *
37
39
  * @returns SVG representation of operations.
38
40
  */
39
- const formatGates = (
40
- renderData: GateRenderData[][],
41
- nestedDepth = 0,
42
- ): SVGElement => {
41
+ const formatGates = (renderData: GateRenderData[][]): SVGElement => {
43
42
  const formattedGates: SVGElement[] = renderData
44
- .map((col) => col.map((renderData) => formatGate(renderData, nestedDepth)))
43
+ .map((col) => col.map((renderData) => formatGate(renderData)))
45
44
  .flat();
46
45
  return group(formattedGates);
47
46
  };
@@ -50,46 +49,33 @@ const formatGates = (
50
49
  * Takes in an operation's rendering data and formats it into SVG.
51
50
  *
52
51
  * @param renderData The rendering data of the gate.
53
- * @param nestedDepth Depth of nested operations (used in classically controlled and grouped operations).
54
52
  *
55
53
  * @returns SVG representation of gate.
56
54
  */
57
- const formatGate = (
58
- renderData: GateRenderData,
59
- nestedDepth = 0,
60
- ): SVGElement => {
55
+ const formatGate = (renderData: GateRenderData): SVGElement => {
61
56
  const { type, x, controlsY, targetsY, label, displayArgs, width } =
62
57
  renderData;
63
58
  switch (type) {
64
59
  case GateType.Measure:
65
- return _createGate(
66
- [_measure(x, controlsY[0], controlsY)],
67
- renderData,
68
- nestedDepth,
69
- );
60
+ return _createGate([_measure(x, controlsY[0], controlsY)], renderData);
70
61
  case GateType.Unitary:
71
62
  return _createGate(
72
63
  [_unitary(label, x, targetsY as number[][], width, displayArgs)],
73
64
  renderData,
74
- nestedDepth,
75
65
  );
76
66
  case GateType.X:
77
- return _createGate([_x(renderData)], renderData, nestedDepth);
67
+ return _createGate([_x(renderData)], renderData);
78
68
  case GateType.Ket:
79
- return _createGate([_ket(label, renderData)], renderData, nestedDepth);
69
+ return _createGate([_ket(label, renderData)], renderData);
80
70
  case GateType.Swap:
81
71
  return controlsY.length > 0
82
- ? _controlledGate(renderData, nestedDepth)
83
- : _createGate(
84
- [_swap(renderData, nestedDepth)],
85
- renderData,
86
- nestedDepth,
87
- );
72
+ ? _controlledGate(renderData)
73
+ : _createGate([_swap(renderData)], renderData);
88
74
  case GateType.Cnot:
89
75
  case GateType.ControlledUnitary:
90
- return _controlledGate(renderData, nestedDepth);
76
+ return _controlledGate(renderData);
91
77
  case GateType.Group:
92
- return _groupedOperations(renderData, nestedDepth);
78
+ return _groupedOperations(renderData);
93
79
  case GateType.ClassicalControlled:
94
80
  return _classicalControlled(renderData);
95
81
  default:
@@ -109,7 +95,6 @@ const formatGate = (
109
95
  const _createGate = (
110
96
  svgElems: SVGElement[],
111
97
  renderData: GateRenderData,
112
- nestedDepth: number,
113
98
  ): SVGElement => {
114
99
  const { dataAttributes } = renderData || {};
115
100
  const attributes: { [attr: string]: string } = { class: "gate" };
@@ -117,13 +102,11 @@ const _createGate = (
117
102
  ([attr, val]) => (attributes[`data-${attr}`] = val),
118
103
  );
119
104
 
120
- const zoomBtn: SVGElement | null = _zoomButton(renderData, nestedDepth);
121
- if (zoomBtn != null) svgElems = svgElems.concat([zoomBtn]);
122
-
123
- const gateElem = group(svgElems, attributes);
124
-
125
105
  // If there's a source location, wrap the gate in an SVG <a> element to make it clickable
126
- if (renderData.link) {
106
+ //
107
+ // `GateType.Group` corresponds to an *expanded* group, which will contain clickable gates
108
+ // so therefore should not itself be clickable
109
+ if (renderData.link && renderData.type !== GateType.Group) {
127
110
  const linkElem = createSvgElement("a", {
128
111
  href: renderData.link.href,
129
112
  class: "qs-circuit-source-link",
@@ -134,12 +117,20 @@ const _createGate = (
134
117
  titleElem.textContent = renderData.link.title;
135
118
  linkElem.appendChild(titleElem);
136
119
 
137
- // Add the gate as a child of the link
138
- linkElem.appendChild(gateElem);
139
- return linkElem;
120
+ // Add the gate elements as children of the link
121
+ for (const e of svgElems) {
122
+ linkElem.appendChild(e);
123
+ }
124
+
125
+ svgElems = [linkElem];
140
126
  }
141
127
 
142
- return gateElem;
128
+ // Zoom button comes last so it's on top of the <a> element if both are present
129
+ // This allows clicking the zoom button without triggering the link
130
+ const zoomBtn: SVGElement | null = _zoomButton(renderData);
131
+ if (zoomBtn != null) svgElems = svgElems.concat([zoomBtn]);
132
+
133
+ return group(svgElems, attributes);
143
134
  };
144
135
 
145
136
  /**
@@ -151,16 +142,10 @@ const _createGate = (
151
142
  *
152
143
  * @returns SVG element for expand/collapse button if needed, or null otherwise.
153
144
  */
154
- const _zoomButton = (
155
- renderData: GateRenderData,
156
- nestedDepth: number,
157
- ): SVGElement | null => {
145
+ const _zoomButton = (renderData: GateRenderData): SVGElement | null => {
158
146
  if (renderData == undefined) return null;
159
147
 
160
- const [gateBoundingBoxX, gateBoundingBoxY] = _gateBoundingBox(
161
- renderData,
162
- nestedDepth,
163
- );
148
+ const [gateBoundingBoxX, gateBoundingBoxY] = _gateBoundingBox(renderData);
164
149
  let { dataAttributes } = renderData;
165
150
  dataAttributes = dataAttributes || {};
166
151
 
@@ -194,45 +179,39 @@ const _zoomButton = (
194
179
  * may itself be a group of operations.
195
180
  *
196
181
  * @param renderData Operation render data.
197
- * @param nestedDepth Depth of nested operations.
198
182
  *
199
183
  * @returns [x, y, width, height]
200
184
  */
201
185
  const _gateBoundingBox = (
202
186
  renderData: GateRenderData,
203
- nestedDepth: number,
204
187
  ): [number, number, number, number] => {
205
- const {
206
- x: xFromRenderData,
207
- width: widthFromRenderData,
208
- type,
209
- targetsY,
210
- } = renderData;
188
+ const { x: centerX, width, targetsY, topPadding, bottomPadding } = renderData;
211
189
 
190
+ const x = centerX - width / 2;
212
191
  const ys = targetsY?.flatMap((y) => y as number[]) || [];
213
192
  const maxY = Math.max(...ys);
214
193
  const minY = Math.min(...ys);
215
194
 
216
- let x: number, y: number, width: number, height: number;
217
-
218
- switch (type) {
219
- case GateType.Group: {
220
- const padding = groupBoxPadding - nestedDepth * nestedGroupPadding;
221
-
222
- x = xFromRenderData - 2 * padding;
223
- y = minY - gateHeight / 2 - padding;
224
- width = widthFromRenderData + 2 * padding;
225
- height = maxY - minY + gateHeight + 2 * padding;
226
-
227
- return [x, y, width, height];
228
- }
229
-
230
- default:
231
- x = xFromRenderData - widthFromRenderData / 2;
232
- y = minY - gateHeight / 2;
233
- width = widthFromRenderData;
234
- height = maxY - minY + gateHeight;
235
- }
195
+ // Here, we want to expand the bounding box to include the whole dashed
196
+ // box around the group, which will be sized according to the nested depth.
197
+ //
198
+ // Example of a grouped operation:
199
+ //
200
+ // y -> ┌╌╌╌╌╌╌╌┐
201
+ // ╎┌╌╌╌╌╌┐╎
202
+ // ╎╎ ╎╎
203
+ // ╎╎ ┌─┐ ╎╎
204
+ // minY -> ───┼┼─│ │─┼┼──
205
+ // ╎╎ │X│ ╎╎
206
+ // maxY -> ───┼┼─│ │─┼┼──
207
+ // ╎╎ └╥┘ ╎╎
208
+ // ╎╎ ╚══╪╪══
209
+ // ╎╎ ╎╎
210
+ // ╎└╌╌╌╌╌┘╎
211
+ // y + height -> └╌╌╌╌╌╌╌┘
212
+ //
213
+ const y = minY - gateHeight / 2 - topPadding;
214
+ const height = maxY - minY + gateHeight + bottomPadding + topPadding;
236
215
 
237
216
  return [x, y, width, height];
238
217
  };
@@ -393,9 +372,12 @@ const _unitaryBox = (
393
372
  }
394
373
  uBox.setAttribute("data-wire-ys", JSON.stringify(wireYs));
395
374
  uBox.setAttribute("data-width", `${width}`);
396
- const labelY = y + height / 2 - (displayArgs == null ? 0 : 7);
397
- const labelText = text(label, x, labelY);
398
- _style_gate_text(labelText);
375
+
376
+ const labelText = _labelText(
377
+ label,
378
+ x,
379
+ y + height / 2 - (displayArgs == null ? 0 : 7),
380
+ );
399
381
 
400
382
  const elems = [uBox, labelText];
401
383
  if (displayArgs != null) {
@@ -414,18 +396,15 @@ const _unitaryBox = (
414
396
  * Creates the SVG for a SWAP gate on y coords given by `renderData`.
415
397
  *
416
398
  * @param renderData - The render data containing information about the gate, including position and targets.
417
- * @param nestedDepth - The depth of nested operations (used for adjusting padding and positioning).
418
399
  *
419
400
  * @returns SVG representation of SWAP gate.
420
401
  */
421
- const _swap = (renderData: GateRenderData, nestedDepth: number): SVGElement => {
402
+ const _swap = (renderData: GateRenderData): SVGElement => {
422
403
  const { x: centerX, targetsY } = renderData;
423
404
 
424
405
  // Get SVGs of crosses
425
- const [boundingBoxX, boundingBoxY, width, height] = _gateBoundingBox(
426
- renderData,
427
- nestedDepth,
428
- );
406
+ const [boundingBoxX, boundingBoxY, width, height] =
407
+ _gateBoundingBox(renderData);
429
408
  const ys = targetsY?.flatMap((y) => y as number[]) || [];
430
409
  const bg: SVGElement = box(
431
410
  boundingBoxX,
@@ -508,10 +487,7 @@ const _cross = (x: number, y: number): SVGElement => {
508
487
  *
509
488
  * @returns SVG representation of controlled gate.
510
489
  */
511
- const _controlledGate = (
512
- renderData: GateRenderData,
513
- nestedDepth: number,
514
- ): SVGElement => {
490
+ const _controlledGate = (renderData: GateRenderData): SVGElement => {
515
491
  const targetGateSvgs: SVGElement[] = [];
516
492
  const { type, x, controlsY, label, displayArgs, width } = renderData;
517
493
  let { targetsY } = renderData;
@@ -545,12 +521,11 @@ const _controlledGate = (
545
521
  // Create control lines
546
522
  const maxY: number = Math.max(...controlsY, ...(targetsY as number[]));
547
523
  const minY: number = Math.min(...controlsY, ...(targetsY as number[]));
548
- const vertLine: SVGElement = line(x, minY, x, maxY);
524
+ const vertLine: SVGElement = line(x, minY, x, maxY, "control-line");
549
525
  vertLine.style.pointerEvents = "none";
550
526
  const svg: SVGElement = _createGate(
551
527
  [vertLine, ...controlledDotsSvg, ...targetGateSvgs],
552
528
  renderData,
553
- nestedDepth,
554
529
  );
555
530
  return svg;
556
531
  };
@@ -583,19 +558,24 @@ const _oplus = (x: number, y: number, wireYs: number[]): SVGElement => {
583
558
  *
584
559
  * @returns SVG representation of gate.
585
560
  */
586
- const _groupedOperations = (
587
- renderData: GateRenderData,
588
- nestedDepth: number,
589
- ): SVGElement => {
590
- const { children } = renderData;
591
- const [x, y, w, h] = _gateBoundingBox(renderData, nestedDepth);
561
+ const _groupedOperations = (renderData: GateRenderData): SVGElement => {
562
+ const { children, label } = renderData;
563
+ const [x, y, w, h] = _gateBoundingBox(renderData);
592
564
 
593
565
  // Draw dashed box around children gates
594
566
  const box: SVGElement = dashedBox(x, y, w, h, "gate-unitary");
595
567
  const elems: SVGElement[] = [box];
596
- if (children != null)
597
- elems.push(formatGates(children as GateRenderData[][], nestedDepth + 1));
598
- return _createGate(elems, renderData, nestedDepth);
568
+ if (children != null) elems.push(formatGates(children as GateRenderData[][]));
569
+
570
+ const labelText = _labelText(
571
+ label,
572
+ x + labelPaddingX,
573
+ y + groupTopPadding / 2 + groupLabelPaddingY,
574
+ );
575
+ labelText.classList.add("qs-group-label");
576
+ elems.push(labelText);
577
+
578
+ return _createGate(elems, renderData);
599
579
  };
600
580
 
601
581
  /**
@@ -608,7 +588,7 @@ const _groupedOperations = (
608
588
  */
609
589
  const _classicalControlled = (
610
590
  renderData: GateRenderData,
611
- padding: number = groupBoxPadding,
591
+ padding: number = groupPaddingX,
612
592
  ): SVGElement => {
613
593
  const { controlsY, dataAttributes } = renderData;
614
594
  const targetsY: number[] = renderData.targetsY as number[];
@@ -658,8 +638,8 @@ const _classicalControlled = (
658
638
  "classical-line",
659
639
  );
660
640
 
661
- width = width - controlBtnOffset + (padding - groupBoxPadding) * 2;
662
- x += groupBoxPadding - padding;
641
+ width = width - controlBtnOffset + (padding - groupPaddingX) * 2;
642
+ x += groupPaddingX - padding;
663
643
  const y: number = targetsY[0] - gateHeight / 2 - padding;
664
644
  const height: number = targetsY[1] - targetsY[0] + gateHeight + padding * 2;
665
645
 
@@ -699,4 +679,19 @@ const _controlCircle = (
699
679
  class: "classically-controlled-btn",
700
680
  });
701
681
 
682
+ /**
683
+ * Generates the SVG representation of the label text for a gate or grouped operation.
684
+ *
685
+ * @param label Label text.
686
+ * @param x x coord.
687
+ * @param y y coord.
688
+ *
689
+ * @returns SVG representation of label text.
690
+ */
691
+ function _labelText(label: string, x: number, y: number): SVGTextElement {
692
+ const labelText = text(label, x, y, labelFontSize);
693
+ _style_gate_text(labelText);
694
+ return labelText;
695
+ }
696
+
702
697
  export { formatGates, formatGate };
@@ -6,8 +6,11 @@ import { RegisterType, RegisterMap, RegisterRenderData } from "../register.js";
6
6
  import {
7
7
  leftPadding,
8
8
  startY,
9
- registerHeight,
10
9
  classicalRegHeight,
10
+ groupTopPadding,
11
+ groupBottomPadding,
12
+ gateHeight,
13
+ gatePadding,
11
14
  } from "../constants.js";
12
15
  import { createSvgElement, group, text } from "./formatUtils.js";
13
16
  import { mathChars } from "../utils.js";
@@ -23,46 +26,145 @@ import { mathChars } from "../utils.js";
23
26
  */
24
27
  const formatInputs = (
25
28
  qubits: Qubit[],
29
+ rowHeights: {
30
+ [qubitIndex: number]: {
31
+ heightAboveWire: number;
32
+ heightBelowWire: number;
33
+ };
34
+ },
26
35
  renderLocations?: (s: SourceLocation[]) => { title: string; href: string },
27
- ): { qubitWires: SVGElement; registers: RegisterMap; svgHeight: number } => {
28
- const qubitWires: SVGElement[] = [];
36
+ ): { qubitLabels: SVGElement; registers: RegisterMap; svgHeight: number } => {
37
+ const qubitLabels: SVGElement[] = [];
29
38
  const registers: RegisterMap = {};
30
39
 
31
40
  let currY: number = startY;
41
+
42
+ // currY -> ┌╌╌╌╌╌╌╌┐
43
+ // ╎┌╌╌╌╌╌┐╎
44
+ // ╎╎ ╎╎
45
+ // ╎╎ ┌─┐ ╎╎
46
+ // ───┼┼─│X│─┼┼──
47
+ // ╎╎ └╥┘ ╎╎
48
+ // ╎╎ ╚══╪╪══
49
+ // ╎╎ ╎╎
50
+ // ╎└╌╌╌╌╌┘╎
51
+ // └╌╌╌╌╌╌╌┘
52
+
32
53
  qubits.forEach(({ id, numResults, declarations }, wireIndex) => {
54
+ const { heightAboveWire, heightBelowWire } = rowHeights[wireIndex] || {
55
+ heightAboveWire: 0,
56
+ heightBelowWire: 0,
57
+ };
58
+ currY += heightAboveWire * groupTopPadding;
59
+
60
+ // ┌╌╌╌╌╌╌╌┐
61
+ // ╎┌╌╌╌╌╌┐╎
62
+ // currY -> ╎╎ ╎╎
63
+ // ╎╎ ┌─┐ ╎╎
64
+ // ───┼┼─│X│─┼┼──
65
+ // ╎╎ └╥┘ ╎╎
66
+ // ╎╎ ╚══╪╪══
67
+ // ╎╎ ╎╎
68
+ // ╎└╌╌╌╌╌┘╎
69
+ // └╌╌╌╌╌╌╌┘
70
+
71
+ currY += gatePadding + gateHeight / 2;
72
+
73
+ // ┌╌╌╌╌╌╌╌┐
74
+ // ╎┌╌╌╌╌╌┐╎
75
+ // ╎╎ ╎╎
76
+ // ╎╎ ┌─┐ ╎╎
77
+ // currY -> ───┼┼─│X│─┼┼──
78
+ // ╎╎ └╥┘ ╎╎
79
+ // ╎╎ ╚══╪╪══
80
+ // ╎╎ ╎╎
81
+ // ╎└╌╌╌╌╌┘╎
82
+ // └╌╌╌╌╌╌╌┘
83
+
33
84
  const link: { link?: { href: string; title: string } } = {};
34
85
  if (renderLocations && declarations && declarations.length > 0) {
35
86
  link.link = renderLocations(declarations);
36
87
  }
37
88
 
38
89
  // Add qubit wire to list of qubit wires
39
- qubitWires.push(qubitInput(currY, wireIndex, id.toString(), link.link));
90
+ qubitLabels.push(qubitInput(currY, wireIndex, id.toString(), link.link));
40
91
 
41
92
  // Create qubit register
42
- registers[id] = { type: RegisterType.Qubit, y: currY };
43
-
44
- // If there are no attached classical registers, increment y by fixed register height
45
- if (numResults == null || numResults === 0) {
46
- currY += registerHeight;
47
- return;
48
- }
93
+ registers[id] = {
94
+ type: RegisterType.Qubit,
95
+ y: currY,
96
+ };
97
+
98
+ currY += gateHeight / 2;
99
+
100
+ // ┌╌╌╌╌╌╌╌┐
101
+ // ╎┌╌╌╌╌╌┐╎
102
+ // ╎╎ ╎╎
103
+ // ╎╎ ┌─┐ ╎╎
104
+ // ───┼┼─│X│─┼┼──
105
+ // currY -> ╎╎ └╥┘ ╎╎
106
+ // ╎╎ ╚══╪╪══
107
+ // ╎╎ ╎╎
108
+ // ╎└╌╌╌╌╌┘╎
109
+ // └╌╌╌╌╌╌╌┘
49
110
 
50
111
  // Increment current height by classical register height for attached classical registers
51
- currY += classicalRegHeight;
52
112
 
53
113
  // Add classical wires
54
114
  registers[id].children = Array.from(Array(numResults), () => {
115
+ currY += classicalRegHeight;
116
+
117
+ // ┌╌╌╌╌╌╌╌┐
118
+ // ╎┌╌╌╌╌╌┐╎
119
+ // ╎╎ ╎╎
120
+ // ╎╎ ┌─┐ ╎╎
121
+ // ───┼┼─│X│─┼┼──
122
+ // ╎╎ └╥┘ ╎╎
123
+ // currY -> ╎╎ ╚══╪╪══
124
+ // ╎╎ ╎╎
125
+ // ╎└╌╌╌╌╌┘╎
126
+ // └╌╌╌╌╌╌╌┘
127
+
55
128
  const clsReg: RegisterRenderData = {
56
129
  type: RegisterType.Classical,
57
130
  y: currY,
58
131
  };
59
- currY += classicalRegHeight;
60
132
  return clsReg;
61
133
  });
134
+
135
+ currY += gatePadding;
136
+
137
+ // ┌╌╌╌╌╌╌╌┐
138
+ // ╎┌╌╌╌╌╌┐╎
139
+ // ╎╎ ╎╎
140
+ // ╎╎ ┌─┐ ╎╎
141
+ // ───┼┼─│X│─┼┼──
142
+ // ╎╎ └╥┘ ╎╎
143
+ // ╎╎ ╚══╪╪══
144
+ // currY -> ╎╎ ╎╎
145
+ // ╎└╌╌╌╌╌┘╎
146
+ // └╌╌╌╌╌╌╌┘
147
+
148
+ currY += heightBelowWire * groupBottomPadding;
149
+
150
+ // ┌╌╌╌╌╌╌╌┐
151
+ // ╎┌╌╌╌╌╌┐╎
152
+ // ╎╎ ╎╎
153
+ // ╎╎ ┌─┐ ╎╎
154
+ // ───┼┼─│X│─┼┼──
155
+ // ╎╎ └╥┘ ╎╎
156
+ // ╎╎ ║ ╎╎
157
+ // ╎╎ ╚══╪╪══
158
+ // ╎└╌╌╌╌╌┘╎
159
+ // └╌╌╌╌╌╌╌┘
160
+ // currY ->
62
161
  });
63
162
 
163
+ // Additional padding at the very bottom
164
+ currY += classicalRegHeight;
165
+
64
166
  return {
65
- qubitWires: group(qubitWires, { class: "qubit-input-states" }),
167
+ qubitLabels: group(qubitLabels, { class: "qubit-input-states" }),
66
168
  registers,
67
169
  svgHeight: currY,
68
170
  };
@@ -53,6 +53,10 @@ export interface GateRenderData {
53
53
  width: number;
54
54
  /** Children operations as part of group. */
55
55
  children?: GateRenderData[][] | GateRenderData[][][];
56
+ /** Vertical space from the top of this gate to the top of the topmost contained gate. 0 for non-groups. */
57
+ topPadding: number;
58
+ /** Vertical space from the bottom of this gate to the bottom of the bottommost contained gate. 0 for non-groups. */
59
+ bottomPadding: number;
56
60
  /** Custom data attributes to attach to gate element. */
57
61
  dataAttributes?: DataAttributes;
58
62
  /** Link href and title for clickable gate. */
@@ -10,7 +10,7 @@ import {
10
10
  } from "./constants.js";
11
11
  import { formatGate } from "./formatters/gateFormatter.js";
12
12
  import { GateType, GateRenderData } from "./gateRenderData.js";
13
- import { getGateWidth } from "./utils.js";
13
+ import { getMinGateWidth } from "./utils.js";
14
14
 
15
15
  /**
16
16
  * Create a panel for the circuit visualization.
@@ -253,6 +253,8 @@ const toRenderData = (
253
253
  targetsY: [target],
254
254
  label: "",
255
255
  width: -1,
256
+ topPadding: 0,
257
+ bottomPadding: 0,
256
258
  };
257
259
 
258
260
  if (operation === undefined) return renderData;
@@ -294,7 +296,7 @@ const toRenderData = (
294
296
  if (operation.args !== undefined && operation.args.length > 0)
295
297
  renderData.displayArgs = operation.args[0];
296
298
 
297
- renderData.width = getGateWidth(renderData);
299
+ renderData.width = getMinGateWidth(renderData);
298
300
  renderData.x = x + 1 + renderData.width / 2; // offset by 1 for left padding
299
301
 
300
302
  return renderData;