@openc3/vue-common 6.7.0 → 6.8.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.
- package/dist/{ArrayWidget-B__t3xOt.cjs → ArrayWidget-DaONH8Iv.cjs} +2 -2
- package/dist/{ArrayWidget-B__t3xOt.cjs.map → ArrayWidget-DaONH8Iv.cjs.map} +1 -1
- package/dist/{ArrayWidget-BSG8KEtf.js → ArrayWidget-j3ncPuPx.js} +4 -4
- package/dist/{ArrayWidget-BSG8KEtf.js.map → ArrayWidget-j3ncPuPx.js.map} +1 -1
- package/dist/{ArrayplotWidget-BduWyJlL.cjs → ArrayplotWidget-DPMVlst7.cjs} +2 -2
- package/dist/{ArrayplotWidget-BduWyJlL.cjs.map → ArrayplotWidget-DPMVlst7.cjs.map} +1 -1
- package/dist/{ArrayplotWidget-WVu76Kqn.js → ArrayplotWidget-DuLaiGa9.js} +3 -3
- package/dist/{ArrayplotWidget-WVu76Kqn.js.map → ArrayplotWidget-DuLaiGa9.js.map} +1 -1
- package/dist/{BarColumn-Cflh9pUz.js → BarColumn-BWJ0Dd4O.js} +3 -3
- package/dist/{BarColumn-Cflh9pUz.js.map → BarColumn-BWJ0Dd4O.js.map} +1 -1
- package/dist/{BarColumn-DVn9f2WO.cjs → BarColumn-CchXr_ex.cjs} +2 -2
- package/dist/{BarColumn-DVn9f2WO.cjs.map → BarColumn-CchXr_ex.cjs.map} +1 -1
- package/dist/{BlockWidget-B7ryWGCq.js → BlockWidget-Bf5Dd6Cr.js} +4 -4
- package/dist/{BlockWidget-B7ryWGCq.js.map → BlockWidget-Bf5Dd6Cr.js.map} +1 -1
- package/dist/{BlockWidget-CRqA09Ve.cjs → BlockWidget-CeDueZQ0.cjs} +2 -2
- package/dist/{BlockWidget-CRqA09Ve.cjs.map → BlockWidget-CeDueZQ0.cjs.map} +1 -1
- package/dist/{ButtonWidget-Bb46aUCR.cjs → ButtonWidget-BZulfQct.cjs} +3 -3
- package/dist/{ButtonWidget-Bb46aUCR.cjs.map → ButtonWidget-BZulfQct.cjs.map} +1 -1
- package/dist/{ButtonWidget-BKih3ix9.js → ButtonWidget-bl_mGFYh.js} +16 -20
- package/dist/{ButtonWidget-BKih3ix9.js.map → ButtonWidget-bl_mGFYh.js.map} +1 -1
- package/dist/{CanvasWidget-DT_vPAoc.cjs → CanvasWidget-DwAXTAyn.cjs} +2 -2
- package/dist/{CanvasWidget-DT_vPAoc.cjs.map → CanvasWidget-DwAXTAyn.cjs.map} +1 -1
- package/dist/{CanvasWidget-DT9xMSfb.js → CanvasWidget-boDemgx1.js} +2 -2
- package/dist/{CanvasWidget-DT9xMSfb.js.map → CanvasWidget-boDemgx1.js.map} +1 -1
- package/dist/{CanvasdotWidget-7H5Hvcn-.js → CanvasdotWidget-BZBbJcER.js} +2 -2
- package/dist/{CanvasdotWidget-7H5Hvcn-.js.map → CanvasdotWidget-BZBbJcER.js.map} +1 -1
- package/dist/{CanvasdotWidget-DNSQriVo.cjs → CanvasdotWidget-ByJp9ZIa.cjs} +2 -2
- package/dist/{CanvasdotWidget-DNSQriVo.cjs.map → CanvasdotWidget-ByJp9ZIa.cjs.map} +1 -1
- package/dist/{CanvasimageWidget-BbWYx6Gj.js → CanvasimageWidget-6ywvT5jd.js} +3 -3
- package/dist/{CanvasimageWidget-BbWYx6Gj.js.map → CanvasimageWidget-6ywvT5jd.js.map} +1 -1
- package/dist/{CanvasimageWidget-CfleScIF.cjs → CanvasimageWidget-BDprHuH3.cjs} +2 -2
- package/dist/{CanvasimageWidget-CfleScIF.cjs.map → CanvasimageWidget-BDprHuH3.cjs.map} +1 -1
- package/dist/{CanvasimagevalueWidget-ouM4DBeD.cjs → CanvasimagevalueWidget-Cl_EuzNC.cjs} +2 -2
- package/dist/{CanvasimagevalueWidget-ouM4DBeD.cjs.map → CanvasimagevalueWidget-Cl_EuzNC.cjs.map} +1 -1
- package/dist/{CanvasimagevalueWidget-Blvoe2X4.js → CanvasimagevalueWidget-DjWrA3gX.js} +3 -3
- package/dist/{CanvasimagevalueWidget-Blvoe2X4.js.map → CanvasimagevalueWidget-DjWrA3gX.js.map} +1 -1
- package/dist/{CanvaslabelWidget-BPx_Rm4o.js → CanvaslabelWidget-Bq4V2BQh.js} +2 -2
- package/dist/{CanvaslabelWidget-BPx_Rm4o.js.map → CanvaslabelWidget-Bq4V2BQh.js.map} +1 -1
- package/dist/{CanvaslabelWidget-DB3qox5N.cjs → CanvaslabelWidget-aalWFBxK.cjs} +2 -2
- package/dist/{CanvaslabelWidget-DB3qox5N.cjs.map → CanvaslabelWidget-aalWFBxK.cjs.map} +1 -1
- package/dist/{CanvaslabelvalueWidget-DzdWvL0W.js → CanvaslabelvalueWidget-C8oNcFLi.js} +2 -2
- package/dist/{CanvaslabelvalueWidget-DzdWvL0W.js.map → CanvaslabelvalueWidget-C8oNcFLi.js.map} +1 -1
- package/dist/{CanvaslabelvalueWidget-2k6TjSNj.cjs → CanvaslabelvalueWidget-DIO0fADo.cjs} +2 -2
- package/dist/{CanvaslabelvalueWidget-2k6TjSNj.cjs.map → CanvaslabelvalueWidget-DIO0fADo.cjs.map} +1 -1
- package/dist/{CanvaslineWidget-oAoznYZP.cjs → CanvaslineWidget-CqNOzV_A.cjs} +2 -2
- package/dist/{CanvaslineWidget-oAoznYZP.cjs.map → CanvaslineWidget-CqNOzV_A.cjs.map} +1 -1
- package/dist/{CanvaslineWidget-CqskilGk.js → CanvaslineWidget-nvbL2GoL.js} +2 -2
- package/dist/{CanvaslineWidget-CqskilGk.js.map → CanvaslineWidget-nvbL2GoL.js.map} +1 -1
- package/dist/{CanvaslinevalueWidget-BmyIxGNz.cjs → CanvaslinevalueWidget-D0kOhxXn.cjs} +2 -2
- package/dist/{CanvaslinevalueWidget-BmyIxGNz.cjs.map → CanvaslinevalueWidget-D0kOhxXn.cjs.map} +1 -1
- package/dist/{CanvaslinevalueWidget-C0JIKdvZ.js → CanvaslinevalueWidget-ZACQedKx.js} +2 -2
- package/dist/{CanvaslinevalueWidget-C0JIKdvZ.js.map → CanvaslinevalueWidget-ZACQedKx.js.map} +1 -1
- package/dist/{CheckbuttonWidget-C9FbJx2v.js → CheckbuttonWidget-B82UE8AB.js} +2 -2
- package/dist/{CheckbuttonWidget-C9FbJx2v.js.map → CheckbuttonWidget-B82UE8AB.js.map} +1 -1
- package/dist/{CheckbuttonWidget-C548xrRy.cjs → CheckbuttonWidget-L9xyRwfS.cjs} +2 -2
- package/dist/{CheckbuttonWidget-C548xrRy.cjs.map → CheckbuttonWidget-L9xyRwfS.cjs.map} +1 -1
- package/dist/{ClassificationBanners-BTdLBSfy.cjs → ClassificationBanners-ZF9Ab7D0.cjs} +2 -2
- package/dist/{ClassificationBanners-BTdLBSfy.cjs.map → ClassificationBanners-ZF9Ab7D0.cjs.map} +1 -1
- package/dist/{ClassificationBanners-CgJiwgTp.js → ClassificationBanners-jiqWjTAZ.js} +2 -2
- package/dist/{ClassificationBanners-CgJiwgTp.js.map → ClassificationBanners-jiqWjTAZ.js.map} +1 -1
- package/dist/{ComboboxWidget-BbNKT0s8.js → ComboboxWidget-4OFiSkI6.js} +2 -2
- package/dist/{ComboboxWidget-BbNKT0s8.js.map → ComboboxWidget-4OFiSkI6.js.map} +1 -1
- package/dist/{ComboboxWidget-AErojGw0.cjs → ComboboxWidget-6hmnB_mK.cjs} +2 -2
- package/dist/{ComboboxWidget-AErojGw0.cjs.map → ComboboxWidget-6hmnB_mK.cjs.map} +1 -1
- package/dist/{CriticalCmdDialog-N06JxCHg.cjs → CriticalCmdDialog-C-UGhtjE.cjs} +2 -2
- package/dist/{CriticalCmdDialog-N06JxCHg.cjs.map → CriticalCmdDialog-C-UGhtjE.cjs.map} +1 -1
- package/dist/{CriticalCmdDialog-CF7Sqjdm.js → CriticalCmdDialog-FhXDdBn4.js} +9 -12
- package/dist/{CriticalCmdDialog-CF7Sqjdm.js.map → CriticalCmdDialog-FhXDdBn4.js.map} +1 -1
- package/dist/{DateWidget-CBMsdRUE.js → DateWidget-BmwtdirF.js} +2 -2
- package/dist/{DateWidget-CBMsdRUE.js.map → DateWidget-BmwtdirF.js.map} +1 -1
- package/dist/{DateWidget-CCIkDM9_.cjs → DateWidget-CmSp7svA.cjs} +2 -2
- package/dist/{DateWidget-CCIkDM9_.cjs.map → DateWidget-CmSp7svA.cjs.map} +1 -1
- package/dist/{DetailsDialog-DRVahE5z.js → DetailsDialog-CLKEfU0s.js} +126 -158
- package/dist/{DetailsDialog-DRVahE5z.js.map → DetailsDialog-CLKEfU0s.js.map} +1 -1
- package/dist/DetailsDialog-DEicfRO1.cjs +2 -0
- package/dist/{DetailsDialog-CVYBgZll.cjs.map → DetailsDialog-DEicfRO1.cjs.map} +1 -1
- package/dist/{EventListDialog-DDWL9gIQ.js → EventListDialog-BvSMSn7J.js} +53 -68
- package/dist/{EventListDialog-DDWL9gIQ.js.map → EventListDialog-BvSMSn7J.js.map} +1 -1
- package/dist/EventListDialog-Em1RcH7I.cjs +2 -0
- package/dist/{EventListDialog-CjYLRdkb.cjs.map → EventListDialog-Em1RcH7I.cjs.map} +1 -1
- package/dist/{FormatvalueWidget-BLWsqhIZ.js → FormatvalueWidget-C8exC3bj.js} +3 -3
- package/dist/{FormatvalueWidget-BLWsqhIZ.js.map → FormatvalueWidget-C8exC3bj.js.map} +1 -1
- package/dist/{FormatvalueWidget-BiaqheLJ.cjs → FormatvalueWidget-auKALSPC.cjs} +2 -2
- package/dist/{FormatvalueWidget-BiaqheLJ.cjs.map → FormatvalueWidget-auKALSPC.cjs.map} +1 -1
- package/dist/Graph-BJqtVAaV.cjs +2 -0
- package/dist/Graph-BJqtVAaV.cjs.map +1 -0
- package/dist/{Graph-BiU56Qj2.js → Graph-CWcrowaT.js} +384 -391
- package/dist/Graph-CWcrowaT.js.map +1 -0
- package/dist/{GraphWidget-cfgX_skM.cjs → GraphWidget-BroqS0SO.cjs} +2 -2
- package/dist/{GraphWidget-cfgX_skM.cjs.map → GraphWidget-BroqS0SO.cjs.map} +1 -1
- package/dist/{GraphWidget-Ga0AEfrJ.js → GraphWidget-CvzxZYVx.js} +2 -2
- package/dist/{GraphWidget-Ga0AEfrJ.js.map → GraphWidget-CvzxZYVx.js.map} +1 -1
- package/dist/{HorizontalWidget-CsVhLwZO.js → HorizontalWidget-Ck151zVw.js} +2 -2
- package/dist/{HorizontalWidget-CsVhLwZO.js.map → HorizontalWidget-Ck151zVw.js.map} +1 -1
- package/dist/{HorizontalWidget-i6aqMSRv.cjs → HorizontalWidget-DBeyBZCp.cjs} +2 -2
- package/dist/{HorizontalWidget-i6aqMSRv.cjs.map → HorizontalWidget-DBeyBZCp.cjs.map} +1 -1
- package/dist/{HorizontalboxWidget-B_S8mswF.cjs → HorizontalboxWidget-CuWtYdgh.cjs} +2 -2
- package/dist/{HorizontalboxWidget-B_S8mswF.cjs.map → HorizontalboxWidget-CuWtYdgh.cjs.map} +1 -1
- package/dist/{HorizontalboxWidget-xC6PADl3.js → HorizontalboxWidget-D3P-cl9V.js} +5 -5
- package/dist/{HorizontalboxWidget-xC6PADl3.js.map → HorizontalboxWidget-D3P-cl9V.js.map} +1 -1
- package/dist/{HorizontallineWidget-NZIxmRVN.js → HorizontallineWidget-BE1TjPU8.js} +2 -2
- package/dist/{HorizontallineWidget-NZIxmRVN.js.map → HorizontallineWidget-BE1TjPU8.js.map} +1 -1
- package/dist/{HorizontallineWidget-Cpys-185.cjs → HorizontallineWidget-QUFjdOSu.cjs} +2 -2
- package/dist/{HorizontallineWidget-Cpys-185.cjs.map → HorizontallineWidget-QUFjdOSu.cjs.map} +1 -1
- package/dist/{IframeWidget-BgzjSfag.js → IframeWidget-BgJCgues.js} +2 -2
- package/dist/{IframeWidget-BgzjSfag.js.map → IframeWidget-BgJCgues.js.map} +1 -1
- package/dist/{IframeWidget-CCdvd8rg.cjs → IframeWidget-DOZ1YyS2.cjs} +2 -2
- package/dist/{IframeWidget-CCdvd8rg.cjs.map → IframeWidget-DOZ1YyS2.cjs.map} +1 -1
- package/dist/{ImageLoader-BIKl6vGc.cjs → ImageLoader-AGF0VbZ5.cjs} +2 -2
- package/dist/{ImageLoader-BIKl6vGc.cjs.map → ImageLoader-AGF0VbZ5.cjs.map} +1 -1
- package/dist/{ImageLoader-DbFVK1Ui.js → ImageLoader-CWn-PLOk.js} +2 -2
- package/dist/{ImageLoader-DbFVK1Ui.js.map → ImageLoader-CWn-PLOk.js.map} +1 -1
- package/dist/{ImageviewerWidget-BnT5m-nw.js → ImageviewerWidget-BlhFZD2f.js} +2 -2
- package/dist/{ImageviewerWidget-BnT5m-nw.js.map → ImageviewerWidget-BlhFZD2f.js.map} +1 -1
- package/dist/{ImageviewerWidget-lnralJZa.cjs → ImageviewerWidget-DnmhYP68.cjs} +2 -2
- package/dist/{ImageviewerWidget-lnralJZa.cjs.map → ImageviewerWidget-DnmhYP68.cjs.map} +1 -1
- package/dist/{InterfacesTab-DjlzjJYG.cjs → InterfacesTab-76UJTIwF.cjs} +2 -2
- package/dist/{InterfacesTab-DjlzjJYG.cjs.map → InterfacesTab-76UJTIwF.cjs.map} +1 -1
- package/dist/{InterfacesTab-Cd_RITVP.js → InterfacesTab-Cwz-zG7j.js} +3 -3
- package/dist/{InterfacesTab-Cd_RITVP.js.map → InterfacesTab-Cwz-zG7j.js.map} +1 -1
- package/dist/{LabelWidget-CRHSFVPT.cjs → LabelWidget-C0DhD9Mn.cjs} +2 -2
- package/dist/{LabelWidget-CRHSFVPT.cjs.map → LabelWidget-C0DhD9Mn.cjs.map} +1 -1
- package/dist/{LabelWidget-DSDYmz6X.js → LabelWidget-Cwosk4x2.js} +2 -2
- package/dist/{LabelWidget-DSDYmz6X.js.map → LabelWidget-Cwosk4x2.js.map} +1 -1
- package/dist/{LabelledWidget-BXf9cTf_.cjs → LabelledWidget-D8-aKfA_.cjs} +2 -2
- package/dist/{LabelledWidget-BXf9cTf_.cjs.map → LabelledWidget-D8-aKfA_.cjs.map} +1 -1
- package/dist/{LabelledWidget-DMb-myxs.js → LabelledWidget-Dl6rAFTQ.js} +4 -4
- package/dist/{LabelledWidget-DMb-myxs.js.map → LabelledWidget-Dl6rAFTQ.js.map} +1 -1
- package/dist/{LabelprogressbarWidget-BNHaAUXq.cjs → LabelprogressbarWidget-DosPhvaY.cjs} +2 -2
- package/dist/{LabelprogressbarWidget-BNHaAUXq.cjs.map → LabelprogressbarWidget-DosPhvaY.cjs.map} +1 -1
- package/dist/{LabelprogressbarWidget-CkjDJBao.js → LabelprogressbarWidget-MuAKesOz.js} +4 -4
- package/dist/{LabelprogressbarWidget-CkjDJBao.js.map → LabelprogressbarWidget-MuAKesOz.js.map} +1 -1
- package/dist/{LabelsparklineWidget-DBYPFz3Y.js → LabelsparklineWidget-6LA6Ox3d.js} +4 -4
- package/dist/{LabelsparklineWidget-DBYPFz3Y.js.map → LabelsparklineWidget-6LA6Ox3d.js.map} +1 -1
- package/dist/{LabelsparklineWidget-BpHMkt-L.cjs → LabelsparklineWidget-CLU8722I.cjs} +2 -2
- package/dist/{LabelsparklineWidget-BpHMkt-L.cjs.map → LabelsparklineWidget-CLU8722I.cjs.map} +1 -1
- package/dist/{LabelvalueWidget-DlTkJC4i.js → LabelvalueWidget-BxAXx-Tf.js} +4 -4
- package/dist/{LabelvalueWidget-DlTkJC4i.js.map → LabelvalueWidget-BxAXx-Tf.js.map} +1 -1
- package/dist/{LabelvalueWidget-BFHYb64m.cjs → LabelvalueWidget-WP4gK29n.cjs} +2 -2
- package/dist/{LabelvalueWidget-BFHYb64m.cjs.map → LabelvalueWidget-WP4gK29n.cjs.map} +1 -1
- package/dist/{LabelvaluedescWidget-CUld9MqE.cjs → LabelvaluedescWidget-BQ-6OXHc.cjs} +2 -2
- package/dist/{LabelvaluedescWidget-CUld9MqE.cjs.map → LabelvaluedescWidget-BQ-6OXHc.cjs.map} +1 -1
- package/dist/{LabelvaluedescWidget-dRqnGZub.js → LabelvaluedescWidget-Dwwlnd1g.js} +5 -5
- package/dist/{LabelvaluedescWidget-dRqnGZub.js.map → LabelvaluedescWidget-Dwwlnd1g.js.map} +1 -1
- package/dist/{LabelvaluelimitsbarWidget-CS4NAPJ1.js → LabelvaluelimitsbarWidget-Dv8Qk8kK.js} +4 -4
- package/dist/{LabelvaluelimitsbarWidget-CS4NAPJ1.js.map → LabelvaluelimitsbarWidget-Dv8Qk8kK.js.map} +1 -1
- package/dist/{LabelvaluelimitsbarWidget-Br_PXH0r.cjs → LabelvaluelimitsbarWidget-Z_7ARnvo.cjs} +2 -2
- package/dist/{LabelvaluelimitsbarWidget-Br_PXH0r.cjs.map → LabelvaluelimitsbarWidget-Z_7ARnvo.cjs.map} +1 -1
- package/dist/{LabelvaluelimitscolumnWidget-D9x4Ppv8.js → LabelvaluelimitscolumnWidget-D-_gl6fq.js} +5 -5
- package/dist/{LabelvaluelimitscolumnWidget-D9x4Ppv8.js.map → LabelvaluelimitscolumnWidget-D-_gl6fq.js.map} +1 -1
- package/dist/{LabelvaluelimitscolumnWidget-DjLG10C5.cjs → LabelvaluelimitscolumnWidget-DiO1b01N.cjs} +2 -2
- package/dist/{LabelvaluelimitscolumnWidget-DjLG10C5.cjs.map → LabelvaluelimitscolumnWidget-DiO1b01N.cjs.map} +1 -1
- package/dist/{LabelvaluerangebarWidget-Dhyng4-n.js → LabelvaluerangebarWidget-B3MKT-3Y.js} +4 -4
- package/dist/{LabelvaluerangebarWidget-Dhyng4-n.js.map → LabelvaluerangebarWidget-B3MKT-3Y.js.map} +1 -1
- package/dist/{LabelvaluerangebarWidget-CsUfrGAM.cjs → LabelvaluerangebarWidget-DtajHP0b.cjs} +2 -2
- package/dist/{LabelvaluerangebarWidget-CsUfrGAM.cjs.map → LabelvaluerangebarWidget-DtajHP0b.cjs.map} +1 -1
- package/dist/{Layout-mWR35VAD.js → Layout-Bkb6VP3e.js} +2 -2
- package/dist/{Layout-mWR35VAD.js.map → Layout-Bkb6VP3e.js.map} +1 -1
- package/dist/Layout-CSbYbZWA.cjs +2 -0
- package/dist/{Layout-DDktMnzb.cjs.map → Layout-CSbYbZWA.cjs.map} +1 -1
- package/dist/{LedWidget-D8cq4pUv.js → LedWidget-DOuDD8LI.js} +4 -4
- package/dist/{LedWidget-D8cq4pUv.js.map → LedWidget-DOuDD8LI.js.map} +1 -1
- package/dist/{LedWidget-CCQWCw80.cjs → LedWidget-DeREi8-u.cjs} +2 -2
- package/dist/{LedWidget-CCQWCw80.cjs.map → LedWidget-DeREi8-u.cjs.map} +1 -1
- package/dist/LimitsbarWidget-BHr3IcIx.cjs +2 -0
- package/dist/{LimitsbarWidget-D4O0LWuC.cjs.map → LimitsbarWidget-BHr3IcIx.cjs.map} +1 -1
- package/dist/{LimitsbarWidget-VGJnDuVM.js → LimitsbarWidget-D1U6SvVL.js} +4 -4
- package/dist/{LimitsbarWidget-VGJnDuVM.js.map → LimitsbarWidget-D1U6SvVL.js.map} +1 -1
- package/dist/{LimitscolorWidget-BvxsopUs.cjs → LimitscolorWidget-BUkKRrSL.cjs} +2 -2
- package/dist/{LimitscolorWidget-BvxsopUs.cjs.map → LimitscolorWidget-BUkKRrSL.cjs.map} +1 -1
- package/dist/{LimitscolorWidget-CG6Pqi12.js → LimitscolorWidget-iSMGusqt.js} +2 -2
- package/dist/{LimitscolorWidget-CG6Pqi12.js.map → LimitscolorWidget-iSMGusqt.js.map} +1 -1
- package/dist/{LimitscolumnWidget-Z9JnMlDS.cjs → LimitscolumnWidget-COfNnb6f.cjs} +2 -2
- package/dist/{LimitscolumnWidget-Z9JnMlDS.cjs.map → LimitscolumnWidget-COfNnb6f.cjs.map} +1 -1
- package/dist/{LimitscolumnWidget-DjovQdiT.js → LimitscolumnWidget-DjxZTt_r.js} +4 -4
- package/dist/{LimitscolumnWidget-DjovQdiT.js.map → LimitscolumnWidget-DjxZTt_r.js.map} +1 -1
- package/dist/{LinegraphWidget-DSWAhXgZ.js → LinegraphWidget-BHKU6zlT.js} +4 -4
- package/dist/{LinegraphWidget-DSWAhXgZ.js.map → LinegraphWidget-BHKU6zlT.js.map} +1 -1
- package/dist/{LinegraphWidget-B_ECNLzU.cjs → LinegraphWidget-RleSRWKa.cjs} +2 -2
- package/dist/{LinegraphWidget-B_ECNLzU.cjs.map → LinegraphWidget-RleSRWKa.cjs.map} +1 -1
- package/dist/{MatrixbycolumnsWidget-C3cuhRxz.js → MatrixbycolumnsWidget-BKO-A2QD.js} +3 -3
- package/dist/{MatrixbycolumnsWidget-C3cuhRxz.js.map → MatrixbycolumnsWidget-BKO-A2QD.js.map} +1 -1
- package/dist/{MatrixbycolumnsWidget-CPFzRQN5.cjs → MatrixbycolumnsWidget-DWouVj7A.cjs} +2 -2
- package/dist/{MatrixbycolumnsWidget-CPFzRQN5.cjs.map → MatrixbycolumnsWidget-DWouVj7A.cjs.map} +1 -1
- package/dist/{MicroservicesTab-BGgwT56M.cjs → MicroservicesTab-L6qMAy4x.cjs} +2 -2
- package/dist/{MicroservicesTab-BGgwT56M.cjs.map → MicroservicesTab-L6qMAy4x.cjs.map} +1 -1
- package/dist/{MicroservicesTab-Dbp02UlV.js → MicroservicesTab-xLup6THU.js} +4 -4
- package/dist/{MicroservicesTab-Dbp02UlV.js.map → MicroservicesTab-xLup6THU.js.map} +1 -1
- package/dist/{Openc3Screen-CkdegNDJ.js → Openc3Screen-1rQ_Dbp4.js} +403 -398
- package/dist/Openc3Screen-1rQ_Dbp4.js.map +1 -0
- package/dist/Openc3Screen-BHHnSEoI.cjs +6 -0
- package/dist/Openc3Screen-BHHnSEoI.cjs.map +1 -0
- package/dist/{OutputDialog-2CmOBAEE.cjs → OutputDialog-DgM7aoa-.cjs} +2 -2
- package/dist/{OutputDialog-2CmOBAEE.cjs.map → OutputDialog-DgM7aoa-.cjs.map} +1 -1
- package/dist/{OutputDialog-M5Xc_DqH.js → OutputDialog-Ut5cXGxQ.js} +5 -6
- package/dist/{OutputDialog-M5Xc_DqH.js.map → OutputDialog-Ut5cXGxQ.js.map} +1 -1
- package/dist/{PackagesTab-HQCOIGZK.js → PackagesTab-ChJDyU3Z.js} +30 -36
- package/dist/{PackagesTab-HQCOIGZK.js.map → PackagesTab-ChJDyU3Z.js.map} +1 -1
- package/dist/PackagesTab-jqsRJEcJ.cjs +2 -0
- package/dist/{PackagesTab-Dwp6g8W0.cjs.map → PackagesTab-jqsRJEcJ.cjs.map} +1 -1
- package/dist/{PluginsTab-CZApRILr.js → PluginsTab-CayzDij0.js} +462 -410
- package/dist/PluginsTab-CayzDij0.js.map +1 -0
- package/dist/PluginsTab-DYEv8EPg.cjs +6 -0
- package/dist/PluginsTab-DYEv8EPg.cjs.map +1 -0
- package/dist/{ProgressbarWidget-BADSYuUN.cjs → ProgressbarWidget-Xba7gDbW.cjs} +2 -2
- package/dist/{ProgressbarWidget-BADSYuUN.cjs.map → ProgressbarWidget-Xba7gDbW.cjs.map} +1 -1
- package/dist/{ProgressbarWidget-oCgAEFBO.js → ProgressbarWidget-fbr2qu_N.js} +2 -2
- package/dist/{ProgressbarWidget-oCgAEFBO.js.map → ProgressbarWidget-fbr2qu_N.js.map} +1 -1
- package/dist/{RadiobuttonWidget-Bklx2_Au.cjs → RadiobuttonWidget-CdpKw7jr.cjs} +2 -2
- package/dist/{RadiobuttonWidget-Bklx2_Au.cjs.map → RadiobuttonWidget-CdpKw7jr.cjs.map} +1 -1
- package/dist/{RadiobuttonWidget-D4Dak3lc.js → RadiobuttonWidget-DL08zcQT.js} +2 -2
- package/dist/{RadiobuttonWidget-D4Dak3lc.js.map → RadiobuttonWidget-DL08zcQT.js.map} +1 -1
- package/dist/{RadiogroupWidget-Z2S2tgjG.cjs → RadiogroupWidget-DSA8ENmw.cjs} +2 -2
- package/dist/{RadiogroupWidget-Z2S2tgjG.cjs.map → RadiogroupWidget-DSA8ENmw.cjs.map} +1 -1
- package/dist/{RadiogroupWidget-Dbe9T4fp.js → RadiogroupWidget-DW9Xpj3c.js} +2 -2
- package/dist/{RadiogroupWidget-Dbe9T4fp.js.map → RadiogroupWidget-DW9Xpj3c.js.map} +1 -1
- package/dist/{RangebarWidget-C0TpxFDi.cjs → RangebarWidget-B4oRyUwG.cjs} +2 -2
- package/dist/{RangebarWidget-C0TpxFDi.cjs.map → RangebarWidget-B4oRyUwG.cjs.map} +1 -1
- package/dist/{RangebarWidget-CIVrgqrW.js → RangebarWidget-o9q55kjc.js} +4 -4
- package/dist/{RangebarWidget-CIVrgqrW.js.map → RangebarWidget-o9q55kjc.js.map} +1 -1
- package/dist/RedisTab-BGz2ZN9T.js +171 -0
- package/dist/RedisTab-BGz2ZN9T.js.map +1 -0
- package/dist/RedisTab-Uqcfgux1.cjs +2 -0
- package/dist/RedisTab-Uqcfgux1.cjs.map +1 -0
- package/dist/{RollupWidget-BEDf-mfg.cjs → RollupWidget-43v3NX_Z.cjs} +2 -2
- package/dist/{RollupWidget-BEDf-mfg.cjs.map → RollupWidget-43v3NX_Z.cjs.map} +1 -1
- package/dist/{RollupWidget-CH1-XNLV.js → RollupWidget-BHnjj-DF.js} +2 -2
- package/dist/{RollupWidget-CH1-XNLV.js.map → RollupWidget-BHnjj-DF.js.map} +1 -1
- package/dist/{RoutersTab-BA-KlYIm.cjs → RoutersTab-Be53r61Y.cjs} +2 -2
- package/dist/{RoutersTab-BA-KlYIm.cjs.map → RoutersTab-Be53r61Y.cjs.map} +1 -1
- package/dist/{RoutersTab-WKa6K7B8.js → RoutersTab-CCEPlZ_Y.js} +3 -3
- package/dist/{RoutersTab-WKa6K7B8.js.map → RoutersTab-CCEPlZ_Y.js.map} +1 -1
- package/dist/{ScriptChooser-LsboGSgh.cjs → ScriptChooser-B6TGFTBN.cjs} +2 -2
- package/dist/{ScriptChooser-LsboGSgh.cjs.map → ScriptChooser-B6TGFTBN.cjs.map} +1 -1
- package/dist/{ScriptChooser-B5TkGuZ4.js → ScriptChooser-CXjcm3bN.js} +2 -2
- package/dist/{ScriptChooser-B5TkGuZ4.js.map → ScriptChooser-CXjcm3bN.js.map} +1 -1
- package/dist/{ScrollwindowWidget-BwFG6Wn8.js → ScrollwindowWidget-D-QVwztC.js} +3 -3
- package/dist/{ScrollwindowWidget-BwFG6Wn8.js.map → ScrollwindowWidget-D-QVwztC.js.map} +1 -1
- package/dist/{ScrollwindowWidget-DWxDmpFB.cjs → ScrollwindowWidget-D6ZHZr3o.cjs} +2 -2
- package/dist/{ScrollwindowWidget-DWxDmpFB.cjs.map → ScrollwindowWidget-D6ZHZr3o.cjs.map} +1 -1
- package/dist/{SecretsTab-DKX5gLH_.cjs → SecretsTab-DDZ1VoUf.cjs} +2 -2
- package/dist/{SecretsTab-DKX5gLH_.cjs.map → SecretsTab-DDZ1VoUf.cjs.map} +1 -1
- package/dist/{SecretsTab-Vtvbb_1U.js → SecretsTab-vVy356vr.js} +8 -10
- package/dist/{SecretsTab-Vtvbb_1U.js.map → SecretsTab-vVy356vr.js.map} +1 -1
- package/dist/{SettingsTab-DilFIQ3K.js → SettingsTab-CbWrf7U9.js} +261 -315
- package/dist/{SettingsTab-DilFIQ3K.js.map → SettingsTab-CbWrf7U9.js.map} +1 -1
- package/dist/SettingsTab-DsIVE5UL.cjs +3 -0
- package/dist/{SettingsTab-Ch52foLm.cjs.map → SettingsTab-DsIVE5UL.cjs.map} +1 -1
- package/dist/{SignalWidget-Gz2gHrUm.js → SignalWidget-CsWuufdx.js} +2 -2
- package/dist/{SignalWidget-Gz2gHrUm.js.map → SignalWidget-CsWuufdx.js.map} +1 -1
- package/dist/{SignalWidget-1WqQFVq9.cjs → SignalWidget-CysAE9ZG.cjs} +2 -2
- package/dist/{SignalWidget-1WqQFVq9.cjs.map → SignalWidget-CysAE9ZG.cjs.map} +1 -1
- package/dist/{SimpleTextDialog-BwOVWhRY.cjs → SimpleTextDialog-CU6G5CBY.cjs} +2 -2
- package/dist/{SimpleTextDialog-BwOVWhRY.cjs.map → SimpleTextDialog-CU6G5CBY.cjs.map} +1 -1
- package/dist/{SimpleTextDialog-Cmtrmt79.js → SimpleTextDialog-ChV5vRcV.js} +10 -11
- package/dist/{SimpleTextDialog-Cmtrmt79.js.map → SimpleTextDialog-ChV5vRcV.js.map} +1 -1
- package/dist/{SpacerWidget-Bzp3aI40.cjs → SpacerWidget-ChNk5TFU.cjs} +2 -2
- package/dist/{SpacerWidget-Bzp3aI40.cjs.map → SpacerWidget-ChNk5TFU.cjs.map} +1 -1
- package/dist/{SpacerWidget-Bg7VDB0k.js → SpacerWidget-Di9-qunj.js} +2 -2
- package/dist/{SpacerWidget-Bg7VDB0k.js.map → SpacerWidget-Di9-qunj.js.map} +1 -1
- package/dist/{SparklineWidget-D_b5rfJv.js → SparklineWidget-B6-zhdPW.js} +4 -4
- package/dist/{SparklineWidget-D_b5rfJv.js.map → SparklineWidget-B6-zhdPW.js.map} +1 -1
- package/dist/{SparklineWidget-kMWjVDrm.cjs → SparklineWidget-D1tVqSRL.cjs} +2 -2
- package/dist/{SparklineWidget-kMWjVDrm.cjs.map → SparklineWidget-D1tVqSRL.cjs.map} +1 -1
- package/dist/{TabbookWidget-C30f9B6z.js → TabbookWidget-B1E1_mzA.js} +2 -2
- package/dist/{TabbookWidget-C30f9B6z.js.map → TabbookWidget-B1E1_mzA.js.map} +1 -1
- package/dist/{TabbookWidget-DlVrU3wK.cjs → TabbookWidget-Btg-Axid.cjs} +2 -2
- package/dist/{TabbookWidget-DlVrU3wK.cjs.map → TabbookWidget-Btg-Axid.cjs.map} +1 -1
- package/dist/{TargetsTab-CEPId9dL.js → TargetsTab-DbbQcBuK.js} +4 -5
- package/dist/{TargetsTab-CEPId9dL.js.map → TargetsTab-DbbQcBuK.js.map} +1 -1
- package/dist/{TargetsTab-uqjueXlq.cjs → TargetsTab-pbmAAkOA.cjs} +2 -2
- package/dist/{TargetsTab-uqjueXlq.cjs.map → TargetsTab-pbmAAkOA.cjs.map} +1 -1
- package/dist/{TextBoxDialog-BlZ6MBoW.js → TextBoxDialog-CdFHdj5W.js} +4 -5
- package/dist/{TextBoxDialog-BlZ6MBoW.js.map → TextBoxDialog-CdFHdj5W.js.map} +1 -1
- package/dist/{TextBoxDialog--uIDsNPU.cjs → TextBoxDialog-DbD8P4Xc.cjs} +2 -2
- package/dist/{TextBoxDialog--uIDsNPU.cjs.map → TextBoxDialog-DbD8P4Xc.cjs.map} +1 -1
- package/dist/{TextboxWidget-CDqxsgys.js → TextboxWidget-CBVEXPw_.js} +4 -4
- package/dist/{TextboxWidget-CDqxsgys.js.map → TextboxWidget-CBVEXPw_.js.map} +1 -1
- package/dist/{TextboxWidget-BJka_3dT.cjs → TextboxWidget-CHXcR8lA.cjs} +2 -2
- package/dist/{TextboxWidget-BJka_3dT.cjs.map → TextboxWidget-CHXcR8lA.cjs.map} +1 -1
- package/dist/{TextfieldWidget-CAyjKJs6.js → TextfieldWidget-DZMHrtQa.js} +2 -2
- package/dist/{TextfieldWidget-CAyjKJs6.js.map → TextfieldWidget-DZMHrtQa.js.map} +1 -1
- package/dist/{TextfieldWidget-C7_48W7n.cjs → TextfieldWidget-vSJ9CtKs.cjs} +2 -2
- package/dist/{TextfieldWidget-C7_48W7n.cjs.map → TextfieldWidget-vSJ9CtKs.cjs.map} +1 -1
- package/dist/{TimeWidget-WPWiADCI.cjs → TimeWidget-ClkxS_oo.cjs} +2 -2
- package/dist/{TimeWidget-WPWiADCI.cjs.map → TimeWidget-ClkxS_oo.cjs.map} +1 -1
- package/dist/{TimeWidget-BQsP0G2X.js → TimeWidget-K4MNmJ7J.js} +2 -2
- package/dist/{TimeWidget-BQsP0G2X.js.map → TimeWidget-K4MNmJ7J.js.map} +1 -1
- package/dist/{TitleWidget-DXVba53S.js → TitleWidget-8IcwweFE.js} +2 -2
- package/dist/{TitleWidget-DXVba53S.js.map → TitleWidget-8IcwweFE.js.map} +1 -1
- package/dist/{TitleWidget-DavRJ5B5.cjs → TitleWidget-DJJ17ATm.cjs} +2 -2
- package/dist/{TitleWidget-DavRJ5B5.cjs.map → TitleWidget-DJJ17ATm.cjs.map} +1 -1
- package/dist/ToolsTab-BkabqeR_.cjs +7 -0
- package/dist/{ToolsTab-DUwXt5hn.cjs.map → ToolsTab-BkabqeR_.cjs.map} +1 -1
- package/dist/{ToolsTab-CSmjz1H7.js → ToolsTab-tkganPCk.js} +6 -7
- package/dist/{ToolsTab-CSmjz1H7.js.map → ToolsTab-tkganPCk.js.map} +1 -1
- package/dist/{TopBar-D_2lT9RB.js → TopBar-BoI8SRaF.js} +18 -20
- package/dist/{TopBar-D_2lT9RB.js.map → TopBar-BoI8SRaF.js.map} +1 -1
- package/dist/TopBar-zJvwq8pr.cjs +2 -0
- package/dist/{TopBar-C5lQcY1W.cjs.map → TopBar-zJvwq8pr.cjs.map} +1 -1
- package/dist/{UpgradeToEnterpriseDialog-Cvt5MMTj.js → UpgradeToEnterpriseDialog-BYz9YoyY.js} +13 -16
- package/dist/{UpgradeToEnterpriseDialog-Cvt5MMTj.js.map → UpgradeToEnterpriseDialog-BYz9YoyY.js.map} +1 -1
- package/dist/UpgradeToEnterpriseDialog-BxHUptQB.cjs +2 -0
- package/dist/{UpgradeToEnterpriseDialog-BHDDrj0t.cjs.map → UpgradeToEnterpriseDialog-BxHUptQB.cjs.map} +1 -1
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-BflJrsRh.cjs +1498 -0
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-BflJrsRh.cjs.map +1 -0
- package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-DWYRspHE.js → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-quWsUlLr.js} +7475 -7319
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-quWsUlLr.js.map +1 -0
- package/dist/VWidget-3ziiUuPM.cjs +2 -0
- package/dist/VWidget-3ziiUuPM.cjs.map +1 -0
- package/dist/VWidget-CoIgX3hM.js +190 -0
- package/dist/VWidget-CoIgX3hM.js.map +1 -0
- package/dist/{ValueWidget-B-TWLPdM.js → ValueWidget-BvT1ASar.js} +4 -4
- package/dist/{ValueWidget-B-TWLPdM.js.map → ValueWidget-BvT1ASar.js.map} +1 -1
- package/dist/{ValueWidget-5ulSOrPw.cjs → ValueWidget-RU-vFOh9.cjs} +2 -2
- package/dist/{ValueWidget-5ulSOrPw.cjs.map → ValueWidget-RU-vFOh9.cjs.map} +1 -1
- package/dist/{ValuelimitsbarWidget-CTFVDwcL.cjs → ValuelimitsbarWidget-B5UtwjJW.cjs} +2 -2
- package/dist/{ValuelimitsbarWidget-CTFVDwcL.cjs.map → ValuelimitsbarWidget-B5UtwjJW.cjs.map} +1 -1
- package/dist/{ValuelimitsbarWidget-jsDXdPdC.js → ValuelimitsbarWidget-C5lBnUmB.js} +4 -4
- package/dist/{ValuelimitsbarWidget-jsDXdPdC.js.map → ValuelimitsbarWidget-C5lBnUmB.js.map} +1 -1
- package/dist/{ValuelimitscolumnWidget-Du3Baz6G.cjs → ValuelimitscolumnWidget-BruOZb26.cjs} +2 -2
- package/dist/{ValuelimitscolumnWidget-Du3Baz6G.cjs.map → ValuelimitscolumnWidget-BruOZb26.cjs.map} +1 -1
- package/dist/{ValuelimitscolumnWidget-I-uwnXM2.js → ValuelimitscolumnWidget-DHYI0WBL.js} +4 -4
- package/dist/{ValuelimitscolumnWidget-I-uwnXM2.js.map → ValuelimitscolumnWidget-DHYI0WBL.js.map} +1 -1
- package/dist/{ValuerangebarWidget-OyhSTScu.js → ValuerangebarWidget-BSszZhlE.js} +4 -4
- package/dist/{ValuerangebarWidget-OyhSTScu.js.map → ValuerangebarWidget-BSszZhlE.js.map} +1 -1
- package/dist/{ValuerangebarWidget-BjXDCLm3.cjs → ValuerangebarWidget-BhQVRHhm.cjs} +2 -2
- package/dist/{ValuerangebarWidget-BjXDCLm3.cjs.map → ValuerangebarWidget-BhQVRHhm.cjs.map} +1 -1
- package/dist/{VerticalWidget-CkFbX1Gq.js → VerticalWidget-1GhgYrC3.js} +2 -2
- package/dist/{VerticalWidget-CkFbX1Gq.js.map → VerticalWidget-1GhgYrC3.js.map} +1 -1
- package/dist/{VerticalWidget-CKDTGmhp.cjs → VerticalWidget-XZrIw9zV.cjs} +2 -2
- package/dist/{VerticalWidget-CKDTGmhp.cjs.map → VerticalWidget-XZrIw9zV.cjs.map} +1 -1
- package/dist/{VerticalboxWidget-D09UbA0I.cjs → VerticalboxWidget-BV-onQ8m.cjs} +2 -2
- package/dist/{VerticalboxWidget-D09UbA0I.cjs.map → VerticalboxWidget-BV-onQ8m.cjs.map} +1 -1
- package/dist/{VerticalboxWidget-FEQgPM9r.js → VerticalboxWidget-DYHJqEzd.js} +5 -5
- package/dist/{VerticalboxWidget-FEQgPM9r.js.map → VerticalboxWidget-DYHJqEzd.js.map} +1 -1
- package/dist/{Widget-C3-TBgP7.js → Widget-B8t93Oid.js} +2 -2
- package/dist/{Widget-C3-TBgP7.js.map → Widget-B8t93Oid.js.map} +1 -1
- package/dist/{Widget-CSBtgNwA.cjs → Widget-Blq-k5SB.cjs} +2 -2
- package/dist/{Widget-CSBtgNwA.cjs.map → Widget-Blq-k5SB.cjs.map} +1 -1
- package/dist/cmdUtilities-BMsSNjt_.js +46 -0
- package/dist/cmdUtilities-BMsSNjt_.js.map +1 -0
- package/dist/cmdUtilities-ChD8v8-7.cjs +2 -0
- package/dist/cmdUtilities-ChD8v8-7.cjs.map +1 -0
- package/dist/components.cjs +3 -3
- package/dist/components.cjs.map +1 -1
- package/dist/components.js +656 -247
- package/dist/components.js.map +1 -1
- package/dist/plugins.cjs +2 -2
- package/dist/plugins.cjs.map +1 -1
- package/dist/plugins.js +6 -8
- package/dist/plugins.js.map +1 -1
- package/dist/{settings-BboN1VLt.cjs → settings-DyvFSj59.cjs} +2 -2
- package/dist/{settings-BboN1VLt.cjs.map → settings-DyvFSj59.cjs.map} +1 -1
- package/dist/{settings-spKii1fI.js → settings-UZsgbUSr.js} +2 -2
- package/dist/{settings-spKii1fI.js.map → settings-UZsgbUSr.js.map} +1 -1
- package/dist/tools/admin.cjs +2 -2
- package/dist/tools/admin.cjs.map +1 -1
- package/dist/tools/admin.js +75 -98
- package/dist/tools/admin.js.map +1 -1
- package/dist/tools/base.cjs +1 -1
- package/dist/tools/base.cjs.map +1 -1
- package/dist/tools/base.js +73 -98
- package/dist/tools/base.js.map +1 -1
- package/dist/tools/calendar.cjs +1 -1
- package/dist/tools/calendar.js +1 -1
- package/dist/tools/scriptrunner.cjs +33 -33
- package/dist/tools/scriptrunner.cjs.map +1 -1
- package/dist/tools/scriptrunner.js +852 -834
- package/dist/tools/scriptrunner.js.map +1 -1
- package/dist/util.cjs +1 -1
- package/dist/util.js +4 -2
- package/dist/util.js.map +1 -1
- package/dist/vue-common.css +1 -1
- package/dist/widgets.cjs +1 -1
- package/dist/widgets.js +63 -63
- package/package.json +8 -8
- package/dist/DetailsDialog-CVYBgZll.cjs +0 -2
- package/dist/EventListDialog-CjYLRdkb.cjs +0 -2
- package/dist/Graph-BiU56Qj2.js.map +0 -1
- package/dist/Graph-CWjf71TK.cjs +0 -2
- package/dist/Graph-CWjf71TK.cjs.map +0 -1
- package/dist/Layout-DDktMnzb.cjs +0 -2
- package/dist/LimitsbarWidget-D4O0LWuC.cjs +0 -2
- package/dist/Openc3Screen-BP2oW88G.cjs +0 -6
- package/dist/Openc3Screen-BP2oW88G.cjs.map +0 -1
- package/dist/Openc3Screen-CkdegNDJ.js.map +0 -1
- package/dist/PackagesTab-Dwp6g8W0.cjs +0 -2
- package/dist/PluginsTab-COKDXShE.cjs +0 -6
- package/dist/PluginsTab-COKDXShE.cjs.map +0 -1
- package/dist/PluginsTab-CZApRILr.js.map +0 -1
- package/dist/RedisTab-B8U-vEQZ.js +0 -138
- package/dist/RedisTab-B8U-vEQZ.js.map +0 -1
- package/dist/RedisTab-cgicWb81.cjs +0 -2
- package/dist/RedisTab-cgicWb81.cjs.map +0 -1
- package/dist/SettingsTab-Ch52foLm.cjs +0 -3
- package/dist/ToolsTab-DUwXt5hn.cjs +0 -7
- package/dist/TopBar-C5lQcY1W.cjs +0 -2
- package/dist/UpgradeToEnterpriseDialog-BHDDrj0t.cjs +0 -2
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-DWYRspHE.js.map +0 -1
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-mEnslAi4.cjs +0 -1498
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-mEnslAi4.cjs.map +0 -1
- package/dist/VWidget-C7V6pKTg.cjs +0 -2
- package/dist/VWidget-C7V6pKTg.cjs.map +0 -1
- package/dist/VWidget-CFTCukCL.js +0 -332
- package/dist/VWidget-CFTCukCL.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scriptrunner.js","sources":["../../src/tools/scriptrunner/RunningScripts.vue","../../src/tools/scriptrunner/ScriptLogMessages.vue","../../../../node_modules/splitpanes/dist/splitpanes.es.js","../../src/tools/scriptrunner/Dialogs/AskDialog.vue","../../src/tools/scriptrunner/Dialogs/FileDialog.vue","../../src/tools/scriptrunner/Dialogs/InformationDialog.vue","../../src/tools/scriptrunner/Dialogs/OverridesDialog.vue","../../src/tools/scriptrunner/Dialogs/PromptDialog.vue","../../src/tools/scriptrunner/Dialogs/ResultsDialog.vue","../../src/tools/scriptrunner/Dialogs/ScriptEnvironmentDialog.vue","../../src/tools/scriptrunner/SuiteRunner.vue","../../src/tools/scriptrunner/autocomplete/utilities.js","../../src/tools/scriptrunner/autocomplete/packetCompleter.js","../../src/tools/scriptrunner/autocomplete/cmdCompleter.js","../../src/tools/scriptrunner/autocomplete/tlmCompleter.js","../../src/tools/scriptrunner/autocomplete/mnemonicChecker.js","../../src/tools/scriptrunner/annotations/regexAnnotator.js","../../src/tools/scriptrunner/annotations/sleepAnnotator.js","../../src/tools/scriptrunner/ScriptRunner.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2024, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-card flat class=\"tab-card\">\n <v-tabs\n v-model=\"activeTab\"\n bg-color=\"var(--color-background-base-default)\"\n >\n <v-tab value=\"running\">Running Scripts</v-tab>\n <v-tab value=\"completed\">Completed Scripts</v-tab>\n </v-tabs>\n <v-window v-model=\"activeTab\">\n <!-- Running Scripts Tab -->\n <v-window-item value=\"running\">\n <v-card-title>\n <v-row dense>\n <v-spacer />\n <v-btn class=\"mr-3\" color=\"primary\" @click=\"getRunningScripts\"\n >Refresh</v-btn\n >\n <v-text-field\n v-model=\"runningSearch\"\n class=\"pt-0 search\"\n label=\"Search\"\n prepend-inner-icon=\"mdi-magnify\"\n clearable\n variant=\"outlined\"\n density=\"compact\"\n single-line\n hide-details\n data-test=\"running-search\"\n style=\"max-width: 300px\"\n />\n </v-row>\n </v-card-title>\n\n <v-data-table-server\n :headers=\"runningHeaders\"\n :items=\"runningScripts\"\n :items-length=\"runningTotal\"\n :loading=\"runningLoading\"\n :search=\"runningSearch\"\n density=\"compact\"\n data-test=\"running-scripts\"\n :items-per-page=\"runningItemsPerPage\"\n :page=\"runningPage\"\n :items-per-page-options=\"[10, 25, 50]\"\n class=\"script-table\"\n @update:page=\"updateRunningPage\"\n @update:items-per-page=\"updateRunningItemsPerPage\"\n >\n <template #item.name=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n @click=\"showScript(item)\"\n >{{ item.name }}</v-btn\n >\n </template>\n <template #item.connect=\"{ item }\">\n <v-btn color=\"primary\" @click=\"connectScript(item)\">\n <span>Connect</span>\n <v-icon v-show=\"connectInNewTab\" end> mdi-open-in-new </v-icon>\n </v-btn>\n </template>\n <template #item.stop=\"{ item }\">\n <v-btn color=\"primary\" @click=\"deleteScript(item)\">\n <span>Stop</span>\n <v-icon end> mdi-close-circle-outline </v-icon>\n </v-btn>\n </template>\n </v-data-table-server>\n </v-window-item>\n\n <!-- Completed Scripts Tab -->\n <v-window-item value=\"completed\">\n <v-card-title>\n <v-row dense>\n <v-spacer />\n <v-btn class=\"mr-3\" color=\"primary\" @click=\"getCompletedScripts\"\n >Refresh</v-btn\n >\n <v-text-field\n v-model=\"completedSearch\"\n class=\"pt-0 search\"\n label=\"Search\"\n prepend-inner-icon=\"mdi-magnify\"\n clearable\n variant=\"outlined\"\n density=\"compact\"\n single-line\n hide-details\n style=\"max-width: 300px\"\n />\n </v-row>\n </v-card-title>\n\n <v-data-table-server\n :headers=\"completedHeaders\"\n :items=\"completedScripts\"\n :items-length=\"completedTotal\"\n :loading=\"completedLoading\"\n :search=\"completedSearch\"\n density=\"compact\"\n data-test=\"completed-scripts\"\n :items-per-page=\"completedItemsPerPage\"\n :page=\"completedPage\"\n :items-per-page-options=\"[10, 25, 50]\"\n class=\"script-table\"\n @update:page=\"updateCompletedPage\"\n @update:items-per-page=\"updateCompletedItemsPerPage\"\n >\n <template #item.name=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n @click=\"showScript(item)\"\n >{{ item.name }}</v-btn\n >\n </template>\n <template #item.log=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-eye\"\n @click=\"viewScriptLog(item, 'log')\"\n />\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-file-download-outline\"\n :disabled=\"downloadScript\"\n :loading=\"downloadScript && downloadScript.name === item.name\"\n @click=\"downloadScriptLog(item, 'log')\"\n />\n </template>\n <template #item.report=\"{ item }\">\n <div v-if=\"!item.report\">\n <span>N/A</span>\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-eye\"\n @click=\"viewScriptLog(item, 'report')\"\n />\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-file-download-outline\"\n :disabled=\"downloadScript\"\n :loading=\"downloadScript && downloadScript.name === item.name\"\n @click=\"downloadScriptLog(item, 'report')\"\n />\n </div>\n </template>\n </v-data-table-server>\n </v-window-item>\n </v-window>\n </v-card>\n\n <output-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :content=\"dialogContent\"\n type=\"Script\"\n :name=\"dialogName\"\n :filename=\"dialogFilename\"\n @submit=\"showDialog = false\"\n />\n </div>\n</template>\n\n<script>\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\nimport { OutputDialog } from '@/components'\nimport { TimeFilters } from '@/util'\n\nexport default {\n components: { OutputDialog },\n mixins: [TimeFilters],\n props: {\n tabId: Number,\n curTab: Number,\n connectInNewTab: Boolean,\n },\n data() {\n return {\n api: null,\n timeZone: 'local',\n activeTab: 'completed',\n downloadScript: null,\n refreshTimer: null,\n // Running scripts pagination data\n runningSearch: '',\n runningScripts: [],\n runningTotal: 0,\n runningLoading: false,\n runningPage: 1,\n runningItemsPerPage: 10,\n runningHeaders: [\n {\n title: 'Connect',\n key: 'connect',\n sortable: false,\n filterable: false,\n },\n { title: 'Id', key: 'name' },\n { title: 'User', key: 'user_display' },\n { title: 'Filename', key: 'filename' },\n { title: 'Start Time', key: 'start_time_formatted' },\n { title: 'Duration', key: 'duration' },\n { title: 'State', key: 'state' },\n {\n title: 'Stop',\n key: 'stop',\n sortable: false,\n filterable: false,\n },\n ],\n // Completed scripts pagination data\n completedSearch: '',\n completedScripts: [],\n completedTotal: 0,\n completedLoading: false,\n completedPage: 1,\n completedItemsPerPage: 10,\n completedHeaders: [\n { title: 'Id', key: 'name' },\n { title: 'User', key: 'user_display' },\n { title: 'Filename', key: 'filename' },\n { title: 'Start Time', key: 'start_time_formatted' },\n { title: 'Duration', key: 'duration' },\n { title: 'State', key: 'state' },\n {\n title: 'Log',\n key: 'log',\n sortable: false,\n filterable: false,\n },\n {\n title: 'Report',\n key: 'report',\n sortable: false,\n filterable: false,\n },\n ],\n showDialog: false,\n dialogName: '',\n dialogContent: '',\n dialogFilename: '',\n }\n },\n watch: {\n activeTab(newTab) {\n if (newTab === 'running') {\n this.getRunningScripts()\n } else if (newTab === 'completed') {\n this.getCompletedScripts()\n }\n },\n },\n created() {\n this.api = new OpenC3Api()\n this.api\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch((error) => {\n // Do nothing\n })\n\n this.getRunningScripts()\n this.getCompletedScripts()\n\n // Start a timer to refresh the running scripts list every 5 seconds\n this.refreshTimer = setInterval(() => {\n if (this.activeTab === 'running') {\n this.getRunningScripts()\n }\n }, 5000)\n },\n beforeUnmount() {\n // Clear the timer when component is unmounted\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer)\n }\n },\n methods: {\n getRunningScripts: function () {\n this.runningLoading = true\n const offset = (this.runningPage - 1) * this.runningItemsPerPage\n Api.get(\n `/script-api/running-script?scope=DEFAULT&offset=${offset}&limit=${this.runningItemsPerPage}`,\n )\n .then((response) => {\n const scripts = response.data.items || []\n const currentTime = new Date()\n\n // Calculate duration for each running script and format user info\n scripts.forEach((script) => {\n // Format user display as \"full_name (username)\"\n script.user_display = `${script.user_full_name} (${script.username})`\n\n // Calculate duration\n if (script.start_time) {\n const startTime = new Date(script.start_time)\n const durationMs = currentTime - startTime\n script.start_time_formatted = this.formatDateTimeHMS(\n startTime,\n this.timeZone,\n )\n // Format duration\n if (durationMs < 0) {\n script.duration = 'N/A'\n } else if (durationMs < 1000) {\n script.duration = '< 1s'\n } else if (durationMs < 60000) {\n script.duration = `${Math.round(durationMs / 1000)}s`\n } else if (durationMs < 3600000) {\n const minutes = Math.floor(durationMs / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${minutes}m ${seconds}s`\n } else {\n const hours = Math.floor(durationMs / 3600000)\n const minutes = Math.floor((durationMs % 3600000) / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${hours}h ${minutes}m ${seconds}s`\n }\n } else {\n script.duration = 'N/A'\n }\n })\n\n this.runningScripts = scripts\n this.runningTotal = response.data.total || scripts.length\n this.runningLoading = false\n })\n .catch((error) => {\n this.runningLoading = false\n this.$notify.caution({\n title: 'Error Loading Running Scripts',\n body: error.message,\n })\n })\n },\n updateRunningPage: function (page) {\n this.runningPage = page\n this.getRunningScripts()\n },\n updateRunningItemsPerPage: function (itemsPerPage) {\n this.runningItemsPerPage = itemsPerPage\n this.runningPage = 1\n this.getRunningScripts()\n },\n getCompletedScripts: function () {\n this.completedLoading = true\n const offset = (this.completedPage - 1) * this.completedItemsPerPage\n Api.get(\n `/script-api/completed-scripts?scope=DEFAULT&offset=${offset}&limit=${this.completedItemsPerPage}`,\n )\n .then((response) => {\n const scripts = response.data.items || []\n\n // Calculate duration and format user info for each completed script\n scripts.forEach((script) => {\n // Format user display as \"full_name (username)\"\n script.user_display = `${script.user_full_name} (${script.username})`\n\n // Calculate duration\n if (script.start_time && script.end_time) {\n const startTime = new Date(script.start_time)\n const endTime = new Date(script.end_time)\n const durationMs = endTime - startTime\n script.start_time_formatted = this.formatDateTimeHMS(\n startTime,\n this.timeZone,\n )\n\n // Format duration\n if (durationMs < 0) {\n script.duration = 'N/A'\n } else if (durationMs < 1000) {\n script.duration = '< 1s'\n } else if (durationMs < 60000) {\n script.duration = `${Math.round(durationMs / 1000)}s`\n } else if (durationMs < 3600000) {\n const minutes = Math.floor(durationMs / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${minutes}m ${seconds}s`\n } else {\n const hours = Math.floor(durationMs / 3600000)\n const minutes = Math.floor((durationMs % 3600000) / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${hours}h ${minutes}m ${seconds}s`\n }\n } else {\n script.duration = 'N/A'\n }\n })\n\n this.completedScripts = scripts\n this.completedTotal = response.data.total || scripts.length\n this.completedLoading = false\n })\n .catch((error) => {\n this.completedLoading = false\n this.$notify.caution({\n title: 'Error Loading Completed Scripts',\n body: error.message,\n })\n })\n },\n updateCompletedPage: function (page) {\n this.completedPage = page\n this.getCompletedScripts()\n },\n updateCompletedItemsPerPage: function (itemsPerPage) {\n this.completedItemsPerPage = itemsPerPage\n this.completedPage = 1\n this.getCompletedScripts()\n },\n showScript: function (script) {\n this.dialogContent = JSON.stringify(script, null, 2)\n this.dialogName = 'Script: ' + script.name\n this.dialogFilename = ''\n this.showDialog = true\n },\n connectScript: function (script) {\n // Must disconnect before connecting\n this.$emit('disconnect')\n const destination = {\n name: 'ScriptRunner',\n params: { id: script.name },\n }\n if (this.connectInNewTab) {\n let { href } = this.$router.resolve(destination)\n window.open(href, '_blank')\n } else {\n this.$router.push(destination)\n this.$emit('close')\n }\n },\n deleteScript: function (script) {\n this.$dialog\n .confirm(\n `Are you sure you want to stop script: ${script.name} ${script.filename}?\\n`,\n {\n okText: 'Stop',\n cancelText: 'Cancel',\n },\n )\n .then((dialog) => {\n return Api.post(`/script-api/running-script/${script.name}/delete`)\n })\n .then((response) => {\n this.$notify.normal({\n body: `Stopped script: ${script.name} ${script.filename}`,\n })\n this.getRunningScripts()\n })\n .catch((error) => {\n if (error !== true) {\n this.$notify.caution({\n body: `Failed to stop script: ${script.name} ${script.filename}`,\n })\n }\n })\n },\n viewScriptLog: function (script, type) {\n let logUrl = null\n if (type === 'report') {\n this.dialogName = 'Report'\n logUrl = script.report\n } else {\n this.dialogName = 'Log'\n logUrl = script.log\n }\n Api.get(\n `/openc3-api/storage/download_file/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET`,\n ).then((response) => {\n const filenameParts = logUrl.split('/')\n this.dialogFilename = filenameParts[filenameParts.length - 1]\n // Decode Base64 string\n this.dialogContent = window.atob(response.data.contents)\n this.showDialog = true\n })\n },\n downloadScriptLog: function (script, type) {\n let logUrl = null\n if (type === 'report') {\n this.dialogName = 'Report'\n logUrl = script.report\n } else {\n this.dialogName = 'Log'\n logUrl = script.log\n }\n this.downloadScript = script\n Api.get(\n `/openc3-api/storage/download/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET`,\n )\n .then((response) => {\n const filenameParts = logUrl.split('/')\n const basename = filenameParts[filenameParts.length - 1]\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = response.data.url\n link.setAttribute('download', basename)\n link.click()\n this.downloadScript = null\n })\n .catch(() => {\n this.$notify.caution({\n title: `Unable to download log ${logUrl}`,\n body: `You may be able to download this log manually from the 'logs' bucket at ${logUrl}`,\n })\n })\n },\n },\n}\n</script>\n<style>\n.v-sheet {\n background-color: var(--color-background-base-default);\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2023, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n <v-btn\n class=\"mx-2\"\n icon=\"mdi-download\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"download-log\"\n aria-label=\"Download Log\"\n @click=\"downloadLog\"\n />\n Script Messages\n <v-spacer />\n <v-select\n v-model=\"messageOrder\"\n density=\"compact\"\n hide-details\n variant=\"outlined\"\n :items=\"messageOrderOptions\"\n class=\"mr-2\"\n style=\"max-width: 200px\"\n data-test=\"message-order\"\n />\n <v-spacer />\n <v-text-field\n v-model=\"search\"\n label=\"Search\"\n prepend-inner-icon=\"mdi-magnify\"\n clearable\n variant=\"outlined\"\n density=\"compact\"\n single-line\n hide-details\n class=\"search\"\n data-test=\"search-messages\"\n />\n\n <v-btn\n class=\"mx-2\"\n icon=\"mdi-delete-sweep\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"clear-log\"\n aria-label=\"Clear Log\"\n @click=\"clearLog\"\n />\n </v-card-title>\n <v-card-text>\n <v-data-table\n id=\"script-log-messages\"\n style=\"overflow: auto\"\n :headers=\"headers\"\n :items=\"messages\"\n :search=\"search\"\n :items-per-page=\"-1\"\n hide-default-footer\n density=\"compact\"\n data-test=\"output-messages\"\n >\n <template #item.message=\"{ item }\">\n <div :class=\"messageClass(item.message)\">{{ item.message }}</div>\n </template>\n </v-data-table>\n </v-card-text>\n </v-card>\n</template>\n\n<script>\nimport { format } from 'date-fns'\n\nexport default {\n props: {\n modelValue: {\n type: Array,\n required: true,\n },\n },\n emits: ['sort', 'update:modelValue'],\n data() {\n return {\n search: '',\n headers: [{ title: 'Message', value: 'message', sortable: false }],\n messageOrderOptions: ['Newest on Top', 'Newest on Bottom'],\n messageOrder: 'Newest on Top',\n }\n },\n computed: {\n messages: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n watch: {\n messageOrder: function (newValue, oldValue) {\n this.$emit('sort', newValue)\n },\n },\n methods: {\n messageClass(message) {\n if (\n message.match(/(CHECK|WAIT): .*(success|was within range.*) with value/)\n ) {\n return 'openc3-green'\n } else if (\n message.match(\n /(CHECK|WAIT): .*(failed|failed to be within range.*) with value/,\n )\n ) {\n return 'openc3-red'\n } else {\n return ''\n }\n },\n downloadLog() {\n const output = this.messages.map((message) => message.message).join('\\n')\n const blob = new Blob([output], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute(\n 'download',\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss') + '_sr_message_log.txt',\n )\n link.click()\n },\n clearLog: function () {\n this.$dialog\n .confirm('Are you sure you want to clear the log?', {\n okText: 'Clear',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n this.messages = []\n })\n .catch(function (err) {\n // Canceling the dialog forces catch and sets err to true\n })\n },\n },\n}\n</script>\n","import { useSlots as ce, ref as k, computed as z, watch as B, onMounted as G, onBeforeUnmount as X, provide as g, createBlock as ve, openBlock as Y, resolveDynamicComponent as me, nextTick as T, h as fe, inject as w, getCurrentInstance as de, createElementBlock as pe, normalizeStyle as ze, unref as he, renderSlot as xe } from \"vue\";\nconst Pe = {\n __name: \"splitpanes\",\n props: {\n horizontal: { type: Boolean, default: !1 },\n pushOtherPanes: { type: Boolean, default: !0 },\n maximizePanes: { type: Boolean, default: !0 },\n // Maximize pane on splitter double click/tap.\n rtl: { type: Boolean, default: !1 },\n // Right to left direction.\n firstSplitter: { type: Boolean, default: !1 }\n },\n emits: [\n \"ready\",\n \"resize\",\n \"resized\",\n \"pane-click\",\n \"pane-maximize\",\n \"pane-add\",\n \"pane-remove\",\n \"splitter-click\",\n \"splitter-dblclick\"\n ],\n setup(D, { emit: h }) {\n const y = h, u = D, E = ce(), l = k([]), M = z(() => l.value.reduce((e, n) => (e[~~n.id] = n) && e, {})), m = z(() => l.value.length), x = k(null), S = k(!1), c = k({\n mouseDown: !1,\n dragging: !1,\n activeSplitter: null,\n cursorOffset: 0\n // Cursor offset within the splitter.\n }), f = k({\n // Used to detect double click on touch devices.\n splitter: null,\n timeoutId: null\n }), _ = z(() => ({\n [`splitpanes splitpanes--${u.horizontal ? \"horizontal\" : \"vertical\"}`]: !0,\n \"splitpanes--dragging\": c.value.dragging\n })), R = () => {\n document.addEventListener(\"mousemove\", r, { passive: !1 }), document.addEventListener(\"mouseup\", P), \"ontouchstart\" in window && (document.addEventListener(\"touchmove\", r, { passive: !1 }), document.addEventListener(\"touchend\", P));\n }, O = () => {\n document.removeEventListener(\"mousemove\", r, { passive: !1 }), document.removeEventListener(\"mouseup\", P), \"ontouchstart\" in window && (document.removeEventListener(\"touchmove\", r, { passive: !1 }), document.removeEventListener(\"touchend\", P));\n }, b = (e, n) => {\n const t = e.target.closest(\".splitpanes__splitter\");\n if (t) {\n const { left: i, top: a } = t.getBoundingClientRect(), { clientX: s, clientY: o } = \"ontouchstart\" in window && e.touches ? e.touches[0] : e;\n c.value.cursorOffset = u.horizontal ? o - a : s - i;\n }\n R(), c.value.mouseDown = !0, c.value.activeSplitter = n;\n }, r = (e) => {\n c.value.mouseDown && (e.preventDefault(), c.value.dragging = !0, requestAnimationFrame(() => {\n K(I(e)), d(\"resize\", { event: e }, !0);\n }));\n }, P = (e) => {\n c.value.dragging && (window.getSelection().removeAllRanges(), d(\"resized\", { event: e }, !0)), c.value.mouseDown = !1, c.value.activeSplitter = null, setTimeout(() => {\n c.value.dragging = !1, O();\n }, 100);\n }, A = (e, n) => {\n \"ontouchstart\" in window && (e.preventDefault(), f.value.splitter === n ? (clearTimeout(f.value.timeoutId), f.value.timeoutId = null, U(e, n), f.value.splitter = null) : (f.value.splitter = n, f.value.timeoutId = setTimeout(() => f.value.splitter = null, 500))), c.value.dragging || d(\"splitter-click\", { event: e, index: n }, !0);\n }, U = (e, n) => {\n if (d(\"splitter-dblclick\", { event: e, index: n }, !0), u.maximizePanes) {\n let t = 0;\n l.value = l.value.map((i, a) => (i.size = a === n ? i.max : i.min, a !== n && (t += i.min), i)), l.value[n].size -= t, d(\"pane-maximize\", { event: e, index: n, pane: l.value[n] }), d(\"resized\", { event: e, index: n }, !0);\n }\n }, W = (e, n) => {\n d(\"pane-click\", {\n event: e,\n index: M.value[n].index,\n pane: M.value[n]\n });\n }, I = (e) => {\n const n = x.value.getBoundingClientRect(), { clientX: t, clientY: i } = \"ontouchstart\" in window && e.touches ? e.touches[0] : e;\n return {\n x: t - (u.horizontal ? 0 : c.value.cursorOffset) - n.left,\n y: i - (u.horizontal ? c.value.cursorOffset : 0) - n.top\n };\n }, J = (e) => {\n e = e[u.horizontal ? \"y\" : \"x\"];\n const n = x.value[u.horizontal ? \"clientHeight\" : \"clientWidth\"];\n return u.rtl && !u.horizontal && (e = n - e), e * 100 / n;\n }, K = (e) => {\n const n = c.value.activeSplitter;\n let t = {\n prevPanesSize: $(n),\n nextPanesSize: N(n),\n prevReachedMinPanes: 0,\n nextReachedMinPanes: 0\n };\n const i = 0 + (u.pushOtherPanes ? 0 : t.prevPanesSize), a = 100 - (u.pushOtherPanes ? 0 : t.nextPanesSize), s = Math.max(Math.min(J(e), a), i);\n let o = [n, n + 1], v = l.value[o[0]] || null, p = l.value[o[1]] || null;\n const H = v.max < 100 && s >= v.max + t.prevPanesSize, ue = p.max < 100 && s <= 100 - (p.max + N(n + 1));\n if (H || ue) {\n H ? (v.size = v.max, p.size = Math.max(100 - v.max - t.prevPanesSize - t.nextPanesSize, 0)) : (v.size = Math.max(100 - p.max - t.prevPanesSize - N(n + 1), 0), p.size = p.max);\n return;\n }\n if (u.pushOtherPanes) {\n const j = Q(t, s);\n if (!j) return;\n ({ sums: t, panesToResize: o } = j), v = l.value[o[0]] || null, p = l.value[o[1]] || null;\n }\n v !== null && (v.size = Math.min(Math.max(s - t.prevPanesSize - t.prevReachedMinPanes, v.min), v.max)), p !== null && (p.size = Math.min(Math.max(100 - s - t.nextPanesSize - t.nextReachedMinPanes, p.min), p.max));\n }, Q = (e, n) => {\n const t = c.value.activeSplitter, i = [t, t + 1];\n return n < e.prevPanesSize + l.value[i[0]].min && (i[0] = V(t).index, e.prevReachedMinPanes = 0, i[0] < t && l.value.forEach((a, s) => {\n s > i[0] && s <= t && (a.size = a.min, e.prevReachedMinPanes += a.min);\n }), e.prevPanesSize = $(i[0]), i[0] === void 0) ? (e.prevReachedMinPanes = 0, l.value[0].size = l.value[0].min, l.value.forEach((a, s) => {\n s > 0 && s <= t && (a.size = a.min, e.prevReachedMinPanes += a.min);\n }), l.value[i[1]].size = 100 - e.prevReachedMinPanes - l.value[0].min - e.prevPanesSize - e.nextPanesSize, null) : n > 100 - e.nextPanesSize - l.value[i[1]].min && (i[1] = Z(t).index, e.nextReachedMinPanes = 0, i[1] > t + 1 && l.value.forEach((a, s) => {\n s > t && s < i[1] && (a.size = a.min, e.nextReachedMinPanes += a.min);\n }), e.nextPanesSize = N(i[1] - 1), i[1] === void 0) ? (e.nextReachedMinPanes = 0, l.value.forEach((a, s) => {\n s < m.value - 1 && s >= t + 1 && (a.size = a.min, e.nextReachedMinPanes += a.min);\n }), l.value[i[0]].size = 100 - e.prevPanesSize - N(i[0] - 1), null) : { sums: e, panesToResize: i };\n }, $ = (e) => l.value.reduce((n, t, i) => n + (i < e ? t.size : 0), 0), N = (e) => l.value.reduce((n, t, i) => n + (i > e + 1 ? t.size : 0), 0), V = (e) => [...l.value].reverse().find((t) => t.index < e && t.size > t.min) || {}, Z = (e) => l.value.find((t) => t.index > e + 1 && t.size > t.min) || {}, ee = () => {\n var n;\n const e = Array.from(((n = x.value) == null ? void 0 : n.children) || []);\n for (const t of e) {\n const i = t.classList.contains(\"splitpanes__pane\"), a = t.classList.contains(\"splitpanes__splitter\");\n !i && !a && (t.remove(), console.warn(\"Splitpanes: Only <pane> elements are allowed at the root of <splitpanes>. One of your DOM nodes was removed.\"));\n }\n }, F = (e, n, t = !1) => {\n const i = e - 1, a = document.createElement(\"div\");\n a.classList.add(\"splitpanes__splitter\"), t || (a.onmousedown = (s) => b(s, i), typeof window < \"u\" && \"ontouchstart\" in window && (a.ontouchstart = (s) => b(s, i)), a.onclick = (s) => A(s, i + 1)), a.ondblclick = (s) => U(s, i + 1), n.parentNode.insertBefore(a, n);\n }, ne = (e) => {\n e.onmousedown = void 0, e.onclick = void 0, e.ondblclick = void 0, e.remove();\n }, C = () => {\n var t;\n const e = Array.from(((t = x.value) == null ? void 0 : t.children) || []);\n for (const i of e)\n i.className.includes(\"splitpanes__splitter\") && ne(i);\n let n = 0;\n for (const i of e)\n i.className.includes(\"splitpanes__pane\") && (!n && u.firstSplitter ? F(n, i, !0) : n && F(n, i), n++);\n }, ie = ({ uid: e, ...n }) => {\n const t = M.value[e];\n for (const [i, a] of Object.entries(n)) t[i] = a;\n }, te = (e) => {\n var t;\n let n = -1;\n Array.from(((t = x.value) == null ? void 0 : t.children) || []).some((i) => (i.className.includes(\"splitpanes__pane\") && n++, i.isSameNode(e.el))), l.value.splice(n, 0, { ...e, index: n }), l.value.forEach((i, a) => i.index = a), S.value && T(() => {\n C(), L({ addedPane: l.value[n] }), d(\"pane-add\", { pane: l.value[n] });\n });\n }, ae = (e) => {\n const n = l.value.findIndex((i) => i.id === e);\n l.value[n].el = null;\n const t = l.value.splice(n, 1)[0];\n l.value.forEach((i, a) => i.index = a), T(() => {\n C(), d(\"pane-remove\", { pane: t }), L({ removedPane: { ...t } });\n });\n }, L = (e = {}) => {\n !e.addedPane && !e.removedPane ? le() : l.value.some((n) => n.givenSize !== null || n.min || n.max < 100) ? oe(e) : se(), S.value && d(\"resized\");\n }, se = () => {\n const e = 100 / m.value;\n let n = 0;\n const t = [], i = [];\n for (const a of l.value)\n a.size = Math.max(Math.min(e, a.max), a.min), n -= a.size, a.size >= a.max && t.push(a.id), a.size <= a.min && i.push(a.id);\n n > 0.1 && q(n, t, i);\n }, le = () => {\n let e = 100;\n const n = [], t = [];\n let i = 0;\n for (const s of l.value)\n e -= s.size, s.givenSize !== null && i++, s.size >= s.max && n.push(s.id), s.size <= s.min && t.push(s.id);\n let a = 100;\n if (e > 0.1) {\n for (const s of l.value)\n s.givenSize === null && (s.size = Math.max(Math.min(e / (m.value - i), s.max), s.min)), a -= s.size;\n a > 0.1 && q(a, n, t);\n }\n }, oe = ({ addedPane: e, removedPane: n } = {}) => {\n let t = 100 / m.value, i = 0;\n const a = [], s = [];\n ((e == null ? void 0 : e.givenSize) ?? null) !== null && (t = (100 - e.givenSize) / (m.value - 1));\n for (const o of l.value)\n i -= o.size, o.size >= o.max && a.push(o.id), o.size <= o.min && s.push(o.id);\n if (!(Math.abs(i) < 0.1)) {\n for (const o of l.value)\n (e == null ? void 0 : e.givenSize) !== null && (e == null ? void 0 : e.id) === o.id || (o.size = Math.max(Math.min(t, o.max), o.min)), i -= o.size, o.size >= o.max && a.push(o.id), o.size <= o.min && s.push(o.id);\n i > 0.1 && q(i, a, s);\n }\n }, q = (e, n, t) => {\n let i;\n e > 0 ? i = e / (m.value - n.length) : i = e / (m.value - t.length), l.value.forEach((a, s) => {\n if (e > 0 && !n.includes(a.id)) {\n const o = Math.max(Math.min(a.size + i, a.max), a.min), v = o - a.size;\n e -= v, a.size = o;\n } else if (!t.includes(a.id)) {\n const o = Math.max(Math.min(a.size + i, a.max), a.min), v = o - a.size;\n e -= v, a.size = o;\n }\n }), Math.abs(e) > 0.1 && T(() => {\n S.value && console.warn(\"Splitpanes: Could not resize panes correctly due to their constraints.\");\n });\n }, d = (e, n = void 0, t = !1) => {\n const i = (n == null ? void 0 : n.index) ?? c.value.activeSplitter ?? null;\n y(e, {\n ...n,\n ...i !== null && { index: i },\n ...t && i !== null && {\n prevPane: l.value[i - (u.firstSplitter ? 1 : 0)],\n nextPane: l.value[i + (u.firstSplitter ? 0 : 1)]\n },\n panes: l.value.map((a) => ({ min: a.min, max: a.max, size: a.size }))\n });\n };\n B(() => u.firstSplitter, () => C()), G(() => {\n ee(), C(), L(), d(\"ready\"), S.value = !0;\n }), X(() => S.value = !1);\n const re = () => {\n var e;\n return fe(\n \"div\",\n { ref: x, class: _.value },\n (e = E.default) == null ? void 0 : e.call(E)\n );\n };\n return g(\"panes\", l), g(\"indexedPanes\", M), g(\"horizontal\", z(() => u.horizontal)), g(\"requestUpdate\", ie), g(\"onPaneAdd\", te), g(\"onPaneRemove\", ae), g(\"onPaneClick\", W), (e, n) => (Y(), ve(me(re)));\n }\n}, ge = {\n __name: \"pane\",\n props: {\n size: { type: [Number, String] },\n minSize: { type: [Number, String], default: 0 },\n maxSize: { type: [Number, String], default: 100 }\n },\n setup(D) {\n var b;\n const h = D, y = w(\"requestUpdate\"), u = w(\"onPaneAdd\"), E = w(\"horizontal\"), l = w(\"onPaneRemove\"), M = w(\"onPaneClick\"), m = (b = de()) == null ? void 0 : b.uid, x = w(\"indexedPanes\"), S = z(() => x.value[m]), c = k(null), f = z(() => {\n const r = isNaN(h.size) || h.size === void 0 ? 0 : parseFloat(h.size);\n return Math.max(Math.min(r, R.value), _.value);\n }), _ = z(() => {\n const r = parseFloat(h.minSize);\n return isNaN(r) ? 0 : r;\n }), R = z(() => {\n const r = parseFloat(h.maxSize);\n return isNaN(r) ? 100 : r;\n }), O = z(() => {\n var r;\n return `${E.value ? \"height\" : \"width\"}: ${(r = S.value) == null ? void 0 : r.size}%`;\n });\n return B(() => f.value, (r) => y({ uid: m, size: r })), B(() => _.value, (r) => y({ uid: m, min: r })), B(() => R.value, (r) => y({ uid: m, max: r })), G(() => {\n u({\n id: m,\n el: c.value,\n min: _.value,\n max: R.value,\n // The given size (useful to know the user intention).\n givenSize: h.size === void 0 ? null : f.value,\n size: f.value\n // The computed current size at any time.\n });\n }), X(() => l(m)), (r, P) => (Y(), pe(\"div\", {\n ref_key: \"paneEl\",\n ref: c,\n class: \"splitpanes__pane\",\n onClick: P[0] || (P[0] = (A) => he(M)(A, r._.uid)),\n style: ze(O.value)\n }, [\n xe(r.$slots, \"default\")\n ], 4));\n }\n};\nexport {\n ge as Pane,\n Pe as Splitpanes\n};\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" persistent width=\"600\">\n <v-card>\n <v-form v-model=\"valid\" @submit.prevent=\"submitHandler\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> User Input Required </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <div class=\"question\">{{ question }}</div>\n <v-text-field\n v-model=\"inputValue\"\n autofocus\n data-test=\"ask-value-input\"\n :type=\"password ? 'password' : 'text'\"\n :rules=\"rules\"\n />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"ask-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n type=\"submit\"\n data-test=\"ask-ok\"\n :disabled=\"!valid\"\n @click.prevent=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n question: {\n type: String,\n required: true,\n },\n default: {\n type: String,\n default: null,\n },\n password: {\n type: Boolean,\n default: false,\n },\n answerRequired: {\n type: Boolean,\n default: true,\n },\n modelValue: Boolean,\n },\n data() {\n return {\n inputValue: '',\n valid: false,\n rules: [(v) => !!v || 'Required'],\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n created() {\n if (this.default) {\n this.valid = true\n this.inputValue = this.default\n }\n if (this.answerRequired === false) {\n this.valid = true\n this.rules = [(v) => true]\n }\n },\n methods: {\n submitHandler: function () {\n this.$emit('response', this.inputValue)\n },\n cancelHandler: function () {\n this.$emit('response', 'Cancel')\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.question {\n font-size: 1rem;\n white-space: pre-line;\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" persistent width=\"600\">\n <v-card>\n <v-form v-model=\"valid\" @submit.prevent=\"submitHandler\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> File Dialog </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row>\n <span class=\"title\">{{ title }}</span>\n </v-row>\n <v-row v-if=\"message\">\n <span\n class=\"ma-3\"\n style=\"white-space: pre-line\"\n v-text=\"message\"\n />\n </v-row>\n <v-row class=\"my-1\">\n <v-file-input\n v-model=\"inputValue\"\n label=\"Choose File\"\n :rules=\"rules\"\n autofocus\n data-test=\"file-input\"\n :accept=\"filter\"\n small-chips\n :multiple=\"multiple\"\n />\n </v-row>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"file-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n type=\"submit\"\n data-test=\"file-ok\"\n :disabled=\"!valid\"\n @click.prevent=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n title: {\n type: String,\n required: true,\n },\n message: {\n type: String,\n default: null,\n },\n filter: {\n type: String,\n default: '*',\n },\n multiple: {\n type: Boolean,\n default: false,\n },\n modelValue: Boolean,\n },\n data() {\n return {\n inputValue: null,\n valid: null,\n rules: [\n (value) => {\n if (this.multiple) {\n return value.length != 0 || 'Required'\n } else {\n return !!value || 'Required'\n }\n },\n ],\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n methods: {\n submitHandler: function () {\n // Ensure we send back an array of file names even in the single case\n // to make it easier to deal with a consistent result\n if (!Array.isArray(this.inputValue)) {\n this.inputValue = [this.inputValue]\n }\n this.$emit('response', this.inputValue)\n },\n cancelHandler: function () {\n this.$emit('response', 'Cancel')\n },\n },\n}\n</script>\n\n<style scoped>\n.title {\n font-size: 1.125rem;\n font-weight: bold;\n padding-bottom: 5px;\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <!-- INFO -->\n <v-dialog v-model=\"show\" :width=\"width\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span style=\"white-space: pre-line\" v-text=\"title\" />\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row no-gutters v-for=\"(line, index) in text\" :key=\"index\">\n <span style=\"white-space: pre-line\" v-text=\"line\" />\n </v-row>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n title: {\n type: String,\n required: true,\n },\n text: {\n type: String,\n required: true,\n },\n width: {\n type: String,\n required: true,\n },\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n methods: {},\n}\n</script>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"1000\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span>Overrides</span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row class=\"ma-1\">\n <v-btn\n color=\"primary\"\n data-test=\"overrides-dialog-clear-all\"\n @click=\"clearOverrides\"\n >\n Clear All Overrides\n </v-btn>\n <v-spacer />\n <v-text-field\n v-model=\"search\"\n label=\"Search\"\n prepend-inner-icon=\"mdi-magnify\"\n clearable\n variant=\"outlined\"\n density=\"compact\"\n single-line\n hide-details\n />\n </v-row>\n <v-data-table\n :headers=\"headers\"\n :items=\"overrides\"\n :search=\"search\"\n :items-per-page-options=\"[100]\"\n multi-sort\n density=\"compact\"\n >\n <template #item.delete=\"{ item }\">\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Override\"\n @click=\"deleteOverride(item)\"\n />\n </template>\n </v-data-table>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"flat\"\n data-test=\"overrides-dialog-ok\"\n @click=\"show = !show\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { OpenC3Api } from '@openc3/js-common/services'\n\nexport default {\n components: {},\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n },\n data() {\n return {\n api: null,\n overrides: [],\n search: '',\n headers: [\n { text: 'Target', value: 'target_name' },\n { text: 'Packet', value: 'packet_name' },\n { text: 'Item', value: 'item_name' },\n { text: 'Type', value: 'value_type' },\n { text: 'Value', value: 'value' },\n { text: 'Delete', value: 'delete' },\n ],\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n created: function () {\n this.api = new OpenC3Api()\n this.getOverrides()\n },\n methods: {\n getOverrides: function () {\n this.api.get_overrides().then((result) => {\n this.overrides = result\n })\n },\n clearOverrides: function () {\n const items = [\n ...new Map(\n this.overrides.map((item) => [\n // Create a key based on target, packet, item so we remove duplicates\n `${item.target_name}__${item.packet_name}__${item.item_name}`,\n item,\n ]),\n ).values(),\n ]\n for (let item of items) {\n this.api\n .normalize_tlm(\n item.target_name,\n item.packet_name,\n item.item_name,\n 'ALL',\n )\n .then((result) => {\n this.overrides = []\n })\n }\n },\n deleteOverride: function (item) {\n this.api\n .normalize_tlm(\n item.target_name,\n item.packet_name,\n item.item_name,\n item.value_type,\n )\n .then((result) => {\n let index = this.overrides.indexOf(item)\n this.overrides.splice(index, 1)\n })\n },\n },\n}\n</script>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" persistent width=\"600\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span class=\"text\" v-text=\"title\" />\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text class=\"text\">\n <v-row v-if=\"subtitle\">\n <v-card-subtitle>{{ subtitle }}</v-card-subtitle>\n </v-row>\n <v-row class=\"mt-1\">\n <span v-text=\"message\" />\n </v-row>\n <v-row v-if=\"details\" class=\"mt-1\">\n <span v-text=\"details\" />\n </v-row>\n </v-card-text>\n </div>\n <div v-if=\"layout === 'combo'\">\n <v-row class=\"ma-2\">\n <v-select\n v-model=\"selectedItem\"\n label=\"Select\"\n color=\"secondary\"\n class=\"ma-1\"\n data-test=\"prompt-select\"\n :items=\"buttons\"\n :multiple=\"multiple === true\"\n @update:model-value=\"selectOkDisabled = false\"\n />\n </v-row>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"prompt-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n data-test=\"prompt-ok\"\n :disabled=\"selectOkDisabled\"\n @click=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </div>\n <div v-else>\n <v-card-actions :class=\"layoutClass\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"prompt-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <div v-for=\"(button, index) in buttons\" :key=\"index\">\n <v-btn\n variant=\"flat\"\n :data-test=\"`prompt-${button.text}`\"\n @click=\"submitWrapper(button.value)\"\n >\n {{ button.text }}\n </v-btn>\n </div>\n </v-card-actions>\n </div>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n title: {\n type: String,\n default: 'Prompt Dialog',\n },\n subtitle: {\n type: String,\n default: '',\n },\n message: {\n type: String,\n required: true,\n },\n details: {\n type: String,\n default: '',\n },\n buttons: {\n type: Array,\n default: () => [],\n },\n layout: {\n type: String,\n default: 'horizontal', // Also 'vertical' or 'combo' when means ComboBox\n },\n multiple: {\n type: Boolean,\n default: false,\n required: false,\n },\n modelValue: Boolean,\n },\n data() {\n return {\n selectOkDisabled: true,\n selectedItem: null,\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n layoutClass() {\n let layout = 'px-2 d-flex align-start'\n if (this.layout === 'vertical') {\n return `${layout} flex-column`\n } else {\n return `${layout} flex-row`\n }\n },\n },\n methods: {\n submitWrapper: function (output) {\n this.selectedItem = output\n this.submitHandler()\n },\n submitHandler: function () {\n this.$emit('response', this.selectedItem)\n },\n cancelHandler: function () {\n this.$emit('response', 'Cancel')\n },\n },\n}\n</script>\n\n<style scoped>\n.v-card__subtitle {\n padding: 0;\n padding-bottom: 10px;\n}\n\n.text {\n font-size: 1rem;\n white-space: pre-line;\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2024, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" scrollable width=\"800\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> Script Results </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text style=\"width: 100%; max-height: 80vh; overflow: auto\">\n <v-textarea\n readonly\n hide-details\n density=\"compact\"\n auto-grow\n :model-value=\"text\"\n />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"outlined\" @click=\"downloadResults\"> Download </v-btn>\n <v-btn ref=\"okButton\" variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { format } from 'date-fns'\n\nexport default {\n components: {},\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n text: {\n type: String,\n required: true,\n },\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n mounted() {\n // Focus the OK button so it's easy to hit Enter to close\n setTimeout(() => {\n this.$refs.okButton.$el.focus()\n })\n },\n methods: {\n downloadResults() {\n const blob = new Blob([this.text], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute(\n 'download',\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss') + '_suite_results.txt',\n )\n link.click()\n },\n },\n}\n</script>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"600\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span>Script Environment Variables</span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <environment-chooser v-model=\"selected\" />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"environment-dialog-cancel\"\n @click=\"cancel\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n data-test=\"environment-dialog-save\"\n :disabled=\"!!inputError\"\n @click=\"updateEnvironment\"\n >\n Save\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { EnvironmentChooser } from '@/components'\n\nexport default {\n components: {\n EnvironmentChooser,\n },\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n inputEnvironment: {\n type: Array,\n required: true,\n },\n },\n data() {\n return {\n selected: [],\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n mounted: function () {\n this.loadEnvironment()\n },\n methods: {\n loadEnvironment: function () {\n this.selected = [...this.inputEnvironment]\n },\n updateEnvironment: function () {\n this.$emit('environment', this.selected)\n this.show = !this.show\n },\n cancel: function () {\n this.show = !this.show\n },\n },\n}\n</script>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2023, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <div id=\"tr-container\">\n <v-row no-gutters align=\"center\">\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Pause on Error\"\n value=\"pauseOnError\"\n hide-details\n data-test=\"pause-on-error\"\n />\n </div>\n </template>\n <span>\n Checked pauses the script when an error is encountered<br />\n Unchecked continues without user interaction\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Manual\"\n value=\"manual\"\n hide-details\n data-test=\"manual\"\n />\n </div>\n </template>\n <span>\n {{ checkedManualTooltip }}<br />\n {{ uncheckedManualTooltip }}\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"suite\"\n label=\"Suite:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"suites\"\n data-test=\"select-suite\"\n @update:model-value=\"suiteChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-suite\"\n @click=\"$emit('button', { method: 'start', suite, options })\"\n >\n Start\n </v-btn>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n data-test=\"setup-suite\"\n :disabled=\"\n disableButtons || !setupSuiteEnabled || !userInfo.execute\n \"\n @click=\"$emit('button', { method: 'setup', suite, options })\"\n >\n Setup\n </v-btn>\n <v-btn\n color=\"primary\"\n data-test=\"teardown-suite\"\n :disabled=\"\n disableButtons || !teardownSuiteEnabled || !userInfo.execute\n \"\n @click=\"$emit('button', { method: 'teardown', suite, options })\"\n >\n Teardown\n </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n <v-row no-gutters>\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Continue after Error\"\n value=\"continueAfterError\"\n hide-details\n data-test=\"continue-after-error\"\n />\n </div>\n </template>\n <span>\n Checked allows the script to continue when an error is\n encountered<br />\n Unchecked forces the current script to end\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Loop\"\n value=\"loop\"\n hide-details\n data-test=\"loop\"\n />\n </div>\n </template>\n <span>\n Checked continuously executes until explicitly stopped<br />\n Unchecked executes only the started script(s)\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"group\"\n label=\"Group:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"groups\"\n data-test=\"select-group\"\n @update:model-value=\"groupChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-group\"\n @click=\"\n $emit('button', { method: 'start', suite, group, options })\n \"\n >\n Start\n </v-btn>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n data-test=\"setup-group\"\n :disabled=\"\n disableButtons || !setupGroupEnabled || !userInfo.execute\n \"\n @click=\"\n $emit('button', { method: 'setup', suite, group, options })\n \"\n >\n Setup\n </v-btn>\n <v-btn\n color=\"primary\"\n data-test=\"teardown-group\"\n :disabled=\"\n disableButtons || !teardownGroupEnabled || !userInfo.execute\n \"\n @click=\"\n $emit('button', { method: 'teardown', suite, group, options })\n \"\n >\n Teardown\n </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n <v-row no-gutters>\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Abort after Error\"\n value=\"abortAfterError\"\n hide-details\n data-test=\"abort-after-error\"\n />\n </div>\n </template>\n <span>\n Checked stops additional script execution when an error is\n encountered<br />\n Unchecked allows additional scripts to execute\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n :disabled=\"!options.includes('loop')\"\n label=\"Break Loop on Error\"\n value=\"breakLoopOnError\"\n hide-details\n data-test=\"break-loop-on-error\"\n />\n </div>\n </template>\n <span>\n Checked breaks the loop option when an error is encountered<br />\n Unchecked allows the loop to run continuously<br />\n Note: Abort after Error still breaks the loop\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"script\"\n label=\"Script:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"scriptNames\"\n item-title=\"title\"\n item-value=\"value\"\n data-test=\"select-script\"\n @update:model-value=\"scriptChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-script\"\n @click=\"\n $emit('button', {\n method: 'start',\n suite,\n group,\n script,\n options,\n })\n \"\n >\n Start\n </v-btn>\n <!-- Create some invisible buttons to line up Start properly -->\n <v-btn color=\"primary\" class=\"mr-2 invisible\"> Setup </v-btn>\n <v-btn color=\"primary\" class=\"invisible\"> Teardown </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n suiteMap: {\n type: Object,\n required: true,\n },\n disableButtons: {\n type: Boolean,\n required: true,\n },\n filename: {\n type: String,\n required: true,\n },\n },\n emits: ['button', 'loaded'],\n data() {\n return {\n suites: [],\n groups: [],\n scripts: [],\n suite: '',\n group: '',\n script: '',\n options: ['pauseOnError', 'manual', 'continueAfterError'],\n userInfo: {},\n }\n },\n computed: {\n checkedManualTooltip() {\n if (this.filename.endsWith('.py')) {\n return 'Checked sets the RunningScript.manual variable to True'\n } else {\n return 'Checked sets the $manual variable to true'\n }\n },\n uncheckedManualTooltip() {\n if (this.filename.endsWith('.py')) {\n return 'Unchecked sets the RunningScript.manual variable to False'\n } else {\n return 'Unchecked sets the $manual variable to false'\n }\n },\n setupSuiteEnabled() {\n if (this.suite && this.suiteMap[this.suite].setup) {\n return true\n } else {\n return false\n }\n },\n teardownSuiteEnabled() {\n if (this.suite && this.suiteMap[this.suite].teardown) {\n return true\n } else {\n return false\n }\n },\n setupGroupEnabled() {\n if (\n this.suite &&\n this.group &&\n this.suiteMap[this.suite].groups[this.group].setup\n ) {\n return true\n } else {\n return false\n }\n },\n teardownGroupEnabled() {\n if (\n this.suite &&\n this.group &&\n this.suiteMap[this.suite].groups[this.group].teardown\n ) {\n return true\n } else {\n return false\n }\n },\n scriptNames() {\n return this.scripts.map((name) => {\n return {\n // strip script_ or test_ from the name\n title: name.replace(/^(script_|test_)/, ''),\n value: name,\n }\n })\n },\n },\n // Watch the suiteMap so we can recreate the suites and set the initial value\n watch: {\n suiteMap: {\n handler: function (newVal, oldVal) {\n this.updateSuiteMap()\n },\n deep: true, // Deep watcher because suiteMap is a nested Object\n },\n },\n created() {\n this.userInfo = JSON.parse(localStorage['script_runner__userinfo'])\n this.initSuites()\n this.$emit('loaded')\n },\n methods: {\n updateSuiteMap() {\n this.suites = Object.keys(this.suiteMap)\n if (\n this.suiteMap[this.suite] == undefined ||\n this.suiteMap[this.suite].groups[this.group] == undefined\n ) {\n this.initSuites()\n } else {\n this.groups = Object.keys(this.suiteMap[this.suite].groups)\n this.scripts = this.suiteMap[this.suite].groups[this.group].scripts\n }\n },\n initSuites() {\n this.suites = Object.keys(this.suiteMap)\n this.suiteChanged(this.suites[0])\n },\n suiteChanged(event) {\n this.suite = event\n this.group = ''\n this.script = ''\n this.groups = Object.keys(this.suiteMap[event].groups)\n // Make the group default be the first group\n this.groupChanged(this.groups[0])\n },\n groupChanged(event) {\n this.group = event\n this.script = ''\n this.scripts = this.suiteMap[this.suite].groups[event].scripts\n // Make the script default be the first\n this.scriptChanged(this.scripts[0])\n },\n scriptChanged(event) {\n this.script = event\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.invisible {\n visibility: hidden;\n}\n#tr-container {\n padding-top: 0px;\n padding-bottom: 15px;\n padding-left: 0px;\n padding-right: 0px;\n}\n</style>\n","/*\n# Copyright 2021 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license \n# if purchased from OpenC3, Inc.\n*/\n\nimport { Api } from '@openc3/js-common/services'\n\nconst getKeywords = (type) => {\n return Api.get(`/openc3-api/autocomplete/keywords/${type}`)\n}\n\nconst getAutocompleteData = (type) => {\n return Api.get(`/openc3-api/autocomplete/data/${type}`)\n}\n\n// This should probably go in some higher up util library thing place\nconst groupBy = (array, lambda) => {\n return array.reduce((groups, item) => {\n const key = lambda(item)\n if (groups[key]) {\n groups[key].push(item)\n } else {\n groups[key] = [item]\n }\n return groups\n }, {})\n}\n\nexport { getKeywords, getAutocompleteData, groupBy }\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport { getKeywords, getAutocompleteData } from './utilities'\n\nconst toMethodCallSyntaxRegex = (word) => {\n // create regex to find the opening of a ruby method call\n const prefix = '(^|[{\\\\(\\\\s])' // Allowable characters before the method name: start of line or { or ( or a space\n const opening = '[\\\\s\\\\(]f?[\\'\"]' // Opening sequence for a method call and a string argument: ( or a space, then ' or \"\n const params = '(\\\\S+\\\\s?){0,3}' // Only allow up to a few tokens after the keyword to avoid autocompleteception\n return new RegExp(`${prefix}${word}${opening}${params}$`) // ensure end of line because it's sliced to the current cursor position\n}\n\nexport default class PacketCompleter {\n constructor(\n type,\n dataReadyCallback = () => {},\n expressionsReadyCallback = () => {},\n ) {\n this.keywordExpressions = [] // Keywords that trigger the autocomplete feature\n this.autocompleteData = [] // Data to populate the autocomplete list\n\n getKeywords(type).then((response) => {\n this.keywordExpressions = response.data.map(toMethodCallSyntaxRegex)\n expressionsReadyCallback()\n })\n getAutocompleteData(type).then((response) => {\n this.autocompleteData = response.data\n dataReadyCallback()\n })\n }\n\n getCompletions(_editor, session, position, _prefix, callback) {\n let matches = []\n const lineBeforeCursor = session.doc.$lines[position.row].slice(\n 0,\n position.column,\n )\n if (\n this.keywordExpressions.some((regex) => lineBeforeCursor.match(regex))\n ) {\n matches = this.autocompleteData\n }\n\n callback(null, [\n ...matches,\n\n // Uncomment to also return the built-in autocomplete words (but I found they're not very good and just get in the way when using live autocomplete)\n // ...session.$mode.$highlightRules.$keywordList.map((word) => ({\n // caption: word,\n // value: word,\n // meta: 'keyword',\n // })),\n ])\n }\n}\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license \n# if purchased from OpenC3, Inc.\n*/\n\nimport PacketCompleter from './packetCompleter.js'\n\nexport default class CmdCompleter extends PacketCompleter {\n constructor() {\n super('cmd')\n }\n}\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport PacketCompleter from './packetCompleter.js'\n\nexport default class TlmCompleter extends PacketCompleter {\n constructor() {\n super('tlm', () => {\n // The data returned by the API is usable as-is, but grouping it this way makes it easier\n // to search through all the packets first, and then for an item within that packet.\n this.groupedPacketData = this.autocompleteData.reduce((groups, item) => {\n const packetName = item.caption.match(/\\S+\\s\\S+/)[0] // First two tokens, e.g. \"INST ADCS\" OF \"INST ADCS POSX\"\n const itemName = item.snippet.replace(`${packetName} `, '')\n const amendedItem = {\n caption: itemName,\n snippet: itemName,\n meta: 'item',\n }\n\n if (groups[packetName]) {\n groups[packetName].push(amendedItem)\n } else {\n groups[packetName] = [amendedItem]\n }\n return groups\n }, {})\n this.packets = Object.keys(this.groupedPacketData).map((packetName) => {\n return {\n caption: packetName,\n snippet: packetName,\n meta: 'packet',\n }\n })\n })\n }\n\n // Override the parent's getCompletions to take advantage of the grouping by packet done in the constructor\n getCompletions(_editor, session, position, _prefix, callback) {\n let matches = []\n const lineBeforeCursor = session.doc.$lines[position.row].slice(\n 0,\n position.column,\n )\n if (\n this.keywordExpressions.some((regex) => lineBeforeCursor.match(regex))\n ) {\n const foundPacket = Object.keys(this.groupedPacketData).find(\n (packetName) => lineBeforeCursor.includes(packetName),\n )\n if (foundPacket) {\n matches = this.groupedPacketData[foundPacket]\n } else {\n matches = this.packets\n }\n }\n\n callback(null, matches)\n }\n}\n","/*\n# Copyright 2021 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport { OpenC3Api } from '@openc3/js-common/services'\nimport { getKeywords, groupBy } from './utilities'\n\nconst toKeywordRegex = (word) => {\n // create regex to find the opening of a ruby method call\n const prefix = '(^|[{\\\\(\\\\s])' // Allowable characters before the method name: start of line or { or ( or a space\n const call = '((\\\\s.+)|(\\\\(.+\\\\)))' // A method call and its arguments\n return new RegExp(`${prefix}${word}${call}`)\n}\nconst interpolatedStringRegex = /\\{/\nconst alternateSyntaxRegex = /['\"],\\s?['\"]/\n\nexport default class MnemonicChecker {\n constructor() {\n this.api = new OpenC3Api()\n\n this.targets = {}\n this.api.get_target_names().then((response) => {\n response.forEach((target) => {\n this.targets[target] = {\n cmd: null,\n tlm: null,\n }\n })\n })\n\n this.cmdKeywordExpressions = []\n getKeywords('cmd').then((response) => {\n this.cmdKeywordExpressions = response.data.map(toKeywordRegex)\n })\n\n this.tlmKeywordExpressions = []\n getKeywords('tlm').then((response) => {\n this.tlmKeywordExpressions = response.data.map(toKeywordRegex)\n })\n }\n\n async checkText(text) {\n const { linesToCheck, linesToSkip } = text.split('\\n').reduce(\n (result, line, index) => {\n line = line.trim()\n if (line.match(/^#/)) {\n return result\n }\n const cmdMatch = this.cmdKeywordExpressions.reduce((found, regex) => {\n return found || line.match(regex)\n }, null)\n const tlmMatch = this.tlmKeywordExpressions.reduce((found, regex) => {\n return found || line.match(regex)\n }, null)\n if (!cmdMatch && !tlmMatch) {\n return result\n }\n\n let matchStr = cmdMatch || tlmMatch\n let matchStrLen = matchStr.length\n matchStr = matchStr[matchStrLen - 1]\n\n const mnemonicMatch = matchStr\n .substring(matchStr.match(/[\\(\\s)]/).index + 1) // Trim off leading `cmd(` or whatever\n .replace(/\\)+.*$/, '') // and the closing )s\n\n if (mnemonicMatch.match(interpolatedStringRegex)) {\n result.linesToSkip.push(index + 1)\n return result\n }\n\n const usingAlternateSyntax = !!mnemonicMatch.match(alternateSyntaxRegex)\n const mnemonicParts = mnemonicMatch.split(\n usingAlternateSyntax ? ',' : ' ',\n )\n if (mnemonicParts.length < 2) {\n return result // TODO: is this right? Maybe put an error on lineObj?\n }\n\n const mnemonic = {\n target: mnemonicParts[0],\n packet: mnemonicParts[1],\n }\n if (tlmMatch) {\n mnemonic.item = mnemonicParts[2]\n } else {\n const mnemonicParams = mnemonicParts.slice(2)\n if (usingAlternateSyntax) {\n mnemonic.params = mnemonicParams.map(\n (param) => param.split('=>')[0],\n )\n } else {\n mnemonic.params = mnemonicParams.filter((token, index) => index % 2)\n }\n }\n\n // Clean up the quotes and whitespace from the parts of the mnemonic\n for (const property in mnemonic) {\n if (typeof mnemonic[property] === 'string') {\n mnemonic[property] = mnemonic[property].replace(/['\"]/g, '').trim()\n } else {\n mnemonic[property] = mnemonic[property].map((item) =>\n item.replace(/['\"]/g, '').trim(),\n )\n }\n }\n\n result.linesToCheck.push({\n line,\n mnemonic,\n lineNumber: index + 1,\n })\n return result\n },\n { linesToCheck: [], linesToSkip: [] },\n )\n\n const problems = await this._checkLines(linesToCheck)\n return {\n skipped: linesToSkip.sort(),\n problems: problems.sort((a, b) => a.lineNumber - b.lineNumber),\n }\n }\n\n async _checkLines(linesToCheck) {\n const problemLines = []\n const targetGroups = groupBy(\n linesToCheck,\n (lineObj) => lineObj.mnemonic.target,\n )\n for (const target in targetGroups) {\n if (!this.targets[target]) {\n for (const lineObj of targetGroups[target]) {\n problemLines.push({\n ...lineObj,\n error: `Target \"${target}\" does not exist.`,\n })\n }\n continue\n }\n const packetGroups = groupBy(\n targetGroups[target],\n (lineObj) => lineObj.mnemonic.packet,\n )\n for (const packet in packetGroups) {\n for (const lineObj of packetGroups[packet]) {\n const cmdOrTlm = lineObj.mnemonic.item ? 'tlm' : 'cmd'\n if (!this.targets[target][cmdOrTlm]) {\n const method = lineObj.mnemonic.item\n ? 'get_all_tlm'\n : 'get_all_cmds'\n const response = await this.api[method](target)\n this.targets[target][cmdOrTlm] = response.reduce(\n (result, packetInfo) => {\n result[packetInfo.packet_name] = packetInfo.items.map(\n (item) => item.name,\n )\n return result\n },\n {},\n )\n }\n\n const items = this.targets[target][cmdOrTlm][packet]\n if (!items) {\n problemLines.push({\n ...lineObj,\n error: `${\n cmdOrTlm === 'tlm' ? 'Packet' : 'Command'\n } \"${target} ${packet}\" does not exist.`,\n })\n continue\n }\n if (lineObj.mnemonic.item) {\n if (!items.some((item) => item === lineObj.mnemonic.item)) {\n problemLines.push({\n ...lineObj,\n error: `Item \"${target} ${packet} ${lineObj.mnemonic.item}\" does not exist.`,\n })\n continue\n }\n } else {\n for (const param of lineObj.mnemonic.params) {\n if (!items.some((item) => item === param)) {\n problemLines.push({\n ...lineObj,\n error: `Command \"${target} ${packet}\" param \"${param}\" does not exist.`,\n })\n continue\n }\n }\n }\n }\n }\n }\n return problemLines\n }\n}\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nexport default class RegexAnnotator {\n // TODO: the eslint parser errors on these because of the #\n // Not sure if this naming is needed for the Ace editor or something?\n #id\n #editor\n #pattern\n #text\n #type\n\n constructor(editor, { pattern, text, type }) {\n this.#id = `regexAnnotator-${Math.floor(Math.random() * 10000000)}`\n this.#editor = editor\n this.#pattern = pattern\n this.#text = text\n this.#type = type\n }\n\n // Re-annotate the entire document\n refresh = () => {\n const session = this.#editor.session\n this.#removeAllAnnotations(session)\n const event = {\n lines: session.doc.$lines,\n action: 'insert',\n start: { row: 0 },\n end: { row: session.doc.$lines.length },\n }\n this.annotate(event, session)\n }\n\n // Update annotations for the changed lines\n annotate = ($event, session) => {\n if ($event.lines.length > 1) {\n // They created or deleted a line (or multiple lines), so first need to shift all the existing annotations\n switch ($event.action) {\n case 'insert':\n this.#shiftAnnotations(\n session,\n $event.start.row,\n $event.lines.length - 1,\n )\n break\n case 'remove':\n this.#shiftAnnotations(\n session,\n $event.start.row + 1,\n -$event.lines.length + 1,\n )\n break\n }\n }\n for (let row = $event.start.row; row <= $event.end.row; row++) {\n let column = session.doc.$lines[row]?.match(this.#pattern)?.index\n if (column !== undefined) {\n column !== 0 && (column += 1) // Account for a leading space that might've been included in the match\n this.#addAnnotation(session, {\n row,\n column, // I don't think our editor theme shows the column for annotations, but others do\n text: this.#text,\n type: this.#type,\n openc3Id: this.#id,\n })\n } else if ($event.action === 'remove') {\n this.#deleteAnnotationsForRow(session, row)\n }\n }\n }\n\n #addAnnotation = (session, newAnnotation) => {\n this.#deleteAnnotationsForRow(session, newAnnotation.row) // Reset this row first for the new annotation\n session.setAnnotations([...session.getAnnotations(), newAnnotation])\n }\n\n #deleteAnnotationsForRow = (session, row) => {\n session.setAnnotations(\n session\n .getAnnotations()\n .filter(\n (annotation) =>\n annotation.openc3Id !== this.#id || annotation.row !== row,\n ),\n )\n }\n\n #shiftAnnotations = (session, row, count) => {\n session.setAnnotations(\n session.getAnnotations().map((annotation) => {\n if (annotation.row > row) {\n annotation.row += count\n }\n return annotation\n }),\n )\n }\n\n #removeAllAnnotations = (session) => {\n session.setAnnotations(\n session\n .getAnnotations()\n .filter((annotation) => annotation.openc3Id !== this.#id),\n )\n }\n}\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license \n# if purchased from OpenC3, Inc.\n*/\n\nimport RegexAnnotator from './regexAnnotator.js'\n\nexport default class SleepAnnotator extends RegexAnnotator {\n constructor(editor) {\n const prefix = '(^|[{\\\\s])' // Allowable characters before the keyword: start of line or { or a space\n const keyword = 'sleep' // The keyword this annotation looks for\n const suffix = '[\\\\(\\\\s]' // Allowable characters after the keyword: ( or a space\n super(editor, {\n pattern: new RegExp(`${prefix}${keyword}${suffix}`),\n text: 'Use `wait` instead of `sleep` in OpenC3 scripts', // because we override wait to make it work better, but not sleep\n type: 'warning',\n })\n }\n}\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2024, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <template v-if=\"!inline\">\n <top-bar :menus=\"menus\" :title=\"title\" />\n <v-snackbar\n v-model=\"showAlert\"\n absolute\n :color=\"alertType\"\n :timeout=\"3000\"\n class=\"apply-top\"\n :style=\"classificationStyles\"\n >\n <v-icon> mdi-{{ alertType }} </v-icon>\n {{ alertText }}\n <template #actions=\"{ attrs }\">\n <v-btn\n variant=\"text\"\n text=\"Close\"\n v-bind=\"attrs\"\n @click=\"showAlert = false\"\n />\n </template>\n </v-snackbar>\n <v-snackbar\n v-model=\"showEditingToast\"\n absolute\n class=\"apply-top\"\n :style=\"classificationStyles\"\n :timeout=\"-1\"\n color=\"orange\"\n >\n <v-icon> mdi-pencil-off </v-icon>\n {{ lockedBy }} is editing this script. Editor is in read-only mode\n <template #actions=\"{ attrs }\">\n <v-btn\n variant=\"text\"\n v-bind=\"attrs\"\n color=\"danger\"\n text=\"Unlock\"\n data-test=\"unlock-button\"\n @click=\"confirmLocalUnlock\"\n />\n <v-btn\n variant=\"text\"\n text=\"Dismiss\"\n v-bind=\"attrs\"\n @click=\"\n () => {\n showEditingToast = false\n }\n \"\n />\n </template>\n </v-snackbar>\n <div class=\"grid\">\n <div\n v-for=\"def in screens\"\n :id=\"screenId(def.id)\"\n :key=\"def.id\"\n ref=\"gridItem\"\n class=\"item\"\n >\n <div class=\"item-content\">\n <openc3-screen\n :target=\"def.target\"\n :screen=\"def.screen\"\n :definition=\"def.definition\"\n :keywords=\"screenKeywords\"\n :initial-floated=\"true\"\n :initial-top=\"def.top\"\n :initial-left=\"def.left\"\n :initial-z=\"3\"\n :min-z=\"3\"\n :fix-floated=\"true\"\n :count=\"def.count\"\n @close-screen=\"closeScreen(def.id)\"\n @delete-screen=\"closeScreen(def.id)\"\n />\n </div>\n </div>\n </div>\n <v-card>\n <v-card-text>\n <suite-runner\n v-if=\"suiteRunner\"\n class=\"suite-runner\"\n :suite-map=\"suiteMap\"\n :disable-buttons=\"disableSuiteButtons\"\n :filename=\"fullFilename\"\n @button=\"suiteRunnerButton\"\n @loaded=\"doResize\"\n />\n <div id=\"sr-controls\">\n <v-row no-gutters justify=\"space-between\">\n <v-icon v-if=\"showDisconnect\" class=\"mt-2\" color=\"red\">\n mdi-connection\n </v-icon>\n <div class=\"d-flex align-center mr-1\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-if=\"!scriptId\"\n v-bind=\"props\"\n icon=\"mdi-cached\"\n variant=\"text\"\n density=\"compact\"\n :disabled=\"filename === NEW_FILENAME\"\n aria-label=\"Reload File\"\n @click=\"reloadFile\"\n />\n <v-btn\n v-else\n v-bind=\"props\"\n icon=\"mdi-arrow-left\"\n variant=\"text\"\n density=\"compact\"\n @click=\"backToNewScript\"\n />\n </template>\n <span v-if=\"!scriptId\"> Reload File </span>\n <span v-else> Back to New Script </span>\n </v-tooltip>\n </div>\n <v-select\n id=\"filename\"\n v-model=\"filenameSelect\"\n :items=\"fileList\"\n :disabled=\"fileList.length <= 1\"\n label=\"Filename\"\n data-test=\"filename\"\n style=\"width: 300px\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n @update:model-value=\"fileNameChanged\"\n />\n <v-text-field\n v-model=\"scriptId\"\n label=\"Script ID\"\n data-test=\"id\"\n class=\"shrink ml-2 script-state\"\n style=\"max-width: 100px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-text-field\n v-model=\"stateTimer\"\n label=\"Script State\"\n data-test=\"state\"\n class=\"shrink ml-2 script-state\"\n style=\"max-width: 120px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-progress-circular\n v-if=\"state === 'Connecting...'\"\n :size=\"40\"\n class=\"mx-2\"\n indeterminate\n color=\"primary\"\n />\n <div v-else style=\"width: 40px; height: 40px\" class=\"mx-2\"></div>\n\n <v-spacer />\n <div v-if=\"startOrGoButton === 'Start'\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n class=\"mr-2\"\n icon\n variant=\"text\"\n density=\"compact\"\n :disabled=\"envDisabled\"\n data-test=\"env-button\"\n aria-label=\"Script Environment\"\n @click=\"scriptEnvironment.show = !scriptEnvironment.show\"\n >\n <v-badge v-model=\"environmentModified\" floating dot>\n <v-icon icon=\"mdi-application-variable\" />\n </v-badge>\n </v-btn>\n </template>\n <span>\n Script Environment\n <template v-if=\"environmentModified\"> (modified) </template>\n </span>\n </v-tooltip>\n <v-btn\n class=\"mx-1\"\n color=\"primary\"\n text=\"Start\"\n data-test=\"start-button\"\n :disabled=\"startOrGoDisabled || !executeUser\"\n :hidden=\"suiteRunner\"\n @click=\"startHandler\"\n />\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n text=\"Go\"\n :disabled=\"startOrGoDisabled\"\n data-test=\"go-button\"\n @click=\"go\"\n />\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :text=\"pauseOrRetryButton\"\n :disabled=\"pauseOrRetryDisabled\"\n data-test=\"pause-retry-button\"\n @click=\"pauseOrRetry\"\n />\n <v-btn\n color=\"primary\"\n text=\"Stop\"\n data-test=\"stop-button\"\n :disabled=\"stopDisabled\"\n @click=\"stop\"\n />\n </div>\n </v-row>\n </div>\n </v-card-text>\n </v-card>\n <splitpanes horizontal style=\"height: 100%\" @resize=\"calcHeight\">\n <pane class=\"editorbox\" size=\"50\">\n <v-snackbar\n v-model=\"showSave\"\n absolute\n location=\"right\"\n :timeout=\"-1\"\n class=\"saving apply-top\"\n :style=\"classificationStyles\"\n >\n Saving...\n </v-snackbar>\n <pre\n ref=\"editor\"\n class=\"editor\"\n @contextmenu.prevent=\"showExecuteSelectionMenu\"\n ></pre>\n <v-menu v-model=\"executeSelectionMenu\" :target=\"[menuX, menuY]\">\n <v-list>\n <v-list-item title=\"Execute Selection\" @click=\"executeSelection\" />\n <v-list-item\n v-if=\"scriptId\"\n title=\"Goto Line\"\n @click=\"runFromCursor\"\n />\n <v-list-item\n v-if=\"!scriptId\"\n title=\"Run From Line\"\n @click=\"runFromCursor\"\n />\n <v-list-item\n v-if=\"!scriptId\"\n title=\"Clear Local Breakpoints\"\n @click=\"clearBreakpoints\"\n />\n <v-divider />\n <v-list-item\n title=\"Toggle Vim mode\"\n prepend-icon=\"extras:vim\"\n @click=\"toggleVimMode\"\n />\n </v-list>\n </v-menu>\n </pane>\n <pane id=\"messages\" ref=\"messagesDiv\" class=\"mt-2\">\n <div v-if=\"showDebug\" id=\"debug\" class=\"pa-0\">\n <v-row no-gutters>\n <v-btn\n color=\"primary\"\n style=\"width: 100px\"\n class=\"mr-4\"\n text=\"Step\"\n append-icon=\"mdi-step-forward\"\n :disabled=\"!scriptId\"\n data-test=\"step-button\"\n @click=\"step\"\n />\n <v-text-field\n ref=\"debug\"\n v-model=\"debug\"\n class=\"mb-2\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n label=\"Debug\"\n data-test=\"debug-text\"\n @keydown=\"debugKeydown\"\n />\n </v-row>\n </div>\n <script-log-messages\n id=\"log-messages\"\n v-model=\"messages\"\n @sort=\"messageSortOrder\"\n />\n </pane>\n </splitpanes>\n </template>\n\n <div v-if=\"inline\">\n <v-row>\n <v-col class=\"v-col-10\" style=\"margin: 0px; padding: 0px\">\n <pre\n ref=\"editor\"\n class=\"editor\"\n style=\"height: 200px\"\n @contextmenu.prevent=\"showExecuteSelectionMenu\"\n ></pre>\n </v-col>\n <v-col\n class=\"v-col-2\"\n style=\"\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: var(--color-background-surface-default);\n \"\n >\n <div v-if=\"startOrGoButton === 'Start'\">\n <v-btn\n class=\"mx-1\"\n color=\"primary\"\n text=\"Start\"\n data-test=\"start-button\"\n :disabled=\"startOrGoDisabled || !executeUser\"\n :hidden=\"suiteRunner\"\n @click=\"startHandler\"\n />\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n text=\"Go\"\n :disabled=\"startOrGoDisabled\"\n data-test=\"go-button\"\n @click=\"go\"\n />\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n :text=\"pauseOrRetryButton\"\n :disabled=\"pauseOrRetryDisabled\"\n data-test=\"pause-retry-button\"\n @click=\"pauseOrRetry\"\n />\n\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n text=\"Stop\"\n data-test=\"stop-button\"\n :disabled=\"stopDisabled\"\n @click=\"stop\"\n />\n </div>\n </v-col>\n </v-row>\n </div>\n\n <file-open-save-dialog\n v-if=\"fileOpen\"\n v-model=\"fileOpen\"\n type=\"open\"\n api-url=\"/script-api/scripts\"\n @file=\"setFile($event)\"\n @error=\"setError($event)\"\n @clear-temp=\"clearTemp($event)\"\n />\n <file-open-save-dialog\n v-if=\"showSaveAs\"\n v-model=\"showSaveAs\"\n type=\"save\"\n api-url=\"/script-api/scripts\"\n require-target-parent-dir\n :input-filename=\"filenameOrBlank\"\n @filename=\"saveAsFilename($event)\"\n @error=\"setError($event)\"\n @clear-temp=\"clearTemp($event)\"\n />\n <environment-dialog v-if=\"showEnvironment\" v-model=\"showEnvironment\" />\n <ask-dialog\n v-if=\"ask.show\"\n v-model=\"ask.show\"\n :question=\"ask.question\"\n :default=\"ask.default\"\n :password=\"ask.password\"\n :answer-required=\"ask.answerRequired\"\n @response=\"ask.callback\"\n />\n <file-dialog\n v-if=\"file.show\"\n v-model=\"file.show\"\n :title=\"file.title\"\n :message=\"file.message\"\n :multiple=\"file.multiple\"\n :filter=\"file.filter\"\n @response=\"fileDialogCallback\"\n />\n <information-dialog\n v-if=\"information.show\"\n v-model=\"information.show\"\n :title=\"information.title\"\n :text=\"information.text\"\n :width=\"information.width\"\n />\n <event-list-dialog\n v-if=\"inputMetadata.show\"\n v-model=\"inputMetadata.show\"\n :events=\"inputMetadata.events\"\n :time-zone=\"timeZone\"\n new-metadata\n @close=\"inputMetadata.callback\"\n />\n <overrides-dialog v-if=\"showOverrides\" v-model=\"showOverrides\" />\n <prompt-dialog\n v-if=\"prompt.show\"\n v-model=\"prompt.show\"\n :title=\"prompt.title\"\n :subtitle=\"prompt.subtitle\"\n :message=\"prompt.message\"\n :details=\"prompt.details\"\n :buttons=\"prompt.buttons\"\n :layout=\"prompt.layout\"\n :multiple=\"prompt.multiple\"\n @response=\"prompt.callback\"\n />\n <results-dialog\n v-if=\"results.show\"\n v-model=\"results.show\"\n :text=\"results.text\"\n />\n <script-environment-dialog\n v-if=\"scriptEnvironment.show\"\n v-model=\"scriptEnvironment.show\"\n :input-environment=\"scriptEnvironment.env\"\n @environment=\"environmentHandler\"\n />\n <simple-text-dialog\n v-model=\"showSuiteError\"\n title=\"Suite Analysis Error\"\n :text=\"suiteError\"\n :width=\"1000\"\n />\n <critical-cmd-dialog\n v-model=\"displayCriticalCmd\"\n :uuid=\"criticalCmdUuid\"\n :cmd-string=\"criticalCmdString\"\n :cmd-user=\"criticalCmdUser\"\n :persistent=\"true\"\n @status=\"promptDialogCallback\"\n />\n <v-bottom-sheet v-model=\"showScripts\">\n <v-sheet class=\"pb-11 pt-5 px-5\">\n <running-scripts\n v-if=\"showScripts\"\n :connect-in-new-tab=\"!!fileModified\"\n @disconnect=\"scriptDisconnect\"\n @close=\"\n () => {\n showScripts = false\n }\n \"\n />\n </v-sheet>\n </v-bottom-sheet>\n</template>\n\n<script>\nimport axios from 'axios'\nimport { format } from 'date-fns'\nimport { Splitpanes, Pane } from 'splitpanes'\nimport 'splitpanes/dist/splitpanes.css'\n\nimport { Api, Cable, OpenC3Api } from '@openc3/js-common/services'\nimport {\n AceEditorModes,\n AceEditorUtils,\n CriticalCmdDialog,\n EnvironmentDialog,\n FileOpenSaveDialog,\n Openc3Screen,\n SimpleTextDialog,\n TopBar,\n} from '@/components'\nimport { ClassificationBanners } from '@/tools/base'\nimport { fileIcon } from '@/util'\nimport { EventListDialog } from '@/tools/calendar'\n\nimport AskDialog from '@/tools/scriptrunner/Dialogs/AskDialog.vue'\nimport FileDialog from '@/tools/scriptrunner/Dialogs/FileDialog.vue'\nimport InformationDialog from '@/tools/scriptrunner/Dialogs/InformationDialog.vue'\nimport OverridesDialog from '@/tools/scriptrunner/Dialogs/OverridesDialog.vue'\nimport PromptDialog from '@/tools/scriptrunner/Dialogs/PromptDialog.vue'\nimport ResultsDialog from '@/tools/scriptrunner/Dialogs/ResultsDialog.vue'\nimport ScriptEnvironmentDialog from '@/tools/scriptrunner/Dialogs/ScriptEnvironmentDialog.vue'\nimport SuiteRunner from '@/tools/scriptrunner/SuiteRunner.vue'\nimport ScriptLogMessages from '@/tools/scriptrunner/ScriptLogMessages.vue'\nimport {\n CmdCompleter,\n TlmCompleter,\n MnemonicChecker,\n} from '@/tools/scriptrunner/autocomplete'\nimport { SleepAnnotator } from '@/tools/scriptrunner/annotations'\nimport RunningScripts from '@/tools/scriptrunner/RunningScripts.vue'\n\n// Matches target_file.rb TEMP_FOLDER\nconst TEMP_FOLDER = '__TEMP__'\nconst NEW_FILENAME = '<Untitled>'\nconst START = 'Start'\nconst GO = 'Go'\nconst PAUSE = 'Pause'\nconst RETRY = 'Retry'\n\nexport default {\n components: {\n FileOpenSaveDialog,\n Openc3Screen,\n EnvironmentDialog,\n Splitpanes,\n Pane,\n TopBar,\n AskDialog,\n FileDialog,\n InformationDialog,\n EventListDialog,\n OverridesDialog,\n PromptDialog,\n ResultsDialog,\n ScriptEnvironmentDialog,\n SimpleTextDialog,\n SuiteRunner,\n RunningScripts,\n ScriptLogMessages,\n CriticalCmdDialog,\n },\n mixins: [AceEditorModes, ClassificationBanners],\n beforeRouteUpdate: function (to, from, next) {\n if (to.params.id) {\n this.tryLoadRunningScript(to.params.id).then(next)\n } else {\n next()\n }\n },\n props: {\n inline: {\n type: Boolean,\n default: false,\n },\n body: {\n type: String,\n default: null,\n },\n },\n emits: ['alert', 'script-id'],\n data() {\n return {\n title: 'Script Runner',\n suiteRunner: false, // Whether to display the SuiteRunner GUI\n disableSuiteButtons: false,\n suiteMap: {\n // Useful for testing the various options in the SuiteRunner GUI\n // Suite: {\n // teardown: true,\n // groups: {\n // Group: {\n // setup: true,\n // cases: ['case1', 'case2', 'really_long_test_case_name3'],\n // },\n // ReallyLongGroupName: {\n // cases: ['case1', 'case2', 'case3'],\n // },\n // },\n // },\n },\n filenameSelect: null,\n currentFilename: null, // This is the currently shown filename while running\n showSave: false,\n showAlert: false,\n alertType: null,\n alertText: '',\n state: null,\n scriptId: null,\n startOrGoButton: START,\n startOrGoDisabled: false,\n envDisabled: false,\n pauseOrRetryButton: PAUSE,\n pauseOrRetryDisabled: false,\n stopDisabled: false,\n showEnvironment: false,\n showDebug: false,\n debug: '',\n debugHistory: [],\n debugHistoryIndex: 0,\n showDisconnect: false,\n files: {},\n breakpoints: {},\n enableStackTraces: false,\n filename: NEW_FILENAME,\n readOnlyUser: false,\n executeUser: true,\n saveAllowed: true,\n tempFilename: null,\n fileModified: '',\n fileOpen: false,\n lockedBy: null,\n showEditingToast: false,\n showSaveAs: false,\n areYouSure: false,\n subscription: null,\n cable: null,\n fatal: false,\n updateInterval: null,\n receivedEvents: [],\n messages: [],\n messagesNewestOnTop: true,\n maxArrayLength: 200,\n Range: ace.require('ace/range').Range,\n ask: {\n show: false,\n question: '',\n default: null,\n password: false,\n answerRequired: true,\n callback: () => {},\n },\n file: {\n show: false,\n message: '',\n directory: null,\n filter: '*',\n multiple: false,\n callback: () => {},\n },\n prompt: {\n show: false,\n title: '',\n subtitle: '',\n message: '',\n details: '',\n buttons: null,\n layout: 'horizontal',\n callback: () => {},\n },\n information: {\n show: false,\n title: '',\n text: [],\n width: '600',\n },\n inputMetadata: {\n show: false,\n events: [],\n callback: () => {},\n },\n results: {\n show: false,\n text: '',\n },\n scriptEnvironment: {\n show: false,\n env: [],\n },\n showSuiteError: false,\n suiteError: '',\n executeSelectionMenu: false,\n menuX: 0,\n menuY: 0,\n mnemonicChecker: new MnemonicChecker(),\n showScripts: false,\n showOverrides: false,\n activePromptId: '',\n api: null,\n timeZone: 'local',\n screens: [],\n screenKeywords: null,\n idCounter: 0,\n updateCounter: 0,\n recent: [],\n waitingInterval: null,\n waitingTime: 0,\n waitingStart: 0,\n criticalCmdUuid: null,\n criticalCmdString: null,\n criticalCmdUser: null,\n displayCriticalCmd: false,\n }\n },\n computed: {\n stateTimer: function () {\n if (this.state === 'waiting' || this.state === 'paused') {\n return `${this.state} ${this.waitingTime}s`\n }\n return this.state\n },\n // This is the list of files shown in the select dropdown\n fileList: function () {\n // this.files is the list of all files seen while running\n const filenames = Object.keys(this.files)\n filenames.push(this.fullFilename) // Make sure the currently shown filename is last\n return [...new Set(filenames)] // ensure unique\n },\n environmentModified: function () {\n return this.scriptEnvironment.env.length > 0\n },\n isLocked: function () {\n return !!this.lockedBy\n },\n // Returns the currently shown filename\n fullFilename: function () {\n if (this.currentFilename) return this.currentFilename\n // New filenames should not indicate modified\n if (this.filename === NEW_FILENAME) return NEW_FILENAME\n return `${this.filename} ${this.fileModified}`.trim()\n },\n // It's annoying for people (and tests) to clear the <Untitled>\n // when saving a new file so replace with blank\n // This makes sure that string doesn't show up in the dialog\n filenameOrBlank: function () {\n return this.filename === NEW_FILENAME ? '' : this.filename\n },\n menus: function () {\n return [\n {\n label: 'File',\n items: [\n {\n label: 'New File',\n icon: 'mdi-file-plus',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.newFile()\n },\n },\n {\n label: 'New Suite',\n icon: 'mdi-file-document-plus',\n disabled: this.scriptId || this.readOnlyUser,\n subMenu: [\n {\n label: 'Ruby',\n icon: 'mdi-language-ruby',\n command: () => {\n this.newRubyTestSuite()\n },\n },\n {\n label: 'Python',\n icon: 'mdi-language-python',\n command: () => {\n this.newPythonTestSuite()\n },\n },\n ],\n },\n {\n label: 'Open File',\n icon: 'mdi-folder-open',\n disabled: this.scriptId,\n command: () => {\n this.openFile()\n },\n },\n {\n label: 'Open Recent',\n icon: 'mdi-folder-open',\n disabled: this.scriptId,\n subMenu: this.recent,\n },\n {\n divider: true,\n },\n {\n label: 'Save File',\n icon: 'mdi-content-save',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.saveFile()\n },\n },\n {\n label: 'Save As...',\n icon: 'mdi-content-save',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.saveAs()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Download',\n icon: 'mdi-cloud-download',\n disabled: this.scriptId,\n command: () => {\n this.download()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Delete File',\n icon: 'mdi-delete',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.delete()\n },\n },\n ],\n },\n {\n label: 'Edit',\n items: [\n {\n label: 'Find',\n icon: 'mdi-magnify',\n command: () => {\n this.editor.execCommand('find')\n },\n },\n {\n label: 'Replace',\n icon: 'mdi-find-replace',\n disabled: this.scriptId,\n command: () => {\n this.editor.execCommand('replace')\n },\n },\n {\n label: 'Set Line Delay',\n icon: 'mdi-invoice-text-clock',\n disabled: this.scriptId,\n command: () => {\n this.$dialog.open({\n title: 'Info',\n text:\n 'You can set the line delay in seconds using the api method set_line_delay().<br/><br/>' +\n 'The default line delay is 0.1 seconds between lines. ' +\n 'Adding set_line_delay(0) to the top of your script will execute the script at maximum speed. ' +\n 'However, this can make it difficult to see and pause the script. ' +\n 'Executing set_line_delay(1) will cause a 1 second delay between lines.',\n okText: 'OK',\n okClass: 'primary',\n validateText: null,\n cancelText: null,\n html: true,\n })\n },\n },\n ],\n },\n {\n label: 'Script',\n items: [\n {\n label: 'Execution Status',\n icon: 'mdi-run',\n command: () => {\n this.showScripts = true\n },\n },\n {\n divider: true,\n },\n {\n label: 'Global Environment',\n icon: 'mdi-library',\n disabled: this.scriptId,\n command: () => {\n this.showEnvironment = !this.showEnvironment\n },\n },\n {\n label: 'Metadata',\n icon: 'mdi-calendar',\n disabled: this.scriptId,\n command: () => {\n this.inputMetadata.callback = () => {}\n this.showMetadata()\n },\n },\n {\n label: 'Overrides',\n icon: 'mdi-swap-horizontal',\n command: () => {\n this.showOverrides = true\n },\n },\n {\n divider: true,\n },\n {\n label: 'Syntax Check',\n icon: 'mdi-file-check',\n disabled: this.scriptId,\n command: () => {\n this.syntaxCheck()\n },\n },\n {\n label: 'Mnemonic Check',\n icon: 'mdi-spellcheck',\n disabled: this.scriptId,\n command: () => {\n this.checkMnemonics()\n },\n },\n {\n label: 'Instrumented Script',\n icon: 'mdi-code-braces-box',\n disabled: this.scriptId,\n command: () => {\n this.showInstrumented()\n },\n },\n {\n label: 'Call Stack',\n icon: 'mdi-format-list-numbered',\n disabled: !this.scriptId,\n command: () => {\n this.showCallStack()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Toggle Debug',\n icon: 'mdi-bug',\n command: () => {\n this.toggleDebug()\n },\n },\n {\n label: 'Toggle Disconnect',\n icon: 'mdi-connection',\n disabled: this.scriptId,\n command: () => {\n this.toggleDisconnect()\n },\n },\n {\n label: 'Enable Stack Traces',\n checkbox: true,\n checked: this.enableStackTraces,\n disabled: this.scriptId,\n command: () => {\n // Toggling the checkbox closes the menu so no need\n // to check state, just toggle existing value\n this.enableStackTraces = !this.enableStackTraces\n },\n },\n {\n divider: true,\n },\n {\n label: 'Delete All Breakpoints',\n icon: 'mdi-delete-circle-outline',\n disabled: this.scriptId,\n command: () => {\n this.deleteAllBreakpoints()\n },\n },\n ],\n },\n ]\n },\n },\n watch: {\n isLocked: function (val) {\n this.showEditingToast = val\n if (!this.suiteRunner) {\n this.startOrGoDisabled = val\n }\n if (this.readOnlyUser == false && val == false) {\n this.editor.setReadOnly(val)\n } else {\n this.editor.setReadOnly(true)\n }\n },\n fullFilename: function (filename) {\n this.filenameSelect = filename\n if (!this.inline) {\n if (filename === NEW_FILENAME) {\n localStorage.removeItem('script_runner__filename')\n } else {\n localStorage['script_runner__filename'] = filename\n }\n }\n },\n },\n created: async function () {\n // Ensure Offline Access Is Setup For the Current User\n this.api = new OpenC3Api()\n this.api.ensure_offline_access()\n this.api\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch((error) => {\n // Do nothing\n })\n\n // Make NEW_FILENAME available to the template\n this.NEW_FILENAME = NEW_FILENAME\n\n let user = OpenC3Auth.user()\n let roles = OpenC3Auth.userroles()\n this.readOnlyUser = true\n this.executeUser = false\n for (let role of roles) {\n if (role == 'viewer') {\n continue\n }\n if (role == 'admin' || role == 'operator') {\n this.readOnlyUser = false\n this.executeUser = true\n } else if (role == 'runner') {\n this.executeUser = true\n } else {\n await Api.get(`/openc3-api/roles/${role}`).then((response) => {\n if (\n response.data !== null &&\n response.data.permissions !== undefined\n ) {\n if (\n response.data.permissions.some(\n (i) => i.permission == 'script_edit',\n )\n ) {\n this.readOnlyUser = false\n }\n if (\n response.data.permissions.some(\n (i) => i.permission == 'script_run',\n )\n ) {\n this.executeUser = true\n }\n }\n })\n }\n }\n // Output the userinfo for use in the SuiteRunner component\n if (!this.inline) {\n localStorage['script_runner__userinfo'] = JSON.stringify({\n name: user['preferred_username'],\n readOnly: this.readOnlyUser,\n execute: this.executeUser,\n })\n }\n if (this.readOnlyUser == true) {\n this.alertType = 'info'\n let text = `User ${user['preferred_username']} is read only`\n if (this.executeUser) {\n text += ' but can execute scripts'\n }\n this.alertText = text\n this.showAlert = true\n }\n\n Api.get('/openc3-api/autocomplete/keywords/screen').then((response) => {\n this.screenKeywords = response.data\n })\n\n if (this.inline) {\n this.readOnly = true\n }\n },\n mounted: async function () {\n this.editor = ace.edit(this.$refs.editor)\n this.editor.setTheme('ace/theme/twilight')\n const RubyMode = this.buildRubyMode()\n const PythonMode = this.buildPythonMode()\n this.rubyMode = new RubyMode()\n this.pythonMode = new PythonMode()\n this.editor.session.setMode(this.rubyMode)\n this.editor.session.setTabSize(2)\n this.editor.session.setUseWrapMode(true)\n this.editor.$blockScrolling = Infinity\n this.editor.setOption('enableBasicAutocompletion', true)\n this.editor.setOption('enableLiveAutocompletion', true)\n this.editor.completers = [new CmdCompleter(), new TlmCompleter()]\n this.editor.setHighlightActiveLine(false)\n AceEditorUtils.applyVimModeIfEnabled(this.editor, { saveFn: this.saveFile })\n this.editor.focus()\n\n this.editor.on('guttermousedown', this.toggleBreakpoint)\n // We listen to tokenizerUpdate rather than change because this\n // is the background process that updates as changes are processed\n // while change fires immediately before the UndoManager is updated.\n this.editor.session.on('tokenizerUpdate', this.onChange)\n if (this.readOnlyUser) {\n this.editor.setReadOnly(true)\n this.editor.renderer.$cursorLayer.element.style.display = 'none'\n }\n\n const sleepAnnotator = new SleepAnnotator(this.editor)\n this.editor.session.on('change', ($event, session) => {\n sleepAnnotator.annotate($event, session)\n this.updateBreakpoints($event, session)\n })\n\n this.editor.container.addEventListener('resize', this.doResize)\n this.editor.container.addEventListener('keydown', this.keydown)\n\n // Allow the charts to dynamically resize when the window resizes\n window.addEventListener('resize', this.calcHeight)\n this.calcHeight()\n\n this.cable = new Cable('/script-api/cable')\n\n if (!this.inline && localStorage['script_runner__recent']) {\n this.recent = JSON.parse(localStorage['script_runner__recent'])\n // Rebuild the command since that doesn't get stringified\n this.recent = this.recent.map((item) => ({\n ...item,\n command: async (event) => {\n this.filename = event.label\n await this.reloadFile()\n },\n }))\n }\n if (!this.inline) {\n if (this.$route.query?.file) {\n this.filename = this.$route.query.file\n await this.reloadFile()\n } else if (this.$route.params?.id) {\n await this.tryLoadRunningScript(this.$route.params.id)\n } else {\n this.scriptId = sessionStorage.getItem('script_runner__script_id')\n if (this.scriptId) {\n await this.tryLoadRunningScript(this.scriptId)\n } else if (localStorage['script_runner__filename']) {\n this.filename = localStorage['script_runner__filename']\n await this.reloadFile(false)\n }\n }\n } else {\n if (this.body) {\n this.editor.setValue(this.body)\n this.editor.clearSelection()\n }\n }\n this.updateInterval = setInterval(async () => {\n this.processReceived()\n }, 100) // Every 100ms\n },\n beforeUnmount() {\n if (this.scriptId && !this.inline) {\n sessionStorage.setItem('script_runner__script_id', this.scriptId)\n }\n this.editor.destroy()\n this.editor.container.remove()\n },\n unmounted() {\n this.unlockFile()\n if (this.updateInterval != null) {\n clearInterval(this.updateInterval)\n }\n if (this.subscription) {\n this.subscription.unsubscribe()\n this.subscription = null\n }\n this.cable.disconnect()\n },\n methods: {\n toggleVimMode() {\n AceEditorUtils.toggleVimMode(this.editor)\n },\n doResize() {\n this.editor.resize()\n // nextTick allows the resize to work correctly\n // when we remove the SuiteRunner chrome\n this.$nextTick(() => {\n this.calcHeight()\n })\n },\n calcHeight() {\n const editor = document.getElementsByClassName('editorbox')[0]\n const h = Math.max(\n document.documentElement.offsetHeight,\n window.innerHeight || 0,\n )\n let editorHeight = 0\n if (editor) {\n editorHeight = editor.offsetHeight\n }\n let suitesHeight = 0\n const suites = document.getElementsByClassName('suite-runner')[0]\n if (suites) {\n suitesHeight = suites.offsetHeight\n }\n let logMessages = document.getElementById('script-log-messages')\n if (logMessages) {\n logMessages.style.height = `${h - editorHeight - suitesHeight}px`\n }\n },\n scriptDisconnect() {\n if (this.subscription) {\n this.subscription.unsubscribe()\n this.subscription = null\n }\n this.receivedEvents.length = 0 // Clear any unprocessed events\n },\n showMetadata() {\n Api.get('/openc3-api/metadata').then((response) => {\n // TODO: This is how Calendar creates new metadata items via makeMetadataEvent\n this.inputMetadata.events = response.data.map((event) => {\n return {\n name: 'Metadata',\n start: new Date(event.start * 1000),\n end: new Date(event.start * 1000),\n color: event.color,\n type: event.type,\n timed: true,\n metadata: event,\n }\n })\n this.inputMetadata.show = true\n })\n },\n messageSortOrder(order) {\n // See ScriptLogMessages for these strings\n if (order === 'Newest on Top' && this.messagesNewestOnTop === false) {\n this.messagesNewestOnTop = true\n this.messages.reverse()\n } else if (\n order === 'Newest on Bottom' &&\n this.messagesNewestOnTop === true\n ) {\n this.messagesNewestOnTop = false\n this.messages.reverse()\n }\n },\n // This only gets called when the user changes the filename dropdown\n // Or when a user hits Go\n fileNameChanged(filename) {\n // Split off the '*' which indicates modified\n filename = filename.split('*')[0]\n this.editor.setValue(this.files[filename].content)\n this.restoreBreakpoints(filename)\n this.editor.clearSelection()\n this.removeAllMarkers()\n this.editor.session.addMarker(\n new this.Range(\n this.files[filename].lineNo - 1,\n 0,\n this.files[filename].lineNo - 1,\n 1,\n ),\n `${this.state}Marker`,\n 'fullLine',\n )\n this.editor.gotoLine(this.files[filename].lineNo)\n },\n tryLoadRunningScript: function (id) {\n return Api.get(`/script-api/running-script/${id}`).then((response) => {\n if (response.data) {\n let state = response.data.state\n if (\n state !== 'completed' &&\n state !== 'completed_errors' &&\n state !== 'stopped' &&\n state !== 'crashed' &&\n state !== 'killed'\n ) {\n this.filename = response.data.filename\n this.tryLoadSuites(response)\n this.initScriptStart()\n this.scriptStart(id)\n } else {\n this.$notify.caution({\n title: `Script ${id} has already completed`,\n body: 'Check the Completed Scripts below ...',\n })\n this.scriptComplete()\n this.showScripts = true\n }\n } else {\n this.$notify.caution({\n title: `Running Script ${id} not found`,\n body: 'Check the Completed Scripts below ...',\n })\n this.scriptComplete()\n this.showScripts = true\n }\n })\n },\n tryLoadSuites: function (response) {\n if (response.data.suite_runner) {\n this.startOrGoDisabled = true\n this.suiteRunner = true\n this.suiteMap = JSON.parse(response.data.suite_runner)\n }\n this.doResize()\n },\n showExecuteSelectionMenu: function ($event) {\n this.menuX = $event.pageX\n this.menuY = $event.pageY\n this.executeSelectionMenu = true\n },\n runFromCursor: function () {\n const start_row = this.editor.getCursorPosition().row + 1\n if (!this.scriptId) {\n this.start(null, null, start_row)\n } else {\n Api.post(\n `/script-api/running-script/${this.scriptId}/executewhilepaused`,\n {\n data: {\n args: [this.filenameSelect, start_row],\n },\n },\n )\n }\n },\n executeSelection: function () {\n const range = this.editor.getSelectionRange()\n let start_row = range.start.row + 1\n let end_row = range.end.row + 1\n if (range.end.column === 0) {\n end_row -= 1\n }\n if (!this.scriptId) {\n this.start(null, null, start_row, end_row)\n } else {\n Api.post(\n `/script-api/running-script/${this.scriptId}/executewhilepaused`,\n {\n data: {\n args: [this.filenameSelect, start_row, end_row],\n },\n },\n )\n }\n },\n clearBreakpoints: function () {\n this.editor.session.clearBreakpoints()\n },\n toggleBreakpoint: function ($event) {\n // Don't allow setting breakpoints while running\n if (!this.scriptId) {\n const row = $event.getDocumentPosition().row\n if ($event.editor.session.getBreakpoints(row, 0)[row]) {\n $event.editor.session.clearBreakpoint(row)\n } else {\n $event.editor.session.setBreakpoint(row)\n }\n }\n },\n updateBreakpoints: function ($event, session) {\n if ($event.lines.length <= 1) {\n return\n }\n const rowsToUpdate = this.getBreakpointRows(session).filter(\n (row) =>\n ($event.start.column === 0 && row === $event.start.row) ||\n row > $event.start.row,\n )\n let rowsToDelete = []\n let offset = 0\n switch ($event.action) {\n case 'insert':\n offset = $event.lines.length - 1\n rowsToUpdate.reverse() // shift the lower ones down out of the way first\n break\n case 'remove':\n offset = -$event.lines.length + 1\n rowsToDelete = [...Array($event.lines.length).keys()].map(\n (row) => row + $event.start.row,\n )\n break\n }\n rowsToUpdate.forEach((row) => {\n session.clearBreakpoint(row)\n if (!rowsToDelete.includes(row)) {\n session.setBreakpoint(row + offset)\n }\n })\n },\n getBreakpointRows: function (session = this.editor.session) {\n return session\n .getBreakpoints()\n .map((breakpoint, row) => breakpoint && row) // [empty, 'ace_breakpoint', 'ace_breakpoint', empty] -> [empty, 1, 2, empty]\n .filter(Number.isInteger) // [empty, 1, 2, empty] -> [1, 2]\n },\n restoreBreakpoints: function (filename) {\n this.clearBreakpoints()\n this.breakpoints[filename]?.forEach((breakpoint) => {\n this.editor.session.setBreakpoint(breakpoint)\n })\n },\n deleteAllBreakpoints: function () {\n this.$dialog\n .confirm('Permanently delete all breakpoints for ALL scripts?', {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.delete('/script-api/breakpoints/delete/all')\n })\n .then((response) => {\n this.clearBreakpoints()\n })\n },\n suiteRunnerButton(event) {\n if (this.startOrGoButton === START) {\n this.start(event, 'suiteRunner')\n } else {\n this.go(event, 'suiteRunner')\n }\n },\n async keydown(event) {\n // Don't ever save if running or readonly\n if (this.scriptId || this.editor.getReadOnly() === true) {\n return\n }\n // NOTE: Chrome does not allow overriding Ctrl-N, Ctrl-Shift-N, Ctrl-T, Ctrl-Shift-T, Ctrl-W\n // NOTE: metaKey == Command on Mac\n if (\n (event.metaKey || event.ctrlKey) &&\n event.keyCode === 'S'.charCodeAt(0)\n ) {\n if (event.shiftKey) {\n event.preventDefault()\n this.saveAs()\n } else {\n event.preventDefault()\n await this.saveFile()\n }\n }\n },\n onChange(event) {\n // Don't track changes when we're running or read-only (locked)\n if (this.scriptId || this.editor.getReadOnly() === true) {\n return\n }\n if (this.editor.session.getUndoManager().canUndo()) {\n this.fileModified = '*'\n } else {\n this.fileModified = ''\n }\n },\n checkMnemonics: function () {\n let filename = this.filename\n if (this.filename !== NEW_FILENAME) {\n // Check if the extension is not .rb or .py\n if (!(filename.endsWith('.rb') || filename.endsWith('.py'))) {\n Api.post(`/script-api/scripts/${this.filename}/mnemonics`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n let alertText = ''\n alertText += `<strong>${response.data.title}</strong><br/><br/>`\n alertText += JSON.parse(response.data.description)\n this.$dialog.alert(alertText.trim(), { html: true })\n return\n })\n }\n }\n this.mnemonicChecker\n .checkText(this.editor.getValue())\n .then(({ skipped, problems }) => {\n let alertText = ''\n if (problems.length) {\n const problemText = problems\n .map((problem) => `${problem.lineNumber}: ${problem.error}`)\n .join('<br/>')\n alertText += `<strong>The following lines have problems:</strong><br/>${problemText}<br/><br/>`\n }\n if (skipped.length) {\n alertText +=\n '<strong>Mnemonics with string interpolation were not checked.</strong>'\n }\n if (alertText === '') {\n alertText = '<strong>Everything looks good!</strong>'\n }\n this.$dialog.alert(alertText.trim(), { html: true })\n })\n },\n initScriptStart() {\n this.disableSuiteButtons = true\n this.startOrGoDisabled = true\n this.envDisabled = true\n this.pauseOrRetryDisabled = true\n this.stopDisabled = true\n this.state = 'Connecting...'\n this.startOrGoButton = GO\n this.editor.setReadOnly(true)\n },\n scriptStart(id) {\n this.$emit('script-id', id)\n this.scriptId = id\n this.cable\n .createSubscription(\n 'RunningScriptChannel',\n window.openc3Scope,\n {\n received: (data) => this.received(data),\n },\n {\n id: this.scriptId,\n },\n )\n .then((subscription) => {\n this.subscription = subscription\n })\n },\n async scriptComplete() {\n // Ensure stopped, if the script has an error we don't get the server stopped message\n this.state = 'stopped'\n this.fatal = false\n this.scriptId = null // No current scriptId\n sessionStorage.removeItem('script_runner__script_id')\n this.currentFilename = null // No current file running\n this.files = {} // Clear the file cache\n // Make sure we process no more events\n if (this.subscription) {\n await this.subscription.unsubscribe()\n this.subscription = null\n }\n this.receivedEvents.length = 0 // Clear any unprocessed events\n\n await this.reloadFile() // Make sure the right file is shown\n // We may have changed the contents (if there were sub-scripts)\n // so don't let the undo manager think this is a change\n this.editor.session.getUndoManager().reset()\n if (this.readOnlyUser == false) {\n this.editor.setReadOnly(false)\n }\n\n // Lastly enable the buttons so another script can start\n this.disableSuiteButtons = false\n this.startOrGoButton = START\n this.pauseOrRetryButton = PAUSE\n // Disable start if suiteRunner\n this.startOrGoDisabled = this.suiteRunner\n this.envDisabled = false\n this.pauseOrRetryDisabled = true\n this.stopDisabled = true\n },\n environmentHandler: function (event) {\n this.scriptEnvironment.env = event\n },\n startHandler: function () {\n this.start()\n },\n async start(\n event = null,\n suiteRunner = null,\n line_no = null,\n end_line_no = null,\n ) {\n // Initialize variables and disable buttons before actually posting.\n // This prevents delays in the backend from delaying frontend changes\n // like disabling start which could allow users to click start twice.\n this.initScriptStart()\n await this.saveFile('start')\n this.saveAllowed = false\n let filename = this.filename\n if (this.filename === NEW_FILENAME) {\n // NEW_FILENAME so use tempFilename created by saveFile()\n filename = this.tempFilename\n }\n let url = `/script-api/scripts/${filename}/run`\n if (this.showDisconnect) {\n url += '/disconnect'\n }\n let env = this.scriptEnvironment.env\n if (this.enableStackTraces) {\n env = env.concat({\n key: 'OPENC3_FULL_BACKTRACE',\n value: '1',\n })\n }\n let data = {\n environment: env,\n }\n if (suiteRunner) {\n // TODO 7.0: Should suiteRunner be snake case?\n data['suiteRunner'] = event\n }\n if (line_no !== null) {\n data['line_no'] = line_no\n }\n if (end_line_no !== null) {\n data['end_line_no'] = end_line_no\n }\n Api.post(url, { data })\n .then((response) => {\n this.scriptStart(response.data)\n })\n .catch((error) => {\n this.scriptComplete()\n })\n },\n go() {\n // Ensure we're on the correct filename when we hit go\n // They may have changed it using the drop down\n this.filenameSelect = this.currentFilename\n this.fileNameChanged(this.currentFilename)\n Api.post(`/script-api/running-script/${this.scriptId}/go`)\n },\n pauseOrRetry() {\n if (this.pauseOrRetryButton === PAUSE) {\n Api.post(`/script-api/running-script/${this.scriptId}/pause`)\n } else {\n this.pauseOrRetryButton = PAUSE\n Api.post(`/script-api/running-script/${this.scriptId}/retry`)\n }\n },\n stop() {\n // We previously encountered a fatal error so remove the marker\n // and cleanup by calling scriptComplete() because the script\n // is already stopped in the backend\n if (this.fatal) {\n this.removeAllMarkers()\n this.scriptComplete()\n } else {\n Api.post(`/script-api/running-script/${this.scriptId}/stop`)\n }\n },\n step() {\n Api.post(`/script-api/running-script/${this.scriptId}/step`)\n },\n // This is called by processLine no matter the current state\n handleWaiting() {\n // First check if we're not waiting and if so clear the interval\n if (this.state !== 'waiting' && this.state !== 'paused') {\n this.clearWaiting()\n } else if (this.waitingInterval !== null) {\n // If we're waiting and the interval is active then nothing to do\n return\n }\n this.waitingStart = Date.now()\n // Create an interval to count every second\n this.waitingInterval = setInterval(() => {\n this.waitingTime = Math.round((Date.now() - this.waitingStart) / 1000)\n }, 1000)\n },\n clearWaiting() {\n this.waitingTime = 0\n clearInterval(this.waitingInterval)\n this.waitingInterval = null\n },\n processLine(data) {\n if (data.filename && data.filename !== this.currentFilename) {\n if (!this.files[data.filename]) {\n // We don't have the contents of the running file (probably because connected to running script)\n // Set the contents initially to an empty string so we don't start slamming the API\n this.files[data.filename] = { content: '', lineNo: 0 }\n\n // Request the script we need\n Api.get(`/script-api/scripts/${data.filename}`)\n .then((response) => {\n // Success - Save the script text and mark the currentFilename as null\n // so it will get loaded in on the next line executed\n this.files[data.filename] = {\n content: response.data.contents,\n lineNo: 0,\n }\n this.breakpoints[data.filename] = response.data.breakpoints\n this.restoreBreakpoints(data.filename)\n this.currentFilename = null\n })\n .catch((err) => {\n // Error - Restore the file contents to null so we'll try the API again on the next line\n this.files[data.filename] = null\n })\n } else {\n this.currentFilename = data.filename\n this.editor.setValue(this.files[data.filename].content)\n this.restoreBreakpoints(data.filename)\n this.editor.clearSelection()\n }\n }\n this.state = data.state\n const markers = this.editor.session.getMarkers()\n switch (this.state) {\n case 'running':\n this.handleWaiting()\n this.startOrGoDisabled = false\n this.pauseOrRetryDisabled = false\n this.stopDisabled = false\n this.pauseOrRetryButton = PAUSE\n\n this.removeAllMarkers()\n this.editor.session.addMarker(\n new this.Range(data.line_no - 1, 0, data.line_no - 1, 1),\n 'runningMarker',\n 'fullLine',\n )\n this.editor.gotoLine(data.line_no)\n this.files[data.filename].lineNo = data.line_no\n break\n case 'crashed':\n this.fatal = true\n // Deliberate fall through (no break)\n case 'error':\n this.pauseOrRetryButton = RETRY\n // Deliberate fall through (no break)\n case 'breakpoint':\n case 'waiting':\n case 'paused':\n this.handleWaiting()\n if (this.state == 'fatal') {\n this.startOrGoDisabled = true\n this.pauseOrRetryDisabled = true\n } else {\n this.startOrGoDisabled = false\n this.pauseOrRetryDisabled = false\n }\n this.stopDisabled = false\n let existing = Object.keys(markers).filter(\n (key) => markers[key].clazz === `${this.state}Marker`,\n )\n if (existing.length === 0) {\n this.removeAllMarkers()\n let line = data.line_no > 0 ? data.line_no : 1\n this.editor.session.addMarker(\n new this.Range(line - 1, 0, line - 1, 1),\n `${this.state}Marker`,\n 'fullLine',\n )\n this.editor.gotoLine(line)\n // Fatal errors don't always have a filename set\n if (data.filename) {\n this.files[data.filename].lineNo = line\n }\n }\n break\n default:\n break\n }\n },\n processReceived() {\n let count = 0\n for (let data of this.receivedEvents) {\n count += 1\n // console.log(data) // Uncomment for debugging\n let index = 0\n switch (data.type) {\n case 'file':\n this.files[data.filename] = { content: data.text, lineNo: 0 }\n this.breakpoints[data.filename] = data.breakpoints\n if (this.currentFilename === data.filename) {\n this.restoreBreakpoints(data.filename)\n }\n break\n case 'line':\n // A further optimization would be to only process the last line of a batch\n // However with some testing this did not seem to make much difference\n // and was preventing the highlighting of the final line of a script because\n // the last line of the final batch was line_number 0 with state stopped\n // and that would never highlight the actual final line\n this.processLine(data)\n break\n case 'output':\n // data.line can consist of multiple lines split by newlines\n // thus we split and only output if the content is not empty\n for (const line of data.line.split('\\n')) {\n if (line) {\n if (this.messagesNewestOnTop) {\n this.messages.unshift({ message: line })\n } else {\n this.messages.push({ message: line })\n }\n }\n }\n while (this.messages.length > this.maxArrayLength) {\n this.messages.pop()\n }\n break\n case 'script':\n this.handleScript(data)\n break\n case 'report':\n this.results.text = data.report\n this.results.show = true\n break\n case 'complete':\n // Don't complete on fatal because we just sit there on the fatal line\n if (!this.fatal) {\n this.removeAllMarkers()\n this.scriptComplete()\n }\n break\n case 'step':\n this.showDebug = true\n break\n case 'screen':\n let found = false\n let definition = {}\n for (screen of this.screens) {\n if (\n screen.target == data.target_name &&\n screen.screen == data.screen_name\n ) {\n definition = screen\n found = true\n break\n }\n index += 1\n }\n definition.target = data.target_name\n definition.screen = data.screen_name\n definition.definition = data.definition\n if (data.x) {\n definition.left = data.x\n } else {\n definition.left = 0\n }\n if (data.y) {\n definition.top = data.y\n } else {\n definition.top = 0\n }\n definition.count = this.updateCounter++\n if (!found) {\n definition.id = this.idCounter++\n this.screens[this.screens.length] = definition\n } else {\n this.screens[index] = definition\n }\n break\n case 'clearscreen':\n for (screen of this.screens) {\n if (\n screen.target == data.target_name &&\n screen.screen == data.screen_name\n ) {\n this.screens.splice(index, 1)\n break\n }\n index += 1\n }\n break\n case 'clearallscreens':\n this.screens = []\n break\n case 'downloadfile':\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = window.location.origin + data.url\n link.setAttribute('download', data.filename)\n link.click()\n break\n default:\n // console.log('Unexpected ActionCable message')\n // console.log(data)\n break\n }\n }\n\n // Remove all the events we processed\n this.receivedEvents.splice(0, count)\n },\n received(data) {\n this.cable.recordPing()\n this.receivedEvents.push(data)\n },\n promptDialogCallback(value) {\n this.prompt.show = false\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: this.prompt.method,\n answer: value,\n prompt_id: this.activePromptId,\n multiple: this.prompt.multiple,\n },\n })\n },\n handleScript(data) {\n if (data.prompt_complete) {\n this.activePromptId = ''\n this.prompt.show = false\n this.ask.show = false\n return\n }\n this.activePromptId = data.prompt_id\n this.prompt.method = data.method // Set it here since all prompts use this\n this.prompt.layout = 'horizontal' // Reset the layout since most are horizontal\n this.prompt.title = 'Prompt'\n this.prompt.subtitle = ''\n this.prompt.details = ''\n this.prompt.buttons = []\n this.prompt.multiple = null\n switch (data.method) {\n case 'ask':\n case 'ask_string':\n // Reset values since this dialog can be reused\n this.ask.default = null\n this.ask.answerRequired = true\n this.ask.password = false\n this.ask.question = data.args[0]\n // If the second parameter is not true or false it indicates a default value\n if (data.args[1] && data.args[1] !== true && data.args[1] !== false) {\n this.ask.default = data.args[1].toString()\n } else if (data.args[1] === true) {\n // If the second parameter is true it means no value is required to be entered\n this.ask.answerRequired = false\n }\n // The third parameter indicates a password textfield\n if (data.args[2] === true) {\n this.ask.password = true\n }\n this.ask.callback = (value) => {\n this.ask.show = false // Close the dialog\n if (this.ask.password) {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n password: value, // Using password as a key automatically filters it from rails logs\n prompt_id: this.activePromptId,\n },\n })\n } else {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n answer: value,\n prompt_id: this.activePromptId,\n },\n })\n }\n }\n this.ask.show = true // Display the dialog\n break\n case 'prompt_for_hazardous':\n this.prompt.title = 'Hazardous Command'\n this.prompt.message = `Warning: Command ${data.args[0]} ${data.args[1]} is Hazardous. `\n if (data.args[2]) {\n this.prompt.message += data.args[2] + ' '\n }\n this.prompt.message += 'Send?'\n this.prompt.buttons = [{ text: 'Send', value: 'Send' }]\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'prompt_for_critical_cmd':\n this.criticalCmdUuid = data.args[0]\n this.criticalCmdString = data.args[5]\n this.criticalCmdUser = data.args[1]\n this.displayCriticalCmd = true\n break\n case 'prompt':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n this.prompt.message = data.args[0]\n this.prompt.buttons = [{ text: 'Ok', value: 'Ok' }]\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'combo_box':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n if (data.kwargs && data.kwargs.multiple) {\n this.prompt.multiple = true\n }\n this.prompt.message = data.args[0]\n data.args.slice(1).forEach((v) => {\n this.prompt.buttons.push({ title: v, value: v })\n })\n this.prompt.layout = 'combo'\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'message_box':\n case 'vertical_message_box':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n this.prompt.message = data.args[0]\n data.args.slice(1).forEach((v) => {\n this.prompt.buttons.push({ text: v, value: v })\n })\n if (data.method.includes('vertical')) {\n this.prompt.layout = 'vertical'\n }\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'backtrace':\n this.information.title = 'Call Stack'\n this.information.text = data.args\n this.information.show = true\n this.information.width = '600'\n break\n case 'metadata_input':\n this.inputMetadata.callback = (value) => {\n this.inputMetadata.show = false\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n answer: value,\n prompt_id: this.activePromptId,\n },\n })\n }\n this.showMetadata()\n break\n // This is called continuously by the backend\n case 'open_file_dialog':\n case 'open_files_dialog':\n this.file.title = data.args[0]\n this.file.message = data.args[1]\n if (data.kwargs && data.kwargs.filter) {\n this.file.filter = data.kwargs.filter\n }\n if (data.method == 'open_files_dialog') {\n this.file.multiple = true\n }\n this.file.show = true\n break\n default:\n // console.log(\n // 'Unknown script method:' + data.method + ' with args:' + data.args\n // )\n break\n }\n },\n async fileDialogCallback(files) {\n // Set fileNames to 'Cancel' in case they cancelled\n // otherwise we will populate it with the file names they selected\n let fileNames = 'Cancel'\n // Record all the API request promises so we can ensure they complete\n let promises = []\n if (files != 'Cancel') {\n fileNames = []\n files.forEach((file) => {\n fileNames.push(file.name)\n promises.push(\n Api.get(\n `/openc3-api/storage/upload/${encodeURIComponent(\n `${window.openc3Scope}/tmp/${file.name}`,\n )}?bucket=OPENC3_CONFIG_BUCKET`,\n ).then((response) => {\n // This pushes the file into storage by using the fields in the presignedRequest\n // See storage_controller.rb get_upload_presigned_request()\n promises.push(\n axios({\n ...response.data,\n data: file,\n }),\n )\n }),\n )\n })\n }\n // We have to wait for all the upload API requests to finish before notifying the prompt\n Promise.all(promises).then((responses) => {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: this.file.multiple\n ? 'open_files_dialog'\n : 'open_file_dialog',\n answer: fileNames,\n prompt_id: this.activePromptId,\n },\n }).then((response) => {\n this.file.show = false // Close the dialog\n })\n })\n },\n setError(event) {\n this.alertType = 'error'\n this.alertText = `Error: ${event}`\n this.showAlert = true\n },\n // ScriptRunner File menu actions\n newFile() {\n this.unlockFile()\n this.filename = NEW_FILENAME\n this.currentFilename = null\n this.tempFilename = null\n this.files = {} // Clear the cached file list\n this.editor.session.setValue('')\n this.saveAllowed = true\n this.fileModified = ''\n this.suiteRunner = false\n this.startOrGoDisabled = false\n this.envDisabled = false\n if (!this.inline) {\n this.$router\n .replace({\n name: 'ScriptRunner',\n })\n // catch the error in case we route to where we already are\n .catch((err) => {})\n document.title = 'Script Runner'\n }\n this.doResize()\n },\n async newRubyTestSuite() {\n this.newFile()\n this.editor.session.setValue(`require 'openc3/script/suite.rb'\n\n# Group class name should indicate what the scripts are testing\nclass Power < OpenC3::Group\n # Methods beginning with script_ are added to Script dropdown\n def script_power_on\n # Using OpenC3::Group.puts adds the output to the Test Report\n # This can be useful for requirements verification, QA notes, etc\n OpenC3::Group.puts \"Verifying requirement SR-1\"\n configure()\n end\n\n # Other methods are not added to Script dropdown\n def configure\n end\n\n def setup\n # Run when Group Setup button is pressed\n # Run before all scripts when Group Start is pressed\n end\n\n def teardown\n # Run when Group Teardown button is pressed\n # Run after all scripts when Group Start is pressed\n end\nend\n\nclass TestSuite < OpenC3::Suite\n def initialize\n add_group('Power')\n end\n def setup\n # Run when Suite Setup button is pressed\n # Run before all groups when Suite Start is pressed\n end\n def teardown\n # Run when Suite Teardown button is pressed\n # Run after all groups when Suite Start is pressed\n end\nend\n`)\n await this.saveFile('auto')\n },\n async newPythonTestSuite() {\n this.newFile()\n this.editor.session.setValue(`from openc3.script.suite import Suite, Group\n\n# Group class name should indicate what the scripts are testing\nclass Power(Group):\n # Methods beginning with script_ are added to Script dropdown\n def script_power_on(self):\n # Using Group.print adds the output to the Test Report\n # This can be useful for requirements verification, QA notes, etc\n Group.print(\"Verifying requirement SR-1\")\n self.configure()\n\n # Other methods are not added to Script dropdown\n def configure(self):\n pass\n\n def setup(self):\n # Run when Group Setup button is pressed\n # Run before all scripts when Group Start is pressed\n pass\n\n def teardown(self):\n # Run when Group Teardown button is pressed\n # Run after all scripts when Group Start is pressed\n pass\n\nclass TestSuite(Suite):\n def __init__(self):\n self.add_group(Power)\n\n def setup(self):\n # Run when Suite Setup button is pressed\n # Run before all groups when Suite Start is pressed\n pass\n\n def teardown(self):\n # Run when Suite Teardown button is pressed\n # Run after all groups when Suite Start is pressed\n pass\n`)\n await this.saveFile('auto')\n },\n addToRecent(filename) {\n // See if this filename is already in the recent ... if so remove it\n let index = this.recent.findIndex((i) => i.label === filename)\n if (index !== -1) {\n this.recent.splice(index, 1)\n }\n // Push this filename to the front of the recently used\n this.recent.unshift({\n label: filename,\n icon: fileIcon(filename),\n command: async (event) => {\n this.filename = event.label\n await this.reloadFile()\n },\n })\n if (this.recent.length > 8) {\n this.recent.pop()\n }\n // This only stringifies the label and icon ... not the command\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n }\n },\n removeFromRecent(filename) {\n this.recent = this.recent.filter((entry) => entry.label !== filename)\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n if (localStorage['script_runner__filename'] === filename) {\n localStorage.removeItem('script_runner__filename')\n }\n }\n },\n openFile() {\n this.fileOpen = true\n },\n async reloadFile(showError = true) {\n // Disable start while we're loading the file so we don't hit Start\n // before it's fully loaded and then save over it with a blank file\n this.saveAllowed = false\n this.startOrGoDisabled = true\n await Api.get(`/script-api/scripts/${this.filename}`, {\n headers: {\n Accept: 'application/json',\n 'Ignore-Errors': '404',\n },\n })\n .then((response) => {\n const file = {\n name: this.filename,\n contents: response.data.contents,\n }\n if (response.data.suites) {\n file['suites'] = JSON.parse(response.data.suites)\n }\n if (response.data.error) {\n file['error'] = response.data.error\n }\n if (response.data.success) {\n file['success'] = response.data.success\n }\n const locked = response.data.locked\n const breakpoints = response.data.breakpoints\n this.setFile({ file, locked, breakpoints }, true)\n this.saveAllowed = true\n })\n .catch((error) => {\n if (showError === true) {\n this.$notify.caution({\n title: 'File Open Error',\n body: `Failed to open ${this.filename} due to ${error}`,\n })\n }\n this.removeFromRecent(this.filename)\n this.newFile() // Reset the GUI\n })\n },\n // Called by the FileOpenDialog to set the file contents\n setFile({ file, locked, breakpoints }, local = false) {\n this.files = {} // Clear the cached file list\n // Split off the ' *' which indicates a file is modified on the server\n let newFilename = file.name.split('*')[0]\n if (local === false) {\n // We only need to unlock if the file is different\n if (this.filename !== newFilename) {\n this.unlockFile() // first unlock what was just being edited\n this.lockedBy = locked\n }\n }\n this.filename = newFilename\n if (!this.inline) {\n // Update the URL with the filename\n this.$router\n .replace({\n name: 'ScriptRunner',\n query: {\n file: this.filename,\n },\n })\n // catch the error in case we route to where we already are\n .catch((err) => {})\n\n // Update the browser tab with the name of the file first\n // so squished tabs are still useful, followed by the rest\n // of the path for context. Target name will be first which\n // is probably the most useful part of the path.\n let parts = this.filename.split('/')\n document.title = `${parts.pop()} (${parts.join('/')})`\n }\n\n if (this.filename.split('.').pop() === 'py') {\n this.editor.session.setMode(this.pythonMode)\n } else {\n this.editor.session.setMode(this.rubyMode)\n }\n this.currentFilename = null\n this.editor.session.setValue(file.contents)\n this.breakpoints[this.filename] = breakpoints\n this.restoreBreakpoints(this.filename)\n this.fileModified = ''\n this.envDisabled = false\n this.addToRecent(this.filename)\n\n if (file.suites) {\n this.suiteRunner = true\n this.suiteMap = file.suites\n this.startOrGoDisabled = true\n } else {\n this.suiteRunner = false\n this.startOrGoDisabled = false\n }\n if (file.error) {\n this.suiteError = file.error\n this.showSuiteError = true\n }\n // Disable suite buttons if we didn't successfully parse the suite\n this.disableSuiteButtons = file.success == false\n this.doResize()\n },\n clearTemp() {\n this.recent = this.recent.filter(\n (entry) => !entry.label.includes('__TEMP__'),\n )\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n }\n },\n detectLanguage() {\n let rubyRegex1 = new RegExp('^\\\\s*(require|load|puts) ')\n let pythonRegex1 = new RegExp('^\\\\s*(import|from) ')\n let rubyRegex2 = new RegExp('^\\\\s*end\\\\s*$')\n let pythonRegex2 = new RegExp(\n '^\\\\s*(if|def|while|else|elif|class).*:\\\\s*$',\n )\n let pythonRegex3 = new RegExp('\\\\(f\"') // f strings\n let text = this.editor.getValue()\n let lines = text.split('\\n')\n for (let line of lines) {\n if (line.match(rubyRegex1)) {\n return 'ruby'\n }\n if (line.match(pythonRegex1)) {\n return 'python'\n }\n if (line.match(rubyRegex2)) {\n return 'ruby'\n }\n if (line.match(pythonRegex2)) {\n return 'python'\n }\n if (line.match(pythonRegex3)) {\n return 'python'\n }\n }\n return 'unknown' // otherwise unknown\n },\n // saveFile takes a type to indicate if it was called by the Menu\n // or automatically by 'Start' (to ensure a consistent backend file) or autoSave\n async saveFile(type = 'menu') {\n if (this.readOnlyUser) {\n return\n }\n if (this.saveAllowed) {\n const breakpoints = this.getBreakpointRows()\n if (this.filename === NEW_FILENAME) {\n if (type === 'menu') {\n // Menu driven saves on a new file should prompt SaveAs\n this.saveAs()\n return\n } else {\n // start or auto with NEW_FILENAME\n if (this.tempFilename === null) {\n let language = this.detectLanguage()\n if (\n language === 'ruby' ||\n (type !== 'auto' && language == 'unknown')\n ) {\n this.tempFilename =\n TEMP_FOLDER +\n '/' +\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss_SSS') +\n '_temp.rb'\n } else if (language === 'python') {\n this.tempFilename =\n TEMP_FOLDER +\n '/' +\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss_SSS') +\n '_temp.py'\n } else {\n // No autosave for unknown language\n return\n }\n this.filename = this.tempFilename\n this.addToRecent(this.filename)\n }\n }\n }\n this.showSave = true\n await Api.post(`/script-api/scripts/${this.filename}`, {\n data: {\n text: this.editor.getValue(), // Pass in the raw file text\n breakpoints,\n },\n })\n .then((response) => {\n if (response.status == 200) {\n if (response.data.suites) {\n this.startOrGoDisabled = true\n this.suiteRunner = true\n this.suiteMap = JSON.parse(response.data.suites)\n } else {\n this.startOrGoDisabled = false\n this.suiteRunner = false\n this.suiteMap = {}\n }\n if (response.data.error) {\n this.suiteError = response.data.error\n this.showSuiteError = true\n }\n this.fileModified = ''\n setTimeout(() => {\n this.showSave = false\n }, 2000)\n } else {\n this.showSave = false\n this.alertType = 'error'\n this.alertText = `Error saving file. Code: ${response.status} Text: ${response.statusText}`\n this.showAlert = true\n }\n this.lockFile() // Ensure this file is locked for editing\n this.doResize()\n })\n .catch(({ response }) => {\n this.showSave = false\n // 422 error means we couldn't parse the script file into Suites\n // response.data.suites holds the parse result\n if (response.status == 422) {\n this.alertType = 'error'\n this.alertText = response.data.suites\n } else {\n this.alertType = 'error'\n this.alertText = `Error saving file. Code: ${response.status} Text: ${response.statusText}`\n }\n this.showAlert = true\n })\n } else {\n this.setError('Attempt to save file when not allowed')\n }\n },\n saveAs() {\n this.showSaveAs = true\n },\n async saveAsFilename(filename) {\n this.filename = filename.split('*')[0]\n this.currentFilename = null\n if (this.tempFilename) {\n Api.post(`/script-api/scripts/${this.tempFilename}/delete`)\n this.tempFilename = null\n }\n await this.saveFile('menu')\n },\n delete() {\n let filename = this.filename\n if (this.tempFilename) {\n filename = this.tempFilename\n }\n this.$dialog\n .confirm(`Permanently delete file: ${filename}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.post(`/script-api/scripts/${filename}/delete`, {\n data: {},\n })\n })\n .then((response) => {\n this.removeFromRecent(filename)\n this.newFile()\n })\n .catch((error) => {\n if (error !== true) {\n const alertObject = {\n text: `Failed Multi-Delete. ${error}`,\n type: 'error',\n }\n this.$emit('alert', alertObject)\n }\n })\n },\n download() {\n const blob = new Blob([this.editor.getValue()], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', this.filename)\n link.click()\n },\n // ScriptRunner Script menu actions\n syntaxCheck() {\n Api.post(`/script-api/scripts/${this.filename}/syntax`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n this.information.title = response.data.title\n this.information.text = JSON.parse(response.data.description)\n this.information.show = true\n this.information.width = '600'\n })\n },\n showInstrumented() {\n Api.post(`/script-api/scripts/${this.filename}/instrumented`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n this.information.title = response.data.title\n this.information.text = JSON.parse(response.data.description)\n this.information.show = true\n this.information.width = '90vw'\n })\n },\n showCallStack() {\n Api.post(`/script-api/running-script/${this.scriptId}/backtrace`)\n },\n toggleDebug() {\n this.showDebug = !this.showDebug\n if (this.showDebug) {\n this.$nextTick(() => {\n this.$refs.debug.focus()\n })\n }\n },\n toggleDisconnect() {\n this.showDisconnect = !this.showDisconnect\n },\n debugKeydown(event) {\n if (event.key === 'Escape') {\n this.debug = ''\n this.debugHistoryIndex = this.debugHistory.length\n } else if (event.key === 'Enter') {\n this.debugHistory.push(this.debug)\n this.debugHistoryIndex = this.debugHistory.length\n // Post the code to /debug, output is processed by receive()\n Api.post(`/script-api/running-script/${this.scriptId}/debug`, {\n data: {\n args: this.debug,\n },\n })\n this.debug = ''\n } else if (event.key === 'ArrowUp') {\n this.debugHistoryIndex -= 1\n if (this.debugHistoryIndex < 0) {\n this.debugHistoryIndex = this.debugHistory.length - 1\n }\n this.debug = this.debugHistory[this.debugHistoryIndex]\n // Prevent the cursor/caret from moving to the front\n event.preventDefault()\n } else if (event.key === 'ArrowDown') {\n this.debugHistoryIndex += 1\n if (this.debugHistoryIndex >= this.debugHistory.length) {\n this.debugHistoryIndex = 0\n }\n this.debug = this.debugHistory[this.debugHistoryIndex]\n }\n },\n removeAllMarkers: function () {\n const allMarkers = this.editor.session.getMarkers()\n Object.keys(allMarkers)\n .filter((key) => allMarkers[key].type === 'fullLine')\n .forEach((marker) => this.editor.session.removeMarker(marker))\n },\n confirmLocalUnlock: function () {\n this.$dialog\n .confirm(\n 'Are you sure you want to unlock this script for editing? If another user is editing this script, your changes might conflict with each other.',\n {\n okText: 'Force Unlock',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.lockedBy = null\n return this.lockFile() // Re-lock it as this user so it's locked for anyone else who opens it\n })\n },\n lockFile: function () {\n if (!this.readOnlyUser) {\n return Api.post(`/script-api/scripts/${this.filename}/lock`)\n }\n },\n unlockFile: function () {\n if (\n this.filename !== NEW_FILENAME &&\n !this.readOnly &&\n !this.readOnlyUser\n ) {\n Api.post(`/script-api/scripts/${this.filename}/unlock`)\n }\n },\n backToNewScript: async function () {\n // Disconnect from the current script\n this.scriptDisconnect()\n // Clear script-related state\n this.removeAllMarkers()\n await this.scriptComplete()\n // Create a new blank script\n this.newFile()\n },\n screenId(id) {\n return 'scriptRunnerScreen' + id\n },\n closeScreen(id) {\n let index = 0\n for (screen of this.screens) {\n if (screen.id == id) {\n this.screens.splice(index, 1)\n break\n }\n index += 1\n }\n },\n },\n}\n</script>\n\n<style scoped>\n#sr-controls {\n padding: 0px;\n}\n\n.editor {\n height: 100%;\n width: 100%;\n position: relative;\n font-size: 16px;\n}\n\n.script-state :deep(.v-field) {\n background-color: var(--color-background-base-default);\n}\n\n.script-state :deep(input) {\n text-transform: capitalize;\n}\n</style>\n<style>\n.splitpanes {\n height: 100%;\n}\n\n.splitpanes--horizontal > .splitpanes__splitter {\n min-height: 4px;\n position: relative;\n top: 4px;\n background-color: grey;\n width: 5%;\n margin: auto;\n cursor: row-resize;\n}\n\n.runningMarker {\n position: absolute;\n background: rgba(0, 255, 0, 0.5);\n z-index: 20;\n}\n\n.waitingMarker {\n position: absolute;\n background: rgba(0, 155, 0, 1);\n z-index: 20;\n}\n\n.breakpointMarker {\n position: absolute;\n border-style: solid;\n border-color: red;\n background: rgba(0, 255, 0, 0.5);\n z-index: 20;\n}\n\n.pausedMarker {\n position: absolute;\n background: rgba(0, 140, 255, 0.5);\n z-index: 20;\n}\n\n.errorMarker {\n position: absolute;\n background: rgba(255, 0, 119, 0.5);\n z-index: 20;\n}\n\n.fatalMarker {\n position: absolute;\n background: rgba(255, 0, 0, 0.5);\n z-index: 20;\n}\n\n.saving {\n z-index: 20;\n opacity: 0.35;\n}\n\n.ace_gutter {\n /* Screens have a default z-index of 3 so get below that */\n z-index: 2;\n}\n\n.ace_gutter-cell.ace_breakpoint {\n border-radius: 20px 0px 0px 20px;\n box-shadow: 0px 0px 1px 1px red inset;\n}\n\n.grid {\n position: relative;\n}\n\n.item {\n /* TODO: this non-scoped generic class name conflicts with other things and should be scoped or renamed. */\n position: absolute;\n display: block;\n margin: 5px;\n z-index: 1;\n}\n\n.item-content {\n position: relative;\n cursor: pointer;\n border-radius: 6px;\n}\n\n.apply-top .v-snackbar__wrapper {\n top: var(--classification-height-top);\n}\n</style>\n"],"names":["_sfc_main","OutputDialog","TimeFilters","newTab","OpenC3Api","response","error","offset","Api","scripts","currentTime","script","startTime","durationMs","minutes","seconds","hours","page","itemsPerPage","destination","href","dialog","type","logUrl","filenameParts","basename","link","_createElementBlock","_createVNode","_component_v_card","_component_v_tabs","$data","$event","_component_v_tab","_cache","_component_v_window","_component_v_window_item","_component_v_card_title","_component_v_row","_component_v_spacer","_component_v_btn","$options","_component_v_text_field","_component_v_data_table_server","_withCtx","item","_createTextVNode","_toDisplayString","_createElementVNode","_component_v_icon","$props","_hoisted_2","_hoisted_1","_createBlock","_component_output_dialog","value","newValue","oldValue","message","output","blob","format","err","_component_v_select","_component_v_card_text","_component_v_data_table","_normalizeClass","Pe","D","h","y","u","E","ce","l","k","M","z","e","n","m","x","S","c","f","_","r","P","O","b","t","i","a","s","o","K","I","d","A","U","W","J","$","N","v","p","H","ue","j","Q","V","Z","ee","F","ne","C","ie","te","T","L","ae","le","oe","se","q","B","G","X","re","fe","g","Y","ve","me","ge","w","de","R","pe","he","ze","xe","_component_v_dialog","_component_v_form","_component_v_toolbar","_component_v_card_actions","_component_v_file_input","_openBlock","_Fragment","_renderList","line","index","result","items","layout","_component_v_card_subtitle","_hoisted_5","_hoisted_6","button","_component_v_textarea","EnvironmentChooser","_component_environment_chooser","_ctx","name","newVal","oldVal","event","_component_v_col","_component_v_tooltip","props","_component_v_checkbox","getKeywords","getAutocompleteData","groupBy","array","lambda","groups","key","toMethodCallSyntaxRegex","word","prefix","opening","params","PacketCompleter","dataReadyCallback","expressionsReadyCallback","_editor","session","position","_prefix","callback","matches","lineBeforeCursor","regex","CmdCompleter","TlmCompleter","packetName","itemName","amendedItem","foundPacket","toKeywordRegex","call","interpolatedStringRegex","alternateSyntaxRegex","MnemonicChecker","target","text","linesToCheck","linesToSkip","cmdMatch","found","tlmMatch","matchStr","matchStrLen","mnemonicMatch","usingAlternateSyntax","mnemonicParts","mnemonic","mnemonicParams","param","token","property","problems","problemLines","targetGroups","lineObj","packetGroups","packet","cmdOrTlm","method","packetInfo","RegexAnnotator","editor","pattern","__privateAdd","_id","_pattern","_text","_type","__publicField","__privateGet","_removeAllAnnotations","_shiftAnnotations","row","column","_b","_a","_addAnnotation","_deleteAnnotationsForRow","newAnnotation","annotation","count","__privateSet","SleepAnnotator","keyword","suffix","TEMP_FOLDER","NEW_FILENAME","START","GO","PAUSE","RETRY","FileOpenSaveDialog","Openc3Screen","EnvironmentDialog","Splitpanes","Pane","TopBar","AskDialog","FileDialog","InformationDialog","EventListDialog","OverridesDialog","PromptDialog","ResultsDialog","ScriptEnvironmentDialog","SimpleTextDialog","SuiteRunner","RunningScripts","ScriptLogMessages","CriticalCmdDialog","AceEditorModes","ClassificationBanners","to","from","next","filenames","val","filename","user","roles","role","RubyMode","PythonMode","AceEditorUtils","sleepAnnotator","Cable","editorHeight","suitesHeight","suites","logMessages","order","id","state","start_row","range","end_row","rowsToUpdate","rowsToDelete","breakpoint","alertText","skipped","problemText","problem","data","subscription","suiteRunner","line_no","end_line_no","url","env","markers","definition","files","fileNames","promises","file","axios","responses","fileIcon","entry","showError","locked","breakpoints","local","newFilename","parts","rubyRegex1","pythonRegex1","rubyRegex2","pythonRegex2","pythonRegex3","lines","language","alertObject","allMarkers","marker","_hoisted_3","_hoisted_4","_component_top_bar","_component_v_snackbar","attrs","_mergeProps","def","_component_openc3_screen","_component_suite_runner","_component_v_progress_circular","_hoisted_8","_hoisted_9","_component_v_badge","_hoisted_10","_component_splitpanes","_component_pane","args","_component_v_menu","_component_v_list","_component_v_list_item","_component_v_divider","_hoisted_11","_component_script_log_messages","_hoisted_12","_hoisted_13","_hoisted_14","_component_file_open_save_dialog","_component_environment_dialog","_component_ask_dialog","_component_file_dialog","_component_information_dialog","_component_event_list_dialog","_component_overrides_dialog","_component_prompt_dialog","_component_results_dialog","_component_script_environment_dialog","_component_simple_text_dialog","_component_critical_cmd_dialog","_component_v_bottom_sheet","_component_v_sheet","_component_running_scripts"],"mappings":"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","x_google_ignoreList":[2]}
|
|
1
|
+
{"version":3,"file":"scriptrunner.js","sources":["../../src/tools/scriptrunner/RunningScripts.vue","../../src/tools/scriptrunner/ScriptLogMessages.vue","../../../../node_modules/splitpanes/dist/splitpanes.es.js","../../src/tools/scriptrunner/Dialogs/AskDialog.vue","../../src/tools/scriptrunner/Dialogs/FileDialog.vue","../../src/tools/scriptrunner/Dialogs/InformationDialog.vue","../../src/tools/scriptrunner/Dialogs/OverridesDialog.vue","../../src/tools/scriptrunner/Dialogs/PromptDialog.vue","../../src/tools/scriptrunner/Dialogs/ResultsDialog.vue","../../src/tools/scriptrunner/Dialogs/ScriptEnvironmentDialog.vue","../../src/tools/scriptrunner/SuiteRunner.vue","../../src/tools/scriptrunner/autocomplete/utilities.js","../../src/tools/scriptrunner/autocomplete/packetCompleter.js","../../src/tools/scriptrunner/autocomplete/cmdCompleter.js","../../src/tools/scriptrunner/autocomplete/tlmCompleter.js","../../src/tools/scriptrunner/autocomplete/mnemonicChecker.js","../../src/tools/scriptrunner/annotations/regexAnnotator.js","../../src/tools/scriptrunner/annotations/sleepAnnotator.js","../../src/tools/scriptrunner/ScriptRunner.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2025, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-card flat class=\"tab-card\">\n <v-tabs\n v-model=\"activeTab\"\n bg-color=\"var(--color-background-base-default)\"\n >\n <v-tab value=\"running\">Running Scripts</v-tab>\n <v-tab value=\"completed\">Completed Scripts</v-tab>\n </v-tabs>\n <v-window v-model=\"activeTab\">\n <!-- Running Scripts Tab -->\n <v-window-item value=\"running\">\n <v-card-title>\n <v-row dense>\n <v-spacer />\n <v-btn class=\"mr-3\" color=\"primary\" @click=\"getRunningScripts\"\n >Refresh</v-btn\n >\n <v-text-field\n v-model=\"runningSearch\"\n class=\"pt-0 search\"\n label=\"Search\"\n prepend-inner-icon=\"mdi-magnify\"\n clearable\n variant=\"outlined\"\n density=\"compact\"\n single-line\n hide-details\n data-test=\"running-search\"\n style=\"max-width: 300px\"\n />\n </v-row>\n </v-card-title>\n\n <v-data-table-server\n :headers=\"runningHeaders\"\n :items=\"runningScripts\"\n :items-length=\"runningTotal\"\n :loading=\"runningLoading\"\n :search=\"runningSearch\"\n density=\"compact\"\n data-test=\"running-scripts\"\n :items-per-page=\"runningItemsPerPage\"\n :page=\"runningPage\"\n :items-per-page-options=\"[10, 25, 50]\"\n class=\"script-table\"\n @update:page=\"updateRunningPage\"\n @update:items-per-page=\"updateRunningItemsPerPage\"\n >\n <template #item.name=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n @click=\"showScript(item)\"\n >{{ item.name }}</v-btn\n >\n </template>\n <template #item.connect=\"{ item }\">\n <v-btn color=\"primary\" @click=\"connectScript(item)\">\n <span>Connect</span>\n <v-icon v-show=\"connectInNewTab\" end> mdi-open-in-new </v-icon>\n </v-btn>\n </template>\n <template #item.stop=\"{ item }\">\n <v-btn color=\"primary\" @click=\"deleteScript(item)\">\n <span>Stop</span>\n <v-icon end> mdi-close-circle-outline </v-icon>\n </v-btn>\n </template>\n </v-data-table-server>\n </v-window-item>\n\n <!-- Completed Scripts Tab -->\n <v-window-item value=\"completed\">\n <v-card-title>\n <v-row dense>\n <v-spacer />\n <v-btn class=\"mr-3\" color=\"primary\" @click=\"getCompletedScripts\"\n >Refresh</v-btn\n >\n <v-text-field\n v-model=\"completedSearch\"\n class=\"pt-0 search\"\n label=\"Search\"\n prepend-inner-icon=\"mdi-magnify\"\n clearable\n variant=\"outlined\"\n density=\"compact\"\n single-line\n hide-details\n style=\"max-width: 300px\"\n />\n </v-row>\n </v-card-title>\n\n <v-data-table-server\n :headers=\"completedHeaders\"\n :items=\"completedScripts\"\n :items-length=\"completedTotal\"\n :loading=\"completedLoading\"\n :search=\"completedSearch\"\n density=\"compact\"\n data-test=\"completed-scripts\"\n :items-per-page=\"completedItemsPerPage\"\n :page=\"completedPage\"\n :items-per-page-options=\"[10, 25, 50]\"\n class=\"script-table\"\n @update:page=\"updateCompletedPage\"\n @update:items-per-page=\"updateCompletedItemsPerPage\"\n >\n <template #item.name=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n @click=\"showScript(item)\"\n >{{ item.name }}</v-btn\n >\n </template>\n <template #item.log=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-eye\"\n @click=\"viewScriptLog(item, 'log')\"\n />\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-file-download-outline\"\n :disabled=\"downloadScript\"\n :loading=\"downloadScript && downloadScript.name === item.name\"\n @click=\"downloadScriptLog(item, 'log')\"\n />\n </template>\n <template #item.report=\"{ item }\">\n <div v-if=\"!item.report\">\n <span>N/A</span>\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-eye\"\n @click=\"viewScriptLog(item, 'report')\"\n />\n <v-menu>\n <template #activator=\"{ props }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-file-download-outline\"\n :disabled=\"downloadScript\"\n :loading=\"\n downloadScript && downloadScript.name === item.name\n \"\n v-bind=\"props\"\n />\n </template>\n <v-list>\n <v-list-item\n @click=\"downloadScriptLog(item, 'report', 'text')\"\n >\n <v-list-item-title>Download as Text</v-list-item-title>\n </v-list-item>\n <v-list-item\n @click=\"downloadScriptLog(item, 'report', 'ctrf')\"\n >\n <v-list-item-title>Download as CTRF</v-list-item-title>\n </v-list-item>\n </v-list>\n </v-menu>\n </div>\n </template>\n </v-data-table-server>\n </v-window-item>\n </v-window>\n </v-card>\n\n <output-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :content=\"dialogContent\"\n type=\"Script\"\n :name=\"dialogName\"\n :filename=\"dialogFilename\"\n @submit=\"showDialog = false\"\n />\n </div>\n</template>\n\n<script>\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\nimport { OutputDialog } from '@/components'\nimport { TimeFilters } from '@/util'\n\nexport default {\n components: { OutputDialog },\n mixins: [TimeFilters],\n props: {\n tabId: Number,\n curTab: Number,\n connectInNewTab: Boolean,\n },\n data() {\n return {\n api: null,\n timeZone: 'local',\n activeTab: 'completed',\n downloadScript: null,\n refreshTimer: null,\n // Running scripts pagination data\n runningSearch: '',\n runningScripts: [],\n runningTotal: 0,\n runningLoading: false,\n runningPage: 1,\n runningItemsPerPage: 10,\n runningHeaders: [\n {\n title: 'Connect',\n key: 'connect',\n sortable: false,\n filterable: false,\n },\n { title: 'Id', key: 'name' },\n { title: 'User', key: 'user_display' },\n { title: 'Filename', key: 'filename' },\n { title: 'Start Time', key: 'start_time_formatted' },\n { title: 'Duration', key: 'duration' },\n { title: 'State', key: 'state' },\n {\n title: 'Stop',\n key: 'stop',\n sortable: false,\n filterable: false,\n },\n ],\n // Completed scripts pagination data\n completedSearch: '',\n completedScripts: [],\n completedTotal: 0,\n completedLoading: false,\n completedPage: 1,\n completedItemsPerPage: 10,\n completedHeaders: [\n { title: 'Id', key: 'name' },\n { title: 'User', key: 'user_display' },\n { title: 'Filename', key: 'filename' },\n { title: 'Start Time', key: 'start_time_formatted' },\n { title: 'Duration', key: 'duration' },\n { title: 'State', key: 'state' },\n {\n title: 'Log',\n key: 'log',\n sortable: false,\n filterable: false,\n },\n {\n title: 'Report',\n key: 'report',\n sortable: false,\n filterable: false,\n },\n ],\n showDialog: false,\n dialogName: '',\n dialogContent: '',\n dialogFilename: '',\n }\n },\n watch: {\n activeTab(newTab) {\n if (newTab === 'running') {\n this.getRunningScripts()\n } else if (newTab === 'completed') {\n this.getCompletedScripts()\n }\n },\n },\n created() {\n this.api = new OpenC3Api()\n this.api\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch((error) => {\n // Do nothing\n })\n\n this.getRunningScripts()\n this.getCompletedScripts()\n\n // Start a timer to refresh the running scripts list every 5 seconds\n this.refreshTimer = setInterval(() => {\n if (this.activeTab === 'running') {\n this.getRunningScripts()\n }\n }, 5000)\n },\n beforeUnmount() {\n // Clear the timer when component is unmounted\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer)\n }\n },\n methods: {\n getRunningScripts: function () {\n this.runningLoading = true\n const offset = (this.runningPage - 1) * this.runningItemsPerPage\n Api.get(\n `/script-api/running-script?scope=DEFAULT&offset=${offset}&limit=${this.runningItemsPerPage}`,\n )\n .then((response) => {\n const scripts = response.data.items || []\n const currentTime = new Date()\n\n // Calculate duration for each running script and format user info\n scripts.forEach((script) => {\n // Format user display as \"full_name (username)\"\n script.user_display = `${script.user_full_name} (${script.username})`\n\n // Calculate duration\n if (script.start_time) {\n const startTime = new Date(script.start_time)\n const durationMs = currentTime - startTime\n script.start_time_formatted = this.formatDateTimeHMS(\n startTime,\n this.timeZone,\n )\n // Format duration\n if (durationMs < 0) {\n script.duration = 'N/A'\n } else if (durationMs < 1000) {\n script.duration = '< 1s'\n } else if (durationMs < 60000) {\n script.duration = `${Math.round(durationMs / 1000)}s`\n } else if (durationMs < 3600000) {\n const minutes = Math.floor(durationMs / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${minutes}m ${seconds}s`\n } else {\n const hours = Math.floor(durationMs / 3600000)\n const minutes = Math.floor((durationMs % 3600000) / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${hours}h ${minutes}m ${seconds}s`\n }\n } else {\n script.duration = 'N/A'\n }\n })\n\n this.runningScripts = scripts\n this.runningTotal = response.data.total || scripts.length\n this.runningLoading = false\n })\n .catch((error) => {\n this.runningLoading = false\n this.$notify.caution({\n title: 'Error Loading Running Scripts',\n body: error.message,\n })\n })\n },\n updateRunningPage: function (page) {\n this.runningPage = page\n this.getRunningScripts()\n },\n updateRunningItemsPerPage: function (itemsPerPage) {\n this.runningItemsPerPage = itemsPerPage\n this.runningPage = 1\n this.getRunningScripts()\n },\n getCompletedScripts: function () {\n this.completedLoading = true\n const offset = (this.completedPage - 1) * this.completedItemsPerPage\n Api.get(\n `/script-api/completed-scripts?scope=DEFAULT&offset=${offset}&limit=${this.completedItemsPerPage}`,\n )\n .then((response) => {\n const scripts = response.data.items || []\n\n // Calculate duration and format user info for each completed script\n scripts.forEach((script) => {\n // Format user display as \"full_name (username)\"\n script.user_display = `${script.user_full_name} (${script.username})`\n\n // Calculate duration\n if (script.start_time && script.end_time) {\n const startTime = new Date(script.start_time)\n const endTime = new Date(script.end_time)\n const durationMs = endTime - startTime\n script.start_time_formatted = this.formatDateTimeHMS(\n startTime,\n this.timeZone,\n )\n\n // Format duration\n if (durationMs < 0) {\n script.duration = 'N/A'\n } else if (durationMs < 1000) {\n script.duration = '< 1s'\n } else if (durationMs < 60000) {\n script.duration = `${Math.round(durationMs / 1000)}s`\n } else if (durationMs < 3600000) {\n const minutes = Math.floor(durationMs / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${minutes}m ${seconds}s`\n } else {\n const hours = Math.floor(durationMs / 3600000)\n const minutes = Math.floor((durationMs % 3600000) / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${hours}h ${minutes}m ${seconds}s`\n }\n } else {\n script.duration = 'N/A'\n }\n })\n\n this.completedScripts = scripts\n this.completedTotal = response.data.total || scripts.length\n this.completedLoading = false\n })\n .catch((error) => {\n this.completedLoading = false\n this.$notify.caution({\n title: 'Error Loading Completed Scripts',\n body: error.message,\n })\n })\n },\n updateCompletedPage: function (page) {\n this.completedPage = page\n this.getCompletedScripts()\n },\n updateCompletedItemsPerPage: function (itemsPerPage) {\n this.completedItemsPerPage = itemsPerPage\n this.completedPage = 1\n this.getCompletedScripts()\n },\n showScript: function (script) {\n this.dialogContent = JSON.stringify(script, null, 2)\n this.dialogName = 'Script: ' + script.name\n this.dialogFilename = ''\n this.showDialog = true\n },\n connectScript: function (script) {\n // Must disconnect before connecting\n this.$emit('disconnect')\n const destination = {\n name: 'ScriptRunner',\n params: { id: script.name },\n }\n if (this.connectInNewTab) {\n let { href } = this.$router.resolve(destination)\n window.open(href, '_blank')\n } else {\n this.$router.push(destination)\n this.$emit('close')\n }\n },\n deleteScript: function (script) {\n this.$dialog\n .confirm(\n `Are you sure you want to stop script: ${script.name} ${script.filename}?\\n`,\n {\n okText: 'Stop',\n cancelText: 'Cancel',\n },\n )\n .then((dialog) => {\n return Api.post(`/script-api/running-script/${script.name}/delete`)\n })\n .then((response) => {\n this.$notify.normal({\n body: `Stopped script: ${script.name} ${script.filename}`,\n })\n this.getRunningScripts()\n })\n .catch((error) => {\n if (error !== true) {\n this.$notify.caution({\n body: `Failed to stop script: ${script.name} ${script.filename}`,\n })\n }\n })\n },\n viewScriptLog: function (script, type) {\n let logUrl = null\n if (type === 'report') {\n this.dialogName = 'Report'\n logUrl = script.report\n } else {\n this.dialogName = 'Log'\n logUrl = script.log\n }\n Api.get(\n `/openc3-api/storage/download_file/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET`,\n ).then((response) => {\n const filenameParts = logUrl.split('/')\n this.dialogFilename = filenameParts[filenameParts.length - 1]\n // Decode Base64 string\n this.dialogContent = window.atob(response.data.contents)\n this.showDialog = true\n })\n },\n downloadScriptLog: function (script, type, format = 'text') {\n let logUrl = null\n if (type === 'report') {\n this.dialogName = 'Report'\n logUrl = script.report\n } else {\n this.dialogName = 'Log'\n logUrl = script.log\n }\n this.downloadScript = script\n\n if (format === 'ctrf' && type === 'report') {\n // For CTRF format, pass format parameter to backend for conversion\n Api.get(\n `/openc3-api/storage/download_file/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET&format=ctrf`,\n )\n .then((response) => {\n // Backend returns the converted CTRF content\n const blob = new Blob([window.atob(response.data.contents)], {\n type: 'application/json',\n })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', response.data.filename)\n link.click()\n this.downloadScript = null\n })\n .catch(() => {\n this.$notify.caution({\n title: `Unable to download log ${logUrl}`,\n body: `You may be able to download this log manually from the 'logs' bucket at ${logUrl}`,\n })\n this.downloadScript = null\n })\n } else {\n // Original download functionality for text format\n Api.get(\n `/openc3-api/storage/download/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET`,\n )\n .then((response) => {\n const filenameParts = logUrl.split('/')\n const basename = filenameParts[filenameParts.length - 1]\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = response.data.url\n link.setAttribute('download', basename)\n link.click()\n this.downloadScript = null\n })\n .catch(() => {\n this.$notify.caution({\n title: `Unable to download log ${logUrl}`,\n body: `You may be able to download this log manually from the 'logs' bucket at ${logUrl}`,\n })\n this.downloadScript = null\n })\n }\n },\n },\n}\n</script>\n<style>\n.v-sheet {\n background-color: var(--color-background-base-default);\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2023, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n <v-btn\n class=\"mx-2\"\n icon=\"mdi-download\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"download-log\"\n aria-label=\"Download Log\"\n @click=\"downloadLog\"\n />\n Script Messages\n <v-spacer />\n <v-select\n v-model=\"messageOrder\"\n density=\"compact\"\n hide-details\n variant=\"outlined\"\n :items=\"messageOrderOptions\"\n class=\"mr-2\"\n style=\"max-width: 200px\"\n data-test=\"message-order\"\n />\n <v-spacer />\n <v-text-field\n v-model=\"search\"\n label=\"Search\"\n prepend-inner-icon=\"mdi-magnify\"\n clearable\n variant=\"outlined\"\n density=\"compact\"\n single-line\n hide-details\n class=\"search\"\n data-test=\"search-messages\"\n />\n\n <v-btn\n class=\"mx-2\"\n icon=\"mdi-delete-sweep\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"clear-log\"\n aria-label=\"Clear Log\"\n @click=\"clearLog\"\n />\n </v-card-title>\n <v-card-text>\n <v-data-table\n id=\"script-log-messages\"\n style=\"overflow: auto\"\n :headers=\"headers\"\n :items=\"messages\"\n :search=\"search\"\n :items-per-page=\"-1\"\n hide-default-footer\n density=\"compact\"\n data-test=\"output-messages\"\n >\n <template #item.message=\"{ item }\">\n <div :class=\"messageClass(item.message)\">{{ item.message }}</div>\n </template>\n </v-data-table>\n </v-card-text>\n </v-card>\n</template>\n\n<script>\nimport { format } from 'date-fns'\n\nexport default {\n props: {\n modelValue: {\n type: Array,\n required: true,\n },\n },\n emits: ['sort', 'update:modelValue'],\n data() {\n return {\n search: '',\n headers: [{ title: 'Message', value: 'message', sortable: false }],\n messageOrderOptions: ['Newest on Top', 'Newest on Bottom'],\n messageOrder: 'Newest on Top',\n }\n },\n computed: {\n messages: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n watch: {\n messageOrder: function (newValue, oldValue) {\n this.$emit('sort', newValue)\n },\n },\n methods: {\n messageClass(message) {\n if (\n message.match(/(CHECK|WAIT): .*(success|was within range.*) with value/)\n ) {\n return 'openc3-green'\n } else if (\n message.match(\n /(CHECK|WAIT): .*(failed|failed to be within range.*) with value/,\n )\n ) {\n return 'openc3-red'\n } else {\n return ''\n }\n },\n downloadLog() {\n const output = this.messages.map((message) => message.message).join('\\n')\n const blob = new Blob([output], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute(\n 'download',\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss') + '_sr_message_log.txt',\n )\n link.click()\n },\n clearLog: function () {\n this.$dialog\n .confirm('Are you sure you want to clear the log?', {\n okText: 'Clear',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n this.messages = []\n })\n .catch(function (err) {\n // Canceling the dialog forces catch and sets err to true\n })\n },\n },\n}\n</script>\n","import { useSlots as ce, ref as k, computed as z, watch as B, onMounted as G, onBeforeUnmount as X, provide as g, createBlock as ve, openBlock as Y, resolveDynamicComponent as me, nextTick as T, h as fe, inject as w, getCurrentInstance as de, createElementBlock as pe, normalizeStyle as ze, unref as he, renderSlot as xe } from \"vue\";\nconst Pe = {\n __name: \"splitpanes\",\n props: {\n horizontal: { type: Boolean, default: !1 },\n pushOtherPanes: { type: Boolean, default: !0 },\n maximizePanes: { type: Boolean, default: !0 },\n // Maximize pane on splitter double click/tap.\n rtl: { type: Boolean, default: !1 },\n // Right to left direction.\n firstSplitter: { type: Boolean, default: !1 }\n },\n emits: [\n \"ready\",\n \"resize\",\n \"resized\",\n \"pane-click\",\n \"pane-maximize\",\n \"pane-add\",\n \"pane-remove\",\n \"splitter-click\",\n \"splitter-dblclick\"\n ],\n setup(D, { emit: h }) {\n const y = h, u = D, E = ce(), l = k([]), M = z(() => l.value.reduce((e, n) => (e[~~n.id] = n) && e, {})), m = z(() => l.value.length), x = k(null), S = k(!1), c = k({\n mouseDown: !1,\n dragging: !1,\n activeSplitter: null,\n cursorOffset: 0\n // Cursor offset within the splitter.\n }), f = k({\n // Used to detect double click on touch devices.\n splitter: null,\n timeoutId: null\n }), _ = z(() => ({\n [`splitpanes splitpanes--${u.horizontal ? \"horizontal\" : \"vertical\"}`]: !0,\n \"splitpanes--dragging\": c.value.dragging\n })), R = () => {\n document.addEventListener(\"mousemove\", r, { passive: !1 }), document.addEventListener(\"mouseup\", P), \"ontouchstart\" in window && (document.addEventListener(\"touchmove\", r, { passive: !1 }), document.addEventListener(\"touchend\", P));\n }, O = () => {\n document.removeEventListener(\"mousemove\", r, { passive: !1 }), document.removeEventListener(\"mouseup\", P), \"ontouchstart\" in window && (document.removeEventListener(\"touchmove\", r, { passive: !1 }), document.removeEventListener(\"touchend\", P));\n }, b = (e, n) => {\n const t = e.target.closest(\".splitpanes__splitter\");\n if (t) {\n const { left: i, top: a } = t.getBoundingClientRect(), { clientX: s, clientY: o } = \"ontouchstart\" in window && e.touches ? e.touches[0] : e;\n c.value.cursorOffset = u.horizontal ? o - a : s - i;\n }\n R(), c.value.mouseDown = !0, c.value.activeSplitter = n;\n }, r = (e) => {\n c.value.mouseDown && (e.preventDefault(), c.value.dragging = !0, requestAnimationFrame(() => {\n K(I(e)), d(\"resize\", { event: e }, !0);\n }));\n }, P = (e) => {\n c.value.dragging && (window.getSelection().removeAllRanges(), d(\"resized\", { event: e }, !0)), c.value.mouseDown = !1, c.value.activeSplitter = null, setTimeout(() => {\n c.value.dragging = !1, O();\n }, 100);\n }, A = (e, n) => {\n \"ontouchstart\" in window && (e.preventDefault(), f.value.splitter === n ? (clearTimeout(f.value.timeoutId), f.value.timeoutId = null, U(e, n), f.value.splitter = null) : (f.value.splitter = n, f.value.timeoutId = setTimeout(() => f.value.splitter = null, 500))), c.value.dragging || d(\"splitter-click\", { event: e, index: n }, !0);\n }, U = (e, n) => {\n if (d(\"splitter-dblclick\", { event: e, index: n }, !0), u.maximizePanes) {\n let t = 0;\n l.value = l.value.map((i, a) => (i.size = a === n ? i.max : i.min, a !== n && (t += i.min), i)), l.value[n].size -= t, d(\"pane-maximize\", { event: e, index: n, pane: l.value[n] }), d(\"resized\", { event: e, index: n }, !0);\n }\n }, W = (e, n) => {\n d(\"pane-click\", {\n event: e,\n index: M.value[n].index,\n pane: M.value[n]\n });\n }, I = (e) => {\n const n = x.value.getBoundingClientRect(), { clientX: t, clientY: i } = \"ontouchstart\" in window && e.touches ? e.touches[0] : e;\n return {\n x: t - (u.horizontal ? 0 : c.value.cursorOffset) - n.left,\n y: i - (u.horizontal ? c.value.cursorOffset : 0) - n.top\n };\n }, J = (e) => {\n e = e[u.horizontal ? \"y\" : \"x\"];\n const n = x.value[u.horizontal ? \"clientHeight\" : \"clientWidth\"];\n return u.rtl && !u.horizontal && (e = n - e), e * 100 / n;\n }, K = (e) => {\n const n = c.value.activeSplitter;\n let t = {\n prevPanesSize: $(n),\n nextPanesSize: N(n),\n prevReachedMinPanes: 0,\n nextReachedMinPanes: 0\n };\n const i = 0 + (u.pushOtherPanes ? 0 : t.prevPanesSize), a = 100 - (u.pushOtherPanes ? 0 : t.nextPanesSize), s = Math.max(Math.min(J(e), a), i);\n let o = [n, n + 1], v = l.value[o[0]] || null, p = l.value[o[1]] || null;\n const H = v.max < 100 && s >= v.max + t.prevPanesSize, ue = p.max < 100 && s <= 100 - (p.max + N(n + 1));\n if (H || ue) {\n H ? (v.size = v.max, p.size = Math.max(100 - v.max - t.prevPanesSize - t.nextPanesSize, 0)) : (v.size = Math.max(100 - p.max - t.prevPanesSize - N(n + 1), 0), p.size = p.max);\n return;\n }\n if (u.pushOtherPanes) {\n const j = Q(t, s);\n if (!j) return;\n ({ sums: t, panesToResize: o } = j), v = l.value[o[0]] || null, p = l.value[o[1]] || null;\n }\n v !== null && (v.size = Math.min(Math.max(s - t.prevPanesSize - t.prevReachedMinPanes, v.min), v.max)), p !== null && (p.size = Math.min(Math.max(100 - s - t.nextPanesSize - t.nextReachedMinPanes, p.min), p.max));\n }, Q = (e, n) => {\n const t = c.value.activeSplitter, i = [t, t + 1];\n return n < e.prevPanesSize + l.value[i[0]].min && (i[0] = V(t).index, e.prevReachedMinPanes = 0, i[0] < t && l.value.forEach((a, s) => {\n s > i[0] && s <= t && (a.size = a.min, e.prevReachedMinPanes += a.min);\n }), e.prevPanesSize = $(i[0]), i[0] === void 0) ? (e.prevReachedMinPanes = 0, l.value[0].size = l.value[0].min, l.value.forEach((a, s) => {\n s > 0 && s <= t && (a.size = a.min, e.prevReachedMinPanes += a.min);\n }), l.value[i[1]].size = 100 - e.prevReachedMinPanes - l.value[0].min - e.prevPanesSize - e.nextPanesSize, null) : n > 100 - e.nextPanesSize - l.value[i[1]].min && (i[1] = Z(t).index, e.nextReachedMinPanes = 0, i[1] > t + 1 && l.value.forEach((a, s) => {\n s > t && s < i[1] && (a.size = a.min, e.nextReachedMinPanes += a.min);\n }), e.nextPanesSize = N(i[1] - 1), i[1] === void 0) ? (e.nextReachedMinPanes = 0, l.value.forEach((a, s) => {\n s < m.value - 1 && s >= t + 1 && (a.size = a.min, e.nextReachedMinPanes += a.min);\n }), l.value[i[0]].size = 100 - e.prevPanesSize - N(i[0] - 1), null) : { sums: e, panesToResize: i };\n }, $ = (e) => l.value.reduce((n, t, i) => n + (i < e ? t.size : 0), 0), N = (e) => l.value.reduce((n, t, i) => n + (i > e + 1 ? t.size : 0), 0), V = (e) => [...l.value].reverse().find((t) => t.index < e && t.size > t.min) || {}, Z = (e) => l.value.find((t) => t.index > e + 1 && t.size > t.min) || {}, ee = () => {\n var n;\n const e = Array.from(((n = x.value) == null ? void 0 : n.children) || []);\n for (const t of e) {\n const i = t.classList.contains(\"splitpanes__pane\"), a = t.classList.contains(\"splitpanes__splitter\");\n !i && !a && (t.remove(), console.warn(\"Splitpanes: Only <pane> elements are allowed at the root of <splitpanes>. One of your DOM nodes was removed.\"));\n }\n }, F = (e, n, t = !1) => {\n const i = e - 1, a = document.createElement(\"div\");\n a.classList.add(\"splitpanes__splitter\"), t || (a.onmousedown = (s) => b(s, i), typeof window < \"u\" && \"ontouchstart\" in window && (a.ontouchstart = (s) => b(s, i)), a.onclick = (s) => A(s, i + 1)), a.ondblclick = (s) => U(s, i + 1), n.parentNode.insertBefore(a, n);\n }, ne = (e) => {\n e.onmousedown = void 0, e.onclick = void 0, e.ondblclick = void 0, e.remove();\n }, C = () => {\n var t;\n const e = Array.from(((t = x.value) == null ? void 0 : t.children) || []);\n for (const i of e)\n i.className.includes(\"splitpanes__splitter\") && ne(i);\n let n = 0;\n for (const i of e)\n i.className.includes(\"splitpanes__pane\") && (!n && u.firstSplitter ? F(n, i, !0) : n && F(n, i), n++);\n }, ie = ({ uid: e, ...n }) => {\n const t = M.value[e];\n for (const [i, a] of Object.entries(n)) t[i] = a;\n }, te = (e) => {\n var t;\n let n = -1;\n Array.from(((t = x.value) == null ? void 0 : t.children) || []).some((i) => (i.className.includes(\"splitpanes__pane\") && n++, i.isSameNode(e.el))), l.value.splice(n, 0, { ...e, index: n }), l.value.forEach((i, a) => i.index = a), S.value && T(() => {\n C(), L({ addedPane: l.value[n] }), d(\"pane-add\", { pane: l.value[n] });\n });\n }, ae = (e) => {\n const n = l.value.findIndex((i) => i.id === e);\n l.value[n].el = null;\n const t = l.value.splice(n, 1)[0];\n l.value.forEach((i, a) => i.index = a), T(() => {\n C(), d(\"pane-remove\", { pane: t }), L({ removedPane: { ...t } });\n });\n }, L = (e = {}) => {\n !e.addedPane && !e.removedPane ? le() : l.value.some((n) => n.givenSize !== null || n.min || n.max < 100) ? oe(e) : se(), S.value && d(\"resized\");\n }, se = () => {\n const e = 100 / m.value;\n let n = 0;\n const t = [], i = [];\n for (const a of l.value)\n a.size = Math.max(Math.min(e, a.max), a.min), n -= a.size, a.size >= a.max && t.push(a.id), a.size <= a.min && i.push(a.id);\n n > 0.1 && q(n, t, i);\n }, le = () => {\n let e = 100;\n const n = [], t = [];\n let i = 0;\n for (const s of l.value)\n e -= s.size, s.givenSize !== null && i++, s.size >= s.max && n.push(s.id), s.size <= s.min && t.push(s.id);\n let a = 100;\n if (e > 0.1) {\n for (const s of l.value)\n s.givenSize === null && (s.size = Math.max(Math.min(e / (m.value - i), s.max), s.min)), a -= s.size;\n a > 0.1 && q(a, n, t);\n }\n }, oe = ({ addedPane: e, removedPane: n } = {}) => {\n let t = 100 / m.value, i = 0;\n const a = [], s = [];\n ((e == null ? void 0 : e.givenSize) ?? null) !== null && (t = (100 - e.givenSize) / (m.value - 1));\n for (const o of l.value)\n i -= o.size, o.size >= o.max && a.push(o.id), o.size <= o.min && s.push(o.id);\n if (!(Math.abs(i) < 0.1)) {\n for (const o of l.value)\n (e == null ? void 0 : e.givenSize) !== null && (e == null ? void 0 : e.id) === o.id || (o.size = Math.max(Math.min(t, o.max), o.min)), i -= o.size, o.size >= o.max && a.push(o.id), o.size <= o.min && s.push(o.id);\n i > 0.1 && q(i, a, s);\n }\n }, q = (e, n, t) => {\n let i;\n e > 0 ? i = e / (m.value - n.length) : i = e / (m.value - t.length), l.value.forEach((a, s) => {\n if (e > 0 && !n.includes(a.id)) {\n const o = Math.max(Math.min(a.size + i, a.max), a.min), v = o - a.size;\n e -= v, a.size = o;\n } else if (!t.includes(a.id)) {\n const o = Math.max(Math.min(a.size + i, a.max), a.min), v = o - a.size;\n e -= v, a.size = o;\n }\n }), Math.abs(e) > 0.1 && T(() => {\n S.value && console.warn(\"Splitpanes: Could not resize panes correctly due to their constraints.\");\n });\n }, d = (e, n = void 0, t = !1) => {\n const i = (n == null ? void 0 : n.index) ?? c.value.activeSplitter ?? null;\n y(e, {\n ...n,\n ...i !== null && { index: i },\n ...t && i !== null && {\n prevPane: l.value[i - (u.firstSplitter ? 1 : 0)],\n nextPane: l.value[i + (u.firstSplitter ? 0 : 1)]\n },\n panes: l.value.map((a) => ({ min: a.min, max: a.max, size: a.size }))\n });\n };\n B(() => u.firstSplitter, () => C()), G(() => {\n ee(), C(), L(), d(\"ready\"), S.value = !0;\n }), X(() => S.value = !1);\n const re = () => {\n var e;\n return fe(\n \"div\",\n { ref: x, class: _.value },\n (e = E.default) == null ? void 0 : e.call(E)\n );\n };\n return g(\"panes\", l), g(\"indexedPanes\", M), g(\"horizontal\", z(() => u.horizontal)), g(\"requestUpdate\", ie), g(\"onPaneAdd\", te), g(\"onPaneRemove\", ae), g(\"onPaneClick\", W), (e, n) => (Y(), ve(me(re)));\n }\n}, ge = {\n __name: \"pane\",\n props: {\n size: { type: [Number, String] },\n minSize: { type: [Number, String], default: 0 },\n maxSize: { type: [Number, String], default: 100 }\n },\n setup(D) {\n var b;\n const h = D, y = w(\"requestUpdate\"), u = w(\"onPaneAdd\"), E = w(\"horizontal\"), l = w(\"onPaneRemove\"), M = w(\"onPaneClick\"), m = (b = de()) == null ? void 0 : b.uid, x = w(\"indexedPanes\"), S = z(() => x.value[m]), c = k(null), f = z(() => {\n const r = isNaN(h.size) || h.size === void 0 ? 0 : parseFloat(h.size);\n return Math.max(Math.min(r, R.value), _.value);\n }), _ = z(() => {\n const r = parseFloat(h.minSize);\n return isNaN(r) ? 0 : r;\n }), R = z(() => {\n const r = parseFloat(h.maxSize);\n return isNaN(r) ? 100 : r;\n }), O = z(() => {\n var r;\n return `${E.value ? \"height\" : \"width\"}: ${(r = S.value) == null ? void 0 : r.size}%`;\n });\n return B(() => f.value, (r) => y({ uid: m, size: r })), B(() => _.value, (r) => y({ uid: m, min: r })), B(() => R.value, (r) => y({ uid: m, max: r })), G(() => {\n u({\n id: m,\n el: c.value,\n min: _.value,\n max: R.value,\n // The given size (useful to know the user intention).\n givenSize: h.size === void 0 ? null : f.value,\n size: f.value\n // The computed current size at any time.\n });\n }), X(() => l(m)), (r, P) => (Y(), pe(\"div\", {\n ref_key: \"paneEl\",\n ref: c,\n class: \"splitpanes__pane\",\n onClick: P[0] || (P[0] = (A) => he(M)(A, r._.uid)),\n style: ze(O.value)\n }, [\n xe(r.$slots, \"default\")\n ], 4));\n }\n};\nexport {\n ge as Pane,\n Pe as Splitpanes\n};\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" persistent width=\"600\">\n <v-card>\n <v-form v-model=\"valid\" @submit.prevent=\"submitHandler\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> User Input Required </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <div class=\"question\">{{ question }}</div>\n <v-text-field\n v-model=\"inputValue\"\n autofocus\n data-test=\"ask-value-input\"\n :type=\"password ? 'password' : 'text'\"\n :rules=\"rules\"\n />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"ask-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n type=\"submit\"\n data-test=\"ask-ok\"\n :disabled=\"!valid\"\n @click.prevent=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n question: {\n type: String,\n required: true,\n },\n default: {\n type: String,\n default: null,\n },\n password: {\n type: Boolean,\n default: false,\n },\n answerRequired: {\n type: Boolean,\n default: true,\n },\n modelValue: Boolean,\n },\n data() {\n return {\n inputValue: '',\n valid: false,\n rules: [(v) => !!v || 'Required'],\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n created() {\n if (this.default) {\n this.valid = true\n this.inputValue = this.default\n }\n if (this.answerRequired === false) {\n this.valid = true\n this.rules = [(v) => true]\n }\n },\n methods: {\n submitHandler: function () {\n this.$emit('response', this.inputValue)\n },\n cancelHandler: function () {\n this.$emit('response', 'Cancel')\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.question {\n font-size: 1rem;\n white-space: pre-line;\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" persistent width=\"600\">\n <v-card>\n <v-form v-model=\"valid\" @submit.prevent=\"submitHandler\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> File Dialog </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row>\n <span class=\"title\">{{ title }}</span>\n </v-row>\n <v-row v-if=\"message\">\n <span\n class=\"ma-3\"\n style=\"white-space: pre-line\"\n v-text=\"message\"\n />\n </v-row>\n <v-row class=\"my-1\">\n <v-file-input\n v-model=\"inputValue\"\n label=\"Choose File\"\n :rules=\"rules\"\n autofocus\n data-test=\"file-input\"\n :accept=\"filter\"\n small-chips\n :multiple=\"multiple\"\n />\n </v-row>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"file-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n type=\"submit\"\n data-test=\"file-ok\"\n :disabled=\"!valid\"\n @click.prevent=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n title: {\n type: String,\n required: true,\n },\n message: {\n type: String,\n default: null,\n },\n filter: {\n type: String,\n default: '*',\n },\n multiple: {\n type: Boolean,\n default: false,\n },\n modelValue: Boolean,\n },\n data() {\n return {\n inputValue: null,\n valid: null,\n rules: [\n (value) => {\n if (this.multiple) {\n return value.length != 0 || 'Required'\n } else {\n return !!value || 'Required'\n }\n },\n ],\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n methods: {\n submitHandler: function () {\n // Ensure we send back an array of file names even in the single case\n // to make it easier to deal with a consistent result\n if (!Array.isArray(this.inputValue)) {\n this.inputValue = [this.inputValue]\n }\n this.$emit('response', this.inputValue)\n },\n cancelHandler: function () {\n this.$emit('response', 'Cancel')\n },\n },\n}\n</script>\n\n<style scoped>\n.title {\n font-size: 1.125rem;\n font-weight: bold;\n padding-bottom: 5px;\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <!-- INFO -->\n <v-dialog v-model=\"show\" :width=\"width\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span style=\"white-space: pre\" v-text=\"title\" />\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row no-gutters v-for=\"(line, index) in text\" :key=\"index\">\n <span style=\"white-space: pre\" v-text=\"line\" />\n </v-row>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n title: {\n type: String,\n required: true,\n },\n text: {\n type: String,\n required: true,\n },\n width: {\n type: String,\n required: true,\n },\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n methods: {},\n}\n</script>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"1000\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span>Overrides</span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row class=\"ma-1\">\n <v-btn\n color=\"primary\"\n data-test=\"overrides-dialog-clear-all\"\n @click=\"clearOverrides\"\n >\n Clear All Overrides\n </v-btn>\n <v-spacer />\n <v-text-field\n v-model=\"search\"\n label=\"Search\"\n prepend-inner-icon=\"mdi-magnify\"\n clearable\n variant=\"outlined\"\n density=\"compact\"\n single-line\n hide-details\n />\n </v-row>\n <v-data-table\n :headers=\"headers\"\n :items=\"overrides\"\n :search=\"search\"\n :items-per-page-options=\"[100]\"\n multi-sort\n density=\"compact\"\n >\n <template #item.delete=\"{ item }\">\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Override\"\n @click=\"deleteOverride(item)\"\n />\n </template>\n </v-data-table>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"flat\"\n data-test=\"overrides-dialog-ok\"\n @click=\"show = !show\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { OpenC3Api } from '@openc3/js-common/services'\n\nexport default {\n components: {},\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n },\n data() {\n return {\n api: null,\n overrides: [],\n search: '',\n headers: [\n { text: 'Target', value: 'target_name' },\n { text: 'Packet', value: 'packet_name' },\n { text: 'Item', value: 'item_name' },\n { text: 'Type', value: 'value_type' },\n { text: 'Value', value: 'value' },\n { text: 'Delete', value: 'delete' },\n ],\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n created: function () {\n this.api = new OpenC3Api()\n this.getOverrides()\n },\n methods: {\n getOverrides: function () {\n this.api.get_overrides().then((result) => {\n this.overrides = result\n })\n },\n clearOverrides: function () {\n const items = [\n ...new Map(\n this.overrides.map((item) => [\n // Create a key based on target, packet, item so we remove duplicates\n `${item.target_name}__${item.packet_name}__${item.item_name}`,\n item,\n ]),\n ).values(),\n ]\n for (let item of items) {\n this.api\n .normalize_tlm(\n item.target_name,\n item.packet_name,\n item.item_name,\n 'ALL',\n )\n .then((result) => {\n this.overrides = []\n })\n }\n },\n deleteOverride: function (item) {\n this.api\n .normalize_tlm(\n item.target_name,\n item.packet_name,\n item.item_name,\n item.value_type,\n )\n .then((result) => {\n let index = this.overrides.indexOf(item)\n this.overrides.splice(index, 1)\n })\n },\n },\n}\n</script>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" persistent width=\"600\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span class=\"text\" v-text=\"title\" />\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text class=\"text\">\n <v-row v-if=\"subtitle\">\n <v-card-subtitle>{{ subtitle }}</v-card-subtitle>\n </v-row>\n <v-row class=\"mt-1\">\n <span v-text=\"message\" />\n </v-row>\n <v-row v-if=\"details\" class=\"mt-1\">\n <span v-text=\"details\" />\n </v-row>\n </v-card-text>\n </div>\n <div v-if=\"layout === 'combo'\">\n <v-row class=\"ma-2\">\n <v-select\n v-model=\"selectedItem\"\n label=\"Select\"\n color=\"secondary\"\n class=\"ma-1\"\n data-test=\"prompt-select\"\n :items=\"buttons\"\n :multiple=\"multiple === true\"\n @update:model-value=\"selectOkDisabled = false\"\n />\n </v-row>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"prompt-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n data-test=\"prompt-ok\"\n :disabled=\"selectOkDisabled\"\n @click=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </div>\n <div v-else>\n <v-card-actions :class=\"layoutClass\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"prompt-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <div v-for=\"(button, index) in buttons\" :key=\"index\">\n <v-btn\n variant=\"flat\"\n :data-test=\"`prompt-${button.text}`\"\n @click=\"submitWrapper(button.value)\"\n >\n {{ button.text }}\n </v-btn>\n </div>\n </v-card-actions>\n </div>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n title: {\n type: String,\n default: 'Prompt Dialog',\n },\n subtitle: {\n type: String,\n default: '',\n },\n message: {\n type: String,\n required: true,\n },\n details: {\n type: String,\n default: '',\n },\n buttons: {\n type: Array,\n default: () => [],\n },\n layout: {\n type: String,\n default: 'horizontal', // Also 'vertical' or 'combo' when means ComboBox\n },\n multiple: {\n type: Boolean,\n default: false,\n required: false,\n },\n modelValue: Boolean,\n },\n data() {\n return {\n selectOkDisabled: true,\n selectedItem: null,\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n layoutClass() {\n let layout = 'px-2 d-flex align-start'\n if (this.layout === 'vertical') {\n return `${layout} flex-column`\n } else {\n return `${layout} flex-row`\n }\n },\n },\n methods: {\n submitWrapper: function (output) {\n this.selectedItem = output\n this.submitHandler()\n },\n submitHandler: function () {\n this.$emit('response', this.selectedItem)\n },\n cancelHandler: function () {\n this.$emit('response', 'Cancel')\n },\n },\n}\n</script>\n\n<style scoped>\n.v-card__subtitle {\n padding: 0;\n padding-bottom: 10px;\n}\n\n.text {\n font-size: 1rem;\n white-space: pre-line;\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2024, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" scrollable width=\"800\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> Script Results </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text style=\"width: 100%; max-height: 80vh; overflow: auto\">\n <v-textarea\n readonly\n hide-details\n density=\"compact\"\n auto-grow\n :model-value=\"text\"\n />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"outlined\" @click=\"downloadResults\"> Download </v-btn>\n <v-btn ref=\"okButton\" variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { format } from 'date-fns'\n\nexport default {\n components: {},\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n text: {\n type: String,\n required: true,\n },\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n mounted() {\n // Focus the OK button so it's easy to hit Enter to close\n setTimeout(() => {\n this.$refs.okButton.$el.focus()\n })\n },\n methods: {\n downloadResults() {\n const blob = new Blob([this.text], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute(\n 'download',\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss') + '_suite_results.txt',\n )\n link.click()\n },\n },\n}\n</script>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"600\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span>Script Environment Variables</span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <environment-chooser v-model=\"selected\" />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"environment-dialog-cancel\"\n @click=\"cancel\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n data-test=\"environment-dialog-save\"\n :disabled=\"!!inputError\"\n @click=\"updateEnvironment\"\n >\n Save\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { EnvironmentChooser } from '@/components'\n\nexport default {\n components: {\n EnvironmentChooser,\n },\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n inputEnvironment: {\n type: Array,\n required: true,\n },\n },\n data() {\n return {\n selected: [],\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n mounted: function () {\n this.loadEnvironment()\n },\n methods: {\n loadEnvironment: function () {\n this.selected = [...this.inputEnvironment]\n },\n updateEnvironment: function () {\n this.$emit('environment', this.selected)\n this.show = !this.show\n },\n cancel: function () {\n this.show = !this.show\n },\n },\n}\n</script>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2023, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <div id=\"tr-container\">\n <v-row no-gutters align=\"center\">\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Pause on Error\"\n value=\"pauseOnError\"\n hide-details\n data-test=\"pause-on-error\"\n />\n </div>\n </template>\n <span>\n Checked pauses the script when an error is encountered<br />\n Unchecked continues without user interaction\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Manual\"\n value=\"manual\"\n hide-details\n data-test=\"manual\"\n />\n </div>\n </template>\n <span>\n {{ checkedManualTooltip }}<br />\n {{ uncheckedManualTooltip }}\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"suite\"\n label=\"Suite:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"suites\"\n data-test=\"select-suite\"\n @update:model-value=\"suiteChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-suite\"\n @click=\"$emit('button', { method: 'start', suite, options })\"\n >\n Start\n </v-btn>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n data-test=\"setup-suite\"\n :disabled=\"\n disableButtons || !setupSuiteEnabled || !userInfo.execute\n \"\n @click=\"$emit('button', { method: 'setup', suite, options })\"\n >\n Setup\n </v-btn>\n <v-btn\n color=\"primary\"\n data-test=\"teardown-suite\"\n :disabled=\"\n disableButtons || !teardownSuiteEnabled || !userInfo.execute\n \"\n @click=\"$emit('button', { method: 'teardown', suite, options })\"\n >\n Teardown\n </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n <v-row no-gutters>\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Continue after Error\"\n value=\"continueAfterError\"\n hide-details\n data-test=\"continue-after-error\"\n />\n </div>\n </template>\n <span>\n Checked allows the script to continue when an error is\n encountered<br />\n Unchecked forces the current script to end\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Loop\"\n value=\"loop\"\n hide-details\n data-test=\"loop\"\n />\n </div>\n </template>\n <span>\n Checked continuously executes until explicitly stopped<br />\n Unchecked executes only the started script(s)\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"group\"\n label=\"Group:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"groups\"\n data-test=\"select-group\"\n @update:model-value=\"groupChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-group\"\n @click=\"\n $emit('button', { method: 'start', suite, group, options })\n \"\n >\n Start\n </v-btn>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n data-test=\"setup-group\"\n :disabled=\"\n disableButtons || !setupGroupEnabled || !userInfo.execute\n \"\n @click=\"\n $emit('button', { method: 'setup', suite, group, options })\n \"\n >\n Setup\n </v-btn>\n <v-btn\n color=\"primary\"\n data-test=\"teardown-group\"\n :disabled=\"\n disableButtons || !teardownGroupEnabled || !userInfo.execute\n \"\n @click=\"\n $emit('button', { method: 'teardown', suite, group, options })\n \"\n >\n Teardown\n </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n <v-row no-gutters>\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Abort after Error\"\n value=\"abortAfterError\"\n hide-details\n data-test=\"abort-after-error\"\n />\n </div>\n </template>\n <span>\n Checked stops additional script execution when an error is\n encountered<br />\n Unchecked allows additional scripts to execute\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n :disabled=\"!options.includes('loop')\"\n label=\"Break Loop on Error\"\n value=\"breakLoopOnError\"\n hide-details\n data-test=\"break-loop-on-error\"\n />\n </div>\n </template>\n <span>\n Checked breaks the loop option when an error is encountered<br />\n Unchecked allows the loop to run continuously<br />\n Note: Abort after Error still breaks the loop\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"script\"\n label=\"Script:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"scriptNames\"\n item-title=\"title\"\n item-value=\"value\"\n data-test=\"select-script\"\n @update:model-value=\"scriptChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-script\"\n @click=\"\n $emit('button', {\n method: 'start',\n suite,\n group,\n script,\n options,\n })\n \"\n >\n Start\n </v-btn>\n <!-- Create some invisible buttons to line up Start properly -->\n <v-btn color=\"primary\" class=\"mr-2 invisible\"> Setup </v-btn>\n <v-btn color=\"primary\" class=\"invisible\"> Teardown </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n suiteMap: {\n type: Object,\n required: true,\n },\n disableButtons: {\n type: Boolean,\n required: true,\n },\n filename: {\n type: String,\n required: true,\n },\n },\n emits: ['button', 'loaded'],\n data() {\n return {\n suites: [],\n groups: [],\n scripts: [],\n suite: '',\n group: '',\n script: '',\n options: ['pauseOnError', 'manual', 'continueAfterError'],\n userInfo: {},\n }\n },\n computed: {\n checkedManualTooltip() {\n if (this.filename.endsWith('.py')) {\n return 'Checked sets the RunningScript.manual variable to True'\n } else {\n return 'Checked sets the $manual variable to true'\n }\n },\n uncheckedManualTooltip() {\n if (this.filename.endsWith('.py')) {\n return 'Unchecked sets the RunningScript.manual variable to False'\n } else {\n return 'Unchecked sets the $manual variable to false'\n }\n },\n setupSuiteEnabled() {\n if (this.suite && this.suiteMap[this.suite].setup) {\n return true\n } else {\n return false\n }\n },\n teardownSuiteEnabled() {\n if (this.suite && this.suiteMap[this.suite].teardown) {\n return true\n } else {\n return false\n }\n },\n setupGroupEnabled() {\n if (\n this.suite &&\n this.group &&\n this.suiteMap[this.suite].groups[this.group].setup\n ) {\n return true\n } else {\n return false\n }\n },\n teardownGroupEnabled() {\n if (\n this.suite &&\n this.group &&\n this.suiteMap[this.suite].groups[this.group].teardown\n ) {\n return true\n } else {\n return false\n }\n },\n scriptNames() {\n return this.scripts.map((name) => {\n return {\n // strip script_ or test_ from the name\n title: name.replace(/^(script_|test_)/, ''),\n value: name,\n }\n })\n },\n },\n // Watch the suiteMap so we can recreate the suites and set the initial value\n watch: {\n suiteMap: {\n handler: function (newVal, oldVal) {\n this.updateSuiteMap()\n },\n deep: true, // Deep watcher because suiteMap is a nested Object\n },\n },\n created() {\n this.userInfo = JSON.parse(localStorage['script_runner__userinfo'])\n this.initSuites()\n this.$emit('loaded')\n },\n methods: {\n updateSuiteMap() {\n this.suites = Object.keys(this.suiteMap)\n if (\n this.suiteMap[this.suite] == undefined ||\n this.suiteMap[this.suite].groups[this.group] == undefined\n ) {\n this.initSuites()\n } else {\n this.groups = Object.keys(this.suiteMap[this.suite].groups)\n this.scripts = this.suiteMap[this.suite].groups[this.group].scripts\n }\n },\n initSuites() {\n this.suites = Object.keys(this.suiteMap)\n this.suiteChanged(this.suites[0])\n },\n suiteChanged(event) {\n this.suite = event\n this.group = ''\n this.script = ''\n this.groups = Object.keys(this.suiteMap[event].groups)\n // Make the group default be the first group\n this.groupChanged(this.groups[0])\n },\n groupChanged(event) {\n this.group = event\n this.script = ''\n this.scripts = this.suiteMap[this.suite].groups[event].scripts\n // Make the script default be the first\n this.scriptChanged(this.scripts[0])\n },\n scriptChanged(event) {\n this.script = event\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.invisible {\n visibility: hidden;\n}\n#tr-container {\n padding-top: 0px;\n padding-bottom: 15px;\n padding-left: 0px;\n padding-right: 0px;\n}\n</style>\n","/*\n# Copyright 2021 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license \n# if purchased from OpenC3, Inc.\n*/\n\nimport { Api } from '@openc3/js-common/services'\n\nconst getKeywords = (type) => {\n return Api.get(`/openc3-api/autocomplete/keywords/${type}`)\n}\n\nconst getAutocompleteData = (type) => {\n return Api.get(`/openc3-api/autocomplete/data/${type}`)\n}\n\n// This should probably go in some higher up util library thing place\nconst groupBy = (array, lambda) => {\n return array.reduce((groups, item) => {\n const key = lambda(item)\n if (groups[key]) {\n groups[key].push(item)\n } else {\n groups[key] = [item]\n }\n return groups\n }, {})\n}\n\nexport { getKeywords, getAutocompleteData, groupBy }\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport { getKeywords, getAutocompleteData } from './utilities'\n\nconst toMethodCallSyntaxRegex = (word) => {\n // create regex to find the opening of a ruby method call\n const prefix = '(^|[{\\\\(\\\\s])' // Allowable characters before the method name: start of line or { or ( or a space\n const opening = '[\\\\s\\\\(]f?[\\'\"]' // Opening sequence for a method call and a string argument: ( or a space, then ' or \"\n const params = '(\\\\S+\\\\s?){0,3}' // Only allow up to a few tokens after the keyword to avoid autocompleteception\n return new RegExp(`${prefix}${word}${opening}${params}$`) // ensure end of line because it's sliced to the current cursor position\n}\n\nexport default class PacketCompleter {\n constructor(\n type,\n dataReadyCallback = () => {},\n expressionsReadyCallback = () => {},\n ) {\n this.keywordExpressions = [] // Keywords that trigger the autocomplete feature\n this.autocompleteData = [] // Data to populate the autocomplete list\n\n getKeywords(type).then((response) => {\n this.keywordExpressions = response.data.map(toMethodCallSyntaxRegex)\n expressionsReadyCallback()\n })\n getAutocompleteData(type).then((response) => {\n this.autocompleteData = response.data\n dataReadyCallback()\n })\n }\n\n getCompletions(_editor, session, position, _prefix, callback) {\n let matches = []\n const lineBeforeCursor = session.doc.$lines[position.row].slice(\n 0,\n position.column,\n )\n if (\n this.keywordExpressions.some((regex) => lineBeforeCursor.match(regex))\n ) {\n matches = this.autocompleteData\n }\n\n callback(null, [\n ...matches,\n\n // Uncomment to also return the built-in autocomplete words (but I found they're not very good and just get in the way when using live autocomplete)\n // ...session.$mode.$highlightRules.$keywordList.map((word) => ({\n // caption: word,\n // value: word,\n // meta: 'keyword',\n // })),\n ])\n }\n}\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license \n# if purchased from OpenC3, Inc.\n*/\n\nimport PacketCompleter from './packetCompleter.js'\n\nexport default class CmdCompleter extends PacketCompleter {\n constructor() {\n super('cmd')\n }\n}\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport PacketCompleter from './packetCompleter.js'\n\nexport default class TlmCompleter extends PacketCompleter {\n constructor() {\n super('tlm', () => {\n // The data returned by the API is usable as-is, but grouping it this way makes it easier\n // to search through all the packets first, and then for an item within that packet.\n this.groupedPacketData = this.autocompleteData.reduce((groups, item) => {\n const packetName = item.caption.match(/\\S+\\s\\S+/)[0] // First two tokens, e.g. \"INST ADCS\" OF \"INST ADCS POSX\"\n const itemName = item.snippet.replace(`${packetName} `, '')\n const amendedItem = {\n caption: itemName,\n snippet: itemName,\n meta: 'item',\n }\n\n if (groups[packetName]) {\n groups[packetName].push(amendedItem)\n } else {\n groups[packetName] = [amendedItem]\n }\n return groups\n }, {})\n this.packets = Object.keys(this.groupedPacketData).map((packetName) => {\n return {\n caption: packetName,\n snippet: packetName,\n meta: 'packet',\n }\n })\n })\n }\n\n // Override the parent's getCompletions to take advantage of the grouping by packet done in the constructor\n getCompletions(_editor, session, position, _prefix, callback) {\n let matches = []\n const lineBeforeCursor = session.doc.$lines[position.row].slice(\n 0,\n position.column,\n )\n if (\n this.keywordExpressions.some((regex) => lineBeforeCursor.match(regex))\n ) {\n const foundPacket = Object.keys(this.groupedPacketData).find(\n (packetName) => lineBeforeCursor.includes(packetName),\n )\n if (foundPacket) {\n matches = this.groupedPacketData[foundPacket]\n } else {\n matches = this.packets\n }\n }\n\n callback(null, matches)\n }\n}\n","/*\n# Copyright 2021 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport { OpenC3Api } from '@openc3/js-common/services'\nimport { getKeywords, groupBy } from './utilities'\n\nconst toKeywordRegex = (word) => {\n // create regex to find the opening of a ruby method call\n const prefix = '(^|[{\\\\(\\\\s])' // Allowable characters before the method name: start of line or { or ( or a space\n const call = '((\\\\s.+)|(\\\\(.+\\\\)))' // A method call and its arguments\n return new RegExp(`${prefix}${word}${call}`)\n}\nconst interpolatedStringRegex = /\\{/\nconst alternateSyntaxRegex = /['\"],\\s?['\"]/\n\nexport default class MnemonicChecker {\n constructor() {\n this.api = new OpenC3Api()\n\n this.targets = {}\n this.api.get_target_names().then((response) => {\n response.forEach((target) => {\n this.targets[target] = {\n cmd: null,\n tlm: null,\n }\n })\n })\n\n this.cmdKeywordExpressions = []\n getKeywords('cmd').then((response) => {\n this.cmdKeywordExpressions = response.data.map(toKeywordRegex)\n })\n\n this.tlmKeywordExpressions = []\n getKeywords('tlm').then((response) => {\n this.tlmKeywordExpressions = response.data.map(toKeywordRegex)\n })\n }\n\n async checkText(text) {\n const { linesToCheck, linesToSkip } = text.split('\\n').reduce(\n (result, line, index) => {\n line = line.trim()\n if (line.match(/^#/)) {\n return result\n }\n const cmdMatch = this.cmdKeywordExpressions.reduce((found, regex) => {\n return found || line.match(regex)\n }, null)\n const tlmMatch = this.tlmKeywordExpressions.reduce((found, regex) => {\n return found || line.match(regex)\n }, null)\n if (!cmdMatch && !tlmMatch) {\n return result\n }\n\n let matchStr = cmdMatch || tlmMatch\n let matchStrLen = matchStr.length\n matchStr = matchStr[matchStrLen - 1]\n\n const mnemonicMatch = matchStr\n .substring(matchStr.match(/[\\(\\s)]/).index + 1) // Trim off leading `cmd(` or whatever\n .replace(/\\)+.*$/, '') // and the closing )s\n\n if (mnemonicMatch.match(interpolatedStringRegex)) {\n result.linesToSkip.push(index + 1)\n return result\n }\n\n const usingAlternateSyntax = !!mnemonicMatch.match(alternateSyntaxRegex)\n const mnemonicParts = mnemonicMatch.split(\n usingAlternateSyntax ? ',' : ' ',\n )\n if (mnemonicParts.length < 2) {\n return result // TODO: is this right? Maybe put an error on lineObj?\n }\n\n const mnemonic = {\n target: mnemonicParts[0],\n packet: mnemonicParts[1],\n }\n if (tlmMatch) {\n mnemonic.item = mnemonicParts[2]\n } else {\n const mnemonicParams = mnemonicParts.slice(2)\n if (usingAlternateSyntax) {\n mnemonic.params = mnemonicParams.map(\n (param) => param.split('=>')[0],\n )\n } else {\n mnemonic.params = mnemonicParams.filter((token, index) => index % 2)\n }\n }\n\n // Clean up the quotes and whitespace from the parts of the mnemonic\n for (const property in mnemonic) {\n if (typeof mnemonic[property] === 'string') {\n mnemonic[property] = mnemonic[property].replace(/['\"]/g, '').trim()\n } else {\n mnemonic[property] = mnemonic[property].map((item) =>\n item.replace(/['\"]/g, '').trim(),\n )\n }\n }\n\n result.linesToCheck.push({\n line,\n mnemonic,\n lineNumber: index + 1,\n })\n return result\n },\n { linesToCheck: [], linesToSkip: [] },\n )\n\n const problems = await this._checkLines(linesToCheck)\n return {\n skipped: linesToSkip.sort(),\n problems: problems.sort((a, b) => a.lineNumber - b.lineNumber),\n }\n }\n\n async _checkLines(linesToCheck) {\n const problemLines = []\n const targetGroups = groupBy(\n linesToCheck,\n (lineObj) => lineObj.mnemonic.target,\n )\n for (const target in targetGroups) {\n if (!this.targets[target]) {\n for (const lineObj of targetGroups[target]) {\n problemLines.push({\n ...lineObj,\n error: `Target \"${target}\" does not exist.`,\n })\n }\n continue\n }\n const packetGroups = groupBy(\n targetGroups[target],\n (lineObj) => lineObj.mnemonic.packet,\n )\n for (const packet in packetGroups) {\n for (const lineObj of packetGroups[packet]) {\n const cmdOrTlm = lineObj.mnemonic.item ? 'tlm' : 'cmd'\n if (!this.targets[target][cmdOrTlm]) {\n const method = lineObj.mnemonic.item\n ? 'get_all_tlm'\n : 'get_all_cmds'\n const response = await this.api[method](target)\n this.targets[target][cmdOrTlm] = response.reduce(\n (result, packetInfo) => {\n result[packetInfo.packet_name] = packetInfo.items.map(\n (item) => item.name,\n )\n return result\n },\n {},\n )\n }\n\n const items = this.targets[target][cmdOrTlm][packet]\n if (!items) {\n problemLines.push({\n ...lineObj,\n error: `${\n cmdOrTlm === 'tlm' ? 'Packet' : 'Command'\n } \"${target} ${packet}\" does not exist.`,\n })\n continue\n }\n if (lineObj.mnemonic.item) {\n if (!items.some((item) => item === lineObj.mnemonic.item)) {\n problemLines.push({\n ...lineObj,\n error: `Item \"${target} ${packet} ${lineObj.mnemonic.item}\" does not exist.`,\n })\n continue\n }\n } else {\n for (const param of lineObj.mnemonic.params) {\n if (!items.some((item) => item === param)) {\n problemLines.push({\n ...lineObj,\n error: `Command \"${target} ${packet}\" param \"${param}\" does not exist.`,\n })\n continue\n }\n }\n }\n }\n }\n }\n return problemLines\n }\n}\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nexport default class RegexAnnotator {\n // TODO: the eslint parser errors on these because of the #\n // Not sure if this naming is needed for the Ace editor or something?\n #id\n #editor\n #pattern\n #text\n #type\n\n constructor(editor, { pattern, text, type }) {\n this.#id = `regexAnnotator-${Math.floor(Math.random() * 10000000)}`\n this.#editor = editor\n this.#pattern = pattern\n this.#text = text\n this.#type = type\n }\n\n // Re-annotate the entire document\n refresh = () => {\n const session = this.#editor.session\n this.#removeAllAnnotations(session)\n const event = {\n lines: session.doc.$lines,\n action: 'insert',\n start: { row: 0 },\n end: { row: session.doc.$lines.length },\n }\n this.annotate(event, session)\n }\n\n // Update annotations for the changed lines\n annotate = ($event, session) => {\n if ($event.lines.length > 1) {\n // They created or deleted a line (or multiple lines), so first need to shift all the existing annotations\n switch ($event.action) {\n case 'insert':\n this.#shiftAnnotations(\n session,\n $event.start.row,\n $event.lines.length - 1,\n )\n break\n case 'remove':\n this.#shiftAnnotations(\n session,\n $event.start.row + 1,\n -$event.lines.length + 1,\n )\n break\n }\n }\n for (let row = $event.start.row; row <= $event.end.row; row++) {\n let column = session.doc.$lines[row]?.match(this.#pattern)?.index\n if (column !== undefined) {\n column !== 0 && (column += 1) // Account for a leading space that might've been included in the match\n this.#addAnnotation(session, {\n row,\n column, // I don't think our editor theme shows the column for annotations, but others do\n text: this.#text,\n type: this.#type,\n openc3Id: this.#id,\n })\n } else if ($event.action === 'remove') {\n this.#deleteAnnotationsForRow(session, row)\n }\n }\n }\n\n #addAnnotation = (session, newAnnotation) => {\n this.#deleteAnnotationsForRow(session, newAnnotation.row) // Reset this row first for the new annotation\n session.setAnnotations([...session.getAnnotations(), newAnnotation])\n }\n\n #deleteAnnotationsForRow = (session, row) => {\n session.setAnnotations(\n session\n .getAnnotations()\n .filter(\n (annotation) =>\n annotation.openc3Id !== this.#id || annotation.row !== row,\n ),\n )\n }\n\n #shiftAnnotations = (session, row, count) => {\n session.setAnnotations(\n session.getAnnotations().map((annotation) => {\n if (annotation.row > row) {\n annotation.row += count\n }\n return annotation\n }),\n )\n }\n\n #removeAllAnnotations = (session) => {\n session.setAnnotations(\n session\n .getAnnotations()\n .filter((annotation) => annotation.openc3Id !== this.#id),\n )\n }\n}\n","/*\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2022, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license \n# if purchased from OpenC3, Inc.\n*/\n\nimport RegexAnnotator from './regexAnnotator.js'\n\nexport default class SleepAnnotator extends RegexAnnotator {\n constructor(editor) {\n const prefix = '(^|[{\\\\s])' // Allowable characters before the keyword: start of line or { or a space\n const keyword = 'sleep' // The keyword this annotation looks for\n const suffix = '[\\\\(\\\\s]' // Allowable characters after the keyword: ( or a space\n super(editor, {\n pattern: new RegExp(`${prefix}${keyword}${suffix}`),\n text: 'Use `wait` instead of `sleep` in OpenC3 scripts', // because we override wait to make it work better, but not sleep\n type: 'warning',\n })\n }\n}\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Affero General Public License for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2024, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <template v-if=\"!inline\">\n <top-bar :menus=\"menus\" :title=\"title\" />\n <v-snackbar\n v-model=\"showAlert\"\n absolute\n :color=\"alertType\"\n :timeout=\"3000\"\n class=\"apply-top\"\n :style=\"classificationStyles\"\n >\n <v-icon> mdi-{{ alertType }} </v-icon>\n {{ alertText }}\n <template #actions=\"{ attrs }\">\n <v-btn\n variant=\"text\"\n text=\"Close\"\n v-bind=\"attrs\"\n @click=\"showAlert = false\"\n />\n </template>\n </v-snackbar>\n <v-snackbar\n v-model=\"showEditingToast\"\n absolute\n class=\"apply-top\"\n :style=\"classificationStyles\"\n :timeout=\"-1\"\n color=\"orange\"\n >\n <v-icon> mdi-pencil-off </v-icon>\n {{ lockedBy }} is editing this script. Editor is in read-only mode\n <template #actions=\"{ attrs }\">\n <v-btn\n variant=\"text\"\n v-bind=\"attrs\"\n color=\"danger\"\n text=\"Unlock\"\n data-test=\"unlock-button\"\n @click=\"confirmLocalUnlock\"\n />\n <v-btn\n variant=\"text\"\n text=\"Dismiss\"\n v-bind=\"attrs\"\n @click=\"\n () => {\n showEditingToast = false\n }\n \"\n />\n </template>\n </v-snackbar>\n <div class=\"grid\">\n <div\n v-for=\"def in screens\"\n :id=\"screenId(def.id)\"\n :key=\"def.id\"\n ref=\"gridItem\"\n class=\"item\"\n >\n <div class=\"item-content\">\n <openc3-screen\n :target=\"def.target\"\n :screen=\"def.screen\"\n :definition=\"def.definition\"\n :keywords=\"screenKeywords\"\n :initial-floated=\"true\"\n :initial-top=\"def.top\"\n :initial-left=\"def.left\"\n :initial-z=\"3\"\n :min-z=\"3\"\n :fix-floated=\"true\"\n :count=\"def.count\"\n @close-screen=\"closeScreen(def.id)\"\n @delete-screen=\"closeScreen(def.id)\"\n />\n </div>\n </div>\n </div>\n <v-card>\n <v-card-text>\n <suite-runner\n v-if=\"suiteRunner\"\n class=\"suite-runner\"\n :suite-map=\"suiteMap\"\n :disable-buttons=\"disableSuiteButtons\"\n :filename=\"fullFilename\"\n @button=\"suiteRunnerButton\"\n @loaded=\"doResize\"\n />\n <div id=\"sr-controls\">\n <v-row no-gutters justify=\"space-between\">\n <v-icon v-if=\"showDisconnect\" class=\"mt-2\" color=\"red\">\n mdi-connection\n </v-icon>\n <div class=\"d-flex align-center mr-1\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-if=\"!scriptId\"\n v-bind=\"props\"\n icon=\"mdi-cached\"\n variant=\"text\"\n density=\"compact\"\n :disabled=\"filename === NEW_FILENAME\"\n aria-label=\"Reload File\"\n @click=\"reloadFile\"\n />\n <v-btn\n v-else\n v-bind=\"props\"\n icon=\"mdi-arrow-left\"\n variant=\"text\"\n density=\"compact\"\n @click=\"backToNewScript\"\n />\n </template>\n <span v-if=\"!scriptId\"> Reload File </span>\n <span v-else> Back to New Script </span>\n </v-tooltip>\n </div>\n <v-tooltip\n location=\"bottom\"\n :text=\"filenameSelect\"\n :disabled=\"!filenameSelect || filenameSelect.length <= 45\"\n >\n <template v-slot:activator=\"{ props }\">\n <div v-bind=\"props\" style=\"width: 32rem\">\n <v-select\n id=\"filename\"\n v-model=\"filenameSelect\"\n :items=\"fileList\"\n :disabled=\"fileList.length <= 1\"\n label=\"Filename\"\n data-test=\"filename\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n @update:model-value=\"fileNameChanged\"\n />\n </div>\n </template>\n </v-tooltip>\n <v-text-field\n v-model=\"scriptId\"\n label=\"Script ID\"\n data-test=\"id\"\n class=\"shrink ml-2 script-state\"\n style=\"max-width: 100px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-text-field\n v-model=\"stateTimer\"\n label=\"Script State\"\n data-test=\"state\"\n class=\"shrink ml-2 script-state\"\n style=\"max-width: 120px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-progress-circular\n v-if=\"state === 'Connecting...'\"\n :size=\"40\"\n class=\"mx-2\"\n indeterminate\n color=\"primary\"\n />\n <div v-else style=\"width: 40px; height: 40px\" class=\"mx-2\"></div>\n\n <v-spacer />\n <div v-if=\"startOrGoButton === 'Start'\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n class=\"mr-2\"\n icon\n variant=\"text\"\n density=\"compact\"\n :disabled=\"envDisabled\"\n data-test=\"env-button\"\n aria-label=\"Script Environment\"\n @click=\"scriptEnvironment.show = !scriptEnvironment.show\"\n >\n <v-badge v-model=\"environmentModified\" floating dot>\n <v-icon icon=\"mdi-application-variable\" />\n </v-badge>\n </v-btn>\n </template>\n <span>\n Script Environment\n <template v-if=\"environmentModified\"> (modified) </template>\n </span>\n </v-tooltip>\n <v-btn\n class=\"mx-1\"\n color=\"primary\"\n text=\"Start\"\n data-test=\"start-button\"\n :disabled=\"startOrGoDisabled || !executeUser\"\n :hidden=\"suiteRunner\"\n @click=\"startHandler\"\n />\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n text=\"Go\"\n :disabled=\"startOrGoDisabled\"\n data-test=\"go-button\"\n @click=\"go\"\n />\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :text=\"pauseOrRetryButton\"\n :disabled=\"pauseOrRetryDisabled\"\n data-test=\"pause-retry-button\"\n @click=\"pauseOrRetry\"\n />\n <v-btn\n color=\"primary\"\n text=\"Stop\"\n data-test=\"stop-button\"\n :disabled=\"stopDisabled\"\n @click=\"stop\"\n />\n </div>\n </v-row>\n </div>\n </v-card-text>\n </v-card>\n <splitpanes horizontal style=\"height: 100%\" @resize=\"calcHeight\">\n <pane class=\"editorbox\" size=\"50\">\n <v-snackbar\n v-model=\"showSave\"\n absolute\n location=\"right\"\n :timeout=\"-1\"\n class=\"saving apply-top\"\n :style=\"classificationStyles\"\n >\n Saving...\n </v-snackbar>\n <pre\n ref=\"editor\"\n class=\"editor\"\n @contextmenu.prevent=\"showExecuteSelectionMenu\"\n ></pre>\n <v-menu v-model=\"executeSelectionMenu\" :target=\"[menuX, menuY]\">\n <v-list>\n <v-list-item title=\"Execute Selection\" @click=\"executeSelection\" />\n <v-list-item\n v-if=\"scriptId\"\n title=\"Goto Line\"\n @click=\"runFromCursor\"\n />\n <v-list-item\n v-if=\"!scriptId\"\n title=\"Run From Line\"\n @click=\"runFromCursor\"\n />\n <v-list-item\n v-if=\"!scriptId\"\n title=\"Clear Local Breakpoints\"\n @click=\"clearBreakpoints\"\n />\n <v-divider />\n <v-list-item\n title=\"Toggle Vim mode\"\n prepend-icon=\"extras:vim\"\n @click=\"toggleVimMode\"\n />\n </v-list>\n </v-menu>\n </pane>\n <pane id=\"messages\" ref=\"messagesDiv\" class=\"mt-2\">\n <div v-if=\"showDebug\" id=\"debug\" class=\"pa-0\">\n <v-row no-gutters>\n <v-btn\n color=\"primary\"\n style=\"width: 100px\"\n class=\"mr-4\"\n text=\"Step\"\n append-icon=\"mdi-step-forward\"\n :disabled=\"!scriptId\"\n data-test=\"step-button\"\n @click=\"step\"\n />\n <v-text-field\n ref=\"debug\"\n v-model=\"debug\"\n class=\"mb-2\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n label=\"Debug\"\n data-test=\"debug-text\"\n @keydown=\"debugKeydown\"\n />\n </v-row>\n </div>\n <script-log-messages\n id=\"log-messages\"\n v-model=\"messages\"\n @sort=\"messageSortOrder\"\n />\n </pane>\n </splitpanes>\n </template>\n\n <div v-if=\"inline\">\n <v-row>\n <v-col class=\"v-col-10\" style=\"margin: 0px; padding: 0px\">\n <pre\n ref=\"editor\"\n class=\"editor\"\n style=\"height: 200px\"\n @contextmenu.prevent=\"showExecuteSelectionMenu\"\n ></pre>\n </v-col>\n <v-col\n class=\"v-col-2\"\n style=\"\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: var(--color-background-surface-default);\n \"\n >\n <div v-if=\"startOrGoButton === 'Start'\">\n <v-btn\n class=\"mx-1\"\n color=\"primary\"\n text=\"Start\"\n data-test=\"start-button\"\n :disabled=\"startOrGoDisabled || !executeUser\"\n :hidden=\"suiteRunner\"\n @click=\"startHandler\"\n />\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n text=\"Go\"\n :disabled=\"startOrGoDisabled\"\n data-test=\"go-button\"\n @click=\"go\"\n />\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n :text=\"pauseOrRetryButton\"\n :disabled=\"pauseOrRetryDisabled\"\n data-test=\"pause-retry-button\"\n @click=\"pauseOrRetry\"\n />\n\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n text=\"Stop\"\n data-test=\"stop-button\"\n :disabled=\"stopDisabled\"\n @click=\"stop\"\n />\n </div>\n </v-col>\n </v-row>\n </div>\n\n <file-open-save-dialog\n v-if=\"fileOpen\"\n v-model=\"fileOpen\"\n type=\"open\"\n api-url=\"/script-api/scripts\"\n @file=\"setFile($event)\"\n @error=\"setError($event)\"\n @clear-temp=\"clearTemp($event)\"\n />\n <file-open-save-dialog\n v-if=\"showSaveAs\"\n v-model=\"showSaveAs\"\n type=\"save\"\n api-url=\"/script-api/scripts\"\n require-target-parent-dir\n :input-filename=\"filenameOrBlank\"\n @filename=\"saveAsFilename($event)\"\n @error=\"setError($event)\"\n @clear-temp=\"clearTemp($event)\"\n />\n <environment-dialog v-if=\"showEnvironment\" v-model=\"showEnvironment\" />\n <ask-dialog\n v-if=\"ask.show\"\n v-model=\"ask.show\"\n :question=\"ask.question\"\n :default=\"ask.default\"\n :password=\"ask.password\"\n :answer-required=\"ask.answerRequired\"\n @response=\"ask.callback\"\n />\n <file-dialog\n v-if=\"file.show\"\n v-model=\"file.show\"\n :title=\"file.title\"\n :message=\"file.message\"\n :multiple=\"file.multiple\"\n :filter=\"file.filter\"\n @response=\"fileDialogCallback\"\n />\n <information-dialog\n v-if=\"information.show\"\n v-model=\"information.show\"\n :title=\"information.title\"\n :text=\"information.text\"\n :width=\"information.width\"\n />\n <event-list-dialog\n v-if=\"inputMetadata.show\"\n v-model=\"inputMetadata.show\"\n :events=\"inputMetadata.events\"\n :time-zone=\"timeZone\"\n new-metadata\n @close=\"inputMetadata.callback\"\n />\n <overrides-dialog v-if=\"showOverrides\" v-model=\"showOverrides\" />\n <prompt-dialog\n v-if=\"prompt.show\"\n v-model=\"prompt.show\"\n :title=\"prompt.title\"\n :subtitle=\"prompt.subtitle\"\n :message=\"prompt.message\"\n :details=\"prompt.details\"\n :buttons=\"prompt.buttons\"\n :layout=\"prompt.layout\"\n :multiple=\"prompt.multiple\"\n @response=\"prompt.callback\"\n />\n <results-dialog\n v-if=\"results.show\"\n v-model=\"results.show\"\n :text=\"results.text\"\n />\n <script-environment-dialog\n v-if=\"scriptEnvironment.show\"\n v-model=\"scriptEnvironment.show\"\n :input-environment=\"scriptEnvironment.env\"\n @environment=\"environmentHandler\"\n />\n <simple-text-dialog\n v-model=\"showSuiteError\"\n title=\"Suite Analysis Error\"\n :text=\"suiteError\"\n :width=\"1000\"\n />\n <critical-cmd-dialog\n v-model=\"displayCriticalCmd\"\n :uuid=\"criticalCmdUuid\"\n :cmd-string=\"criticalCmdString\"\n :cmd-user=\"criticalCmdUser\"\n :persistent=\"true\"\n @status=\"promptDialogCallback\"\n />\n <v-bottom-sheet v-model=\"showScripts\">\n <v-sheet class=\"pb-11 pt-5 px-5\">\n <running-scripts\n v-if=\"showScripts\"\n :connect-in-new-tab=\"!!fileModified\"\n @disconnect=\"scriptDisconnect\"\n @close=\"\n () => {\n showScripts = false\n }\n \"\n />\n </v-sheet>\n </v-bottom-sheet>\n</template>\n\n<script>\nimport axios from 'axios'\nimport { format } from 'date-fns'\nimport { Splitpanes, Pane } from 'splitpanes'\nimport 'splitpanes/dist/splitpanes.css'\n\nimport { Api, Cable, OpenC3Api } from '@openc3/js-common/services'\nimport {\n AceEditorModes,\n AceEditorUtils,\n CriticalCmdDialog,\n EnvironmentDialog,\n FileOpenSaveDialog,\n Openc3Screen,\n SimpleTextDialog,\n TopBar,\n} from '@/components'\nimport { ClassificationBanners } from '@/tools/base'\nimport { fileIcon } from '@/util'\nimport { EventListDialog } from '@/tools/calendar'\n\nimport AskDialog from '@/tools/scriptrunner/Dialogs/AskDialog.vue'\nimport FileDialog from '@/tools/scriptrunner/Dialogs/FileDialog.vue'\nimport InformationDialog from '@/tools/scriptrunner/Dialogs/InformationDialog.vue'\nimport OverridesDialog from '@/tools/scriptrunner/Dialogs/OverridesDialog.vue'\nimport PromptDialog from '@/tools/scriptrunner/Dialogs/PromptDialog.vue'\nimport ResultsDialog from '@/tools/scriptrunner/Dialogs/ResultsDialog.vue'\nimport ScriptEnvironmentDialog from '@/tools/scriptrunner/Dialogs/ScriptEnvironmentDialog.vue'\nimport SuiteRunner from '@/tools/scriptrunner/SuiteRunner.vue'\nimport ScriptLogMessages from '@/tools/scriptrunner/ScriptLogMessages.vue'\nimport {\n CmdCompleter,\n TlmCompleter,\n MnemonicChecker,\n} from '@/tools/scriptrunner/autocomplete'\nimport { SleepAnnotator } from '@/tools/scriptrunner/annotations'\nimport RunningScripts from '@/tools/scriptrunner/RunningScripts.vue'\n\n// Matches target_file.rb TEMP_FOLDER\nconst TEMP_FOLDER = '__TEMP__'\nconst NEW_FILENAME = '<Untitled>'\nconst START = 'Start'\nconst GO = 'Go'\nconst PAUSE = 'Pause'\nconst RETRY = 'Retry'\n\nexport default {\n components: {\n FileOpenSaveDialog,\n Openc3Screen,\n EnvironmentDialog,\n Splitpanes,\n Pane,\n TopBar,\n AskDialog,\n FileDialog,\n InformationDialog,\n EventListDialog,\n OverridesDialog,\n PromptDialog,\n ResultsDialog,\n ScriptEnvironmentDialog,\n SimpleTextDialog,\n SuiteRunner,\n RunningScripts,\n ScriptLogMessages,\n CriticalCmdDialog,\n },\n mixins: [AceEditorModes, ClassificationBanners],\n beforeRouteUpdate: function (to, from, next) {\n if (to.params.id) {\n this.tryLoadRunningScript(to.params.id).then(next)\n } else {\n next()\n }\n },\n props: {\n inline: {\n type: Boolean,\n default: false,\n },\n body: {\n type: String,\n default: null,\n },\n },\n emits: ['alert', 'script-id'],\n data() {\n return {\n title: 'Script Runner',\n suiteRunner: false, // Whether to display the SuiteRunner GUI\n disableSuiteButtons: false,\n suiteMap: {\n // Useful for testing the various options in the SuiteRunner GUI\n // Suite: {\n // teardown: true,\n // groups: {\n // Group: {\n // setup: true,\n // cases: ['case1', 'case2', 'really_long_test_case_name3'],\n // },\n // ReallyLongGroupName: {\n // cases: ['case1', 'case2', 'case3'],\n // },\n // },\n // },\n },\n filenameSelect: null,\n currentFilename: null, // This is the currently shown filename while running\n showSave: false,\n showAlert: false,\n alertType: null,\n alertText: '',\n state: null,\n scriptId: null,\n startOrGoButton: START,\n startOrGoDisabled: false,\n envDisabled: false,\n pauseOrRetryButton: PAUSE,\n pauseOrRetryDisabled: false,\n stopDisabled: false,\n showEnvironment: false,\n showDebug: false,\n debug: '',\n debugHistory: [],\n debugHistoryIndex: 0,\n showDisconnect: false,\n files: {},\n breakpoints: {},\n enableStackTraces: false,\n filename: NEW_FILENAME,\n readOnlyUser: false,\n executeUser: true,\n saveAllowed: true,\n tempFilename: null,\n fileModified: '',\n fileOpen: false,\n lockedBy: null,\n showEditingToast: false,\n showSaveAs: false,\n areYouSure: false,\n subscription: null,\n cable: null,\n fatal: false,\n updateInterval: null,\n receivedEvents: [],\n messages: [],\n messagesNewestOnTop: true,\n maxArrayLength: 200,\n Range: ace.require('ace/range').Range,\n ask: {\n show: false,\n question: '',\n default: null,\n password: false,\n answerRequired: true,\n callback: () => {},\n },\n file: {\n show: false,\n message: '',\n directory: null,\n filter: '*',\n multiple: false,\n callback: () => {},\n },\n prompt: {\n show: false,\n title: '',\n subtitle: '',\n message: '',\n details: '',\n buttons: null,\n layout: 'horizontal',\n callback: () => {},\n },\n information: {\n show: false,\n title: '',\n text: [],\n width: '600',\n },\n inputMetadata: {\n show: false,\n events: [],\n callback: () => {},\n },\n results: {\n show: false,\n text: '',\n },\n scriptEnvironment: {\n show: false,\n env: [],\n },\n showSuiteError: false,\n suiteError: '',\n executeSelectionMenu: false,\n menuX: 0,\n menuY: 0,\n mnemonicChecker: new MnemonicChecker(),\n showScripts: false,\n showOverrides: false,\n activePromptId: '',\n api: null,\n timeZone: 'local',\n screens: [],\n screenKeywords: null,\n idCounter: 0,\n updateCounter: 0,\n recent: [],\n waitingInterval: null,\n waitingTime: 0,\n waitingStart: 0,\n criticalCmdUuid: null,\n criticalCmdString: null,\n criticalCmdUser: null,\n displayCriticalCmd: false,\n }\n },\n computed: {\n stateTimer: function () {\n if (this.state === 'waiting' || this.state === 'paused') {\n return `${this.state} ${this.waitingTime}s`\n }\n return this.state\n },\n // This is the list of files shown in the select dropdown\n fileList: function () {\n // this.files is the list of all files seen while running\n const filenames = Object.keys(this.files)\n filenames.push(this.fullFilename) // Make sure the currently shown filename is last\n return [...new Set(filenames)] // ensure unique\n },\n environmentModified: function () {\n return this.scriptEnvironment.env.length > 0\n },\n isLocked: function () {\n return !!this.lockedBy\n },\n // Returns the currently shown filename\n fullFilename: function () {\n if (this.currentFilename) return this.currentFilename\n // New filenames should not indicate modified\n if (this.filename === NEW_FILENAME) return NEW_FILENAME\n return `${this.filename} ${this.fileModified}`.trim()\n },\n // It's annoying for people (and tests) to clear the <Untitled>\n // when saving a new file so replace with blank\n // This makes sure that string doesn't show up in the dialog\n filenameOrBlank: function () {\n return this.filename === NEW_FILENAME ? '' : this.filename\n },\n menus: function () {\n return [\n {\n label: 'File',\n items: [\n {\n label: 'New File',\n icon: 'mdi-file-plus',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.newFile()\n },\n },\n {\n label: 'New Suite',\n icon: 'mdi-file-document-plus',\n disabled: this.scriptId || this.readOnlyUser,\n subMenu: [\n {\n label: 'Ruby',\n icon: 'mdi-language-ruby',\n command: () => {\n this.newRubyTestSuite()\n },\n },\n {\n label: 'Python',\n icon: 'mdi-language-python',\n command: () => {\n this.newPythonTestSuite()\n },\n },\n ],\n },\n {\n label: 'Open File',\n icon: 'mdi-folder-open',\n disabled: this.scriptId,\n command: () => {\n this.openFile()\n },\n },\n {\n label: 'Open Recent',\n icon: 'mdi-folder-open',\n disabled: this.scriptId,\n subMenu: this.recent,\n },\n {\n divider: true,\n },\n {\n label: 'Save File',\n icon: 'mdi-content-save',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.saveFile()\n },\n },\n {\n label: 'Save As...',\n icon: 'mdi-content-save',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.saveAs()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Download',\n icon: 'mdi-cloud-download',\n disabled: this.scriptId,\n command: () => {\n this.download()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Delete File',\n icon: 'mdi-delete',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.delete()\n },\n },\n ],\n },\n {\n label: 'Edit',\n items: [\n {\n label: 'Find',\n icon: 'mdi-magnify',\n command: () => {\n this.editor.execCommand('find')\n },\n },\n {\n label: 'Replace',\n icon: 'mdi-find-replace',\n disabled: this.scriptId,\n command: () => {\n this.editor.execCommand('replace')\n },\n },\n {\n label: 'Set Line Delay',\n icon: 'mdi-invoice-text-clock',\n disabled: this.scriptId,\n command: () => {\n this.$dialog.open({\n title: 'Info',\n text:\n 'You can set the line delay in seconds using the api method set_line_delay().<br/><br/>' +\n 'The default line delay is 0.1 seconds between lines. ' +\n 'Adding set_line_delay(0) to the top of your script will execute the script at maximum speed. ' +\n 'However, this can make it difficult to see and pause the script. ' +\n 'Executing set_line_delay(1) will cause a 1 second delay between lines.',\n okText: 'OK',\n okClass: 'primary',\n validateText: null,\n cancelText: null,\n html: true,\n })\n },\n },\n ],\n },\n {\n label: 'Script',\n items: [\n {\n label: 'Execution Status',\n icon: 'mdi-run',\n command: () => {\n this.showScripts = true\n },\n },\n {\n divider: true,\n },\n {\n label: 'Global Environment',\n icon: 'mdi-library',\n disabled: this.scriptId,\n command: () => {\n this.showEnvironment = !this.showEnvironment\n },\n },\n {\n label: 'Metadata',\n icon: 'mdi-calendar',\n disabled: this.scriptId,\n command: () => {\n this.inputMetadata.callback = () => {}\n this.showMetadata()\n },\n },\n {\n label: 'Overrides',\n icon: 'mdi-swap-horizontal',\n command: () => {\n this.showOverrides = true\n },\n },\n {\n divider: true,\n },\n {\n label: 'Syntax Check',\n icon: 'mdi-file-check',\n disabled: this.scriptId,\n command: () => {\n this.syntaxCheck()\n },\n },\n {\n label: 'Mnemonic Check',\n icon: 'mdi-spellcheck',\n disabled: this.scriptId,\n command: () => {\n this.checkMnemonics()\n },\n },\n {\n label: 'Instrumented Script',\n icon: 'mdi-code-braces-box',\n disabled: this.scriptId,\n command: () => {\n this.showInstrumented()\n },\n },\n {\n label: 'Call Stack',\n icon: 'mdi-format-list-numbered',\n disabled: !this.scriptId,\n command: () => {\n this.showCallStack()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Toggle Debug',\n icon: 'mdi-bug',\n command: () => {\n this.toggleDebug()\n },\n },\n {\n label: 'Toggle Disconnect',\n icon: 'mdi-connection',\n disabled: this.scriptId,\n command: () => {\n this.toggleDisconnect()\n },\n },\n {\n label: 'Enable Stack Traces',\n checkbox: true,\n checked: this.enableStackTraces,\n disabled: this.scriptId,\n command: () => {\n // Toggling the checkbox closes the menu so no need\n // to check state, just toggle existing value\n this.enableStackTraces = !this.enableStackTraces\n },\n },\n {\n divider: true,\n },\n {\n label: 'Delete All Breakpoints',\n icon: 'mdi-delete-circle-outline',\n disabled: this.scriptId,\n command: () => {\n this.deleteAllBreakpoints()\n },\n },\n ],\n },\n ]\n },\n },\n watch: {\n isLocked: function (val) {\n this.showEditingToast = val\n if (!this.suiteRunner) {\n this.startOrGoDisabled = val\n }\n if (this.readOnlyUser == false && val == false) {\n this.editor.setReadOnly(val)\n } else {\n this.editor.setReadOnly(true)\n }\n },\n fullFilename: function (filename) {\n this.filenameSelect = filename\n if (!this.inline) {\n if (filename === NEW_FILENAME) {\n localStorage.removeItem('script_runner__filename')\n } else {\n localStorage['script_runner__filename'] = filename\n }\n }\n },\n },\n created: async function () {\n // Ensure Offline Access Is Setup For the Current User\n this.api = new OpenC3Api()\n this.api.ensure_offline_access()\n this.api\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch((error) => {\n // Do nothing\n })\n\n // Make NEW_FILENAME available to the template\n this.NEW_FILENAME = NEW_FILENAME\n\n let user = OpenC3Auth.user()\n let roles = OpenC3Auth.userroles()\n this.readOnlyUser = true\n this.executeUser = false\n for (let role of roles) {\n if (role == 'viewer') {\n continue\n }\n if (role == 'admin' || role == 'operator') {\n this.readOnlyUser = false\n this.executeUser = true\n } else if (role == 'runner') {\n this.executeUser = true\n } else {\n await Api.get(`/openc3-api/roles/${role}`).then((response) => {\n if (\n response.data !== null &&\n response.data.permissions !== undefined\n ) {\n if (\n response.data.permissions.some(\n (i) => i.permission == 'script_edit',\n )\n ) {\n this.readOnlyUser = false\n }\n if (\n response.data.permissions.some(\n (i) => i.permission == 'script_run',\n )\n ) {\n this.executeUser = true\n }\n }\n })\n }\n }\n // Output the userinfo for use in the SuiteRunner component\n if (!this.inline) {\n localStorage['script_runner__userinfo'] = JSON.stringify({\n name: user['preferred_username'],\n readOnly: this.readOnlyUser,\n execute: this.executeUser,\n })\n }\n if (this.readOnlyUser == true) {\n this.alertType = 'info'\n let text = `User ${user['preferred_username']} is read only`\n if (this.executeUser) {\n text += ' but can execute scripts'\n }\n this.alertText = text\n this.showAlert = true\n }\n\n Api.get('/openc3-api/autocomplete/keywords/screen').then((response) => {\n this.screenKeywords = response.data\n })\n\n if (this.inline) {\n this.readOnly = true\n }\n },\n mounted: async function () {\n this.editor = ace.edit(this.$refs.editor)\n this.editor.setTheme('ace/theme/twilight')\n const RubyMode = this.buildRubyMode()\n const PythonMode = this.buildPythonMode()\n this.rubyMode = new RubyMode()\n this.pythonMode = new PythonMode()\n this.editor.session.setMode(this.rubyMode)\n this.editor.session.setTabSize(2)\n this.editor.session.setUseWrapMode(true)\n this.editor.$blockScrolling = Infinity\n this.editor.setOption('enableBasicAutocompletion', true)\n this.editor.setOption('enableLiveAutocompletion', true)\n this.editor.completers = [new CmdCompleter(), new TlmCompleter()]\n this.editor.setHighlightActiveLine(false)\n AceEditorUtils.applyVimModeIfEnabled(this.editor, { saveFn: this.saveFile })\n this.editor.focus()\n\n this.editor.on('guttermousedown', this.toggleBreakpoint)\n // We listen to tokenizerUpdate rather than change because this\n // is the background process that updates as changes are processed\n // while change fires immediately before the UndoManager is updated.\n this.editor.session.on('tokenizerUpdate', this.onChange)\n if (this.readOnlyUser) {\n this.editor.setReadOnly(true)\n this.editor.renderer.$cursorLayer.element.style.display = 'none'\n }\n\n const sleepAnnotator = new SleepAnnotator(this.editor)\n this.editor.session.on('change', ($event, session) => {\n sleepAnnotator.annotate($event, session)\n this.updateBreakpoints($event, session)\n })\n\n this.editor.container.addEventListener('resize', this.doResize)\n this.editor.container.addEventListener('keydown', this.keydown)\n\n // Allow the charts to dynamically resize when the window resizes\n window.addEventListener('resize', this.calcHeight)\n this.calcHeight()\n\n this.cable = new Cable('/script-api/cable')\n\n if (!this.inline && localStorage['script_runner__recent']) {\n this.recent = JSON.parse(localStorage['script_runner__recent'])\n // Rebuild the command since that doesn't get stringified\n this.recent = this.recent.map((item) => ({\n ...item,\n command: async (event) => {\n this.filename = event.label\n await this.reloadFile()\n },\n }))\n }\n if (!this.inline) {\n if (this.$route.query?.file) {\n this.filename = this.$route.query.file\n await this.reloadFile()\n } else if (this.$route.params?.id) {\n await this.tryLoadRunningScript(this.$route.params.id)\n } else {\n this.scriptId = sessionStorage.getItem('script_runner__script_id')\n if (this.scriptId) {\n await this.tryLoadRunningScript(this.scriptId)\n } else if (localStorage['script_runner__filename']) {\n this.filename = localStorage['script_runner__filename']\n await this.reloadFile(false)\n }\n }\n } else {\n if (this.body) {\n this.editor.setValue(this.body)\n this.editor.clearSelection()\n }\n }\n this.updateInterval = setInterval(async () => {\n this.processReceived()\n }, 100) // Every 100ms\n },\n beforeUnmount() {\n if (this.scriptId && !this.inline) {\n sessionStorage.setItem('script_runner__script_id', this.scriptId)\n }\n this.editor.destroy()\n this.editor.container.remove()\n },\n unmounted() {\n this.unlockFile()\n if (this.updateInterval != null) {\n clearInterval(this.updateInterval)\n }\n if (this.subscription) {\n this.subscription.unsubscribe()\n this.subscription = null\n }\n this.cable.disconnect()\n },\n methods: {\n toggleVimMode() {\n AceEditorUtils.toggleVimMode(this.editor)\n },\n doResize() {\n this.editor.resize()\n // nextTick allows the resize to work correctly\n // when we remove the SuiteRunner chrome\n this.$nextTick(() => {\n this.calcHeight()\n })\n },\n calcHeight() {\n const editor = document.getElementsByClassName('editorbox')[0]\n const h = Math.max(\n document.documentElement.offsetHeight,\n window.innerHeight || 0,\n )\n let editorHeight = 0\n if (editor) {\n editorHeight = editor.offsetHeight\n }\n let suitesHeight = 0\n const suites = document.getElementsByClassName('suite-runner')[0]\n if (suites) {\n suitesHeight = suites.offsetHeight\n }\n let logMessages = document.getElementById('script-log-messages')\n if (logMessages) {\n logMessages.style.height = `${h - editorHeight - suitesHeight}px`\n }\n },\n scriptDisconnect() {\n if (this.subscription) {\n this.subscription.unsubscribe()\n this.subscription = null\n }\n this.receivedEvents.length = 0 // Clear any unprocessed events\n },\n showMetadata() {\n Api.get('/openc3-api/metadata').then((response) => {\n // TODO: This is how Calendar creates new metadata items via makeMetadataEvent\n this.inputMetadata.events = response.data.map((event) => {\n return {\n name: 'Metadata',\n start: new Date(event.start * 1000),\n end: new Date(event.start * 1000),\n color: event.color,\n type: event.type,\n timed: true,\n metadata: event,\n }\n })\n this.inputMetadata.show = true\n })\n },\n messageSortOrder(order) {\n // See ScriptLogMessages for these strings\n if (order === 'Newest on Top' && this.messagesNewestOnTop === false) {\n this.messagesNewestOnTop = true\n this.messages.reverse()\n } else if (\n order === 'Newest on Bottom' &&\n this.messagesNewestOnTop === true\n ) {\n this.messagesNewestOnTop = false\n this.messages.reverse()\n }\n },\n // This only gets called when the user changes the filename dropdown\n // Or when a user hits Go\n fileNameChanged(filename) {\n // Split off the '*' which indicates modified\n filename = filename.split('*')[0]\n this.editor.setValue(this.files[filename].content)\n this.restoreBreakpoints(filename)\n this.editor.clearSelection()\n this.removeAllMarkers()\n this.editor.session.addMarker(\n new this.Range(\n this.files[filename].lineNo - 1,\n 0,\n this.files[filename].lineNo - 1,\n 1,\n ),\n `${this.state}Marker`,\n 'fullLine',\n )\n this.editor.gotoLine(this.files[filename].lineNo)\n },\n tryLoadRunningScript: function (id) {\n return Api.get(`/script-api/running-script/${id}`)\n .then((response) => {\n if (response.data) {\n let state = response.data.state\n if (\n state !== 'completed' &&\n state !== 'completed_errors' &&\n state !== 'stopped' &&\n state !== 'crashed' &&\n state !== 'killed'\n ) {\n this.filename = response.data.filename\n this.tryLoadSuites(response)\n this.initScriptStart()\n this.scriptStart(id)\n } else {\n this.$notify.caution({\n title: `Script ${id} has already completed`,\n body: 'Check the Completed Scripts below ...',\n })\n this.scriptComplete()\n this.showScripts = true\n }\n } else {\n throw new Error(`Unable to load state for running script ${id}`) // Get into the following catch block because this should be handled the same as an error like 404\n }\n })\n .catch((error) => {\n this.$notify.caution({\n title: `Running Script ${id} not found`,\n body: 'Check the Completed Scripts below ...',\n })\n this.scriptComplete()\n this.showScripts = true\n })\n },\n tryLoadSuites: function (response) {\n if (response.data.suite_runner) {\n this.startOrGoDisabled = true\n this.suiteRunner = true\n this.suiteMap = JSON.parse(response.data.suite_runner)\n }\n this.doResize()\n },\n showExecuteSelectionMenu: function ($event) {\n this.menuX = $event.pageX\n this.menuY = $event.pageY\n this.executeSelectionMenu = true\n },\n runFromCursor: function () {\n const start_row = this.editor.getCursorPosition().row + 1\n if (!this.scriptId) {\n this.start(null, null, start_row)\n } else {\n Api.post(\n `/script-api/running-script/${this.scriptId}/executewhilepaused`,\n {\n data: {\n args: [this.filenameSelect, start_row],\n },\n },\n )\n }\n },\n executeSelection: function () {\n const range = this.editor.getSelectionRange()\n let start_row = range.start.row + 1\n let end_row = range.end.row + 1\n if (range.end.column === 0) {\n end_row -= 1\n }\n if (!this.scriptId) {\n this.start(null, null, start_row, end_row)\n } else {\n Api.post(\n `/script-api/running-script/${this.scriptId}/executewhilepaused`,\n {\n data: {\n args: [this.filenameSelect, start_row, end_row],\n },\n },\n )\n }\n },\n clearBreakpoints: function () {\n this.editor.session.clearBreakpoints()\n },\n toggleBreakpoint: function ($event) {\n // Don't allow setting breakpoints while running\n if (!this.scriptId) {\n const row = $event.getDocumentPosition().row\n if ($event.editor.session.getBreakpoints(row, 0)[row]) {\n $event.editor.session.clearBreakpoint(row)\n } else {\n $event.editor.session.setBreakpoint(row)\n }\n }\n },\n updateBreakpoints: function ($event, session) {\n if ($event.lines.length <= 1) {\n return\n }\n const rowsToUpdate = this.getBreakpointRows(session).filter(\n (row) =>\n ($event.start.column === 0 && row === $event.start.row) ||\n row > $event.start.row,\n )\n let rowsToDelete = []\n let offset = 0\n switch ($event.action) {\n case 'insert':\n offset = $event.lines.length - 1\n rowsToUpdate.reverse() // shift the lower ones down out of the way first\n break\n case 'remove':\n offset = -$event.lines.length + 1\n rowsToDelete = [...Array($event.lines.length).keys()].map(\n (row) => row + $event.start.row,\n )\n break\n }\n rowsToUpdate.forEach((row) => {\n session.clearBreakpoint(row)\n if (!rowsToDelete.includes(row)) {\n session.setBreakpoint(row + offset)\n }\n })\n },\n getBreakpointRows: function (session = this.editor.session) {\n return session\n .getBreakpoints()\n .map((breakpoint, row) => breakpoint && row) // [empty, 'ace_breakpoint', 'ace_breakpoint', empty] -> [empty, 1, 2, empty]\n .filter(Number.isInteger) // [empty, 1, 2, empty] -> [1, 2]\n },\n restoreBreakpoints: function (filename) {\n this.clearBreakpoints()\n this.breakpoints[filename]?.forEach((breakpoint) => {\n this.editor.session.setBreakpoint(breakpoint)\n })\n },\n deleteAllBreakpoints: function () {\n this.$dialog\n .confirm('Permanently delete all breakpoints for ALL scripts?', {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.delete('/script-api/breakpoints/delete/all')\n })\n .then((response) => {\n this.clearBreakpoints()\n })\n },\n suiteRunnerButton(event) {\n if (this.startOrGoButton === START) {\n this.start(event, 'suiteRunner')\n } else {\n this.go(event, 'suiteRunner')\n }\n },\n async keydown(event) {\n // Don't ever save if running or readonly\n if (this.scriptId || this.editor.getReadOnly() === true) {\n return\n }\n // NOTE: Chrome does not allow overriding Ctrl-N, Ctrl-Shift-N, Ctrl-T, Ctrl-Shift-T, Ctrl-W\n // NOTE: metaKey == Command on Mac\n if (\n (event.metaKey || event.ctrlKey) &&\n event.keyCode === 'S'.charCodeAt(0)\n ) {\n if (event.shiftKey) {\n event.preventDefault()\n this.saveAs()\n } else {\n event.preventDefault()\n await this.saveFile()\n }\n }\n },\n onChange(event) {\n // Don't track changes when we're running or read-only (locked)\n if (this.scriptId || this.editor.getReadOnly() === true) {\n return\n }\n if (this.editor.session.getUndoManager().canUndo()) {\n this.fileModified = '*'\n } else {\n this.fileModified = ''\n }\n },\n checkMnemonics: function () {\n let filename = this.filename\n if (this.filename !== NEW_FILENAME) {\n // Check if the extension is not .rb or .py\n if (!(filename.endsWith('.rb') || filename.endsWith('.py'))) {\n Api.post(`/script-api/scripts/${this.filename}/mnemonics`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n let alertText = ''\n alertText += `<strong>${response.data.title}</strong><br/><br/>`\n alertText += JSON.parse(response.data.description)\n this.$dialog.alert(alertText.trim(), { html: true })\n return\n })\n }\n }\n this.mnemonicChecker\n .checkText(this.editor.getValue())\n .then(({ skipped, problems }) => {\n let alertText = ''\n if (problems.length) {\n const problemText = problems\n .map((problem) => `${problem.lineNumber}: ${problem.error}`)\n .join('<br/>')\n alertText += `<strong>The following lines have problems:</strong><br/>${problemText}<br/><br/>`\n }\n if (skipped.length) {\n alertText +=\n '<strong>Mnemonics with string interpolation were not checked.</strong>'\n }\n if (alertText === '') {\n alertText = '<strong>Everything looks good!</strong>'\n }\n this.$dialog.alert(alertText.trim(), { html: true })\n })\n },\n initScriptStart() {\n this.disableSuiteButtons = true\n this.startOrGoDisabled = true\n this.envDisabled = true\n this.pauseOrRetryDisabled = true\n this.stopDisabled = true\n this.state = 'Connecting...'\n this.startOrGoButton = GO\n this.editor.setReadOnly(true)\n },\n scriptStart(id) {\n this.$emit('script-id', id)\n this.scriptId = id\n this.cable\n .createSubscription(\n 'RunningScriptChannel',\n window.openc3Scope,\n {\n received: (data) => this.received(data),\n },\n {\n id: this.scriptId,\n },\n )\n .then((subscription) => {\n this.subscription = subscription\n })\n },\n async scriptComplete() {\n // Ensure stopped, if the script has an error we don't get the server stopped message\n this.state = 'stopped'\n this.fatal = false\n this.scriptId = null // No current scriptId\n sessionStorage.removeItem('script_runner__script_id')\n this.currentFilename = null // No current file running\n this.files = {} // Clear the file cache\n // Make sure we process no more events\n if (this.subscription) {\n await this.subscription.unsubscribe()\n this.subscription = null\n }\n this.receivedEvents.length = 0 // Clear any unprocessed events\n\n await this.reloadFile() // Make sure the right file is shown\n // We may have changed the contents (if there were sub-scripts)\n // so don't let the undo manager think this is a change\n this.editor.session.getUndoManager().reset()\n if (this.readOnlyUser == false) {\n this.editor.setReadOnly(false)\n }\n\n // Lastly enable the buttons so another script can start\n this.disableSuiteButtons = false\n this.startOrGoButton = START\n this.pauseOrRetryButton = PAUSE\n // Disable start if suiteRunner\n this.startOrGoDisabled = this.suiteRunner\n this.envDisabled = false\n this.pauseOrRetryDisabled = true\n this.stopDisabled = true\n },\n environmentHandler: function (event) {\n this.scriptEnvironment.env = event\n },\n startHandler: function () {\n this.start()\n },\n async start(\n event = null,\n suiteRunner = null,\n line_no = null,\n end_line_no = null,\n ) {\n // Initialize variables and disable buttons before actually posting.\n // This prevents delays in the backend from delaying frontend changes\n // like disabling start which could allow users to click start twice.\n this.initScriptStart()\n await this.saveFile('start')\n this.saveAllowed = false\n let filename = this.filename\n if (this.filename === NEW_FILENAME) {\n // NEW_FILENAME so use tempFilename created by saveFile()\n filename = this.tempFilename\n }\n let url = `/script-api/scripts/${filename}/run`\n if (this.showDisconnect) {\n url += '/disconnect'\n }\n let env = this.scriptEnvironment.env\n if (this.enableStackTraces) {\n env = env.concat({\n key: 'OPENC3_FULL_BACKTRACE',\n value: '1',\n })\n }\n let data = {\n environment: env,\n }\n if (suiteRunner) {\n // TODO 7.0: Should suiteRunner be snake case?\n data['suiteRunner'] = event\n }\n if (line_no !== null) {\n data['line_no'] = line_no\n }\n if (end_line_no !== null) {\n data['end_line_no'] = end_line_no\n }\n Api.post(url, { data })\n .then((response) => {\n this.scriptStart(response.data)\n })\n .catch((error) => {\n this.scriptComplete()\n })\n },\n go() {\n // Ensure we're on the correct filename when we hit go\n // They may have changed it using the drop down\n this.filenameSelect = this.currentFilename\n this.fileNameChanged(this.currentFilename)\n Api.post(`/script-api/running-script/${this.scriptId}/go`)\n },\n pauseOrRetry() {\n if (this.pauseOrRetryButton === PAUSE) {\n Api.post(`/script-api/running-script/${this.scriptId}/pause`)\n } else {\n this.pauseOrRetryButton = PAUSE\n Api.post(`/script-api/running-script/${this.scriptId}/retry`)\n }\n },\n stop() {\n // We previously encountered a fatal error so remove the marker\n // and cleanup by calling scriptComplete() because the script\n // is already stopped in the backend\n if (this.fatal) {\n this.removeAllMarkers()\n this.scriptComplete()\n } else {\n Api.post(`/script-api/running-script/${this.scriptId}/stop`)\n }\n },\n step() {\n Api.post(`/script-api/running-script/${this.scriptId}/step`)\n },\n // This is called by processLine no matter the current state\n handleWaiting() {\n // First check if we're not waiting and if so clear the interval\n if (this.state !== 'waiting' && this.state !== 'paused') {\n this.clearWaiting()\n } else if (this.waitingInterval !== null) {\n // If we're waiting and the interval is active then nothing to do\n return\n }\n this.waitingStart = Date.now()\n // Create an interval to count every second\n this.waitingInterval = setInterval(() => {\n this.waitingTime = Math.round((Date.now() - this.waitingStart) / 1000)\n }, 1000)\n },\n clearWaiting() {\n this.waitingTime = 0\n clearInterval(this.waitingInterval)\n this.waitingInterval = null\n },\n processLine(data) {\n if (data.filename && data.filename !== this.currentFilename) {\n if (!this.files[data.filename]) {\n // We don't have the contents of the running file (probably because connected to running script)\n // Set the contents initially to an empty string so we don't start slamming the API\n this.files[data.filename] = { content: '', lineNo: 0 }\n\n // Request the script we need\n Api.get(`/script-api/scripts/${data.filename}`)\n .then((response) => {\n // Success - Save the script text and mark the currentFilename as null\n // so it will get loaded in on the next line executed\n this.files[data.filename] = {\n content: response.data.contents,\n lineNo: 0,\n }\n this.breakpoints[data.filename] = response.data.breakpoints\n this.restoreBreakpoints(data.filename)\n this.currentFilename = null\n })\n .catch((err) => {\n // Error - Restore the file contents to null so we'll try the API again on the next line\n this.files[data.filename] = null\n })\n } else {\n this.currentFilename = data.filename\n this.editor.setValue(this.files[data.filename].content)\n this.restoreBreakpoints(data.filename)\n this.editor.clearSelection()\n }\n }\n this.state = data.state\n const markers = this.editor.session.getMarkers()\n switch (this.state) {\n case 'running':\n this.handleWaiting()\n this.startOrGoDisabled = false\n this.pauseOrRetryDisabled = false\n this.stopDisabled = false\n this.pauseOrRetryButton = PAUSE\n\n this.removeAllMarkers()\n this.editor.session.addMarker(\n new this.Range(data.line_no - 1, 0, data.line_no - 1, 1),\n 'runningMarker',\n 'fullLine',\n )\n this.editor.gotoLine(data.line_no)\n this.files[data.filename].lineNo = data.line_no\n break\n case 'crashed':\n this.fatal = true\n // Deliberate fall through (no break)\n case 'error':\n this.pauseOrRetryButton = RETRY\n // Deliberate fall through (no break)\n case 'breakpoint':\n case 'waiting':\n case 'paused':\n this.handleWaiting()\n if (this.state == 'fatal') {\n this.startOrGoDisabled = true\n this.pauseOrRetryDisabled = true\n } else {\n this.startOrGoDisabled = false\n this.pauseOrRetryDisabled = false\n }\n this.stopDisabled = false\n let existing = Object.keys(markers).filter(\n (key) => markers[key].clazz === `${this.state}Marker`,\n )\n if (existing.length === 0) {\n this.removeAllMarkers()\n let line = data.line_no > 0 ? data.line_no : 1\n this.editor.session.addMarker(\n new this.Range(line - 1, 0, line - 1, 1),\n `${this.state}Marker`,\n 'fullLine',\n )\n this.editor.gotoLine(line)\n // Fatal errors don't always have a filename set\n if (data.filename) {\n this.files[data.filename].lineNo = line\n }\n }\n break\n default:\n break\n }\n },\n processReceived() {\n let count = 0\n for (let data of this.receivedEvents) {\n count += 1\n // console.log(data) // Uncomment for debugging\n let index = 0\n switch (data.type) {\n case 'file':\n this.files[data.filename] = { content: data.text, lineNo: 0 }\n this.breakpoints[data.filename] = data.breakpoints\n if (this.currentFilename === data.filename) {\n this.restoreBreakpoints(data.filename)\n }\n break\n case 'line':\n // A further optimization would be to only process the last line of a batch\n // However with some testing this did not seem to make much difference\n // and was preventing the highlighting of the final line of a script because\n // the last line of the final batch was line_number 0 with state stopped\n // and that would never highlight the actual final line\n this.processLine(data)\n break\n case 'output':\n // data.line can consist of multiple lines split by newlines\n // thus we split and only output if the content is not empty\n for (const line of data.line.split('\\n')) {\n if (line) {\n if (this.messagesNewestOnTop) {\n this.messages.unshift({ message: line })\n } else {\n this.messages.push({ message: line })\n }\n }\n }\n while (this.messages.length > this.maxArrayLength) {\n this.messages.pop()\n }\n break\n case 'script':\n this.handleScript(data)\n break\n case 'report':\n this.results.text = data.report\n this.results.show = true\n break\n case 'complete':\n // Don't complete on fatal because we just sit there on the fatal line\n if (!this.fatal) {\n this.removeAllMarkers()\n this.scriptComplete()\n }\n break\n case 'step':\n this.showDebug = true\n break\n case 'screen':\n let found = false\n let definition = {}\n for (screen of this.screens) {\n if (\n screen.target == data.target_name &&\n screen.screen == data.screen_name\n ) {\n definition = screen\n found = true\n break\n }\n index += 1\n }\n definition.target = data.target_name\n definition.screen = data.screen_name\n definition.definition = data.definition\n if (data.x) {\n definition.left = data.x\n } else {\n definition.left = 0\n }\n if (data.y) {\n definition.top = data.y\n } else {\n definition.top = 0\n }\n definition.count = this.updateCounter++\n if (!found) {\n definition.id = this.idCounter++\n this.screens[this.screens.length] = definition\n } else {\n this.screens[index] = definition\n }\n break\n case 'clearscreen':\n for (screen of this.screens) {\n if (\n screen.target == data.target_name &&\n screen.screen == data.screen_name\n ) {\n this.screens.splice(index, 1)\n break\n }\n index += 1\n }\n break\n case 'clearallscreens':\n this.screens = []\n break\n case 'downloadfile':\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = window.location.origin + data.url\n link.setAttribute('download', data.filename)\n link.click()\n break\n default:\n // console.log('Unexpected ActionCable message')\n // console.log(data)\n break\n }\n }\n\n // Remove all the events we processed\n this.receivedEvents.splice(0, count)\n },\n received(data) {\n this.cable.recordPing()\n this.receivedEvents.push(data)\n },\n promptDialogCallback(value) {\n this.prompt.show = false\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: this.prompt.method,\n answer: value,\n prompt_id: this.activePromptId,\n multiple: this.prompt.multiple,\n },\n })\n },\n handleScript(data) {\n if (data.prompt_complete) {\n this.activePromptId = ''\n this.prompt.show = false\n this.ask.show = false\n return\n }\n this.activePromptId = data.prompt_id\n this.prompt.method = data.method // Set it here since all prompts use this\n this.prompt.layout = 'horizontal' // Reset the layout since most are horizontal\n this.prompt.title = 'Prompt'\n this.prompt.subtitle = ''\n this.prompt.details = ''\n this.prompt.buttons = []\n this.prompt.multiple = null\n switch (data.method) {\n case 'ask':\n case 'ask_string':\n // Reset values since this dialog can be reused\n this.ask.default = null\n this.ask.answerRequired = true\n this.ask.password = false\n this.ask.question = data.args[0]\n // If the second parameter is not true or false it indicates a default value\n if (data.args[1] && data.args[1] !== true && data.args[1] !== false) {\n this.ask.default = data.args[1].toString()\n } else if (data.args[1] === true) {\n // If the second parameter is true it means no value is required to be entered\n this.ask.answerRequired = false\n }\n // The third parameter indicates a password textfield\n if (data.args[2] === true) {\n this.ask.password = true\n }\n this.ask.callback = (value) => {\n this.ask.show = false // Close the dialog\n if (this.ask.password) {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n password: value, // Using password as a key automatically filters it from rails logs\n prompt_id: this.activePromptId,\n },\n })\n } else {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n answer: value,\n prompt_id: this.activePromptId,\n },\n })\n }\n }\n this.ask.show = true // Display the dialog\n break\n case 'prompt_for_hazardous':\n this.prompt.title = 'Hazardous Command'\n this.prompt.message = `Warning: Command ${data.args[0]} ${data.args[1]} is Hazardous. `\n if (data.args[2]) {\n this.prompt.message += data.args[2] + ' '\n }\n this.prompt.message += 'Send?'\n this.prompt.buttons = [{ text: 'Send', value: 'Send' }]\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'prompt_for_critical_cmd':\n this.criticalCmdUuid = data.args[0]\n this.criticalCmdString = data.args[5]\n this.criticalCmdUser = data.args[1]\n this.displayCriticalCmd = true\n break\n case 'prompt':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n this.prompt.message = data.args[0]\n this.prompt.buttons = [{ text: 'Ok', value: 'Ok' }]\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'combo_box':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n if (data.kwargs && data.kwargs.multiple) {\n this.prompt.multiple = true\n }\n this.prompt.message = data.args[0]\n data.args.slice(1).forEach((v) => {\n this.prompt.buttons.push({ title: v, value: v })\n })\n this.prompt.layout = 'combo'\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'message_box':\n case 'vertical_message_box':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n this.prompt.message = data.args[0]\n data.args.slice(1).forEach((v) => {\n this.prompt.buttons.push({ text: v, value: v })\n })\n if (data.method.includes('vertical')) {\n this.prompt.layout = 'vertical'\n }\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'backtrace':\n this.information.title = 'Call Stack'\n this.information.text = data.args\n this.information.show = true\n this.information.width = '600'\n break\n case 'metadata_input':\n this.inputMetadata.callback = (value) => {\n this.inputMetadata.show = false\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n answer: value,\n prompt_id: this.activePromptId,\n },\n })\n }\n this.showMetadata()\n break\n // This is called continuously by the backend\n case 'open_file_dialog':\n case 'open_files_dialog':\n this.file.title = data.args[0]\n this.file.message = data.args[1]\n if (data.kwargs && data.kwargs.filter) {\n this.file.filter = data.kwargs.filter\n }\n if (data.method == 'open_files_dialog') {\n this.file.multiple = true\n }\n this.file.show = true\n break\n default:\n // console.log(\n // 'Unknown script method:' + data.method + ' with args:' + data.args\n // )\n break\n }\n },\n async fileDialogCallback(files) {\n // Set fileNames to 'Cancel' in case they cancelled\n // otherwise we will populate it with the file names they selected\n let fileNames = 'Cancel'\n // Record all the API request promises so we can ensure they complete\n let promises = []\n if (files != 'Cancel') {\n fileNames = []\n files.forEach((file) => {\n fileNames.push(file.name)\n promises.push(\n Api.get(\n `/openc3-api/storage/upload/${encodeURIComponent(\n `${window.openc3Scope}/tmp/${file.name}`,\n )}?bucket=OPENC3_CONFIG_BUCKET`,\n ).then((response) => {\n // This pushes the file into storage by using the fields in the presignedRequest\n // See storage_controller.rb get_upload_presigned_request()\n promises.push(\n axios({\n ...response.data,\n data: file,\n }),\n )\n }),\n )\n })\n }\n // We have to wait for all the upload API requests to finish before notifying the prompt\n Promise.all(promises).then((responses) => {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: this.file.multiple\n ? 'open_files_dialog'\n : 'open_file_dialog',\n answer: fileNames,\n prompt_id: this.activePromptId,\n },\n }).then((response) => {\n this.file.show = false // Close the dialog\n })\n })\n },\n setError(event) {\n this.alertType = 'error'\n this.alertText = `Error: ${event}`\n this.showAlert = true\n },\n // ScriptRunner File menu actions\n newFile() {\n this.unlockFile()\n this.filename = NEW_FILENAME\n this.currentFilename = null\n this.tempFilename = null\n this.files = {} // Clear the cached file list\n this.editor.session.setValue('')\n this.saveAllowed = true\n this.fileModified = ''\n this.suiteRunner = false\n this.startOrGoDisabled = false\n this.envDisabled = false\n if (!this.inline) {\n this.$router\n .replace({\n name: 'ScriptRunner',\n })\n // catch the error in case we route to where we already are\n .catch((err) => {})\n document.title = 'Script Runner'\n }\n this.doResize()\n },\n async newRubyTestSuite() {\n this.newFile()\n this.editor.session.setValue(`require 'openc3/script/suite.rb'\n\n# Group class name should indicate what the scripts are testing\nclass Power < OpenC3::Group\n # Methods beginning with script_ are added to Script dropdown\n def script_power_on\n # Using OpenC3::Group.puts adds the output to the Test Report\n # This can be useful for requirements verification, QA notes, etc\n OpenC3::Group.puts \"Verifying requirement SR-1\"\n configure()\n end\n\n # Other methods are not added to Script dropdown\n def configure\n end\n\n def setup\n # Run when Group Setup button is pressed\n # Run before all scripts when Group Start is pressed\n end\n\n def teardown\n # Run when Group Teardown button is pressed\n # Run after all scripts when Group Start is pressed\n end\nend\n\nclass TestSuite < OpenC3::Suite\n def initialize\n add_group('Power')\n end\n def setup\n # Run when Suite Setup button is pressed\n # Run before all groups when Suite Start is pressed\n end\n def teardown\n # Run when Suite Teardown button is pressed\n # Run after all groups when Suite Start is pressed\n end\nend\n`)\n await this.saveFile('auto')\n },\n async newPythonTestSuite() {\n this.newFile()\n this.editor.session.setValue(`from openc3.script.suite import Suite, Group\n\n# Group class name should indicate what the scripts are testing\nclass Power(Group):\n # Methods beginning with script_ are added to Script dropdown\n def script_power_on(self):\n # Using Group.print adds the output to the Test Report\n # This can be useful for requirements verification, QA notes, etc\n Group.print(\"Verifying requirement SR-1\")\n self.configure()\n\n # Other methods are not added to Script dropdown\n def configure(self):\n pass\n\n def setup(self):\n # Run when Group Setup button is pressed\n # Run before all scripts when Group Start is pressed\n pass\n\n def teardown(self):\n # Run when Group Teardown button is pressed\n # Run after all scripts when Group Start is pressed\n pass\n\nclass TestSuite(Suite):\n def __init__(self):\n self.add_group(Power)\n\n def setup(self):\n # Run when Suite Setup button is pressed\n # Run before all groups when Suite Start is pressed\n pass\n\n def teardown(self):\n # Run when Suite Teardown button is pressed\n # Run after all groups when Suite Start is pressed\n pass\n`)\n await this.saveFile('auto')\n },\n addToRecent(filename) {\n // See if this filename is already in the recent ... if so remove it\n let index = this.recent.findIndex((i) => i.label === filename)\n if (index !== -1) {\n this.recent.splice(index, 1)\n }\n // Push this filename to the front of the recently used\n this.recent.unshift({\n label: filename,\n icon: fileIcon(filename),\n command: async (event) => {\n this.filename = event.label\n await this.reloadFile()\n },\n })\n if (this.recent.length > 8) {\n this.recent.pop()\n }\n // This only stringifies the label and icon ... not the command\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n }\n },\n removeFromRecent(filename) {\n this.recent = this.recent.filter((entry) => entry.label !== filename)\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n if (localStorage['script_runner__filename'] === filename) {\n localStorage.removeItem('script_runner__filename')\n }\n }\n },\n openFile() {\n this.fileOpen = true\n },\n async reloadFile(showError = true) {\n // Disable start while we're loading the file so we don't hit Start\n // before it's fully loaded and then save over it with a blank file\n this.saveAllowed = false\n this.startOrGoDisabled = true\n await Api.get(`/script-api/scripts/${this.filename}`, {\n headers: {\n Accept: 'application/json',\n 'Ignore-Errors': '404',\n },\n })\n .then((response) => {\n const file = {\n name: this.filename,\n contents: response.data.contents,\n }\n if (response.data.suites) {\n file['suites'] = JSON.parse(response.data.suites)\n }\n if (response.data.error) {\n file['error'] = response.data.error\n }\n if (response.data.success) {\n file['success'] = response.data.success\n }\n const locked = response.data.locked\n const breakpoints = response.data.breakpoints\n this.setFile({ file, locked, breakpoints }, true)\n this.saveAllowed = true\n })\n .catch((error) => {\n if (showError === true) {\n this.$notify.caution({\n title: 'File Open Error',\n body: `Failed to open ${this.filename} due to ${error}`,\n })\n }\n this.removeFromRecent(this.filename)\n this.newFile() // Reset the GUI\n })\n },\n // Called by the FileOpenDialog to set the file contents\n setFile({ file, locked, breakpoints }, local = false) {\n this.files = {} // Clear the cached file list\n // Split off the ' *' which indicates a file is modified on the server\n let newFilename = file.name.split('*')[0]\n if (local === false) {\n // We only need to unlock if the file is different\n if (this.filename !== newFilename) {\n this.unlockFile() // first unlock what was just being edited\n this.lockedBy = locked\n }\n }\n this.filename = newFilename\n if (!this.inline) {\n // Update the URL with the filename\n this.$router\n .replace({\n name: 'ScriptRunner',\n query: {\n file: this.filename,\n },\n })\n // catch the error in case we route to where we already are\n .catch((err) => {})\n\n // Update the browser tab with the name of the file first\n // so squished tabs are still useful, followed by the rest\n // of the path for context. Target name will be first which\n // is probably the most useful part of the path.\n let parts = this.filename.split('/')\n document.title = `${parts.pop()} (${parts.join('/')})`\n }\n\n if (this.filename.split('.').pop() === 'py') {\n this.editor.session.setMode(this.pythonMode)\n } else {\n this.editor.session.setMode(this.rubyMode)\n }\n this.currentFilename = null\n this.editor.session.setValue(file.contents)\n this.breakpoints[this.filename] = breakpoints\n this.restoreBreakpoints(this.filename)\n this.fileModified = ''\n this.envDisabled = false\n this.addToRecent(this.filename)\n\n if (file.suites) {\n this.suiteRunner = true\n this.suiteMap = file.suites\n this.startOrGoDisabled = true\n } else {\n this.suiteRunner = false\n this.startOrGoDisabled = false\n }\n if (file.error) {\n this.suiteError = file.error\n this.showSuiteError = true\n }\n // Disable suite buttons if we didn't successfully parse the suite\n this.disableSuiteButtons = file.success == false\n this.doResize()\n },\n clearTemp() {\n this.recent = this.recent.filter(\n (entry) => !entry.label.includes('__TEMP__'),\n )\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n }\n },\n detectLanguage() {\n let rubyRegex1 = new RegExp('^\\\\s*(require|load|puts) ')\n let pythonRegex1 = new RegExp('^\\\\s*(import|from) ')\n let rubyRegex2 = new RegExp('^\\\\s*end\\\\s*$')\n let pythonRegex2 = new RegExp(\n '^\\\\s*(if|def|while|else|elif|class).*:\\\\s*$',\n )\n let pythonRegex3 = new RegExp('\\\\(f\"') // f strings\n let text = this.editor.getValue()\n let lines = text.split('\\n')\n for (let line of lines) {\n if (line.match(rubyRegex1)) {\n return 'ruby'\n }\n if (line.match(pythonRegex1)) {\n return 'python'\n }\n if (line.match(rubyRegex2)) {\n return 'ruby'\n }\n if (line.match(pythonRegex2)) {\n return 'python'\n }\n if (line.match(pythonRegex3)) {\n return 'python'\n }\n }\n return 'unknown' // otherwise unknown\n },\n // saveFile takes a type to indicate if it was called by the Menu\n // or automatically by 'Start' (to ensure a consistent backend file) or autoSave\n async saveFile(type = 'menu') {\n if (this.readOnlyUser) {\n return\n }\n if (this.saveAllowed) {\n const breakpoints = this.getBreakpointRows()\n if (this.filename === NEW_FILENAME) {\n if (type === 'menu') {\n // Menu driven saves on a new file should prompt SaveAs\n this.saveAs()\n return\n } else {\n // start or auto with NEW_FILENAME\n if (this.tempFilename === null) {\n let language = this.detectLanguage()\n if (\n language === 'ruby' ||\n (type !== 'auto' && language == 'unknown')\n ) {\n this.tempFilename =\n TEMP_FOLDER +\n '/' +\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss_SSS') +\n '_temp.rb'\n } else if (language === 'python') {\n this.tempFilename =\n TEMP_FOLDER +\n '/' +\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss_SSS') +\n '_temp.py'\n } else {\n // No autosave for unknown language\n return\n }\n this.filename = this.tempFilename\n this.addToRecent(this.filename)\n }\n }\n }\n this.showSave = true\n await Api.post(`/script-api/scripts/${this.filename}`, {\n data: {\n text: this.editor.getValue(), // Pass in the raw file text\n breakpoints,\n },\n })\n .then((response) => {\n if (response.status == 200) {\n if (response.data.suites) {\n this.startOrGoDisabled = true\n this.suiteRunner = true\n this.suiteMap = JSON.parse(response.data.suites)\n } else {\n this.startOrGoDisabled = false\n this.suiteRunner = false\n this.suiteMap = {}\n }\n if (response.data.error) {\n this.suiteError = response.data.error\n this.showSuiteError = true\n }\n this.fileModified = ''\n setTimeout(() => {\n this.showSave = false\n }, 2000)\n } else {\n this.showSave = false\n this.alertType = 'error'\n this.alertText = `Error saving file. Code: ${response.status} Text: ${response.statusText}`\n this.showAlert = true\n }\n this.lockFile() // Ensure this file is locked for editing\n this.doResize()\n })\n .catch(({ response }) => {\n this.showSave = false\n // 422 error means we couldn't parse the script file into Suites\n // response.data.suites holds the parse result\n if (response.status == 422) {\n this.alertType = 'error'\n this.alertText = response.data.suites\n } else {\n this.alertType = 'error'\n this.alertText = `Error saving file. Code: ${response.status} Text: ${response.statusText}`\n }\n this.showAlert = true\n })\n } else {\n this.setError('Attempt to save file when not allowed')\n }\n },\n saveAs() {\n this.showSaveAs = true\n },\n async saveAsFilename(filename) {\n this.filename = filename.split('*')[0]\n this.currentFilename = null\n if (this.tempFilename) {\n Api.post(`/script-api/scripts/${this.tempFilename}/delete`)\n this.tempFilename = null\n }\n await this.saveFile('menu')\n },\n delete() {\n let filename = this.filename\n if (this.tempFilename) {\n filename = this.tempFilename\n }\n this.$dialog\n .confirm(`Permanently delete file: ${filename}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.post(`/script-api/scripts/${filename}/delete`, {\n data: {},\n })\n })\n .then((response) => {\n this.removeFromRecent(filename)\n this.newFile()\n })\n .catch((error) => {\n if (error !== true) {\n const alertObject = {\n text: `Failed Multi-Delete. ${error}`,\n type: 'error',\n }\n this.$emit('alert', alertObject)\n }\n })\n },\n download() {\n const blob = new Blob([this.editor.getValue()], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', this.filename)\n link.click()\n },\n // ScriptRunner Script menu actions\n syntaxCheck() {\n Api.post(`/script-api/scripts/${this.filename}/syntax`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n this.information.title = response.data.title\n this.information.text = JSON.parse(response.data.description)\n this.information.show = true\n this.information.width = '600'\n })\n },\n showInstrumented() {\n Api.post(`/script-api/scripts/${this.filename}/instrumented`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n this.information.title = response.data.title\n this.information.text = JSON.parse(response.data.description)\n this.information.show = true\n this.information.width = '90vw'\n })\n },\n showCallStack() {\n Api.post(`/script-api/running-script/${this.scriptId}/backtrace`)\n },\n toggleDebug() {\n this.showDebug = !this.showDebug\n if (this.showDebug) {\n this.$nextTick(() => {\n this.$refs.debug.focus()\n })\n }\n },\n toggleDisconnect() {\n this.showDisconnect = !this.showDisconnect\n },\n debugKeydown(event) {\n if (event.key === 'Escape') {\n this.debug = ''\n this.debugHistoryIndex = this.debugHistory.length\n } else if (event.key === 'Enter') {\n this.debugHistory.push(this.debug)\n this.debugHistoryIndex = this.debugHistory.length\n // Post the code to /debug, output is processed by receive()\n Api.post(`/script-api/running-script/${this.scriptId}/debug`, {\n data: {\n args: this.debug,\n },\n })\n this.debug = ''\n } else if (event.key === 'ArrowUp') {\n this.debugHistoryIndex -= 1\n if (this.debugHistoryIndex < 0) {\n this.debugHistoryIndex = this.debugHistory.length - 1\n }\n this.debug = this.debugHistory[this.debugHistoryIndex]\n // Prevent the cursor/caret from moving to the front\n event.preventDefault()\n } else if (event.key === 'ArrowDown') {\n this.debugHistoryIndex += 1\n if (this.debugHistoryIndex >= this.debugHistory.length) {\n this.debugHistoryIndex = 0\n }\n this.debug = this.debugHistory[this.debugHistoryIndex]\n }\n },\n removeAllMarkers: function () {\n const allMarkers = this.editor.session.getMarkers()\n Object.keys(allMarkers)\n .filter((key) => allMarkers[key].type === 'fullLine')\n .forEach((marker) => this.editor.session.removeMarker(marker))\n },\n confirmLocalUnlock: function () {\n this.$dialog\n .confirm(\n 'Are you sure you want to unlock this script for editing? If another user is editing this script, your changes might conflict with each other.',\n {\n okText: 'Force Unlock',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.lockedBy = null\n return this.lockFile() // Re-lock it as this user so it's locked for anyone else who opens it\n })\n },\n lockFile: function () {\n if (!this.readOnlyUser) {\n return Api.post(`/script-api/scripts/${this.filename}/lock`)\n }\n },\n unlockFile: function () {\n if (\n this.filename !== NEW_FILENAME &&\n !this.readOnly &&\n !this.readOnlyUser\n ) {\n Api.post(`/script-api/scripts/${this.filename}/unlock`)\n }\n },\n backToNewScript: async function () {\n // Disconnect from the current script\n this.scriptDisconnect()\n // Clear script-related state\n this.removeAllMarkers()\n await this.scriptComplete()\n // Create a new blank script\n this.newFile()\n },\n screenId(id) {\n return 'scriptRunnerScreen' + id\n },\n closeScreen(id) {\n let index = 0\n for (screen of this.screens) {\n if (screen.id == id) {\n this.screens.splice(index, 1)\n break\n }\n index += 1\n }\n },\n },\n}\n</script>\n\n<style scoped>\n#sr-controls {\n padding: 0px;\n}\n\n.editor {\n height: 100%;\n width: 100%;\n position: relative;\n font-size: 16px;\n}\n\n.script-state :deep(.v-field) {\n background-color: var(--color-background-base-default);\n}\n\n.script-state :deep(input) {\n text-transform: capitalize;\n}\n</style>\n<style>\n.splitpanes {\n height: 100%;\n}\n\n.splitpanes--horizontal > .splitpanes__splitter {\n min-height: 4px;\n position: relative;\n top: 4px;\n background-color: grey;\n width: 5%;\n margin: auto;\n cursor: row-resize;\n}\n\n.runningMarker {\n position: absolute;\n background: rgba(0, 255, 0, 0.5);\n z-index: 20;\n}\n\n.waitingMarker {\n position: absolute;\n background: rgba(0, 155, 0, 1);\n z-index: 20;\n}\n\n.breakpointMarker {\n position: absolute;\n border-style: solid;\n border-color: red;\n background: rgba(0, 255, 0, 0.5);\n z-index: 20;\n}\n\n.pausedMarker {\n position: absolute;\n background: rgba(0, 140, 255, 0.5);\n z-index: 20;\n}\n\n.errorMarker {\n position: absolute;\n background: rgba(255, 0, 119, 0.5);\n z-index: 20;\n}\n\n.fatalMarker {\n position: absolute;\n background: rgba(255, 0, 0, 0.5);\n z-index: 20;\n}\n\n.saving {\n z-index: 20;\n opacity: 0.35;\n}\n\n.ace_gutter {\n /* Screens have a default z-index of 3 so get below that */\n z-index: 2;\n}\n\n.ace_gutter-cell.ace_breakpoint {\n border-radius: 20px 0px 0px 20px;\n box-shadow: 0px 0px 1px 1px red inset;\n}\n\n.grid {\n position: relative;\n}\n\n.item {\n /* TODO: this non-scoped generic class name conflicts with other things and should be scoped or renamed. */\n position: absolute;\n display: block;\n margin: 5px;\n z-index: 1;\n}\n\n.item-content {\n position: relative;\n cursor: pointer;\n border-radius: 6px;\n}\n\n.apply-top .v-snackbar__wrapper {\n top: var(--classification-height-top);\n}\n</style>\n"],"names":["_sfc_main","OutputDialog","TimeFilters","newTab","OpenC3Api","response","error","offset","Api","scripts","currentTime","script","startTime","durationMs","minutes","seconds","hours","page","itemsPerPage","destination","href","dialog","type","logUrl","filenameParts","format","blob","link","basename","_createElementBlock","_createVNode","_component_v_card","_component_v_tabs","$data","$event","_component_v_tab","_cache","_component_v_window","_component_v_window_item","_component_v_card_title","_component_v_row","_component_v_spacer","_component_v_btn","$options","_component_v_text_field","_component_v_data_table_server","_withCtx","item","_createTextVNode","_toDisplayString","_createElementVNode","_component_v_icon","$props","_hoisted_2","_component_v_menu","props","_mergeProps","_component_v_list","_component_v_list_item","_component_v_list_item_title","_hoisted_1","_createBlock","_component_output_dialog","value","newValue","oldValue","message","output","err","_component_v_select","_component_v_card_text","_component_v_data_table","_normalizeClass","Pe","D","h","y","u","E","ce","l","k","M","z","e","n","x","S","c","f","_","r","P","O","b","t","i","a","s","o","K","I","d","A","U","W","J","$","N","v","p","H","ue","j","Q","V","Z","ee","F","ne","C","ie","te","T","L","ae","le","oe","se","q","B","G","X","re","fe","g","Y","ve","me","ge","w","m","de","R","pe","he","ze","xe","_component_v_dialog","_component_v_form","_component_v_toolbar","_component_v_card_actions","_component_v_file_input","_openBlock","_Fragment","_renderList","line","index","result","items","layout","_component_v_card_subtitle","_hoisted_5","_hoisted_6","button","_component_v_textarea","EnvironmentChooser","_component_environment_chooser","_ctx","name","newVal","oldVal","event","_component_v_col","_component_v_tooltip","_component_v_checkbox","getKeywords","getAutocompleteData","groupBy","array","lambda","groups","key","toMethodCallSyntaxRegex","word","prefix","opening","params","PacketCompleter","dataReadyCallback","expressionsReadyCallback","_editor","session","position","_prefix","callback","matches","lineBeforeCursor","regex","CmdCompleter","TlmCompleter","packetName","itemName","amendedItem","foundPacket","toKeywordRegex","call","interpolatedStringRegex","alternateSyntaxRegex","MnemonicChecker","target","text","linesToCheck","linesToSkip","cmdMatch","found","tlmMatch","matchStr","matchStrLen","mnemonicMatch","usingAlternateSyntax","mnemonicParts","mnemonic","mnemonicParams","param","token","property","problems","problemLines","targetGroups","lineObj","packetGroups","packet","cmdOrTlm","method","packetInfo","RegexAnnotator","editor","pattern","__privateAdd","_id","_pattern","_text","_type","__publicField","__privateGet","_removeAllAnnotations","_shiftAnnotations","row","column","_b","_a","_addAnnotation","_deleteAnnotationsForRow","newAnnotation","annotation","count","__privateSet","SleepAnnotator","keyword","suffix","TEMP_FOLDER","NEW_FILENAME","START","GO","PAUSE","RETRY","FileOpenSaveDialog","Openc3Screen","EnvironmentDialog","Splitpanes","Pane","TopBar","AskDialog","FileDialog","InformationDialog","EventListDialog","OverridesDialog","PromptDialog","ResultsDialog","ScriptEnvironmentDialog","SimpleTextDialog","SuiteRunner","RunningScripts","ScriptLogMessages","CriticalCmdDialog","AceEditorModes","ClassificationBanners","to","from","next","filenames","val","filename","user","roles","role","RubyMode","PythonMode","AceEditorUtils","sleepAnnotator","Cable","editorHeight","suitesHeight","suites","logMessages","order","id","state","start_row","range","end_row","rowsToUpdate","rowsToDelete","breakpoint","alertText","skipped","problemText","problem","data","subscription","suiteRunner","line_no","end_line_no","url","env","markers","definition","files","fileNames","promises","file","axios","responses","fileIcon","entry","showError","locked","breakpoints","local","newFilename","parts","rubyRegex1","pythonRegex1","rubyRegex2","pythonRegex2","pythonRegex3","lines","language","alertObject","allMarkers","marker","_hoisted_3","_hoisted_4","_component_top_bar","_component_v_snackbar","attrs","def","_component_openc3_screen","_component_suite_runner","_component_v_progress_circular","_hoisted_8","_hoisted_9","_component_v_badge","_hoisted_10","_component_splitpanes","_component_pane","args","_component_v_divider","_hoisted_11","_component_script_log_messages","_hoisted_12","_hoisted_13","_hoisted_14","_component_file_open_save_dialog","_component_environment_dialog","_component_ask_dialog","_component_file_dialog","_component_information_dialog","_component_event_list_dialog","_component_overrides_dialog","_component_prompt_dialog","_component_results_dialog","_component_script_environment_dialog","_component_simple_text_dialog","_component_critical_cmd_dialog","_component_v_bottom_sheet","_component_v_sheet","_component_running_scripts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0NA,MAAKA,KAAU;AAAA,EACb,YAAY,EAAE,cAAAC,GAAW;AAAA,EACzB,QAAQ,CAACC,EAAW;AAAA,EACpB,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,iBAAiB;AAAA;EAEnB,OAAO;AACL,WAAO;AAAA,MACL,KAAK;AAAA,MACL,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,cAAc;AAAA;AAAA,MAEd,eAAe;AAAA,MACf,gBAAgB,CAAA;AAAA,MAChB,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,qBAAqB;AAAA,MACrB,gBAAgB;AAAA,QACd;AAAA,UACE,OAAO;AAAA,UACP,KAAK;AAAA,UACL,UAAU;AAAA,UACV,YAAY;AAAA;QAEd,EAAE,OAAO,MAAM,KAAK,OAAK;AAAA,QACzB,EAAE,OAAO,QAAQ,KAAK;QACtB,EAAE,OAAO,YAAY,KAAK;QAC1B,EAAE,OAAO,cAAc,KAAK;QAC5B,EAAE,OAAO,YAAY,KAAK;QAC1B,EAAE,OAAO,SAAS,KAAK,QAAM;AAAA,QAC7B;AAAA,UACE,OAAO;AAAA,UACP,KAAK;AAAA,UACL,UAAU;AAAA,UACV,YAAY;AAAA;;;MAIhB,iBAAiB;AAAA,MACjB,kBAAkB,CAAA;AAAA,MAClB,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,uBAAuB;AAAA,MACvB,kBAAkB;AAAA,QAChB,EAAE,OAAO,MAAM,KAAK,OAAK;AAAA,QACzB,EAAE,OAAO,QAAQ,KAAK;QACtB,EAAE,OAAO,YAAY,KAAK;QAC1B,EAAE,OAAO,cAAc,KAAK;QAC5B,EAAE,OAAO,YAAY,KAAK;QAC1B,EAAE,OAAO,SAAS,KAAK,QAAM;AAAA,QAC7B;AAAA,UACE,OAAO;AAAA,UACP,KAAK;AAAA,UACL,UAAU;AAAA,UACV,YAAY;AAAA;QAEd;AAAA,UACE,OAAO;AAAA,UACP,KAAK;AAAA,UACL,UAAU;AAAA,UACV,YAAY;AAAA;;MAGhB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,UAAUC,GAAQ;AAChB,MAAIA,MAAW,YACb,KAAK,kBAAiB,IACbA,MAAW,eACpB,KAAK,oBAAmB;AAAA,IAE5B;AAAA;EAEF,UAAU;AACR,SAAK,MAAM,IAAIC,GAAS,GACxB,KAAK,IACF,YAAY,WAAW,EACvB,KAAK,CAACC,MAAa;AAClB,MAAIA,MACF,KAAK,WAAWA;AAAA,IAEpB,CAAC,EACA,MAAM,CAACC,MAAU;AAAA,IAElB,CAAC,GAEH,KAAK,kBAAiB,GACtB,KAAK,oBAAmB,GAGxB,KAAK,eAAe,YAAY,MAAM;AACpC,MAAI,KAAK,cAAc,aACrB,KAAK,kBAAiB;AAAA,IAE1B,GAAG,GAAI;AAAA,EACT;AAAA,EACA,gBAAgB;AAEd,IAAI,KAAK,gBACP,cAAc,KAAK,YAAY;AAAA,EAEnC;AAAA,EACA,SAAS;AAAA,IACP,mBAAmB,WAAY;AAC7B,WAAK,iBAAiB;AACtB,YAAMC,KAAU,KAAK,cAAc,KAAK,KAAK;AAC7CC,MAAAA,EAAI;AAAA,QACF,mDAAmDD,CAAM,UAAU,KAAK,mBAAmB;AAAA,MAC7F,EACG,KAAK,CAACF,MAAa;AAClB,cAAMI,IAAUJ,EAAS,KAAK,SAAS,CAAA,GACjCK,IAAc,oBAAI,KAAI;AAG5B,QAAAD,EAAQ,QAAQ,CAACE,MAAW;AAK1B,cAHAA,EAAO,eAAe,GAAGA,EAAO,cAAc,KAAKA,EAAO,QAAQ,KAG9DA,EAAO,YAAY;AACrB,kBAAMC,IAAY,IAAI,KAAKD,EAAO,UAAU,GACtCE,IAAaH,IAAcE;AAMjC,gBALAD,EAAO,uBAAuB,KAAK;AAAA,cACjCC;AAAA,cACA,KAAK;AAAA,YACP,GAEIC,IAAa;AACf,cAAAF,EAAO,WAAW;AAAA,qBACTE,IAAa;AACtB,cAAAF,EAAO,WAAW;AAAA,qBACTE,IAAa;AACtB,cAAAF,EAAO,WAAW,GAAG,KAAK,MAAME,IAAa,GAAI,CAAC;AAAA,qBACzCA,IAAa,MAAS;AAC/B,oBAAMC,IAAU,KAAK,MAAMD,IAAa,GAAK,GACvCE,IAAU,KAAK,MAAOF,IAAa,MAAS,GAAI;AACtD,cAAAF,EAAO,WAAW,GAAGG,CAAO,KAAKC,CAAO;AAAA,YAC1C,OAAO;AACL,oBAAMC,IAAQ,KAAK,MAAMH,IAAa,IAAO,GACvCC,IAAU,KAAK,MAAOD,IAAa,OAAW,GAAK,GACnDE,IAAU,KAAK,MAAOF,IAAa,MAAS,GAAI;AACtD,cAAAF,EAAO,WAAW,GAAGK,CAAK,KAAKF,CAAO,KAAKC,CAAO;AAAA,YACpD;AAAA,UACF;AACE,YAAAJ,EAAO,WAAW;AAAA,QAEtB,CAAC,GAED,KAAK,iBAAiBF,GACtB,KAAK,eAAeJ,EAAS,KAAK,SAASI,EAAQ,QACnD,KAAK,iBAAiB;AAAA,MACxB,CAAC,EACA,MAAM,CAACH,MAAU;AAChB,aAAK,iBAAiB,IACtB,KAAK,QAAQ,QAAQ;AAAA,UACnB,OAAO;AAAA,UACP,MAAMA,EAAM;AAAA,SACb;AAAA,MACH,CAAC;AAAA,IACL;AAAA,IACA,mBAAmB,SAAUW,GAAM;AACjC,WAAK,cAAcA,GACnB,KAAK,kBAAiB;AAAA,IACxB;AAAA,IACA,2BAA2B,SAAUC,GAAc;AACjD,WAAK,sBAAsBA,GAC3B,KAAK,cAAc,GACnB,KAAK,kBAAiB;AAAA,IACxB;AAAA,IACA,qBAAqB,WAAY;AAC/B,WAAK,mBAAmB;AACxB,YAAMX,KAAU,KAAK,gBAAgB,KAAK,KAAK;AAC/CC,MAAAA,EAAI;AAAA,QACF,sDAAsDD,CAAM,UAAU,KAAK,qBAAqB;AAAA,MAClG,EACG,KAAK,CAACF,MAAa;AAClB,cAAMI,IAAUJ,EAAS,KAAK,SAAS,CAAA;AAGvC,QAAAI,EAAQ,QAAQ,CAACE,MAAW;AAK1B,cAHAA,EAAO,eAAe,GAAGA,EAAO,cAAc,KAAKA,EAAO,QAAQ,KAG9DA,EAAO,cAAcA,EAAO,UAAU;AACxC,kBAAMC,IAAY,IAAI,KAAKD,EAAO,UAAU,GAEtCE,IADU,IAAI,KAAKF,EAAO,QAAQ,IACXC;AAO7B,gBANAD,EAAO,uBAAuB,KAAK;AAAA,cACjCC;AAAA,cACA,KAAK;AAAA,YACP,GAGIC,IAAa;AACf,cAAAF,EAAO,WAAW;AAAA,qBACTE,IAAa;AACtB,cAAAF,EAAO,WAAW;AAAA,qBACTE,IAAa;AACtB,cAAAF,EAAO,WAAW,GAAG,KAAK,MAAME,IAAa,GAAI,CAAC;AAAA,qBACzCA,IAAa,MAAS;AAC/B,oBAAMC,IAAU,KAAK,MAAMD,IAAa,GAAK,GACvCE,IAAU,KAAK,MAAOF,IAAa,MAAS,GAAI;AACtD,cAAAF,EAAO,WAAW,GAAGG,CAAO,KAAKC,CAAO;AAAA,YAC1C,OAAO;AACL,oBAAMC,IAAQ,KAAK,MAAMH,IAAa,IAAO,GACvCC,IAAU,KAAK,MAAOD,IAAa,OAAW,GAAK,GACnDE,IAAU,KAAK,MAAOF,IAAa,MAAS,GAAI;AACtD,cAAAF,EAAO,WAAW,GAAGK,CAAK,KAAKF,CAAO,KAAKC,CAAO;AAAA,YACpD;AAAA,UACF;AACE,YAAAJ,EAAO,WAAW;AAAA,QAEtB,CAAC,GAED,KAAK,mBAAmBF,GACxB,KAAK,iBAAiBJ,EAAS,KAAK,SAASI,EAAQ,QACrD,KAAK,mBAAmB;AAAA,MAC1B,CAAC,EACA,MAAM,CAACH,MAAU;AAChB,aAAK,mBAAmB,IACxB,KAAK,QAAQ,QAAQ;AAAA,UACnB,OAAO;AAAA,UACP,MAAMA,EAAM;AAAA,SACb;AAAA,MACH,CAAC;AAAA,IACL;AAAA,IACA,qBAAqB,SAAUW,GAAM;AACnC,WAAK,gBAAgBA,GACrB,KAAK,oBAAmB;AAAA,IAC1B;AAAA,IACA,6BAA6B,SAAUC,GAAc;AACnD,WAAK,wBAAwBA,GAC7B,KAAK,gBAAgB,GACrB,KAAK,oBAAmB;AAAA,IAC1B;AAAA,IACA,YAAY,SAAUP,GAAQ;AAC5B,WAAK,gBAAgB,KAAK,UAAUA,GAAQ,MAAM,CAAC,GACnD,KAAK,aAAa,aAAaA,EAAO,MACtC,KAAK,iBAAiB,IACtB,KAAK,aAAa;AAAA,IACpB;AAAA,IACA,eAAe,SAAUA,GAAQ;AAE/B,WAAK,MAAM,YAAY;AACvB,YAAMQ,IAAc;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ,EAAE,IAAIR,EAAO,KAAG;AAAA,MAC1B;AACA,UAAI,KAAK,iBAAiB;AACxB,YAAI,EAAE,MAAAS,MAAS,KAAK,QAAQ,QAAQD,CAAW;AAC/C,eAAO,KAAKC,GAAM,QAAQ;AAAA,MAC5B;AACE,aAAK,QAAQ,KAAKD,CAAW,GAC7B,KAAK,MAAM,OAAO;AAAA,IAEtB;AAAA,IACA,cAAc,SAAUR,GAAQ;AAC9B,WAAK,QACF;AAAA,QACC,yCAAyCA,EAAO,IAAI,IAAIA,EAAO,QAAQ;AAAA;AAAA,QACvE;AAAA,UACE,QAAQ;AAAA,UACR,YAAY;AAAA;MAEhB,EACC,KAAK,CAACU,MACEb,EAAI,KAAK,8BAA8BG,EAAO,IAAI,SAAS,CACnE,EACA,KAAK,CAACN,MAAa;AAClB,aAAK,QAAQ,OAAO;AAAA,UAClB,MAAM,mBAAmBM,EAAO,IAAI,IAAIA,EAAO,QAAQ;AAAA,SACxD,GACD,KAAK,kBAAiB;AAAA,MACxB,CAAC,EACA,MAAM,CAACL,MAAU;AAChB,QAAIA,MAAU,MACZ,KAAK,QAAQ,QAAQ;AAAA,UACnB,MAAM,0BAA0BK,EAAO,IAAI,IAAIA,EAAO,QAAQ;AAAA,SAC/D;AAAA,MAEL,CAAC;AAAA,IACL;AAAA,IACA,eAAe,SAAUA,GAAQW,GAAM;AACrC,UAAIC,IAAS;AACb,MAAID,MAAS,YACX,KAAK,aAAa,UAClBC,IAASZ,EAAO,WAEhB,KAAK,aAAa,OAClBY,IAASZ,EAAO,MAElBH,EAAI;AAAA,QACF,qCAAqC;AAAA,UACnCe;AAAA,SACD;AAAA,MACH,EAAE,KAAK,CAAClB,MAAa;AACnB,cAAMmB,IAAgBD,EAAO,MAAM,GAAG;AACtC,aAAK,iBAAiBC,EAAcA,EAAc,SAAS,CAAC,GAE5D,KAAK,gBAAgB,OAAO,KAAKnB,EAAS,KAAK,QAAQ,GACvD,KAAK,aAAa;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,IACA,mBAAmB,SAAUM,GAAQW,GAAMG,IAAS,QAAQ;AAC1D,UAAIF,IAAS;AACb,MAAID,MAAS,YACX,KAAK,aAAa,UAClBC,IAASZ,EAAO,WAEhB,KAAK,aAAa,OAClBY,IAASZ,EAAO,MAElB,KAAK,iBAAiBA,GAElBc,MAAW,UAAUH,MAAS,WAEhCd,EAAI;AAAA,QACF,qCAAqC;AAAA,UACnCe;AAAA,QACF,CAAC;AAAA,MACH,EACG,KAAK,CAAClB,MAAa;AAElB,cAAMqB,IAAO,IAAI,KAAK,CAAC,OAAO,KAAKrB,EAAS,KAAK,QAAQ,CAAC,GAAG;AAAA,UAC3D,MAAM;AAAA,SACP,GACKsB,IAAO,SAAS,cAAc,GAAG;AACvC,QAAAA,EAAK,OAAO,IAAI,gBAAgBD,CAAI,GACpCC,EAAK,aAAa,YAAYtB,EAAS,KAAK,QAAQ,GACpDsB,EAAK,MAAK,GACV,KAAK,iBAAiB;AAAA,MACxB,CAAC,EACA,MAAM,MAAM;AACX,aAAK,QAAQ,QAAQ;AAAA,UACnB,OAAO,0BAA0BJ,CAAM;AAAA,UACvC,MAAM,2EAA2EA,CAAM;AAAA,SACxF,GACD,KAAK,iBAAiB;AAAA,MACxB,CAAC,IAGHf,EAAI;AAAA,QACF,gCAAgC;AAAA,UAC9Be;AAAA,SACD;AAAA,MACH,EACG,KAAK,CAAClB,MAAa;AAClB,cAAMmB,IAAgBD,EAAO,MAAM,GAAG,GAChCK,IAAWJ,EAAcA,EAAc,SAAS,CAAC,GAEjDG,IAAO,SAAS,cAAc,GAAG;AACvC,QAAAA,EAAK,OAAOtB,EAAS,KAAK,KAC1BsB,EAAK,aAAa,YAAYC,CAAQ,GACtCD,EAAK,MAAK,GACV,KAAK,iBAAiB;AAAA,MACxB,CAAC,EACA,MAAM,MAAM;AACX,aAAK,QAAQ,QAAQ;AAAA,UACnB,OAAO,0BAA0BJ,CAAM;AAAA,UACvC,MAAM,2EAA2EA,CAAM;AAAA,SACxF,GACD,KAAK,iBAAiB;AAAA,MACxB,CAAC;AAAA,IAEP;AAAA;AAEJ;;;cA7jBEM,EA2LM,OAAA,MAAA;AAAA,IA1LJC,EA+KSC,GAAA;AAAA,MA/KD,MAAA;AAAA,MAAK,OAAM;AAAA;iBACjB,MAMS;AAAA,QANTD,EAMSE,GAAA;AAAA,sBALEC,EAAA;AAAA,wDAAAA,EAAA,YAASC;AAAA,UAClB,YAAS;AAAA;qBAET,MAA8C;AAAA,YAA9CJ,EAA8CK,GAAA,EAAvC,OAAM,UAAS,GAAA;AAAA,yBAAC,MAAe,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAAf,mBAAe,EAAA;AAAA;;;YACtCN,EAAkDK,GAAA,EAA3C,OAAM,YAAW,GAAA;AAAA,yBAAC,MAAiB,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAAjB,qBAAiB,EAAA;AAAA;;;;;;QAE5CN,EAsKWO,IAAA;AAAA,sBAtKQJ,EAAA;AAAA,wDAAAA,EAAA,YAASC;AAAA;qBAE1B,MA2DgB;AAAA,YA3DhBJ,EA2DgBQ,GAAA,EA3DD,OAAM,UAAS,GAAA;AAAA,yBAC5B,MAoBe;AAAA,gBApBfR,EAoBeS,GAAA,MAAA;AAAA,6BAnBb,MAkBQ;AAAA,oBAlBRT,EAkBQU,GAAA,EAlBD,OAAA,GAAK,GAAA;AAAA,iCACV,MAAY;AAAA,wBAAZV,EAAYW,CAAA;AAAA,wBACZX,EAECY,GAAA;AAAA,0BAFM,OAAM;AAAA,0BAAO,OAAM;AAAA,0BAAW,SAAOC,EAAA;AAAA;qCACzC,MAAO,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,8BAAP,WAAO,EAAA;AAAA;;;wBAEVN,EAYEc,GAAA;AAAA,sCAXSX,EAAA;AAAA,wEAAAA,EAAA,gBAAaC;AAAA,0BACtB,OAAM;AAAA,0BACN,OAAM;AAAA,0BACN,sBAAmB;AAAA,0BACnB,WAAA;AAAA,0BACA,SAAQ;AAAA,0BACR,SAAQ;AAAA,0BACR,eAAA;AAAA,0BACA,gBAAA;AAAA,0BACA,aAAU;AAAA,0BACV,OAAA,EAAA,aAAA,QAAA;AAAA;;;;;;;gBAKNJ,EAmCsBe,GAAA;AAAA,kBAlCnB,SAASZ,EAAA;AAAA,kBACT,OAAOA,EAAA;AAAA,kBACP,gBAAcA,EAAA;AAAA,kBACd,SAASA,EAAA;AAAA,kBACT,QAAQA,EAAA;AAAA,kBACT,SAAQ;AAAA,kBACR,aAAU;AAAA,kBACT,kBAAgBA,EAAA;AAAA,kBAChB,MAAMA,EAAA;AAAA,kBACN,0BAAwB,CAAA,IAAA,IAAA,EAAA;AAAA,kBACzB,OAAM;AAAA,kBACL,iBAAaU,EAAA;AAAA,kBACb,yBAAuBA,EAAA;AAAA;kBAEb,aAASG,EAClB,CAKC,EANqB,MAAAC,QAAI;AAAA,oBAC1BjB,EAKCY,GAAA;AAAA,sBAJC,OAAM;AAAA,sBACN,SAAQ;AAAA,sBACP,SAAK,CAAAR,MAAES,EAAA,WAAWI,CAAI;AAAA;iCACtB,MAAe;AAAA,wBAAZC,EAAAC,EAAAF,EAAK,IAAI,GAAA,CAAA;AAAA;;;;kBAGN,gBAAYD,EACrB,CAGQ,EAJiB,MAAAC,QAAI;AAAA,oBAC7BjB,EAGQY,GAAA;AAAA,sBAHD,OAAM;AAAA,sBAAW,SAAK,CAAAR,MAAES,EAAA,cAAcI,CAAI;AAAA;iCAC/C,MAAoB;AAAA,wBAApBX,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAc,EAAoB,cAAd,WAAO,EAAA;AAAA,2BACbpB,EAA+DqB,GAAA,EAA9B,KAAA,GAAG,GAAA;AAAA,qCAAC,MAAiB,CAAA,GAAAf,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,8BAAjB,qBAAiB,EAAA;AAAA;;;+BAAtCgB,EAAA,eAAe;AAAA;;;;;kBAGxB,aAASN,EAClB,CAGQ,EAJc,MAAAC,QAAI;AAAA,oBAC1BjB,EAGQY,GAAA;AAAA,sBAHD,OAAM;AAAA,sBAAW,SAAK,CAAAR,MAAES,EAAA,aAAaI,CAAI;AAAA;iCAC9C,MAAiB;AAAA,wBAAjBX,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAc,EAAiB,cAAX,QAAI,EAAA;AAAA,wBACVpB,EAA+CqB,GAAA,EAAvC,KAAA,GAAG,GAAA;AAAA,qCAAC,MAA0B,CAAA,GAAAf,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,8BAA1B,8BAA0B,EAAA;AAAA;;;;;;;;;;;;YAO9CN,EAqGgBQ,GAAA,EArGD,OAAM,YAAW,GAAA;AAAA,yBAC9B,MAmBe;AAAA,gBAnBfR,EAmBeS,GAAA,MAAA;AAAA,6BAlBb,MAiBQ;AAAA,oBAjBRT,EAiBQU,GAAA,EAjBD,OAAA,GAAK,GAAA;AAAA,iCACV,MAAY;AAAA,wBAAZV,EAAYW,CAAA;AAAA,wBACZX,EAECY,GAAA;AAAA,0BAFM,OAAM;AAAA,0BAAO,OAAM;AAAA,0BAAW,SAAOC,EAAA;AAAA;qCACzC,MAAO,CAAA,GAAAP,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,8BAAP,WAAO,EAAA;AAAA;;;wBAEVN,EAWEc,GAAA;AAAA,sCAVSX,EAAA;AAAA,wEAAAA,EAAA,kBAAeC;AAAA,0BACxB,OAAM;AAAA,0BACN,OAAM;AAAA,0BACN,sBAAmB;AAAA,0BACnB,WAAA;AAAA,0BACA,SAAQ;AAAA,0BACR,SAAQ;AAAA,0BACR,eAAA;AAAA,0BACA,gBAAA;AAAA,0BACA,OAAA,EAAA,aAAA,QAAA;AAAA;;;;;;;gBAKNJ,EA8EsBe,GAAA;AAAA,kBA7EnB,SAASZ,EAAA;AAAA,kBACT,OAAOA,EAAA;AAAA,kBACP,gBAAcA,EAAA;AAAA,kBACd,SAASA,EAAA;AAAA,kBACT,QAAQA,EAAA;AAAA,kBACT,SAAQ;AAAA,kBACR,aAAU;AAAA,kBACT,kBAAgBA,EAAA;AAAA,kBAChB,MAAMA,EAAA;AAAA,kBACN,0BAAwB,CAAA,IAAA,IAAA,EAAA;AAAA,kBACzB,OAAM;AAAA,kBACL,iBAAaU,EAAA;AAAA,kBACb,yBAAuBA,EAAA;AAAA;kBAEb,aAASG,EAClB,CAKC,EANqB,MAAAC,QAAI;AAAA,oBAC1BjB,EAKCY,GAAA;AAAA,sBAJC,OAAM;AAAA,sBACN,SAAQ;AAAA,sBACP,SAAK,CAAAR,MAAES,EAAA,WAAWI,CAAI;AAAA;iCACtB,MAAe;AAAA,wBAAZC,EAAAC,EAAAF,EAAK,IAAI,GAAA,CAAA;AAAA;;;;kBAGN,YAAQD,EACjB,CAKE,EANmB,MAAAC,QAAI;AAAA,oBACzBjB,EAKEY,GAAA;AAAA,sBAJA,OAAM;AAAA,sBACN,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACJ,SAAK,CAAAR,MAAES,EAAA,cAAcI,GAAI,KAAA;AAAA;oBAE5BjB,EAOEY,GAAA;AAAA,sBANA,OAAM;AAAA,sBACN,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACJ,UAAUT,EAAA;AAAA,sBACV,SAASA,oBAAkBA,EAAA,eAAe,SAASc,EAAK;AAAA,sBACxD,SAAK,CAAAb,MAAES,EAAA,kBAAkBI,GAAI,KAAA;AAAA;;kBAGvB,eAAWD,EACpB,CAEM,EAHkB,MAAAC,QAAI;AAAA,oBAChBA,EAAK,eAGjBlB,EAiCM,OAAAwB,IAAA;AAAA,sBAhCJvB,EAKEY,GAAA;AAAA,wBAJA,OAAM;AAAA,wBACN,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACJ,SAAK,CAAAR,MAAES,EAAA,cAAcI,GAAI,QAAA;AAAA;sBAE5BjB,EAyBSwB,GAAA,MAAA;AAAA,wBAxBI,WAASR,EAClB,CASE,EAVoB,OAAAS,QAAK;AAAA,0BAC3BzB,EASEY,GATFc,EASE;AAAA,4BARA,OAAM;AAAA,4BACN,SAAQ;AAAA,4BACR,MAAK;AAAA,4BACJ,UAAUvB,EAAA;AAAA,4BACV,SAAkCA,EAAA,kBAAkBA,EAAA,eAAe,SAASc,EAAK;AAAA,6BAG1EQ,CAAK,GAAA,MAAA,IAAA,CAAA,YAAA,SAAA,CAAA;AAAA;mCAGjB,MAWS;AAAA,0BAXTzB,EAWS2B,GAAA,MAAA;AAAA,uCAVP,MAIc;AAAA,8BAJd3B,EAIc4B,GAAA;AAAA,gCAHX,SAAK,CAAAxB,MAAES,EAAA,kBAAkBI,GAAI,UAAA,MAAA;AAAA;2CAE9B,MAAuD;AAAA,kCAAvDjB,EAAuD6B,GAAA,MAAA;AAAA,+CAApC,MAAgB,CAAA,GAAAvB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,wCAAhB,oBAAgB,EAAA;AAAA;;;;;;8BAErCN,EAIc4B,GAAA;AAAA,gCAHX,SAAK,CAAAxB,MAAES,EAAA,kBAAkBI,GAAI,UAAA,MAAA;AAAA;2CAE9B,MAAuD;AAAA,kCAAvDjB,EAAuD6B,GAAA,MAAA;AAAA,+CAApC,MAAgB,CAAA,GAAAvB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,wCAAhB,oBAAgB,EAAA;AAAA;;;;;;;;;;;;gCAhC3CP,EAEM,OAAA+B,IAAA,CAAA,GAAAxB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,sBADJc,EAAgB,cAAV,OAAG,EAAA;AAAA;;;;;;;;;;;;;IA2CbjB,EAAA,mBADR4B,EAQEC,IAAA;AAAA;kBANS7B,EAAA;AAAA,oDAAAA,EAAA,aAAUC;AAAA,MAClB,SAASD,EAAA;AAAA,MACV,MAAK;AAAA,MACJ,MAAMA,EAAA;AAAA,MACN,UAAUA,EAAA;AAAA,MACV,iCAAQA,EAAA,aAAU;AAAA;;;oDCnHpBjC,KAAU;AAAA,EACb,OAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA;;EAGd,OAAO,CAAC,QAAQ,mBAAmB;AAAA,EACnC,OAAO;AACL,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC,EAAE,OAAO,WAAW,OAAO,WAAW,UAAU,IAAO;AAAA,MACjE,qBAAqB,CAAC,iBAAiB,kBAAkB;AAAA,MACzD,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,MACR,MAAM;AACJ,eAAO,KAAK;AAAA,MACd;AAAA,MACA,IAAI+D,GAAO;AACT,aAAK,MAAM,qBAAqBA,CAAK;AAAA,MACvC;AAAA;;EAGJ,OAAO;AAAA,IACL,cAAc,SAAUC,GAAUC,GAAU;AAC1C,WAAK,MAAM,QAAQD,CAAQ;AAAA,IAC7B;AAAA;EAEF,SAAS;AAAA,IACP,aAAaE,GAAS;AACpB,aACEA,EAAQ,MAAM,yDAAyD,IAEhE,iBAEPA,EAAQ;AAAA,QACN;AAAA,MACF,IAEO,eAEA;AAAA,IAEX;AAAA,IACA,cAAc;AACZ,YAAMC,IAAS,KAAK,SAAS,IAAI,CAACD,MAAYA,EAAQ,OAAO,EAAE,KAAK;AAAA,CAAI,GAClExC,IAAO,IAAI,KAAK,CAACyC,CAAM,GAAG;AAAA,QAC9B,MAAM;AAAA,OACP,GAEKxC,IAAO,SAAS,cAAc,GAAG;AACvC,MAAAA,EAAK,OAAO,IAAI,gBAAgBD,CAAI,GACpCC,EAAK;AAAA,QACH;AAAA,QACAF,GAAO,KAAK,OAAO,qBAAqB,IAAI;AAAA,MAC9C,GACAE,EAAK,MAAK;AAAA,IACZ;AAAA,IACA,UAAU,WAAY;AACpB,WAAK,QACF,QAAQ,2CAA2C;AAAA,QAClD,QAAQ;AAAA,QACR,YAAY;AAAA,OACb,EACA,KAAK,CAACN,MAAW;AAChB,aAAK,WAAW,CAAA;AAAA,MAClB,CAAC,EACA,MAAM,SAAU+C,GAAK;AAAA,MAEtB,CAAC;AAAA,IACL;AAAA;AAEJ;;;cAjJEP,EAgES9B,GAAA,MAAA;AAAA,eA/DP,MA6Ce;AAAA,MA7CfD,EA6CeS,GAAA,EA7CD,OAAM,sBAAqB,GAAA;AAAA,mBACvC,MAQE;AAAA,UARFT,EAQEY,GAAA;AAAA,YAPA,OAAM;AAAA,YACN,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,aAAU;AAAA,YACV,cAAW;AAAA,YACV,SAAOC,EAAA;AAAA;4BACR,qBAEF,EAAA;AAAA,UAAAb,EAAYW,CAAA;AAAA,UACZX,EASEuC,GAAA;AAAA,wBARSpC,EAAA;AAAA,0DAAAA,EAAA,eAAYC;AAAA,YACrB,SAAQ;AAAA,YACR,gBAAA;AAAA,YACA,SAAQ;AAAA,YACP,OAAOD,EAAA;AAAA,YACR,OAAM;AAAA,YACN,OAAA,EAAA,aAAA,QAAA;AAAA,YACA,aAAU;AAAA;UAEZH,EAAYW,CAAA;AAAA,UACZX,EAWEc,GAAA;AAAA,wBAVSX,EAAA;AAAA,0DAAAA,EAAA,SAAMC;AAAA,YACf,OAAM;AAAA,YACN,sBAAmB;AAAA,YACnB,WAAA;AAAA,YACA,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,eAAA;AAAA,YACA,gBAAA;AAAA,YACA,OAAM;AAAA,YACN,aAAU;AAAA;UAGZJ,EAQEY,GAAA;AAAA,YAPA,OAAM;AAAA,YACN,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,aAAU;AAAA,YACV,cAAW;AAAA,YACV,SAAOC,EAAA;AAAA;;;;MAGZb,EAgBcwC,GAAA,MAAA;AAAA,mBAfZ,MAce;AAAA,UAdfxC,EAceyC,GAAA;AAAA,YAbb,IAAG;AAAA,YACH,OAAA,EAAA,UAAA,OAAA;AAAA,YACC,SAAStC,EAAA;AAAA,YACT,OAAOU,EAAA;AAAA,YACP,QAAQV,EAAA;AAAA,YACR,kBAAgB;AAAA,YACjB,uBAAA;AAAA,YACA,SAAQ;AAAA,YACR,aAAU;AAAA;YAEC,gBAAYa,EACrB,CAAiE,EADxC,MAAAC,QAAI;AAAA,cAC7BG,EAAiE,OAAA;AAAA,gBAA3D,OAAKsB,GAAE7B,EAAA,aAAaI,EAAK,OAAO,CAAA;AAAA,cAAM,GAAAE,EAAAF,EAAK,OAAO,GAAA,CAAA;AAAA;;;;;;;;;;oDClF5D0B,KAAK;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,IACL,YAAY,EAAE,MAAM,SAAS,SAAS,GAAE;AAAA,IACxC,gBAAgB,EAAE,MAAM,SAAS,SAAS,GAAE;AAAA,IAC5C,eAAe,EAAE,MAAM,SAAS,SAAS,GAAE;AAAA;AAAA,IAE3C,KAAK,EAAE,MAAM,SAAS,SAAS,GAAE;AAAA;AAAA,IAEjC,eAAe,EAAE,MAAM,SAAS,SAAS,GAAE;AAAA,EAC/C;AAAA,EACE,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACE,MAAMC,GAAG,EAAE,MAAMC,EAAC,GAAI;AACpB,UAAMC,IAAID,GAAGE,IAAIH,GAAGI,IAAIC,GAAE,GAAIC,IAAIC,GAAE,CAAA,CAAE,GAAGC,IAAIC,EAAE,MAAMH,EAAE,MAAM,OAAO,CAACI,GAAGC,OAAOD,EAAE,CAAC,CAACC,EAAE,EAAE,IAAIA,MAAMD,GAAG,CAAA,CAAE,CAAC,GAAG,IAAID,EAAE,MAAMH,EAAE,MAAM,MAAM,GAAGM,IAAIL,GAAE,IAAI,GAAGM,IAAIN,GAAE,EAAE,GAAGO,IAAIP,GAAE;AAAA,MACnK,WAAW;AAAA,MACX,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,cAAc;AAAA;AAAA,IAEpB,CAAK,GAAGQ,IAAIR,GAAE;AAAA;AAAA,MAER,UAAU;AAAA,MACV,WAAW;AAAA,IACjB,CAAK,GAAGS,IAAIP,EAAE,OAAO;AAAA,MACf,CAAC,0BAA0BN,EAAE,aAAa,eAAe,UAAU,EAAE,GAAG;AAAA,MACxE,wBAAwBW,EAAE,MAAM;AAAA,IACtC,EAAM,GAAG,IAAI,MAAM;AACb,eAAS,iBAAiB,aAAaG,GAAG,EAAE,SAAS,GAAE,CAAE,GAAG,SAAS,iBAAiB,WAAWC,CAAC,GAAG,kBAAkB,WAAW,SAAS,iBAAiB,aAAaD,GAAG,EAAE,SAAS,GAAE,CAAE,GAAG,SAAS,iBAAiB,YAAYC,CAAC;AAAA,IACvO,GAAGC,IAAI,MAAM;AACX,eAAS,oBAAoB,aAAaF,GAAG,EAAE,SAAS,GAAE,CAAE,GAAG,SAAS,oBAAoB,WAAWC,CAAC,GAAG,kBAAkB,WAAW,SAAS,oBAAoB,aAAaD,GAAG,EAAE,SAAS,GAAE,CAAE,GAAG,SAAS,oBAAoB,YAAYC,CAAC;AAAA,IACnP,GAAGE,IAAI,CAACV,GAAGC,MAAM;AACf,YAAMU,IAAIX,EAAE,OAAO,QAAQ,uBAAuB;AAClD,UAAIW,GAAG;AACL,cAAM,EAAE,MAAMC,GAAG,KAAKC,EAAC,IAAKF,EAAE,yBAAyB,EAAE,SAASG,GAAG,SAASC,EAAC,IAAK,kBAAkB,UAAUf,EAAE,UAAUA,EAAE,QAAQ,CAAC,IAAIA;AAC3I,QAAAI,EAAE,MAAM,eAAeX,EAAE,aAAasB,IAAIF,IAAIC,IAAIF;AAAA,MACpD;AACA,QAAC,GAAIR,EAAE,MAAM,YAAY,IAAIA,EAAE,MAAM,iBAAiBH;AAAA,IACxD,GAAGM,IAAI,CAACP,MAAM;AACZ,MAAAI,EAAE,MAAM,cAAcJ,EAAE,eAAc,GAAII,EAAE,MAAM,WAAW,IAAI,sBAAsB,MAAM;AAC3F,QAAAY,EAAEC,EAAEjB,CAAC,CAAC,GAAGkB,EAAE,UAAU,EAAE,OAAOlB,EAAC,GAAI,EAAE;AAAA,MACvC,CAAC;AAAA,IACH,GAAGQ,IAAI,CAACR,MAAM;AACZ,MAAAI,EAAE,MAAM,aAAa,OAAO,aAAY,EAAG,gBAAe,GAAIc,EAAE,WAAW,EAAE,OAAOlB,EAAC,GAAI,EAAE,IAAII,EAAE,MAAM,YAAY,IAAIA,EAAE,MAAM,iBAAiB,MAAM,WAAW,MAAM;AACrK,QAAAA,EAAE,MAAM,WAAW,IAAIK,EAAC;AAAA,MAC1B,GAAG,GAAG;AAAA,IACR,GAAGU,IAAI,CAACnB,GAAGC,MAAM;AACf,wBAAkB,WAAWD,EAAE,eAAc,GAAIK,EAAE,MAAM,aAAaJ,KAAK,aAAaI,EAAE,MAAM,SAAS,GAAGA,EAAE,MAAM,YAAY,MAAMe,EAAEpB,GAAGC,CAAC,GAAGI,EAAE,MAAM,WAAW,SAASA,EAAE,MAAM,WAAWJ,GAAGI,EAAE,MAAM,YAAY,WAAW,MAAMA,EAAE,MAAM,WAAW,MAAM,GAAG,KAAKD,EAAE,MAAM,YAAYc,EAAE,kBAAkB,EAAE,OAAOlB,GAAG,OAAOC,EAAC,GAAI,EAAE;AAAA,IAC3U,GAAGmB,IAAI,CAACpB,GAAGC,MAAM;AACf,UAAIiB,EAAE,qBAAqB,EAAE,OAAOlB,GAAG,OAAOC,KAAK,EAAE,GAAGR,EAAE,eAAe;AACvE,YAAIkB,IAAI;AACR,QAAAf,EAAE,QAAQA,EAAE,MAAM,IAAI,CAACgB,GAAGC,OAAOD,EAAE,OAAOC,MAAMZ,IAAIW,EAAE,MAAMA,EAAE,KAAKC,MAAMZ,MAAMU,KAAKC,EAAE,MAAMA,EAAE,GAAGhB,EAAE,MAAMK,CAAC,EAAE,QAAQU,GAAGO,EAAE,iBAAiB,EAAE,OAAOlB,GAAG,OAAOC,GAAG,MAAML,EAAE,MAAMK,CAAC,EAAC,CAAE,GAAGiB,EAAE,WAAW,EAAE,OAAOlB,GAAG,OAAOC,EAAC,GAAI,EAAE;AAAA,MAC9N;AAAA,IACF,GAAGoB,KAAI,CAACrB,GAAGC,MAAM;AACf,MAAAiB,EAAE,cAAc;AAAA,QACd,OAAOlB;AAAA,QACP,OAAOF,EAAE,MAAMG,CAAC,EAAE;AAAA,QAClB,MAAMH,EAAE,MAAMG,CAAC;AAAA,MACvB,CAAO;AAAA,IACH,GAAGgB,IAAI,CAACjB,MAAM;AACZ,YAAMC,IAAIC,EAAE,MAAM,sBAAqB,GAAI,EAAE,SAASS,GAAG,SAASC,EAAC,IAAK,kBAAkB,UAAUZ,EAAE,UAAUA,EAAE,QAAQ,CAAC,IAAIA;AAC/H,aAAO;AAAA,QACL,GAAGW,KAAKlB,EAAE,aAAa,IAAIW,EAAE,MAAM,gBAAgBH,EAAE;AAAA,QACrD,GAAGW,KAAKnB,EAAE,aAAaW,EAAE,MAAM,eAAe,KAAKH,EAAE;AAAA,MAC7D;AAAA,IACI,GAAGqB,KAAI,CAACtB,MAAM;AACZ,MAAAA,IAAIA,EAAEP,EAAE,aAAa,MAAM,GAAG;AAC9B,YAAMQ,IAAIC,EAAE,MAAMT,EAAE,aAAa,iBAAiB,aAAa;AAC/D,aAAOA,EAAE,OAAO,CAACA,EAAE,eAAeO,IAAIC,IAAID,IAAIA,IAAI,MAAMC;AAAA,IAC1D,GAAGe,IAAI,CAAChB,MAAM;AACZ,YAAMC,IAAIG,EAAE,MAAM;AAClB,UAAIO,IAAI;AAAA,QACN,eAAeY,GAAEtB,CAAC;AAAA,QAClB,eAAeuB,EAAEvB,CAAC;AAAA,QAClB,qBAAqB;AAAA,QACrB,qBAAqB;AAAA,MAC7B;AACM,YAAMW,IAAI,KAAKnB,EAAE,iBAAiB,IAAIkB,EAAE,gBAAgBE,IAAI,OAAOpB,EAAE,iBAAiB,IAAIkB,EAAE,gBAAgBG,IAAI,KAAK,IAAI,KAAK,IAAIQ,GAAEtB,CAAC,GAAGa,CAAC,GAAGD,CAAC;AAC7I,UAAIG,IAAI,CAACd,GAAGA,IAAI,CAAC,GAAGwB,IAAI7B,EAAE,MAAMmB,EAAE,CAAC,CAAC,KAAK,MAAMW,IAAI9B,EAAE,MAAMmB,EAAE,CAAC,CAAC,KAAK;AACpE,YAAMY,KAAIF,EAAE,MAAM,OAAOX,KAAKW,EAAE,MAAMd,EAAE,eAAeiB,KAAKF,EAAE,MAAM,OAAOZ,KAAK,OAAOY,EAAE,MAAMF,EAAEvB,IAAI,CAAC;AACtG,UAAI0B,MAAKC,IAAI;AACX,QAAAD,MAAKF,EAAE,OAAOA,EAAE,KAAKC,EAAE,OAAO,KAAK,IAAI,MAAMD,EAAE,MAAMd,EAAE,gBAAgBA,EAAE,eAAe,CAAC,MAAMc,EAAE,OAAO,KAAK,IAAI,MAAMC,EAAE,MAAMf,EAAE,gBAAgBa,EAAEvB,IAAI,CAAC,GAAG,CAAC,GAAGyB,EAAE,OAAOA,EAAE;AAC1K;AAAA,MACF;AACA,UAAIjC,EAAE,gBAAgB;AACpB,cAAMoC,KAAIC,EAAEnB,GAAGG,CAAC;AAChB,YAAI,CAACe,GAAG;AACR,SAAC,EAAE,MAAMlB,GAAG,eAAeI,EAAC,IAAKc,KAAIJ,IAAI7B,EAAE,MAAMmB,EAAE,CAAC,CAAC,KAAK,MAAMW,IAAI9B,EAAE,MAAMmB,EAAE,CAAC,CAAC,KAAK;AAAA,MACvF;AACA,MAAAU,MAAM,SAASA,EAAE,OAAO,KAAK,IAAI,KAAK,IAAIX,IAAIH,EAAE,gBAAgBA,EAAE,qBAAqBc,EAAE,GAAG,GAAGA,EAAE,GAAG,IAAIC,MAAM,SAASA,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,MAAMZ,IAAIH,EAAE,gBAAgBA,EAAE,qBAAqBe,EAAE,GAAG,GAAGA,EAAE,GAAG;AAAA,IACpN,GAAGI,IAAI,CAAC9B,GAAGC,MAAM;AACf,YAAMU,IAAIP,EAAE,MAAM,gBAAgBQ,IAAI,CAACD,GAAGA,IAAI,CAAC;AAC/C,aAAOV,IAAID,EAAE,gBAAgBJ,EAAE,MAAMgB,EAAE,CAAC,CAAC,EAAE,QAAQA,EAAE,CAAC,IAAImB,GAAEpB,CAAC,EAAE,OAAOX,EAAE,sBAAsB,GAAGY,EAAE,CAAC,IAAID,KAAKf,EAAE,MAAM,QAAQ,CAACiB,GAAGC,MAAM;AACrI,QAAAA,IAAIF,EAAE,CAAC,KAAKE,KAAKH,MAAME,EAAE,OAAOA,EAAE,KAAKb,EAAE,uBAAuBa,EAAE;AAAA,MACpE,CAAC,GAAGb,EAAE,gBAAgBuB,GAAEX,EAAE,CAAC,CAAC,GAAGA,EAAE,CAAC,MAAM,WAAWZ,EAAE,sBAAsB,GAAGJ,EAAE,MAAM,CAAC,EAAE,OAAOA,EAAE,MAAM,CAAC,EAAE,KAAKA,EAAE,MAAM,QAAQ,CAACiB,GAAGC,MAAM;AACxI,QAAAA,IAAI,KAAKA,KAAKH,MAAME,EAAE,OAAOA,EAAE,KAAKb,EAAE,uBAAuBa,EAAE;AAAA,MACjE,CAAC,GAAGjB,EAAE,MAAMgB,EAAE,CAAC,CAAC,EAAE,OAAO,MAAMZ,EAAE,sBAAsBJ,EAAE,MAAM,CAAC,EAAE,MAAMI,EAAE,gBAAgBA,EAAE,eAAe,QAAQC,IAAI,MAAMD,EAAE,gBAAgBJ,EAAE,MAAMgB,EAAE,CAAC,CAAC,EAAE,QAAQA,EAAE,CAAC,IAAIoB,GAAErB,CAAC,EAAE,OAAOX,EAAE,sBAAsB,GAAGY,EAAE,CAAC,IAAID,IAAI,KAAKf,EAAE,MAAM,QAAQ,CAACiB,GAAGC,MAAM;AAC3P,QAAAA,IAAIH,KAAKG,IAAIF,EAAE,CAAC,MAAMC,EAAE,OAAOA,EAAE,KAAKb,EAAE,uBAAuBa,EAAE;AAAA,MACnE,CAAC,GAAGb,EAAE,gBAAgBwB,EAAEZ,EAAE,CAAC,IAAI,CAAC,GAAGA,EAAE,CAAC,MAAM,WAAWZ,EAAE,sBAAsB,GAAGJ,EAAE,MAAM,QAAQ,CAACiB,GAAGC,MAAM;AAC1G,QAAAA,IAAI,EAAE,QAAQ,KAAKA,KAAKH,IAAI,MAAME,EAAE,OAAOA,EAAE,KAAKb,EAAE,uBAAuBa,EAAE;AAAA,MAC/E,CAAC,GAAGjB,EAAE,MAAMgB,EAAE,CAAC,CAAC,EAAE,OAAO,MAAMZ,EAAE,gBAAgBwB,EAAEZ,EAAE,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,MAAMZ,GAAG,eAAeY,EAAC;AAAA,IACnG,GAAGW,KAAI,CAACvB,MAAMJ,EAAE,MAAM,OAAO,CAACK,GAAGU,GAAGC,MAAMX,KAAKW,IAAIZ,IAAIW,EAAE,OAAO,IAAI,CAAC,GAAGa,IAAI,CAACxB,MAAMJ,EAAE,MAAM,OAAO,CAACK,GAAGU,GAAGC,MAAMX,KAAKW,IAAIZ,IAAI,IAAIW,EAAE,OAAO,IAAI,CAAC,GAAGoB,KAAI,CAAC/B,MAAM,CAAC,GAAGJ,EAAE,KAAK,EAAE,QAAO,EAAG,KAAK,CAACe,MAAMA,EAAE,QAAQX,KAAKW,EAAE,OAAOA,EAAE,GAAG,KAAK,CAAA,GAAIqB,KAAI,CAAChC,MAAMJ,EAAE,MAAM,KAAK,CAACe,MAAMA,EAAE,QAAQX,IAAI,KAAKW,EAAE,OAAOA,EAAE,GAAG,KAAK,CAAA,GAAIsB,KAAK,MAAM;AACvT,UAAIhC;AACJ,YAAMD,IAAI,MAAM,OAAOC,IAAIC,EAAE,UAAU,OAAO,SAASD,EAAE,aAAa,CAAA,CAAE;AACxE,iBAAWU,KAAKX,GAAG;AACjB,cAAMY,IAAID,EAAE,UAAU,SAAS,kBAAkB,GAAGE,IAAIF,EAAE,UAAU,SAAS,sBAAsB;AACnG,SAACC,KAAK,CAACC,MAAMF,EAAE,OAAM,GAAI,QAAQ,KAAK,8GAA8G;AAAA,MACtJ;AAAA,IACF,GAAGuB,KAAI,CAAClC,GAAGC,GAAGU,IAAI,OAAO;AACvB,YAAMC,IAAIZ,IAAI,GAAGa,IAAI,SAAS,cAAc,KAAK;AACjD,MAAAA,EAAE,UAAU,IAAI,sBAAsB,GAAGF,MAAME,EAAE,cAAc,CAACC,MAAMJ,EAAEI,GAAGF,CAAC,GAAG,OAAO,SAAS,OAAO,kBAAkB,WAAWC,EAAE,eAAe,CAACC,MAAMJ,EAAEI,GAAGF,CAAC,IAAIC,EAAE,UAAU,CAACC,MAAMK,EAAEL,GAAGF,IAAI,CAAC,IAAIC,EAAE,aAAa,CAACC,MAAMM,EAAEN,GAAGF,IAAI,CAAC,GAAGX,EAAE,WAAW,aAAaY,GAAGZ,CAAC;AAAA,IACzQ,GAAGkC,KAAK,CAACnC,MAAM;AACb,MAAAA,EAAE,cAAc,QAAQA,EAAE,UAAU,QAAQA,EAAE,aAAa,QAAQA,EAAE,OAAM;AAAA,IAC7E,GAAGoC,IAAI,MAAM;AACX,UAAIzB;AACJ,YAAMX,IAAI,MAAM,OAAOW,IAAIT,EAAE,UAAU,OAAO,SAASS,EAAE,aAAa,CAAA,CAAE;AACxE,iBAAWC,KAAKZ;AACd,QAAAY,EAAE,UAAU,SAAS,sBAAsB,KAAKuB,GAAGvB,CAAC;AACtD,UAAIX,IAAI;AACR,iBAAWW,KAAKZ;AACd,QAAAY,EAAE,UAAU,SAAS,kBAAkB,MAAM,CAACX,KAAKR,EAAE,gBAAgByC,GAAEjC,GAAGW,GAAG,EAAE,IAAIX,KAAKiC,GAAEjC,GAAGW,CAAC,GAAGX;AAAA,IACrG,GAAGoC,KAAK,CAAC,EAAE,KAAKrC,GAAG,GAAGC,QAAQ;AAC5B,YAAMU,IAAIb,EAAE,MAAME,CAAC;AACnB,iBAAW,CAACY,GAAGC,CAAC,KAAK,OAAO,QAAQZ,CAAC,EAAG,CAAAU,EAAEC,CAAC,IAAIC;AAAA,IACjD,GAAGyB,KAAK,CAACtC,MAAM;AACb,UAAIW;AACJ,UAAIV,IAAI;AACR,YAAM,OAAOU,IAAIT,EAAE,UAAU,OAAO,SAASS,EAAE,aAAa,CAAA,CAAE,EAAE,KAAK,CAACC,OAAOA,EAAE,UAAU,SAAS,kBAAkB,KAAKX,KAAKW,EAAE,WAAWZ,EAAE,EAAE,EAAE,GAAGJ,EAAE,MAAM,OAAOK,GAAG,GAAG,EAAE,GAAGD,GAAG,OAAOC,EAAC,CAAE,GAAGL,EAAE,MAAM,QAAQ,CAACgB,GAAGC,MAAMD,EAAE,QAAQC,CAAC,GAAGV,EAAE,SAASoC,GAAE,MAAM;AACvP,QAAAH,EAAC,GAAII,GAAE,EAAE,WAAW5C,EAAE,MAAMK,CAAC,EAAC,CAAE,GAAGiB,EAAE,YAAY,EAAE,MAAMtB,EAAE,MAAMK,CAAC,GAAG;AAAA,MACvE,CAAC;AAAA,IACH,GAAGwC,KAAK,CAACzC,MAAM;AACb,YAAMC,IAAIL,EAAE,MAAM,UAAU,CAACgB,MAAMA,EAAE,OAAOZ,CAAC;AAC7C,MAAAJ,EAAE,MAAMK,CAAC,EAAE,KAAK;AAChB,YAAMU,IAAIf,EAAE,MAAM,OAAOK,GAAG,CAAC,EAAE,CAAC;AAChC,MAAAL,EAAE,MAAM,QAAQ,CAACgB,GAAGC,MAAMD,EAAE,QAAQC,CAAC,GAAG0B,GAAE,MAAM;AAC9C,QAAAH,EAAC,GAAIlB,EAAE,eAAe,EAAE,MAAMP,EAAC,CAAE,GAAG6B,GAAE,EAAE,aAAa,EAAE,GAAG7B,EAAC,EAAE,CAAE;AAAA,MACjE,CAAC;AAAA,IACH,GAAG6B,KAAI,CAACxC,IAAI,OAAO;AACjB,OAACA,EAAE,aAAa,CAACA,EAAE,cAAc0C,GAAE,IAAK9C,EAAE,MAAM,KAAK,CAACK,MAAMA,EAAE,cAAc,QAAQA,EAAE,OAAOA,EAAE,MAAM,GAAG,IAAI0C,GAAG3C,CAAC,IAAI4C,GAAE,GAAIzC,EAAE,SAASe,EAAE,SAAS;AAAA,IAClJ,GAAG0B,KAAK,MAAM;AACZ,YAAM5C,IAAI,MAAM,EAAE;AAClB,UAAIC,IAAI;AACR,YAAMU,IAAI,IAAIC,IAAI,CAAA;AAClB,iBAAWC,KAAKjB,EAAE;AAChB,QAAAiB,EAAE,OAAO,KAAK,IAAI,KAAK,IAAIb,GAAGa,EAAE,GAAG,GAAGA,EAAE,GAAG,GAAGZ,KAAKY,EAAE,MAAMA,EAAE,QAAQA,EAAE,OAAOF,EAAE,KAAKE,EAAE,EAAE,GAAGA,EAAE,QAAQA,EAAE,OAAOD,EAAE,KAAKC,EAAE,EAAE;AAC5H,MAAAZ,IAAI,OAAO4C,GAAE5C,GAAGU,GAAGC,CAAC;AAAA,IACtB,GAAG8B,KAAK,MAAM;AACZ,UAAI1C,IAAI;AACR,YAAMC,IAAI,IAAIU,IAAI,CAAA;AAClB,UAAIC,IAAI;AACR,iBAAWE,KAAKlB,EAAE;AAChB,QAAAI,KAAKc,EAAE,MAAMA,EAAE,cAAc,QAAQF,KAAKE,EAAE,QAAQA,EAAE,OAAOb,EAAE,KAAKa,EAAE,EAAE,GAAGA,EAAE,QAAQA,EAAE,OAAOH,EAAE,KAAKG,EAAE,EAAE;AAC3G,UAAID,IAAI;AACR,UAAIb,IAAI,KAAK;AACX,mBAAWc,KAAKlB,EAAE;AAChB,UAAAkB,EAAE,cAAc,SAASA,EAAE,OAAO,KAAK,IAAI,KAAK,IAAId,KAAK,EAAE,QAAQY,IAAIE,EAAE,GAAG,GAAGA,EAAE,GAAG,IAAID,KAAKC,EAAE;AACjG,QAAAD,IAAI,OAAOgC,GAAEhC,GAAGZ,GAAGU,CAAC;AAAA,MACtB;AAAA,IACF,GAAGgC,KAAK,CAAC,EAAE,WAAW3C,GAAG,aAAaC,EAAC,IAAK,OAAO;AACjD,UAAIU,IAAI,MAAM,EAAE,OAAOC,IAAI;AAC3B,YAAMC,IAAI,IAAIC,IAAI,CAAA;AAClB,QAAEd,KAAK,OAAO,SAASA,EAAE,cAAc,UAAU,SAASW,KAAK,MAAMX,EAAE,cAAc,EAAE,QAAQ;AAC/F,iBAAWe,KAAKnB,EAAE;AAChB,QAAAgB,KAAKG,EAAE,MAAMA,EAAE,QAAQA,EAAE,OAAOF,EAAE,KAAKE,EAAE,EAAE,GAAGA,EAAE,QAAQA,EAAE,OAAOD,EAAE,KAAKC,EAAE,EAAE;AAC9E,UAAI,EAAE,KAAK,IAAIH,CAAC,IAAI,MAAM;AACxB,mBAAWG,KAAKnB,EAAE;AAChB,WAACI,KAAK,OAAO,SAASA,EAAE,eAAe,SAASA,KAAK,OAAO,SAASA,EAAE,QAAQe,EAAE,OAAOA,EAAE,OAAO,KAAK,IAAI,KAAK,IAAIJ,GAAGI,EAAE,GAAG,GAAGA,EAAE,GAAG,IAAIH,KAAKG,EAAE,MAAMA,EAAE,QAAQA,EAAE,OAAOF,EAAE,KAAKE,EAAE,EAAE,GAAGA,EAAE,QAAQA,EAAE,OAAOD,EAAE,KAAKC,EAAE,EAAE;AACrN,QAAAH,IAAI,OAAOiC,GAAEjC,GAAGC,GAAGC,CAAC;AAAA,MACtB;AAAA,IACF,GAAG+B,KAAI,CAAC7C,GAAGC,GAAGU,MAAM;AAClB,UAAIC;AACJ,MAAAZ,IAAI,IAAIY,IAAIZ,KAAK,EAAE,QAAQC,EAAE,UAAUW,IAAIZ,KAAK,EAAE,QAAQW,EAAE,SAASf,EAAE,MAAM,QAAQ,CAACiB,GAAGC,MAAM;AAC7F,YAAId,IAAI,KAAK,CAACC,EAAE,SAASY,EAAE,EAAE,GAAG;AAC9B,gBAAME,IAAI,KAAK,IAAI,KAAK,IAAIF,EAAE,OAAOD,GAAGC,EAAE,GAAG,GAAGA,EAAE,GAAG,GAAGY,IAAIV,IAAIF,EAAE;AAClE,UAAAb,KAAKyB,GAAGZ,EAAE,OAAOE;AAAA,QACnB,WAAW,CAACJ,EAAE,SAASE,EAAE,EAAE,GAAG;AAC5B,gBAAME,IAAI,KAAK,IAAI,KAAK,IAAIF,EAAE,OAAOD,GAAGC,EAAE,GAAG,GAAGA,EAAE,GAAG,GAAGY,IAAIV,IAAIF,EAAE;AAClE,UAAAb,KAAKyB,GAAGZ,EAAE,OAAOE;AAAA,QACnB;AAAA,MACF,CAAC,GAAG,KAAK,IAAIf,CAAC,IAAI,OAAOuC,GAAE,MAAM;AAC/B,QAAApC,EAAE,SAAS,QAAQ,KAAK,wEAAwE;AAAA,MAClG,CAAC;AAAA,IACH,GAAGe,IAAI,CAAClB,GAAGC,IAAI,QAAQU,IAAI,OAAO;AAChC,YAAMC,KAAKX,KAAK,OAAO,SAASA,EAAE,UAAUG,EAAE,MAAM,kBAAkB;AACtE,MAAAZ,EAAEQ,GAAG;AAAA,QACH,GAAGC;AAAA,QACH,GAAGW,MAAM,QAAQ,EAAE,OAAOA,EAAC;AAAA,QAC3B,GAAGD,KAAKC,MAAM,QAAQ;AAAA,UACpB,UAAUhB,EAAE,MAAMgB,KAAKnB,EAAE,gBAAgB,IAAI,EAAE;AAAA,UAC/C,UAAUG,EAAE,MAAMgB,KAAKnB,EAAE,gBAAgB,IAAI,EAAE;AAAA,QACzD;AAAA,QACQ,OAAOG,EAAE,MAAM,IAAI,CAACiB,OAAO,EAAE,KAAKA,EAAE,KAAK,KAAKA,EAAE,KAAK,MAAMA,EAAE,OAAO;AAAA,MAC5E,CAAO;AAAA,IACH;AACAiC,IAAAA,GAAE,MAAMrD,EAAE,eAAe,MAAM2C,EAAC,CAAE,GAAGW,GAAE,MAAM;AAC3C,MAAAd,GAAE,GAAIG,EAAC,GAAII,GAAC,GAAItB,EAAE,OAAO,GAAGf,EAAE,QAAQ;AAAA,IACxC,CAAC,GAAG6C,GAAE,MAAM7C,EAAE,QAAQ,EAAE;AACxB,UAAM8C,KAAK,MAAM;AACf,UAAIjD;AACJ,aAAOkD;AAAAA,QACL;AAAA,QACA,EAAE,KAAKhD,GAAG,OAAOI,EAAE,MAAK;AAAA,SACvBN,IAAIN,EAAE,YAAY,OAAO,SAASM,EAAE,KAAKN,CAAC;AAAA,MACnD;AAAA,IACI;AACA,WAAOyD,EAAE,SAASvD,CAAC,GAAGuD,EAAE,gBAAgBrD,CAAC,GAAGqD,EAAE,cAAcpD,EAAE,MAAMN,EAAE,UAAU,CAAC,GAAG0D,EAAE,iBAAiBd,EAAE,GAAGc,EAAE,aAAab,EAAE,GAAGa,EAAE,gBAAgBV,EAAE,GAAGU,EAAE,eAAe9B,EAAC,GAAG,CAACrB,GAAGC,OAAOmD,EAAC,GAAIC,EAAGC,GAAGL,EAAE,CAAC;AAAA,EACvM;AACF,GAAGM,KAAK;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,IACL,MAAM,EAAE,MAAM,CAAC,QAAQ,MAAM,EAAC;AAAA,IAC9B,SAAS,EAAE,MAAM,CAAC,QAAQ,MAAM,GAAG,SAAS,EAAC;AAAA,IAC7C,SAAS,EAAE,MAAM,CAAC,QAAQ,MAAM,GAAG,SAAS,IAAG;AAAA,EACnD;AAAA,EACE,MAAMjE,GAAG;AACP,QAAIoB;AACJ,UAAMnB,IAAID,GAAGE,IAAIgE,GAAE,eAAe,GAAG/D,IAAI+D,GAAE,WAAW,GAAG9D,IAAI8D,GAAE,YAAY,GAAG5D,IAAI4D,GAAE,cAAc,GAAG1D,IAAI0D,GAAE,aAAa,GAAGC,KAAK/C,IAAIgD,GAAE,MAAO,OAAO,SAAShD,EAAE,KAAKR,IAAIsD,GAAE,cAAc,GAAGrD,IAAIJ,EAAE,MAAMG,EAAE,MAAMuD,CAAC,CAAC,GAAGrD,IAAIP,GAAE,IAAI,GAAGQ,IAAIN,EAAE,MAAM;AAC3O,YAAMQ,IAAI,MAAMhB,EAAE,IAAI,KAAKA,EAAE,SAAS,SAAS,IAAI,WAAWA,EAAE,IAAI;AACpE,aAAO,KAAK,IAAI,KAAK,IAAIgB,GAAGoD,EAAE,KAAK,GAAGrD,EAAE,KAAK;AAAA,IAC/C,CAAC,GAAGA,IAAIP,EAAE,MAAM;AACd,YAAMQ,IAAI,WAAWhB,EAAE,OAAO;AAC9B,aAAO,MAAMgB,CAAC,IAAI,IAAIA;AAAA,IACxB,CAAC,GAAGoD,IAAI5D,EAAE,MAAM;AACd,YAAMQ,IAAI,WAAWhB,EAAE,OAAO;AAC9B,aAAO,MAAMgB,CAAC,IAAI,MAAMA;AAAA,IAC1B,CAAC,GAAGE,IAAIV,EAAE,MAAM;AACd,UAAIQ;AACJ,aAAO,GAAGb,EAAE,QAAQ,WAAW,OAAO,MAAMa,IAAIJ,EAAE,UAAU,OAAO,SAASI,EAAE,IAAI;AAAA,IACpF,CAAC;AACD,WAAOuC,GAAE,MAAMzC,EAAE,OAAO,CAACE,MAAMf,EAAE,EAAE,KAAKiE,GAAG,MAAMlD,EAAC,CAAE,CAAC,GAAGuC,GAAE,MAAMxC,EAAE,OAAO,CAACC,MAAMf,EAAE,EAAE,KAAKiE,GAAG,KAAKlD,EAAC,CAAE,CAAC,GAAGuC,GAAE,MAAMa,EAAE,OAAO,CAACpD,MAAMf,EAAE,EAAE,KAAKiE,GAAG,KAAKlD,GAAG,CAAC,GAAGwC,GAAE,MAAM;AAC9J,MAAAtD,EAAE;AAAA,QACA,IAAIgE;AAAA,QACJ,IAAIrD,EAAE;AAAA,QACN,KAAKE,EAAE;AAAA,QACP,KAAKqD,EAAE;AAAA;AAAA,QAEP,WAAWpE,EAAE,SAAS,SAAS,OAAOc,EAAE;AAAA,QACxC,MAAMA,EAAE;AAAA;AAAA,MAEhB,CAAO;AAAA,IACH,CAAC,GAAG2C,GAAE,MAAMpD,EAAE6D,CAAC,CAAC,GAAG,CAAClD,GAAGC,OAAO4C,KAAKQ,EAAG,OAAO;AAAA,MAC3C,SAAS;AAAA,MACT,KAAKxD;AAAA,MACL,OAAO;AAAA,MACP,SAASI,EAAE,CAAC,MAAMA,EAAE,CAAC,IAAI,CAACW,MAAM0C,GAAG/D,CAAC,EAAEqB,GAAGZ,EAAE,EAAE,GAAG;AAAA,MAChD,OAAOuD,GAAGrD,EAAE,KAAK;AAAA,IACvB,GAAO;AAAA,MACDsD,GAAGxD,EAAE,QAAQ,SAAS;AAAA,IAC5B,GAAO,CAAC;AAAA,EACN;AACF,GChMK3F,KAAU;AAAA,EACb,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA;IAEZ,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,YAAY;AAAA;EAEd,OAAO;AACL,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,OAAO,CAAC,CAAC6G,MAAM,CAAC,CAACA,KAAK,UAAU;AAAA,IAClC;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AACJ,eAAO,KAAK;AAAA,MACd;AAAA,MACA,IAAI9C,GAAO;AACT,aAAK,MAAM,qBAAqBA,CAAK;AAAA,MACvC;AAAA;;EAGJ,UAAU;AACR,IAAI,KAAK,YACP,KAAK,QAAQ,IACb,KAAK,aAAa,KAAK,UAErB,KAAK,mBAAmB,OAC1B,KAAK,QAAQ,IACb,KAAK,QAAQ,CAAC,CAAC8C,MAAM,EAAI;AAAA,EAE7B;AAAA,EACA,SAAS;AAAA,IACP,eAAe,WAAY;AACzB,WAAK,MAAM,YAAY,KAAK,UAAU;AAAA,IACxC;AAAA,IACA,eAAe,WAAY;AACzB,WAAK,MAAM,YAAY,QAAQ;AAAA,IACjC;AAAA;AAEJ,GA5FajD,KAAA,EAAA,OAAM,OAAM,GAERP,KAAA,EAAA,OAAM,WAAU;;;cAV/BQ,EAyCWuF,GAAA;AAAA,gBAzCQzG,EAAA;AAAA,kDAAAA,EAAA,OAAIT;AAAA,IAAE,YAAA;AAAA,IAAW,OAAM;AAAA;eACxC,MAuCS;AAAA,MAvCTJ,EAuCSC,GAAA,MAAA;AAAA,mBAtCP,MAqCS;AAAA,UArCTD,EAqCSuH,GAAA;AAAA,wBArCQpH,EAAA;AAAA,0DAAAA,EAAA,QAAKC;AAAA,YAAG,aAAgBS,EAAA,eAAa,CAAA,SAAA,CAAA;AAAA;uBACpD,MAIY;AAAA,cAJZb,EAIYwH,GAAA,EAJD,QAAO,KAAI,GAAA;AAAA,2BACpB,MAAY;AAAA,kBAAZxH,EAAYW,CAAA;AAAA,kBACZL,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAc,EAAkC,cAA5B,yBAAqB,EAAA;AAAA,kBAC3BpB,EAAYW,CAAA;AAAA;;;cAEdS,EAWM,OAXNU,IAWM;AAAA,gBAVJ9B,EAScwC,GAAA,MAAA;AAAA,6BARZ,MAA0C;AAAA,oBAA1CpB,EAA0C,OAA1CG,IAA0CJ,EAAjBG,EAAA,QAAQ,GAAA,CAAA;AAAA,oBACjCtB,EAMEc,GAAA;AAAA,kCALSX,EAAA;AAAA,oEAAAA,EAAA,aAAUC;AAAA,sBACnB,WAAA;AAAA,sBACA,aAAU;AAAA,sBACT,MAAMkB,EAAA,WAAQ,aAAA;AAAA,sBACd,OAAOnB,EAAA;AAAA;;;;;cAIdH,EAkBiByH,GAAA,EAlBD,OAAM,OAAM,GAAA;AAAA,2BAC1B,MAAY;AAAA,kBAAZzH,EAAYW,CAAA;AAAA,kBACZX,EAMQY,GAAA;AAAA,oBALN,SAAQ;AAAA,oBACR,aAAU;AAAA,oBACT,SAAOC,EAAA;AAAA;+BACT,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,wBAFC,YAED,EAAA;AAAA;;;kBACAN,EAQQY,GAAA;AAAA,oBAPN,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,aAAU;AAAA,oBACT,WAAWT,EAAA;AAAA,oBACX,YAAeU,EAAA,eAAa,CAAA,SAAA,CAAA;AAAA;+BAC9B,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,wBAFC,QAED,EAAA;AAAA;;;;;;;;;;;;;;;;sFCsBLpC,KAAU;AAAA,EACb,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA;IAEZ,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,YAAY;AAAA;EAEd,OAAO;AACL,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,OAAO;AAAA,QACL,CAAC+D,MACK,KAAK,WACAA,EAAM,UAAU,KAAK,aAErB,CAAC,CAACA,KAAS;AAAA;IAI1B;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AACJ,eAAO,KAAK;AAAA,MACd;AAAA,MACA,IAAIA,GAAO;AACT,aAAK,MAAM,qBAAqBA,CAAK;AAAA,MACvC;AAAA;;EAGJ,SAAS;AAAA,IACP,eAAe,WAAY;AAGzB,MAAK,MAAM,QAAQ,KAAK,UAAU,MAChC,KAAK,aAAa,CAAC,KAAK,UAAU,IAEpC,KAAK,MAAM,YAAY,KAAK,UAAU;AAAA,IACxC;AAAA,IACA,eAAe,WAAY;AACzB,WAAK,MAAM,YAAY,QAAQ;AAAA,IACjC;AAAA;AAEJ,GA7GaH,KAAA,EAAA,OAAM,OAAM,GAGLP,KAAA,EAAA,OAAM,QAAO;;;cAX/BQ,EAuDWuF,GAAA;AAAA,gBAvDQzG,EAAA;AAAA,kDAAAA,EAAA,OAAIT;AAAA,IAAE,YAAA;AAAA,IAAW,OAAM;AAAA;eACxC,MAqDS;AAAA,MArDTJ,EAqDSC,GAAA,MAAA;AAAA,mBApDP,MAmDS;AAAA,UAnDTD,EAmDSuH,GAAA;AAAA,wBAnDQpH,EAAA;AAAA,0DAAAA,EAAA,QAAKC;AAAA,YAAG,aAAgBS,EAAA,eAAa,CAAA,SAAA,CAAA;AAAA;uBACpD,MAIY;AAAA,cAJZb,EAIYwH,GAAA,EAJD,QAAO,KAAI,GAAA;AAAA,2BACpB,MAAY;AAAA,kBAAZxH,EAAYW,CAAA;AAAA,kBACZL,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAc,EAA0B,cAApB,iBAAa,EAAA;AAAA,kBACnBpB,EAAYW,CAAA;AAAA;;;cAEdS,EAyBM,OAzBNU,IAyBM;AAAA,gBAxBJ9B,EAuBcwC,GAAA,MAAA;AAAA,6BAtBZ,MAEQ;AAAA,oBAFRxC,EAEQU,GAAA,MAAA;AAAA,iCADN,MAAsC;AAAA,wBAAtCU,EAAsC,QAAtCG,IAAsCJ,EAAfG,EAAA,KAAK,GAAA,CAAA;AAAA;;;oBAEjBA,EAAA,gBAAbS,EAMQrB,GAAA,EAAA,KAAA,EAAA,GAAA;AAAA,iCALN,MAIE;AAAA,wBAJFU,EAIE,QAAA;AAAA,0BAHA,OAAM;AAAA,0BACN,OAAA,EAAA,eAAA,WAAA;AAAA,0BACA,aAAAD,EAAgBG,EAAR,OAAO;AAAA;;;;oBAGnBtB,EAWQU,GAAA,EAXD,OAAM,OAAM,GAAA;AAAA,iCACjB,MASE;AAAA,wBATFV,EASE0H,GAAA;AAAA,sCARSvH,EAAA;AAAA,wEAAAA,EAAA,aAAUC;AAAA,0BACnB,OAAM;AAAA,0BACL,OAAOD,EAAA;AAAA,0BACR,WAAA;AAAA,0BACA,aAAU;AAAA,0BACT,QAAQmB,EAAA;AAAA,0BACT,eAAA;AAAA,0BACC,UAAUA,EAAA;AAAA;;;;;;;;cAKnBtB,EAkBiByH,GAAA,EAlBD,OAAM,OAAM,GAAA;AAAA,2BAC1B,MAAY;AAAA,kBAAZzH,EAAYW,CAAA;AAAA,kBACZX,EAMQY,GAAA;AAAA,oBALN,SAAQ;AAAA,oBACR,aAAU;AAAA,oBACT,SAAOC,EAAA;AAAA;+BACT,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,wBAFC,YAED,EAAA;AAAA;;;kBACAN,EAQQY,GAAA;AAAA,oBAPN,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,aAAU;AAAA,oBACT,WAAWT,EAAA;AAAA,oBACX,YAAeU,EAAA,eAAa,CAAA,SAAA,CAAA;AAAA;+BAC9B,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,wBAFC,QAED,EAAA;AAAA;;;;;;;;;;;;;;;;sFC3BLpC,KAAU;AAAA,EACb,OAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA;IAEZ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA;IAEZ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA;IAEZ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA;;EAGd,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AACJ,eAAO,KAAK;AAAA,MACd;AAAA,MACA,IAAI+D,GAAO;AACT,aAAK,MAAM,qBAAqBA,CAAK;AAAA,MACvC;AAAA;;EAGJ,SAAS,CAAA;AACX,yBA9CWV,KAAA,EAAA,OAAM,OAAM;;;cAPrBQ,EAmBWuF,GAAA;AAAA,gBAnBQzG,EAAA;AAAA,kDAAAA,EAAA,OAAIT;AAAA,IAAG,OAAOkB,EAAA;AAAA;eAC/B,MAiBS;AAAA,MAjBTtB,EAiBSC,GAAA,MAAA;AAAA,mBAhBP,MAIY;AAAA,UAJZD,EAIYwH,GAAA,EAJD,QAAO,KAAI,GAAA;AAAA,uBACpB,MAAY;AAAA,cAAZxH,EAAYW,CAAA;AAAA,cACZS,EAAgD,QAAA;AAAA,gBAA1C,OAAA,EAAA,eAAA,MAAA;AAAA,gBAAyB,aAAAD,EAAcG,EAAN,KAAK;AAAA;cAC5CtB,EAAYW,CAAA;AAAA;;;UAEdS,EAMM,OANNG,IAMM;AAAA,YALJvB,EAIcwC,GAAA,MAAA;AAAA,yBAHM,MAA6B;AAAA,iBAA/CmF,EAAA,EAAA,GAAA5H,EAEQ6H,IAAA,MAAAC,GAFkCvG,EAAA,MAAI,CAApBwG,GAAMC,YAAhChG,EAEQrB,GAAA;AAAA,kBAFD,cAAA;AAAA,kBAA0C,KAAKqH;AAAA;6BACpD,MAA+C;AAAA,oBAA/C3G,EAA+C,QAAA;AAAA,sBAAzC,OAAA,EAAA,eAAA,MAAA;AAAA,sBAAyB,aAAAD,EAAa2G,CAAD;AAAA;;;;;;;;UAIjD9H,EAGiByH,GAAA,EAHD,OAAM,OAAM,GAAA;AAAA,uBAC1B,MAAY;AAAA,cAAZzH,EAAYW,CAAA;AAAA,cACZX,EAAwDY,GAAA;AAAA,gBAAjD,SAAQ;AAAA,gBAAQ,SAAKN,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAF,MAAES,EAAA,OAAI,CAAIA,EAAA;AAAA;2BAAM,MAAI,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAAJ,QAAI,EAAA;AAAA;;;;;;;;;;;;;oDCgDnDpC,KAAU;AAAA,EACb,YAAY,CAAA;AAAA,EACZ,OAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA;;EAGd,OAAO;AACL,WAAO;AAAA,MACL,KAAK;AAAA,MACL,WAAW,CAAA;AAAA,MACX,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,EAAE,MAAM,UAAU,OAAO;QACzB,EAAE,MAAM,UAAU,OAAO;QACzB,EAAE,MAAM,QAAQ,OAAO;QACvB,EAAE,MAAM,QAAQ,OAAO;QACvB,EAAE,MAAM,SAAS,OAAO,QAAM;AAAA,QAC9B,EAAE,MAAM,UAAU,OAAO,SAAO;AAAA;IAEpC;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AACJ,eAAO,KAAK;AAAA,MACd;AAAA,MACA,IAAI+D,GAAO;AACT,aAAK,MAAM,qBAAqBA,CAAK;AAAA,MACvC;AAAA;;EAGJ,SAAS,WAAY;AACnB,SAAK,MAAM,IAAI3D,GAAS,GACxB,KAAK,aAAY;AAAA,EACnB;AAAA,EACA,SAAS;AAAA,IACP,cAAc,WAAY;AACxB,WAAK,IAAI,cAAa,EAAG,KAAK,CAAC0J,MAAW;AACxC,aAAK,YAAYA;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB,WAAY;AAC1B,YAAMC,IAAQ;AAAA,QACZ,GAAG,IAAI;AAAA,UACL,KAAK,UAAU,IAAI,CAAChH,MAAS;AAAA;AAAA,YAE3B,GAAGA,EAAK,WAAW,KAAKA,EAAK,WAAW,KAAKA,EAAK,SAAS;AAAA,YAC3DA;AAAA,UACF,CAAC;AAAA,UACD,OAAM;AAAA,MACV;AACA,eAASA,KAAQgH;AACf,aAAK,IACF;AAAA,UACChH,EAAK;AAAA,UACLA,EAAK;AAAA,UACLA,EAAK;AAAA,UACL;AAAA,QACF,EACC,KAAK,CAAC+G,MAAW;AAChB,eAAK,YAAY,CAAA;AAAA,QACnB,CAAC;AAAA,IAEP;AAAA,IACA,gBAAgB,SAAU/G,GAAM;AAC9B,WAAK,IACF;AAAA,QACCA,EAAK;AAAA,QACLA,EAAK;AAAA,QACLA,EAAK;AAAA,QACLA,EAAK;AAAA,MACP,EACC,KAAK,CAAC+G,MAAW;AAChB,YAAID,IAAQ,KAAK,UAAU,QAAQ9G,CAAI;AACvC,aAAK,UAAU,OAAO8G,GAAO,CAAC;AAAA,MAChC,CAAC;AAAA,IACL;AAAA;AAEJ,GA1IWjG,KAAA,EAAA,OAAM,OAAM;;;cAPrBC,EA2DWuF,GAAA;AAAA,gBA3DQzG,EAAA;AAAA,kDAAAA,EAAA,OAAIT;AAAA,IAAE,OAAM;AAAA;eAC7B,MAyDS;AAAA,MAzDTJ,EAyDSC,GAAA,MAAA;AAAA,mBAxDP,MAIY;AAAA,UAJZD,EAIYwH,GAAA,EAJD,QAAO,KAAI,GAAA;AAAA,uBACpB,MAAY;AAAA,cAAZxH,EAAYW,CAAA;AAAA,cACZL,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAc,EAAsB,cAAhB,aAAS,EAAA;AAAA,cACfpB,EAAYW,CAAA;AAAA;;;UAEdS,EAwCM,OAxCNU,IAwCM;AAAA,YAvCJ9B,EAsCcwC,GAAA,MAAA;AAAA,yBArCZ,MAmBQ;AAAA,gBAnBRxC,EAmBQU,GAAA,EAnBD,OAAM,OAAM,GAAA;AAAA,6BACjB,MAMQ;AAAA,oBANRV,EAMQY,GAAA;AAAA,sBALN,OAAM;AAAA,sBACN,aAAU;AAAA,sBACT,SAAOC,EAAA;AAAA;iCACT,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,0BAFC,yBAED,EAAA;AAAA;;;oBACAN,EAAYW,CAAA;AAAA,oBACZX,EASEc,GAAA;AAAA,kCARSX,EAAA;AAAA,oEAAAA,EAAA,SAAMC;AAAA,sBACf,OAAM;AAAA,sBACN,sBAAmB;AAAA,sBACnB,WAAA;AAAA,sBACA,SAAQ;AAAA,sBACR,SAAQ;AAAA,sBACR,eAAA;AAAA,sBACA,gBAAA;AAAA;;;;gBAGJJ,EAgBeyC,GAAA;AAAA,kBAfZ,SAAStC,EAAA;AAAA,kBACT,OAAOA,EAAA;AAAA,kBACP,QAAQA,EAAA;AAAA,kBACR,0BAAwB,CAAA,GAAA;AAAA,kBACzB,cAAA;AAAA,kBACA,SAAQ;AAAA;kBAEG,eAAWa,EACpB,CAKE,EANsB,MAAAC,QAAI;AAAA,oBAC5BjB,EAKEY,GAAA;AAAA,sBAJA,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,cAAW;AAAA,sBACV,SAAK,CAAAR,MAAES,EAAA,eAAeI,CAAI;AAAA;;;;;;;;UAMrCjB,EASiByH,GAAA,EATD,OAAM,OAAM,GAAA;AAAA,uBAC1B,MAAY;AAAA,cAAZzH,EAAYW,CAAA;AAAA,cACZX,EAMQY,GAAA;AAAA,gBALN,SAAQ;AAAA,gBACR,aAAU;AAAA,gBACT,SAAKN,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAF,MAAES,EAAA,OAAI,CAAIA,EAAA;AAAA;2BACjB,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAFC,QAED,EAAA;AAAA;;;;;;;;;;;;;oDCsBHpC,KAAU;AAAA,EACb,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA;IAEZ,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS,MAAM,CAAA;AAAA;IAEjB,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA;AAAA;IAEX,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA;IAEZ,YAAY;AAAA;EAEd,OAAO;AACL,WAAO;AAAA,MACL,kBAAkB;AAAA,MAClB,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AACJ,eAAO,KAAK;AAAA,MACd;AAAA,MACA,IAAI+D,GAAO;AACT,aAAK,MAAM,qBAAqBA,CAAK;AAAA,MACvC;AAAA;IAEF,cAAc;AACZ,UAAIiG,IAAS;AACb,aAAI,KAAK,WAAW,aACX,GAAGA,CAAM,iBAET,GAAGA,CAAM;AAAA,IAEpB;AAAA;EAEF,SAAS;AAAA,IACP,eAAe,SAAU7F,GAAQ;AAC/B,WAAK,eAAeA,GACpB,KAAK,cAAa;AAAA,IACpB;AAAA,IACA,eAAe,WAAY;AACzB,WAAK,MAAM,YAAY,KAAK,YAAY;AAAA,IAC1C;AAAA,IACA,eAAe,WAAY;AACzB,WAAK,MAAM,YAAY,QAAQ;AAAA,IACjC;AAAA;AAEJ,yBA5IWd,KAAA,EAAA,OAAM,OAAM;;;cAPrBQ,EA0EWuF,GAAA;AAAA,gBA1EQzG,EAAA;AAAA,kDAAAA,EAAA,OAAIT;AAAA,IAAE,YAAA;AAAA,IAAW,OAAM;AAAA;eACxC,MAwES;AAAA,MAxETJ,EAwESC,GAAA,MAAA;AAAA,mBAvEP,MAIY;AAAA,UAJZD,EAIYwH,GAAA,EAJD,QAAO,KAAI,GAAA;AAAA,uBACpB,MAAY;AAAA,cAAZxH,EAAYW,CAAA;AAAA,cACZS,EAAoC,QAAA;AAAA,gBAA9B,OAAM;AAAA,gBAAO,aAAAD,EAAcG,EAAN,KAAK;AAAA;cAChCtB,EAAYW,CAAA;AAAA;;;UAEdS,EAYM,OAZNG,IAYM;AAAA,YAXJvB,EAUcwC,GAAA,EAVD,OAAM,OAAM,GAAA;AAAA,yBACvB,MAEQ;AAAA,gBAFKlB,EAAA,iBAAbS,EAEQrB,GAAA,EAAA,KAAA,EAAA,GAAA;AAAA,6BADN,MAAiD;AAAA,oBAAjDV,EAAiDmI,GAAA,MAAA;AAAA,iCAAhC,MAAc;AAAA,4BAAX7G,EAAA,QAAQ,GAAA,CAAA;AAAA;;;;;;gBAE9BtB,EAEQU,GAAA,EAFD,OAAM,OAAM,GAAA;AAAA,6BACjB,MAAyB;AAAA,oBAAzBU,EAAyB,QAAA;AAAA,sBAAnB,aAAAD,EAAgBG,EAAR,OAAO;AAAA;;;;gBAEVA,EAAA,gBAAbS,EAEQrB,GAAA;AAAA;kBAFc,OAAM;AAAA;6BAC1B,MAAyB;AAAA,oBAAzBU,EAAyB,QAAA;AAAA,sBAAnB,aAAAD,EAAgBG,EAAR,OAAO;AAAA;;;;;;;;UAIhBA,EAAA,WAAM,gBAAjBvB,EA+BM,OAAAqI,IAAA;AAAA,YA9BJpI,EAWQU,GAAA,EAXD,OAAM,OAAM,GAAA;AAAA,yBACjB,MASE;AAAA,gBATFV,EASEuC,GAAA;AAAA,8BARSpC,EAAA;AAAA;2CAAAA,EAAA,eAAYC;AAAA,2CAOAD,EAAA,mBAAgB;AAAA;kBANrC,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,aAAU;AAAA,kBACT,OAAOmB,EAAA;AAAA,kBACP,UAAUA,EAAA,aAAQ;AAAA;;;;YAIvBtB,EAiBiByH,GAAA,EAjBD,OAAM,OAAM,GAAA;AAAA,yBAC1B,MAAY;AAAA,gBAAZzH,EAAYW,CAAA;AAAA,gBACZX,EAMQY,GAAA;AAAA,kBALN,SAAQ;AAAA,kBACR,aAAU;AAAA,kBACT,SAAOC,EAAA;AAAA;6BACT,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,sBAFC,YAED,EAAA;AAAA;;;gBACAN,EAOQY,GAAA;AAAA,kBANN,SAAQ;AAAA,kBACR,aAAU;AAAA,kBACT,UAAUT,EAAA;AAAA,kBACV,SAAOU,EAAA;AAAA;6BACT,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,sBAFC,QAED,EAAA;AAAA;;;;;;sBAGJP,EAoBM,OAAAsI,IAAA;AAAA,YAnBJrI,EAkBiByH,GAAA;AAAA,cAlBA,UAAO5G,EAAA,WAAW;AAAA;yBACjC,MAAY;AAAA,gBAAZb,EAAYW,CAAA;AAAA,gBACZX,EAMQY,GAAA;AAAA,kBALN,SAAQ;AAAA,kBACR,aAAU;AAAA,kBACT,SAAOC,EAAA;AAAA;6BACT,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,sBAFC,YAED,EAAA;AAAA;;;iBACAqH,EAAA,EAAA,GAAA5H,EAQM6H,IAAA,MAAAC,GARyBvG,EAAA,SAAO,CAAzBgH,GAAQP,YAArBhI,EAQM,OAAA,EARmC,KAAKgI,KAAK;AAAA,kBACjD/H,EAMQY,GAAA;AAAA,oBALN,SAAQ;AAAA,oBACP,aAAS,UAAY0H,EAAO,IAAI;AAAA,oBAChC,SAAK,CAAAlI,MAAES,EAAA,cAAcyH,EAAO,KAAK;AAAA;+BAElC,MAAiB;AAAA,sBAAdpH,EAAAC,EAAAmH,EAAO,IAAI,GAAA,CAAA;AAAA;;;;;;;;;;;;;;;sFCtCvBpK,KAAU;AAAA,EACb,YAAY,CAAA;AAAA,EACZ,OAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA;IAEZ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA;;EAGd,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AACJ,eAAO,KAAK;AAAA,MACd;AAAA,MACA,IAAI+D,GAAO;AACT,aAAK,MAAM,qBAAqBA,CAAK;AAAA,MACvC;AAAA;;EAGJ,UAAU;AAER,eAAW,MAAM;AACf,WAAK,MAAM,SAAS,IAAI,MAAK;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EACA,SAAS;AAAA,IACP,kBAAkB;AAChB,YAAMrC,IAAO,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG;AAAA,QACjC,MAAM;AAAA,OACP,GAEKC,IAAO,SAAS,cAAc,GAAG;AACvC,MAAAA,EAAK,OAAO,IAAI,gBAAgBD,CAAI,GACpCC,EAAK;AAAA,QACH;AAAA,QACAF,GAAO,KAAK,OAAO,qBAAqB,IAAI;AAAA,MAC9C,GACAE,EAAK,MAAK;AAAA,IACZ;AAAA;AAEJ,GAlEWiC,KAAA,EAAA,OAAM,OAAM;;;cAPrBC,EAwBWuF,GAAA;AAAA,gBAxBQzG,EAAA;AAAA,kDAAAA,EAAA,OAAIT;AAAA,IAAE,YAAA;AAAA,IAAW,OAAM;AAAA;eACxC,MAsBS;AAAA,MAtBTJ,EAsBSC,GAAA,MAAA;AAAA,mBArBP,MAIY;AAAA,UAJZD,EAIYwH,GAAA,EAJD,QAAO,KAAI,GAAA;AAAA,uBACpB,MAAY;AAAA,cAAZxH,EAAYW,CAAA;AAAA,cACZL,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAc,EAA6B,cAAvB,oBAAgB,EAAA;AAAA,cACtBpB,EAAYW,CAAA;AAAA;;;UAEdS,EAUM,OAVNU,IAUM;AAAA,YATJ9B,EAQcwC,GAAA,EARD,OAAA,EAAA,OAAA,QAAA,cAAA,QAAA,UAAA,OAAA,EAAqD,GAAA;AAAA,yBAChE,MAME;AAAA,gBANFxC,EAMEuI,GAAA;AAAA,kBALA,UAAA;AAAA,kBACA,gBAAA;AAAA,kBACA,SAAQ;AAAA,kBACR,aAAA;AAAA,kBACC,eAAajH,EAAA;AAAA;;;;;UAIpBtB,EAIiByH,GAAA,EAJD,OAAM,OAAM,GAAA;AAAA,uBAC1B,MAAY;AAAA,cAAZzH,EAAYW,CAAA;AAAA,cACZX,EAAqEY,GAAA;AAAA,gBAA9D,SAAQ;AAAA,gBAAY,SAAOC,EAAA;AAAA;2BAAiB,MAAU,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAAV,cAAU,EAAA;AAAA;;;cAC7DN,EAAuEY,GAAA;AAAA,gBAAhE,KAAI;AAAA,gBAAW,SAAQ;AAAA,gBAAQ,SAAKN,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAF,MAAES,EAAA,OAAI,CAAIA,EAAA;AAAA;2BAAM,MAAI,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAAJ,QAAI,EAAA;AAAA;;;;;;;;;;;;;oDCgBlEpC,KAAU;AAAA,EACb,YAAY;AAAA,IACV,oBAAAsK;AAAA;EAEF,OAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA;IAEZ,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,UAAU;AAAA;;EAGd,OAAO;AACL,WAAO;AAAA,MACL,UAAU,CAAA;AAAA,IACZ;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AACJ,eAAO,KAAK;AAAA,MACd;AAAA,MACA,IAAIvG,GAAO;AACT,aAAK,MAAM,qBAAqBA,CAAK;AAAA,MACvC;AAAA;;EAGJ,SAAS,WAAY;AACnB,SAAK,gBAAe;AAAA,EACtB;AAAA,EACA,SAAS;AAAA,IACP,iBAAiB,WAAY;AAC3B,WAAK,WAAW,CAAC,GAAG,KAAK,gBAAgB;AAAA,IAC3C;AAAA,IACA,mBAAmB,WAAY;AAC7B,WAAK,MAAM,eAAe,KAAK,QAAQ,GACvC,KAAK,OAAO,CAAC,KAAK;AAAA,IACpB;AAAA,IACA,QAAQ,WAAY;AAClB,WAAK,OAAO,CAAC,KAAK;AAAA,IACpB;AAAA;AAEJ,GA1EWH,KAAA,EAAA,OAAM,OAAM;;;cAPrBC,EA+BWuF,GAAA;AAAA,gBA/BQzG,EAAA;AAAA,kDAAAA,EAAA,OAAIT;AAAA,IAAE,OAAM;AAAA;eAC7B,MA6BS;AAAA,MA7BTJ,EA6BSC,GAAA,MAAA;AAAA,mBA5BP,MAIY;AAAA,UAJZD,EAIYwH,GAAA,EAJD,QAAO,KAAI,GAAA;AAAA,uBACpB,MAAY;AAAA,cAAZxH,EAAYW,CAAA;AAAA,cACZL,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAc,EAAyC,cAAnC,gCAA4B,EAAA;AAAA,cAClCpB,EAAYW,CAAA;AAAA;;;UAEdS,EAIM,OAJNU,IAIM;AAAA,YAHJ9B,EAEcwC,GAAA,MAAA;AAAA,yBADZ,MAA0C;AAAA,gBAA1CxC,EAA0CyI,GAAA;AAAA,8BAAZtI,EAAA;AAAA,gEAAAA,EAAA,WAAQC;AAAA;;;;;UAG1CJ,EAiBiByH,GAAA,EAjBD,OAAM,OAAM,GAAA;AAAA,uBAC1B,MAAY;AAAA,cAAZzH,EAAYW,CAAA;AAAA,cACZX,EAMQY,GAAA;AAAA,gBALN,SAAQ;AAAA,gBACR,aAAU;AAAA,gBACT,SAAOC,EAAA;AAAA;2BACT,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAFC,YAED,EAAA;AAAA;;;cACAN,EAOQY,GAAA;AAAA,gBANN,SAAQ;AAAA,gBACR,aAAU;AAAA,gBACT,YAAY8H,EAAA;AAAA,gBACZ,SAAO7H,EAAA;AAAA;2BACT,MAED,CAAA,GAAAP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAFC,UAED,EAAA;AAAA;;;;;;;;;;;;;oDCoQHpC,KAAU;AAAA,EACb,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA;IAEZ,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA;IAEZ,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA;;EAGd,OAAO,CAAC,UAAU,QAAQ;AAAA,EAC1B,OAAO;AACL,WAAO;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,QAAQ,CAAA;AAAA,MACR,SAAS,CAAA;AAAA,MACT,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,CAAC,gBAAgB,UAAU,oBAAoB;AAAA,MACxD,UAAU,CAAA;AAAA,IACZ;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,uBAAuB;AACrB,aAAI,KAAK,SAAS,SAAS,KAAK,IACvB,2DAEA;AAAA,IAEX;AAAA,IACA,yBAAyB;AACvB,aAAI,KAAK,SAAS,SAAS,KAAK,IACvB,8DAEA;AAAA,IAEX;AAAA,IACA,oBAAoB;AAClB,aAAI,QAAK,SAAS,KAAK,SAAS,KAAK,KAAK,EAAE;AAAA,IAK9C;AAAA,IACA,uBAAuB;AACrB,aAAI,QAAK,SAAS,KAAK,SAAS,KAAK,KAAK,EAAE;AAAA,IAK9C;AAAA,IACA,oBAAoB;AAClB,aACE,QAAK,SACL,KAAK,SACL,KAAK,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK,KAAK,EAAE;AAAA,IAMjD;AAAA,IACA,uBAAuB;AACrB,aACE,QAAK,SACL,KAAK,SACL,KAAK,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK,KAAK,EAAE;AAAA,IAMjD;AAAA,IACA,cAAc;AACZ,aAAO,KAAK,QAAQ,IAAI,CAACyK,OAChB;AAAA;AAAA,QAEL,OAAOA,EAAK,QAAQ,oBAAoB,EAAE;AAAA,QAC1C,OAAOA;AAAA,MACT,EACD;AAAA,IACH;AAAA;;EAGF,OAAO;AAAA,IACL,UAAU;AAAA,MACR,SAAS,SAAUC,GAAQC,GAAQ;AACjC,aAAK,eAAc;AAAA,MACrB;AAAA,MACA,MAAM;AAAA;AAAA;;EAGV,UAAU;AACR,SAAK,WAAW,KAAK,MAAM,aAAa,uBAA0B,GAClE,KAAK,WAAU,GACf,KAAK,MAAM,QAAQ;AAAA,EACrB;AAAA,EACA,SAAS;AAAA,IACP,iBAAiB;AACf,WAAK,SAAS,OAAO,KAAK,KAAK,QAAQ,GAErC,KAAK,SAAS,KAAK,KAAK,KAAK,QAC7B,KAAK,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK,KAAK,KAAK,OAEhD,KAAK,WAAU,KAEf,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,KAAK,KAAK,EAAE,MAAM,GAC1D,KAAK,UAAU,KAAK,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK,KAAK,EAAE;AAAA,IAEhE;AAAA,IACA,aAAa;AACX,WAAK,SAAS,OAAO,KAAK,KAAK,QAAQ,GACvC,KAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAAA,IAClC;AAAA,IACA,aAAaC,GAAO;AAClB,WAAK,QAAQA,GACb,KAAK,QAAQ,IACb,KAAK,SAAS,IACd,KAAK,SAAS,OAAO,KAAK,KAAK,SAASA,CAAK,EAAE,MAAM,GAErD,KAAK,aAAa,KAAK,OAAO,CAAC,CAAC;AAAA,IAClC;AAAA,IACA,aAAaA,GAAO;AAClB,WAAK,QAAQA,GACb,KAAK,SAAS,IACd,KAAK,UAAU,KAAK,SAAS,KAAK,KAAK,EAAE,OAAOA,CAAK,EAAE,SAEvD,KAAK,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA,IACpC;AAAA,IACA,cAAcA,GAAO;AACnB,WAAK,SAASA;AAAA,IAChB;AAAA;AAEJ,GA1aShH,KAAA,EAAA,IAAG,eAAc;;;cADxB/B,EA4RM,OAAA,MAAA;AAAA,IA3RJqB,EA0RM,OA1RNU,IA0RM;AAAA,MAzRJ9B,EA4FQU,GAAA;AAAA,QA5FD,cAAA;AAAA,QAAW,OAAM;AAAA;mBACtB,MAyCQ;AAAA,UAzCRV,EAyCQ+I,GAAA,EAzCD,MAAK,IAAG,GAAA;AAAA,uBACb,MAuCQ;AAAA,cAvCR/I,EAuCQU,GAAA,EAvCD,cAAA,GAAU,GAAA;AAAA,2BACf,MAkBQ;AAAA,kBAlBRV,EAkBQ+I,GAAA,EAlBD,MAAK,IAAG,GAAA;AAAA,+BACb,MAgBY;AAAA,sBAhBZ/I,EAgBYgJ,GAAA;AAAA,wBAhBA,cAAY;AAAA,wBAAK,UAAS;AAAA;wBACzB,WAAShI,EAClB,CAQM,EATgB,OAAAS,QAAK;AAAA,0BAC3BL,EAQM,aAROK,CAAK,CAAA,GAAA;AAAA,4BAChBzB,EAMEiJ,GAAA;AAAA,0CALS9I,EAAA;AAAA,4EAAAA,EAAA,UAAOC;AAAA,8BAChB,OAAM;AAAA,8BACN,OAAM;AAAA,8BACN,gBAAA;AAAA,8BACA,aAAU;AAAA;;;mCAIhB,MAGO;AAAA,4CAHPgB,EAGO,QAAA,MAAA;AAAA,8BAHD,yDACkD;AAAA,4BAAAA,EAAM,IAAA;AAAA,8BAAA,gDAE9D;AAAA;;;;;;;kBAGJpB,EAkBQ+I,GAAA,EAlBD,MAAK,IAAG,GAAA;AAAA,+BACb,MAgBY;AAAA,sBAhBZ/I,EAgBYgJ,GAAA;AAAA,wBAhBA,cAAY;AAAA,wBAAK,UAAS;AAAA;wBACzB,WAAShI,EAClB,CAQM,EATgB,OAAAS,QAAK;AAAA,0BAC3BL,EAQM,aAROK,CAAK,CAAA,GAAA;AAAA,4BAChBzB,EAMEiJ,GAAA;AAAA,0CALS9I,EAAA;AAAA,4EAAAA,EAAA,UAAOC;AAAA,8BAChB,OAAM;AAAA,8BACN,OAAM;AAAA,8BACN,gBAAA;AAAA,8BACA,aAAU;AAAA;;;mCAIhB,MAGO;AAAA,0BAHPgB,EAGO,QAAA,MAAA;AAAA,gCAFFP,EAAA,oBAAoB,GAAA,CAAA;AAAA,8CAAGO,EAAM,MAAA,MAAA,MAAA,EAAA;AAAA,4BAAAF,EAAA,QAC7BL,EAAA,sBAAsB,GAAA,CAAA;AAAA;;;;;;;;;;;;;UAMnCb,EAgDQ+I,GAAA,EAhDD,MAAK,IAAG,GAAA;AAAA,uBACb,MA8CQ;AAAA,cA9CR/I,EA8CQU,GAAA;AAAA,gBA9CD,cAAA;AAAA,gBAAW,SAAQ;AAAA;2BACxB,MAYQ;AAAA,kBAZRV,EAYQ+I,GAAA,EAZD,MAAK,IAAG,GAAA;AAAA,+BACb,MAUE;AAAA,sBAVF/I,EAUEuC,GAAA;AAAA,oCATSpC,EAAA;AAAA;iDAAAA,EAAA,QAAKC;AAAA,0BAQOS,EAAA;AAAA;wBAPrB,OAAM;AAAA,wBACN,OAAM;AAAA,wBACN,gBAAA;AAAA,wBACA,SAAQ;AAAA,wBACR,SAAQ;AAAA,wBACP,OAAOV,EAAA;AAAA,wBACR,aAAU;AAAA;;;;kBAIdH,EA+BQ+I,GAAA,EA/BD,MAAK,OAAM,GAAA;AAAA,+BAChB,MAQQ;AAAA,sBARR/I,EAQQY,GAAA;AAAA,wBAPN,OAAM;AAAA,wBACN,OAAM;AAAA,wBACL,UAAUU,EAAA,kBAAc,CAAKnB,EAAA,SAAS;AAAA,wBACvC,aAAU;AAAA,wBACT,SAAKG,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAF,MAAEsI,EAAA,MAAK,UAAA,EAAA,QAAA,SAAA,OAA8BvI,EAAA,gBAAOA,EAAA,QAAO,CAAA;AAAA;mCAC1D,MAED,CAAA,GAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAFC,WAED,EAAA;AAAA;;;sBACAN,EAUQY,GAAA;AAAA,wBATN,OAAM;AAAA,wBACN,OAAM;AAAA,wBACN,aAAU;AAAA,wBACT,UAA6BU,EAAA,kBAAc,CAAKT,EAAA,qBAAiB,CAAKV,EAAA,SAAS;AAAA,wBAG/E,SAAKG,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAF,MAAEsI,EAAA,MAAK,UAAA,EAAA,QAAA,SAAA,OAA8BvI,EAAA,gBAAOA,EAAA,QAAO,CAAA;AAAA;mCAC1D,MAED,CAAA,GAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAFC,WAED,EAAA;AAAA;;;sBACAN,EASQY,GAAA;AAAA,wBARN,OAAM;AAAA,wBACN,aAAU;AAAA,wBACT,UAA6BU,EAAA,kBAAc,CAAKT,EAAA,wBAAoB,CAAKV,EAAA,SAAS;AAAA,wBAGlF,SAAKG,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAF,MAAEsI,EAAA,MAAK,UAAA,EAAA,QAAA,YAAA,OAAiCvI,EAAA,gBAAOA,EAAA,QAAO,CAAA;AAAA;mCAC7D,MAED,CAAA,GAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAFC,cAED,EAAA;AAAA;;;;;;;;;;;;;;;MAKRN,EAmGQU,GAAA,EAnGD,cAAA,GAAU,GAAA;AAAA,mBACf,MA0CQ;AAAA,UA1CRV,EA0CQ+I,GAAA,EA1CD,MAAK,IAAG,GAAA;AAAA,uBACb,MAwCQ;AAAA,cAxCR/I,EAwCQU,GAAA,EAxCD,cAAA,GAAU,GAAA;AAAA,2BACf,MAmBQ;AAAA,kBAnBRV,EAmBQ+I,GAAA,EAnBD,MAAK,IAAG,GAAA;AAAA,+BACb,MAiBY;AAAA,sBAjBZ/I,EAiBYgJ,GAAA;AAAA,wBAjBA,cAAY;AAAA,wBAAK,UAAS;AAAA;wBACzB,WAAShI,EAClB,CAQM,EATgB,OAAAS,QAAK;AAAA,0BAC3BL,EAQM,aAROK,CAAK,CAAA,GAAA;AAAA,4BAChBzB,EAMEiJ,GAAA;AAAA,0CALS9I,EAAA;AAAA,4EAAAA,EAAA,UAAOC;AAAA,8BAChB,OAAM;AAAA,8BACN,OAAM;AAAA,8BACN,gBAAA;AAAA,8BACA,aAAU;AAAA;;;mCAIhB,MAIO;AAAA,4CAJPgB,EAIO,QAAA,MAAA;AAAA,8BAJD,qEAEO;AAAA,4BAAAA,EAAM,IAAA;AAAA,8BAAA,8CAEnB;AAAA;;;;;;;kBAGJpB,EAkBQ+I,GAAA,EAlBD,MAAK,IAAG,GAAA;AAAA,+BACb,MAgBY;AAAA,sBAhBZ/I,EAgBYgJ,GAAA;AAAA,wBAhBA,cAAY;AAAA,wBAAK,UAAS;AAAA;wBACzB,WAAShI,EAClB,CAQM,EATgB,OAAAS,QAAK;AAAA,0BAC3BL,EAQM,aAROK,CAAK,CAAA,GAAA;AAAA,4BAChBzB,EAMEiJ,GAAA;AAAA,0CALS9I,EAAA;AAAA,4EAAAA,EAAA,UAAOC;AAAA,8BAChB,OAAM;AAAA,8BACN,OAAM;AAAA,8BACN,gBAAA;AAAA,8BACA,aAAU;AAAA;;;mCAIhB,MAGO;AAAA,4CAHPgB,EAGO,QAAA,MAAA;AAAA,8BAHD,yDACkD;AAAA,4BAAAA,EAAM,IAAA;AAAA,8BAAA,iDAE9D;AAAA;;;;;;;;;;;;;UAKRpB,EAsDQ+I,GAAA,EAtDD,MAAK,IAAG,GAAA;AAAA,uBACb,MAoDQ;AAAA,cApDR/I,EAoDQU,GAAA;AAAA,gBApDD,cAAA;AAAA,gBAAW,SAAQ;AAAA;2BACxB,MAYQ;AAAA,kBAZRV,EAYQ+I,GAAA,EAZD,MAAK,IAAG,GAAA;AAAA,+BACb,MAUE;AAAA,sBAVF/I,EAUEuC,GAAA;AAAA,oCATSpC,EAAA;AAAA;iDAAAA,EAAA,QAAKC;AAAA,0BAQOS,EAAA;AAAA;wBAPrB,OAAM;AAAA,wBACN,OAAM;AAAA,wBACN,gBAAA;AAAA,wBACA,SAAQ;AAAA,wBACR,SAAQ;AAAA,wBACP,OAAOV,EAAA;AAAA,wBACR,aAAU;AAAA;;;;kBAIdH,EAqCQ+I,GAAA,EArCD,MAAK,OAAM,GAAA;AAAA,+BAChB,MAUQ;AAAA,sBAVR/I,EAUQY,GAAA;AAAA,wBATN,OAAM;AAAA,wBACN,OAAM;AAAA,wBACL,UAAUU,EAAA,kBAAc,CAAKnB,EAAA,SAAS;AAAA,wBACvC,aAAU;AAAA,wBACT,SAAKG,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAF,MAAqBsI,EAAA,MAAK,UAAA,EAAA,QAAA,SAAA,OAA8BvI,EAAA,OAAK,OAAEA,EAAA,gBAAOA,EAAA,QAAO,CAAA;AAAA;mCAGpF,MAED,CAAA,GAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAFC,WAED,EAAA;AAAA;;;sBACAN,EAYQY,GAAA;AAAA,wBAXN,OAAM;AAAA,wBACN,OAAM;AAAA,wBACN,aAAU;AAAA,wBACT,UAA6BU,EAAA,kBAAc,CAAKT,EAAA,qBAAiB,CAAKV,EAAA,SAAS;AAAA,wBAG/E,SAAKG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAqBsI,EAAA,MAAK,UAAA,EAAA,QAAA,SAAA,OAA8BvI,EAAA,OAAK,OAAEA,EAAA,gBAAOA,EAAA,QAAO,CAAA;AAAA;mCAGpF,MAED,CAAA,GAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAFC,WAED,EAAA;AAAA;;;sBACAN,EAWQY,GAAA;AAAA,wBAVN,OAAM;AAAA,wBACN,aAAU;AAAA,wBACT,UAA6BU,EAAA,kBAAc,CAAKT,EAAA,wBAAoB,CAAKV,EAAA,SAAS;AAAA,wBAGlF,SAAKG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAqBsI,EAAA,MAAK,UAAA,EAAA,QAAA,YAAA,OAAiCvI,EAAA,OAAK,OAAEA,EAAA,gBAAOA,EAAA,QAAO,CAAA;AAAA;mCAGvF,MAED,CAAA,GAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAFC,cAED,EAAA;AAAA;;;;;;;;;;;;;;;MAKRN,EAuFQU,GAAA,EAvFD,cAAA,GAAU,GAAA;AAAA,mBACf,MA4CQ;AAAA,UA5CRV,EA4CQ+I,GAAA,EA5CD,MAAK,IAAG,GAAA;AAAA,uBACb,MA0CQ;AAAA,cA1CR/I,EA0CQU,GAAA,EA1CD,cAAA,GAAU,GAAA;AAAA,2BACf,MAmBQ;AAAA,kBAnBRV,EAmBQ+I,GAAA,EAnBD,MAAK,IAAG,GAAA;AAAA,+BACb,MAiBY;AAAA,sBAjBZ/I,EAiBYgJ,GAAA;AAAA,wBAjBA,cAAY;AAAA,wBAAK,UAAS;AAAA;wBACzB,WAAShI,EAClB,CAQM,EATgB,OAAAS,QAAK;AAAA,0BAC3BL,EAQM,aAROK,CAAK,CAAA,GAAA;AAAA,4BAChBzB,EAMEiJ,GAAA;AAAA,0CALS9I,EAAA;AAAA,8EAAAA,EAAA,UAAOC;AAAA,8BAChB,OAAM;AAAA,8BACN,OAAM;AAAA,8BACN,gBAAA;AAAA,8BACA,aAAU;AAAA;;;mCAIhB,MAIO;AAAA,4CAJPgB,EAIO,QAAA,MAAA;AAAA,8BAJD,yEAEO;AAAA,4BAAAA,EAAM,IAAA;AAAA,8BAAA,kDAEnB;AAAA;;;;;;;kBAGJpB,EAoBQ+I,GAAA,EApBD,MAAK,IAAG,GAAA;AAAA,+BACb,MAkBY;AAAA,sBAlBZ/I,EAkBYgJ,GAAA;AAAA,wBAlBA,cAAY;AAAA,wBAAK,UAAS;AAAA;wBACzB,WAAShI,EAClB,CASM,EAVgB,OAAAS,QAAK;AAAA,0BAC3BL,EASM,aATOK,CAAK,CAAA,GAAA;AAAA,4BAChBzB,EAOEiJ,GAAA;AAAA,0CANS9I,EAAA;AAAA,8EAAAA,EAAA,UAAOC;AAAA,8BACf,UAAQ,CAAGD,EAAA,QAAQ,SAAQ,MAAA;AAAA,8BAC5B,OAAM;AAAA,8BACN,OAAM;AAAA,8BACN,gBAAA;AAAA,8BACA,aAAU;AAAA;;;mCAIhB,MAIO;AAAA,4CAJPiB,EAIO,QAAA,MAAA;AAAA,8BAJD,8DACuD;AAAA,4BAAAA,EAAM,IAAA;AAAA,8BAAA,gDACpB;AAAA,4BAAAA,EAAM,IAAA;AAAA,8BAAA,iDAErD;AAAA;;;;;;;;;;;;;UAKRpB,EAwCQ+I,GAAA,EAxCD,MAAK,IAAG,GAAA;AAAA,uBACb,MAsCQ;AAAA,cAtCR/I,EAsCQU,GAAA;AAAA,gBAtCD,cAAA;AAAA,gBAAW,SAAQ;AAAA;2BACxB,MAcQ;AAAA,kBAdRV,EAcQ+I,GAAA,EAdD,MAAK,IAAG,GAAA;AAAA,+BACb,MAYE;AAAA,sBAZF/I,EAYEuC,GAAA;AAAA,oCAXSpC,EAAA;AAAA;mDAAAA,EAAA,SAAMC;AAAA,0BAUMS,EAAA;AAAA;wBATrB,OAAM;AAAA,wBACN,OAAM;AAAA,wBACN,gBAAA;AAAA,wBACA,SAAQ;AAAA,wBACR,SAAQ;AAAA,wBACP,OAAOA,EAAA;AAAA,wBACR,cAAW;AAAA,wBACX,cAAW;AAAA,wBACX,aAAU;AAAA;;;;kBAIdb,EAqBQ+I,GAAA,EArBD,MAAK,OAAM,GAAA;AAAA,+BAChB,MAgBQ;AAAA,sBAhBR/I,EAgBQY,GAAA;AAAA,wBAfN,OAAM;AAAA,wBACN,OAAM;AAAA,wBACL,UAAUU,EAAA,kBAAc,CAAKnB,EAAA,SAAS;AAAA,wBACvC,aAAU;AAAA,wBACT,SAAKG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAqBsI,EAAA,MAAK,UAAA;AAAA;iCAAsEvI,EAAA;AAAA,iCAA2BA,EAAA;AAAA,kCAA2BA,EAAA;AAAA,mCAA4BA,EAAA;AAAA;;mCASzL,MAED,CAAA,GAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAFC,WAED,EAAA;AAAA;;;sBAEAN,EAA6DY,GAAA;AAAA,wBAAtD,OAAM;AAAA,wBAAU,OAAM;AAAA;mCAAiB,MAAO,CAAA,GAAAN,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAAP,WAAO,EAAA;AAAA;;;sBACrDN,EAA2DY,GAAA;AAAA,wBAApD,OAAM;AAAA,wBAAU,OAAM;AAAA;mCAAY,MAAU,CAAA,GAAAN,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAAV,cAAU,EAAA;AAAA;;;;;;;;;;;;;;;;;;sFCrR3D4I,KAAc,CAAC1J,MACZd,EAAI,IAAI,qCAAqCc,CAAI,EAAE,GAGtD2J,KAAsB,CAAC3J,MACpBd,EAAI,IAAI,iCAAiCc,CAAI,EAAE,GAIlD4J,KAAU,CAACC,GAAOC,MACfD,EAAM,OAAO,CAACE,GAAQtI,MAAS;AACpC,QAAMuI,IAAMF,EAAOrI,CAAI;AACvB,SAAIsI,EAAOC,CAAG,IACZD,EAAOC,CAAG,EAAE,KAAKvI,CAAI,IAErBsI,EAAOC,CAAG,IAAI,CAACvI,CAAI,GAEdsI;AACT,GAAG,CAAA,CAAE,GClBDE,KAA0B,CAACC,MAAS;AAExC,QAAMC,IAAS,iBACTC,IAAU,kBACVC,IAAS;AACf,SAAO,IAAI,OAAO,GAAGF,CAAM,GAAGD,CAAI,GAAGE,CAAO,GAAGC,CAAM,GAAG;AAC1D;AAEe,MAAMC,GAAgB;AAAA,EACnC,YACEtK,GACAuK,IAAoB,MAAM;AAAA,EAAC,GAC3BC,IAA2B,MAAM;AAAA,EAAC,GAClC;AACA,SAAK,qBAAqB,CAAA,GAC1B,KAAK,mBAAmB,CAAA,GAExBd,GAAY1J,CAAI,EAAE,KAAK,CAACjB,MAAa;AACnC,WAAK,qBAAqBA,EAAS,KAAK,IAAIkL,EAAuB,GACnEO,EAAwB;AAAA,IAC1B,CAAC,GACDb,GAAoB3J,CAAI,EAAE,KAAK,CAACjB,MAAa;AAC3C,WAAK,mBAAmBA,EAAS,MACjCwL,EAAiB;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,eAAeE,GAASC,GAASC,GAAUC,GAASC,GAAU;AAC5D,QAAIC,IAAU,CAAA;AACd,UAAMC,IAAmBL,EAAQ,IAAI,OAAOC,EAAS,GAAG,EAAE;AAAA,MACxD;AAAA,MACAA,EAAS;AAAA,IACf;AACI,IACE,KAAK,mBAAmB,KAAK,CAACK,MAAUD,EAAiB,MAAMC,CAAK,CAAC,MAErEF,IAAU,KAAK,mBAGjBD,EAAS,MAAM;AAAA,MACb,GAAGC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQT,CAAK;AAAA,EACH;AACF;AClDe,MAAMG,WAAqBX,GAAgB;AAAA,EACxD,cAAc;AACZ,UAAM,KAAK;AAAA,EACb;AACF;ACJe,MAAMY,WAAqBZ,GAAgB;AAAA,EACxD,cAAc;AACZ,UAAM,OAAO,MAAM;AAGjB,WAAK,oBAAoB,KAAK,iBAAiB,OAAO,CAACP,GAAQtI,MAAS;AACtE,cAAM0J,IAAa1J,EAAK,QAAQ,MAAM,UAAU,EAAE,CAAC,GAC7C2J,IAAW3J,EAAK,QAAQ,QAAQ,GAAG0J,CAAU,KAAK,EAAE,GACpDE,IAAc;AAAA,UAClB,SAASD;AAAA,UACT,SAASA;AAAA,UACT,MAAM;AAAA,QAChB;AAEQ,eAAIrB,EAAOoB,CAAU,IACnBpB,EAAOoB,CAAU,EAAE,KAAKE,CAAW,IAEnCtB,EAAOoB,CAAU,IAAI,CAACE,CAAW,GAE5BtB;AAAA,MACT,GAAG,CAAA,CAAE,GACL,KAAK,UAAU,OAAO,KAAK,KAAK,iBAAiB,EAAE,IAAI,CAACoB,OAC/C;AAAA,QACL,SAASA;AAAA,QACT,SAASA;AAAA,QACT,MAAM;AAAA,MAChB,EACO;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eAAeV,GAASC,GAASC,GAAUC,GAASC,GAAU;AAC5D,QAAIC,IAAU,CAAA;AACd,UAAMC,IAAmBL,EAAQ,IAAI,OAAOC,EAAS,GAAG,EAAE;AAAA,MACxD;AAAA,MACAA,EAAS;AAAA,IACf;AACI,QACE,KAAK,mBAAmB,KAAK,CAACK,MAAUD,EAAiB,MAAMC,CAAK,CAAC,GACrE;AACA,YAAMM,IAAc,OAAO,KAAK,KAAK,iBAAiB,EAAE;AAAA,QACtD,CAACH,MAAeJ,EAAiB,SAASI,CAAU;AAAA,MAC5D;AACM,MAAIG,IACFR,IAAU,KAAK,kBAAkBQ,CAAW,IAE5CR,IAAU,KAAK;AAAA,IAEnB;AAEA,IAAAD,EAAS,MAAMC,CAAO;AAAA,EACxB;AACF;ACpDA,MAAMS,KAAiB,CAACrB,MAAS;AAE/B,QAAMC,IAAS,iBACTqB,IAAO;AACb,SAAO,IAAI,OAAO,GAAGrB,CAAM,GAAGD,CAAI,GAAGsB,CAAI,EAAE;AAC7C,GACMC,KAA0B,MAC1BC,KAAuB;AAEd,MAAMC,GAAgB;AAAA,EACnC,cAAc;AACZ,SAAK,MAAM,IAAI7M,GAAS,GAExB,KAAK,UAAU,CAAA,GACf,KAAK,IAAI,iBAAgB,EAAG,KAAK,CAACC,MAAa;AAC7C,MAAAA,EAAS,QAAQ,CAAC6M,MAAW;AAC3B,aAAK,QAAQA,CAAM,IAAI;AAAA,UACrB,KAAK;AAAA,UACL,KAAK;AAAA,QACf;AAAA,MACM,CAAC;AAAA,IACH,CAAC,GAED,KAAK,wBAAwB,CAAA,GAC7BlC,GAAY,KAAK,EAAE,KAAK,CAAC3K,MAAa;AACpC,WAAK,wBAAwBA,EAAS,KAAK,IAAIwM,EAAc;AAAA,IAC/D,CAAC,GAED,KAAK,wBAAwB,CAAA,GAC7B7B,GAAY,KAAK,EAAE,KAAK,CAAC3K,MAAa;AACpC,WAAK,wBAAwBA,EAAS,KAAK,IAAIwM,EAAc;AAAA,IAC/D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAUM,GAAM;AACpB,UAAM,EAAE,cAAAC,GAAc,aAAAC,EAAW,IAAKF,EAAK,MAAM;AAAA,CAAI,EAAE;AAAA,MACrD,CAACrD,GAAQF,GAAMC,MAAU;AAEvB,YADAD,IAAOA,EAAK,KAAI,GACZA,EAAK,MAAM,IAAI;AACjB,iBAAOE;AAET,cAAMwD,IAAW,KAAK,sBAAsB,OAAO,CAACC,GAAOjB,MAClDiB,KAAS3D,EAAK,MAAM0C,CAAK,GAC/B,IAAI,GACDkB,IAAW,KAAK,sBAAsB,OAAO,CAACD,GAAOjB,MAClDiB,KAAS3D,EAAK,MAAM0C,CAAK,GAC/B,IAAI;AACP,YAAI,CAACgB,KAAY,CAACE;AAChB,iBAAO1D;AAGT,YAAI2D,IAAWH,KAAYE,GACvBE,IAAcD,EAAS;AAC3B,QAAAA,IAAWA,EAASC,IAAc,CAAC;AAEnC,cAAMC,IAAgBF,EACnB,UAAUA,EAAS,MAAM,SAAS,EAAE,QAAQ,CAAC,EAC7C,QAAQ,UAAU,EAAE;AAEvB,YAAIE,EAAc,MAAMZ,EAAuB;AAC7C,iBAAAjD,EAAO,YAAY,KAAKD,IAAQ,CAAC,GAC1BC;AAGT,cAAM8D,IAAuB,CAAC,CAACD,EAAc,MAAMX,EAAoB,GACjEa,IAAgBF,EAAc;AAAA,UAClCC,IAAuB,MAAM;AAAA,QACvC;AACQ,YAAIC,EAAc,SAAS;AACzB,iBAAO/D;AAGT,cAAMgE,IAAW;AAAA,UACf,QAAQD,EAAc,CAAC;AAAA,UACvB,QAAQA,EAAc,CAAC;AAAA,QACjC;AACQ,YAAIL;AACF,UAAAM,EAAS,OAAOD,EAAc,CAAC;AAAA,aAC1B;AACL,gBAAME,IAAiBF,EAAc,MAAM,CAAC;AAC5C,UAAID,IACFE,EAAS,SAASC,EAAe;AAAA,YAC/B,CAACC,MAAUA,EAAM,MAAM,IAAI,EAAE,CAAC;AAAA,UAC5C,IAEYF,EAAS,SAASC,EAAe,OAAO,CAACE,GAAOpE,MAAUA,IAAQ,CAAC;AAAA,QAEvE;AAGA,mBAAWqE,KAAYJ;AACrB,UAAI,OAAOA,EAASI,CAAQ,KAAM,WAChCJ,EAASI,CAAQ,IAAIJ,EAASI,CAAQ,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAI,IAEjEJ,EAASI,CAAQ,IAAIJ,EAASI,CAAQ,EAAE;AAAA,YAAI,CAACnL,MAC3CA,EAAK,QAAQ,SAAS,EAAE,EAAE,KAAI;AAAA,UAC5C;AAIQ,eAAA+G,EAAO,aAAa,KAAK;AAAA,UACvB,MAAAF;AAAA,UACA,UAAAkE;AAAA,UACA,YAAYjE,IAAQ;AAAA,QAC9B,CAAS,GACMC;AAAA,MACT;AAAA,MACA,EAAE,cAAc,CAAA,GAAI,aAAa,GAAE;AAAA,IACzC,GAEUqE,IAAW,MAAM,KAAK,YAAYf,CAAY;AACpD,WAAO;AAAA,MACL,SAASC,EAAY,KAAI;AAAA,MACzB,UAAUc,EAAS,KAAK,CAAClI,GAAGH,MAAMG,EAAE,aAAaH,EAAE,UAAU;AAAA,IACnE;AAAA,EACE;AAAA,EAEA,MAAM,YAAYsH,GAAc;AAC9B,UAAMgB,IAAe,CAAA,GACfC,IAAenD;AAAA,MACnBkC;AAAA,MACA,CAACkB,MAAYA,EAAQ,SAAS;AAAA,IACpC;AACI,eAAWpB,KAAUmB,GAAc;AACjC,UAAI,CAAC,KAAK,QAAQnB,CAAM,GAAG;AACzB,mBAAWoB,KAAWD,EAAanB,CAAM;AACvC,UAAAkB,EAAa,KAAK;AAAA,YAChB,GAAGE;AAAA,YACH,OAAO,WAAWpB,CAAM;AAAA,UACpC,CAAW;AAEH;AAAA,MACF;AACA,YAAMqB,IAAerD;AAAA,QACnBmD,EAAanB,CAAM;AAAA,QACnB,CAACoB,MAAYA,EAAQ,SAAS;AAAA,MACtC;AACM,iBAAWE,KAAUD;AACnB,mBAAWD,KAAWC,EAAaC,CAAM,GAAG;AAC1C,gBAAMC,IAAWH,EAAQ,SAAS,OAAO,QAAQ;AACjD,cAAI,CAAC,KAAK,QAAQpB,CAAM,EAAEuB,CAAQ,GAAG;AACnC,kBAAMC,IAASJ,EAAQ,SAAS,OAC5B,gBACA,gBACEjO,IAAW,MAAM,KAAK,IAAIqO,CAAM,EAAExB,CAAM;AAC9C,iBAAK,QAAQA,CAAM,EAAEuB,CAAQ,IAAIpO,EAAS;AAAA,cACxC,CAACyJ,GAAQ6E,OACP7E,EAAO6E,EAAW,WAAW,IAAIA,EAAW,MAAM;AAAA,gBAChD,CAAC5L,MAASA,EAAK;AAAA,cACjC,GACuB+G;AAAA,cAET,CAAA;AAAA,YACd;AAAA,UACU;AAEA,gBAAMC,IAAQ,KAAK,QAAQmD,CAAM,EAAEuB,CAAQ,EAAED,CAAM;AACnD,cAAI,CAACzE,GAAO;AACV,YAAAqE,EAAa,KAAK;AAAA,cAChB,GAAGE;AAAA,cACH,OAAO,GACLG,MAAa,QAAQ,WAAW,SAChD,KAAmBvB,CAAM,IAAIsB,CAAM;AAAA,YACnC,CAAa;AACD;AAAA,UACF;AACA,cAAIF,EAAQ,SAAS;AACnB,gBAAI,CAACvE,EAAM,KAAK,CAAChH,MAASA,MAASuL,EAAQ,SAAS,IAAI,GAAG;AACzD,cAAAF,EAAa,KAAK;AAAA,gBAChB,GAAGE;AAAA,gBACH,OAAO,SAASpB,CAAM,IAAIsB,CAAM,IAAIF,EAAQ,SAAS,IAAI;AAAA,cACzE,CAAe;AACD;AAAA,YACF;AAAA;AAEA,uBAAWN,KAASM,EAAQ,SAAS;AACnC,kBAAI,CAACvE,EAAM,KAAK,CAAChH,MAASA,MAASiL,CAAK,GAAG;AACzC,gBAAAI,EAAa,KAAK;AAAA,kBAChB,GAAGE;AAAA,kBACH,OAAO,YAAYpB,CAAM,IAAIsB,CAAM,YAAYR,CAAK;AAAA,gBACtE,CAAiB;AACD;AAAA,cACF;AAAA,QAGN;AAAA,IAEJ;AACA,WAAOI;AAAA,EACT;AACF;;ACjMe,MAAMQ,GAAe;AAAA,EASlC,YAAYC,GAAQ,EAAE,SAAAC,GAAS,MAAA3B,GAAM,MAAA7L,EAAI,GAAI;AAN7C;AAAA;AAAA,IAAAyN,EAAA,MAAAC;AACA,IAAAD,EAAA,MAAAhD;AACA,IAAAgD,EAAA,MAAAE;AACA,IAAAF,EAAA,MAAAG;AACA,IAAAH,EAAA,MAAAI;AAWA;AAAA,IAAAC,GAAA,iBAAU,MAAM;AACd,YAAMpD,IAAUqD,EAAA,MAAKtD,IAAQ;AAC7B,MAAAsD,EAAA,MAAKC,IAAL,WAA2BtD;AAC3B,YAAMpB,IAAQ;AAAA,QACZ,OAAOoB,EAAQ,IAAI;AAAA,QACnB,QAAQ;AAAA,QACR,OAAO,EAAE,KAAK,EAAC;AAAA,QACf,KAAK,EAAE,KAAKA,EAAQ,IAAI,OAAO,OAAM;AAAA,MAC3C;AACI,WAAK,SAASpB,GAAOoB,CAAO;AAAA,IAC9B;AAGA;AAAA,IAAAoD,GAAA,kBAAW,CAAClN,GAAQ8J,MAAY;;AAC9B,UAAI9J,EAAO,MAAM,SAAS;AAExB,gBAAQA,EAAO,QAAM;AAAA,UACnB,KAAK;AACH,YAAAmN,EAAA,MAAKE,IAAL,WACEvD,GACA9J,EAAO,MAAM,KACbA,EAAO,MAAM,SAAS;AAExB;AAAA,UACF,KAAK;AACH,YAAAmN,EAAA,MAAKE,IAAL,WACEvD,GACA9J,EAAO,MAAM,MAAM,GACnB,CAACA,EAAO,MAAM,SAAS;AAEzB;AAAA,QACV;AAEI,eAASsN,IAAMtN,EAAO,MAAM,KAAKsN,KAAOtN,EAAO,IAAI,KAAKsN,KAAO;AAC7D,YAAIC,KAASC,KAAAC,IAAA3D,EAAQ,IAAI,OAAOwD,CAAG,MAAtB,gBAAAG,EAAyB,MAAMN,EAAA,MAAKJ,SAApC,gBAAAS,EAA+C;AAC5D,QAAID,MAAW,UACbA,MAAW,MAAMA,KAAU,IAC3BJ,EAAA,MAAKO,IAAL,WAAoB5D,GAAS;AAAA,UAC3B,KAAAwD;AAAA,UACA,QAAAC;AAAA;AAAA,UACA,MAAMJ,EAAA,MAAKH;AAAA,UACX,MAAMG,EAAA,MAAKF;AAAA,UACX,UAAUE,EAAA,MAAKL;AAAA,QACzB,MACiB9M,EAAO,WAAW,YAC3BmN,EAAA,MAAKQ,IAAL,WAA8B7D,GAASwD;AAAA,MAE3C;AAAA,IACF;AAEA,IAAAT,EAAA,MAAAa,IAAiB,CAAC5D,GAAS8D,MAAkB;AAC3C,MAAAT,EAAA,MAAKQ,IAAL,WAA8B7D,GAAS8D,EAAc,MACrD9D,EAAQ,eAAe,CAAC,GAAGA,EAAQ,eAAc,GAAI8D,CAAa,CAAC;AAAA,IACrE;AAEA,IAAAf,EAAA,MAAAc,IAA2B,CAAC7D,GAASwD,MAAQ;AAC3C,MAAAxD,EAAQ;AAAA,QACNA,EACG,eAAc,EACd;AAAA,UACC,CAAC+D,MACCA,EAAW,aAAaV,EAAA,MAAKL,MAAOe,EAAW,QAAQP;AAAA,QACnE;AAAA,MACA;AAAA,IACE;AAEA,IAAAT,EAAA,MAAAQ,IAAoB,CAACvD,GAASwD,GAAKQ,MAAU;AAC3C,MAAAhE,EAAQ;AAAA,QACNA,EAAQ,eAAc,EAAG,IAAI,CAAC+D,OACxBA,EAAW,MAAMP,MACnBO,EAAW,OAAOC,IAEbD,EACR;AAAA,MACP;AAAA,IACE;AAEA,IAAAhB,EAAA,MAAAO,IAAwB,CAACtD,MAAY;AACnC,MAAAA,EAAQ;AAAA,QACNA,EACG,eAAc,EACd,OAAO,CAAC+D,MAAeA,EAAW,aAAaV,EAAA,MAAKL,EAAG;AAAA,MAChE;AAAA,IACE;AA3FE,IAAAiB,GAAA,MAAKjB,GAAM,kBAAkB,KAAK,MAAM,KAAK,WAAW,GAAQ,CAAC,KACjEiB,GAAA,MAAKlE,IAAU8C,IACfoB,GAAA,MAAKhB,IAAWH,IAChBmB,GAAA,MAAKf,IAAQ/B,IACb8C,GAAA,MAAKd,IAAQ7N;AAAA,EACf;AAuFF;AAnGE0N,IAAA,eACAjD,KAAA,eACAkD,KAAA,eACAC,KAAA,eACAC,KAAA,eA6DAS,KAAA,eAKAC,KAAA,eAWAN,KAAA,eAWAD,KAAA;AC7Fa,MAAMY,WAAuBtB,GAAe;AAAA,EACzD,YAAYC,GAAQ;AAClB,UAAMpD,IAAS,cACT0E,IAAU,SACVC,IAAS;AACf,UAAMvB,GAAQ;AAAA,MACZ,SAAS,IAAI,OAAO,GAAGpD,CAAM,GAAG0E,CAAO,GAAGC,CAAM,EAAE;AAAA,MAClD,MAAM;AAAA;AAAA,MACN,MAAM;AAAA,IACZ,CAAK;AAAA,EACH;AACF;ACigBA,MAAMC,KAAc,YACdC,IAAe,cACfC,KAAQ,SACRC,KAAK,MACLC,KAAQ,SACRC,KAAQ,SAET1Q,KAAU;AAAA,EACb,YAAY;AAAA,IACV,oBAAA2Q;AAAA,IACA,cAAAC;AAAA,IACA,mBAAAC;AAAA,gBACAC;AAAAA,UACAC;AAAAA,IACA,QAAAC;AAAA,IACA,WAAAC;AAAA,IACA,YAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,eAAAC;AAAA,IACA,yBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,mBAAAC;AAAA;EAEF,QAAQ,CAACC,IAAgBC,EAAqB;AAAA,EAC9C,mBAAmB,SAAUC,GAAIC,GAAMC,GAAM;AAC3C,IAAIF,EAAG,OAAO,KACZ,KAAK,qBAAqBA,EAAG,OAAO,EAAE,EAAE,KAAKE,CAAI,IAEjDA,EAAI;AAAA,EAER;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA;IAEX,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA;;EAGb,OAAO,CAAC,SAAS,WAAW;AAAA,EAC5B,OAAO;AACL,WAAO;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA;AAAA,MACb,qBAAqB;AAAA,MACrB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;MAeV,gBAAgB;AAAA,MAChB,iBAAiB;AAAA;AAAA,MACjB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX,OAAO;AAAA,MACP,UAAU;AAAA,MACV,iBAAiB3B;AAAA,MACjB,mBAAmB;AAAA,MACnB,aAAa;AAAA,MACb,oBAAoBE;AAAA,MACpB,sBAAsB;AAAA,MACtB,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,OAAO;AAAA,MACP,cAAc,CAAA;AAAA,MACd,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,OAAO,CAAA;AAAA,MACP,aAAa,CAAA;AAAA,MACb,mBAAmB;AAAA,MACnB,UAAUH;AAAA,MACV,cAAc;AAAA,MACd,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,UAAU;AAAA,MACV,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,gBAAgB,CAAA;AAAA,MAChB,UAAU,CAAA;AAAA,MACV,qBAAqB;AAAA,MACrB,gBAAgB;AAAA,MAChB,OAAO,IAAI,QAAQ,WAAW,EAAE;AAAA,MAChC,KAAK;AAAA,QACH,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,QACT,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,UAAU,MAAM;AAAA,QAAC;AAAA;MAEnB,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU,MAAM;AAAA,QAAC;AAAA;MAEnB,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU,MAAM;AAAA,QAAC;AAAA;MAEnB,aAAa;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAM,CAAA;AAAA,QACN,OAAO;AAAA;MAET,eAAe;AAAA,QACb,MAAM;AAAA,QACN,QAAQ,CAAA;AAAA,QACR,UAAU,MAAM;AAAA,QAAC;AAAA;MAEnB,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA;MAER,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,KAAK,CAAA;AAAA;MAEP,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,sBAAsB;AAAA,MACtB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,iBAAiB,IAAIrD,GAAe;AAAA,MACpC,aAAa;AAAA,MACb,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,KAAK;AAAA,MACL,UAAU;AAAA,MACV,SAAS,CAAA;AAAA,MACT,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,eAAe;AAAA,MACf,QAAQ,CAAA;AAAA,MACR,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,IACtB;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,YAAY,WAAY;AACtB,aAAI,KAAK,UAAU,aAAa,KAAK,UAAU,WACtC,GAAG,KAAK,KAAK,IAAI,KAAK,WAAW,MAEnC,KAAK;AAAA,IACd;AAAA;AAAA,IAEA,UAAU,WAAY;AAEpB,YAAMkF,IAAY,OAAO,KAAK,KAAK,KAAK;AACxC,aAAAA,EAAU,KAAK,KAAK,YAAY,GACzB,CAAC,GAAG,IAAI,IAAIA,CAAS,CAAC;AAAA,IAC/B;AAAA,IACA,qBAAqB,WAAY;AAC/B,aAAO,KAAK,kBAAkB,IAAI,SAAS;AAAA,IAC7C;AAAA,IACA,UAAU,WAAY;AACpB,aAAO,CAAC,CAAC,KAAK;AAAA,IAChB;AAAA;AAAA,IAEA,cAAc,WAAY;AACxB,aAAI,KAAK,kBAAwB,KAAK,kBAElC,KAAK,aAAa7B,IAAqBA,IACpC,GAAG,KAAK,QAAQ,IAAI,KAAK,YAAY,GAAG,KAAI;AAAA,IACrD;AAAA;AAAA;AAAA;AAAA,IAIA,iBAAiB,WAAY;AAC3B,aAAO,KAAK,aAAaA,IAAe,KAAK,KAAK;AAAA,IACpD;AAAA,IACA,OAAO,WAAY;AACjB,aAAO;AAAA,QACL;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,YACL;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK,YAAY,KAAK;AAAA,cAChC,SAAS,MAAM;AACb,qBAAK,QAAO;AAAA,cACd;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK,YAAY,KAAK;AAAA,cAChC,SAAS;AAAA,gBACP;AAAA,kBACE,OAAO;AAAA,kBACP,MAAM;AAAA,kBACN,SAAS,MAAM;AACb,yBAAK,iBAAgB;AAAA,kBACvB;AAAA;gBAEF;AAAA,kBACE,OAAO;AAAA,kBACP,MAAM;AAAA,kBACN,SAAS,MAAM;AACb,yBAAK,mBAAkB;AAAA,kBACzB;AAAA;;;YAIN;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,SAAQ;AAAA,cACf;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,KAAK;AAAA;YAEhB;AAAA,cACE,SAAS;AAAA;YAEX;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK,YAAY,KAAK;AAAA,cAChC,SAAS,MAAM;AACb,qBAAK,SAAQ;AAAA,cACf;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK,YAAY,KAAK;AAAA,cAChC,SAAS,MAAM;AACb,qBAAK,OAAM;AAAA,cACb;AAAA;YAEF;AAAA,cACE,SAAS;AAAA;YAEX;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,SAAQ;AAAA,cACf;AAAA;YAEF;AAAA,cACE,SAAS;AAAA;YAEX;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK,YAAY,KAAK;AAAA,cAChC,SAAS,MAAM;AACb,qBAAK,OAAM;AAAA,cACb;AAAA;;;QAIN;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,YACL;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,SAAS,MAAM;AACb,qBAAK,OAAO,YAAY,MAAM;AAAA,cAChC;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,OAAO,YAAY,SAAS;AAAA,cACnC;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,QAAQ,KAAK;AAAA,kBAChB,OAAO;AAAA,kBACP,MACE;AAAA,kBAKF,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,MAAM;AAAA,iBACP;AAAA,cACH;AAAA;;;QAIN;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,YACL;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,SAAS,MAAM;AACb,qBAAK,cAAc;AAAA,cACrB;AAAA;YAEF;AAAA,cACE,SAAS;AAAA;YAEX;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,kBAAkB,CAAC,KAAK;AAAA,cAC/B;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,cAAc,WAAW,MAAM;AAAA,gBAAC,GACrC,KAAK,aAAY;AAAA,cACnB;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,SAAS,MAAM;AACb,qBAAK,gBAAgB;AAAA,cACvB;AAAA;YAEF;AAAA,cACE,SAAS;AAAA;YAEX;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,YAAW;AAAA,cAClB;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,eAAc;AAAA,cACrB;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,iBAAgB;AAAA,cACvB;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,CAAC,KAAK;AAAA,cAChB,SAAS,MAAM;AACb,qBAAK,cAAa;AAAA,cACpB;AAAA;YAEF;AAAA,cACE,SAAS;AAAA;YAEX;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,SAAS,MAAM;AACb,qBAAK,YAAW;AAAA,cAClB;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,iBAAgB;AAAA,cACvB;AAAA;YAEF;AAAA,cACE,OAAO;AAAA,cACP,UAAU;AAAA,cACV,SAAS,KAAK;AAAA,cACd,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AAGb,qBAAK,oBAAoB,CAAC,KAAK;AAAA,cACjC;AAAA;YAEF;AAAA,cACE,SAAS;AAAA;YAEX;AAAA,cACE,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,SAAS,MAAM;AACb,qBAAK,qBAAoB;AAAA,cAC3B;AAAA;;;MAIR;AAAA,IACF;AAAA;EAEF,OAAO;AAAA,IACL,UAAU,SAAU8B,GAAK;AACvB,WAAK,mBAAmBA,GACnB,KAAK,gBACR,KAAK,oBAAoBA,IAEvB,KAAK,gBAAgB,MAASA,KAAO,KACvC,KAAK,OAAO,YAAYA,CAAG,IAE3B,KAAK,OAAO,YAAY,EAAI;AAAA,IAEhC;AAAA,IACA,cAAc,SAAUC,GAAU;AAChC,WAAK,iBAAiBA,GACjB,KAAK,WACJA,MAAa/B,IACf,aAAa,WAAW,yBAAyB,IAEjD,aAAa,0BAA6B+B;AAAA,IAGhD;AAAA;EAEF,SAAS,iBAAkB;AAEzB,SAAK,MAAM,IAAIjS,GAAS,GACxB,KAAK,IAAI,sBAAqB,GAC9B,KAAK,IACF,YAAY,WAAW,EACvB,KAAK,CAACC,MAAa;AAClB,MAAIA,MACF,KAAK,WAAWA;AAAA,IAEpB,CAAC,EACA,MAAM,CAACC,MAAU;AAAA,IAElB,CAAC,GAGH,KAAK,eAAegQ;AAEpB,QAAIgC,IAAO,WAAW,KAAI,GACtBC,IAAQ,WAAW,UAAS;AAChC,SAAK,eAAe,IACpB,KAAK,cAAc;AACnB,aAASC,KAAQD;AACf,MAAIC,KAAQ,aAGRA,KAAQ,WAAWA,KAAQ,cAC7B,KAAK,eAAe,IACpB,KAAK,cAAc,MACVA,KAAQ,WACjB,KAAK,cAAc,KAEnB,MAAMhS,EAAI,IAAI,qBAAqBgS,CAAI,EAAE,EAAE,KAAK,CAACnS,MAAa;AAC5D,QACEA,EAAS,SAAS,QAClBA,EAAS,KAAK,gBAAgB,WAG5BA,EAAS,KAAK,YAAY;AAAA,UACxB,CAAC,MAAM,EAAE,cAAc;AAAA,QACzB,MAEA,KAAK,eAAe,KAGpBA,EAAS,KAAK,YAAY;AAAA,UACxB,CAAC,MAAM,EAAE,cAAc;AAAA,QACzB,MAEA,KAAK,cAAc;AAAA,MAGzB,CAAC;AAWL,QAPK,KAAK,WACR,aAAa,0BAA6B,KAAK,UAAU;AAAA,MACvD,MAAMiS,EAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,SAAS,KAAK;AAAA,KACf,IAEC,KAAK,gBAAgB,IAAM;AAC7B,WAAK,YAAY;AACjB,UAAInF,IAAO,QAAQmF,EAAK,kBAAqB;AAC7C,MAAI,KAAK,gBACPnF,KAAQ,6BAEV,KAAK,YAAYA,GACjB,KAAK,YAAY;AAAA,IACnB;AAEA3M,IAAAA,EAAI,IAAI,0CAA0C,EAAE,KAAK,CAACH,MAAa;AACrE,WAAK,iBAAiBA,EAAS;AAAA,IACjC,CAAC,GAEG,KAAK,WACP,KAAK,WAAW;AAAA,EAEpB;AAAA,EACA,SAAS,iBAAkB;;AACzB,SAAK,SAAS,IAAI,KAAK,KAAK,MAAM,MAAM,GACxC,KAAK,OAAO,SAAS,oBAAoB;AACzC,UAAMoS,IAAW,KAAK,cAAa,GAC7BC,IAAa,KAAK,gBAAe;AACvC,SAAK,WAAW,IAAID,EAAQ,GAC5B,KAAK,aAAa,IAAIC,EAAU,GAChC,KAAK,OAAO,QAAQ,QAAQ,KAAK,QAAQ,GACzC,KAAK,OAAO,QAAQ,WAAW,CAAC,GAChC,KAAK,OAAO,QAAQ,eAAe,EAAI,GACvC,KAAK,OAAO,kBAAkB,OAC9B,KAAK,OAAO,UAAU,6BAA6B,EAAI,GACvD,KAAK,OAAO,UAAU,4BAA4B,EAAI,GACtD,KAAK,OAAO,aAAa,CAAC,IAAInG,GAAY,GAAI,IAAIC,GAAY,CAAE,GAChE,KAAK,OAAO,uBAAuB,EAAK,GACxCmG,GAAe,sBAAsB,KAAK,QAAQ,EAAE,QAAQ,KAAK,UAAU,GAC3E,KAAK,OAAO,MAAK,GAEjB,KAAK,OAAO,GAAG,mBAAmB,KAAK,gBAAgB,GAIvD,KAAK,OAAO,QAAQ,GAAG,mBAAmB,KAAK,QAAQ,GACnD,KAAK,iBACP,KAAK,OAAO,YAAY,EAAI,GAC5B,KAAK,OAAO,SAAS,aAAa,QAAQ,MAAM,UAAU;AAG5D,UAAMC,IAAiB,IAAI1C,GAAe,KAAK,MAAM;AACrD,SAAK,OAAO,QAAQ,GAAG,UAAU,CAAChO,GAAQ8J,MAAY;AACpD,MAAA4G,EAAe,SAAS1Q,GAAQ8J,CAAO,GACvC,KAAK,kBAAkB9J,GAAQ8J,CAAO;AAAA,IACxC,CAAC,GAED,KAAK,OAAO,UAAU,iBAAiB,UAAU,KAAK,QAAQ,GAC9D,KAAK,OAAO,UAAU,iBAAiB,WAAW,KAAK,OAAO,GAG9D,OAAO,iBAAiB,UAAU,KAAK,UAAU,GACjD,KAAK,WAAU,GAEf,KAAK,QAAQ,IAAI6G,GAAM,mBAAmB,GAEtC,CAAC,KAAK,UAAU,aAAa,0BAC/B,KAAK,SAAS,KAAK,MAAM,aAAa,qBAAwB,GAE9D,KAAK,SAAS,KAAK,OAAO,IAAI,CAAC9P,OAAU;AAAA,MACvC,GAAGA;AAAA,MACH,SAAS,OAAO6H,MAAU;AACxB,aAAK,WAAWA,EAAM,OACtB,MAAM,KAAK,WAAU;AAAA,MACvB;AAAA,IACF,EAAE,IAEC,KAAK,SAgBJ,KAAK,SACP,KAAK,OAAO,SAAS,KAAK,IAAI,GAC9B,KAAK,OAAO,eAAc,MAjBxB+E,IAAA,KAAK,OAAO,UAAZ,QAAAA,EAAmB,QACrB,KAAK,WAAW,KAAK,OAAO,MAAM,MAClC,MAAM,KAAK,WAAU,MACZD,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,KAC7B,MAAM,KAAK,qBAAqB,KAAK,OAAO,OAAO,EAAE,KAErD,KAAK,WAAW,eAAe,QAAQ,0BAA0B,GAC7D,KAAK,WACP,MAAM,KAAK,qBAAqB,KAAK,QAAQ,IACpC,aAAa,4BACtB,KAAK,WAAW,aAAa,yBAC7B,MAAM,KAAK,WAAW,EAAK,KASjC,KAAK,iBAAiB,YAAY,YAAY;AAC5C,WAAK,gBAAe;AAAA,IACtB,GAAG,GAAG;AAAA,EACR;AAAA,EACA,gBAAgB;AACd,IAAI,KAAK,YAAY,CAAC,KAAK,UACzB,eAAe,QAAQ,4BAA4B,KAAK,QAAQ,GAElE,KAAK,OAAO,QAAO,GACnB,KAAK,OAAO,UAAU,OAAM;AAAA,EAC9B;AAAA,EACA,YAAY;AACV,SAAK,WAAU,GACX,KAAK,kBAAkB,QACzB,cAAc,KAAK,cAAc,GAE/B,KAAK,iBACP,KAAK,aAAa,YAAW,GAC7B,KAAK,eAAe,OAEtB,KAAK,MAAM,WAAU;AAAA,EACvB;AAAA,EACA,SAAS;AAAA,IACP,gBAAgB;AACd,MAAAiD,GAAe,cAAc,KAAK,MAAM;AAAA,IAC1C;AAAA,IACA,WAAW;AACT,WAAK,OAAO,OAAM,GAGlB,KAAK,UAAU,MAAM;AACnB,aAAK,WAAU;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,IACA,aAAa;AACX,YAAM9D,IAAS,SAAS,uBAAuB,WAAW,EAAE,CAAC,GACvDlK,IAAI,KAAK;AAAA,QACb,SAAS,gBAAgB;AAAA,QACzB,OAAO,eAAe;AAAA,MACxB;AACA,UAAImO,IAAe;AACnB,MAAIjE,MACFiE,IAAejE,EAAO;AAExB,UAAIkE,IAAe;AACnB,YAAMC,IAAS,SAAS,uBAAuB,cAAc,EAAE,CAAC;AAChE,MAAIA,MACFD,IAAeC,EAAO;AAExB,UAAIC,IAAc,SAAS,eAAe,qBAAqB;AAC/D,MAAIA,MACFA,EAAY,MAAM,SAAS,GAAGtO,IAAImO,IAAeC,CAAY;AAAA,IAEjE;AAAA,IACA,mBAAmB;AACjB,MAAI,KAAK,iBACP,KAAK,aAAa,YAAW,GAC7B,KAAK,eAAe,OAEtB,KAAK,eAAe,SAAS;AAAA,IAC/B;AAAA,IACA,eAAe;AACbvS,MAAAA,EAAI,IAAI,sBAAsB,EAAE,KAAK,CAACH,MAAa;AAEjD,aAAK,cAAc,SAASA,EAAS,KAAK,IAAI,CAACuK,OACtC;AAAA,UACL,MAAM;AAAA,UACN,OAAO,IAAI,KAAKA,EAAM,QAAQ,GAAI;AAAA,UAClC,KAAK,IAAI,KAAKA,EAAM,QAAQ,GAAI;AAAA,UAChC,OAAOA,EAAM;AAAA,UACb,MAAMA,EAAM;AAAA,UACZ,OAAO;AAAA,UACP,UAAUA;AAAA,QACZ,EACD,GACD,KAAK,cAAc,OAAO;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,IACA,iBAAiBsI,GAAO;AAEtB,MAAIA,MAAU,mBAAmB,KAAK,wBAAwB,MAC5D,KAAK,sBAAsB,IAC3B,KAAK,SAAS,QAAO,KAErBA,MAAU,sBACV,KAAK,wBAAwB,OAE7B,KAAK,sBAAsB,IAC3B,KAAK,SAAS,QAAO;AAAA,IAEzB;AAAA;AAAA;AAAA,IAGA,gBAAgBb,GAAU;AAExB,MAAAA,IAAWA,EAAS,MAAM,GAAG,EAAE,CAAC,GAChC,KAAK,OAAO,SAAS,KAAK,MAAMA,CAAQ,EAAE,OAAO,GACjD,KAAK,mBAAmBA,CAAQ,GAChC,KAAK,OAAO,eAAc,GAC1B,KAAK,iBAAgB,GACrB,KAAK,OAAO,QAAQ;AAAA,QAClB,IAAI,KAAK;AAAA,UACP,KAAK,MAAMA,CAAQ,EAAE,SAAS;AAAA,UAC9B;AAAA,UACA,KAAK,MAAMA,CAAQ,EAAE,SAAS;AAAA,UAC9B;AAAA;QAEF,GAAG,KAAK,KAAK;AAAA,QACb;AAAA,MACF,GACA,KAAK,OAAO,SAAS,KAAK,MAAMA,CAAQ,EAAE,MAAM;AAAA,IAClD;AAAA,IACA,sBAAsB,SAAUc,GAAI;AAClC,aAAO3S,EAAI,IAAI,8BAA8B2S,CAAE,EAAE,EAC9C,KAAK,CAAC9S,MAAa;AAClB,YAAIA,EAAS,MAAM;AACjB,cAAI+S,IAAQ/S,EAAS,KAAK;AAC1B,UACE+S,MAAU,eACVA,MAAU,sBACVA,MAAU,aACVA,MAAU,aACVA,MAAU,YAEV,KAAK,WAAW/S,EAAS,KAAK,UAC9B,KAAK,cAAcA,CAAQ,GAC3B,KAAK,gBAAe,GACpB,KAAK,YAAY8S,CAAE,MAEnB,KAAK,QAAQ,QAAQ;AAAA,YACnB,OAAO,UAAUA,CAAE;AAAA,YACnB,MAAM;AAAA,WACP,GACD,KAAK,eAAc,GACnB,KAAK,cAAc;AAAA,QAEvB;AACE,gBAAM,IAAI,MAAM,2CAA2CA,CAAE,EAAE;AAAA,MAEnE,CAAC,EACA,MAAM,CAAC7S,MAAU;AAChB,aAAK,QAAQ,QAAQ;AAAA,UACnB,OAAO,kBAAkB6S,CAAE;AAAA,UAC3B,MAAM;AAAA,SACP,GACD,KAAK,eAAc,GACnB,KAAK,cAAc;AAAA,MACrB,CAAC;AAAA,IACL;AAAA,IACA,eAAe,SAAU9S,GAAU;AACjC,MAAIA,EAAS,KAAK,iBAChB,KAAK,oBAAoB,IACzB,KAAK,cAAc,IACnB,KAAK,WAAW,KAAK,MAAMA,EAAS,KAAK,YAAY,IAEvD,KAAK,SAAQ;AAAA,IACf;AAAA,IACA,0BAA0B,SAAU6B,GAAQ;AAC1C,WAAK,QAAQA,EAAO,OACpB,KAAK,QAAQA,EAAO,OACpB,KAAK,uBAAuB;AAAA,IAC9B;AAAA,IACA,eAAe,WAAY;AACzB,YAAMmR,IAAY,KAAK,OAAO,kBAAiB,EAAG,MAAM;AACxD,MAAK,KAAK,WAGR7S,EAAI;AAAA,QACF,8BAA8B,KAAK,QAAQ;AAAA,QAC3C;AAAA,UACE,MAAM;AAAA,YACJ,MAAM,CAAC,KAAK,gBAAgB6S,CAAS;AAAA;;MAG3C,IATA,KAAK,MAAM,MAAM,MAAMA,CAAS;AAAA,IAWpC;AAAA,IACA,kBAAkB,WAAY;AAC5B,YAAMC,IAAQ,KAAK,OAAO,kBAAiB;AAC3C,UAAID,IAAYC,EAAM,MAAM,MAAM,GAC9BC,IAAUD,EAAM,IAAI,MAAM;AAC9B,MAAIA,EAAM,IAAI,WAAW,MACvBC,KAAW,IAER,KAAK,WAGR/S,EAAI;AAAA,QACF,8BAA8B,KAAK,QAAQ;AAAA,QAC3C;AAAA,UACE,MAAM;AAAA,YACJ,MAAM,CAAC,KAAK,gBAAgB6S,GAAWE,CAAO;AAAA;;MAGpD,IATA,KAAK,MAAM,MAAM,MAAMF,GAAWE,CAAO;AAAA,IAW7C;AAAA,IACA,kBAAkB,WAAY;AAC5B,WAAK,OAAO,QAAQ,iBAAgB;AAAA,IACtC;AAAA,IACA,kBAAkB,SAAUrR,GAAQ;AAElC,UAAI,CAAC,KAAK,UAAU;AAClB,cAAMsN,IAAMtN,EAAO,sBAAsB;AACzC,QAAIA,EAAO,OAAO,QAAQ,eAAesN,GAAK,CAAC,EAAEA,CAAG,IAClDtN,EAAO,OAAO,QAAQ,gBAAgBsN,CAAG,IAEzCtN,EAAO,OAAO,QAAQ,cAAcsN,CAAG;AAAA,MAE3C;AAAA,IACF;AAAA,IACA,mBAAmB,SAAUtN,GAAQ8J,GAAS;AAC5C,UAAI9J,EAAO,MAAM,UAAU;AACzB;AAEF,YAAMsR,IAAe,KAAK,kBAAkBxH,CAAO,EAAE;AAAA,QACnD,CAACwD,MACEtN,EAAO,MAAM,WAAW,KAAKsN,MAAQtN,EAAO,MAAM,OACnDsN,IAAMtN,EAAO,MAAM;AAAA,MACvB;AACA,UAAIuR,IAAe,CAAA,GACflT,IAAS;AACb,cAAQ2B,EAAO,QAAM;AAAA,QACnB,KAAK;AACH,UAAA3B,IAAS2B,EAAO,MAAM,SAAS,GAC/BsR,EAAa,QAAO;AACpB;AAAA,QACF,KAAK;AACH,UAAAjT,IAAS,CAAC2B,EAAO,MAAM,SAAS,GAChCuR,IAAe,CAAC,GAAG,MAAMvR,EAAO,MAAM,MAAM,EAAE,KAAI,CAAE,EAAE;AAAA,YACpD,CAACsN,MAAQA,IAAMtN,EAAO,MAAM;AAAA,UAC9B;AACA;AAAA,MACJ;AACA,MAAAsR,EAAa,QAAQ,CAAChE,MAAQ;AAC5B,QAAAxD,EAAQ,gBAAgBwD,CAAG,GACtBiE,EAAa,SAASjE,CAAG,KAC5BxD,EAAQ,cAAcwD,IAAMjP,CAAM;AAAA,MAEtC,CAAC;AAAA,IACH;AAAA,IACA,mBAAmB,SAAUyL,IAAU,KAAK,OAAO,SAAS;AAC1D,aAAOA,EACJ,eAAc,EACd,IAAI,CAAC0H,GAAYlE,MAAQkE,KAAclE,CAAG,EAC1C,OAAO,OAAO,SAAS;AAAA,IAC5B;AAAA,IACA,oBAAoB,SAAU6C,GAAU;;AACtC,WAAK,iBAAgB,IACrB1C,IAAA,KAAK,YAAY0C,CAAQ,MAAzB,QAAA1C,EAA4B,QAAQ,CAAC+D,MAAe;AAClD,aAAK,OAAO,QAAQ,cAAcA,CAAU;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,sBAAsB,WAAY;AAChC,WAAK,QACF,QAAQ,uDAAuD;AAAA,QAC9D,QAAQ;AAAA,QACR,YAAY;AAAA,OACb,EACA,KAAK,CAACrS,MACEb,EAAI,OAAO,oCAAoC,CACvD,EACA,KAAK,CAACH,MAAa;AAClB,aAAK,iBAAgB;AAAA,MACvB,CAAC;AAAA,IACL;AAAA,IACA,kBAAkBuK,GAAO;AACvB,MAAI,KAAK,oBAAoB2F,KAC3B,KAAK,MAAM3F,GAAO,aAAa,IAE/B,KAAK,GAAGA,GAAO,aAAa;AAAA,IAEhC;AAAA,IACA,MAAM,QAAQA,GAAO;AAEnB,MAAI,KAAK,YAAY,KAAK,OAAO,YAAW,MAAO,OAMhDA,EAAM,WAAWA,EAAM,YACxBA,EAAM,YAAY,OAEdA,EAAM,YACRA,EAAM,eAAc,GACpB,KAAK,OAAM,MAEXA,EAAM,eAAc,GACpB,MAAM,KAAK,SAAQ;AAAA,IAGzB;AAAA,IACA,SAASA,GAAO;AAEd,MAAI,KAAK,YAAY,KAAK,OAAO,YAAW,MAAO,OAG/C,KAAK,OAAO,QAAQ,eAAc,EAAG,QAAO,IAC9C,KAAK,eAAe,MAEpB,KAAK,eAAe;AAAA,IAExB;AAAA,IACA,gBAAgB,WAAY;AAC1B,UAAIyH,IAAW,KAAK;AACpB,MAAI,KAAK,aAAa/B,MAEd+B,EAAS,SAAS,KAAK,KAAKA,EAAS,SAAS,KAAK,KACvD7R,EAAI,KAAK,uBAAuB,KAAK,QAAQ,cAAc;AAAA,QACzD,MAAM,KAAK,OAAO,SAAQ;AAAA,QAC1B,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,gBAAgB;AAAA;MAEpB,CAAC,EAAE,KAAK,CAACH,MAAa;AACpB,YAAIsT,IAAY;AAChB,QAAAA,KAAa,WAAWtT,EAAS,KAAK,KAAK,uBAC3CsT,KAAa,KAAK,MAAMtT,EAAS,KAAK,WAAW,GACjD,KAAK,QAAQ,MAAMsT,EAAU,QAAQ,EAAE,MAAM,GAAG,CAAG;AAAA,MAErD,CAAC,IAGL,KAAK,gBACF,UAAU,KAAK,OAAO,SAAQ,CAAE,EAChC,KAAK,CAAC,EAAE,SAAAC,GAAS,UAAAzF,QAAe;AAC/B,YAAIwF,IAAY;AAChB,YAAIxF,EAAS,QAAQ;AACnB,gBAAM0F,IAAc1F,EACjB,IAAI,CAAC2F,MAAY,GAAGA,EAAQ,UAAU,KAAKA,EAAQ,KAAK,EAAE,EAC1D,KAAK,OAAO;AACf,UAAAH,KAAa,2DAA2DE,CAAW;AAAA,QACrF;AACA,QAAID,EAAQ,WACVD,KACE,2EAEAA,MAAc,OAChBA,IAAY,4CAEd,KAAK,QAAQ,MAAMA,EAAU,QAAQ,EAAE,MAAM,GAAG,CAAG;AAAA,MACrD,CAAC;AAAA,IACL;AAAA,IACA,kBAAkB;AAChB,WAAK,sBAAsB,IAC3B,KAAK,oBAAoB,IACzB,KAAK,cAAc,IACnB,KAAK,uBAAuB,IAC5B,KAAK,eAAe,IACpB,KAAK,QAAQ,iBACb,KAAK,kBAAkBnD,IACvB,KAAK,OAAO,YAAY,EAAI;AAAA,IAC9B;AAAA,IACA,YAAY2C,GAAI;AACd,WAAK,MAAM,aAAaA,CAAE,GAC1B,KAAK,WAAWA,GAChB,KAAK,MACF;AAAA,QACC;AAAA,QACA,OAAO;AAAA,QACP;AAAA,UACE,UAAU,CAACY,MAAS,KAAK,SAASA,CAAI;AAAA;QAExC;AAAA,UACE,IAAI,KAAK;AAAA;MAEb,EACC,KAAK,CAACC,MAAiB;AACtB,aAAK,eAAeA;AAAA,MACtB,CAAC;AAAA,IACL;AAAA,IACA,MAAM,iBAAiB;AAErB,WAAK,QAAQ,WACb,KAAK,QAAQ,IACb,KAAK,WAAW,MAChB,eAAe,WAAW,0BAA0B,GACpD,KAAK,kBAAkB,MACvB,KAAK,QAAQ,CAAA,GAET,KAAK,iBACP,MAAM,KAAK,aAAa,YAAW,GACnC,KAAK,eAAe,OAEtB,KAAK,eAAe,SAAS,GAE7B,MAAM,KAAK,WAAU,GAGrB,KAAK,OAAO,QAAQ,eAAc,EAAG,MAAK,GACtC,KAAK,gBAAgB,MACvB,KAAK,OAAO,YAAY,EAAK,GAI/B,KAAK,sBAAsB,IAC3B,KAAK,kBAAkBzD,IACvB,KAAK,qBAAqBE,IAE1B,KAAK,oBAAoB,KAAK,aAC9B,KAAK,cAAc,IACnB,KAAK,uBAAuB,IAC5B,KAAK,eAAe;AAAA,IACtB;AAAA,IACA,oBAAoB,SAAU7F,GAAO;AACnC,WAAK,kBAAkB,MAAMA;AAAA,IAC/B;AAAA,IACA,cAAc,WAAY;AACxB,WAAK,MAAK;AAAA,IACZ;AAAA,IACA,MAAM,MACJA,IAAQ,MACRqJ,IAAc,MACdC,IAAU,MACVC,IAAc,MACd;AAIA,WAAK,gBAAe,GACpB,MAAM,KAAK,SAAS,OAAO,GAC3B,KAAK,cAAc;AACnB,UAAI9B,IAAW,KAAK;AACpB,MAAI,KAAK,aAAa/B,MAEpB+B,IAAW,KAAK;AAElB,UAAI+B,IAAM,uBAAuB/B,CAAQ;AACzC,MAAI,KAAK,mBACP+B,KAAO;AAET,UAAIC,IAAM,KAAK,kBAAkB;AACjC,MAAI,KAAK,sBACPA,IAAMA,EAAI,OAAO;AAAA,QACf,KAAK;AAAA,QACL,OAAO;AAAA,OACR;AAEH,UAAIN,IAAO;AAAA,QACT,aAAaM;AAAA,MACf;AACA,MAAIJ,MAEFF,EAAK,cAAiBnJ,IAEpBsJ,MAAY,SACdH,EAAK,UAAaG,IAEhBC,MAAgB,SAClBJ,EAAK,cAAiBI,IAExB3T,EAAI,KAAK4T,GAAK,EAAE,MAAAL,GAAM,EACnB,KAAK,CAAC1T,MAAa;AAClB,aAAK,YAAYA,EAAS,IAAI;AAAA,MAChC,CAAC,EACA,MAAM,CAACC,MAAU;AAChB,aAAK,eAAc;AAAA,MACrB,CAAC;AAAA,IACL;AAAA,IACA,KAAK;AAGH,WAAK,iBAAiB,KAAK,iBAC3B,KAAK,gBAAgB,KAAK,eAAe,GACzCE,EAAI,KAAK,8BAA8B,KAAK,QAAQ,KAAK;AAAA,IAC3D;AAAA,IACA,eAAe;AACb,MAAI,KAAK,uBAAuBiQ,KAC9BjQ,EAAI,KAAK,8BAA8B,KAAK,QAAQ,QAAQ,KAE5D,KAAK,qBAAqBiQ,IAC1BjQ,EAAI,KAAK,8BAA8B,KAAK,QAAQ,QAAQ;AAAA,IAEhE;AAAA,IACA,OAAO;AAIL,MAAI,KAAK,SACP,KAAK,iBAAgB,GACrB,KAAK,eAAc,KAEnBA,EAAI,KAAK,8BAA8B,KAAK,QAAQ,OAAO;AAAA,IAE/D;AAAA,IACA,OAAO;AACLA,MAAAA,EAAI,KAAK,8BAA8B,KAAK,QAAQ,OAAO;AAAA,IAC7D;AAAA;AAAA,IAEA,gBAAgB;AAEd,UAAI,KAAK,UAAU,aAAa,KAAK,UAAU;AAC7C,aAAK,aAAY;AAAA,eACR,KAAK,oBAAoB;AAElC;AAEF,WAAK,eAAe,KAAK,IAAG,GAE5B,KAAK,kBAAkB,YAAY,MAAM;AACvC,aAAK,cAAc,KAAK,OAAO,KAAK,IAAG,IAAK,KAAK,gBAAgB,GAAI;AAAA,MACvE,GAAG,GAAI;AAAA,IACT;AAAA,IACA,eAAe;AACb,WAAK,cAAc,GACnB,cAAc,KAAK,eAAe,GAClC,KAAK,kBAAkB;AAAA,IACzB;AAAA,IACA,YAAYuT,GAAM;AAChB,MAAIA,EAAK,YAAYA,EAAK,aAAa,KAAK,oBACrC,KAAK,MAAMA,EAAK,QAAQ,KAuB3B,KAAK,kBAAkBA,EAAK,UAC5B,KAAK,OAAO,SAAS,KAAK,MAAMA,EAAK,QAAQ,EAAE,OAAO,GACtD,KAAK,mBAAmBA,EAAK,QAAQ,GACrC,KAAK,OAAO,eAAc,MAvB1B,KAAK,MAAMA,EAAK,QAAQ,IAAI,EAAE,SAAS,IAAI,QAAQ,EAAA,GAGnDvT,EAAI,IAAI,uBAAuBuT,EAAK,QAAQ,EAAE,EAC3C,KAAK,CAAC1T,MAAa;AAGlB,aAAK,MAAM0T,EAAK,QAAQ,IAAI;AAAA,UAC1B,SAAS1T,EAAS,KAAK;AAAA,UACvB,QAAQ;AAAA,QACV,GACA,KAAK,YAAY0T,EAAK,QAAQ,IAAI1T,EAAS,KAAK,aAChD,KAAK,mBAAmB0T,EAAK,QAAQ,GACrC,KAAK,kBAAkB;AAAA,MACzB,CAAC,EACA,MAAM,CAAC3P,MAAQ;AAEd,aAAK,MAAM2P,EAAK,QAAQ,IAAI;AAAA,MAC9B,CAAC,KAQP,KAAK,QAAQA,EAAK;AAClB,YAAMO,IAAU,KAAK,OAAO,QAAQ,WAAU;AAC9C,cAAQ,KAAK,OAAK;AAAA,QAChB,KAAK;AACH,eAAK,cAAa,GAClB,KAAK,oBAAoB,IACzB,KAAK,uBAAuB,IAC5B,KAAK,eAAe,IACpB,KAAK,qBAAqB7D,IAE1B,KAAK,iBAAgB,GACrB,KAAK,OAAO,QAAQ;AAAA,YAClB,IAAI,KAAK,MAAMsD,EAAK,UAAU,GAAG,GAAGA,EAAK,UAAU,GAAG,CAAC;AAAA,YACvD;AAAA,YACA;AAAA,UACF,GACA,KAAK,OAAO,SAASA,EAAK,OAAO,GACjC,KAAK,MAAMA,EAAK,QAAQ,EAAE,SAASA,EAAK;AACxC;AAAA,QACF,KAAK;AACH,eAAK,QAAQ;AAAA;AAAA,QAEf,KAAK;AACH,eAAK,qBAAqBrD;AAAA;AAAA,QAE5B,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAaH,cAZA,KAAK,cAAa,GACd,KAAK,SAAS,WAChB,KAAK,oBAAoB,IACzB,KAAK,uBAAuB,OAE5B,KAAK,oBAAoB,IACzB,KAAK,uBAAuB,KAE9B,KAAK,eAAe,IACL,OAAO,KAAK4D,CAAO,EAAE;AAAA,YAClC,CAAChJ,MAAQgJ,EAAQhJ,CAAG,EAAE,UAAU,GAAG,KAAK,KAAK;AAAA,UAC/C,EACa,WAAW,GAAG;AACzB,iBAAK,iBAAgB;AACrB,gBAAI1B,IAAOmK,EAAK,UAAU,IAAIA,EAAK,UAAU;AAC7C,iBAAK,OAAO,QAAQ;AAAA,cAClB,IAAI,KAAK,MAAMnK,IAAO,GAAG,GAAGA,IAAO,GAAG,CAAC;AAAA,cACvC,GAAG,KAAK,KAAK;AAAA,cACb;AAAA,YACF,GACA,KAAK,OAAO,SAASA,CAAI,GAErBmK,EAAK,aACP,KAAK,MAAMA,EAAK,QAAQ,EAAE,SAASnK;AAAA,UAEvC;AACA;AAAA,MAGJ;AAAA,IACF;AAAA,IACA,kBAAkB;AAChB,UAAIoG,IAAQ;AACZ,eAAS+D,KAAQ,KAAK,gBAAgB;AACpC,QAAA/D,KAAS;AAET,YAAInG,IAAQ;AACZ,gBAAQkK,EAAK,MAAI;AAAA,UACf,KAAK;AACH,iBAAK,MAAMA,EAAK,QAAQ,IAAI,EAAE,SAASA,EAAK,MAAM,QAAQ,EAAA,GAC1D,KAAK,YAAYA,EAAK,QAAQ,IAAIA,EAAK,aACnC,KAAK,oBAAoBA,EAAK,YAChC,KAAK,mBAAmBA,EAAK,QAAQ;AAEvC;AAAA,UACF,KAAK;AAMH,iBAAK,YAAYA,CAAI;AACrB;AAAA,UACF,KAAK;AAGH,uBAAWnK,KAAQmK,EAAK,KAAK,MAAM;AAAA,CAAI;AACrC,cAAInK,MACE,KAAK,sBACP,KAAK,SAAS,QAAQ,EAAE,SAASA,GAAM,IAEvC,KAAK,SAAS,KAAK,EAAE,SAASA,GAAM;AAI1C,mBAAO,KAAK,SAAS,SAAS,KAAK;AACjC,mBAAK,SAAS,IAAG;AAEnB;AAAA,UACF,KAAK;AACH,iBAAK,aAAamK,CAAI;AACtB;AAAA,UACF,KAAK;AACH,iBAAK,QAAQ,OAAOA,EAAK,QACzB,KAAK,QAAQ,OAAO;AACpB;AAAA,UACF,KAAK;AAEH,YAAK,KAAK,UACR,KAAK,iBAAgB,GACrB,KAAK,eAAc;AAErB;AAAA,UACF,KAAK;AACH,iBAAK,YAAY;AACjB;AAAA,UACF,KAAK;AACH,gBAAIxG,IAAQ,IACRgH,IAAa,CAAA;AACjB,iBAAK,UAAU,KAAK,SAAS;AAC3B,kBACE,OAAO,UAAUR,EAAK,eACtB,OAAO,UAAUA,EAAK,aACtB;AACA,gBAAAQ,IAAa,QACbhH,IAAQ;AACR;AAAA,cACF;AACA,cAAA1D,KAAS;AAAA,YACX;AACA,YAAA0K,EAAW,SAASR,EAAK,aACzBQ,EAAW,SAASR,EAAK,aACzBQ,EAAW,aAAaR,EAAK,YACzBA,EAAK,IACPQ,EAAW,OAAOR,EAAK,IAEvBQ,EAAW,OAAO,GAEhBR,EAAK,IACPQ,EAAW,MAAMR,EAAK,IAEtBQ,EAAW,MAAM,GAEnBA,EAAW,QAAQ,KAAK,iBACnBhH,IAIH,KAAK,QAAQ1D,CAAK,IAAI0K,KAHtBA,EAAW,KAAK,KAAK,aACrB,KAAK,QAAQ,KAAK,QAAQ,MAAM,IAAIA;AAItC;AAAA,UACF,KAAK;AACH,iBAAK,UAAU,KAAK,SAAS;AAC3B,kBACE,OAAO,UAAUR,EAAK,eACtB,OAAO,UAAUA,EAAK,aACtB;AACA,qBAAK,QAAQ,OAAOlK,GAAO,CAAC;AAC5B;AAAA,cACF;AACA,cAAAA,KAAS;AAAA,YACX;AACA;AAAA,UACF,KAAK;AACH,iBAAK,UAAU,CAAA;AACf;AAAA,UACF,KAAK;AAEH,kBAAMlI,IAAO,SAAS,cAAc,GAAG;AACvC,YAAAA,EAAK,OAAO,OAAO,SAAS,SAASoS,EAAK,KAC1CpS,EAAK,aAAa,YAAYoS,EAAK,QAAQ,GAC3CpS,EAAK,MAAK;AACV;AAAA,QAKJ;AAAA,MACF;AAGA,WAAK,eAAe,OAAO,GAAGqO,CAAK;AAAA,IACrC;AAAA,IACA,SAAS+D,GAAM;AACb,WAAK,MAAM,WAAU,GACrB,KAAK,eAAe,KAAKA,CAAI;AAAA,IAC/B;AAAA,IACA,qBAAqBhQ,GAAO;AAC1B,WAAK,OAAO,OAAO,IACnBvD,EAAI,KAAK,8BAA8B,KAAK,QAAQ,WAAW;AAAA,QAC7D,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO;AAAA,UACpB,QAAQuD;AAAA,UACR,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK,OAAO;AAAA;OAEzB;AAAA,IACH;AAAA,IACA,aAAagQ,GAAM;AACjB,UAAIA,EAAK,iBAAiB;AACxB,aAAK,iBAAiB,IACtB,KAAK,OAAO,OAAO,IACnB,KAAK,IAAI,OAAO;AAChB;AAAA,MACF;AASA,cARA,KAAK,iBAAiBA,EAAK,WAC3B,KAAK,OAAO,SAASA,EAAK,QAC1B,KAAK,OAAO,SAAS,cACrB,KAAK,OAAO,QAAQ,UACpB,KAAK,OAAO,WAAW,IACvB,KAAK,OAAO,UAAU,IACtB,KAAK,OAAO,UAAU,CAAA,GACtB,KAAK,OAAO,WAAW,MACfA,EAAK,QAAM;AAAA,QACjB,KAAK;AAAA,QACL,KAAK;AAEH,eAAK,IAAI,UAAU,MACnB,KAAK,IAAI,iBAAiB,IAC1B,KAAK,IAAI,WAAW,IACpB,KAAK,IAAI,WAAWA,EAAK,KAAK,CAAC,GAE3BA,EAAK,KAAK,CAAC,KAAKA,EAAK,KAAK,CAAC,MAAM,MAAQA,EAAK,KAAK,CAAC,MAAM,KAC5D,KAAK,IAAI,UAAUA,EAAK,KAAK,CAAC,EAAE,SAAQ,IAC/BA,EAAK,KAAK,CAAC,MAAM,OAE1B,KAAK,IAAI,iBAAiB,KAGxBA,EAAK,KAAK,CAAC,MAAM,OACnB,KAAK,IAAI,WAAW,KAEtB,KAAK,IAAI,WAAW,CAAChQ,MAAU;AAC7B,iBAAK,IAAI,OAAO,IACZ,KAAK,IAAI,WACXvD,EAAI,KAAK,8BAA8B,KAAK,QAAQ,WAAW;AAAA,cAC7D,MAAM;AAAA,gBACJ,QAAQuT,EAAK;AAAA,gBACb,UAAUhQ;AAAA;AAAA,gBACV,WAAW,KAAK;AAAA;aAEnB,IAEDvD,EAAI,KAAK,8BAA8B,KAAK,QAAQ,WAAW;AAAA,cAC7D,MAAM;AAAA,gBACJ,QAAQuT,EAAK;AAAA,gBACb,QAAQhQ;AAAA,gBACR,WAAW,KAAK;AAAA;aAEnB;AAAA,UAEL,GACA,KAAK,IAAI,OAAO;AAChB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,QAAQ,qBACpB,KAAK,OAAO,UAAU,oBAAoBgQ,EAAK,KAAK,CAAC,CAAC,IAAIA,EAAK,KAAK,CAAC,CAAC,mBAClEA,EAAK,KAAK,CAAC,MACb,KAAK,OAAO,WAAWA,EAAK,KAAK,CAAC,IAAI,MAExC,KAAK,OAAO,WAAW,SACvB,KAAK,OAAO,UAAU,CAAC,EAAE,MAAM,QAAQ,OAAO,OAAK,CAAG,GACtD,KAAK,OAAO,WAAW,KAAK,sBAC5B,KAAK,OAAO,OAAO;AACnB;AAAA,QACF,KAAK;AACH,eAAK,kBAAkBA,EAAK,KAAK,CAAC,GAClC,KAAK,oBAAoBA,EAAK,KAAK,CAAC,GACpC,KAAK,kBAAkBA,EAAK,KAAK,CAAC,GAClC,KAAK,qBAAqB;AAC1B;AAAA,QACF,KAAK;AACH,UAAIA,EAAK,UAAUA,EAAK,OAAO,gBAC7B,KAAK,OAAO,WAAWA,EAAK,OAAO,cAEjCA,EAAK,UAAUA,EAAK,OAAO,YAC7B,KAAK,OAAO,UAAUA,EAAK,OAAO,UAEpC,KAAK,OAAO,UAAUA,EAAK,KAAK,CAAC,GACjC,KAAK,OAAO,UAAU,CAAC,EAAE,MAAM,MAAM,OAAO,MAAM,GAClD,KAAK,OAAO,WAAW,KAAK,sBAC5B,KAAK,OAAO,OAAO;AACnB;AAAA,QACF,KAAK;AACH,UAAIA,EAAK,UAAUA,EAAK,OAAO,gBAC7B,KAAK,OAAO,WAAWA,EAAK,OAAO,cAEjCA,EAAK,UAAUA,EAAK,OAAO,YAC7B,KAAK,OAAO,UAAUA,EAAK,OAAO,UAEhCA,EAAK,UAAUA,EAAK,OAAO,aAC7B,KAAK,OAAO,WAAW,KAEzB,KAAK,OAAO,UAAUA,EAAK,KAAK,CAAC,GACjCA,EAAK,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAClN,MAAM;AAChC,iBAAK,OAAO,QAAQ,KAAK,EAAE,OAAOA,GAAG,OAAOA,GAAG;AAAA,UACjD,CAAC,GACD,KAAK,OAAO,SAAS,SACrB,KAAK,OAAO,WAAW,KAAK,sBAC5B,KAAK,OAAO,OAAO;AACnB;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,UAAIkN,EAAK,UAAUA,EAAK,OAAO,gBAC7B,KAAK,OAAO,WAAWA,EAAK,OAAO,cAEjCA,EAAK,UAAUA,EAAK,OAAO,YAC7B,KAAK,OAAO,UAAUA,EAAK,OAAO,UAEpC,KAAK,OAAO,UAAUA,EAAK,KAAK,CAAC,GACjCA,EAAK,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAClN,MAAM;AAChC,iBAAK,OAAO,QAAQ,KAAK,EAAE,MAAMA,GAAG,OAAOA,GAAG;AAAA,UAChD,CAAC,GACGkN,EAAK,OAAO,SAAS,UAAU,MACjC,KAAK,OAAO,SAAS,aAEvB,KAAK,OAAO,WAAW,KAAK,sBAC5B,KAAK,OAAO,OAAO;AACnB;AAAA,QACF,KAAK;AACH,eAAK,YAAY,QAAQ,cACzB,KAAK,YAAY,OAAOA,EAAK,MAC7B,KAAK,YAAY,OAAO,IACxB,KAAK,YAAY,QAAQ;AACzB;AAAA,QACF,KAAK;AACH,eAAK,cAAc,WAAW,CAAChQ,MAAU;AACvC,iBAAK,cAAc,OAAO,IAC1BvD,EAAI,KAAK,8BAA8B,KAAK,QAAQ,WAAW;AAAA,cAC7D,MAAM;AAAA,gBACJ,QAAQuT,EAAK;AAAA,gBACb,QAAQhQ;AAAA,gBACR,WAAW,KAAK;AAAA;aAEnB;AAAA,UACH,GACA,KAAK,aAAY;AACjB;AAAA;AAAA,QAEF,KAAK;AAAA,QACL,KAAK;AACH,eAAK,KAAK,QAAQgQ,EAAK,KAAK,CAAC,GAC7B,KAAK,KAAK,UAAUA,EAAK,KAAK,CAAC,GAC3BA,EAAK,UAAUA,EAAK,OAAO,WAC7B,KAAK,KAAK,SAASA,EAAK,OAAO,SAE7BA,EAAK,UAAU,wBACjB,KAAK,KAAK,WAAW,KAEvB,KAAK,KAAK,OAAO;AACjB;AAAA,MAMJ;AAAA,IACF;AAAA,IACA,MAAM,mBAAmBS,GAAO;AAG9B,UAAIC,IAAY,UAEZC,IAAW,CAAA;AACf,MAAIF,KAAS,aACXC,IAAY,CAAA,GACZD,EAAM,QAAQ,CAACG,MAAS;AACtB,QAAAF,EAAU,KAAKE,EAAK,IAAI,GACxBD,EAAS;AAAA,UACPlU,EAAI;AAAA,YACF,8BAA8B;AAAA,cAC5B,GAAG,OAAO,WAAW,QAAQmU,EAAK,IAAI;AAAA,YACxC,CAAC;AAAA,UACH,EAAE,KAAK,CAACtU,MAAa;AAGnB,YAAAqU,EAAS;AAAA,cACPE,GAAM;AAAA,gBACJ,GAAGvU,EAAS;AAAA,gBACZ,MAAMsU;AAAA,cACR,CAAC;AAAA,YACH;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC,IAGH,QAAQ,IAAID,CAAQ,EAAE,KAAK,CAACG,MAAc;AACxCrU,QAAAA,EAAI,KAAK,8BAA8B,KAAK,QAAQ,WAAW;AAAA,UAC7D,MAAM;AAAA,YACJ,QAAQ,KAAK,KAAK,WACd,sBACA;AAAA,YACJ,QAAQiU;AAAA,YACR,WAAW,KAAK;AAAA;QAEpB,CAAC,EAAE,KAAK,CAACpU,MAAa;AACpB,eAAK,KAAK,OAAO;AAAA,QACnB,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,SAASuK,GAAO;AACd,WAAK,YAAY,SACjB,KAAK,YAAY,UAAUA,CAAK,IAChC,KAAK,YAAY;AAAA,IACnB;AAAA;AAAA,IAEA,UAAU;AACR,WAAK,WAAU,GACf,KAAK,WAAW0F,GAChB,KAAK,kBAAkB,MACvB,KAAK,eAAe,MACpB,KAAK,QAAQ,CAAA,GACb,KAAK,OAAO,QAAQ,SAAS,EAAE,GAC/B,KAAK,cAAc,IACnB,KAAK,eAAe,IACpB,KAAK,cAAc,IACnB,KAAK,oBAAoB,IACzB,KAAK,cAAc,IACd,KAAK,WACR,KAAK,QACF,QAAQ;AAAA,QACP,MAAM;AAAA,OACP,EAEA,MAAM,CAAClM,MAAQ;AAAA,MAAC,CAAC,GACpB,SAAS,QAAQ,kBAEnB,KAAK,SAAQ;AAAA,IACf;AAAA,IACA,MAAM,mBAAmB;AACvB,WAAK,QAAO,GACZ,KAAK,OAAO,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAwClC,GACK,MAAM,KAAK,SAAS,MAAM;AAAA,IAC5B;AAAA,IACA,MAAM,qBAAqB;AACzB,WAAK,QAAO,GACZ,KAAK,OAAO,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAsClC,GACK,MAAM,KAAK,SAAS,MAAM;AAAA,IAC5B;AAAA,IACA,YAAYiO,GAAU;AAEpB,UAAIxI,IAAQ,KAAK,OAAO,UAAU,CAAC7D,MAAMA,EAAE,UAAUqM,CAAQ;AAC7D,MAAIxI,MAAU,MACZ,KAAK,OAAO,OAAOA,GAAO,CAAC,GAG7B,KAAK,OAAO,QAAQ;AAAA,QAClB,OAAOwI;AAAA,QACP,MAAMyC,GAASzC,CAAQ;AAAA,QACvB,SAAS,OAAOzH,MAAU;AACxB,eAAK,WAAWA,EAAM,OACtB,MAAM,KAAK,WAAU;AAAA,QACvB;AAAA,OACD,GACG,KAAK,OAAO,SAAS,KACvB,KAAK,OAAO,IAAG,GAGZ,KAAK,WACR,aAAa,wBAA2B,KAAK,UAAU,KAAK,MAAM;AAAA,IAEtE;AAAA,IACA,iBAAiByH,GAAU;AACzB,WAAK,SAAS,KAAK,OAAO,OAAO,CAAC0C,MAAUA,EAAM,UAAU1C,CAAQ,GAC/D,KAAK,WACR,aAAa,wBAA2B,KAAK,UAAU,KAAK,MAAM,GAC9D,aAAa,4BAA+BA,KAC9C,aAAa,WAAW,yBAAyB;AAAA,IAGvD;AAAA,IACA,WAAW;AACT,WAAK,WAAW;AAAA,IAClB;AAAA,IACA,MAAM,WAAW2C,IAAY,IAAM;AAGjC,WAAK,cAAc,IACnB,KAAK,oBAAoB,IACzB,MAAMxU,EAAI,IAAI,uBAAuB,KAAK,QAAQ,IAAI;AAAA,QACpD,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,iBAAiB;AAAA;OAEpB,EACE,KAAK,CAACH,MAAa;AAClB,cAAMsU,IAAO;AAAA,UACX,MAAM,KAAK;AAAA,UACX,UAAUtU,EAAS,KAAK;AAAA,QAC1B;AACA,QAAIA,EAAS,KAAK,WAChBsU,EAAK,SAAY,KAAK,MAAMtU,EAAS,KAAK,MAAM,IAE9CA,EAAS,KAAK,UAChBsU,EAAK,QAAWtU,EAAS,KAAK,QAE5BA,EAAS,KAAK,YAChBsU,EAAK,UAAatU,EAAS,KAAK;AAElC,cAAM4U,IAAS5U,EAAS,KAAK,QACvB6U,IAAc7U,EAAS,KAAK;AAClC,aAAK,QAAQ,EAAE,MAAAsU,GAAM,QAAAM,GAAQ,aAAAC,EAAU,GAAK,EAAI,GAChD,KAAK,cAAc;AAAA,MACrB,CAAC,EACA,MAAM,CAAC5U,MAAU;AAChB,QAAI0U,MAAc,MAChB,KAAK,QAAQ,QAAQ;AAAA,UACnB,OAAO;AAAA,UACP,MAAM,kBAAkB,KAAK,QAAQ,WAAW1U,CAAK;AAAA,SACtD,GAEH,KAAK,iBAAiB,KAAK,QAAQ,GACnC,KAAK,QAAO;AAAA,MACd,CAAC;AAAA,IACL;AAAA;AAAA,IAEA,QAAQ,EAAE,MAAAqU,GAAM,QAAAM,GAAQ,aAAAC,EAAU,GAAKC,IAAQ,IAAO;AACpD,WAAK,QAAQ,CAAA;AAEb,UAAIC,IAAcT,EAAK,KAAK,MAAM,GAAG,EAAE,CAAC;AASxC,UARIQ,MAAU,MAER,KAAK,aAAaC,MACpB,KAAK,WAAU,GACf,KAAK,WAAWH,IAGpB,KAAK,WAAWG,GACZ,CAAC,KAAK,QAAQ;AAEhB,aAAK,QACF,QAAQ;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM,KAAK;AAAA;SAEd,EAEA,MAAM,CAAChR,MAAQ;AAAA,QAAC,CAAC;AAMpB,YAAIiR,IAAQ,KAAK,SAAS,MAAM,GAAG;AACnC,iBAAS,QAAQ,GAAGA,EAAM,IAAG,CAAE,KAAKA,EAAM,KAAK,GAAG,CAAC;AAAA,MACrD;AAEA,MAAI,KAAK,SAAS,MAAM,GAAG,EAAE,IAAG,MAAO,OACrC,KAAK,OAAO,QAAQ,QAAQ,KAAK,UAAU,IAE3C,KAAK,OAAO,QAAQ,QAAQ,KAAK,QAAQ,GAE3C,KAAK,kBAAkB,MACvB,KAAK,OAAO,QAAQ,SAASV,EAAK,QAAQ,GAC1C,KAAK,YAAY,KAAK,QAAQ,IAAIO,GAClC,KAAK,mBAAmB,KAAK,QAAQ,GACrC,KAAK,eAAe,IACpB,KAAK,cAAc,IACnB,KAAK,YAAY,KAAK,QAAQ,GAE1BP,EAAK,UACP,KAAK,cAAc,IACnB,KAAK,WAAWA,EAAK,QACrB,KAAK,oBAAoB,OAEzB,KAAK,cAAc,IACnB,KAAK,oBAAoB,KAEvBA,EAAK,UACP,KAAK,aAAaA,EAAK,OACvB,KAAK,iBAAiB,KAGxB,KAAK,sBAAsBA,EAAK,WAAW,IAC3C,KAAK,SAAQ;AAAA,IACf;AAAA,IACA,YAAY;AACV,WAAK,SAAS,KAAK,OAAO;AAAA,QACxB,CAACI,MAAU,CAACA,EAAM,MAAM,SAAS,UAAU;AAAA,MAC7C,GACK,KAAK,WACR,aAAa,wBAA2B,KAAK,UAAU,KAAK,MAAM;AAAA,IAEtE;AAAA,IACA,iBAAiB;AACf,UAAIO,IAAa,IAAI,OAAO,2BAA2B,GACnDC,IAAe,IAAI,OAAO,qBAAqB,GAC/CC,IAAa,IAAI,OAAO,eAAe,GACvCC,IAAe,IAAI;AAAA,QACrB;AAAA,MACF,GACIC,IAAe,IAAI,OAAO,OAAO,GAEjCC,IADO,KAAK,OAAO,SAAQ,EACd,MAAM;AAAA,CAAI;AAC3B,eAAS/L,KAAQ+L,GAAO;AACtB,YAAI/L,EAAK,MAAM0L,CAAU;AACvB,iBAAO;AAET,YAAI1L,EAAK,MAAM2L,CAAY;AACzB,iBAAO;AAET,YAAI3L,EAAK,MAAM4L,CAAU;AACvB,iBAAO;AAKT,YAHI5L,EAAK,MAAM6L,CAAY,KAGvB7L,EAAK,MAAM8L,CAAY;AACzB,iBAAO;AAAA,MAEX;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA,IAGA,MAAM,SAASpU,IAAO,QAAQ;AAC5B,UAAI,MAAK;AAGT,YAAI,KAAK,aAAa;AACpB,gBAAM4T,IAAc,KAAK,kBAAiB;AAC1C,cAAI,KAAK,aAAa5E;AACpB,gBAAIhP,MAAS,QAAQ;AAEnB,mBAAK,OAAM;AACX;AAAA,YACF,WAEM,KAAK,iBAAiB,MAAM;AAC9B,kBAAIsU,IAAW,KAAK,eAAc;AAClC,kBACEA,MAAa,UACZtU,MAAS,UAAUsU,KAAY;AAEhC,qBAAK,eACHvF,KACA,MACA5O,GAAO,KAAK,IAAG,GAAI,yBAAyB,IAC5C;AAAA,uBACOmU,MAAa;AACtB,qBAAK,eACHvF,KACA,MACA5O,GAAO,KAAK,IAAG,GAAI,yBAAyB,IAC5C;AAAA;AAGF;AAEF,mBAAK,WAAW,KAAK,cACrB,KAAK,YAAY,KAAK,QAAQ;AAAA,YAChC;AAAA;AAGJ,eAAK,WAAW,IAChB,MAAMjB,EAAI,KAAK,uBAAuB,KAAK,QAAQ,IAAI;AAAA,YACrD,MAAM;AAAA,cACJ,MAAM,KAAK,OAAO,SAAQ;AAAA;AAAA,cAC1B,aAAA0U;AAAA;WAEH,EACE,KAAK,CAAC7U,MAAa;AAClB,YAAIA,EAAS,UAAU,OACjBA,EAAS,KAAK,UAChB,KAAK,oBAAoB,IACzB,KAAK,cAAc,IACnB,KAAK,WAAW,KAAK,MAAMA,EAAS,KAAK,MAAM,MAE/C,KAAK,oBAAoB,IACzB,KAAK,cAAc,IACnB,KAAK,WAAW,CAAA,IAEdA,EAAS,KAAK,UAChB,KAAK,aAAaA,EAAS,KAAK,OAChC,KAAK,iBAAiB,KAExB,KAAK,eAAe,IACpB,WAAW,MAAM;AACf,mBAAK,WAAW;AAAA,YAClB,GAAG,GAAI,MAEP,KAAK,WAAW,IAChB,KAAK,YAAY,SACjB,KAAK,YAAY,4BAA4BA,EAAS,MAAM,UAAUA,EAAS,UAAU,IACzF,KAAK,YAAY,KAEnB,KAAK,SAAQ,GACb,KAAK,SAAQ;AAAA,UACf,CAAC,EACA,MAAM,CAAC,EAAE,UAAAA,QAAe;AACvB,iBAAK,WAAW,IAGZA,EAAS,UAAU,OACrB,KAAK,YAAY,SACjB,KAAK,YAAYA,EAAS,KAAK,WAE/B,KAAK,YAAY,SACjB,KAAK,YAAY,4BAA4BA,EAAS,MAAM,UAAUA,EAAS,UAAU,KAE3F,KAAK,YAAY;AAAA,UACnB,CAAC;AAAA,QACL;AACE,eAAK,SAAS,uCAAuC;AAAA,IAEzD;AAAA,IACA,SAAS;AACP,WAAK,aAAa;AAAA,IACpB;AAAA,IACA,MAAM,eAAegS,GAAU;AAC7B,WAAK,WAAWA,EAAS,MAAM,GAAG,EAAE,CAAC,GACrC,KAAK,kBAAkB,MACnB,KAAK,iBACP7R,EAAI,KAAK,uBAAuB,KAAK,YAAY,SAAS,GAC1D,KAAK,eAAe,OAEtB,MAAM,KAAK,SAAS,MAAM;AAAA,IAC5B;AAAA,IACA,SAAS;AACP,UAAI6R,IAAW,KAAK;AACpB,MAAI,KAAK,iBACPA,IAAW,KAAK,eAElB,KAAK,QACF,QAAQ,4BAA4BA,CAAQ,IAAI;AAAA,QAC/C,QAAQ;AAAA,QACR,YAAY;AAAA,OACb,EACA,KAAK,CAAChR,MACEb,EAAI,KAAK,uBAAuB6R,CAAQ,WAAW;AAAA,QACxD,MAAM,CAAA;AAAA,OACP,CACF,EACA,KAAK,CAAChS,MAAa;AAClB,aAAK,iBAAiBgS,CAAQ,GAC9B,KAAK,QAAO;AAAA,MACd,CAAC,EACA,MAAM,CAAC/R,MAAU;AAChB,YAAIA,MAAU,IAAM;AAClB,gBAAMuV,IAAc;AAAA,YAClB,MAAM,wBAAwBvV,CAAK;AAAA,YACnC,MAAM;AAAA,UACR;AACA,eAAK,MAAM,SAASuV,CAAW;AAAA,QACjC;AAAA,MACF,CAAC;AAAA,IACL;AAAA,IACA,WAAW;AACT,YAAMnU,IAAO,IAAI,KAAK,CAAC,KAAK,OAAO,SAAQ,CAAE,GAAG;AAAA,QAC9C,MAAM;AAAA,OACP,GAEKC,IAAO,SAAS,cAAc,GAAG;AACvC,MAAAA,EAAK,OAAO,IAAI,gBAAgBD,CAAI,GACpCC,EAAK,aAAa,YAAY,KAAK,QAAQ,GAC3CA,EAAK,MAAK;AAAA,IACZ;AAAA;AAAA,IAEA,cAAc;AACZnB,MAAAA,EAAI,KAAK,uBAAuB,KAAK,QAAQ,WAAW;AAAA,QACtD,MAAM,KAAK,OAAO,SAAQ;AAAA,QAC1B,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,gBAAgB;AAAA;MAEpB,CAAC,EAAE,KAAK,CAACH,MAAa;AACpB,aAAK,YAAY,QAAQA,EAAS,KAAK,OACvC,KAAK,YAAY,OAAO,KAAK,MAAMA,EAAS,KAAK,WAAW,GAC5D,KAAK,YAAY,OAAO,IACxB,KAAK,YAAY,QAAQ;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,IACA,mBAAmB;AACjBG,MAAAA,EAAI,KAAK,uBAAuB,KAAK,QAAQ,iBAAiB;AAAA,QAC5D,MAAM,KAAK,OAAO,SAAQ;AAAA,QAC1B,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,gBAAgB;AAAA;MAEpB,CAAC,EAAE,KAAK,CAACH,MAAa;AACpB,aAAK,YAAY,QAAQA,EAAS,KAAK,OACvC,KAAK,YAAY,OAAO,KAAK,MAAMA,EAAS,KAAK,WAAW,GAC5D,KAAK,YAAY,OAAO,IACxB,KAAK,YAAY,QAAQ;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB;AACdG,MAAAA,EAAI,KAAK,8BAA8B,KAAK,QAAQ,YAAY;AAAA,IAClE;AAAA,IACA,cAAc;AACZ,WAAK,YAAY,CAAC,KAAK,WACnB,KAAK,aACP,KAAK,UAAU,MAAM;AACnB,aAAK,MAAM,MAAM,MAAK;AAAA,MACxB,CAAC;AAAA,IAEL;AAAA,IACA,mBAAmB;AACjB,WAAK,iBAAiB,CAAC,KAAK;AAAA,IAC9B;AAAA,IACA,aAAaoK,GAAO;AAClB,MAAIA,EAAM,QAAQ,YAChB,KAAK,QAAQ,IACb,KAAK,oBAAoB,KAAK,aAAa,UAClCA,EAAM,QAAQ,WACvB,KAAK,aAAa,KAAK,KAAK,KAAK,GACjC,KAAK,oBAAoB,KAAK,aAAa,QAE3CpK,EAAI,KAAK,8BAA8B,KAAK,QAAQ,UAAU;AAAA,QAC5D,MAAM;AAAA,UACJ,MAAM,KAAK;AAAA;OAEd,GACD,KAAK,QAAQ,MACJoK,EAAM,QAAQ,aACvB,KAAK,qBAAqB,GACtB,KAAK,oBAAoB,MAC3B,KAAK,oBAAoB,KAAK,aAAa,SAAS,IAEtD,KAAK,QAAQ,KAAK,aAAa,KAAK,iBAAiB,GAErDA,EAAM,eAAc,KACXA,EAAM,QAAQ,gBACvB,KAAK,qBAAqB,GACtB,KAAK,qBAAqB,KAAK,aAAa,WAC9C,KAAK,oBAAoB,IAE3B,KAAK,QAAQ,KAAK,aAAa,KAAK,iBAAiB;AAAA,IAEzD;AAAA,IACA,kBAAkB,WAAY;AAC5B,YAAMkL,IAAa,KAAK,OAAO,QAAQ,WAAU;AACjD,aAAO,KAAKA,CAAU,EACnB,OAAO,CAACxK,MAAQwK,EAAWxK,CAAG,EAAE,SAAS,UAAU,EACnD,QAAQ,CAACyK,MAAW,KAAK,OAAO,QAAQ,aAAaA,CAAM,CAAC;AAAA,IACjE;AAAA,IACA,oBAAoB,WAAY;AAC9B,WAAK,QACF;AAAA,QACC;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,YAAY;AAAA;MAEhB,EACC,KAAK,OACJ,KAAK,WAAW,MACT,KAAK,SAAQ,EACrB;AAAA,IACL;AAAA,IACA,UAAU,WAAY;AACpB,UAAI,CAAC,KAAK;AACR,eAAOvV,EAAI,KAAK,uBAAuB,KAAK,QAAQ,OAAO;AAAA,IAE/D;AAAA,IACA,YAAY,WAAY;AACtB,MACE,KAAK,aAAa8P,KAClB,CAAC,KAAK,YACN,CAAC,KAAK,gBAEN9P,EAAI,KAAK,uBAAuB,KAAK,QAAQ,SAAS;AAAA,IAE1D;AAAA,IACA,iBAAiB,iBAAkB;AAEjC,WAAK,iBAAgB,GAErB,KAAK,iBAAgB,GACrB,MAAM,KAAK,eAAc,GAEzB,KAAK,QAAO;AAAA,IACd;AAAA,IACA,SAAS2S,GAAI;AACX,aAAO,uBAAuBA;AAAA,IAChC;AAAA,IACA,YAAYA,GAAI;AACd,UAAItJ,IAAQ;AACZ,WAAK,UAAU,KAAK,SAAS;AAC3B,YAAI,OAAO,MAAMsJ,GAAI;AACnB,eAAK,QAAQ,OAAOtJ,GAAO,CAAC;AAC5B;AAAA,QACF;AACA,QAAAA,KAAS;AAAA,MACX;AAAA,IACF;AAAA;AAEJ,GA5jFSjG,KAAA,EAAA,OAAM,OAAM,gBAQRoS,KAAA,EAAA,OAAM,eAAc,GA8BpBC,KAAA,EAAA,IAAG,cAAa,GAKZ/L,KAAA,EAAA,OAAM,2BAA0B;;EA6EzB,OAAA,EAAA,OAAA,QAAA,QAAA,OAAA;AAAA,EAAkC,OAAM;;;EA+GlC,IAAG;AAAA,EAAQ,OAAM;;;;;IA3R5B9G,EAAA,2BAAjBvB,EA2TW6H,IAAA,EAAA,KAAA,EAAA,GAAA;AAAA,MA1TT5H,EAAyCoU,GAAA;AAAA,QAA/B,OAAOvT,EAAA;AAAA,QAAQ,OAAOV,EAAA;AAAA;MAChCH,EAkBaqU,GAAA;AAAA,oBAjBFlU,EAAA;AAAA,sDAAAA,EAAA,YAASC;AAAA,QAClB,UAAA;AAAA,QACC,OAAOD,EAAA;AAAA,QACP,SAAS;AAAA,QACV,OAAM;AAAA,QACL,UAAOuI,EAAA,oBAAoB;AAAA;QAIjB,SAAO1H,EAChB,CAKE,EANkB,OAAAsT,QAAK;AAAA,UACzBtU,EAKEY,GALFc,EAKE;AAAA,YAJA,SAAQ;AAAA,YACR,MAAK;AAAA,aACG4S,GAAK;AAAA,YACZ,gCAAOnU,EAAA,YAAS;AAAA;;mBAPrB,MAAsC;AAAA,UAAtCH,EAAsCqB,GAAA,MAAA;AAAA,uBAA9B,MAAK;AAAA,cAALH,EAAA,YAAQf,EAAA,SAAS,GAAA,CAAA;AAAA;;;YAAa,MACtCgB,EAAGhB,EAAA,SAAS,IAAG,KACf,CAAA;AAAA;;;MASFH,EA8BaqU,GAAA;AAAA,oBA7BFlU,EAAA;AAAA,sDAAAA,EAAA,mBAAgBC;AAAA,QACzB,UAAA;AAAA,QACA,OAAM;AAAA,QACL,UAAOsI,EAAA,oBAAoB;AAAA,QAC3B,SAAS;AAAA,QACV,OAAM;AAAA;QAIK,SAAO1H,EAChB,CAOE,EARkB,OAAAsT,QAAK;AAAA,UACzBtU,EAOEY,GAPFc,EAOE,EANA,SAAQ,OAAM,GACN4S,GAAK;AAAA,YACb,OAAM;AAAA,YACN,MAAK;AAAA,YACL,aAAU;AAAA,YACT,SAAOzT,EAAA;AAAA;UAEVb,EASEY,GATFc,EASE;AAAA,YARA,SAAQ;AAAA,YACR,MAAK;AAAA,aACG4S,GAAK;AAAA,YACZ,SAAKhU,EAAA,CAAA,MAAAA,EAAA,CAAA;AAAqC,cAAAH,EAAA,mBAAgB;AAAA;;;mBAf/D,MAAiC;AAAA,UAAjCH,EAAiCqB,GAAA,MAAA;AAAA,uBAAzB,MAAgB,CAAA,GAAAf,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gBAAhB,oBAAgB,EAAA;AAAA;;;YAAS,MACjCa,EAAGhB,EAAA,QAAQ,IAAG,yDACd,CAAA;AAAA;;;MAqBFiB,EA0BM,OA1BNU,IA0BM;AAAA,gBAzBJ/B,EAwBM6H,IAAA,MAAAC,GAvBU1H,EAAA,SAAO,CAAdoU,YADTxU,EAwBM,OAAA;AAAA,UAtBH,IAAIc,EAAA,SAAS0T,EAAI,EAAE;AAAA,UACnB,KAAKA,EAAI;AAAA;UACV,KAAI;AAAA,UACJ,OAAM;AAAA;UAENnT,EAgBM,OAhBN8S,IAgBM;AAAA,YAfJlU,EAcEwU,GAAA;AAAA,cAbC,QAAQD,EAAI;AAAA,cACZ,QAAQA,EAAI;AAAA,cACZ,YAAYA,EAAI;AAAA,cAChB,UAAUpU,EAAA;AAAA,cACV,mBAAiB;AAAA,cACjB,eAAaoU,EAAI;AAAA,cACjB,gBAAcA,EAAI;AAAA,cAClB,aAAW;AAAA,cACX,SAAO;AAAA,cACP,eAAa;AAAA,cACb,OAAOA,EAAI;AAAA,cACX,eAAY,CAAAnU,MAAES,EAAA,YAAY0T,EAAI,EAAE;AAAA,cAChC,gBAAa,CAAAnU,MAAES,EAAA,YAAY0T,EAAI,EAAE;AAAA;;;;MAK1CvU,EA8JSC,IAAA,MAAA;AAAA,mBA7JP,MA4Jc;AAAA,UA5JdD,EA4JcwC,GAAA,MAAA;AAAA,uBA3JZ,MAQE;AAAA,cAPMrC,EAAA,oBADR4B,EAQE0S,GAAA;AAAA;gBANA,OAAM;AAAA,gBACL,aAAWtU,EAAA;AAAA,gBACX,mBAAiBA,EAAA;AAAA,gBACjB,UAAUU,EAAA;AAAA,gBACV,UAAQA,EAAA;AAAA,gBACR,UAAQA,EAAA;AAAA;cAEXO,EAiJM,OAjJN+S,IAiJM;AAAA,gBAhJJnU,EA+IQU,GAAA;AAAA,kBA/ID,cAAA;AAAA,kBAAW,SAAQ;AAAA;6BACxB,MAES;AAAA,oBAFKP,EAAA,uBAAd4B,EAESV,GAAA;AAAA;sBAFqB,OAAM;AAAA,sBAAO,OAAM;AAAA;iCAAM,MAEvD,CAAA,GAAAf,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,0BAFuD,oBAEvD,EAAA;AAAA;;;oBACAc,EAyBM,OAzBNgH,IAyBM;AAAA,sBAxBJpI,EAuBYgJ,GAAA;AAAA,wBAvBA,cAAY;AAAA,wBAAK,UAAS;AAAA;wBACzB,WAAShI,EAClB,CASE,EAVoB,OAAAS,QAAK;AAAA,0BAElBtB,EAAA,iBAST4B,EAOEnB,GAPFc,EAOE,EAAA,KAAA,EAAA,GALQD,GAAK;AAAA,4BACb,MAAK;AAAA,4BACL,SAAQ;AAAA,4BACR,SAAQ;AAAA,4BACP,SAAOZ,EAAA;AAAA,8DAhBVkB,EASEnB,GATFc,EASE,EAAA,KAAA,EAAA,GAPQD,GAAK;AAAA,4BACb,MAAK;AAAA,4BACL,SAAQ;AAAA,4BACR,SAAQ;AAAA,4BACP,UAAUtB,EAAA,aAAauI,EAAA;AAAA,4BACxB,cAAW;AAAA,4BACV,SAAO7H,EAAA;AAAA;;mCAWZ,MAA2C;AAAA,0BAA9BV,EAAA,YACbwH,EAAA,GAAA5H,EAAwC,YAA3B,sBAAoB,MADjC4H,EAAA,GAAA5H,EAA2C,YAApB,eAAa;AAAA;;;;oBAIxCC,EAqBYgJ,GAAA;AAAA,sBApBV,UAAS;AAAA,sBACR,MAAM7I,EAAA;AAAA,sBACN,UAAQ,CAAGA,EAAA,kBAAkBA,EAAA,eAAe,UAAM;AAAA;sBAElC,WAASa,EACxB,CAaM,EAdsB,OAAAS,QAAK;AAAA,wBACjCL,EAaM,OAbNM,EAAaD,GAAK,EAAE,OAAA,EAAA,OAAA,QAAA,EAAoB,CAAA,GAAA;AAAA,0BACtCzB,EAWEuC,GAAA;AAAA,4BAVA,IAAG;AAAA,wCACMpC,EAAA;AAAA;qDAAAA,EAAA,iBAAcC;AAAA,8BAQFS,EAAA;AAAA;4BAPpB,OAAOA,EAAA;AAAA,4BACP,UAAUA,EAAA,SAAS,UAAM;AAAA,4BAC1B,OAAM;AAAA,4BACN,aAAU;AAAA,4BACV,SAAQ;AAAA,4BACR,SAAQ;AAAA,4BACR,gBAAA;AAAA;;;;;oBAMRb,EAUEc,GAAA;AAAA,kCATSX,EAAA;AAAA,oEAAAA,EAAA,WAAQC;AAAA,sBACjB,OAAM;AAAA,sBACN,aAAU;AAAA,sBACV,OAAM;AAAA,sBACN,OAAA,EAAA,aAAA,QAAA;AAAA,sBACA,SAAQ;AAAA,sBACR,SAAQ;AAAA,sBACR,UAAA;AAAA,sBACA,gBAAA;AAAA;oBAEFJ,EAUEc,GAAA;AAAA,kCATSD,EAAA;AAAA,oEAAAA,EAAA,aAAUT;AAAA,sBACnB,OAAM;AAAA,sBACN,aAAU;AAAA,sBACV,OAAM;AAAA,sBACN,OAAA,EAAA,aAAA,QAAA;AAAA,sBACA,SAAQ;AAAA,sBACR,SAAQ;AAAA,sBACR,UAAA;AAAA,sBACA,gBAAA;AAAA;oBAGMD,EAAA,UAAK,wBADb4B,EAME2S,GAAA;AAAA;sBAJC,MAAM;AAAA,sBACP,OAAM;AAAA,sBACN,eAAA;AAAA,sBACA,OAAM;AAAA,2BAER/M,KAAA5H,EAAiE,OAAjE4U,EAAiE;AAAA,oBAEjE3U,EAAYW,CAAA;AAAA,oBACDR,EAAA,oBAAe,gBAA1BJ,EAiCM,OAAA6U,IAAA;AAAA,sBAhCJ5U,EAsBYgJ,GAAA;AAAA,wBAtBA,cAAY;AAAA,wBAAK,UAAS;AAAA;wBACzB,WAAShI,EAClB,CAcQ,EAfc,OAAAS,QAAK;AAAA,0BAC3BzB,EAcQY,GAdRc,EACUD,GAAK;AAAA,4BACb,OAAM;AAAA,4BACN,MAAA;AAAA,4BACA,SAAQ;AAAA,4BACR,SAAQ;AAAA,4BACP,UAAUtB,EAAA;AAAA,4BACX,aAAU;AAAA,4BACV,cAAW;AAAA,4BACV,gCAAOA,EAAA,kBAAkB,OAAI,CAAIA,EAAA,kBAAkB;AAAA;uCAEpD,MAEU;AAAA,8BAFVH,EAEU6U,GAAA;AAAA,4CAFQhU,EAAA;AAAA,8EAAAA,EAAA,sBAAmBT;AAAA,gCAAE,UAAA;AAAA,gCAAS,KAAA;AAAA;2CAC9C,MAA0C;AAAA,kCAA1CJ,EAA0CqB,GAAA,EAAlC,MAAK,2BAA0B,CAAA;AAAA;;;;;;;mCAI7C,MAGO;AAAA,0BAHPD,EAGO,QAAA,MAAA;AAAA,gDAHD,wBAEJ,EAAA;AAAA,4BAAgBP,EAAA,4BAAhBd,EAA4D6H,IAAA,EAAA,KAAA,EAAA,GAAA;AAAA,gCAAvB,cAAY;AAAA;;;;;sBAGrD5H,EAQEY,GAAA;AAAA,wBAPA,OAAM;AAAA,wBACN,OAAM;AAAA,wBACN,MAAK;AAAA,wBACL,aAAU;AAAA,wBACT,UAAUT,EAAA,qBAAiB,CAAKA,EAAA;AAAA,wBAChC,QAAQA,EAAA;AAAA,wBACR,SAAOU,EAAA;AAAA;gCAGZd,EAwBM,OAAA+U,IAAA;AAAA,sBAvBJ9U,EAOEY,GAAA;AAAA,wBANA,OAAM;AAAA,wBACN,OAAM;AAAA,wBACN,MAAK;AAAA,wBACJ,UAAUT,EAAA;AAAA,wBACX,aAAU;AAAA,wBACT,SAAOU,EAAA;AAAA;sBAEVb,EAOEY,GAAA;AAAA,wBANA,OAAM;AAAA,wBACN,OAAM;AAAA,wBACL,MAAMT,EAAA;AAAA,wBACN,UAAUA,EAAA;AAAA,wBACX,aAAU;AAAA,wBACT,SAAOU,EAAA;AAAA;sBAEVb,EAMEY,GAAA;AAAA,wBALA,OAAM;AAAA,wBACN,MAAK;AAAA,wBACL,aAAU;AAAA,wBACT,UAAUT,EAAA;AAAA,wBACV,SAAOU,EAAA;AAAA;;;;;;;;;;;;MAOpBb,EA4Ea+U,IAAA;AAAA,QA5ED,YAAA;AAAA,QAAW,OAAA,EAAA,QAAA,OAAA;AAAA,QAAsB,UAAQlU,EAAA;AAAA;mBACnD,MA0CO;AAAA,UA1CPb,EA0COgV,IAAA;AAAA,YA1CD,OAAM;AAAA,YAAY,MAAK;AAAA;uBAC3B,MASa;AAAA,cATbhV,EASaqU,GAAA;AAAA,4BARFlU,EAAA;AAAA,8DAAAA,EAAA,WAAQC;AAAA,gBACjB,UAAA;AAAA,gBACA,UAAS;AAAA,gBACR,SAAS;AAAA,gBACV,OAAM;AAAA,gBACL,UAAOsI,EAAA,oBAAoB;AAAA;2BAC7B,MAED,CAAA,GAAApI,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,oBAFC,eAED,EAAA;AAAA;;;cACAc,EAIO,OAAA;AAAA,gBAHL,KAAI;AAAA,gBACJ,OAAM;AAAA,gBACL,8CAAqBP,EAAA,4BAAAA,EAAA,yBAAA,GAAAoU,CAAA,GAAwB,CAAA,SAAA,CAAA;AAAA;cAEhDjV,EAyBSwB,GAAA;AAAA,4BAzBQrB,EAAA;AAAA,gEAAAA,EAAA,uBAAoBC;AAAA,gBAAG,QAAM,CAAGD,EAAA,OAAOA,EAAA,KAAK;AAAA;2BAC3D,MAuBS;AAAA,kBAvBTH,EAuBS2B,GAAA,MAAA;AAAA,+BAtBP,MAAmE;AAAA,sBAAnE3B,EAAmE4B,GAAA;AAAA,wBAAtD,OAAM;AAAA,wBAAqB,SAAOf,EAAA;AAAA;sBAEvCV,EAAA,iBADR4B,EAIEH,GAAA;AAAA;wBAFA,OAAM;AAAA,wBACL,SAAOf,EAAA;AAAA;sBAGDV,EAAA,6BADT4B,EAIEH,GAAA;AAAA;wBAFA,OAAM;AAAA,wBACL,SAAOf,EAAA;AAAA;sBAGDV,EAAA,6BADT4B,EAIEH,GAAA;AAAA;wBAFA,OAAM;AAAA,wBACL,SAAOf,EAAA;AAAA;sBAEVb,EAAakV,EAAA;AAAA,sBACblV,EAIE4B,GAAA;AAAA,wBAHA,OAAM;AAAA,wBACN,gBAAa;AAAA,wBACZ,SAAOf,EAAA;AAAA;;;;;;;;;;UAKhBb,EA+BOgV,IAAA;AAAA,YA/BD,IAAG;AAAA,YAAW,KAAI;AAAA,YAAc,OAAM;AAAA;uBAC1C,MAwBM;AAAA,cAxBK7U,EAAA,aAAXwH,KAAA5H,EAwBM,OAxBNoV,IAwBM;AAAA,gBAvBJnV,EAsBQU,GAAA,EAtBD,cAAA,GAAU,GAAA;AAAA,6BACf,MASE;AAAA,oBATFV,EASEY,GAAA;AAAA,sBARA,OAAM;AAAA,sBACN,OAAA,EAAA,OAAA,QAAA;AAAA,sBACA,OAAM;AAAA,sBACN,MAAK;AAAA,sBACL,eAAY;AAAA,sBACX,WAAWT,EAAA;AAAA,sBACZ,aAAU;AAAA,sBACT,SAAOU,EAAA;AAAA;oBAEVb,EAUEc,GAAA;AAAA,sBATA,KAAI;AAAA,kCACKX,EAAA;AAAA,sEAAAA,EAAA,QAAKC;AAAA,sBACd,OAAM;AAAA,sBACN,SAAQ;AAAA,sBACR,SAAQ;AAAA,sBACR,gBAAA;AAAA,sBACA,OAAM;AAAA,sBACN,aAAU;AAAA,sBACT,WAASS,EAAA;AAAA;;;;;cAIhBb,EAIEoV,GAAA;AAAA,gBAHA,IAAG;AAAA,4BACMjV,EAAA;AAAA,gEAAAA,EAAA,WAAQC;AAAA,gBAChB,QAAMS,EAAA;AAAA;;;;;;;;IAMJS,EAAA,eAAXvB,EA2DM,OAAAsV,IAAA;AAAA,MA1DJrV,EAyDQU,GAAA,MAAA;AAAA,mBAxDN,MAOQ;AAAA,UAPRV,EAOQ+I,IAAA;AAAA,YAPD,OAAM;AAAA,YAAW,OAAA,EAAA,QAAA,OAAA,SAAA,MAAA;AAAA;uBACtB,MAKO;AAAA,cALP3H,EAKO,OAAA;AAAA,gBAJL,KAAI;AAAA,gBACJ,OAAM;AAAA,gBACN,OAAA,EAAA,QAAA,QAAA;AAAA,gBACC,8CAAqBP,EAAA,4BAAAA,EAAA,yBAAA,GAAAoU,CAAA,GAAwB,CAAA,SAAA,CAAA;AAAA;;;;UAGlDjV,EA+CQ+I,IAAA;AAAA,YA9CN,OAAM;AAAA,YACN,OAAA,EAAA,SAAA,QAAA,mBAAA,UAAA,eAAA,UAAA,oBAAA,0CAAA;AAAA;uBAOA,MAUM;AAAA,cAVK5I,EAAA,oBAAe,gBAA1BJ,EAUM,OAAAuV,IAAA;AAAA,gBATJtV,EAQEY,GAAA;AAAA,kBAPA,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,MAAK;AAAA,kBACL,aAAU;AAAA,kBACT,UAAUT,EAAA,qBAAiB,CAAKA,EAAA;AAAA,kBAChC,QAAQA,EAAA;AAAA,kBACR,SAAOU,EAAA;AAAA;0BAGZd,EA0BM,OAAAwV,IAAA;AAAA,gBAzBJvV,EAOEY,GAAA;AAAA,kBANA,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,MAAK;AAAA,kBACJ,UAAUT,EAAA;AAAA,kBACX,aAAU;AAAA,kBACT,SAAOU,EAAA;AAAA;gBAEVb,EAOEY,GAAA;AAAA,kBANA,OAAM;AAAA,kBACN,OAAM;AAAA,kBACL,MAAMT,EAAA;AAAA,kBACN,UAAUA,EAAA;AAAA,kBACX,aAAU;AAAA,kBACT,SAAOU,EAAA;AAAA;gBAGVb,EAOEY,GAAA;AAAA,kBANA,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,MAAK;AAAA,kBACL,aAAU;AAAA,kBACT,UAAUT,EAAA;AAAA,kBACV,SAAOU,EAAA;AAAA;;;;;;;;;IAQVV,EAAA,iBADR4B,EAQEyT,IAAA;AAAA;kBANSrV,EAAA;AAAA,sDAAAA,EAAA,WAAQC;AAAA,MACjB,MAAK;AAAA,MACL,WAAQ;AAAA,MACP,QAAIE,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAES,EAAA,QAAQT,CAAM;AAAA,MACpB,SAAKE,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAES,EAAA,SAAST,CAAM;AAAA,MACtB,aAAUE,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAES,EAAA,UAAUT,CAAM;AAAA;IAGvBD,EAAA,mBADR4B,EAUEyT,IAAA;AAAA;kBARSrV,EAAA;AAAA,sDAAAA,EAAA,aAAUC;AAAA,MACnB,MAAK;AAAA,MACL,WAAQ;AAAA,MACR,6BAAA;AAAA,MACC,kBAAgBS,EAAA;AAAA,MAChB,YAAQP,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAES,EAAA,eAAeT,CAAM;AAAA,MAC/B,SAAKE,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAES,EAAA,SAAST,CAAM;AAAA,MACtB,aAAUE,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAES,EAAA,UAAUT,CAAM;AAAA;IAELD,EAAA,wBAA1B4B,EAAuE0T,IAAA;AAAA;kBAAnBtV,EAAA;AAAA,sDAAAA,EAAA,kBAAeC;AAAA;IAE3DD,EAAA,IAAI,aADZ4B,EAQE2T,IAAA;AAAA;MANS,YAAAvV,EAAA,IAAI;AAAA,MAAJ,uBAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAAD,EAAA,IAAI,OAAIC;AAAA,MAChB,UAAUD,EAAA,IAAI;AAAA,MACd,SAASA,EAAA,IAAI;AAAA,MACb,UAAUA,EAAA,IAAI;AAAA,MACd,mBAAiBA,EAAA,IAAI;AAAA,MACrB,YAAUA,EAAA,IAAI;AAAA;IAGTA,EAAA,KAAK,aADb4B,EAQE4T,GAAA;AAAA;MANS,YAAAxV,EAAA,KAAK;AAAA,MAAL,uBAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAAD,EAAA,KAAK,OAAIC;AAAA,MACjB,OAAOD,EAAA,KAAK;AAAA,MACZ,SAASA,EAAA,KAAK;AAAA,MACd,UAAUA,EAAA,KAAK;AAAA,MACf,QAAQA,EAAA,KAAK;AAAA,MACb,YAAUU,EAAA;AAAA;IAGLV,EAAA,YAAY,aADpB4B,EAME6T,IAAA;AAAA;MAJS,YAAAzV,EAAA,YAAY;AAAA,MAAZ,uBAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAAD,EAAA,YAAY,OAAIC;AAAA,MACxB,OAAOD,EAAA,YAAY;AAAA,MACnB,MAAMA,EAAA,YAAY;AAAA,MAClB,OAAOA,EAAA,YAAY;AAAA;IAGdA,EAAA,cAAc,aADtB4B,EAOE8T,IAAA;AAAA;MALS,YAAA1V,EAAA,cAAc;AAAA,MAAd,uBAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAAD,EAAA,cAAc,OAAIC;AAAA,MAC1B,QAAQD,EAAA,cAAc;AAAA,MACtB,aAAWA,EAAA;AAAA,MACZ,gBAAA;AAAA,MACC,SAAOA,EAAA,cAAc;AAAA;IAEAA,EAAA,sBAAxB4B,EAAiE+T,IAAA;AAAA;kBAAjB3V,EAAA;AAAA,sDAAAA,EAAA,gBAAaC;AAAA;IAErDD,EAAA,OAAO,aADf4B,EAWEgU,IAAA;AAAA;MATS,YAAA5V,EAAA,OAAO;AAAA,MAAP,uBAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAAD,EAAA,OAAO,OAAIC;AAAA,MACnB,OAAOD,EAAA,OAAO;AAAA,MACd,UAAUA,EAAA,OAAO;AAAA,MACjB,SAASA,EAAA,OAAO;AAAA,MAChB,SAASA,EAAA,OAAO;AAAA,MAChB,SAASA,EAAA,OAAO;AAAA,MAChB,QAAQA,EAAA,OAAO;AAAA,MACf,UAAUA,EAAA,OAAO;AAAA,MACjB,YAAUA,EAAA,OAAO;AAAA;IAGZA,EAAA,QAAQ,aADhB4B,EAIEiU,IAAA;AAAA;MAFS,YAAA7V,EAAA,QAAQ;AAAA,MAAR,uBAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAAD,EAAA,QAAQ,OAAIC;AAAA,MACpB,MAAMD,EAAA,QAAQ;AAAA;IAGTA,EAAA,kBAAkB,aAD1B4B,EAKEkU,IAAA;AAAA;MAHS,YAAA9V,EAAA,kBAAkB;AAAA,MAAlB,uBAAAG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAF,MAAAD,EAAA,kBAAkB,OAAIC;AAAA,MAC9B,qBAAmBD,EAAA,kBAAkB;AAAA,MACrC,eAAaU,EAAA;AAAA;IAEhBb,EAKEkW,IAAA;AAAA,kBAJS/V,EAAA;AAAA,sDAAAA,EAAA,iBAAcC;AAAA,MACvB,OAAM;AAAA,MACL,MAAMD,EAAA;AAAA,MACN,OAAO;AAAA;IAEVH,EAOEmW,IAAA;AAAA,kBANShW,EAAA;AAAA,sDAAAA,EAAA,qBAAkBC;AAAA,MAC1B,MAAMD,EAAA;AAAA,MACN,cAAYA,EAAA;AAAA,MACZ,YAAUA,EAAA;AAAA,MACV,YAAY;AAAA,MACZ,UAAQU,EAAA;AAAA;IAEXb,EAaiBoW,GAAA;AAAA,kBAbQjW,EAAA;AAAA,sDAAAA,EAAA,cAAWC;AAAA;iBAClC,MAWU;AAAA,QAXVJ,EAWUqW,IAAA,EAXD,OAAM,kBAAiB,GAAA;AAAA,qBAC9B,MASE;AAAA,YARMlW,EAAA,oBADR4B,EASEuU,GAAA;AAAA;cAPC,wBAAsBnW,EAAA;AAAA,cACtB,cAAYU,EAAA;AAAA,cACZ,SAAKP,EAAA,EAAA,MAAAA,EAAA,EAAA;AAAiC,gBAAAH,EAAA,cAAW;AAAA;;;;;;;;;;;","x_google_ignoreList":[2]}
|