main 2e74e1921b6b cached
831 files
23.8 MB
6.3M tokens
1940 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (25,202K chars total). Download the full file to get everything.
Repository: sassoftware/vscode-sas-extension
Branch: main
Commit: 2e74e1921b6b
Files: 831
Total size: 23.8 MB

Directory structure:
gitextract_vm09wsh2/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   └── feature_request.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── build-vsix.yml
│       ├── deploy-doc.yml
│       ├── package.yml
│       ├── pr.yml
│       └── translations.yml
├── .gitignore
├── .nvmrc
├── .prettierignore
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   ├── settings.json
│   └── tasks.json
├── .vscodeignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── ContributorAgreement.txt
├── LICENSE
├── README.md
├── SUPPORT.md
├── client/
│   ├── package.json
│   ├── src/
│   │   ├── browser/
│   │   │   └── extension.ts
│   │   ├── commands/
│   │   │   ├── authorize.ts
│   │   │   ├── closeSession.ts
│   │   │   ├── new.ts
│   │   │   ├── profile.ts
│   │   │   ├── run.ts
│   │   │   └── toggleLineComment.ts
│   │   ├── components/
│   │   │   ├── APIProvider.ts
│   │   │   ├── AuthProvider.ts
│   │   │   ├── CAHelper.ts
│   │   │   ├── ContentNavigator/
│   │   │   │   ├── ContentAdapterFactory.ts
│   │   │   │   ├── ContentDataProvider.ts
│   │   │   │   ├── ContentModel.ts
│   │   │   │   ├── const.ts
│   │   │   │   ├── convert.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── mime-types.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── utils.ts
│   │   │   ├── ExtensionContext.ts
│   │   │   ├── LibraryNavigator/
│   │   │   │   ├── LibraryAdapterFactory.ts
│   │   │   │   ├── LibraryDataProvider.ts
│   │   │   │   ├── LibraryModel.ts
│   │   │   │   ├── PaginatedResultSet.ts
│   │   │   │   ├── const.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── ResultPanel/
│   │   │   │   ├── ResultPanel.ts
│   │   │   │   ├── ResultPanelSubscriptionProvider.ts
│   │   │   │   └── index.ts
│   │   │   ├── StatusBarItem.ts
│   │   │   ├── SubscriptionProvider.ts
│   │   │   ├── logViewer/
│   │   │   │   ├── DiagnosticCodeActionProvider.ts
│   │   │   │   ├── ProblemProcessor.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── logParser.ts
│   │   │   │   └── sasDiagnostics.ts
│   │   │   ├── notebook/
│   │   │   │   ├── Controller.ts
│   │   │   │   ├── Serializer.ts
│   │   │   │   ├── exporters/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── templates/
│   │   │   │   │   │   ├── dark.css
│   │   │   │   │   │   ├── default.html
│   │   │   │   │   │   └── light.css
│   │   │   │   │   ├── toHTML.ts
│   │   │   │   │   └── toSAS.ts
│   │   │   │   └── renderers/
│   │   │   │       ├── HTMLRenderer.ts
│   │   │   │       └── LogRenderer.ts
│   │   │   ├── profile.ts
│   │   │   ├── tasks/
│   │   │   │   ├── SasTaskProvider.ts
│   │   │   │   └── SasTasks.ts
│   │   │   └── utils/
│   │   │       ├── SASCodeDocument.ts
│   │   │       ├── SASCodeDocumentHelper.ts
│   │   │       ├── deferred.ts
│   │   │       ├── settings.ts
│   │   │       ├── throttle.ts
│   │   │       └── treeViewSelections.ts
│   │   ├── connection/
│   │   │   ├── index.ts
│   │   │   ├── itc/
│   │   │   │   ├── CodeRunner.ts
│   │   │   │   ├── ItcLibraryAdapter.ts
│   │   │   │   ├── ItcServerAdapter.ts
│   │   │   │   ├── LineParser.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── script/
│   │   │   │   │   ├── env.json
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── itc.ps1
│   │   │   │   ├── types.ts
│   │   │   │   └── util.ts
│   │   │   ├── rest/
│   │   │   │   ├── RestContentAdapter.ts
│   │   │   │   ├── RestLibraryAdapter.ts
│   │   │   │   ├── RestServerAdapter.ts
│   │   │   │   ├── api/
│   │   │   │   │   ├── common.ts
│   │   │   │   │   ├── compute.ts
│   │   │   │   │   ├── configuration.ts
│   │   │   │   │   ├── files.ts
│   │   │   │   │   └── folders.ts
│   │   │   │   ├── auth.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── context.ts
│   │   │   │   ├── identities.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── job.ts
│   │   │   │   ├── server.ts
│   │   │   │   ├── session.ts
│   │   │   │   └── util.ts
│   │   │   ├── session.ts
│   │   │   ├── ssh/
│   │   │   │   ├── auth.ts
│   │   │   │   ├── const.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── studio/
│   │   │   │   └── index.ts
│   │   │   └── util.ts
│   │   ├── node/
│   │   │   └── extension.ts
│   │   ├── panels/
│   │   │   ├── DataViewer.ts
│   │   │   ├── TablePropertiesViewer.ts
│   │   │   └── WebviewManager.ts
│   │   ├── store/
│   │   │   ├── index.ts
│   │   │   ├── log/
│   │   │   │   ├── actions.ts
│   │   │   │   ├── initialState.ts
│   │   │   │   ├── selectors.ts
│   │   │   │   └── store.ts
│   │   │   ├── middleware.ts
│   │   │   ├── run/
│   │   │   │   ├── actions.ts
│   │   │   │   ├── initialState.ts
│   │   │   │   ├── selectors.ts
│   │   │   │   └── store.ts
│   │   │   └── selectors.ts
│   │   └── webview/
│   │       ├── ColumnHeader.tsx
│   │       ├── ColumnMenu.tsx
│   │       ├── DataViewer.css
│   │       ├── DataViewer.tsx
│   │       ├── GridMenu.tsx
│   │       ├── TableFilter.tsx
│   │       ├── TablePropertiesViewer.css
│   │       ├── TablePropertiesViewer.ts
│   │       ├── index.ts
│   │       ├── localize.ts
│   │       ├── useDataViewer.ts
│   │       └── useTheme.ts
│   ├── test/
│   │   ├── components/
│   │   │   ├── ContentNavigator/
│   │   │   │   ├── ContentDataProvider.test.ts
│   │   │   │   ├── convert.test.ts
│   │   │   │   └── utils.test.ts
│   │   │   ├── LibraryNavigator/
│   │   │   │   ├── LibraryDataProvider.test.ts
│   │   │   │   └── PaginatedResultSet.test.ts
│   │   │   ├── logViewer/
│   │   │   │   ├── log.ts
│   │   │   │   └── logParser.test.ts
│   │   │   ├── notebook/
│   │   │   │   ├── exporter.test.ts
│   │   │   │   └── serializer.test.ts
│   │   │   ├── profile/
│   │   │   │   └── profile.test.ts
│   │   │   └── util/
│   │   │       ├── SASCodeDocument.test.ts
│   │   │       └── SASCodeDocumentHelper.test.ts
│   │   ├── connection/
│   │   │   ├── itc/
│   │   │   │   ├── Coderunner.test.ts
│   │   │   │   ├── ItcLibraryAdapter.test.ts
│   │   │   │   ├── index.test.ts
│   │   │   │   └── util.test.ts
│   │   │   ├── rest/
│   │   │   │   └── index.test.ts
│   │   │   ├── session.test.ts
│   │   │   └── ssh/
│   │   │       ├── auth.test.ts
│   │   │       └── index.test.ts
│   │   ├── extension.test.ts
│   │   ├── index.ts
│   │   ├── languageServer/
│   │   │   └── formatter.test.ts
│   │   ├── runTest.ts
│   │   ├── store/
│   │   │   ├── log/
│   │   │   │   └── actions.test.ts
│   │   │   └── run/
│   │   │       └── actions.test.ts
│   │   └── utils.ts
│   ├── testFixture/
│   │   ├── SampleCode.sas
│   │   ├── SampleCode2.sas
│   │   ├── TestFolder/
│   │   │   ├── SampleCode1.sas
│   │   │   └── TestSubFolder/
│   │   │       └── SampleCode2.sas
│   │   ├── formatter/
│   │   │   ├── expected.sas
│   │   │   └── unformatted.sas
│   │   ├── keyContent.txt
│   │   ├── sasnb_export.sas
│   │   ├── sasnb_export.sasnb
│   │   ├── test.ipynb
│   │   ├── test_ipynb.flw
│   │   ├── test_multi.sasnb
│   │   ├── test_multi_node.flw
│   │   ├── test_multi_swimlane.flw
│   │   ├── test_single.sasnb
│   │   ├── test_single_node.flw
│   │   └── test_single_swimlane.flw
│   └── tsconfig.json
├── doc/
│   ├── ag-grid-technical-details.md
│   ├── profileExamples/
│   │   └── viya4.json
│   └── scripts/
│       └── itc-connection-test.ps1
├── eslint.config.mjs
├── l10n/
│   ├── bundle.l10n.de.json
│   ├── bundle.l10n.es.json
│   ├── bundle.l10n.fr.json
│   ├── bundle.l10n.it.json
│   ├── bundle.l10n.ja.json
│   ├── bundle.l10n.ko.json
│   ├── bundle.l10n.pl.json
│   ├── bundle.l10n.pt-br.json
│   ├── bundle.l10n.zh-cn.json
│   └── bundle.l10n.zh-tw.json
├── language-configuration.json
├── package.json
├── package.nls.de.json
├── package.nls.es.json
├── package.nls.fr.json
├── package.nls.it.json
├── package.nls.ja.json
├── package.nls.json
├── package.nls.ko.json
├── package.nls.pl.json
├── package.nls.pt-br.json
├── package.nls.zh-cn.json
├── package.nls.zh-tw.json
├── prettier.config.js
├── pull_request_template.md
├── server/
│   ├── data/
│   │   ├── DS2ContextPrompt.json
│   │   ├── DS2Functions.json
│   │   ├── DS2Keywords.json
│   │   ├── HashPackageMethods.json
│   │   ├── MacroDefinitionOptions.json
│   │   ├── ODS_Tagsets.json
│   │   ├── Procedures/
│   │   │   ├── DATA.json
│   │   │   ├── DEFINE_EVENT.json
│   │   │   ├── DEFINE_TAGSET.json
│   │   │   ├── MACRO.json
│   │   │   ├── ODS.json
│   │   │   └── STATGRAPH.json
│   │   ├── SASARMMacros.json
│   │   ├── SASAutoVariables.json
│   │   ├── SASAutocallMacros.json
│   │   ├── SASCallRoutines.json
│   │   ├── SASColorValues.json
│   │   ├── SASContextPrompt.json
│   │   ├── SASDataSetOptions.json
│   │   ├── SASDataStepOptions.json
│   │   ├── SASDataStepOptions2.json
│   │   ├── SASDataStepStatements.json
│   │   ├── SASFormats.json
│   │   ├── SASFunctions.json
│   │   ├── SASGlobalProcedureStatements.json
│   │   ├── SASGlobalStatements.json
│   │   ├── SASInformats.json
│   │   ├── SASMacroFunctions.json
│   │   ├── SASMacroStatements.json
│   │   ├── SASProcedures.json
│   │   ├── SQLKeywords.json
│   │   ├── Statements/
│   │   │   ├── ABORT.json
│   │   │   ├── ARRAY.json
│   │   │   ├── ATTRIB.json
│   │   │   ├── AXIS.json
│   │   │   ├── CAS.json
│   │   │   ├── CASLIB.json
│   │   │   ├── ENDRSUBMIT.json
│   │   │   ├── FILE.json
│   │   │   ├── FILENAME.json
│   │   │   ├── FOOTNOTE.json
│   │   │   ├── FORMAT.json
│   │   │   ├── GOPTIONS.json
│   │   │   ├── INFILE.json
│   │   │   ├── INFORMAT.json
│   │   │   ├── KILLTASK.json
│   │   │   ├── LEGEND.json
│   │   │   ├── LIBNAME.json
│   │   │   ├── LISTTASK.json
│   │   │   ├── LOCK.json
│   │   │   ├── NOTE.json
│   │   │   ├── ODS.json
│   │   │   ├── OPTIONS.json
│   │   │   ├── PATTERN.json
│   │   │   ├── RDISPLAY.json
│   │   │   ├── RGET.json
│   │   │   ├── RSUBMIT.json
│   │   │   ├── RUN.json
│   │   │   ├── SIGNOFF.json
│   │   │   ├── SIGNON.json
│   │   │   ├── SYMBOL.json
│   │   │   ├── SYSTASK.json
│   │   │   ├── TITLE.json
│   │   │   ├── WAITFOR.json
│   │   │   └── WHERE.json
│   │   ├── StatisticsKeywords.json
│   │   ├── StyleAttributes.json
│   │   ├── StyleElements.json
│   │   ├── StyleLocations.json
│   │   └── WHERE.json
│   ├── messagebundle.properties
│   ├── messagebundle_ar.properties
│   ├── messagebundle_cs.properties
│   ├── messagebundle_da.properties
│   ├── messagebundle_de.properties
│   ├── messagebundle_el.properties
│   ├── messagebundle_es.properties
│   ├── messagebundle_fi.properties
│   ├── messagebundle_fr.properties
│   ├── messagebundle_he.properties
│   ├── messagebundle_hr.properties
│   ├── messagebundle_hu.properties
│   ├── messagebundle_it.properties
│   ├── messagebundle_iw.properties
│   ├── messagebundle_ja.properties
│   ├── messagebundle_ko.properties
│   ├── messagebundle_nb.properties
│   ├── messagebundle_nl.properties
│   ├── messagebundle_no.properties
│   ├── messagebundle_pl.properties
│   ├── messagebundle_pt.properties
│   ├── messagebundle_pt_BR.properties
│   ├── messagebundle_ru.properties
│   ├── messagebundle_sh.properties
│   ├── messagebundle_sk.properties
│   ├── messagebundle_sl.properties
│   ├── messagebundle_sr.properties
│   ├── messagebundle_sv.properties
│   ├── messagebundle_th.properties
│   ├── messagebundle_tr.properties
│   ├── messagebundle_uk.properties
│   ├── messagebundle_zh_CN.properties
│   ├── messagebundle_zh_TW.properties
│   ├── package.json
│   ├── pubsdata/
│   │   ├── Functions/
│   │   │   └── en/
│   │   │       ├── base.json
│   │   │       └── macro.json
│   │   ├── Procedures/
│   │   │   └── en/
│   │   │       ├── ACCELERATOR.json
│   │   │       ├── ACECLUS.json
│   │   │       ├── ADAPTIVEREG.json
│   │   │       ├── ANOM.json
│   │   │       ├── ANOVA.json
│   │   │       ├── APPEND.json
│   │   │       ├── ARIMA.json
│   │   │       ├── ASSESS.json
│   │   │       ├── ASSESSBIAS.json
│   │   │       ├── ASTORE.json
│   │   │       ├── AUTOREG.json
│   │   │       ├── BART.json
│   │   │       ├── BCHOICE.json
│   │   │       ├── BINNING.json
│   │   │       ├── BNET.json
│   │   │       ├── BOM.json
│   │   │       ├── BOOLRULE.json
│   │   │       ├── BOXPLOT.json
│   │   │       ├── CAEFFECT.json
│   │   │       ├── CALIS.json
│   │   │       ├── CALLRFC.json
│   │   │       ├── CANCORR.json
│   │   │       ├── CANDISC.json
│   │   │       ├── CAPABILITY.json
│   │   │       ├── CARDINALITY.json
│   │   │       ├── CAS.json
│   │   │       ├── CASUTIL.json
│   │   │       ├── CATALOG.json
│   │   │       ├── CATMOD.json
│   │   │       ├── CATTRANSFORM.json
│   │   │       ├── CAUSALDISCOVERY.json
│   │   │       ├── CAUSALGRAPH.json
│   │   │       ├── CAUSALMED.json
│   │   │       ├── CAUSALTRT.json
│   │   │       ├── CCDM.json
│   │   │       ├── CCOPULA.json
│   │   │       ├── CESM.json
│   │   │       ├── CIMPORT.json
│   │   │       ├── CLP.json
│   │   │       ├── CLUSTER.json
│   │   │       ├── CNTSELECT.json
│   │   │       ├── COMPARE.json
│   │   │       ├── COMPILE.json
│   │   │       ├── COMPUTAB.json
│   │   │       ├── CONDENSEIMAGES.json
│   │   │       ├── CONTENTS.json
│   │   │       ├── COPULA.json
│   │   │       ├── COPY.json
│   │   │       ├── CORR.json
│   │   │       ├── CORRELATION.json
│   │   │       ├── CORRESP.json
│   │   │       ├── COUNTREG.json
│   │   │       ├── CPANEL.json
│   │   │       ├── CPM.json
│   │   │       ├── CPORT.json
│   │   │       ├── CQLIM.json
│   │   │       ├── CSPADE.json
│   │   │       ├── CSPATIALREG.json
│   │   │       ├── CSSM.json
│   │   │       ├── CUSUM.json
│   │   │       ├── DATA.json
│   │   │       ├── DATAMETRICS.json
│   │   │       ├── DATASETS.json
│   │   │       ├── DATASOURCE.json
│   │   │       ├── DATEKEYS.json
│   │   │       ├── DBCSTAB.json
│   │   │       ├── DEEPPRICE.json
│   │   │       ├── DELETE.json
│   │   │       ├── DFIL.json
│   │   │       ├── DISCRIM.json
│   │   │       ├── DISPLAYIMAGES.json
│   │   │       ├── DISTANCE.json
│   │   │       ├── DLMZEXPORT.json
│   │   │       ├── DLMZSCORE.json
│   │   │       ├── DLMZTRAIN.json
│   │   │       ├── DMSRVADM.json
│   │   │       ├── DMSRVDATASVC.json
│   │   │       ├── DMSRVPROCESSSVC.json
│   │   │       ├── DOCUMENT.json
│   │   │       ├── DOWNLOAD.json
│   │   │       ├── DQLOCLST.json
│   │   │       ├── DQMATCH.json
│   │   │       ├── DQSCHEME.json
│   │   │       ├── DS2.json
│   │   │       ├── DSTODS2.json
│   │   │       ├── DTREE.json
│   │   │       ├── DYNAMICLINEAR.json
│   │   │       ├── EEL.json
│   │   │       ├── EFA.json
│   │   │       ├── ENTROPY.json
│   │   │       ├── ERCOMPSTORE.json
│   │   │       ├── ERQUERY.json
│   │   │       ├── ERUPSERT.json
│   │   │       ├── ESM.json
│   │   │       ├── EXPAND.json
│   │   │       ├── EXPORT.json
│   │   │       ├── FACTEX.json
│   │   │       ├── FACTMAC.json
│   │   │       ├── FACTOR.json
│   │   │       ├── FASTCLUS.json
│   │   │       ├── FASTKNN.json
│   │   │       ├── FCMP.json
│   │   │       ├── FEDSQL.json
│   │   │       ├── FISM.json
│   │   │       ├── FITTEDQNET.json
│   │   │       ├── FMM.json
│   │   │       ├── FMTC2ITM.json
│   │   │       ├── FONTREG.json
│   │   │       ├── FOREST.json
│   │   │       ├── FORMAT.json
│   │   │       ├── FREQ.json
│   │   │       ├── FREQTAB.json
│   │   │       ├── G3D.json
│   │   │       ├── G3GRID.json
│   │   │       ├── GA.json
│   │   │       ├── GAM.json
│   │   │       ├── GAMMOD.json
│   │   │       ├── GAMPL.json
│   │   │       ├── GAMSELECT.json
│   │   │       ├── GANNO.json
│   │   │       ├── GANTT.json
│   │   │       ├── GATEWAY.json
│   │   │       ├── GBARLINE.json
│   │   │       ├── GCHART.json
│   │   │       ├── GCONTOUR.json
│   │   │       ├── GDEVICE.json
│   │   │       ├── GEE.json
│   │   │       ├── GENMOD.json
│   │   │       ├── GENSELECT.json
│   │   │       ├── GEOCODE.json
│   │   │       ├── GFONT.json
│   │   │       ├── GINSIDE.json
│   │   │       ├── GKPI.json
│   │   │       ├── GLIMMIX.json
│   │   │       ├── GLM.json
│   │   │       ├── GLMMOD.json
│   │   │       ├── GLMPOWER.json
│   │   │       ├── GLMSELECT.json
│   │   │       ├── GMAP.json
│   │   │       ├── GMM.json
│   │   │       ├── GOPTIONS.json
│   │   │       ├── GPCLASS.json
│   │   │       ├── GPLOT.json
│   │   │       ├── GPREG.json
│   │   │       ├── GPROJECT.json
│   │   │       ├── GRADAR.json
│   │   │       ├── GRADBOOST.json
│   │   │       ├── GREDUCE.json
│   │   │       ├── GREMOVE.json
│   │   │       ├── GREPLAY.json
│   │   │       ├── GROOVY.json
│   │   │       ├── GSLIDE.json
│   │   │       ├── GTILE.json
│   │   │       ├── GVARCLUS.json
│   │   │       ├── HADOOP.json
│   │   │       ├── HMM.json
│   │   │       ├── HP4SCORE.json
│   │   │       ├── HPBIN.json
│   │   │       ├── HPCANDISC.json
│   │   │       ├── HPCDM.json
│   │   │       ├── HPCLUS.json
│   │   │       ├── HPCORR.json
│   │   │       ├── HPCOUNTREG.json
│   │   │       ├── HPDECIDE.json
│   │   │       ├── HPDMDB.json
│   │   │       ├── HPDS2.json
│   │   │       ├── HPEXPORT.json
│   │   │       ├── HPF.json
│   │   │       ├── HPFARIMASPEC.json
│   │   │       ├── HPFDIAGNOSE.json
│   │   │       ├── HPFENGINE.json
│   │   │       ├── HPFESMSPEC.json
│   │   │       ├── HPFEVENTS.json
│   │   │       ├── HPFEXMSPEC.json
│   │   │       ├── HPFIDMSPEC.json
│   │   │       ├── HPFMM.json
│   │   │       ├── HPFOREST.json
│   │   │       ├── HPFRECON.json
│   │   │       ├── HPFSELECT.json
│   │   │       ├── HPFTEMPRECON.json
│   │   │       ├── HPFUCMSPEC.json
│   │   │       ├── HPGENSELECT.json
│   │   │       ├── HPIMPUTE.json
│   │   │       ├── HPLMIXED.json
│   │   │       ├── HPLOGISTIC.json
│   │   │       ├── HPMIXED.json
│   │   │       ├── HPNEURAL.json
│   │   │       ├── HPNLMOD.json
│   │   │       ├── HPPANEL.json
│   │   │       ├── HPPLS.json
│   │   │       ├── HPPRINCOMP.json
│   │   │       ├── HPQLIM.json
│   │   │       ├── HPQUANTSELECT.json
│   │   │       ├── HPREDUCE.json
│   │   │       ├── HPREG.json
│   │   │       ├── HPSAMPLE.json
│   │   │       ├── HPSEVERITY.json
│   │   │       ├── HPSPLIT.json
│   │   │       ├── HPSUMMARY.json
│   │   │       ├── HTTP.json
│   │   │       ├── ICA.json
│   │   │       ├── ICLIFETEST.json
│   │   │       ├── ICPHREG.json
│   │   │       ├── IML.json
│   │   │       ├── IMPORT.json
│   │   │       ├── INBREED.json
│   │   │       ├── IRP.json
│   │   │       ├── IRT.json
│   │   │       ├── JAVAINFO.json
│   │   │       ├── JSON.json
│   │   │       ├── KCLUS.json
│   │   │       ├── KDE.json
│   │   │       ├── KPCA.json
│   │   │       ├── KRIGE2D.json
│   │   │       ├── LATTICE.json
│   │   │       ├── LIFEREG.json
│   │   │       ├── LIFETEST.json
│   │   │       ├── LMIXED.json
│   │   │       ├── LOAN.json
│   │   │       ├── LOCALEDATA.json
│   │   │       ├── LOESS.json
│   │   │       ├── LOGISTIC.json
│   │   │       ├── LOGSELECT.json
│   │   │       ├── LUA.json
│   │   │       ├── MACONTROL.json
│   │   │       ├── MAPIMPORT.json
│   │   │       ├── MBANALYSIS.json
│   │   │       ├── MBC.json
│   │   │       ├── MCMC.json
│   │   │       ├── MDC.json
│   │   │       ├── MDS.json
│   │   │       ├── MDSUMMARY.json
│   │   │       ├── MEANS.json
│   │   │       ├── MI.json
│   │   │       ├── MIANALYZE.json
│   │   │       ├── MIGRATE.json
│   │   │       ├── MIRP.json
│   │   │       ├── MIXED.json
│   │   │       ├── MKTATTRIBUTION.json
│   │   │       ├── MODECLUS.json
│   │   │       ├── MODEL.json
│   │   │       ├── MODELMATRIX.json
│   │   │       ├── MTLEARN.json
│   │   │       ├── MTS.json
│   │   │       ├── MTSSCORE.json
│   │   │       ├── MULTTEST.json
│   │   │       ├── MVOUTLIER.json
│   │   │       ├── MVPDIAGNOSE.json
│   │   │       ├── MVPMODEL.json
│   │   │       ├── MVPMONITOR.json
│   │   │       ├── MWPCA.json
│   │   │       ├── NESTED.json
│   │   │       ├── NETDRAW.json
│   │   │       ├── NETWORK.json
│   │   │       ├── NLIN.json
│   │   │       ├── NLMIXED.json
│   │   │       ├── NLMOD.json
│   │   │       ├── NNET.json
│   │   │       ├── NPAR1WAY.json
│   │   │       ├── ODSLIST.json
│   │   │       ├── ODSTABLE.json
│   │   │       ├── ODSTEXT.json
│   │   │       ├── OPTBINNING.json
│   │   │       ├── OPTEX.json
│   │   │       ├── OPTGRAPH.json
│   │   │       ├── OPTIONS.json
│   │   │       ├── OPTLOAD.json
│   │   │       ├── OPTLP.json
│   │   │       ├── OPTLSO.json
│   │   │       ├── OPTMILP.json
│   │   │       ├── OPTMODEL.json
│   │   │       ├── OPTNET.json
│   │   │       ├── OPTNETWORK.json
│   │   │       ├── OPTQP.json
│   │   │       ├── OPTSAVE.json
│   │   │       ├── ORTHOREG.json
│   │   │       ├── PANEL.json
│   │   │       ├── PARETO.json
│   │   │       ├── PARTITION.json
│   │   │       ├── PATHING.json
│   │   │       ├── PCA.json
│   │   │       ├── PDLREG.json
│   │   │       ├── PHREG.json
│   │   │       ├── PHSELECT.json
│   │   │       ├── PLAN.json
│   │   │       ├── PLM.json
│   │   │       ├── PLS.json
│   │   │       ├── PLSMOD.json
│   │   │       ├── PM.json
│   │   │       ├── POWER.json
│   │   │       ├── PREFIXSPAN.json
│   │   │       ├── PRINCOMP.json
│   │   │       ├── PRINQUAL.json
│   │   │       ├── PRINT.json
│   │   │       ├── PRINTTO.json
│   │   │       ├── PROBIT.json
│   │   │       ├── PROTO.json
│   │   │       ├── PRTDEF.json
│   │   │       ├── PRTEXP.json
│   │   │       ├── PSMATCH.json
│   │   │       ├── PWENCODE.json
│   │   │       ├── PYTHON.json
│   │   │       ├── QDEVICE.json
│   │   │       ├── QKB.json
│   │   │       ├── QLIM.json
│   │   │       ├── QTRSELECT.json
│   │   │       ├── QUANTLIFE.json
│   │   │       ├── QUANTREG.json
│   │   │       ├── QUANTSELECT.json
│   │   │       ├── RANK.json
│   │   │       ├── REG.json
│   │   │       ├── REGISTERMODEL.json
│   │   │       ├── REGISTRY.json
│   │   │       ├── REGSELECT.json
│   │   │       ├── RELIABILITY.json
│   │   │       ├── REPORT.json
│   │   │       ├── RISK.json
│   │   │       ├── ROBUSTREG.json
│   │   │       ├── RPCA.json
│   │   │       ├── RSREG.json
│   │   │       ├── S3.json
│   │   │       ├── SANDWICH.json
│   │   │       ├── SCAPROC.json
│   │   │       ├── SCORE.json
│   │   │       ├── SCOREACCEL.json
│   │   │       ├── SEMISUPLEARN.json
│   │   │       ├── SEQDESIGN.json
│   │   │       ├── SEQMC.json
│   │   │       ├── SEQTEST.json
│   │   │       ├── SEVERITY.json
│   │   │       ├── SEVSELECT.json
│   │   │       ├── SGMAP.json
│   │   │       ├── SGPANEL.json
│   │   │       ├── SGPIE.json
│   │   │       ├── SGPLOT.json
│   │   │       ├── SGRENDER.json
│   │   │       ├── SGSCATTER.json
│   │   │       ├── SHAPLEY.json
│   │   │       ├── SHEWHART.json
│   │   │       ├── SIM2D.json
│   │   │       ├── SIMILARITY.json
│   │   │       ├── SIMLIN.json
│   │   │       ├── SIMNORMAL.json
│   │   │       ├── SIMSYSTEM.json
│   │   │       ├── SMCALIB.json
│   │   │       ├── SMPROJECT.json
│   │   │       ├── SMSCORE.json
│   │   │       ├── SMSELECT.json
│   │   │       ├── SMSPEC.json
│   │   │       ├── SORT.json
│   │   │       ├── SPARSEML.json
│   │   │       ├── SPC.json
│   │   │       ├── SPDO.json
│   │   │       ├── SPECTRA.json
│   │   │       ├── SPP.json
│   │   │       ├── SQL.json
│   │   │       ├── SQOOP.json
│   │   │       ├── SSM.json
│   │   │       ├── STANDARD.json
│   │   │       ├── STATESPACE.json
│   │   │       ├── STDIZE.json
│   │   │       ├── STDRATE.json
│   │   │       ├── STEPDISC.json
│   │   │       ├── STREAM.json
│   │   │       ├── STYLEGAN.json
│   │   │       ├── SUMMARY.json
│   │   │       ├── SUPERLEARNER.json
│   │   │       ├── SURVEYFREQ.json
│   │   │       ├── SURVEYIMPUTE.json
│   │   │       ├── SURVEYLOGISTIC.json
│   │   │       ├── SURVEYMEANS.json
│   │   │       ├── SURVEYPHREG.json
│   │   │       ├── SURVEYREG.json
│   │   │       ├── SURVEYSELECT.json
│   │   │       ├── SVDD.json
│   │   │       ├── SVMACHINE.json
│   │   │       ├── SYSLIN.json
│   │   │       ├── TABULARGAN.json
│   │   │       ├── TABULATE.json
│   │   │       ├── TEMPLATE.json
│   │   │       ├── TEXTCATEGORY.json
│   │   │       ├── TEXTCATSCORE.json
│   │   │       ├── TEXTCONCEPT.json
│   │   │       ├── TEXTCONCEPTSCORE.json
│   │   │       ├── TEXTMINE.json
│   │   │       ├── TEXTNEARDUP.json
│   │   │       ├── TEXTPROFILE.json
│   │   │       ├── TEXTRULE.json
│   │   │       ├── TEXTSENTIMENT.json
│   │   │       ├── TEXTSENTSCORE.json
│   │   │       ├── TEXTSUMMARY.json
│   │   │       ├── TIMEID.json
│   │   │       ├── TIMESERIES.json
│   │   │       ├── TMODEL.json
│   │   │       ├── TMSCORE.json
│   │   │       ├── TPSPLINE.json
│   │   │       ├── TRANSPOSE.json
│   │   │       ├── TRANSREG.json
│   │   │       ├── TRANTAB.json
│   │   │       ├── TREE.json
│   │   │       ├── TREESPLIT.json
│   │   │       ├── TSCSREG.json
│   │   │       ├── TSCUSTINT.json
│   │   │       ├── TSGLOBALRECON.json
│   │   │       ├── TSINFO.json
│   │   │       ├── TSMODEL.json
│   │   │       ├── TSMODREPO.json
│   │   │       ├── TSNE.json
│   │   │       ├── TSRECONCILE.json
│   │   │       ├── TSSELECTLAG.json
│   │   │       ├── TTEST.json
│   │   │       ├── UCM.json
│   │   │       ├── UNIVARIATE.json
│   │   │       ├── UPLOAD.json
│   │   │       ├── VARCLUS.json
│   │   │       ├── VARCOMP.json
│   │   │       ├── VARIMPUTE.json
│   │   │       ├── VARIOGRAM.json
│   │   │       ├── VARMAX.json
│   │   │       ├── VARREDUCE.json
│   │   │       ├── X11.json
│   │   │       ├── X12.json
│   │   │       └── XSL.json
│   │   ├── Statements/
│   │   │   └── en/
│   │   │       ├── datastep.json
│   │   │       ├── global.json
│   │   │       ├── macro.json
│   │   │       └── standalone.json
│   │   └── procedures.json
│   ├── src/
│   │   ├── browser/
│   │   │   ├── ResLoader.ts
│   │   │   └── server.ts
│   │   ├── node/
│   │   │   ├── ResLoader.ts
│   │   │   └── server.ts
│   │   ├── python/
│   │   │   ├── PyrightLanguageProvider.ts
│   │   │   ├── browser/
│   │   │   │   ├── PyrightLanguageProviderBrowser.ts
│   │   │   │   ├── fakeFileSystem.ts
│   │   │   │   ├── typeShed.ts
│   │   │   │   └── typeshed-loader/
│   │   │   │       └── index.js
│   │   │   ├── node/
│   │   │   │   └── PyrightLanguageProviderNode.ts
│   │   │   ├── sas/
│   │   │   │   └── sas2py.pyi
│   │   │   └── utils.ts
│   │   ├── sas/
│   │   │   ├── CodeZoneManager.ts
│   │   │   ├── CompletionProvider.ts
│   │   │   ├── FormatOnTypeProvider.ts
│   │   │   ├── LanguageServiceProvider.ts
│   │   │   ├── Lexer.ts
│   │   │   ├── LexerEx.ts
│   │   │   ├── Model.ts
│   │   │   ├── SyntaxDataProvider.ts
│   │   │   ├── SyntaxProvider.ts
│   │   │   ├── formatter/
│   │   │   │   ├── index.ts
│   │   │   │   ├── parser.ts
│   │   │   │   └── printer.ts
│   │   │   └── utils.ts
│   │   └── server.ts
│   ├── test/
│   │   └── embedded_lang/
│   │       └── embedded_lang.test.ts
│   ├── testFixture/
│   │   └── embedded_lang/
│   │       ├── proc_lua.sas
│   │       ├── proc_python.sas
│   │       ├── proc_r.sas
│   │       └── proc_sql.sas
│   └── tsconfig.json
├── snippets/
│   └── proc-snippets.json
├── syntaxes/
│   ├── sas.tmLanguage.json
│   └── sassql.tmLanguage.json
├── themes/
│   ├── dark_plus.json
│   ├── dark_vs.json
│   ├── hc_black.json
│   ├── light_plus.json
│   ├── light_vs.json
│   ├── sas-dark-color-theme.json
│   ├── sas-highcontrast-color-theme.json
│   └── sas-light-color-theme.json
├── tools/
│   ├── build.mjs
│   ├── check-copyright.mjs
│   ├── locale.mjs
│   └── preparePubsdata.js
├── tsconfig.json
├── webpack.config.js
└── website/
    ├── .gitignore
    ├── README.md
    ├── babel.config.js
    ├── docs/
    │   ├── Configurations/
    │   │   ├── Profiles/
    │   │   │   ├── _category_.json
    │   │   │   ├── additional.md
    │   │   │   ├── index.md
    │   │   │   ├── sas9iom.md
    │   │   │   ├── sas9local.md
    │   │   │   ├── sas9ssh.md
    │   │   │   └── viya.md
    │   │   ├── _category_.json
    │   │   ├── index.md
    │   │   └── sasLog.md
    │   ├── Features/
    │   │   ├── _category_.json
    │   │   ├── accessContent.md
    │   │   ├── accessLibraries.md
    │   │   ├── accessServer.md
    │   │   ├── errorsWarnings.md
    │   │   ├── index.md
    │   │   ├── running.md
    │   │   ├── runningTask.md
    │   │   ├── sasCodeEditing.md
    │   │   └── sasNotebook.md
    │   ├── README.md
    │   ├── faq.md
    │   ├── installation.md
    │   └── matrix.md
    ├── docusaurus.config.ts
    ├── package.json
    ├── src/
    │   └── css/
    │       └── custom.css
    ├── static/
    │   └── .nojekyll
    └── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
client/src/session/rest/api/* linguist-generated=true
server/data/* linguist-generated=true
server/pubsdata/* linguist-generated=true


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Report a bug
type: Bug
body:
  - type: textarea
    attributes:
      label: Describe the bug
      placeholder: A clear and concise description of what the bug is
    validations:
      required: true
  - type: textarea
    attributes:
      label: Steps to reproduce
      description: Detailed steps for us to consistently reproduce what you're seeing
      value: |
        1.
        2.
  - type: textarea
    attributes:
      label: SAS code (if applicable)
      description: If applicable, add the minimal SAS code that will reproduce the bug
      render: SAS
  - type: textarea
    attributes:
      label: Expected behavior
      placeholder: A clear and concise description of what you expected to happen
  - type: textarea
    attributes:
      label: Screenshots
      placeholder: If applicable, add screenshots to help explain your problem
  - type: input
    attributes:
      label: Client OS
      description: Where is your VS Code running on?
      placeholder: e.g. Windows 11
  - type: input
    attributes:
      label: Extension version
      placeholder: e.g. v1.13.0
    validations:
      required: true
  - type: input
    attributes:
      label: SAS version
      placeholder: e.g. Viya 2024.09
  - type: textarea
    attributes:
      label: Additional context
      placeholder: Add any other context about the problem here
  - type: checkboxes
    attributes:
      label: Sensitive information
      description: |
        **<ins>Please do not share screenshots or settings containing sensitive information (i.e. domains, credentials, files, etc)</ins>**
      options:
        - label: I have confirmed that this bug report contains no sensitive information
          required: true


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature Request
description: Suggest an idea for this project
type: Feature
body:
  - type: textarea
    attributes:
      label: Is your feature request related to a problem? Please describe.
      placeholder: A clear and concise description of what the problem is. Ex. I'm always frustrated when ...
  - type: textarea
    attributes:
      label: Describe the solution you'd like
      placeholder: A clear and concise description of what you want to happen.
  - type: textarea
    attributes:
      label: Describe alternatives you've considered
      placeholder: A clear and concise description of any alternative solutions or features you've considered.
  - type: textarea
    attributes:
      label: Additional context
      placeholder: Add any other context or screenshots about the feature request here.
  - type: input
    attributes:
      label: SAS version
      placeholder: e.g. Viya 4
  - type: checkboxes
    attributes:
      label: Sensitive information
      description: |
        **<ins>Please do not share screenshots or settings containing sensitive information (i.e. domains, credentials, files, etc)</ins>**
      options:
        - label: I have confirmed that this feature request contains no sensitive information
          required: true


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  # Maintain dependencies for npm
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "monthly"
    groups:
      dev:
        patterns:
          - "eslint*"
          - "@types*"
          - "ts-*"
  - package-ecosystem: "npm"
    directory: "/client"
    schedule:
      interval: "monthly"
    groups:
      aggrid:
        patterns:
          - "ag-grid*"
      react:
        patterns:
          - "react*"
          - "@types/react*"
    ignore:
      # @types/vscode should match the engine version we're using
      # should not be upgraded on its own
      - dependency-name: "@types/vscode"
  - package-ecosystem: "npm"
    directory: "/server"
    schedule:
      interval: "monthly"
  - package-ecosystem: "npm"
    directory: "/website"
    schedule:
      interval: "monthly"
    groups:
      docusaurus:
        patterns:
          - "@docusaurus/*"
      react:
        patterns:
          - "react*"
  - package-ecosystem: "github-actions"
    # Don't need to specify `/.github/workflows` for `directory`. Github knows it.
    directory: "/"
    schedule:
      interval: "monthly"


================================================
FILE: .github/workflows/build-vsix.yml
================================================
name: Build VSIX for testing

on:
  workflow_dispatch:

jobs:
  package:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
        with:
          node-version-file: ".nvmrc"
          cache: "npm"
      - run: npm ci
      - run: npx @vscode/vsce package
      - uses: actions/upload-artifact@v7
        with:
          path: ./*.vsix
          retention-days: 5


================================================
FILE: .github/workflows/deploy-doc.yml
================================================
name: Deploy Doc Website to GitHub Pages

on:
  push:
    branches:
      - main

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

permissions:
  contents: write

defaults:
  run:
    shell: bash
    working-directory: ./website

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: johnnybenson/package-json-versioned-action@v1.0.9
        id: package-json
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - uses: actions/checkout@v6
        with:
          ref: v${{ steps.package-json.outputs.version }}
      - uses: actions/setup-node@v6
        with:
          node-version-file: ".nvmrc"
          cache: "npm"
      - run: npm ci

      - name: Build website
        run: npm run build

      # Popular action to deploy to GitHub Pages:
      # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus
      - name: Deploy to GitHub Pages
        uses: peaceiris/actions-gh-pages@v4
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          # Build output to publish to the `gh-pages` branch:
          publish_dir: ./website/build


================================================
FILE: .github/workflows/package.yml
================================================
name: Package and Publish VSIX

on:
  workflow_dispatch:
  push:
    branches:
      - main

jobs:
  package:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
        with:
          node-version-file: ".nvmrc"
          cache: "npm"
      - run: npm ci
      - run: npx @vscode/vsce package
      - uses: actions/upload-artifact@v7
        with:
          path: ./*.vsix
          retention-days: 5

      - uses: johnnybenson/package-json-versioned-action@v1.0.9
        id: package-json
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - run: echo "vsixPath=sas-lsp-${{ steps.package-json.outputs.version }}.vsix" >> "$GITHUB_OUTPUT"
        id: vsixPath
        if: steps.package-json.outputs.has-updated == 'true'
      - run: npx @vscode/vsce publish -i ${{ steps.vsixPath.outputs.vsixPath }}
        if: steps.package-json.outputs.has-updated == 'true'
        env:
          VSCE_PAT: ${{ secrets.VSCE_PAT }}
      - run: npx ovsx publish ${{ steps.vsixPath.outputs.vsixPath }} -p ${{ secrets.OVSX_PAT }}
        if: steps.package-json.outputs.has-updated == 'true'
      - run: |
          git tag -f v${{ steps.package-json.outputs.version }}
          git push -f origin v${{ steps.package-json.outputs.version }}
        if: steps.package-json.outputs.has-updated == 'true'


================================================
FILE: .github/workflows/pr.yml
================================================
# This workflow perform basic checks for a pull request

name: Pull Request Check

on: pull_request

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
        with:
          node-version-file: ".nvmrc"
          cache: "npm"
      - run: npm ci
      - run: npm run format:check
      - run: npm run copyright:check
      - run: xvfb-run -a npm run test
        if: runner.os == 'Linux'
      - run: npx @vscode/vsce package
      - uses: actions/upload-artifact@v7
        with:
          path: ./*.vsix
          retention-days: 5


================================================
FILE: .github/workflows/translations.yml
================================================
name: Translation Check

on:
  workflow_dispatch:
  push:
    branches:
      - main

jobs:
  check-translations:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
        with:
          node-version-file: ".nvmrc"
          cache: "npm"
      - run: npm ci
      - run: npm run locale --update-locales
      - run: |
          CHANGES=$(git diff --name-only -- "*.nls.*" "l10n/*")
          if [ -z "$CHANGES" ]
          then
            echo "No translations needed"
          else
            echo "The following files need translations:"
            echo $CHANGES
            exit 1
          fi


================================================
FILE: .gitignore
================================================
out
dist
node_modules
.vscode-test*
*.vsix
*.node
*.qps-ploc.json
l10n/bundle.l10n.json
.history

================================================
FILE: .nvmrc
================================================
lts/*

================================================
FILE: .prettierignore
================================================
# generated files
package-lock.json
out/
dist/
.vscode-test/
website/build/

# git files
.git/

# data files
server/**/*.json

# VSCode history
.history/


================================================
FILE: .vscode/extensions.json
================================================
{
  // See http://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
  // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp

  // List of extensions which should be recommended for users of this workspace.
  "recommendations": [
    // for code formatting
    "esbenp.prettier-vscode",
    // for linting
    "dbaeumer.vscode-eslint",
    // for webpack
    "amodio.tsl-problem-matcher"
  ],
  // List of extensions recommended by VS Code that should not be recommended for users of this workspace.
  "unwantedRecommendations": []
}


================================================
FILE: .vscode/launch.json
================================================
// A launch configuration that compiles the extension and then opens it inside a new window
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "extensionHost",
      "request": "launch",
      "name": "Launch Client",
      "runtimeExecutable": "${execPath}",
      "args": ["--extensionDevelopmentPath=${workspaceRoot}"],
      "outFiles": ["${workspaceRoot}/client/dist/**/*.js"],
      "preLaunchTask": {
        "type": "npm",
        "script": "watch"
      }
    },
    {
      "name": "Launch Browser",
      "type": "pwa-extensionHost",
      "debugWebWorkerHost": true,
      "request": "launch",
      "args": [
        "--extensionDevelopmentPath=${workspaceRoot}",
        "--extensionDevelopmentKind=web"
      ],
      "outFiles": ["${workspaceRoot}/client/dist/**/*.js"],
      "preLaunchTask": {
        "type": "npm",
        "script": "watch-browser"
      }
    },
    {
      "type": "node",
      "request": "attach",
      "name": "Attach to Server",
      "port": 6009,
      "restart": true,
      "outFiles": ["${workspaceRoot}/server/dist/**/*.js"]
    },
    {
      "name": "Language Server E2E Test",
      "type": "extensionHost",
      "request": "launch",
      "runtimeExecutable": "${execPath}",
      "args": [
        "--extensionDevelopmentPath=${workspaceRoot}",
        "--extensionTestsPath=${workspaceRoot}/client/out/test",
        "${workspaceRoot}/client/testFixture",
        "--disable-extensions"
      ],
      "env": { "testFile": "${relativeFile}" },
      "outFiles": ["${workspaceRoot}/client/out/test/**/*.js"],
      "preLaunchTask": {
        "type": "npm",
        "script": "pretest"
      }
    },
    {
      "name": "Server Test",
      "type": "node",
      "request": "launch",
      "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
      "args": [
        "--require",
        "ts-node/register",
        "-u",
        "bdd",
        "--timeout",
        "999999",
        "--colors",
        "${workspaceFolder}/server/test/**/*.test.ts"
      ],
      "env": {
        "TS_NODE_PROJECT": "${workspaceFolder}/server/tsconfig.json"
      },
      "cwd": "${workspaceFolder}",
      "internalConsoleOptions": "openOnSessionStart",
      "sourceMaps": true
    }
  ],
  "compounds": [
    {
      "name": "Client + Server",
      "configurations": ["Launch Client", "Attach to Server"]
    }
  ]
}


================================================
FILE: .vscode/settings.json
================================================
{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.tabSize": 2,
  "editor.insertSpaces": true,
  "editor.formatOnSave": true,
  "typescript.tsc.autoDetect": "off",
  "typescript.preferences.quoteStyle": "single"
}


================================================
FILE: .vscode/tasks.json
================================================
{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "npm",
      "script": "watch",
      "isBackground": true,
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "presentation": {
        "panel": "dedicated",
        "reveal": "never"
      },
      "problemMatcher": {
        "source": "esbuild",
        "owner": "typescript",
        "fileLocation": "relative",
        "pattern": {
          "regexp": "^(.*)$",
          "file": 1
        },
        "background": {
          "beginsPattern": {
            "regexp": "start"
          },
          "endsPattern": {
            "regexp": "end"
          }
        }
      }
    },
    {
      "type": "npm",
      "script": "compile-browser",
      "group": "build",
      "presentation": {
        "panel": "dedicated",
        "reveal": "never"
      },
      "problemMatcher": ["$ts-webpack", "$tslint-webpack"]
    },
    {
      "type": "npm",
      "script": "watch-browser",
      "isBackground": true,
      "group": "build",
      "presentation": {
        "panel": "dedicated",
        "reveal": "never"
      },
      "problemMatcher": ["$ts-webpack-watch", "$tslint-webpack-watch"]
    }
  ]
}


================================================
FILE: .vscodeignore
================================================
.vscode/**
.vscode-test/
.github/**
.git/
.gitattributes
.gitignore
.prettierignore
.nvmrc
.DS_Store
Thumbs.db
**/src/**
**/test/**
**/testFixture/**
**/out/**
**/*.ts
**/*.map
**/node_modules/**
**/website/**
tools
doc/**
prettier.config.js
**/tsconfig.json
**/webpack.config.js
contributing.md
ContributorAgreement.txt
SUPPORT.md
.travis.yml
eslint.config.mjs
pull_request_template.md
l10n/bundle.l10n.json
*.vsix
*.node

================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). If you introduce breaking changes, please group them together in the "Changed" section using the **BREAKING:** prefix.

## Unreleased

### Added

- Add R language support for PROC R (syntax highlighting, notebook cells, code formatting preservation) ([#1719](https://github.com/sassoftware/vscode-sas-extension/pull/1719))
- Add the ability to pin columns ([#1781](https://github.com/sassoftware/vscode-sas-extension/pull/1781))
- Allow running R code files in SAS Content ([#1845](https://github.com/sassoftware/vscode-sas-extension/pull/1845))

## [1.19.1] - 2026-04-01

### Fixed

- Fix issue impacting ITC users who have a "Restricted" execution policy ([#1844](https://github.com/sassoftware/vscode-sas-extension/pull/1844))

## [1.19.0] - 2026-03-26

### Added

- Add filter for data viewer ([#1757](https://github.com/sassoftware/vscode-sas-extension/pull/1757))
- Add keyboard accessibility / tooltips for table header ([#1743](https://github.com/sassoftware/vscode-sas-extension/pull/1743))
- Allow running Python code files in SAS Content ([#1815](https://github.com/sassoftware/vscode-sas-extension/pull/1815))

### Fixed

- Syntax highlighter no longer handles if/then/else ([#1718](https://github.com/sassoftware/vscode-sas-extension/issues/1718))
- Correctly render katex symbols on html export ([#1734](https://github.com/sassoftware/vscode-sas-extension/pull/1734))
- Fix misc selection issues ([#1748](https://github.com/sassoftware/vscode-sas-extension/pull/1748))
- Fix sasprogramfile macro ([#1774](https://github.com/sassoftware/vscode-sas-extension/pull/1774))

### Chore

- Update table filter docs ([#1806](https://github.com/sassoftware/vscode-sas-extension/pull/1806))
- Clarify sas options footnote ([#1816](https://github.com/sassoftware/vscode-sas-extension/pull/1816))
- Updating pubsdata to use latest SAS doc version ([#1770](https://github.com/sassoftware/vscode-sas-extension/pull/1770))
- Move itc script to ps1 file ([#1747](https://github.com/sassoftware/vscode-sas-extension/pull/1747))

## [1.18.0] - 2025-12-01

### Added

- Add the ability to sort columns in data viewer and view column properties ([#1622](https://github.com/sassoftware/vscode-sas-extension/pull/1622))
- Add code comment collapsing ([#1638](https://github.com/sassoftware/vscode-sas-extension/pull/1638))
- Add ability to view dataset properties ([#1631](https://github.com/sassoftware/vscode-sas-extension/pull/1631))

### Fixed

- Fix light/dark theme toggling ([#1701](https://github.com/sassoftware/vscode-sas-extension/pull/1701))
- Add name checking for duplicates on drag and drop ([#1665](https://github.com/sassoftware/vscode-sas-extension/pull/1665))

## [1.17.0] - 2025-09-26

### Added

- Added check for unsaved files in a folder upon deletion ([#1559](https://github.com/sassoftware/vscode-sas-extension/pull/1559))
- Added ability to save cell output ([#1576](https://github.com/sassoftware/vscode-sas-extension/pull/1576))
- Allow mapping VS Code color theme to custom ODS style ([#1619](https://github.com/sassoftware/vscode-sas-extension/pull/1619))

### Fixed

- First empty line condition for toggleLineComment ([#1583](https://github.com/sassoftware/vscode-sas-extension/issues/1583))
- Enable filter library name in SET statement ([#1608](https://github.com/sassoftware/vscode-sas-extension/issues/1608))
- Fix multiple establish connection calls ([#1621](https://github.com/sassoftware/vscode-sas-extension/issues/1621))

## [1.16.0] - 2025-07-31

### Added

- Add support for `fileNavigationCustomRootPath`/`fileNavigationRoot` for rest & iom/com connections ([#1557](https://github.com/sassoftware/vscode-sas-extension/pull/1557))
- Toggle SAS code comment by line ([#1521](https://github.com/sassoftware/vscode-sas-extension/pull/1521))
- Be able to ignore region from format ([#1534](https://github.com/sassoftware/vscode-sas-extension/pull/1534))
- Set default CSV save location to workspace root for remote workspace ([#1550](https://github.com/sassoftware/vscode-sas-extension/pull/1550))

### Fixed

- Folding does not work in certain case ([#1462](https://github.com/sassoftware/vscode-sas-extension/issues/1462))
- Library viewer optimization for ITC ([#1520](https://github.com/sassoftware/vscode-sas-extension/pull/1520))
- Remove redundant line break at end when format ([#1522](https://github.com/sassoftware/vscode-sas-extension/issues/1522))
- Failed to open a file having character '#' in its name ([#1272](https://github.com/sassoftware/vscode-sas-extension/issues/1272))
- Failed to create and open a file having character "?" in its name ([#1532](https://github.com/sassoftware/vscode-sas-extension/issues/1532))
- Cannot delete a file or folder by keyboard on SAS Explorer pane ([#789](https://github.com/sassoftware/vscode-sas-extension/issues/789))
- Auto-complete for sub-options ([#1555](https://github.com/sassoftware/vscode-sas-extension/issues/1555))
- Toggle line comment in Proc Python ([#1554](https://github.com/sassoftware/vscode-sas-extension/issues/1554))

## [1.15.0] - 2025-06-10

### Changed

- SAS Providers for OLE DB is now required for SAS 9.4 (local) and SAS 9.4 (remote – IOM) connection type.

### Added

- Add sas file system support for ITC-based (IOM/COM) connections ([#1388](https://github.com/sassoftware/vscode-sas-extension/pull/1388))
- Add Traditional Chinese and Polish translations ([#1453](https://github.com/sassoftware/vscode-sas-extension/pull/1453))

### Fixed

- Show problems at corresponding line ([#1347](https://github.com/sassoftware/vscode-sas-extension/issues/1347)) ([#1378](https://github.com/sassoftware/vscode-sas-extension/issues/1378)) ([#1475](https://github.com/sassoftware/vscode-sas-extension/issues/1475))
- Autocomplete in DATA step ([#1458](https://github.com/sassoftware/vscode-sas-extension/issues/1458))
- `Fold All Regions` in Command Palette don't work ([#1486](https://github.com/sassoftware/vscode-sas-extension/issues/1486))
- Table Viewer optimization in ITC ([#1466](https://github.com/sassoftware/vscode-sas-extension/pull/1466)) ([#1132](https://github.com/sassoftware/vscode-sas-extension/issues/1132))

## [1.14.0] - 2025-04-28

### Added

- Add application name to ITC-based (IOM/COM) connections ([#762](https://github.com/sassoftware/vscode-sas-extension/issues/762))
- Ability to export SAS Notebook to HTML file ([#1417](https://github.com/sassoftware/vscode-sas-extension/pull/1417))

### Fixed

- Reduce overhead time when running code to Viya ([#1447](https://github.com/sassoftware/vscode-sas-extension/issues/1447))

## [1.13.1] - 2025-03-04

### Fixed

- SAS log color issue ([#1325](https://github.com/sassoftware/vscode-sas-extension/issues/1325))
- Remove unexpected endsubmit autocomplete ([#1357](https://github.com/sassoftware/vscode-sas-extension/issues/1357))
- Proc Python auto-indent issue ([#1376](https://github.com/sassoftware/vscode-sas-extension/issues/1376))
- Better error display for Rest session creation errors ([#1367](https://github.com/sassoftware/vscode-sas-extension/issues/1367))
- Stop running when close session ([#1390](https://github.com/sassoftware/vscode-sas-extension/pull/1390))

## [1.13.0] - 2024-12-23

### Changed

- Required VS Code version 1.89 at minimum

### Added

- Python language features inside proc python ([#991](https://github.com/sassoftware/vscode-sas-extension/pull/991))
- Inherit VS Code file icons in SAS Content and Server ([#1310](https://github.com/sassoftware/vscode-sas-extension/pull/1310))
- Display macro name in outline pane ([#1326](https://github.com/sassoftware/vscode-sas-extension/pull/1326))

### Fixed

- Display global option help in data step ([#1282](https://github.com/sassoftware/vscode-sas-extension/issues/1282))
- Unnecessary empty line added by formatter ([#1288](https://github.com/sassoftware/vscode-sas-extension/issues/1288))
- Display context in hover help for data step statement option ([#1306](https://github.com/sassoftware/vscode-sas-extension/issues/1306))
- SAS log code action should not impact others ([#1302](https://github.com/sassoftware/vscode-sas-extension/issues/1302))
- The notebook file is opened incorrectly after renaming ([#1289](https://github.com/sassoftware/vscode-sas-extension/issues/1289))
- Resolve breaking changes by AG Grid 33 ([#1334](https://github.com/sassoftware/vscode-sas-extension/issues/1334))

## [1.12.0] - 2024-11-25

### Added

- Added username and password support for SSH connection type ([#1126](https://github.com/sassoftware/vscode-sas-extension/pull/1126))
- Added support for SAS server for viya connections ([#1203](https://github.com/sassoftware/vscode-sas-extension/pull/1203))
- Enable find in result pane ([#714](https://github.com/sassoftware/vscode-sas-extension/pull/714))

### Fixed

- Formatting should allow statements between proc python and submit ([#1226](https://github.com/sassoftware/vscode-sas-extension/issues/1226))
- SAS Log isn't shown ([#1243](https://github.com/sassoftware/vscode-sas-extension/issues/1243))
- Bracket matching in macro quote ([#1213](https://github.com/sassoftware/vscode-sas-extension/issues/1213))
- Failed to run code the second time with IOM ([#1266](https://github.com/sassoftware/vscode-sas-extension/issues/1266))
- Should not show hover help on whitespaces ([#1267](https://github.com/sassoftware/vscode-sas-extension/issues/1267))

## [1.11.0] - 2024-10-09

### Added

- Export sas notebook to sas file ([#1157](https://github.com/sassoftware/vscode-sas-extension/pull/1157))
- Clear log on execution start (with new setting `SAS.log.clearOnExecutionStart`) ([#1168](https://github.com/sassoftware/vscode-sas-extension/pull/1168))

### Fixed

- "Run sas file" tasks do not respect selected code ([#1177](https://github.com/sassoftware/vscode-sas-extension/issues/1177))
- Use builtin default System Option MEMSIZE value rather than hardcoding to 0 ([#1189](https://github.com/sassoftware/vscode-sas-extension/issues/1189))
- Log contents are not rendered properly if trying to switch profile from SSH to other connection types ([#1070](https://github.com/sassoftware/vscode-sas-extension/issues/1070))
- Try to run a SAS file having no contents will lead to console error ([#1201](https://github.com/sassoftware/vscode-sas-extension/issues/1201))
- Formatting proc FEDSQL deletes the content of the proc ([#1202](https://github.com/sassoftware/vscode-sas-extension/issues/1202))

## [1.10.2] - 2024-08-30

### Fixed

- Code lost when formatting proc python without endsubmit ([#992](https://github.com/sassoftware/vscode-sas-extension/issues/992))
- Library tree view keeps refreshing ([#1022](https://github.com/sassoftware/vscode-sas-extension/issues/1022))
- Table viewer does not display variable names ([#1114](https://github.com/sassoftware/vscode-sas-extension/issues/1114))
- Disable sort UI on table as it does nothing ([#1013](https://github.com/sassoftware/vscode-sas-extension/issues/1013))
- Inconsistency between column title on table viewer and dataset variable name ([#1117](https://github.com/sassoftware/vscode-sas-extension/issues/1117))
- Reset cell log upon cell submit in sasnb ([#1080](https://github.com/sassoftware/vscode-sas-extension/issues/1080))
- Log information are missing in certain case with Viya connection ([#963](https://github.com/sassoftware/vscode-sas-extension/issues/963))
- Get working directory error in IOM connection ([#1163](https://github.com/sassoftware/vscode-sas-extension/issues/1163))

## [1.10.1] - 2024-07-22

### Fixed

- Auto-indent improvement ([#522](https://github.com/sassoftware/vscode-sas-extension/issues/522)) ([#652](https://github.com/sassoftware/vscode-sas-extension/issues/652))
- Log output by running task ([#1058](https://github.com/sassoftware/vscode-sas-extension/issues/1058))
- Resolve the breaking change introduced by AG Grid 32.0 ([#1096](https://github.com/sassoftware/vscode-sas-extension/issues/1096))
- Library pane crash with option symbolgen ([#1012](https://github.com/sassoftware/vscode-sas-extension/issues/1012))

## [1.10.0] - 2024-06-18

### Added

- Show problems from SAS log ([#627](https://github.com/sassoftware/vscode-sas-extension/pull/627))
- New [documentation site](https://sassoftware.github.io/vscode-sas-extension/) ([#1030](https://github.com/sassoftware/vscode-sas-extension/pull/1030))

### Fixed

- Fileref OUTFILE should be allowed for COM/IOM ([#868](https://github.com/sassoftware/vscode-sas-extension/issues/868))
- Syntax help issue in special case ([#900](https://github.com/sassoftware/vscode-sas-extension/issues/900)) ([#954](https://github.com/sassoftware/vscode-sas-extension/issues/954))
- IOM connection hang when work dir is long ([#964](https://github.com/sassoftware/vscode-sas-extension/issues/964))
- Support cshell for ssh ([#1005](https://github.com/sassoftware/vscode-sas-extension/issues/1005))
- Fix content type when saving files ([#878](https://github.com/sassoftware/vscode-sas-extension/issues/878))

## [1.9.0] - 2024-04-30

### Added

- Add data viewer support for IOM/COM connections ([#680](https://github.com/sassoftware/vscode-sas-extension/issues/680))
- SQL/Python/Lua syntax highlighting ([#813](https://github.com/sassoftware/vscode-sas-extension/pull/813))

### Fixed

- Content type for file creation/upload ([#878](https://github.com/sassoftware/vscode-sas-extension/issues/878))
- ods html5 output path to work directory ([#664](https://github.com/sassoftware/vscode-sas-extension/pull/664))
- Log with Error type has no color with Viya connection ([#886](https://github.com/sassoftware/vscode-sas-extension/issues/886))
- Function autocomplete display issue ([#905](https://github.com/sassoftware/vscode-sas-extension/issues/905))
- Result panels are empty on VS Code restart ([#937](https://github.com/sassoftware/vscode-sas-extension/issues/937))
- using pretty for json output to avoid long line ([#938](https://github.com/sassoftware/vscode-sas-extension/pull/938))
- Password Character Parsing for SAS 9.4 Remote IOM Connection ([#939](https://github.com/sassoftware/vscode-sas-extension/issues/939))

## [1.8.0] - 2024-03-20

### Added

- Added SAS file entry to `New File...` menu ([#812](https://github.com/sassoftware/vscode-sas-extension/pull/812))
- SAS log colors for Local 94 and IOM ([#843](https://github.com/sassoftware/vscode-sas-extension/pull/843))
- Added better error reporting for COM/IOM connections ([#842](https://github.com/sassoftware/vscode-sas-extension/pull/842))

### Changed

- Update command palette entry `SAS: Sign in` so that it's only visible for Viya profiles. Non-viya users will still be able to connect and execute code by using the running man icon ([#862](https://github.com/sassoftware/vscode-sas-extension/pull/862))

### Fixed

- Formatting issue when lua submit block is empty ([#848](https://github.com/sassoftware/vscode-sas-extension/issues/848))
- Remote Unix machine x window issue ([#699](https://github.com/sassoftware/vscode-sas-extension/issues/699))
- PDF Download doesn't display content ([#838](https://github.com/sassoftware/vscode-sas-extension/issues/838))
- Prevent Viya connection from generating guid based html files ([#815](https://github.com/sassoftware/vscode-sas-extension/pull/815))

## [1.7.1] - 2024-02-15

### Fixed

- Fixed an issue where users were not able to add new profiles if starting with no profiles ([#826](https://github.com/sassoftware/vscode-sas-extension/pull/826))

### Added

- Add Spanish translation ([#749](https://github.com/sassoftware/vscode-sas-extension/pull/749))

## [1.7.0] - 2024-02-08

### Added

- Support formatting SAS code ([#681](https://github.com/sassoftware/vscode-sas-extension/pull/681))
- Added extra settings options to customize when SAS log is shown ([#713](https://github.com/sassoftware/vscode-sas-extension/pull/713))
- Improved function autocomplete ([#724](https://github.com/sassoftware/vscode-sas-extension/pull/724))

### Fixed

- Unexpected indentation when paste ([#735](https://github.com/sassoftware/vscode-sas-extension/issues/735))
- The "Close Session" menu is no longer available after saving any changes to the `settings.json` file ([#745](https://github.com/sassoftware/vscode-sas-extension/issues/745))
- Error message for connection error need to be externalized ([#734](https://github.com/sassoftware/vscode-sas-extension/issues/734))
- I18n node names when converting SAS Notebook to SAS Flow ([#530](https://github.com/sassoftware/vscode-sas-extension/issues/530))
- Ending inner block properly inside macro ([#772](https://github.com/sassoftware/vscode-sas-extension/issues/772))

## [1.6.0] - 2024-01-15

### Added

- Added the ability to upload and download sas content using the context menu ([#547](https://github.com/sassoftware/vscode-sas-extension/issues/547))
- Added the ability to download results as an html file ([#546](https://github.com/sassoftware/vscode-sas-extension/issues/546))
- Added sas 9.4 remote connection support via ITC and the IOM Bridge protocol ([#592](https://github.com/sassoftware/vscode-sas-extension/pull/592))
- Support recursive folding block ([#555](https://github.com/sassoftware/vscode-sas-extension/pull/555))
- Added `Close Session` button on the tooltip of the active profile status bar item ([#573](https://github.com/sassoftware/vscode-sas-extension/pull/573))
- Support function signature help ([#626](https://github.com/sassoftware/vscode-sas-extension/pull/626))
- Added `ods graphics on;` to the wrapper code ([#648](https://github.com/sassoftware/vscode-sas-extension/pull/648))
- Japanese translation ([#597](https://github.com/sassoftware/vscode-sas-extension/pull/597))
- French translation ([#634](https://github.com/sassoftware/vscode-sas-extension/pull/634))
- Italian translation ([#654](https://github.com/sassoftware/vscode-sas-extension/pull/654))

### Changed

- Required VS Code version 1.82 at minimum
- Removed the disconnect button from the editor toolbar (next to the run button), Please use the `Close Session` button on the tooltip of the active profile status bar item instead. ([#573](https://github.com/sassoftware/vscode-sas-extension/pull/573))

### Fixed

- ODS display image inline ([#471](https://github.com/sassoftware/vscode-sas-extension/issues/471))
- sasnb extension name for save ([#607](https://github.com/sassoftware/vscode-sas-extension/issues/607))
- document symbol error ([#715](https://github.com/sassoftware/vscode-sas-extension/issues/715))

## [1.5.0] - 2023-10-27

### Added

- Allow dragging sas content into editor ([#510](https://github.com/sassoftware/vscode-sas-extension/pull/510))
- Added the ability to use `Convert to flow...` for sas notebooks in the local filesystem ([#552](https://github.com/sassoftware/vscode-sas-extension/pull/552))
- Add Portuguese (Brazil) translation ([#529](https://github.com/sassoftware/vscode-sas-extension/pull/529))
- Add Korean translation ([#566](https://github.com/sassoftware/vscode-sas-extension/pull/566))
- Assign `_SASPROGRAMFILE` macro-variable to path of submitted SAS notebook code ([#551](https://github.com/sassoftware/vscode-sas-extension/pull/551))

### Fixed

- Target display issue for local profile ([#514](https://github.com/sassoftware/vscode-sas-extension/issues/514))
- Check for failed state during session log stream to prevent unbounded loop ([#562](https://github.com/sassoftware/vscode-sas-extension/issues/562))

## [1.4.1] - 2023-09-29

### Fixed

- Use sas-notebook renderer only for .sasnb files ([#538](https://github.com/sassoftware/vscode-sas-extension/pull/538))

## [1.4.0] - 2023-09-28

### Added

- Run SAS code via VS Code tasks ([#444](https://github.com/sassoftware/vscode-sas-extension/pull/444))
- Convert `.sasnb` to `.flw` ([#447](https://github.com/sassoftware/vscode-sas-extension/pull/447))
- Refined SAS code auto-indentation ([#451](https://github.com/sassoftware/vscode-sas-extension/pull/451))
- Option to control the default placement of Result panel ([#513](https://github.com/sassoftware/vscode-sas-extension/pull/513))
- Assign `_SASPROGRAMFILE` macro-variable to full path and filename of submitted SAS program ([#524](https://github.com/sassoftware/vscode-sas-extension/pull/524))

### Fixed

- Content rename issues ([#445](https://github.com/sassoftware/vscode-sas-extension/issues/445))([#504](https://github.com/sassoftware/vscode-sas-extension/issues/504))([#507](https://github.com/sassoftware/vscode-sas-extension/issues/507))([#533](https://github.com/sassoftware/vscode-sas-extension/issues/533))
- Call routine autocomplete ([#497](https://github.com/sassoftware/vscode-sas-extension/issues/497))
- Update high contrast data viewer theming ([#448](https://github.com/sassoftware/vscode-sas-extension/issues/448))

## [1.3.0] - 2023-09-12

### Added

- Option to specify ODS style (match VS Code color theme by default) ([#473](https://github.com/sassoftware/vscode-sas-extension/pull/473))
- German translation ([#466](https://github.com/sassoftware/vscode-sas-extension/pull/466))
- (Engineering) Locale script to ease translating extension into different languages. See `CONTRIBUTING.md` for more information. ([#464](https://github.com/sassoftware/vscode-sas-extension/pull/464))

### Changed

- Setting ID `SAS.session.outputHtml` changed to `SAS.results.html.enabled` ([#496](https://github.com/sassoftware/vscode-sas-extension/pull/496))

### Fixed

- Always show running man icon ([#433](https://github.com/sassoftware/vscode-sas-extension/issues/433))
- SSH connection error ([#458](https://github.com/sassoftware/vscode-sas-extension/issues/458))
- Show results even job is in error state ([#468](https://github.com/sassoftware/vscode-sas-extension/pull/468))
- Escape $ symbol for local connection ([#356](https://github.com/sassoftware/vscode-sas-extension/issues/356))
- Notebook hangs with local connection ([#472](https://github.com/sassoftware/vscode-sas-extension/issues/472))
- Previous log shown for SSH connection ([#470](https://github.com/sassoftware/vscode-sas-extension/issues/470))
- Result displaying issue for SSH connection ([#483](https://github.com/sassoftware/vscode-sas-extension/issues/483))

## [1.2.0] - 2023-08-11

### Added

- Auto-completion follows user's typing case ([#430](https://github.com/sassoftware/vscode-sas-extension/pull/430))

### Fixed

- Fixed column icons for data viewer ([#443](https://github.com/sassoftware/vscode-sas-extension/pull/443))

## [1.1.0] - 2023-08-04

### Added

- Ability to specify SAS options for session startup ([#339](https://github.com/sassoftware/vscode-sas-extension/pull/339))
- Autoexec support for Viya connection ([#355](https://github.com/sassoftware/vscode-sas-extension/pull/355))
- Show session startup log ([#380](https://github.com/sassoftware/vscode-sas-extension/pull/380))
- Added the ability to download tables from the libraries view ([#395](https://github.com/sassoftware/vscode-sas-extension/pull/395))
- Simplified Chinese translation ([#409](https://github.com/sassoftware/vscode-sas-extension/pull/409))
- (Engineering) Added support for `npm run copyright:check --fix`. This automatically prepends files with the correct copyright information. ([#344](https://github.com/sassoftware/vscode-sas-extension/pull/344))
- (Engineering) l10n infrastructure ([#370](https://github.com/sassoftware/vscode-sas-extension/pull/370))

### Changed

- Changed Data viewer to use AG Grid instead of VSCode data grid. Our data viewer now support infinite paging for large tables, a fixed header, and type icons for columns ([#395](https://github.com/sassoftware/vscode-sas-extension/pull/395))

### Fixed

- Result not shown when having many pages ([#330](https://github.com/sassoftware/vscode-sas-extension/issues/330))
- Ability to cancel profile update ([#389](https://github.com/sassoftware/vscode-sas-extension/issues/389))
- Local COM hang in zh-cn locale ([#346](https://github.com/sassoftware/vscode-sas-extension/issues/346))
- SAS Log partially lost ([#420](https://github.com/sassoftware/vscode-sas-extension/issues/420))
- SAS Content error on Viya 2023.03 ([#328](https://github.com/sassoftware/vscode-sas-extension/issues/328))
- (Engineering) Fixed an issue with `npm run copyright:check` where some files were not being validated. ([#344](https://github.com/sassoftware/vscode-sas-extension/pull/344))

## [1.0.0] - 2023-06-16

### Added

- Support SAS 9 Local via COM ([#11](https://github.com/sassoftware/vscode-sas-extension/issues/11))
- Support SAS Notebook ([#174](https://github.com/sassoftware/vscode-sas-extension/issues/174))
- Support Add to My Favorites and Remove from My Favorites action ([#283](https://github.com/sassoftware/vscode-sas-extension/issues/283))
- Support Drag & Drop for SAS content ([#310](https://github.com/sassoftware/vscode-sas-extension/issues/310))
- Support Canceling running job ([#187](https://github.com/sassoftware/vscode-sas-extension/issues/187))

### Changed

- Changed license to official Apache License, Version 2.0 ([#341](https://github.com/sassoftware/vscode-sas-extension/pull/341))

### Fixed

- 406 error for library view on Viya 3.5 ([#300](https://github.com/sassoftware/vscode-sas-extension/issues/300))

## [0.1.5] - 2023-05-19

### Added

- Allow user to provide trusted CA certificates ([#220](https://github.com/sassoftware/vscode-sas-extension/issues/220))
- Support Run Region ([#222](https://github.com/sassoftware/vscode-sas-extension/issues/222))
- Infinite scrolling for data table ([#199](https://github.com/sassoftware/vscode-sas-extension/pull/199))
- Updated folder icons ([#214](https://github.com/sassoftware/vscode-sas-extension/issues/214))

### Fixed

- Errors for libraries view in some cases ([#250](https://github.com/sassoftware/vscode-sas-extension/issues/250)), ([#252](https://github.com/sassoftware/vscode-sas-extension/issues/252))
- Let built-in suggestions popup in some cases ([#259](https://github.com/sassoftware/vscode-sas-extension/issues/259))
- Show user acount information correctly ([#235](https://github.com/sassoftware/vscode-sas-extension/issues/235))
- Updated syntax data ([#249](https://github.com/sassoftware/vscode-sas-extension/issues/249))

## [0.1.4] - 2023-04-28

### Fixed

- Fixed an issue where trailing slashes on viya endpoints caused connection issues ([#232](https://github.com/sassoftware/vscode-sas-extension/pull/232))
- Added back the F3 (Run Selected) and F8 (Run All) keyboard shortcuts ([#230](https://github.com/sassoftware/vscode-sas-extension/issues/230), [#231](https://github.com/sassoftware/vscode-sas-extension/pull/231))
- Sort the folder children in Explorer pane alphabetically and case-insensitively, folders first ([#225](https://github.com/sassoftware/vscode-sas-extension/issues/225))
- Fixed an issue where preview mode wasn't working as expected when opening files in sas content ([#224](https://github.com/sassoftware/vscode-sas-extension/issues/224), [#243](https://github.com/sassoftware/vscode-sas-extension/pull/243))

## [0.1.3] - 2023-04-13

### Added

- Authentication status now persisted in VS Code ([#94](https://github.com/sassoftware/vscode-sas-extension/issues/94), [#110](https://github.com/sassoftware/vscode-sas-extension/pull/110))
- Added support for running SAS code on a remote 9.4 linux server using ssh and -nodms ([#61](https://github.com/sassoftware/vscode-sas-extension/issues/61), [#155](https://github.com/sassoftware/vscode-sas-extension/issues/155), [#186](https://github.com/sassoftware/vscode-sas-extension/issues/186))
- Migrate legacy profiles to use new connectionType property ([#157](https://github.com/sassoftware/vscode-sas-extension/issues/157))
- Updated error message for unsupported connection type ([#151](https://github.com/sassoftware/vscode-sas-extension/issues/151))
- Added SAS content navigator. You are now able to browse, edit, create, delete, and run files on a SAS server using a Viya connection ([#56](https://github.com/sassoftware/vscode-sas-extension/issues/56), [#162](https://github.com/sassoftware/vscode-sas-extension/pull/162), [#176](https://github.com/sassoftware/vscode-sas-extension/pull/176), [#193](https://github.com/sassoftware/vscode-sas-extension/pull/193))
- Added support for SAS libraries. You are now able to see libraries and tables from a SAS instance. You are also able to delete, view, and drag tables into your sas programs. ([#129](https://github.com/sassoftware/vscode-sas-extension/issues/129))
- Update syntax colors ([#153](https://github.com/sassoftware/vscode-sas-extension/pull/153))

## [0.1.2] - 2023-02-01

### Changed

- The `Run Selected SAS Code` command changed to `Run Selected or All SAS Code`. It will run selected code when there's a selection, and run all code when there's no selection #50, #51
- The running man icon changed to `Run Selected or All SAS Code` #50, #51

### Added

- When there're multiple selections, the `Run Selected or All SAS Code` command will combine all the selected code and submit #50, #51
- Added default shortcuts, `F3` for `Run Selected or All SAS Code`, `F8` for `Run All SAS Code` #50, #51

### Fixed

- Fixed a problem when there is a period in the profile name #43, #44
- Fixed a problem when job running longer than 60 seconds #36, #40
- Only show Result window if result is generated #46, #77
- Run some code, error happened unexpectedly #63, #40

## [0.1.1] - 2022-11-24

### Changed

- **BREAKING:** Updated extension to require "Authorization code" grant. Your client ID needs to be registered with "authorization_code" and "refresh_token" grant type now.

### Added

- Added login with SASLogon with PKCE
- Added support to refresh access token with refresh token
- Added built-in client ID for Viya4 2022.11 and later

### Removed

- Removed password and token file login approach

## [0.1.0] - 2022-10-08

### Changed

- **BREAKING:** Changed Command ID `SAS.session.run` and `SAS.session.runSelected` to `SAS.run` and `SAS.runSelected`
- **BREAKING:** Changed Settings `SAS.session.host`, `SAS.session.clientId`, etc. to `SAS.connectionProfiles`

### Added

- Added support for connection profiles

### Fixed

- Improved macro statement autocomplete
- Fixed issue where percentage sign should escape quotes in %str
- Fixed PROC SQL snippet syntax

## [0.0.7] - 2022-07-26

### Added

- Added support to run selected SAS code

## [0.0.6] - 2022-07-08

### Fixed

- Fixed extension recovery from syntax check mode on each run
- Corrected syntax highlighting for name literal

### Changed

- Changed SAS themes to provide default colors to non-SAS languages
- Changed SAS syntax to have basic type colors in non-SAS themes
- Updated README to show animated gifs

## [0.0.5] - 2022-05-26

### Fixed

- Fixed compute context not found error; user can now specify a compute context name to use

### Changed

- Rearranged settings fields
- Updated dependencies versions

## [0.0.4] - 2022-05-19

### Fixed

- Fixed error parsing/display

### Changed

- Updated README.md to link to wiki

## [0.0.3] - 2022-05-17

Initial release


================================================
FILE: CONTRIBUTING.md
================================================
# How to Contribute

We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.

## Contributor License Agreement

Contributions to this project must be accompanied by a signed
[Contributor Agreement](ContributorAgreement.txt).
You (or your employer) retain the copyright to your contribution,
this simply gives us permission to use and redistribute your contributions as
part of the project.

## Code reviews

All submissions, including submissions by project members, require review. We
use GitHub pull requests for this purpose. Consult
[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
information on using pull requests.

Please make sure your submission passed the `lint`, `format:check` and `test` tasks clean.

### Creating a pull request description

There are two parts to a pull request description: Summary and Testing.

#### Summary

Use this as a space to provide details about your new feature. Your summary should primarily focus on what has changed, and why it has changed.

#### Testing

For each pull request, you are expected to test the defaults to make sure no regressions were introduced as part of your change. When adding new features, you are expected to add new test cases that cover the new functionality.

# Development

## Structure

```
.
├── client // Language Client
│   ├── src
|   |   └── browser
│   │   |   └── extension.ts // Language Client entry point for browser
|   |   └── node
│   │       └── extension.ts // Language Client entry point for electron
├── package.json // The extension manifest.
└── server // Language Server
    └── src
        └── browser
        |   └── server.ts // Language Server entry point for browser
        └── node
            └── server.ts // Language Server entry point for electron
```

## Get started

- Download and install the current NodeJS LTS version.
- Run `npm install` in this folder. This installs all necessary npm modules in both the client and server folder.
- Open VS Code on this folder.
- Switch to the `Run and Debug` view in the VS Code Activity Bar (Ctrl+Shift+D).
- Select `Launch Client` from the drop down (if it is not already).
- Press ▷ to run the launch config (F5).
- In the [Extension Development Host] instance of VS Code, open a SAS file.
- _Optional_: If you want to debug the language server as well, also run the launch configuration `Attach to Server`.

## Adding a new locale

Follow these steps to add a new locale for the SAS Extension for VSCode:

- Follow the instructions in the [Get started](#get-started) section to setup your environment and view results.
- Run `npm run locale --new=<locale>` (the locale specified here will need to be one of https://code.visualstudio.com/docs/getstarted/locales#_available-locales).
- Translate the strings in `package.nls.<locale>.json` and `l10/bundle.l10n.<locale>.json`.
- Install the language pack for your chosen locale and change VSCode's language to the one you're testing.
- Verify your changes using `Launch Client`.
- After you've verified changes, you can create a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) for review.

## Updating a current locale

Follow these steps to update a locale for the SAS Extension for VSCode:

- Follow the instructions in the [Get started](#get-started) section to setup your environment and view results.
- Run `npm run locale --update-locale=<locale>`. This will update `package.nls.<locale>.json` and `l10/bundle.l10n.<locale>.json` with any missing translation keys.
- Update any untranslated strings.
- Verify your changes using `Launch Client`.
- After you've verified changes, you can create a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) for review.

### Locale contributors

| Language                  | VSCode Language ID | Contributor                                       |
| ------------------------- | ------------------ | ------------------------------------------------- |
| **Chinese (Simplified)**  | zh-cn              | Wei Wu, XiangYu Chen                              |
| **Chinese (Traditional)** | zh-tw              | William Huang                                     |
| **French**                | fr                 | Valerie Law, Vincent Rejany                       |
| **German**                | de                 | Susan Hergenhahn, David Weik                      |
| **Italian**               | it                 | Lorenzo Roccato, Simone Spagnoli, Patrizia Omodei |
| **Japanese**              | ja                 | Miori Oiunuma                                     |
| **Korean**                | ko                 | Meilan Ji, SoYoung Huh                            |
| **Polish**                | pl                 | Magda Posnik-Wiech                                |
| **Portuguese (Brazil)**   | pt-br              | Larissa Lima                                      |
| **Spanish**               | es                 | Elyana Mastache, Raquel Nunez                     |

## Run single test file

- Open the `.test.ts` file you want to run
- Switch to the `Run and Debug` view in the VS Code Activity Bar (Ctrl+Shift+D).
- Select `Language Server E2E Test` from the drop down.
- Press ▷ to run the launch config (F5).
- See test result in the `Debug Console` panel.

## Update documentation

The `website` directory powers the [documentation website](https://sassoftware.github.io/vscode-sas-extension/). Update the markdown files in `website/docs/` directory. It will be built to the website when pushed to the `main` branch. See its [README](./website/README.md) for details.

# Testing unpublished versions

You can still try out any commit or pull request (PR) if you don't want to manually build from source code.

## Download VSIX file

- Open below page with your browser
  - For main branch https://github.com/sassoftware/vscode-sas-extension/actions/workflows/package.yml
  - For Pull Request https://github.com/sassoftware/vscode-sas-extension/actions/workflows/pr.yml
- Select the commit/PR you want.
- Download the `artifact.zip` file from the Artifacts section.
- Unzip it to get the VSIX file.

## Install VSIX file

- Open the `Extensions` view on the VS Code Activity Bar.
- Click the `...` from the top right of the Extensions pane, and select `Install from VSIX...`, select the downloaded VSIX file.
- Restart VS Code

**Note**:

- When testing VSIX files, it's usually a good idea to turn off "Extensions: Auto Update" in your VS Code settings to prevent auto-updating to a published version.
- When switching between multiple VSIX files, it's usually a good idea to clean up the [installation directory](https://code.visualstudio.com/docs/editor/extension-marketplace#_where-are-extensions-installed) after uninstalling a previous version. Otherwise VS Code may cache it as un-published versions may look same.


================================================
FILE: ContributorAgreement.txt
================================================
Contributor Agreement

Version 1.2

To contribute to this project, you must (1) attest to your right to offer your 
contribution and (2) clearly indicate whether you used artificial intelligence 
tools to develop your contribution.

== (1) Your Right to Contribute ==

You must agree to and comply with the terms of the following agreement.
Complying with the agreement does not alter your right to use your
contributions for any other purpose.

        Developer's Certificate of Origin 1.1

        By making a contribution to this project, I certify that:

        (a) The contribution was created in whole or in part by me and I have 
            the right to submit it under the open source license indicated in 
            the file; or

        (b) The contribution is based upon previous work that, to the best of 
            my knowledge, is covered under an appropriate open source license 
            and I have the right under that license to submit that work with 
            modifications, whether created in whole or in part by me, under 
            the same open source license (unless I am permitted to submit 
            under a different license), as indicated in the file; or

        (c) The contribution was provided directly to me by some other person 
            who certified (a), (b) or (c) and I have not modified it.

        (d) I understand and agree that this project and the contribution are 
            public and that a record of the contribution (including all 
            personal information I submit with it, including my sign-off) is 
            maintained indefinitely and may be redistributed consistent with 
            this project or the open source license(s) involved.

Indicate your acceptance of the agreement by including a "sign-off" in any 
contribution you propose. The sign-off is a line of text that accompanies your 
proposed contribution, attesting that you have the right to provide it.

When proposing changes via source control systems (such as Git), you can 
comply with the agreement by adding the following line to your commit message:

	Signed-off-by: Firstname Lastname <user@domain>

For example:

	Signed-off-by: Random J. Developer <random@developer.example.org>

Please provide your real name (no pseudonyms or anonymous contributions). All 
changes accepted into the project's official source code must be accompanied 
by this sign-off.

== (2) Your Use of Generative AI Tools ==

You must note contributions generated in whole or in part by artificial
intelligence tools. In your comments or commit messages, provide any context
reviewers might need to understand the change, and explain which part(s) of
your proposed change came from the tool. Then follow the instructions below.

If you used a generative artificial intelligence tool to create your entire 
contribution, add the following additional line to your commit message:

	Generated-by: Assistant Name

For example:

	Generated-by: Claude Code

If you used a generative artificial intelligence tool to assist you in 
creating your contribution, add the following line to your commit message:

	Assisted-by: Assistant Name

For example:

	Assisted-by: GitHub Copilot


================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

================================================
FILE: README.md
================================================
# SAS Extension for Visual Studio Code

[Capabilities](https://sassoftware.github.io/vscode-sas-extension/matrix) | [Installation](https://sassoftware.github.io/vscode-sas-extension/installation) | [Configuration](https://sassoftware.github.io/vscode-sas-extension/Configurations/) | [Features](https://sassoftware.github.io/vscode-sas-extension/Features/) | [FAQ](https://sassoftware.github.io/vscode-sas-extension/faq)

Welcome to the SAS Extension for Visual Studio Code! The SAS extension is lightweight, runs anywhere, and allows you to integrate SAS with other languages. You can connect directly to SAS Viya and SAS 9 and run code.

Before you can run SAS code, you must [configure the SAS extension](https://sassoftware.github.io/vscode-sas-extension/Configurations/) to access your SAS 9.4 (remote or local) server or a SAS Viya server and [add a connection profile](https://sassoftware.github.io/vscode-sas-extension/Configurations/Profiles/).

The SAS extension includes many [features](https://sassoftware.github.io/vscode-sas-extension/Features/) to help you access your data, write and run code, and create SAS notebooks.

- SAS syntax highlighting and help, code completion, and code snippets
- Navigate SAS Content and libraries, including table viewer
- Create notebooks for SAS, SQL, Python, R, and other languages

<img src="website/static/images/featuresGlance.png"/>

## Support

### FAQs

Please check the [FAQ](https://sassoftware.github.io/vscode-sas-extension/faq) page for some common questions.

### SAS Programming Documentation

[SAS Programming documentation](https://go.documentation.sas.com/doc/en/pgmsascdc/v_048/lepg/titlepage.htm)

### SAS Communities

For usage questions, tips, and workarounds, interact with other SAS users to ask questions and get answers on the [SAS Programmers Community site](https://communities.sas.com/t5/SAS-Programming/bd-p/programming).

### SAS Technical Support

SAS Technical Support provides standard support for the current release of the [SAS Extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=SAS.sas-lsp) available through the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items), in accordance with the [Policies for All SAS Products | SAS Support](https://support.sas.com/en/technical-support/services-policies/policies-for-sas-products.html). If you have been unable to solve a problem or find answers using self‑help resources, open a case in the [Customer Service Portal](https://service.sas.com/csm) to get technical support for the SAS Extension for VS Code.

### Reporting Issues

Submit a [GitHub issue](https://github.com/sassoftware/vscode-sas-extension/issues) for tracking bugs, feature requests, or questions regarding open‑source contributions.

## Contributing to the SAS Extension

We welcome your contributions! Please read [CONTRIBUTING.md](/CONTRIBUTING.md) for details on how to submit contributions to this project.

## License

This project is subject to the Apache License Version 2.0, a copy of which is included as [LICENSE](LICENSE)


================================================
FILE: SUPPORT.md
================================================
## Support

Support is provided through multiple channels, depending on your situation:

- For usage questions, tips, and workarounds, interact with other SAS users to ask questions and get answers on the [SAS Programmers Community site](https://communities.sas.com/t5/SAS-Programming/bd-p/programming).

- SAS Technical Support provides standard support for the current release of the [SAS Extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=SAS.sas-lsp) available through the [Visual Studio Marketplace](https://marketplace.visualstudio.com), in accordance with the [Policies for All SAS Products | SAS Support](https://support.sas.com/en/technical-support/services-policies/policies-for-sas-products.html). If you have been unable to solve a problem or find answers using self‑help resources, open a case in the [Customer Service Portal](https://service.sas.com/csm) to get technical support for the SAS Extension for VS Code.

- Submit a [GitHub issue](https://github.com/sassoftware/vscode-sas-extension/issues) for tracking bugs, feature requests, or questions regarding open‑source contributions.


================================================
FILE: client/package.json
================================================
{
  "name": "sas-lsp-client",
  "description": "VS Code client for SAS language server",
  "author": "SAS Institute Inc.",
  "license": "Apache-2.0",
  "version": "0.0.1",
  "publisher": "SAS",
  "engines": {
    "vscode": "^1.89.0"
  },
  "dependencies": {
    "ag-grid-community": "^35.2.1",
    "ag-grid-react": "^35.2.1",
    "axios": "^1.15.2",
    "highlight.js": "^11.11.1",
    "katex": "^0.16.45",
    "marked": "^17.0.5",
    "marked-katex-extension": "^5.1.7",
    "media-typer": "^1.1.0",
    "react": "^19.2.5",
    "react-dom": "^19.2.5",
    "ssh2": "^1.17.0",
    "uuid": "^14.0.0",
    "vscode-languageclient": "^10.0.0-next.2",
    "zustand": "^5.0.12"
  },
  "devDependencies": {
    "@types/react": "^19.2.14",
    "@types/react-dom": "^19.2.3",
    "@types/ssh2": "^1.15.5",
    "@types/uuid": "^11.0.0",
    "@types/vscode": "1.82.0",
    "@types/vscode-notebook-renderer": "^1.72.4",
    "@vscode/test-electron": "^2.5.2"
  }
}


================================================
FILE: client/src/browser/extension.ts
================================================
// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { ExtensionContext, Uri, commands } from "vscode";
import { LanguageClientOptions } from "vscode-languageclient";
import { LanguageClient } from "vscode-languageclient/browser";

let client: LanguageClient;

// this method is called when vs code is activated
export function activate(context: ExtensionContext): void {
  commands.executeCommand("setContext", "SAS.hideRunMenuItem", true);

  // Options to control the language client
  const clientOptions: LanguageClientOptions = {
    // Register the server for sas file
    documentSelector: [{ language: "sas" }],
  };

  client = createWorkerLanguageClient(context, clientOptions);

  client.start();
}

function createWorkerLanguageClient(
  context: ExtensionContext,
  clientOptions: LanguageClientOptions,
) {
  // Create a worker. The worker main file implements the language server.
  const serverMain = Uri.joinPath(
    context.extensionUri,
    "server/dist/browser/server.js",
  );
  const worker = new Worker(serverMain.toString());

  // create the language server client to communicate with the server running in the worker
  return new LanguageClient(
    "sas-lsp",
    "SAS Language Server",
    worker,
    clientOptions,
  );
}

export function deactivate(): Thenable<void> | undefined {
  if (!client) {
    return undefined;
  }
  return client.stop();
}


================================================
FILE: client/src/commands/authorize.ts
================================================
// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { authentication, commands, window } from "vscode";

import { SASAuthProvider } from "../components/AuthProvider";
import LibraryNavigator from "../components/LibraryNavigator";
import { ConnectionType } from "../components/profile";
import { profileConfig, switchProfile } from "./profile";

const finishAuthorization = (profileConfig): boolean => {
  commands.executeCommand("setContext", "SAS.authorizing", false);
  return profileConfig.getActiveProfile() !== "";
};

export const checkProfileAndAuthorize =
  (libraryNavigator: LibraryNavigator) => async (): Promise<boolean> => {
    commands.executeCommand("setContext", "SAS.authorizing", true);
    if (profileConfig.getActiveProfile() === "") {
      await switchProfile();
    }

    if (profileConfig.getActiveProfile() === "") {
      return finishAuthorization(profileConfig);
    }

    const activeProfile = profileConfig.getProfileByName(
      profileConfig.getActiveProfile(),
    );

    switch (activeProfile.connectionType) {
      case ConnectionType.Rest:
        try {
          await authentication.getSession(SASAuthProvider.id, [], {
            createIfNone: true,
          });
        } catch (error) {
          window.showErrorMessage(error.message);
        }

        return finishAuthorization(profileConfig);
      case ConnectionType.IOM:
      case ConnectionType.COM:
        commands.executeCommand("setContext", "SAS.librariesDisplayed", true);
        commands.executeCommand("setContext", "SAS.serverDisplayed", true);
        libraryNavigator.refresh();
        return finishAuthorization(profileConfig);
      default:
        return finishAuthorization(profileConfig);
    }
  };


================================================
FILE: client/src/commands/closeSession.ts
================================================
// Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { window } from "vscode";

import { getSession } from "../connection";
import { Session } from "../connection/session";

export async function closeSession(message?: string): Promise<void> {
  let session: Session;
  try {
    session = getSession();
  } catch {
    // no session, do nothing
  }
  await session?.close();
  if (message) {
    window.showInformationMessage(message);
  }
}


================================================
FILE: client/src/commands/new.ts
================================================
// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import {
  NotebookCellData,
  NotebookCellKind,
  NotebookData,
  window,
  workspace,
} from "vscode";

export async function newSASNotebook() {
  await window.showNotebookDocument(
    await workspace.openNotebookDocument(
      "sas-notebook",
      new NotebookData([
        new NotebookCellData(NotebookCellKind.Code, "", "sas"),
      ]),
    ),
  );
}

export async function newSASFile() {
  await window.showTextDocument(
    await workspace.openTextDocument({ language: "sas" }),
  );
}


================================================
FILE: client/src/commands/profile.ts
================================================
// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { l10n, window } from "vscode";

import {
  ProfileConfig,
  ProfilePromptType,
  createInputTextBox,
} from "../components/profile";

export const profileConfig = new ProfileConfig();
/**
 * Add profile command prompts the user to create a profile by a given name
 * and then proceeds to prompt the user for profile values to be initialied.
 * When a profile is added, this profile will automatically be set as the active
 * profile and will be serialized in the configuration file.
 */
export async function addProfile(): Promise<void> {
  const profileName = await createInputTextBox(ProfilePromptType.NewProfile);
  if (profileName) {
    await profileConfig
      .prompt(profileName)
      .then(() => profileConfig.updateActiveProfileSetting(profileName));
  }
}

/**
 * Update profile command prompts the user to choose a profile to update
 * and then proceeds to prompt for the profile values to reinitialized.
 * When a profile is updated the profile will automatically be serialized
 * in the configuration file.
 */
export async function updateProfile(): Promise<void> {
  const profileList = profileConfig.listProfile();
  if (profileList.length === 0) {
    await addProfile();
    return;
  }
  const selected = await window.showQuickPick(profileList, {
    placeHolder: l10n.t("Select a SAS connection profile"),
  });
  if (selected) {
    await profileConfig.prompt(selected);
  }
}

/**
 * Switch profile command modifies the configuration file and and updates the
 * active profile and serializes the changes in the configuration file.
 */
export async function switchProfile(): Promise<void> {
  const profileList = profileConfig.listProfile();
  if (profileList.length === 0) {
    await addProfile();
    return;
  }
  const selected = await window.showQuickPick(profileList, {
    placeHolder: l10n.t("Select a SAS connection profile"),
  });
  if (selected) {
    profileConfig.updateActiveProfileSetting(selected);
  }
}

/**
 * Delete profile command will prompt the user to choose a profile name to
 * delete from the profile list.  The delete wil then serialize the changes
 * to the configuration file.
 */
export async function deleteProfile(): Promise<void> {
  const profileList = profileConfig.listProfile();
  if (profileList.length === 0) {
    window.showErrorMessage(l10n.t("No Profiles available to delete"));
    return;
  }
  const selected = await window.showQuickPick(profileList, {
    placeHolder: l10n.t("Select a SAS connection profile"),
  });
  if (selected) {
    profileConfig.deleteProfile(selected);
    window.showInformationMessage(
      l10n.t(
        "The {selected} SAS connection profile has been deleted from the settings.json file.",
        { selected },
      ),
    );
  }
}


================================================
FILE: client/src/commands/run.ts
================================================
// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import {
  EventEmitter,
  Position,
  ProgressLocation,
  Selection,
  Uri,
  commands,
  l10n,
  window,
} from "vscode";
import type { BaseLanguageClient } from "vscode-languageclient";

import { basename, dirname, extname } from "path";

import { showResult } from "../components/ResultPanel";
import {
  appendExecutionLogFn,
  appendSessionLogFn,
  setFileName,
} from "../components/logViewer";
import { sasDiagnostic } from "../components/logViewer/sasDiagnostics";
import { SASCodeDocument } from "../components/utils/SASCodeDocument";
import { getCodeDocumentConstructionParameters } from "../components/utils/SASCodeDocumentHelper";
import { isOutputHtmlEnabled } from "../components/utils/settings";
import { ErrorRepresentation, getSession } from "../connection";
import { useRunStore } from "../store";
import { profileConfig, switchProfile } from "./profile";

interface FoldingBlock {
  startLine: number;
  startCol: number;
  endLine: number;
  endCol: number;
}

const { setIsExecutingCode } = useRunStore.getState();

async function getSelectedRegions(
  client: BaseLanguageClient,
): Promise<Selection[]> {
  const result: string[] = [];

  async function pushBlock(line: number, col: number) {
    const block = await client.sendRequest<FoldingBlock>(
      "sas/getFoldingBlock",
      {
        textDocument: { uri: window.activeTextEditor.document.uri.toString() },
        line,
        col,
      },
    );
    if (block) {
      const start = doc.offsetAt(new Position(block.startLine, block.startCol));
      const end = doc.offsetAt(new Position(block.endLine, block.endCol));
      const key = `${start}-${end}`;
      if (result.indexOf(key) === -1) {
        result.push(key);
      }
      return end;
    }
  }

  const editor = window.activeTextEditor;
  const doc = editor.document;
  for (const selection of editor.selections) {
    const start = doc.offsetAt(selection.start);
    let end = doc.offsetAt(selection.end);
    const selectedText = doc.getText(selection);
    if (selectedText.endsWith("\n")) {
      --end;
    }
    for (let i = start; i <= end; i++) {
      const pos = doc.positionAt(i);
      const blockEnd = await pushBlock(pos.line, pos.character);
      if (blockEnd && blockEnd > i) {
        i = blockEnd;
      }
    }
  }
  return result.map((key) => {
    const [start, end] = key.split("-");
    return new Selection(
      doc.positionAt(parseInt(start)),
      doc.positionAt(parseInt(end)),
    );
  });
}

async function runCode(selected?: boolean, uri?: Uri) {
  if (profileConfig.getActiveProfile() === "") {
    switchProfile();
    return;
  }

  const outputHtml = isOutputHtmlEnabled();
  const editor = uri
    ? window.visibleTextEditors.find(
        (editor) => editor.document.uri.toString() === uri.toString(),
      )
    : window.activeTextEditor;

  const selections = selected ? editor.selections : undefined;
  const parameters = getCodeDocumentConstructionParameters(editor.document, {
    selections,
  });
  const codeDoc = new SASCodeDocument(parameters);
  const onExecutionLogFn = sasDiagnostic.generateLogFn(
    codeDoc,
    appendExecutionLogFn,
  );

  const session = getSession();
  session.onExecutionLogFn = onExecutionLogFn;
  session.onSessionLogFn = appendSessionLogFn;

  const fullPath = codeDoc.getFileName();
  const basePath = dirname(fullPath);
  const fileName = basename(fullPath, extname(fullPath));
  setFileName(fileName);

  await session.setup();

  await window.withProgress(
    {
      location: ProgressLocation.Notification,
      title: l10n.t("SAS code running..."),
      cancellable: typeof session.cancel === "function",
    },
    (_progress, cancellationToken) => {
      cancellationToken.onCancellationRequested(() => {
        session.cancel?.();
      });
      return session
        .run(codeDoc.getWrappedCode(), { baseDirectory: basePath })
        .then((results) => {
          if (outputHtml && results.html5) {
            showResult(results.html5, uri);
          }
        });
    },
  );
}

const _run = async (selected = false, uri?: Uri) => {
  if (useRunStore.getState().isExecutingCode) {
    return;
  }

  setIsExecutingCode(true);
  commands.executeCommand("setContext", "SAS.running", true);

  await runCode(selected, uri)
    .catch((err) => {
      onRunError(err);
    })
    .finally(() => {
      setIsExecutingCode(false);
      commands.executeCommand("setContext", "SAS.running", false);
    });
};

export async function run(): Promise<void> {
  await _run();
}

export async function runSelected(uri: Uri): Promise<void> {
  await _run(true, uri);
}

export async function runRegion(client: BaseLanguageClient): Promise<void> {
  const selections = await getSelectedRegions(client);
  window.activeTextEditor.selections = selections;
  await _run(true, window.activeTextEditor.document.uri);
}

export function hasRunningTask() {
  return useRunStore.getState().isExecutingCode;
}

export async function runTask(
  codeDoc: SASCodeDocument,
  messageEmitter?: EventEmitter<string>,
  closeEmitter?: EventEmitter<number>,
  taskLabel?: string,
): Promise<void> {
  return _runTask(codeDoc, messageEmitter, closeEmitter, taskLabel)
    .catch((err) => {
      onRunError(err);
      throw err;
    })
    .finally(() => {
      setIsExecutingCode(false);
      commands.executeCommand("setContext", "SAS.running", false);
    });
}

async function _runTask(
  codeDoc: SASCodeDocument,
  messageEmitter?: EventEmitter<string>,
  closeEmitter?: EventEmitter<number>,
  taskLabel?: string,
): Promise<void> {
  if (useRunStore.getState().isExecutingCode) {
    return;
  }

  if (profileConfig.getActiveProfile() === "") {
    await switchProfile();
    return;
  }

  setIsExecutingCode(true);
  commands.executeCommand("setContext", "SAS.running", true);

  let cancelled = false;
  const session = getSession();
  closeEmitter.event(async (e) => {
    if (e > 0) {
      cancelled = true;
      await session.cancel();
    }

    setIsExecutingCode(false);
    commands.executeCommand("setContext", "SAS.running", false);
  });

  session.onExecutionLogFn = sasDiagnostic.generateLogFn(
    codeDoc,
    appendExecutionLogFn,
  );
  session.onSessionLogFn = appendSessionLogFn;

  const fullPath = codeDoc.getFileName();
  const basePath = dirname(fullPath);
  const fileName = basename(fullPath, extname(fullPath));
  setFileName(fileName);

  messageEmitter.fire(`${l10n.t("Connecting to SAS session...")}\r\n`);
  !cancelled && (await session.setup(true));

  messageEmitter.fire(`${l10n.t("SAS code running...")}\r\n`);
  return cancelled
    ? undefined
    : session
        .run(codeDoc.getWrappedCode(), { baseDirectory: basePath })
        .then((results) => {
          const outputHtml = isOutputHtmlEnabled();

          if (outputHtml && results.html5) {
            messageEmitter.fire(l10n.t("Show results...") + "\r\n");
            showResult(
              results.html5,
              undefined,
              l10n.t("Result: {result}", { result: taskLabel }),
            );
          }
        });
}

const isErrorRep = (err: unknown): err is ErrorRepresentation => {
  if (
    err &&
    typeof err === "object" &&
    "message" in err &&
    "details" in err &&
    Array.isArray(err.details) &&
    "errorCode" in err
  ) {
    return true;
  }
  return false;
};

export const onRunError = (err) => {
  console.dir(err);
  commands.executeCommand("setContext", "SAS.librariesDisplayed", false);
  commands.executeCommand("setContext", "SAS.serverDisplayed", false);

  if (err.response) {
    // The request was made and we got a status code that falls out side of the 2xx range
    const errorData = err.response.data;

    if (isErrorRep(errorData)) {
      //errorData is an error representation, extract out the details to show a better message
      const details = errorData.details;
      const options = {
        modal: true,
        detail: details.join("\n"),
      };
      window.showErrorMessage(errorData.message, options);
    } else {
      window.showErrorMessage(err.message);
    }
  } else {
    // Either the request was made but no response was received, or
    // there was an issue in the request setup itself, just show the message
    window.showErrorMessage(err.message);
  }
};


================================================
FILE: client/src/commands/toggleLineComment.ts
================================================
// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { Selection, TextEditor, commands } from "vscode";
import type { BaseLanguageClient } from "vscode-languageclient";

/**
 * Register a command to toggle SAS block comment by line
 */
export async function toggleLineComment(
  editor: TextEditor,
  client: BaseLanguageClient,
): Promise<void> {
  const { selections, document } = editor;
  if (selections.length === 1) {
    // We have to depend on VS Code native command for embedded (e.g. Python, Lua) code
    // VS Code native command works on multiple selections together
    // so we're not able to only change some of selections
    // We only do for single selection for now

    const selection = selections[0];
    const endLine =
      // should not include the last line if it just selected the last return character
      selection.end.line > selection.start.line && selection.end.character === 0
        ? selection.end.line - 1
        : selection.end.line;
    const fullSelection = new Selection(
      selection.start.line,
      0,
      endLine,
      document.lineAt(endLine).range.end.character,
    );

    if (!fullSelection.isSingleLine) {
      const result = await client.sendRequest<string | null>(
        "sas/toggleLineComment",
        {
          textDocument:
            client.code2ProtocolConverter.asTextDocumentIdentifier(document),
          range: client.code2ProtocolConverter.asRange(fullSelection),
        },
      );
      if (result) {
        editor.selection = fullSelection;
        await editor.edit((editBuilder) => {
          editBuilder.replace(fullSelection, result);
        });
        return;
      }
    }
  }
  commands.executeCommand("editor.action.commentLine");
}


================================================
FILE: client/src/components/APIProvider.ts
================================================
// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { authentication } from "vscode";

import { profileConfig } from "../commands/profile";
import { SASAuthProvider } from "./AuthProvider";
import { ConnectionType } from "./profile";

/* only Rest APIs for now */

const apis = {};

export const registerAPI = (name: string, fn) => {
  apis[name] = fn;
};

export const getRestAPIs = async (accessToken: string) => {
  const activeProfile = profileConfig.getProfileByName(
    profileConfig.getActiveProfile(),
  );
  if (!activeProfile || activeProfile.connectionType !== ConnectionType.Rest) {
    return;
  }
  const session = await authentication.getSession(SASAuthProvider.id, [], {
    silent: true,
  });
  if (session.accessToken !== accessToken) {
    return;
  }

  return apis;
};


================================================
FILE: client/src/components/AuthProvider.ts
================================================
// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import {
  AuthenticationProvider,
  AuthenticationProviderAuthenticationSessionsChangeEvent,
  AuthenticationSession,
  ConfigurationChangeEvent,
  Disposable,
  Event,
  EventEmitter,
  commands,
  workspace,
} from "vscode";

import { profileConfig } from "../commands/profile";
import { ConnectionType } from "../components/profile";
import { getTokens, refreshToken } from "../connection/rest/auth";
import { getCurrentUser } from "../connection/rest/identities";
import { getSecretStorage } from "./ExtensionContext";

const SECRET_KEY = "SASAuth";

interface SASAuthSession extends AuthenticationSession {
  refreshToken?: string;
}

export class SASAuthProvider implements AuthenticationProvider, Disposable {
  static id = "SAS";

  private readonly secretStorage;
  private _disposables: Disposable[];
  private _lastSession: SASAuthSession | undefined;
  private _onDidChangeSessions =
    new EventEmitter<AuthenticationProviderAuthenticationSessionsChangeEvent>();
  get onDidChangeSessions(): Event<AuthenticationProviderAuthenticationSessionsChangeEvent> {
    return this._onDidChangeSessions.event;
  }

  constructor() {
    this._disposables = [
      this._onDidChangeSessions,
      workspace.onDidChangeConfiguration((event: ConfigurationChangeEvent) => {
        if (
          event.affectsConfiguration("SAS.connectionProfiles") &&
          this._lastSession
        ) {
          this._onDidChangeSessions.fire({
            added: [],
            changed: [],
            removed: [this._lastSession],
          });
          this._lastSession = undefined;
        }
      }),
    ];
    this.secretStorage = getSecretStorage<SASAuthSession>(SECRET_KEY);
  }

  dispose(): void {
    for (const d of this._disposables) {
      d.dispose();
    }
  }

  async getSessions(): Promise<readonly AuthenticationSession[]> {
    const sessions = await this._getSessions();
    if (sessions.length === 0) {
      commands.executeCommand("setContext", "SAS.authorized", false);
    } else {
      if (this._lastSession?.id !== sessions[0].id) {
        // have to fire change event so that the Accounts menu can update after switching profile
        this._lastSession = sessions[0];
        this._onDidChangeSessions.fire({
          added: [],
          changed: sessions,
          removed: [],
        });
      }
      commands.executeCommand("setContext", "SAS.authorized", true);
    }
    return sessions;
  }

  private async _getSessions(): Promise<readonly AuthenticationSession[]> {
    const sessions = await this.secretStorage.getNamespaceData();
    if (!sessions) {
      return [];
    }

    const activeProfile = profileConfig.getActiveProfileDetail();
    const profile = activeProfile?.profile;
    if (!profile || profile.connectionType !== ConnectionType.Rest) {
      return [];
    }
    const profileName = profileConfig.getActiveProfile();
    const session = sessions[profileName];
    if (!session) {
      return [];
    }

    const tokens = await refreshToken(profile, {
      access_token: session.accessToken,
      refresh_token: session.refreshToken,
    });
    if (!tokens) {
      // refresh token failed, the stored session is not valid anymore
      await this.removeSession(session.id, true);
      return [];
    }
    const accessToken = tokens.access_token;
    if (accessToken === session.accessToken) {
      return [session];
    }
    const newSession = { ...session, accessToken: tokens.access_token };
    await this.writeSession(newSession);

    return [newSession];
  }

  async createSession(): Promise<AuthenticationSession> {
    const activeProfile = profileConfig.getActiveProfileDetail();
    const profile = activeProfile.profile;

    if (profile.connectionType !== ConnectionType.Rest) {
      return;
    }

    const { access_token: accessToken, refresh_token: refreshToken } =
      await getTokens(profile);
    const user = await getCurrentUser({
      endpoint: profile.endpoint,
      accessToken,
    });
    const profileName = profileConfig.getActiveProfile();
    const session: SASAuthSession = {
      id: profileName,
      account: { id: user.id, label: user.name },
      accessToken,
      refreshToken,
      scopes: [],
    };

    await this.writeSession(session);
    this._lastSession = session;
    this._onDidChangeSessions.fire({
      added: [session],
      changed: [],
      removed: [],
    });

    commands.executeCommand("setContext", "SAS.authorized", true);

    return session;
  }

  private async writeSession(session: SASAuthSession): Promise<void> {
    this.secretStorage.store(session.id, session);
  }

  async removeSession(sessionId: string, silent?: boolean): Promise<void> {
    const sessions = await this.secretStorage.getNamespaceData();
    if (!sessions) {
      return;
    }
    const profileName = profileConfig.getActiveProfile();
    const id = sessions[sessionId] ? sessionId : profileName;
    const session = sessions[id];
    if (!session) {
      return;
    }
    delete sessions[id];

    if (!silent) {
      // Triggered by user sign out from the Accounts menu
      // VS Code will sign out all sessions by this account
      Object.values(sessions).forEach((s: SASAuthSession) => {
        if (s.account.id === session.account.id) {
          delete sessions[s.id];
        }
      });
    }

    await this.secretStorage.setNamespaceData(sessions);

    this._lastSession = undefined;
    this._onDidChangeSessions.fire({
      added: [],
      changed: [],
      removed: [session],
    });

    if (!silent) {
      commands.executeCommand("setContext", "SAS.authorized", false);
    }
  }
}


================================================
FILE: client/src/components/CAHelper.ts
================================================
// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { workspace } from "vscode";

import * as fs from "fs";
import * as https from "https";
import * as tls from "tls";

export const installCAs = () => {
  const certFiles: string[] = workspace
    .getConfiguration("SAS")
    .get("userProvidedCertificates");
  if (!certFiles || !certFiles.length) {
    return;
  }

  const userCertificates = [];
  for (const filename of certFiles) {
    if (filename && filename.length) {
      try {
        userCertificates.push(fs.readFileSync(filename));
      } catch (e) {
        console.log(`Failed to read user provided certificate`, e);
      }
    }
  }
  if (userCertificates.length > 0) {
    https.globalAgent.options.ca =
      tls.rootCertificates.concat(userCertificates);
  }
};


================================================
FILE: client/src/components/ContentNavigator/ContentAdapterFactory.ts
================================================
// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import ItcServerAdapter from "../../connection/itc/ItcServerAdapter";
import RestContentAdapter from "../../connection/rest/RestContentAdapter";
import RestServerAdapter from "../../connection/rest/RestServerAdapter";
import { ConnectionType, ProfileWithFileRootOptions } from "../profile";
import {
  ContentAdapter,
  ContentNavigatorConfig,
  ContentSourceType,
} from "./types";

class ContentAdapterFactory {
  public create(
    connectionType: ConnectionType,
    fileNavigationCustomRootPath: ProfileWithFileRootOptions["fileNavigationCustomRootPath"],
    fileNavigationRoot: ProfileWithFileRootOptions["fileNavigationRoot"],
    sourceType: ContentNavigatorConfig["sourceType"],
  ): ContentAdapter {
    const key = `${connectionType}.${sourceType}`;
    switch (key) {
      case `${ConnectionType.Rest}.${ContentSourceType.SASServer}`:
        return new RestServerAdapter(
          fileNavigationCustomRootPath,
          fileNavigationRoot,
        );
      case `${ConnectionType.IOM}.${ContentSourceType.SASServer}`:
      case `${ConnectionType.COM}.${ContentSourceType.SASServer}`:
        return new ItcServerAdapter(
          fileNavigationCustomRootPath,
          fileNavigationRoot,
        );
      case `${ConnectionType.Rest}.${ContentSourceType.SASContent}`:
      default:
        return new RestContentAdapter();
    }
  }
}

export default ContentAdapterFactory;


================================================
FILE: client/src/components/ContentNavigator/ContentDataProvider.ts
================================================
// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import {
  CancellationToken,
  DataTransfer,
  DataTransferItem,
  Disposable,
  DocumentDropEdit,
  Event,
  EventEmitter,
  FileChangeEvent,
  FileStat,
  FileSystemProvider,
  FileType,
  Position,
  ProviderResult,
  TabInputNotebook,
  TabInputText,
  TextDocument,
  TextDocumentContentProvider,
  TreeDataProvider,
  TreeDragAndDropController,
  TreeItem,
  TreeItemCollapsibleState,
  TreeView,
  Uri,
  commands,
  l10n,
  languages,
  window,
  workspace,
} from "vscode";

import { lstat, lstatSync, readFile, readdir } from "fs";
import { basename, join } from "path";
import { promisify } from "util";

import { profileConfig } from "../../commands/profile";
import { getResourceId } from "../../connection/rest/util";
import { SubscriptionProvider } from "../SubscriptionProvider";
import { ViyaProfile } from "../profile";
import { ContentModel } from "./ContentModel";
import {
  FAVORITES_FOLDER_TYPE,
  Messages,
  ROOT_FOLDER_TYPE,
  SERVER_HOME_FOLDER_TYPE,
  SERVER_ROOT_FOLDER_TYPE,
  STOP_SIGN,
  TRASH_FOLDER_TYPE,
} from "./const";
import {
  ContentItem,
  ContentNavigatorConfig,
  FileManipulationEvent,
} from "./types";
import {
  getEditorTabsForItem,
  getFileStatement,
  isContainer as getIsContainer,
} from "./utils";

class ContentDataProvider
  implements
    TreeDataProvider<ContentItem>,
    FileSystemProvider,
    TextDocumentContentProvider,
    SubscriptionProvider,
    TreeDragAndDropController<ContentItem>
{
  private _onDidManipulateFile: EventEmitter<FileManipulationEvent>;
  private _onDidChangeFile: EventEmitter<FileChangeEvent[]>;
  private _onDidChangeTreeData: EventEmitter<ContentItem | undefined>;
  private _onDidChange: EventEmitter<Uri>;
  private _treeView: TreeView<ContentItem>;
  private _dropEditProvider: Disposable;
  private model: ContentModel;
  private extensionUri: Uri;
  private mimeType: string;

  public dropMimeTypes: string[];
  public dragMimeTypes: string[];

  private uriToParentMap = new Map<string, string>();

  get treeView(): TreeView<ContentItem> {
    return this._treeView;
  }

  constructor(
    model: ContentModel,
    extensionUri: Uri,
    { mimeType, treeIdentifier }: ContentNavigatorConfig,
  ) {
    this._onDidManipulateFile = new EventEmitter<FileManipulationEvent>();
    this._onDidChangeFile = new EventEmitter<FileChangeEvent[]>();
    this._onDidChangeTreeData = new EventEmitter<ContentItem | undefined>();
    this._onDidChange = new EventEmitter<Uri>();
    this.model = model;
    this.extensionUri = extensionUri;
    this.dropMimeTypes = [mimeType, "text/uri-list"];
    this.dragMimeTypes = [mimeType];
    this.mimeType = mimeType;

    this._treeView = window.createTreeView(treeIdentifier, {
      treeDataProvider: this,
      dragAndDropController: this,
      canSelectMany: true,
    });
    this._dropEditProvider = languages.registerDocumentDropEditProvider(
      { language: "sas" },
      this,
    );

    this._treeView.onDidChangeVisibility(async () => {
      if (this._treeView.visible) {
        const activeProfile: ViyaProfile = profileConfig.getProfileByName(
          profileConfig.getActiveProfile(),
        );
        await this.connect(activeProfile.endpoint);
      }
    });
  }

  public useModel(contentModel: ContentModel) {
    this.model = contentModel;
  }

  public async handleDrop(
    target: ContentItem,
    sources: DataTransfer,
  ): Promise<void> {
    for (const mimeType of this.dropMimeTypes) {
      const item = sources.get(mimeType);
      if (!item || !item.value) {
        continue;
      }

      switch (mimeType) {
        case this.mimeType:
          await Promise.all(
            item.value.map(
              async (contentItem: ContentItem) =>
                await this.handleContentItemDrop(target, contentItem),
            ),
          );
          break;
        case "text/uri-list":
          await this.handleDataTransferItemDrop(target, item);
          break;
        default:
          break;
      }
    }
  }

  public handleDrag(
    source: ContentItem[],
    dataTransfer: DataTransfer,
  ): void | Thenable<void> {
    const dataTransferItem = new DataTransferItem(source);
    dataTransfer.set(this.dragMimeTypes[0], dataTransferItem);
  }

  public async provideDocumentDropEdits(
    document: TextDocument,
    position: Position,
    dataTransfer: DataTransfer,
    token: CancellationToken,
  ): Promise<DocumentDropEdit | undefined> {
    const dataTransferItem = dataTransfer.get(this.dragMimeTypes[0]);
    const contentItem =
      dataTransferItem && JSON.parse(dataTransferItem.value)[0];
    if (token.isCancellationRequested || !contentItem) {
      return undefined;
    }

    const fileFolderPath = await this.model.getFileFolderPath(contentItem);
    if (!fileFolderPath) {
      return undefined;
    }

    return {
      insertText: getFileStatement(
        contentItem.name,
        document.getText(),
        fileFolderPath,
      ),
    };
  }

  public getSubscriptions(): Disposable[] {
    return [this._treeView, this._dropEditProvider];
  }

  get onDidChangeFile(): Event<FileChangeEvent[]> {
    return this._onDidChangeFile.event;
  }

  get onDidChangeTreeData(): Event<ContentItem> {
    return this._onDidChangeTreeData.event;
  }

  get onDidChange(): Event<Uri> {
    return this._onDidChange.event;
  }

  get onDidManipulateFile(): Event<FileManipulationEvent> {
    return this._onDidManipulateFile.event;
  }

  public async connect(baseUrl: string): Promise<void> {
    await this.model.connect(baseUrl);
    this.refresh();
  }

  public async getTreeItem(item: ContentItem): Promise<TreeItem> {
    const isContainer = getIsContainer(item);
    const uri = await this.model.getUri(item, false);

    // Cache the URI to parent mapping
    this.uriToParentMap.set(
      item.uri,
      item.parentFolderUri ? item.parentFolderUri : STOP_SIGN,
    );

    return {
      collapsibleState: isContainer
        ? TreeItemCollapsibleState.Collapsed
        : undefined,
      command: isContainer
        ? undefined
        : {
            command: "vscode.open",
            arguments: [uri],
            title: "Open SAS File",
          },
      contextValue: item.contextValue || undefined,
      iconPath: this.iconPathForItem(item),
      id: item.uid,
      label: item.name,
      resourceUri: uri,
    };
  }

  public async provideTextDocumentContent(uri: Uri): Promise<string> {
    // use text document content provider to display the readonly editor for the files in the recycle bin
    return await this.model.getContentByUri(uri);
  }

  public getChildren(item?: ContentItem): ProviderResult<ContentItem[]> {
    return this.model.getChildren(item);
  }

  public watch(): Disposable {
    // ignore, fires for all changes...
    return new Disposable(() => {});
  }

  public async stat(uri: Uri): Promise<FileStat> {
    return await this.model
      .getResourceByUri(uri)
      .then((resource): FileStat => resource.fileStat);
  }

  public async readFile(uri: Uri): Promise<Uint8Array> {
    return await this.model
      .getContentByUri(uri)
      .then((content) => new TextEncoder().encode(content));
  }

  public async createFolder(
    item: ContentItem,
    folderName: string,
  ): Promise<Uri | undefined> {
    const newItem = await this.model.createFolder(item, folderName);
    if (newItem) {
      this.refresh();
      return newItem.vscUri;
    }
  }

  public async createFile(
    item: ContentItem,
    fileName: string,
    buffer?: ArrayBufferLike,
  ): Promise<Uri | undefined> {
    const newItem = await this.model.createFile(item, fileName, buffer);
    if (newItem) {
      this.refresh();
      return newItem.vscUri;
    }
  }

  public async renameResource(
    item: ContentItem,
    name: string,
  ): Promise<Uri | undefined> {
    const closing = closeFileIfOpen(item);
    const removedTabUris = await closing;
    if (!removedTabUris) {
      return;
    }

    const newItem = await this.model.renameResource(item, name);
    if (!newItem) {
      return;
    }

    const newUri = newItem.vscUri;
    const oldUriToNewUriMap = [[item.vscUri, newUri]];
    const newItemIsContainer = getIsContainer(newItem);
    if (closing !== true && !newItemIsContainer) {
      await commands.executeCommand("vscode.open", newUri);
    }
    if (closing !== true && newItemIsContainer) {
      const urisToOpen = getPreviouslyOpenedChildItems(
        await this.getChildren(newItem),
      );
      for (const [, newUri] of urisToOpen) {
        await commands.executeCommand("vscode.open", newUri);
      }
      oldUriToNewUriMap.push(...urisToOpen);
    }
    oldUriToNewUriMap.forEach(([uri, newUri]) =>
      this._onDidManipulateFile.fire({
        type: "rename",
        uri,
        newUri,
      }),
    );
    return newUri;

    function getPreviouslyOpenedChildItems(childItems: ContentItem[]) {
      const loadChildItems = closing !== true && newItemIsContainer;
      if (!Array.isArray(removedTabUris) || !loadChildItems) {
        return [];
      }
      // Here's where things get a little weird. When we rename folders in
      // sas content, we _don't_ close those files. It doesn't matter since
      // their path isn't hierarchical. In sas file system, the path is hierarchical,
      // thus we need to re-open all the closed files. This does that by getting
      // children and comparing the removedTabUris
      const filteredChildItems = childItems
        .map((childItem) => {
          const matchingUri = removedTabUris.find((uri) =>
            uri.path.endsWith(childItem.name),
          );
          if (!matchingUri) {
            return;
          }

          return [matchingUri, childItem.vscUri];
        })
        .filter((exists) => exists);

      return filteredChildItems;
    }
  }

  public writeFile(uri: Uri, content: Uint8Array): void | Promise<void> {
    return this.model.saveContentToUri(uri, new TextDecoder().decode(content));
  }

  public async deleteResource(item: ContentItem): Promise<boolean> {
    if (!(await closeFileIfOpen(item))) {
      return false;
    }
    const success = await this.model.delete(item);
    if (success) {
      this.refresh();
      this._onDidManipulateFile.fire({ type: "delete", uri: item.vscUri });
    }
    return success;
  }

  public canRecycleResource(item: ContentItem): boolean {
    return this.model.canRecycleResource(item);
  }

  public async recycleResource(item: ContentItem): Promise<boolean> {
    if (!(await closeFileIfOpen(item))) {
      return false;
    }

    const { newUri, oldUri } = await this.model.recycleResource(item);

    if (newUri) {
      this.refresh();
      // update the text document content as well just in case that this file was just restored and updated
      this._onDidChange.fire(newUri);
      this._onDidManipulateFile.fire({
        type: "recycle",
        uri: oldUri,
      });
    }

    return !!newUri;
  }

  public async restoreResource(item: ContentItem): Promise<boolean> {
    if (!(await closeFileIfOpen(item))) {
      return false;
    }
    const success = await this.model.restoreResource(item);
    if (success) {
      this.refresh();
    }

    return success;
  }

  public async emptyRecycleBin(): Promise<boolean> {
    const recycleBin = this.model.getDelegateFolder("@myRecycleBin");
    const children = await this.getChildren(recycleBin);
    const result = await Promise.all(
      children.map((child) => this.deleteResource(child)),
    );
    const success = result.length === children.length;
    if (success) {
      this.refresh();
    }
    return success;
  }

  public async addToMyFavorites(item: ContentItem): Promise<boolean> {
    const success = await this.model.addFavorite(item);
    if (success) {
      this.refresh();
    }
    return success;
  }

  public async removeFromMyFavorites(item: ContentItem): Promise<boolean> {
    const success = await this.model.removeFavorite(item);
    if (success) {
      this.refresh();
    }
    return success;
  }

  public async handleCreationResponse(
    resource: ContentItem,
    newUri: Uri | undefined,
    errorMessage: string,
  ): Promise<void> {
    if (!newUri) {
      window.showErrorMessage(errorMessage);
      return;
    }

    this.reveal(resource);
  }

  public refresh(): void {
    this._onDidChangeTreeData.fire(undefined);
    this.uriToParentMap.clear();
  }

  public async getParent(
    element: ContentItem,
  ): Promise<ContentItem | undefined> {
    return await this.model.getParent(element);
  }

  public async delete(): Promise<void> {
    throw new Error("Method not implemented.");
  }

  public rename(): void | Promise<void> {
    throw new Error("Method not implemented.");
  }

  public readDirectory():
    | [string, FileType][]
    | Thenable<[string, FileType][]> {
    throw new Error("Method not implemented.");
  }

  public createDirectory(): void | Thenable<void> {
    throw new Error("Method not implemented.");
  }

  public reveal(item: ContentItem): void {
    this._treeView.reveal(item, {
      expand: true,
      select: false,
      focus: false,
    });
  }

  public async uploadUrisToTarget(
    uris: Uri[],
    target: ContentItem,
  ): Promise<void> {
    const failedUploads = [];
    for (let i = 0; i < uris.length; ++i) {
      const uri = uris[i];
      const fileName = basename(uri.fsPath);
      if (lstatSync(uri.fsPath).isDirectory()) {
        const success = await this.handleFolderDrop(target, uri.fsPath, false);
        !success && failedUploads.push(fileName);
      } else {
        const file = await workspace.fs.readFile(uri);
        const newUri = await this.createFile(target, fileName, file);
        !newUri && failedUploads.push(fileName);
      }
    }

    if (failedUploads.length > 0) {
      this.handleCreationResponse(
        target,
        undefined,
        l10n.t(Messages.FileUploadError),
      );
    }
  }

  public async checkFolderDirty(resource: ContentItem): Promise<boolean> {
    if (!resource.vscUri) {
      return false;
    }

    const targetFolderUri = resource.uri;

    // Check for dirty text documents
    const dirtyTextFiles = workspace.textDocuments
      .filter((doc) => {
        if (!doc.isDirty) {
          return false;
        }

        const scheme = doc.uri.scheme;
        return (
          scheme === "sasContent" ||
          scheme === "sasServer" ||
          scheme === "sasContentReadOnly" ||
          scheme === "sasServerReadOnly"
        );
      })
      .map((doc) => doc.uri);

    // Check for dirty notebook documents (SASNB files)
    const dirtyNotebookFiles = workspace.notebookDocuments
      .filter((notebook) => {
        if (!notebook.isDirty) {
          return false;
        }

        const scheme = notebook.uri.scheme;
        return (
          scheme === "sasContent" ||
          scheme === "sasServer" ||
          scheme === "sasContentReadOnly" ||
          scheme === "sasServerReadOnly"
        );
      })
      .map((notebook) => notebook.uri);

    const allDirtyFiles = [...dirtyTextFiles, ...dirtyNotebookFiles];

    if (allDirtyFiles.length === 0) {
      return false;
    }

    for (const dirtyFileUri of allDirtyFiles) {
      if (
        await this.isDescendantOf(getResourceId(dirtyFileUri), targetFolderUri)
      ) {
        return true;
      }
    }

    return false;
  }

  private async isDescendantOf(
    fileUri: string,
    ancestorFolderUri: string,
  ): Promise<boolean> {
    let currentParentUri = this.uriToParentMap.get(fileUri);

    // If the cache doesn't contain the uri, it's acceptable to not pop up
    // This can happen when switching Viya profiles where the dirty file
    // is from a different server context
    if (!currentParentUri) {
      return false;
    }

    let depth = 0;
    while (currentParentUri || depth <= 10) {
      if (currentParentUri === ancestorFolderUri) {
        return true;
      }

      if (currentParentUri === STOP_SIGN) {
        return false;
      }

      const nextParentUri = this.uriToParentMap.get(currentParentUri);

      if (nextParentUri) {
        currentParentUri = nextParentUri;
      } else {
        // If the cache doesn't contain the parent uri, stop traversing
        // rather than making a server call which could be for a different server
        break;
      }
      depth++;
    }

    return false;
  }

  public async downloadContentItems(
    folderUri: Uri,
    selections: ContentItem[],
    allSelections: readonly ContentItem[],
  ): Promise<void> {
    for (let i = 0; i < selections.length; ++i) {
      const selection = selections[i];
      if (getIsContainer(selection)) {
        const newFolderUri = Uri.joinPath(folderUri, selection.name);
        const selectionsWithinFolder = await this.childrenSelections(
          selection,
          allSelections,
        );
        await workspace.fs.createDirectory(newFolderUri);
        await this.downloadContentItems(
          newFolderUri,
          selectionsWithinFolder,
          allSelections,
        );
      } else {
        await workspace.fs.writeFile(
          Uri.joinPath(folderUri, selection.name),
          await this.model.downloadFile(selection),
        );
      }
    }
  }

  public async getPathOfItem(item: ContentItem) {
    return await this.model.getPathOfItem(item);
  }

  private async childrenSelections(
    selection: ContentItem,
    allSelections: readonly ContentItem[],
  ): Promise<ContentItem[]> {
    const foundSelections = allSelections.filter(
      (foundSelection) => foundSelection.parentFolderUri === selection.uri,
    );
    if (foundSelections.length > 0) {
      return foundSelections;
    }

    // If we don't have any child selections, then the folder must have been
    // closed and therefore, we expect to select _all_ children
    return this.getChildren(selection);
  }

  private async moveItem(
    item: ContentItem,
    targetUri: string,
  ): Promise<boolean> {
    if (!targetUri) {
      return false;
    }

    const closing = closeFileIfOpen(item);
    if (!(await closing)) {
      return false;
    }

    const newUri = await this.model.moveTo(item, targetUri);
    if (closing !== true) {
      commands.executeCommand("vscode.open", newUri);
    }

    return !!newUri;
  }

  private async handleContentItemDrop(
    target: ContentItem,
    item: ContentItem,
  ): Promise<void> {
    let success = false;
    let message = Messages.FileDropError;
    if (item.flags?.isInRecycleBin) {
      message = Messages.FileDragFromTrashError;
    } else if (item.isReference) {
      message = Messages.FileDragFromFavorites;
    } else if (target.type === TRASH_FOLDER_TYPE) {
      success = await this.recycleResource(item);
    } else if (target.type === FAVORITES_FOLDER_TYPE) {
      success = await this.addToMyFavorites(item);
    } else {
      const targetUri = target.resourceId ?? target.uri;
      success = await this.moveItem(item, targetUri);
      if (success) {
        this.refresh();
      }
    }

    if (!success) {
      window.showErrorMessage(
        l10n.t(message, {
          name: item.name,
        }),
      );
    }
  }

  private async handleFolderDrop(
    target: ContentItem,
    path: string,
    displayErrorMessages: boolean = true,
  ): Promise<boolean> {
    const folderName = basename(path);
    const folder = await this.model.createFolder(target, folderName);
    let success = true;
    if (!folder) {
      displayErrorMessages &&
        window.showErrorMessage(
          l10n.t(Messages.FileDropError, {
            name: folderName,
          }),
        );

      return false;
    }

    // Read all the files in the folder and upload them
    const filesOrFolders = await promisify(readdir)(path);
    await Promise.all(
      filesOrFolders.map(async (fileOrFolderName: string) => {
        const fileOrFolder = join(path, fileOrFolderName);
        const isDirectory = (
          await promisify(lstat)(fileOrFolder)
        ).isDirectory();
        if (isDirectory) {
          success = await this.handleFolderDrop(folder, fileOrFolder);
        } else {
          const name = basename(fileOrFolder);
          const fileCreated = await this.createFile(
            folder,
            name,
            await promisify(readFile)(fileOrFolder),
          );
          if (!fileCreated) {
            success = false;
            displayErrorMessages &&
              window.showErrorMessage(
                l10n.t(Messages.FileDropError, {
                  name,
                }),
              );
          }
        }
      }),
    );

    return success;
  }

  private async handleDataTransferItemDrop(
    target: ContentItem,
    item: DataTransferItem,
  ): Promise<void> {
    // If a user drops multiple files, there will be multiple
    // uris separated by newlines
    await Promise.all(
      item.value.split("\n").map(async (uri: string) => {
        const itemUri = Uri.parse(uri.trim());
        const name = basename(itemUri.path);
        const isDirectory = (
          await promisify(lstat)(itemUri.fsPath)
        ).isDirectory();

        if (isDirectory) {
          const success = await this.handleFolderDrop(target, itemUri.fsPath);
          if (success) {
            this.refresh();
          }

          return;
        }

        const fileCreated = await this.createFile(
          target,
          name,
          await promisify(readFile)(itemUri.fsPath),
        );

        if (!fileCreated) {
          window.showErrorMessage(
            l10n.t(Messages.FileDropError, {
              name,
            }),
          );
        }
      }),
    );
  }

  private iconPathForItem(
    item: ContentItem,
  ): undefined | { light: Uri; dark: Uri } {
    const isContainer = getIsContainer(item);
    let icon = "";
    if (isContainer) {
      const type = item.typeName;
      switch (type) {
        case ROOT_FOLDER_TYPE:
          icon = "sasFolders";
          break;
        case TRASH_FOLDER_TYPE:
          icon = "delete";
          break;
        case FAVORITES_FOLDER_TYPE:
          icon = "favoritesFolder";
          break;
        case SERVER_HOME_FOLDER_TYPE:
          icon = "userWorkspace";
          break;
        case SERVER_ROOT_FOLDER_TYPE:
          icon = "server";
          break;
        default:
          icon = "folder";
          break;
      }
    }

    return icon !== ""
      ? {
          dark: Uri.joinPath(this.extensionUri, `icons/dark/${icon}Dark.svg`),
          light: Uri.joinPath(
            this.extensionUri,
            `icons/light/${icon}Light.svg`,
          ),
        }
      : undefined;
  }
}

export default ContentDataProvider;

const closeFileIfOpen = (item: ContentItem): Promise<Uri[]> | boolean => {
  const tabs = getEditorTabsForItem(item);
  if (tabs.length > 0) {
    return new Promise((resolve, reject) => {
      Promise.all(tabs.map((tab) => window.tabGroups.close(tab)))
        .then(() =>
          resolve(
            tabs
              .map(
                (tab) =>
                  (tab.input instanceof TabInputText ||
                    tab.input instanceof TabInputNotebook) &&
                  tab.input.uri,
              )
              .filter((exists) => exists),
          ),
        )
        .catch(reject);
    });
  }
  return true;
};


================================================
FILE: client/src/components/ContentNavigator/ContentModel.ts
================================================
// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { Uri, l10n } from "vscode";

import { extname } from "path";

import { ALL_ROOT_FOLDERS, Messages } from "./const";
import { ContentAdapter, ContentItem } from "./types";
import { isItemInRecycleBin } from "./utils";

export class ContentModel {
  private contentAdapter: ContentAdapter;

  constructor(contentAdapter: ContentAdapter) {
    this.contentAdapter = contentAdapter;
  }

  public connected(): boolean {
    return this.contentAdapter.connected();
  }

  public async connect(baseURL: string): Promise<void> {
    await this.contentAdapter.connect(baseURL);
  }

  public getAdapter() {
    return this.contentAdapter;
  }

  public async getChildren(item?: ContentItem): Promise<ContentItem[]> {
    if (!this.connected()) {
      return [];
    }

    if (!item) {
      return Object.entries(await this.contentAdapter.getRootItems())
        .sort(
          // sort the delegate folders as the order in the supportedDelegateFolders
          (a, b) =>
            ALL_ROOT_FOLDERS.indexOf(a[0]) - ALL_ROOT_FOLDERS.indexOf(b[0]),
        )
        .map((entry) => entry[1]);
    }

    return await this.contentAdapter.getChildItems(item);
  }

  public async getParent(item: ContentItem): Promise<ContentItem | undefined> {
    return await this.contentAdapter.getParentOfItem(item);
  }

  public async getResourceByUri(uri: Uri): Promise<ContentItem> {
    return await this.contentAdapter.getItemOfUri(uri);
  }

  public async getContentByUri(uri: Uri): Promise<string> {
    let data;
    try {
      data = (await this.contentAdapter.getContentOfUri(uri)).toString();
      // eslint-disable-next-line @typescript-eslint/no-unused-vars
    } catch (e) {
      throw new Error(Messages.FileOpenError);
    }

    // We expect the returned data to be a string. If this isn't a string,
    // we can't really open it
    if (typeof data === "object") {
      throw new Error(Messages.FileOpenError);
    }

    return data;
  }

  public async downloadFile(item: ContentItem): Promise<Buffer | undefined> {
    try {
      const data = await this.contentAdapter.getContentOfItem(item);

      return Buffer.from(data, "binary");
      // eslint-disable-next-line @typescript-eslint/no-unused-vars
    } catch (e) {
      throw new Error(Messages.FileDownloadError);
    }
  }

  public async createFile(
    parentItem: ContentItem,
    fileName: string,
    buffer?: ArrayBufferLike,
  ): Promise<ContentItem | undefined> {
    return await this.contentAdapter.createNewItem(
      parentItem,
      fileName,
      buffer,
    );
  }

  public async createUniqueFileOfPrefix(
    parentItem: ContentItem,
    fileName: string,
    buffer?: ArrayBufferLike,
  ) {
    const itemsInFolder = await this.getChildren(parentItem);
    const uniqueFileName = getUniqueFileName();

    return await this.createFile(parentItem, uniqueFileName, buffer);

    function getUniqueFileName(): string {
      const ext = extname(fileName);
      const basename = fileName.replace(ext, "");
      const usedFlowNames = itemsInFolder.reduce((carry, item) => {
        if (item.name.endsWith(ext)) {
          return { ...carry, [item.name]: true };
        }
        return carry;
      }, {});

      if (!usedFlowNames[fileName]) {
        return fileName;
      }

      let number = 1;
      let newFileName;
      do {
        newFileName = l10n.t("{basename}_Copy{number}{ext}", {
          basename,
          number: number++,
          ext,
        });
      } while (usedFlowNames[newFileName]);

      return newFileName || fileName;
    }
  }

  public async createFolder(
    item: ContentItem,
    name: string,
  ): Promise<ContentItem | undefined> {
    return await this.contentAdapter.createNewFolder(item, name);
  }

  public async renameResource(
    item: ContentItem,
    name: string,
  ): Promise<ContentItem | undefined> {
    return await this.contentAdapter.renameItem(item, name);
  }

  public async saveContentToUri(uri: Uri, content: string): Promise<void> {
    await this.contentAdapter.updateContentOfItem(uri, content);
  }

  public async getUri(item: ContentItem, readOnly: boolean): Promise<Uri> {
    return await this.contentAdapter.getUriOfItem(item, readOnly);
  }

  public async delete(item: ContentItem): Promise<boolean> {
    return await this.contentAdapter.deleteItem(item);
  }

  public async addFavorite(item: ContentItem): Promise<boolean> {
    return await this.contentAdapter.addItemToFavorites(item);
  }

  public async removeFavorite(item: ContentItem): Promise<boolean> {
    return await this.contentAdapter.removeItemFromFavorites(item);
  }

  public async moveTo(
    item: ContentItem,
    targetParentFolderUri: string,
  ): Promise<boolean | Uri> {
    return await this.contentAdapter.moveItem(item, targetParentFolderUri);
  }

  public getDelegateFolder(name: string): ContentItem | undefined {
    return this.contentAdapter.getRootFolder(name);
  }

  public async getFileFolderPath(contentItem: ContentItem): Promise<string> {
    return await this.contentAdapter.getFolderPathForItem(contentItem);
  }

  public canRecycleResource(item: ContentItem): boolean {
    return (
      this.contentAdapter.recycleItem &&
      this.contentAdapter.restoreItem &&
      !isItemInRecycleBin(item) &&
      item.permission.write
    );
  }

  public async recycleResource(item: ContentItem) {
    return await this.contentAdapter?.recycleItem(item);
  }

  public async restoreResource(item: ContentItem) {
    return await this.contentAdapter?.restoreItem(item);
  }

  public async getPathOfItem(item: ContentItem): Promise<string> {
    return await this.contentAdapter.getPathOfItem(item);
  }
}


================================================
FILE: client/src/components/ContentNavigator/const.ts
================================================
// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { l10n } from "vscode";

import { createStaticFolder } from "./utils";

export const DEFAULT_FILE_CONTENT_TYPE = "text/plain";

const CONTENT_FOLDER_ID = "CONTENT_FOLDER_ID";
export const ROOT_FOLDER_TYPE = "RootFolder";
export const ROOT_FOLDER = createStaticFolder(
  CONTENT_FOLDER_ID,
  "SAS Content",
  ROOT_FOLDER_TYPE,
  "/folders/folders",
);

export const SERVER_FOLDER_ID = "SERVER_FOLDER_ID";
export const SERVER_ROOT_FOLDER_TYPE = "ServerRootFolder";
export const SERVER_HOME_FOLDER_TYPE = "ServerHomeFolder";
export const SAS_SERVER_ROOT_FOLDER = createStaticFolder(
  SERVER_FOLDER_ID,
  "SAS Server",
  SERVER_ROOT_FOLDER_TYPE,
  "/",
  "getDirectoryMembers",
);

export const STOP_SIGN = "__STOP_SIGN__";
export const FILE_TYPE = "file";
export const DATAFLOW_TYPE = "dataFlow";
export const FILE_TYPES = [FILE_TYPE, DATAFLOW_TYPE];
export const FOLDER_TYPE = "folder";
export const MYFOLDER_TYPE = "myFolder";
export const TRASH_FOLDER_TYPE = "trashFolder";
export const FAVORITES_FOLDER_TYPE = "favoritesFolder";
export const FOLDER_TYPES = [
  ROOT_FOLDER_TYPE,
  FOLDER_TYPE,
  MYFOLDER_TYPE,
  FAVORITES_FOLDER_TYPE,
  "userFolder",
  "userRoot",
  TRASH_FOLDER_TYPE,
];

export const SAS_CONTENT_ROOT_FOLDERS = [
  "@myFavorites",
  "@myFolder",
  "@sasRoot",
  "@myRecycleBin",
];

export const SAS_SERVER_ROOT_FOLDERS = ["@sasServerRoot"];

export const ALL_ROOT_FOLDERS = [
  ...SAS_CONTENT_ROOT_FOLDERS,
  ...SAS_SERVER_ROOT_FOLDERS,
];

export const Messages = {
  AddFileToMyFolderFailure: l10n.t("Unable to add file to my folder."),
  AddFileToMyFolderSuccess: l10n.t("File added to my folder."),
  AddToFavoritesError: l10n.t("The item could not be added to My Favorites."),
  DeleteButtonLabel: l10n.t("Delete"),
  MoveToRecycleBinLabel: l10n.t("Move to Recycle Bin"),
  DeleteWarningMessage: l10n.t(
    'Are you sure you want to permanently delete the item "{name}"?',
  ),
  RecycleDirtyFolderWarning: l10n.t(
    "This folder contains unsaved files, are you sure you want to delete?",
  ),
  EmptyRecycleBinError: l10n.t("Unable to empty the recycle bin."),
  EmptyRecycleBinWarningMessage: l10n.t(
    "Are you sure you want to permanently delete all the items? You cannot undo this action.",
  ),
  FileDeletionError: l10n.t("Unable to delete file."),
  FileDownloadError: l10n.t("Unable to download files."),
  FileDragFromFavorites: l10n.t("Unable to drag files from my favorites."),
  FileDragFromTrashError: l10n.t("Unable to drag files from trash."),
  FileDropError: l10n.t('Unable to drop item "{name}".'),
  FileNavigationRootAdminError: l10n.t(
    "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.",
  ),
  FileNavigationRootUserError: l10n.t(
    "The files cannot be accessed from the specified path.",
  ),
  FileOpenError: l10n.t("The file type is unsupported."),
  FileRestoreError: l10n.t("Unable to restore file."),
  FileUploadError: l10n.t("Unable to upload files."),
  FileValidationError: l10n.t("Invalid file name."),
  FolderDeletionError: l10n.t("Unable to delete folder."),
  FolderRestoreError: l10n.t("Unable to restore folder."),
  FolderValidationError: l10n.t(
    "The folder name cannot contain more than 100 characters or have invalid characters.",
  ),
  NewFileCreationError: l10n.t('Unable to create file "{name}".'),
  NewFilePrompt: l10n.t("Enter a file name."),
  NewFileTitle: l10n.t("New File"),
  NewFolderCreationError: l10n.t('Unable to create folder "{name}".'),
  NewFolderPrompt: l10n.t("Enter a folder name."),
  NewFolderTitle: l10n.t("New Folder"),
  RemoveFromFavoritesError: l10n.t(
    "The item could not be removed from My Favorites.",
  ),
  RenameError: l10n.t('Unable to rename "{oldName}" to "{newName}".'),
  RenameFileTitle: l10n.t("Rename File"),
  RenameFolderTitle: l10n.t("Rename Folder"),
  RenamePrompt: l10n.t("Enter a new name."),
  RenameUnsavedFileError: l10n.t(
    "You must save your file before you can rename it.",
  ),
  ConvertNotebookToFlowPrompt: l10n.t("Enter a name for the new .flw file"),
  NotebookToFlowConversionSuccess: l10n.t(
    "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.",
  ),
  NotebookToFlowConversionError: l10n.t(
    "Error converting the notebook file to .flw format.",
  ),
  NoCodeToConvert: l10n.t(
    "The notebook file does not contain any code to convert.",
  ),
  InvalidFlowFileNameError: l10n.t(
    "The output file name must end with the .flw extension.",
  ),
  StudioConnectionError: l10n.t("Cannot connect to SAS Studio service"),
};


================================================
FILE: client/src/components/ContentNavigator/convert.ts
================================================
// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { Uri, authentication, l10n, workspace } from "vscode";

import axios, { AxiosInstance } from "axios";
import { basename } from "path";
import { v4 } from "uuid";

import {
  associateFlowObject,
  createStudioSession,
} from "../../connection/studio";
import { SASAuthProvider } from "../AuthProvider";
import { ContentModel } from "./ContentModel";
import { MYFOLDER_TYPE, Messages } from "./const";
import { ContentItem, ContentSourceType } from "./types";
import { isContentItem } from "./utils";

const stepRef: Record<string, string> = {
  sas: "a7190700-f59c-4a94-afe2-214ce639fcde",
  sql: "a7190700-f59c-4a94-afe2-214ce639fcde",
  python: "ab59f8c4-af9a-4608-a5d5-a8365357bb99",
  r: "ab59f8c4-af9a-4608-a5d5-a8365357bb99",
};

const stepTitle: Record<string, string> = {
  sas: l10n.t("SAS Program"),
  sql: l10n.t("SQL Program"),
  python: l10n.t("Python Program"),
  r: l10n.t("R Program"),
};

const NODE_SPACING = 150;

interface Entry {
  language: string;
  code: string;
}

function getPropPort(idx: number, inputList: Entry[]): Record<string, string> {
  if (idx === 0) {
    return {
      "UI_PROP_PORT_DESCRIPTION|outTables|0": "Output tables",
      "UI_PROP_PORT_LABEL|outTables|0": "Output table 1",
    };
  }

  if (idx === inputList.length - 1) {
    return {
      "UI_PROP_PORT_DESCRIPTION|inTables|0": "Input tables",
      "UI_PROP_PORT_LABEL|inTables|0": "Input table 1",
    };
  }

  return {
    "UI_PROP_PORT_DESCRIPTION|inTables|0": "Input tables",
    "UI_PROP_PORT_LABEL|inTables|0": "Input table 1",
    "UI_PROP_PORT_DESCRIPTION|outTables|0": "Output tables",
    "UI_PROP_PORT_LABEL|outTables|0": "Output table 1",
  };
}

const baseFlow = {
  creationTimeStamp: "",
  modifiedTimeStamp: "",
  createdBy: "",
  modifiedBy: "",
  version: 2,
  id: null,
  name: "",
  description: null,
  properties: {
    UI_PROP_DF_OPTIMIZE: "false",
    UI_PROP_DF_ID: null,
    UI_PROP_DF_EXECUTION_ORDERED: "false",
  },
  links: [],
  nodes: {},
  parameters: {},
  connections: [],
  extendedProperties: {},
  stickyNotes: [],
};

const baseSwimlane = {
  dataFlowAndBindings: {
    dataFlow: {},
    executionBindings: {
      arguments: {
        __NO_OPTIMIZE: {
          argumentType: "string",
          value: "true",
          version: 1,
        },
      },
      contextId: null,
      environmentId: "compute",
      sessionId: null,
      tempTablePrefix: null,
    },
  },
  id: null,
  name: null,
  nodeType: "dataFlow",
  portMappings: [],
  priority: 0,
  properties: {
    UI_PROP_IS_EXPANDED: "true",
    UI_PROP_IS_SWIMLANE: "true",
  },
  version: 1,
};

const baseNode = {
  nodeType: "step",
  version: 1,
  id: null,
  name: null,
  note: {
    version: 1,
    id: null,
    name: null,
    description: null,
    properties: {
      UI_NOTE_PROP_HEIGHT: "0",
      UI_NOTE_PROP_IS_EXPANDED: "false",
      UI_NOTE_PROP_IS_STICKYNOTE: "false",
      UI_NOTE_PROP_WIDTH: "0",
    },
  },
  priority: 0,
  properties: {
    UI_PROP_COLORGRP: "0",
    UI_PROP_IS_INPUT_EXPANDED: "false",
    UI_PROP_IS_OUTPUT_EXPANDED: "false",
    UI_PROP_NODE_DATA_ID: null,
    UI_PROP_NODE_DATA_MODIFIED_DATE: null,
    UI_PROP_XPOS: "0",
    UI_PROP_YPOS: "75",
  },
  portMappings: [
    {
      mappingType: "tableStructure",
      portIndex: 0,
      portName: "outTables",
      tableStructure: {
        columnDefinitions: null,
      },
    },
  ],
  stepReference: {
    type: "uri",
    path: null,
  },
  arguments: {
    codeOptions: {
      code: null,
      contentType: "embedded",
      logHTML: "",
      resultsHTML: "",
      variables: [
        {
          name: "_input1",
          value: {
            portIndex: 0,
            portName: "inTables",
            referenceType: "inputPort",
          },
        },
        {
          name: "_output1",
          value: {
            arguments: {},
            portIndex: 0,
            portName: "outTables",
            referenceType: "outputPort",
          },
        },
      ],
    },
  },
};

function generateFlowDataNode(inputList: Entry[], outputFile: string) {
  const now = new Date();
  const nowString = now.toISOString();
  const nowTimestamp = String(now.getTime());
  const arrayIdNode: string[] = [];

  const flowData = { ...baseFlow };
  flowData.creationTimeStamp = nowString;
  flowData.modifiedTimeStamp = nowString;
  flowData.name = outputFile;
  flowData.properties = {
    ...baseFlow.properties,
    UI_PROP_DF_ID: "120081fc-2d7f-4cfc-bcd3-47f9684e9763",
  };
  flowData.nodes = {};
  flowData.connections = [];

  for (let idx = 0; idx < inputList.length; idx++) {
    const idNode = v4();
    const idNote = v4();
    const entry = inputList[idx];
    const propPorts = getPropPort(idx, inputList);

    const stepNode = {
      ...baseNode,
      id: idNode,
      name: stepTitle[entry.language],
      note: {
        ...baseNode.note,
        id: idNote,
      },
      priority: idx,
      properties: {
        ...baseNode.properties,
        ...propPorts,
        UI_PROP_NODE_DATA_ID: stepRef[entry.language],
        UI_PROP_NODE_DATA_MODIFIED_DATE: nowTimestamp,
        UI_PROP_XPOS: ((idx + 1) * NODE_SPACING).toString(),
      },
      stepReference: {
        ...baseNode.stepReference,
        path: `/dataFlows/steps/${stepRef[entry.language]}`,
      },
      arguments: {
        ...baseNode.arguments,
        codeOptions: {
          ...baseNode.arguments.codeOptions,
          code: entry.code,
        },
      },
    };

    flowData.nodes[idNode] = stepNode;
    arrayIdNode.push(idNode);

    if (idx > 0) {
      const connection = {
        sourcePort: {
          node: arrayIdNode[idx - 1],
          portName: "outTables",
          index: 0,
        },
        targetPort: {
          node: arrayIdNode[idx],
          portName: "inTables",
          index: 0,
        },
      };
      flowData.connections.push(connection);
    }
  }
  return flowData;
}

function generateFlowDataSwimlane(inputList: Entry[], outputFile: string) {
  const now = new Date();
  const nowString = now.toISOString();

  const flowData = { ...baseFlow };
  flowData.creationTimeStamp = nowString;
  flowData.modifiedTimeStamp = nowString;
  flowData.name = outputFile;
  flowData.properties = {
    ...baseFlow.properties,
    UI_PROP_DF_ID: "58e4d421-705d-448c-b397-cc8c9fab6c48",
    UI_PROP_DF_EXECUTION_ORDERED: "true",
  };
  flowData.nodes = {};
  flowData.connections = [];

  for (let idx = 0; idx < inputList.length; idx++) {
    const swimlaneName = "Notebook Cell " + (idx + 1).toString();
    const idNode = v4();
    const swimlane = {
      ...baseSwimlane,
      id: idNode,
      name: swimlaneName,
      priority: idx + 1,
      dataFlowAndBindings: {
        ...baseSwimlane.dataFlowAndBindings,
        dataFlow: generateFlowDataNode([inputList[idx]], null),
      },
    };
    flowData.nodes[idNode] = swimlane;
  }
  return flowData;
}

function generateFlowData(inputList: Entry[], outputFile: string) {
  const flowConversionMode = workspace
    .getConfiguration("SAS")
    .get("flowConversionMode");
  if (flowConversionMode === "Node") {
    return generateFlowDataNode(inputList, outputFile);
  }
  return generateFlowDataSwimlane(inputList, outputFile);
}

function generateCodeListFromSASNotebook(content: string): Entry[] {
  const codeList = [];
  try {
    const notebookContent = JSON.parse(content);
    for (const cell of notebookContent) {
      let code = cell.value;
      if (code !== "") {
        const language = cell.language;
        if (["python", "sas", "sql", "r"].includes(language)) {
          if (language === "sql") {
            code = `PROC SQL;
${code};
QUIT;`;
          }
          codeList.push({ code, language });
        }
      }
    }
  } catch (error) {
    console.error("Error reading or parsing the .sasnb file:", error);
  }
  return codeList;
}

export function convertNotebookToFlow(
  content: string,
  inputName: string,
  outputName: string,
): string {
  let codeList = [];
  if (inputName.endsWith(".sasnb")) {
    codeList = generateCodeListFromSASNotebook(content);
  } else {
    console.error("Unsupported file type");
  }
  const flowData = generateFlowData(codeList, outputName);
  // encode json to utf8 bytes without new lines and spaces
  const flowDataString = JSON.stringify(flowData, null, 0);
  return flowDataString;
}

export class NotebookToFlowConverter {
  protected studioSessionId: string;
  protected connection: AxiosInstance;

  public constructor(
    protected readonly resource: ContentItem | Uri,
    protected readonly contentModel: ContentModel,
    protected readonly viyaEndpoint: string,
    protected readonly sourceType: ContentSourceType,
  ) {}

  public get inputName() {
    return isContentItem(this.resource)
      ? this.resource.name
      : basename(this.resource.fsPath);
  }

  private async parent() {
    const parentItem = isContentItem(this.resource)
      ? await this.contentModel.getParent(this.resource)
      : undefined;

    if (parentItem) {
      return parentItem;
    }

    const rootFolders = await this.contentModel.getChildren();
    const myFolder = rootFolders.find(
      (rootFolder) => rootFolder.type === MYFOLDER_TYPE,
    );
    if (!myFolder) {
      return undefined;
    }

    return myFolder;
  }

  public async content() {
    return isContentItem(this.resource)
      ? await this.contentModel.getContentByUri(this.resource.vscUri)
      : (await workspace.fs.readFile(this.resource)).toString();
  }

  public async establishConnection() {
    this.connection = axios.create({ baseURL: this.viyaEndpoint });
    const session = await authentication.getSession(SASAuthProvider.id, [], {
      createIfNone: true,
    });
    this.connection.defaults.headers.common.Authorization = `Bearer ${session.accessToken}`;

    try {
      const result = await createStudioSession(this.connection);
      this.studioSessionId = result;
      // eslint-disable-next-line @typescript-eslint/no-unused-vars
    } catch (error) {
      this.studioSessionId = "";
    }

    return this.studioSessionId;
  }

  public async convert(outputName: string) {
    const flowDataString = convertNotebookToFlow(
      await this.content(),
      this.inputName,
      outputName,
    );
    const flowDataUint8Array = new TextEncoder().encode(flowDataString);
    if (flowDataUint8Array.length === 0) {
      throw new Error(Messages.NoCodeToConvert);
    }

    const parentItem = await this.parent();
    const newItem = await this.contentModel.createUniqueFileOfPrefix(
      parentItem,
      outputName,
      flowDataUint8Array,
    );
    if (!newItem) {
      throw new Error(
        l10n.t(Messages.NewFileCreationError, { name: this.inputName }),
      );
    }

    // We don't need to associate the flow object if it's stored in sas server
    if (this.sourceType === ContentSourceType.SASServer) {
      return {
        parentItem,
        folderName: parentItem.uri.split("/").pop().replace(/~fs~/g, "/"),
      };
    }

    // associate the new .flw file with SAS Studio
    const folderName = await associateFlowObject(
      outputName,
      newItem.resourceId,
      parentItem.resourceId,
      this.studioSessionId,
      this.connection,
    );

    return { folderName, parentItem };
  }
}


================================================
FILE: client/src/components/ContentNavigator/index.ts
================================================
// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import {
  ConfigurationChangeEvent,
  Disposable,
  Event,
  ExtensionContext,
  OpenDialogOptions,
  ProgressLocation,
  Uri,
  commands,
  env,
  l10n,
  window,
  workspace,
} from "vscode";

import { profileConfig } from "../../commands/profile";
import { SubscriptionProvider } from "../SubscriptionProvider";
import { ConnectionType, ProfileWithFileRootOptions } from "../profile";
import { treeViewSelections } from "../utils/treeViewSelections";
import ContentAdapterFactory from "./ContentAdapterFactory";
import ContentDataProvider from "./ContentDataProvider";
import { ContentModel } from "./ContentModel";
import { Messages } from "./const";
import { NotebookToFlowConverter } from "./convert";
import {
  ContentAdapter,
  ContentItem,
  ContentNavigatorConfig,
  ContentSourceType,
  FileManipulationEvent,
} from "./types";
import { isContainer as getIsContainer } from "./utils";

const fileValidator = (value: string): string | null =>
  /^([^/<>;\\{}]+)\.\w+$/.test(
    // file service does not allow /, <, >, ;, \, {, }
    value,
  )
    ? null
    : Messages.FileValidationError;

const flowFileValidator = (value: string): string | null => {
  let res = fileValidator(value);
  if (!value.endsWith(".flw")) {
    res = Messages.InvalidFlowFileNameError;
  }
  return res;
};

const folderValidator = (
  value: string,
  sourceType: ContentSourceType,
): string | null => {
  const regex =
    sourceType === ContentSourceType.SASServer
      ? new RegExp(/[:/?\\*"|<>]/g)
      : new RegExp(/[/;\\{}<>]/g);

  return value.length <= 100 && !regex.test(value)
    ? null
    : Messages.FolderValidationError;
};

class ContentNavigator implements SubscriptionProvider {
  private contentDataProvider: ContentDataProvider;
  private contentModel: ContentModel;
  private sourceType: ContentNavigatorConfig["sourceType"];
  private treeIdentifier: ContentNavigatorConfig["treeIdentifier"];

  constructor(context: ExtensionContext, config: ContentNavigatorConfig) {
    this.sourceType = config.sourceType;
    this.treeIdentifier = config.treeIdentifier;
    this.contentModel = new ContentModel(
      this.contentAdapterForConnectionType(),
    );
    this.contentDataProvider = new ContentDataProvider(
      this.contentModel,
      context.extensionUri,
      config,
    );

    workspace.registerFileSystemProvider(
      config.sourceType,
      this.contentDataProvider,
    );
    workspace.registerTextDocumentContentProvider(
      `${config.sourceType}ReadOnly`,
      this.contentDataProvider,
    );
  }

  get onDidManipulateFile(): Event<FileManipulationEvent> {
    return this.contentDataProvider.onDidManipulateFile;
  }

  public getSubscriptions(): Disposable[] {
    const SAS = `SAS.${this.sourceType === ContentSourceType.SASContent ? "content" : "server"}`;
    return [
      ...this.contentDataProvider.getSubscriptions(),
      commands.registerCommand(
        `${SAS}.deleteResource`,
        async (item: ContentItem) => {
          this.getTreeViewSelections(item).forEach(
            async (resource: ContentItem) => {
              if (!resource.contextValue.includes("delete")) {
                return;
              }
              const isContainer = getIsContainer(resource);
              const hasUnsavedFiles = isContainer
                ? await this.contentDataProvider.checkFolderDirty(resource)
                : false;
              const moveToRecycleBin =
                this.contentDataProvider.canRecycleResource(resource);

              if (
                !moveToRecycleBin &&
                !(await window.showWarningMessage(
                  l10n.t(Messages.DeleteWarningMessage, {
                    name: resource.name,
                  }),
                  { modal: true },
                  Messages.DeleteButtonLabel,
                ))
              ) {
                return;
              } else if (moveToRecycleBin && hasUnsavedFiles) {
                if (
                  !(await window.showWarningMessage(
                    l10n.t(Messages.RecycleDirtyFolderWarning, {
                      name: resource.name,
                    }),
                    { modal: true },
                    Messages.MoveToRecycleBinLabel,
                  ))
                ) {
                  return;
                }
              }
              const deleteResult = moveToRecycleBin
                ? await this.contentDataProvider.recycleResource(resource)
                : await this.contentDataProvider.deleteResource(resource);
              if (!deleteResult) {
                window.showErrorMessage(
                  isContainer
                    ? Messages.FolderDeletionError
                    : Messages.FileDeletionError,
                );
              }
            },
          );
        },
      ),
      commands.registerCommand(
        `${SAS}.restoreResource`,
        async (item: ContentItem) => {
          this.getTreeViewSelections(item).forEach(
            async (resource: ContentItem) => {
              const isContainer = getIsContainer(resource);
              if (!(await this.contentDataProvider.restoreResource(resource))) {
                window.showErrorMessage(
                  isContainer
                    ? Messages.FolderRestoreError
                    : Messages.FileRestoreError,
                );
              }
            },
          );
        },
      ),
      commands.registerCommand(`${SAS}.emptyRecycleBin`, async () => {
        if (
          !(await window.showWarningMessage(
            Messages.EmptyRecycleBinWarningMessage,
            { modal: true },
            Messages.DeleteButtonLabel,
          ))
        ) {
          return;
        }
        if (!(await this.contentDataProvider.emptyRecycleBin())) {
          window.showErrorMessage(Messages.EmptyRecycleBinError);
        }
      }),
      commands.registerCommand(`${SAS}.refreshContent`, () =>
        this.contentDataProvider.refresh(),
      ),
      commands.registerCommand(
        `${SAS}.addFileResource`,
        async (resource: ContentItem) => {
          const fileName = await window.showInputBox({
            prompt: Messages.NewFilePrompt,
            title: Messages.NewFileTitle,
            validateInput: fileValidator,
          });
          if (!fileName) {
            return;
          }

          const newUri = await this.contentDataProvider.createFile(
            resource,
            fileName,
          );
          this.contentDataProvider.handleCreationResponse(
            resource,
            newUri,
            l10n.t(Messages.NewFileCreationError, { name: fileName }),
          );

          if (newUri) {
            await commands.executeCommand("vscode.open", newUri);
          }
        },
      ),
      commands.registerCommand(
        `${SAS}.addFolderResource`,
        async (resource: ContentItem) => {
          const folderName = await window.showInputBox({
            prompt: Messages.NewFolderPrompt,
            title: Messages.NewFolderTitle,
            validateInput: (folderName) =>
              folderValidator(folderName, this.sourceType),
          });
          if (!folderName) {
            return;
          }

          const newUri = await this.contentDataProvider.createFolder(
            resource,
            folderName,
          );
          this.contentDataProvider.handleCreationResponse(
            resource,
            newUri,
            l10n.t(Messages.NewFolderCreationError, { name: folderName }),
          );
        },
      ),
      commands.registerCommand(
        `${SAS}.renameResource`,
        async (resource: ContentItem) => {
          const isContainer = getIsContainer(resource);

          const name = await window.showInputBox({
            prompt: Messages.RenamePrompt,
            title: isContainer
              ? Messages.RenameFolderTitle
              : Messages.RenameFileTitle,
            value: resource.name,
            validateInput: isContainer
              ? (value) => folderValidator(value, this.sourceType)
              : fileValidator,
          });
          if (!name || name === resource.name) {
            return;
          }

          const newUri = await this.contentDataProvider.renameResource(
            resource,
            name,
          );

          if (!newUri) {
            window.showErrorMessage(
              l10n.t(Messages.RenameError, {
                oldName: resource.name,
                newName: name,
              }),
            );
            return;
          }

          this.contentDataProvider.refresh();
        },
      ),
      commands.registerCommand(
        `${SAS}.addToFavorites`,
        async (item: ContentItem) => {
          this.getTreeViewSelections(item).forEach(
            async (resource: ContentItem) => {
              if (
                !(await this.contentDataProvider.addToMyFavorites(resource))
              ) {
                window.showErrorMessage(Messages.AddToFavoritesError);
              }
            },
          );
        },
      ),
      commands.registerCommand(
        `${SAS}.removeFromFavorites`,
        async (item: ContentItem) => {
          this.getTreeViewSelections(item).forEach(
            async (resource: ContentItem) => {
              if (
                !(await this.contentDataProvider.removeFromMyFavorites(
                  resource,
                ))
              ) {
                window.showErrorMessage(Messages.RemoveFromFavoritesError);
              }
            },
          );
        },
      ),
      commands.registerCommand(
        `${SAS}.collapseAllContent`,
        this.collapseAllContent.bind(this),
      ),
      commands.registerCommand(
        `${SAS}.convertNotebookToFlow`,
        async (resource: ContentItem | Uri) => {
          await this.contentModel.connect(this.viyaEndpoint());
          const notebookToFlowConverter = new NotebookToFlowConverter(
            resource,
            this.contentModel,
            this.viyaEndpoint(),
            this.sourceType,
          );

          const inputName = notebookToFlowConverter.inputName;
          // Open window to chose the name and location of the new .flw file
          const outputName = await window.showInputBox({
            prompt: Messages.ConvertNotebookToFlowPrompt,
            value: inputName.replace(".sasnb", ".flw"),
            validateInput: flowFileValidator,
          });

          if (!outputName) {
            // User canceled the input box
            return;
          }

          await window.withProgress(
            {
              location: ProgressLocation.Notification,
              title: l10n.t("Converting SAS notebook to flow..."),
            },
            async () => {
              if (!(await notebookToFlowConverter.establishConnection())) {
                window.showErrorMessage(Messages.StudioConnectionError);
                return;
              }

              let parentItem;
              try {
                const response =
                  await notebookToFlowConverter.convert(outputName);
                parentItem = response.parentItem;
                if (!response.folderName) {
                  throw new Error(Messages.NotebookToFlowConversionError);
                }

                window.showInformationMessage(
                  l10n.t(Messages.NotebookToFlowConversionSuccess, {
                    folderName: response.folderName,
                  }),
                );

                this.contentDataProvider.refresh();
              } catch (e) {
                window.showErrorMessage(e.message);
                this.contentDataProvider.reveal(parentItem);
              }
            },
          );
        },
      ),
      commands.registerCommand(
        `${SAS}.downloadResource`,
        async (resource: ContentItem) => {
          const selections = this.getTreeViewSelections(resource);
          const uris = await window.showOpenDialog({
            title: l10n.t("Choose where to save your files."),
            openLabel: l10n.t("Save"),
            canSelectFolders: true,
            canSelectFiles: false,
            canSelectMany: false,
          });
          const uri = uris && uris.length > 0 ? uris[0] : undefined;

          if (!uri) {
            return;
          }

          await window.withProgress(
            {
              location: ProgressLocation.Notification,
              title: l10n.t("Downloading files..."),
            },
            async () => {
              await this.contentDataProvider.downloadContentItems(
                uri,
                selections,
                this.contentDataProvider.treeView.selection,
              );
            },
          );
        },
      ),
      // Below, we have three commands to upload files. Mac is currently the only
      // platform that supports uploading both files and folders. So, for any platform
      // that isn't Mac, we list a distinct upload file(s) or upload folder(s) command.
      // See the `OpenDialogOptions` interface for more information.
      commands.registerCommand(
        `${SAS}.uploadResource`,
        async (resource: ContentItem) => this.uploadResource(resource),
      ),
      commands.registerCommand(
        `${SAS}.uploadFileResource`,
        async (resource: ContentItem) =>
          this.uploadResource(resource, { canSelectFolders: false }),
      ),
      commands.registerCommand(
        `${SAS}.uploadFolderResource`,
        async (resource: ContentItem) =>
          this.uploadResource(resource, { canSelectFiles: false }),
      ),
      commands.registerCommand(
        `${SAS}.copyPath`,
        async (resource: ContentItem) => {
          const path = await this.contentDataProvider.getPathOfItem(resource);
          if (path) {
            await env.clipboard.writeText(path);
          }
        },
      ),
      workspace.onDidChangeConfiguration(
        async (event: ConfigurationChangeEvent) => {
          if (event.affectsConfiguration("SAS.connectionProfiles")) {
            const endpoint = this.viyaEndpoint();
            this.collapseAllContent();
            const contentModel = new ContentModel(
              this.contentAdapterForConnectionType(),
            );
            this.contentDataProvider.useModel(contentModel);
            this.contentModel = contentModel;
            if (endpoint) {
              await this.contentDataProvider.connect(endpoint);
            } else {
              await this.contentDataProvider.refresh();
            }
          }
        },
      ),
    ];
  }

  private async collapseAllContent() {
    const collapeAllCmd = `workbench.actions.treeView.${this.treeIdentifier}.collapseAll`;
    const commandExists = (await commands.getCommands()).find(
      (c) => c === collapeAllCmd,
    );
    if (commandExists) {
      commands.executeCommand(collapeAllCmd);
    }
  }

  private async uploadResource(
    resource: ContentItem,
    openDialogOptions: Partial<OpenDialogOptions> = {},
  ) {
    const uris: Uri[] = await window.showOpenDialog({
      canSelectFolders: true,
      canSelectMany: true,
      canSelectFiles: true,
      ...openDialogOptions,
    });
    if (!uris) {
      return;
    }

    await window.withProgress(
      {
        location: ProgressLocation.Notification,
        title: l10n.t("Uploading files..."),
      },
      async () => {
        await this.contentDataProvider.uploadUrisToTarget(uris, resource);
      },
    );
  }

  private viyaEndpoint(): string {
    const activeProfile = profileConfig.getProfileByName(
      profileConfig.getActiveProfile(),
    );
    return activeProfile &&
      activeProfile.connectionType === ConnectionType.Rest &&
      !activeProfile.serverId
      ? activeProfile.endpoint
      : "";
  }

  private getTreeViewSelections(item: ContentItem): ContentItem[] {
    const items = treeViewSelections(this.contentDataProvider.treeView, item);

    const uris: string[] = items.map(({ uri }: ContentItem) => uri);

    // If we have a selection that is a child of something we've already selected,
    // lets filter it out (i.e. we don't need to include it twice)
    return items.filter(
      ({ parentFolderUri }: ContentItem) => !uris.includes(parentFolderUri),
    );
  }

  private contentAdapterForConnectionType(): ContentAdapter | undefined {
    const activeProfile = profileConfig.getProfileByName(
      profileConfig.getActiveProfile(),
    );

    if (!activeProfile) {
      return;
    }

    const profileWithFileRootOptions = getProfileWithFileRootOptions();
    return new ContentAdapterFactory().create(
      activeProfile.connectionType,
      profileWithFileRootOptions?.fileNavigationCustomRootPath,
      profileWithFileRootOptions?.fileNavigationRoot,
      this.sourceType,
    );

    function getProfileWithFileRootOptions():
      | ProfileWithFileRootOptions
      | undefined {
      switch (activeProfile.connectionType) {
        case ConnectionType.Rest:
        case ConnectionType.IOM:
        case ConnectionType.COM:
          return activeProfile;
        default:
          return undefined;
      }
    }
  }
}

export default ContentNavigator;


================================================
FILE: client/src/components/ContentNavigator/mime-types.ts
================================================
// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

// Taken from https://github.com/micnic/mime.json
export default {
  "123": "application/vnd.lotus-1-2-3",
  "1km": "application/vnd.1000minds.decision-model+xml",
  "3dml": "text/vnd.in3d.3dml",
  "3ds": "image/x-3ds",
  "3g2": "video/3gpp2",
  "3gp": "video/3gpp",
  "3gpp": "video/3gpp",
  "3mf": "model/3mf",
  "7z": "application/x-7z-compressed",
  aab: "application/x-authorware-bin",
  aac: "audio/x-aac",
  aam: "application/x-authorware-map",
  aas: "application/x-authorware-seg",
  abw: "application/x-abiword",
  ac: "application/vnd.nokia.n-gage.ac+xml",
  acc: "application/vnd.americandynamics.acc",
  ace: "application/x-ace-compressed",
  acu: "application/vnd.acucobol",
  acutc: "application/vnd.acucorp",
  adp: "audio/adpcm",
  adts: "audio/aac",
  aep: "application/vnd.audiograph",
  afm: "application/x-font-type1",
  afp: "application/vnd.ibm.modcap",
  age: "application/vnd.age",
  ahead: "application/vnd.ahead.space",
  ai: "application/postscript",
  aif: "audio/x-aiff",
  aifc: "audio/x-aiff",
  aiff: "audio/x-aiff",
  air: "application/vnd.adobe.air-application-installer-package+zip",
  ait: "application/vnd.dvb.ait",
  ami: "application/vnd.amiga.ami",
  aml: "application/automationml-aml+xml",
  amlx: "application/automationml-amlx+zip",
  amr: "audio/amr",
  apk: "application/vnd.android.package-archive",
  apng: "image/apng",
  appcache: "text/cache-manifest",
  appinstaller: "application/appinstaller",
  application: "application/x-ms-application",
  appx: "application/appx",
  appxbundle: "application/appxbundle",
  apr: "application/vnd.lotus-approach",
  arc: "application/x-freearc",
  arj: "application/x-arj",
  asc: "application/pgp-signature",
  asf: "video/x-ms-asf",
  asm: "text/x-asm",
  aso: "application/vnd.accpac.simply.aso",
  asx: "video/x-ms-asf",
  atc: "application/vnd.acucorp",
  atom: "application/atom+xml",
  atomcat: "application/atomcat+xml",
  atomdeleted: "application/atomdeleted+xml",
  atomsvc: "application/atomsvc+xml",
  atx: "application/vnd.antix.game-component",
  au: "audio/basic",
  avci: "image/avci",
  avcs: "image/avcs",
  avi: "video/x-msvideo",
  avif: "image/avif",
  aw: "application/applixware",
  azf: "application/vnd.airzip.filesecure.azf",
  azs: "application/vnd.airzip.filesecure.azs",
  azv: "image/vnd.airzip.accelerator.azv",
  azw: "application/vnd.amazon.ebook",
  b16: "image/vnd.pco.b16",
  bat: "application/x-msdownload",
  bcpio: "application/x-bcpio",
  bdf: "application/x-font-bdf",
  bdm: "application/vnd.syncml.dm+wbxml",
  bdoc: "application/x-bdoc",
  bed: "application/vnd.realvnc.bed",
  bh2: "application/vnd.fujitsu.oasysprs",
  bin: "application/octet-stream",
  blb: "application/x-blorb",
  blorb: "application/x-blorb",
  bmi: "application/vnd.bmi",
  bmml: "application/vnd.balsamiq.bmml+xml",
  bmp: "image/x-ms-bmp",
  book: "application/vnd.framemaker",
  box: "application/vnd.previewsystems.box",
  boz: "application/x-bzip2",
  bpk: "application/octet-stream",
  bsp: "model/vnd.valve.source.compiled-map",
  btf: "image/prs.btif",
  btif: "image/prs.btif",
  buffer: "application/octet-stream",
  bz: "application/x-bzip",
  bz2: "application/x-bzip2",
  c: "text/x-c",
  c11amc: "application/vnd.cluetrust.cartomobile-config",
  c11amz: "application/vnd.cluetrust.cartomobile-config-pkg",
  c4d: "application/vnd.clonk.c4group",
  c4f: "application/vnd.clonk.c4group",
  c4g: "application/vnd.clonk.c4group",
  c4p: "application/vnd.clonk.c4group",
  c4u: "application/vnd.clonk.c4group",
  cab: "application/vnd.ms-cab-compressed",
  caf: "audio/x-caf",
  cap: "application/vnd.tcpdump.pcap",
  car: "application/vnd.curl.car",
  cat: "application/vnd.ms-pki.seccat",
  cb7: "application/x-cbr",
  cba: "application/x-cbr",
  cbr: "application/x-cbr",
  cbt: "application/x-cbr",
  cbz: "application/x-cbr",
  cc: "text/x-c",
  cco: "application/x-cocoa",
  cct: "application/x-director",
  ccxml: "application/ccxml+xml",
  cdbcmsg: "application/vnd.contact.cmsg",
  cdf: "application/x-netcdf",
  cdfx: "application/cdfx+xml",
  cdkey: "application/vnd.mediastation.cdkey",
  cdmia: "application/cdmi-capability",
  cdmic: "application/cdmi-container",
  cdmid: "application/cdmi-domain",
  cdmio: "application/cdmi-object",
  cdmiq: "application/cdmi-queue",
  cdx: "chemical/x-cdx",
  cdxml: "application/vnd.chemdraw+xml",
  cdy: "application/vnd.cinderella",
  cer: "application/pkix-cert",
  cfs: "application/x-cfs-compressed",
  cgm: "image/cgm",
  chat: "application/x-chat",
  chm: "application/vnd.ms-htmlhelp",
  chrt: "application/vnd.kde.kchart",
  cif: "chemical/x-cif",
  cii: "application/vnd.anser-web-certificate-issue-initiation",
  cil: "application/vnd.ms-artgalry",
  cjs: "application/node",
  cla: "application/vnd.claymore",
  class: "application/java-vm",
  cld: "model/vnd.cld",
  clkk: "application/vnd.crick.clicker.keyboard",
  clkp: "application/vnd.crick.clicker.palette",
  clkt: "application/vnd.crick.clicker.template",
  clkw: "application/vnd.crick.clicker.wordbank",
  clkx: "application/vnd.crick.clicker",
  clp: "application/x-msclip",
  cmc: "application/vnd.cosmocaller",
  cmdf: "chemical/x-cmdf",
  cml: "chemical/x-cml",
  cmp: "application/vnd.yellowriver-custom-menu",
  cmx: "image/x-cmx",
  cod: "application/vnd.rim.cod",
  coffee: "text/coffeescript",
  com: "application/x-msdownload",
  conf: "text/plain",
  cpio: "application/x-cpio",
  cpl: "application/cpl+xml",
  cpp: "text/x-c",
  cpt: "application/mac-compactpro",
  crd: "application/x-mscardfile",
  crl: "application/pkix-crl",
  crt: "application/x-x509-ca-cert",
  crx: "application/x-chrome-extension",
  cryptonote: "application/vnd.rig.cryptonote",
  csh: "application/x-csh",
  csl: "application/vnd.citationstyles.style+xml",
  csml: "chemical/x-csml",
  csp: "application/vnd.commonspace",
  css: "text/css",
  cst: "application/x-director",
  csv: "text/csv",
  cu: "application/cu-seeme",
  curl: "text/vnd.curl",
  cwl: "application/cwl",
  cww: "application/prs.cww",
  cxt: "application/x-director",
  cxx: "text/x-c",
  dae: "model/vnd.collada+xml",
  daf: "application/vnd.mobius.daf",
  dart: "application/vnd.dart",
  dataless: "application/vnd.fdsn.seed",
  davmount: "application/davmount+xml",
  dbf: "application/vnd.dbf",
  dbk: "application/docbook+xml",
  dcr: "application/x-director",
  dcurl: "text/vnd.curl.dcurl",
  dd2: "application/vnd.oma.dd2+xml",
  ddd: "application/vnd.fujixerox.ddd",
  ddf: "application/vnd.syncml.dmddf+xml",
  dds: "image/vnd.ms-dds",
  deb: "application/x-debian-package",
  def: "text/plain",
  deploy: "application/octet-stream",
  der: "application/x-x509-ca-cert",
  dfac: "application/vnd.dreamfactory",
  dgc: "application/x-dgc-compressed",
  dib: "image/bmp",
  dic: "text/x-c",
  dir: "application/x-director",
  dis: "application/vnd.mobius.dis",
  "disposition-notification": "message/disposition-notification",
  dist: "application/octet-stream",
  distz: "application/octet-stream",
  djv: "image/vnd.djvu",
  djvu: "image/vnd.djvu",
  dll: "application/x-msdownload",
  dmg: "application/x-apple-diskimage",
  dmp: "application/vnd.tcpdump.pcap",
  dms: "application/octet-stream",
  dna: "application/vnd.dna",
  doc: "application/msword",
  docm: "application/vnd.ms-word.document.macroenabled.12",
  docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
  dot: "application/msword",
  dotm: "application/vnd.ms-word.template.macroenabled.12",
  dotx: "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
  dp: "application/vnd.osgi.dp",
  dpg: "application/vnd.dpgraph",
  dpx: "image/dpx",
  dra: "audio/vnd.dra",
  drle: "image/dicom-rle",
  dsc: "text/prs.lines.tag",
  dssc: "application/dssc+der",
  dtb: "application/x-dtbook+xml",
  dtd: "application/xml-dtd",
  dts: "audio/vnd.dts",
  dtshd: "audio/vnd.dts.hd",
  dump: "application/octet-stream",
  dvb: "video/vnd.dvb.file",
  dvi: "application/x-dvi",
  dwd: "application/atsc-dwd+xml",
  dwf: "model/vnd.dwf",
  dwg: "image/vnd.dwg",
  dxf: "image/vnd.dxf",
  dxp: "application/vnd.spotfire.dxp",
  dxr: "application/x-director",
  ear: "application/java-archive",
  ecelp4800: "audio/vnd.nuera.ecelp4800",
  ecelp7470: "audio/vnd.nuera.ecelp7470",
  ecelp9600: "audio/vnd.nuera.ecelp9600",
  ecma: "application/ecmascript",
  edm: "application/vnd.novadigm.edm",
  edx: "application/vnd.novadigm.edx",
  efif: "application/vnd.picsel",
  ei6: "application/vnd.pg.osasli",
  elc: "application/octet-stream",
  emf: "image/emf",
  eml: "message/rfc822",
  emma: "application/emma+xml",
  emotionml: "application/emotionml+xml",
  emz: "application/x-msmetafile",
  eol: "audio/vnd.digital-winds",
  eot: "application/vnd.ms-fontobject",
  eps: "application/postscript",
  epub: "application/epub+zip",
  es3: "application/vnd.eszigno3+xml",
  esa: "application/vnd.osgi.subsystem",
  esf: "application/vnd.epson.esf",
  et3: "application/vnd.eszigno3+xml",
  etx: "text/x-setext",
  eva: "application/x-eva",
  evy: "application/x-envoy",
  exe: "application/x-msdownload",
  exi: "application/exi",
  exp: "application/express",
  exr: "image/aces",
  ext: "application/vnd.novadigm.ext",
  ez: "application/andrew-inset",
  ez2: "application/vnd.ezpix-album",
  ez3: "application/vnd.ezpix-package",
  f: "text/x-fortran",
  f4v: "video/x-f4v",
  f77: "text/x-fortran",
  f90: "text/x-fortran",
  fbs: "image/vnd.fastbidsheet",
  fcdt: "application/vnd.adobe.formscentral.fcdt",
  fcs: "application/vnd.isac.fcs",
  fdf: "application/vnd.fdf",
  fdt: "application/fdt+xml",
  fe_launch: "application/vnd.denovo.fcselayout-link",
  fg5: "application/vnd.fujitsu.oasysgp",
  fgd: "application/x-director",
  fh: "image/x-freehand",
  fh4: "image/x-freehand",
  fh5: "image/x-freehand",
  fh7: "image/x-freehand",
  fhc: "image/x-freehand",
  fig: "application/x-xfig",
  fits: "image/fits",
  flac: "audio/x-flac",
  fli: "video/x-fli",
  flo: "application/vnd.micrografx.flo",
  flv: "video/x-flv",
  flw: "application/vnd.kde.kivio",
  flx: "text/vnd.fmi.flexstor",
  fly: "text/vnd.fly",
  fm: "application/vnd.framemaker",
  fnc: "application/vnd.frogans.fnc",
  fo: "application/vnd.software602.filler.form+xml",
  for: "text/x-fortran",
  fpx: "image/vnd.fpx",
  frame: "application/vnd.framemaker",
  fsc: "application/vnd.fsc.weblaunch",
  fst: "image/vnd.fst",
  ftc: "application/vnd.fluxtime.clip",
  fti: "application/vnd.anser-web-funds-transfer-initiation",
  fvt: "video/vnd.fvt",
  fxp: "application/vnd.adobe.fxp",
  fxpl: "application/vnd.adobe.fxp",
  fzs: "application/vnd.fuzzysheet",
  g2w: "application/vnd.geoplan",
  g3: "image/g3fax",
  g3w: "application/vnd.geospace",
  gac: "application/vnd.groove-account",
  gam: "application/x-tads",
  gbr: "application/rpki-ghostbusters",
  gca: "application/x-gca-compressed",
  gdl: "model/vnd.gdl",
  gdoc: "application/vnd.google-apps.document",
  ged: "text/vnd.familysearch.gedcom",
  geo: "application/vnd.dynageo",
  geojson: "application/geo+json",
  gex: "application/vnd.geometry-explorer",
  ggb: "application/vnd.geogebra.file",
  ggt: "application/vnd.geogebra.tool",
  ghf: "application/vnd.groove-help",
  gif: "image/gif",
  gim: "application/vnd.groove-identity-message",
  glb: "model/gltf-binary",
  gltf: "model/gltf+json",
  gml: "application/gml+xml",
  gmx: "application/vnd.gmx",
  gnumeric: "application/x-gnumeric",
  gph: "application/vnd.flographit",
  gpx: "application/gpx+xml",
  gqf: "application/vnd.grafeq",
  gqs: "application/vnd.grafeq",
  gram: "application/srgs",
  gramps: "application/x-gramps-xml",
  gre: "application/vnd.geometry-explorer",
  grv: "application/vnd.groove-injector",
  grxml: "application/srgs+xml",
  gsf: "application/x-font-ghostscript",
  gsheet: "application/vnd.google-apps.spreadsheet",
  gslides: "application/vnd.google-apps.presentation",
  gtar: "application/x-gtar",
  gtm: "application/vnd.groove-tool-message",
  gtw: "model/vnd.gtw",
  gv: "text/vnd.graphviz",
  gxf: "application/gxf",
  gxt: "application/vnd.geonext",
  gz: "application/gzip",
  h: "text/x-c",
  h261: "video/h261",
  h263: "video/h263",
  h264: "video/h264",
  hal: "application/vnd.hal+xml",
  hbci: "application/vnd.hbci",
  hbs: "text/x-handlebars-template",
  hdd: "application/x-virtualbox-hdd",
  hdf: "application/x-hdf",
  heic: "image/heic",
  heics: "image/heic-sequence",
  heif: "image/heif",
  heifs: "image/heif-sequence",
  hej2: "image/hej2k",
  held: "application/atsc-held+xml",
  hh: "text/x-c",
  hjson: "application/hjson",
  hlp: "application/winhlp",
  hpgl: "application/vnd.hp-hpgl",
  hpid: "application/vnd.hp-hpid",
  hps: "application/vnd.hp-hps",
  hqx: "application/mac-binhex40",
  hsj2: "image/hsj2",
  htc: "text/x-component",
  htke: "application/vnd.kenameaapp",
  htm: "text/html",
  html: "text/html",
  hvd: "application/vnd.yamaha.hv-dic",
  hvp: "application/vnd.yamaha.hv-voice",
  hvs: "application/vnd.yamaha.hv-script",
  i2g: "application/vnd.intergeo",
  icc: "application/vnd.iccprofile",
  ice: "x-conference/x-cooltalk",
  icm: "application/vnd.iccprofile",
  ico: "image/x-icon",
  ics: "text/calendar",
  ief: "image/ief",
  ifb: "text/calendar",
  ifm: "application/vnd.shana.informed.formdata",
  iges: "model/iges",
  igl: "application/vnd.igloader",
  igm: "application/vnd.insors.igm",
  igs: "model/iges",
  igx: "application/vnd.micrografx.igx",
  iif: "application/vnd.shana.informed.interchange",
  img: "application/octet-stream",
  imp: "application/vnd.accpac.simply.imp",
  ims: "application/vnd.ms-ims",
  in: "text/plain",
  ini: "text/plain",
  ink: "application/inkml+xml",
  inkml: "application/inkml+xml",
  install: "application/x-install-instructions",
  iota: "application/vnd.astraea-software.iota",
  ipfix: "application/ipfix",
  ipk: "application/vnd.shana.informed.package",
  irm: "application/vnd.ibm.rights-management",
  irp: "application/vnd.irepository.package+xml",
  iso: "application/x-iso9660-image",
  itp: "application/vnd.shana.informed.formtemplate",
  its: "application/its+xml",
  ivp: "application/vnd.immervision-ivp",
  ivu: "application/vnd.immervision-ivu",
  jad: "text/vnd.sun.j2me.app-descriptor",
  jade: "text/jade",
  jam: "application/vnd.jam",
  jar: "application/java-archive",
  jardiff: "application/x-java-archive-diff",
  java: "text/x-java-source",
  jhc: "image/jphc",
  jisp: "application/vnd.jisp",
  jls: "image/jls",
  jlt: "application/vnd.hp-jlyt",
  jng: "image/x-jng",
  jnlp: "application/x-java-jnlp-file",
  joda: "application/vnd.joost.joda-archive",
  jp2: "image/jp2",
  jpe: "image/jpeg",
  jpeg: "image/jpeg",
  jpf: "image/jpx",
  jpg: "image/jpeg",
  jpg2: "image/jp2",
  jpgm: "video/jpm",
  jpgv: "video/jpeg",
  jph: "image/jph",
  jpm: "video/jpm",
  jpx: "image/jpx",
  js: "text/javascript",
  json: "application/json",
  json5: "application/json5",
  jsonld: "application/ld+json",
  jsonml: "application/jsonml+json",
  jsx: "text/jsx",
  jt: "model/jt",
  jxr: "image/jxr",
  jxra: "image/jxra",
  jxrs: "image/jxrs",
  jxs: "image/jxs",
  jxsc: "image/jxsc",
  jxsi: "image/jxsi",
  jxss: "image/jxss",
  kar: "audio/midi",
  karbon: "application/vnd.kde.karbon",
  kdbx: "application/x-keepass2",
  key: "application/x-iwork-keynote-sffkey",
  kfo: "application/vnd.kde.kformula",
  kia: "application/vnd.kidspiration",
  kml: "application/vnd.google-earth.kml+xml",
  kmz: "application/vnd.google-earth.kmz",
  kne: "application/vnd.kinar",
  knp: "application/vnd.kinar",
  kon: "application/vnd.kde.kontour",
  kpr: "application/vnd.kde.kpresenter",
  kpt: "application/vnd.kde.kpresenter",
  kpxx: "application/vnd.ds-keypoint",
  ksp: "application/vnd.kde.kspread",
  ktr: "application/vnd.kahootz",
  ktx: "image/ktx",
  ktx2: "image/ktx2",
  ktz: "application/vnd.kahootz",
  kwd: "application/vnd.kde.kword",
  kwt: "application/vnd.kde.kword",
  lasxml: "application/vnd.las.las+xml",
  latex: "application/x-latex",
  lbd: "application/vnd.llamagraphics.life-balance.desktop",
  lbe: "application/vnd.llamagraphics.life-balance.exchange+xml",
  les: "application/vnd.hhe.lesson-player",
  less: "text/less",
  lgr: "application/lgr+xml",
  lha: "application/x-lzh-compressed",
  link66: "application/vnd.route66.link66+xml",
  list: "text/plain",
  list3820: "application/vnd.ibm.modcap",
  listafp: "application/vnd.ibm.modcap",
  litcoffee: "text/coffeescript",
  lnk: "application/x-ms-shortcut",
  log: "text/plain",
  lostxml: "application/lost+xml",
  lrf: "application/octet-stream",
  lrm: "application/vnd.ms-lrm",
  ltf: "application/vnd.frogans.ltf",
  lua: "text/x-lua",
  luac: "application/x-lua-bytecode",
  lvp: "audio/vnd.lucent.voice",
  lwp: "application/vnd.lotus-wordpro",
  lzh: "application/x-lzh-compressed",
  m13: "application/x-msmediaview",
  m14: "application/x-msmediaview",
  m1v: "video/mpeg",
  m21: "application/mp21",
  m2a: "audio/mpeg",
  m2v: "video/mpeg",
  m3a: "audio/mpeg",
  m3u: "audio/x-mpegurl",
  m3u8: "application/vnd.apple.mpegurl",
  m4a: "audio/x-m4a",
  m4p: "application/mp4",
  m4s: "video/iso.segment",
  m4u: "video/vnd.mpegurl",
  m4v: "video/x-m4v",
  ma: "application/mathematica",
  mads: "application/mads+xml",
  maei: "application/mmt-aei+xml",
  mag: "application/vnd.ecowin.chart",
  maker: "application/vnd.framemaker",
  man: "text/troff",
  manifest: "text/cache-manifest",
  map: "application/json",
  mar: "application/octet-stream",
  markdown: "text/markdown",
  mathml: "application/mathml+xml",
  mb: "application/mathematica",
  mbk: "application/vnd.mobius.mbk",
  mbox: "application/mbox",
  mc1: "application/vnd.medcalcdata",
  mcd: "application/vnd.mcd",
  mcurl: "text/vnd.curl.mcurl",
  md: "text/markdown",
  mdb: "application/x-msaccess",
  mdi: "image/vnd.ms-modi",
  mdx: "text/mdx",
  me: "text/troff",
  mesh: "model/mesh",
  meta4: "application/metalink4+xml",
  metalink: "application/metalink+xml",
  mets: "application/mets+xml",
  mfm: "application/vnd.mfmp",
  mft: "application/rpki-manifest",
  mgp: "application/vnd.osgeo.mapguide.package",
  mgz: "application/vnd.proteus.magazine",
  mid: "audio/midi",
  midi: "audio/midi",
  mie: "application/x-mie",
  mif: "application/vnd.mif",
  mime: "message/rfc822",
  mj2: "video/mj2",
  mjp2: "video/mj2",
  mjs: "text/javascript",
  mk3d: "video/x-matroska",
  mka: "audio/x-matroska",
  mkd: "text/x-markdown",
  mks: "video/x-matroska",
  mkv: "video/x-matroska",
  mlp: "application/vnd.dolby.mlp",
  mmd: "application/vnd.chipnuts.karaoke-mmd",
  mmf: "application/vnd.smaf",
  mml: "text/mathml",
  mmr: "image/vnd.fujixerox.edmics-mmr",
  mng: "video/x-mng",
  mny: "application/x-msmoney",
  mobi: "application/x-mobipocket-ebook",
  mods: "application/mods+xml",
  mov: "video/quicktime",
  movie: "video/x-sgi-movie",
  mp2: "audio/mpeg",
  mp21: "application/mp21",
  mp2a: "audio/mpeg",
  mp3: "audio/mpeg",
  mp4: "video/mp4",
  mp4a: "audio/mp4",
  mp4s: "application/mp4",
  mp4v: "video/mp4",
  mpc: "application/vnd.mophun.certificate",
  mpd: "application/dash+xml",
  mpe: "video/mpeg",
  mpeg: "video/mpeg",
  mpf: "application/media-policy-dataset+xml",
  mpg: "video/mpeg",
  mpg4: "video/mp4",
  mpga: "audio/mpeg",
  mpkg: "application/vnd.apple.installer+xml",
  mpm: "application/vnd.blueice.multipass",
  mpn: "application/vnd.mophun.application",
  mpp: "application/vnd.ms-project",
  mpt: "application/vnd.ms-project",
  mpy: "application/vnd.ibm.minipay",
  mqy: "application/vnd.mobius.mqy",
  mrc: "application/marc",
  mrcx: "application/marcxml+xml",
  ms: "text/troff",
  mscml: "application/mediaservercontrol+xml",
  mseed: "application/vnd.fdsn.mseed",
  mseq: "application/vnd.mseq",
  msf: "application/vnd.epson.msf",
  msg: "application/vnd.ms-outlook",
  msh: "model/mesh",
  msi: "application/x-msdownload",
  msix: "application/msix",
  msixbundle: "application/msixbundle",
  msl: "application/vnd.mobius.msl",
  msm: "application/octet-stream",
  msp: "application/octet-stream",
  msty: "application/vnd.muvee.style",
  mtl: "model/mtl",
  mts: "model/vnd.mts",
  mus: "application/vnd.musician",
  musd: "application/mmt-usd+xml",
  musicxml: "application/vnd.recordare.musicxml+xml",
  mvb: "application/x-msmediaview",
  mvt: "application/vnd.mapbox-vector-tile",
  mwf: "application/vnd.mfer",
  mxf: "application/mxf",
  mxl: "application/vnd.recordare.musicxml",
  mxmf: "audio/mobile-xmf",
  mxml: "application/xv+xml",
  mxs: "application/vnd.triscape.mxs",
  mxu: "video/vnd.mpegurl",
  "n-gage": "application/vnd.nokia.n-gage.symbian.install",
  n3: "text/n3",
  nb: "application/mathematica",
  nbp: "application/vnd.wolfram.player",
  nc: "application/x-netcdf",
  ncx: "application/x-dtbncx+xml",
  nfo: "text/x-nfo",
  ngdat: "application/vnd.nokia.n-gage.data",
  nitf: "application/vnd.nitf",
  nlu: "application/vnd.neurolanguage.nlu",
  nml: "application/vnd.enliven",
  nnd: "application/vnd.noblenet-directory",
  nns: "application/vnd.noblenet-sealer",
  nnw: "application/vnd.noblenet-web",
  npx: "image/vnd.net-fpx",
  nq: "application/n-quads",
  nsc: "application/x-conference",
  nsf: "application/vnd.lotus-notes",
  nt: "application/n-triples",
  ntf: "application/vnd.nitf",
  numbers: "application/x-iwork-numbers-sffnumbers",
  nzb: "application/x-nzb",
  oa2: "application/vnd.fujitsu.oasys2",
  oa3: "application/vnd.fujitsu.oasys3",
  oas: "application/vnd.fujitsu.oasys",
  obd: "application/x-msbinder",
  obgx: "application/vnd.openblox.game+xml",
  obj: "model/obj",
  oda: "application/oda",
  odb: "application/vnd.oasis.opendocument.database",
  odc: "application/vnd.oasis.opendocument.chart",
  odf: "application/vnd.oasis.opendocument.formula",
  odft: "application/vnd.oasis.opendocument.formula-template",
  odg: "application/vnd.oasis.opendocument.graphics",
  odi: "application/vnd.oasis.opendocument.image",
  odm: "application/vnd.oasis.opendocument.text-master",
  odp: "application/vnd.oasis.opendocument.presentation",
  ods: "application/vnd.oasis.opendocument.spreadsheet",
  odt: "application/vnd.oasis.opendocument.text",
  oga: "audio/ogg",
  ogex: "model/vnd.opengex",
  ogg: "audio/ogg",
  ogv: "video/ogg",
  ogx: "application/ogg",
  omdoc: "application/omdoc+xml",
  onepkg: "application/onenote",
  onetmp: "application/onenote",
  onetoc: "application/onenote",
  onetoc2: "application/onenote",
  opf: "application/oebps-package+xml",
  opml: "text/x-opml",
  oprc: "application/vnd.palm",
  opus: "audio/ogg",
  org: "text/x-org",
  osf: "application/vnd.yamaha.openscoreformat",
  osfpvg: "application/vnd.yamaha.openscoreformat.osfpvg+xml",
  osm: "application/vnd.openstreetmap.data+xml",
  otc: "application/vnd.oasis.opendocument.chart-template",
  otf: "font/otf",
  otg: "application/vnd.oasis.opendocument.graphics-template",
  oth: "application/vnd.oasis.opendocument.text-web",
  oti: "application/vnd.oasis.opendocument.image-template",
  otp: "application/vnd.oasis.opendocument.presentation-template",
  ots: "application/vnd.oasis.opendocument.spreadsheet-template",
  ott: "application/vnd.oasis.opendocument.text-template",
  ova: "application/x-virtualbox-ova",
  ovf: "application/x-virtualbox-ovf",
  owl: "application/rdf+xml",
  oxps: "application/oxps",
  oxt: "application/vnd.openofficeorg.extension",
  p: "text/x-pascal",
  p10: "application/pkcs10",
  p12: "application/x-pkcs12",
  p7b: "application/x-pkcs7-certificates",
  p7c: "application/pkcs7-mime",
  p7m: "application/pkcs7-mime",
  p7r: "application/x-pkcs7-certreqresp",
  p7s: "application/pkcs7-signature",
  p8: "application/pkcs8",
  pac: "application/x-ns-proxy-autoconfig",
  pages: "application/x-iwork-pages-sffpages",
  pas: "text/x-pascal",
  paw: "application/vnd.pawaafile",
  pbd: "application/vnd.powerbuilder6",
  pbm: "image/x-portable-bitmap",
  pcap: "application/vnd.tcpdump.pcap",
  pcf: "application/x-font-pcf",
  pcl: "application/vnd.hp-pcl",
  pclxl: "application/vnd.hp-pclxl",
  pct: "image/x-pict",
  pcurl: "application/vnd.curl.pcurl",
  pcx: "image/x-pcx",
  pdb: "application/x-pilot",
  pde: "text/x-processing",
  pdf: "application/pdf",
  pem: "application/x-x509-ca-cert",
  pfa: "application/x-font-type1",
  pfb: "application/x-font-type1",
  pfm: "application/x-font-type1",
  pfr: "application/font-tdpfr",
  pfx: "application/x-pkcs12",
  pgm: "image/x-portable-graymap",
  pgn: "application/x-chess-pgn",
  pgp: "application/pgp-encrypted",
  php: "application/x-httpd-php",
  pic: "image/x-pict",
  pkg: "application/octet-stream",
  pki: "application/pkixcmp",
  pkipath: "application/pkix-pkipath",
  pkpass: "application/vnd.apple.pkpass",
  pl: "application/x-perl",
  plb: "application/vnd.3gpp.pic-bw-large",
  plc: "application/vnd.mobius.plc",
  plf: "application/vnd.pocketlearn",
  pls: "application/pls+xml",
  pm: "application/x-perl",
  pml: "application/vnd.ctc-posml",
  png: "image/png",
  pnm: "image/x-portable-anymap",
  portpkg: "application/vnd.macports.portpkg",
  pot: "application/vnd.ms-powerpoint",
  potm: "application/vnd.ms-powerpoint.template.macroenabled.12",
  potx: "application/vnd.openxmlformats-officedocument.presentationml.template",
  ppam: "application/vnd.ms-powerpoint.addin.macroenabled.12",
  ppd: "application/vnd.cups-ppd",
  ppm: "image/x-portable-pixmap",
  pps: "application/vnd.ms-powerpoint",
  ppsm: "application/vnd.ms-powerpoint.slideshow.macroenabled.12",
  ppsx: "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
  ppt: "application/vnd.ms-powerpoint",
  pptm: "application/vnd.ms-powerpoint.presentation.macroenabled.12",
  pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
  pqa: "application/vnd.palm",
  prc: "model/prc",
  pre: "application/vnd.lotus-freelance",
  prf: "application/pics-rules",
  provx: "application/provenance+xml",
  ps: "application/postscript",
  psb: "application/vnd.3gpp.pic-bw-small",
  psd: "image/vnd.adobe.photoshop",
  psf: "application/x-font-linux-psf",
  pskcxml: "application/pskc+xml",
  pti: "image/prs.pti",
  ptid: "application/vnd.pvi.ptid1",
  pub: "application/x-mspublisher",
  pvb: "application/vnd.3gpp.pic-bw-var",
  pwn: "application/vnd.3m.post-it-notes",
  pya: "audio/vnd.ms-playready.media.pya",
  pyo: "model/vnd.pytha.pyox",
  pyox: "model/vnd.pytha.pyox",
  pyv: "video/vnd.ms-playready.media.pyv",
  qam: "application/vnd.epson.quickanime",
  qbo: "application/vnd.intu.qbo",
  qfx: "application/vnd.intu.qfx",
  qps: "application/vnd.publishare-delta-tree",
  qt: "video/quicktime",
  qwd: "application/vnd.quark.quarkxpress",
  qwt: "application/vnd.quark.quarkxpress",
  qxb: "application/vnd.quark.quarkxpress",
  qxd: "application/vnd.quark.quarkxpress",
  qxl: "application/vnd.quark.quarkxpress",
  qxt: "application/vnd.quark.quarkxpress",
  ra: "audio/x-realaudio",
  ram: "audio/x-pn-realaudio",
  raml: "application/raml+yaml",
  rapd: "application/route-apd+xml",
  rar: "application/x-rar-compressed",
  ras: "image/x-cmu-raster",
  rcprofile: "application/vnd.ipunplugged.rcprofile",
  rdf: "application/rdf+xml",
  rdz: "application/vnd.data-vision.rdz",
  relo: "application/p2p-overlay+xml",
  rep: "application/vnd.businessobjects",
  res: "application/x-dtbresource+xml",
  rgb: "image/x-rgb",
  rif: "application/reginfo+xml",
  rip: "audio/vnd.rip",
  ris: "application/x-research-info-systems",
  rl: "application/resource-lists+xml",
  rlc: "image/vnd.fujixerox.edmics-rlc",
  rld: "application/resource-lists-diff+xml",
  rm: "application/vnd.rn-realmedia",
  rmi: "audio/midi",
  rmp: "audio/x-pn-realaudio-plugin",
  rms: "application/vnd.jcp.javame.midlet-rms",
  rmvb: "application/vnd.rn-realmedia-vbr",
  rnc: "application/relax-ng-compact-syntax",
  rng: "application/xml",
  roa: "application/rpki-roa",
  roff: "text/troff",
  rp9: "application/vnd.cloanto.rp9",
  rpm: "application/x-redhat-package-manager",
  rpss: "application/vnd.nokia.radio-presets",
  rpst: "application/vnd.nokia.radio-preset",
  rq: "application/sparql-query",
  rs: "application/rls-services+xml",
  rsat: "application/atsc-rsat+xml",
  rsd: "application/rsd+xml",
  rsheet: "application/urc-ressheet+xml",
  rss: "application/rss+xml",
  rtf: "text/rtf",
  rtx: "text/richtext",
  run: "application/x-makeself",
  rusd: "application/route-usd+xml",
  s: "text/x-asm",
  s3m: "audio/s3m",
  saf: "application/vnd.yamaha.smaf-audio",
  sass: "text/x-sass",
  sbml: "application/sbml+xml",
  sc: "application/vnd.ibm.secure-container",
  scd: "application/x-msschedule",
  scm: "application/vnd.lotus-screencam",
  scq: "application/scvp-cv-request",
  scs: "application/scvp-cv-response",
  scss: "text/x-scss",
  scurl: "text/vnd.curl.scurl",
  sda: "application/vnd.stardivision.draw",
  sdc: "application/vnd.stardivision.calc",
  sdd: "application/vnd.stardivision.impress",
  sdkd: "application/vnd.solent.sdkm+xml",
  sdkm: "application/vnd.solent.sdkm+xml",
  sdp: "application/sdp",
  sdw: "application/vnd.stardivision.writer",
  sea: "application/x-sea",
  see: "application/vnd.seemail",
  seed: "application/vnd.fdsn.seed",
  sema: "application/vnd.sema",
  semd: "application/vnd.semd",
  semf: "application/vnd.semf",
  senmlx: "application/senml+xml",
  sensmlx: "application/sensml+xml",
  ser: "application/java-serialized-object",
  setpay: "application/set-payment-initiation",
  setreg: "application/set-registration-initiation",
  "sfd-hdstx": "application/vnd.hydrostatix.sof-data",
  sfs: "application/vnd.spotfire.sfs",
  sfv: "text/x-sfv",
  sgi: "image/sgi",
  sgl: "application/vnd.stardivision.writer-global",
  sgm: "text/sgml",
  sgml: "text/sgml",
  sh: "application/x-sh",
  shar: "application/x-shar",
  shex: "text/shex",
  shf: "application/shf+xml",
  shtml: "text/html",
  sid: "image/x-mrsid-image",
  sieve: "application/sieve",
  sig: "application/pgp-signature",
  sil: "audio/silk",
  silo: "model/mesh",
  sis: "application/vnd.symbian.install",
  sisx: "application/vnd.symbian.install",
  sit: "application/x-stuffit",
  sitx: "application/x-stuffitx",
  siv: "application/sieve",
  skd: "application/vnd.koan",
  skm: "application/vnd.koan",
  skp: "application/vnd.koan",
  skt: "application/vnd.koan",
  sldm: "application/vnd.ms-powerpoint.slide.macroenabled.12",
  sldx: "application/vnd.openxmlformats-officedocument.presentationml.slide",
  slim: "text/slim",
  slm: "text/slim",
  sls: "application/route-s-tsid+xml",
  slt: "application/vnd.epson.salt",
  sm: "application/vnd.stepmania.stepchart",
  smf: "application/vnd.stardivision.math",
  smi: "application/smil+xml",
  smil: "application/smil+xml",
  smv: "video/x-smv",
  smzip: "application/vnd.stepmania.package",
  snd: "audio/basic",
  snf: "application/x-font-snf",
  so: "application/octet-stream",
  spc: "application/x-pkcs7-certificates",
  spdx: "text/spdx",
  spf: "application/vnd.yamaha.smaf-phrase",
  spl: "application/x-futuresplash",
  spot: "text/vnd.in3d.spot",
  spp: "application/scvp-vp-response",
  spq: "application/scvp-vp-request",
  spx: "audio/ogg",
  sql: "application/x-sql",
  src: "application/x-wais-source",
  srt: "application/x-subrip",
  sru: "application/sru+xml",
  srx: "application/sparql-results+xml",
  ssdl: "application/ssdl+xml",
  sse: "application/vnd.kodak-descriptor",
  ssf: "application/vnd.epson.ssf",
  ssml: "application/ssml+xml",
  st: "application/vnd.sailingtracker.track",
  stc: "application/vnd.sun.xml.calc.template",
  std: "application/vnd.sun.xml.draw.template",
  stf: "application/vnd.wt.stf",
  sti: "application/vnd.sun.xml.impress.template",
  stk: "application/hyperstudio",
  stl: "model/stl",
  stpx: "model/step+xml",
  stpxz: "model/step-xml+zip",
  stpz: "model/step+zip",
  str: "application/vnd.pg.format",
  stw: "application/vnd.sun.xml.writer.template",
  styl: "text/stylus",
  stylus: "text/stylus",
  sub: "text/vnd.dvb.subtitle",
  sus: "application/vnd.sus-calendar",
  susp: "application/vnd.sus-calendar",
  sv4cpio: "application/x-sv4cpio",
  sv4crc: "application/x-sv4crc",
  svc: "application/vnd.dvb.service",
  svd: "application/vnd.svd",
  svg: "image/svg+xml",
  svgz: "image/svg+xml",
  swa: "application/x-director",
  swf: "application/x-shockwave-flash",
  swi: "application/vnd.aristanetworks.swi",
  swidtag: "application/swid+xml",
  sxc: "application/vnd.sun.xml.calc",
  sxd: "application/vnd.sun.xml.draw",
  sxg: "application/vnd.sun.xml.writer.global",
  sxi: "application/vnd.sun.xml.impress",
  sxm: "application/vnd.sun.xml.math",
  sxw: "application/vnd.sun.xml.writer",
  t: "text/troff",
  t3: "application/x-t3vm-image",
  t38: "image/t38",
  taglet: "application/vnd.mynfc",
  tao: "application/vnd.tao.intent-module-archive",
  tap: "image/vnd.
Download .txt
gitextract_vm09wsh2/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   └── feature_request.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── build-vsix.yml
│       ├── deploy-doc.yml
│       ├── package.yml
│       ├── pr.yml
│       └── translations.yml
├── .gitignore
├── .nvmrc
├── .prettierignore
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   ├── settings.json
│   └── tasks.json
├── .vscodeignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── ContributorAgreement.txt
├── LICENSE
├── README.md
├── SUPPORT.md
├── client/
│   ├── package.json
│   ├── src/
│   │   ├── browser/
│   │   │   └── extension.ts
│   │   ├── commands/
│   │   │   ├── authorize.ts
│   │   │   ├── closeSession.ts
│   │   │   ├── new.ts
│   │   │   ├── profile.ts
│   │   │   ├── run.ts
│   │   │   └── toggleLineComment.ts
│   │   ├── components/
│   │   │   ├── APIProvider.ts
│   │   │   ├── AuthProvider.ts
│   │   │   ├── CAHelper.ts
│   │   │   ├── ContentNavigator/
│   │   │   │   ├── ContentAdapterFactory.ts
│   │   │   │   ├── ContentDataProvider.ts
│   │   │   │   ├── ContentModel.ts
│   │   │   │   ├── const.ts
│   │   │   │   ├── convert.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── mime-types.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── utils.ts
│   │   │   ├── ExtensionContext.ts
│   │   │   ├── LibraryNavigator/
│   │   │   │   ├── LibraryAdapterFactory.ts
│   │   │   │   ├── LibraryDataProvider.ts
│   │   │   │   ├── LibraryModel.ts
│   │   │   │   ├── PaginatedResultSet.ts
│   │   │   │   ├── const.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── ResultPanel/
│   │   │   │   ├── ResultPanel.ts
│   │   │   │   ├── ResultPanelSubscriptionProvider.ts
│   │   │   │   └── index.ts
│   │   │   ├── StatusBarItem.ts
│   │   │   ├── SubscriptionProvider.ts
│   │   │   ├── logViewer/
│   │   │   │   ├── DiagnosticCodeActionProvider.ts
│   │   │   │   ├── ProblemProcessor.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── logParser.ts
│   │   │   │   └── sasDiagnostics.ts
│   │   │   ├── notebook/
│   │   │   │   ├── Controller.ts
│   │   │   │   ├── Serializer.ts
│   │   │   │   ├── exporters/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── templates/
│   │   │   │   │   │   ├── dark.css
│   │   │   │   │   │   ├── default.html
│   │   │   │   │   │   └── light.css
│   │   │   │   │   ├── toHTML.ts
│   │   │   │   │   └── toSAS.ts
│   │   │   │   └── renderers/
│   │   │   │       ├── HTMLRenderer.ts
│   │   │   │       └── LogRenderer.ts
│   │   │   ├── profile.ts
│   │   │   ├── tasks/
│   │   │   │   ├── SasTaskProvider.ts
│   │   │   │   └── SasTasks.ts
│   │   │   └── utils/
│   │   │       ├── SASCodeDocument.ts
│   │   │       ├── SASCodeDocumentHelper.ts
│   │   │       ├── deferred.ts
│   │   │       ├── settings.ts
│   │   │       ├── throttle.ts
│   │   │       └── treeViewSelections.ts
│   │   ├── connection/
│   │   │   ├── index.ts
│   │   │   ├── itc/
│   │   │   │   ├── CodeRunner.ts
│   │   │   │   ├── ItcLibraryAdapter.ts
│   │   │   │   ├── ItcServerAdapter.ts
│   │   │   │   ├── LineParser.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── script/
│   │   │   │   │   ├── env.json
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── itc.ps1
│   │   │   │   ├── types.ts
│   │   │   │   └── util.ts
│   │   │   ├── rest/
│   │   │   │   ├── RestContentAdapter.ts
│   │   │   │   ├── RestLibraryAdapter.ts
│   │   │   │   ├── RestServerAdapter.ts
│   │   │   │   ├── api/
│   │   │   │   │   ├── common.ts
│   │   │   │   │   ├── compute.ts
│   │   │   │   │   ├── configuration.ts
│   │   │   │   │   ├── files.ts
│   │   │   │   │   └── folders.ts
│   │   │   │   ├── auth.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── context.ts
│   │   │   │   ├── identities.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── job.ts
│   │   │   │   ├── server.ts
│   │   │   │   ├── session.ts
│   │   │   │   └── util.ts
│   │   │   ├── session.ts
│   │   │   ├── ssh/
│   │   │   │   ├── auth.ts
│   │   │   │   ├── const.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── studio/
│   │   │   │   └── index.ts
│   │   │   └── util.ts
│   │   ├── node/
│   │   │   └── extension.ts
│   │   ├── panels/
│   │   │   ├── DataViewer.ts
│   │   │   ├── TablePropertiesViewer.ts
│   │   │   └── WebviewManager.ts
│   │   ├── store/
│   │   │   ├── index.ts
│   │   │   ├── log/
│   │   │   │   ├── actions.ts
│   │   │   │   ├── initialState.ts
│   │   │   │   ├── selectors.ts
│   │   │   │   └── store.ts
│   │   │   ├── middleware.ts
│   │   │   ├── run/
│   │   │   │   ├── actions.ts
│   │   │   │   ├── initialState.ts
│   │   │   │   ├── selectors.ts
│   │   │   │   └── store.ts
│   │   │   └── selectors.ts
│   │   └── webview/
│   │       ├── ColumnHeader.tsx
│   │       ├── ColumnMenu.tsx
│   │       ├── DataViewer.css
│   │       ├── DataViewer.tsx
│   │       ├── GridMenu.tsx
│   │       ├── TableFilter.tsx
│   │       ├── TablePropertiesViewer.css
│   │       ├── TablePropertiesViewer.ts
│   │       ├── index.ts
│   │       ├── localize.ts
│   │       ├── useDataViewer.ts
│   │       └── useTheme.ts
│   ├── test/
│   │   ├── components/
│   │   │   ├── ContentNavigator/
│   │   │   │   ├── ContentDataProvider.test.ts
│   │   │   │   ├── convert.test.ts
│   │   │   │   └── utils.test.ts
│   │   │   ├── LibraryNavigator/
│   │   │   │   ├── LibraryDataProvider.test.ts
│   │   │   │   └── PaginatedResultSet.test.ts
│   │   │   ├── logViewer/
│   │   │   │   ├── log.ts
│   │   │   │   └── logParser.test.ts
│   │   │   ├── notebook/
│   │   │   │   ├── exporter.test.ts
│   │   │   │   └── serializer.test.ts
│   │   │   ├── profile/
│   │   │   │   └── profile.test.ts
│   │   │   └── util/
│   │   │       ├── SASCodeDocument.test.ts
│   │   │       └── SASCodeDocumentHelper.test.ts
│   │   ├── connection/
│   │   │   ├── itc/
│   │   │   │   ├── Coderunner.test.ts
│   │   │   │   ├── ItcLibraryAdapter.test.ts
│   │   │   │   ├── index.test.ts
│   │   │   │   └── util.test.ts
│   │   │   ├── rest/
│   │   │   │   └── index.test.ts
│   │   │   ├── session.test.ts
│   │   │   └── ssh/
│   │   │       ├── auth.test.ts
│   │   │       └── index.test.ts
│   │   ├── extension.test.ts
│   │   ├── index.ts
│   │   ├── languageServer/
│   │   │   └── formatter.test.ts
│   │   ├── runTest.ts
│   │   ├── store/
│   │   │   ├── log/
│   │   │   │   └── actions.test.ts
│   │   │   └── run/
│   │   │       └── actions.test.ts
│   │   └── utils.ts
│   ├── testFixture/
│   │   ├── SampleCode.sas
│   │   ├── SampleCode2.sas
│   │   ├── TestFolder/
│   │   │   ├── SampleCode1.sas
│   │   │   └── TestSubFolder/
│   │   │       └── SampleCode2.sas
│   │   ├── formatter/
│   │   │   ├── expected.sas
│   │   │   └── unformatted.sas
│   │   ├── keyContent.txt
│   │   ├── sasnb_export.sas
│   │   ├── sasnb_export.sasnb
│   │   ├── test.ipynb
│   │   ├── test_ipynb.flw
│   │   ├── test_multi.sasnb
│   │   ├── test_multi_node.flw
│   │   ├── test_multi_swimlane.flw
│   │   ├── test_single.sasnb
│   │   ├── test_single_node.flw
│   │   └── test_single_swimlane.flw
│   └── tsconfig.json
├── doc/
│   ├── ag-grid-technical-details.md
│   ├── profileExamples/
│   │   └── viya4.json
│   └── scripts/
│       └── itc-connection-test.ps1
├── eslint.config.mjs
├── l10n/
│   ├── bundle.l10n.de.json
│   ├── bundle.l10n.es.json
│   ├── bundle.l10n.fr.json
│   ├── bundle.l10n.it.json
│   ├── bundle.l10n.ja.json
│   ├── bundle.l10n.ko.json
│   ├── bundle.l10n.pl.json
│   ├── bundle.l10n.pt-br.json
│   ├── bundle.l10n.zh-cn.json
│   └── bundle.l10n.zh-tw.json
├── language-configuration.json
├── package.json
├── package.nls.de.json
├── package.nls.es.json
├── package.nls.fr.json
├── package.nls.it.json
├── package.nls.ja.json
├── package.nls.json
├── package.nls.ko.json
├── package.nls.pl.json
├── package.nls.pt-br.json
├── package.nls.zh-cn.json
├── package.nls.zh-tw.json
├── prettier.config.js
├── pull_request_template.md
├── server/
│   ├── data/
│   │   ├── DS2ContextPrompt.json
│   │   ├── DS2Functions.json
│   │   ├── DS2Keywords.json
│   │   ├── HashPackageMethods.json
│   │   ├── MacroDefinitionOptions.json
│   │   ├── ODS_Tagsets.json
│   │   ├── Procedures/
│   │   │   ├── DATA.json
│   │   │   ├── DEFINE_EVENT.json
│   │   │   ├── DEFINE_TAGSET.json
│   │   │   ├── MACRO.json
│   │   │   ├── ODS.json
│   │   │   └── STATGRAPH.json
│   │   ├── SASARMMacros.json
│   │   ├── SASAutoVariables.json
│   │   ├── SASAutocallMacros.json
│   │   ├── SASCallRoutines.json
│   │   ├── SASColorValues.json
│   │   ├── SASContextPrompt.json
│   │   ├── SASDataSetOptions.json
│   │   ├── SASDataStepOptions.json
│   │   ├── SASDataStepOptions2.json
│   │   ├── SASDataStepStatements.json
│   │   ├── SASFormats.json
│   │   ├── SASFunctions.json
│   │   ├── SASGlobalProcedureStatements.json
│   │   ├── SASGlobalStatements.json
│   │   ├── SASInformats.json
│   │   ├── SASMacroFunctions.json
│   │   ├── SASMacroStatements.json
│   │   ├── SASProcedures.json
│   │   ├── SQLKeywords.json
│   │   ├── Statements/
│   │   │   ├── ABORT.json
│   │   │   ├── ARRAY.json
│   │   │   ├── ATTRIB.json
│   │   │   ├── AXIS.json
│   │   │   ├── CAS.json
│   │   │   ├── CASLIB.json
│   │   │   ├── ENDRSUBMIT.json
│   │   │   ├── FILE.json
│   │   │   ├── FILENAME.json
│   │   │   ├── FOOTNOTE.json
│   │   │   ├── FORMAT.json
│   │   │   ├── GOPTIONS.json
│   │   │   ├── INFILE.json
│   │   │   ├── INFORMAT.json
│   │   │   ├── KILLTASK.json
│   │   │   ├── LEGEND.json
│   │   │   ├── LIBNAME.json
│   │   │   ├── LISTTASK.json
│   │   │   ├── LOCK.json
│   │   │   ├── NOTE.json
│   │   │   ├── ODS.json
│   │   │   ├── OPTIONS.json
│   │   │   ├── PATTERN.json
│   │   │   ├── RDISPLAY.json
│   │   │   ├── RGET.json
│   │   │   ├── RSUBMIT.json
│   │   │   ├── RUN.json
│   │   │   ├── SIGNOFF.json
│   │   │   ├── SIGNON.json
│   │   │   ├── SYMBOL.json
│   │   │   ├── SYSTASK.json
│   │   │   ├── TITLE.json
│   │   │   ├── WAITFOR.json
│   │   │   └── WHERE.json
│   │   ├── StatisticsKeywords.json
│   │   ├── StyleAttributes.json
│   │   ├── StyleElements.json
│   │   ├── StyleLocations.json
│   │   └── WHERE.json
│   ├── messagebundle.properties
│   ├── messagebundle_ar.properties
│   ├── messagebundle_cs.properties
│   ├── messagebundle_da.properties
│   ├── messagebundle_de.properties
│   ├── messagebundle_el.properties
│   ├── messagebundle_es.properties
│   ├── messagebundle_fi.properties
│   ├── messagebundle_fr.properties
│   ├── messagebundle_he.properties
│   ├── messagebundle_hr.properties
│   ├── messagebundle_hu.properties
│   ├── messagebundle_it.properties
│   ├── messagebundle_iw.properties
│   ├── messagebundle_ja.properties
│   ├── messagebundle_ko.properties
│   ├── messagebundle_nb.properties
│   ├── messagebundle_nl.properties
│   ├── messagebundle_no.properties
│   ├── messagebundle_pl.properties
│   ├── messagebundle_pt.properties
│   ├── messagebundle_pt_BR.properties
│   ├── messagebundle_ru.properties
│   ├── messagebundle_sh.properties
│   ├── messagebundle_sk.properties
│   ├── messagebundle_sl.properties
│   ├── messagebundle_sr.properties
│   ├── messagebundle_sv.properties
│   ├── messagebundle_th.properties
│   ├── messagebundle_tr.properties
│   ├── messagebundle_uk.properties
│   ├── messagebundle_zh_CN.properties
│   ├── messagebundle_zh_TW.properties
│   ├── package.json
│   ├── pubsdata/
│   │   ├── Functions/
│   │   │   └── en/
│   │   │       ├── base.json
│   │   │       └── macro.json
│   │   ├── Procedures/
│   │   │   └── en/
│   │   │       ├── ACCELERATOR.json
│   │   │       ├── ACECLUS.json
│   │   │       ├── ADAPTIVEREG.json
│   │   │       ├── ANOM.json
│   │   │       ├── ANOVA.json
│   │   │       ├── APPEND.json
│   │   │       ├── ARIMA.json
│   │   │       ├── ASSESS.json
│   │   │       ├── ASSESSBIAS.json
│   │   │       ├── ASTORE.json
│   │   │       ├── AUTOREG.json
│   │   │       ├── BART.json
│   │   │       ├── BCHOICE.json
│   │   │       ├── BINNING.json
│   │   │       ├── BNET.json
│   │   │       ├── BOM.json
│   │   │       ├── BOOLRULE.json
│   │   │       ├── BOXPLOT.json
│   │   │       ├── CAEFFECT.json
│   │   │       ├── CALIS.json
│   │   │       ├── CALLRFC.json
│   │   │       ├── CANCORR.json
│   │   │       ├── CANDISC.json
│   │   │       ├── CAPABILITY.json
│   │   │       ├── CARDINALITY.json
│   │   │       ├── CAS.json
│   │   │       ├── CASUTIL.json
│   │   │       ├── CATALOG.json
│   │   │       ├── CATMOD.json
│   │   │       ├── CATTRANSFORM.json
│   │   │       ├── CAUSALDISCOVERY.json
│   │   │       ├── CAUSALGRAPH.json
│   │   │       ├── CAUSALMED.json
│   │   │       ├── CAUSALTRT.json
│   │   │       ├── CCDM.json
│   │   │       ├── CCOPULA.json
│   │   │       ├── CESM.json
│   │   │       ├── CIMPORT.json
│   │   │       ├── CLP.json
│   │   │       ├── CLUSTER.json
│   │   │       ├── CNTSELECT.json
│   │   │       ├── COMPARE.json
│   │   │       ├── COMPILE.json
│   │   │       ├── COMPUTAB.json
│   │   │       ├── CONDENSEIMAGES.json
│   │   │       ├── CONTENTS.json
│   │   │       ├── COPULA.json
│   │   │       ├── COPY.json
│   │   │       ├── CORR.json
│   │   │       ├── CORRELATION.json
│   │   │       ├── CORRESP.json
│   │   │       ├── COUNTREG.json
│   │   │       ├── CPANEL.json
│   │   │       ├── CPM.json
│   │   │       ├── CPORT.json
│   │   │       ├── CQLIM.json
│   │   │       ├── CSPADE.json
│   │   │       ├── CSPATIALREG.json
│   │   │       ├── CSSM.json
│   │   │       ├── CUSUM.json
│   │   │       ├── DATA.json
│   │   │       ├── DATAMETRICS.json
│   │   │       ├── DATASETS.json
│   │   │       ├── DATASOURCE.json
│   │   │       ├── DATEKEYS.json
│   │   │       ├── DBCSTAB.json
│   │   │       ├── DEEPPRICE.json
│   │   │       ├── DELETE.json
│   │   │       ├── DFIL.json
│   │   │       ├── DISCRIM.json
│   │   │       ├── DISPLAYIMAGES.json
│   │   │       ├── DISTANCE.json
│   │   │       ├── DLMZEXPORT.json
│   │   │       ├── DLMZSCORE.json
│   │   │       ├── DLMZTRAIN.json
│   │   │       ├── DMSRVADM.json
│   │   │       ├── DMSRVDATASVC.json
│   │   │       ├── DMSRVPROCESSSVC.json
│   │   │       ├── DOCUMENT.json
│   │   │       ├── DOWNLOAD.json
│   │   │       ├── DQLOCLST.json
│   │   │       ├── DQMATCH.json
│   │   │       ├── DQSCHEME.json
│   │   │       ├── DS2.json
│   │   │       ├── DSTODS2.json
│   │   │       ├── DTREE.json
│   │   │       ├── DYNAMICLINEAR.json
│   │   │       ├── EEL.json
│   │   │       ├── EFA.json
│   │   │       ├── ENTROPY.json
│   │   │       ├── ERCOMPSTORE.json
│   │   │       ├── ERQUERY.json
│   │   │       ├── ERUPSERT.json
│   │   │       ├── ESM.json
│   │   │       ├── EXPAND.json
│   │   │       ├── EXPORT.json
│   │   │       ├── FACTEX.json
│   │   │       ├── FACTMAC.json
│   │   │       ├── FACTOR.json
│   │   │       ├── FASTCLUS.json
│   │   │       ├── FASTKNN.json
│   │   │       ├── FCMP.json
│   │   │       ├── FEDSQL.json
│   │   │       ├── FISM.json
│   │   │       ├── FITTEDQNET.json
│   │   │       ├── FMM.json
│   │   │       ├── FMTC2ITM.json
│   │   │       ├── FONTREG.json
│   │   │       ├── FOREST.json
│   │   │       ├── FORMAT.json
│   │   │       ├── FREQ.json
│   │   │       ├── FREQTAB.json
│   │   │       ├── G3D.json
│   │   │       ├── G3GRID.json
│   │   │       ├── GA.json
│   │   │       ├── GAM.json
│   │   │       ├── GAMMOD.json
│   │   │       ├── GAMPL.json
│   │   │       ├── GAMSELECT.json
│   │   │       ├── GANNO.json
│   │   │       ├── GANTT.json
│   │   │       ├── GATEWAY.json
│   │   │       ├── GBARLINE.json
│   │   │       ├── GCHART.json
│   │   │       ├── GCONTOUR.json
│   │   │       ├── GDEVICE.json
│   │   │       ├── GEE.json
│   │   │       ├── GENMOD.json
│   │   │       ├── GENSELECT.json
│   │   │       ├── GEOCODE.json
│   │   │       ├── GFONT.json
│   │   │       ├── GINSIDE.json
│   │   │       ├── GKPI.json
│   │   │       ├── GLIMMIX.json
│   │   │       ├── GLM.json
│   │   │       ├── GLMMOD.json
│   │   │       ├── GLMPOWER.json
│   │   │       ├── GLMSELECT.json
│   │   │       ├── GMAP.json
│   │   │       ├── GMM.json
│   │   │       ├── GOPTIONS.json
│   │   │       ├── GPCLASS.json
│   │   │       ├── GPLOT.json
│   │   │       ├── GPREG.json
│   │   │       ├── GPROJECT.json
│   │   │       ├── GRADAR.json
│   │   │       ├── GRADBOOST.json
│   │   │       ├── GREDUCE.json
│   │   │       ├── GREMOVE.json
│   │   │       ├── GREPLAY.json
│   │   │       ├── GROOVY.json
│   │   │       ├── GSLIDE.json
│   │   │       ├── GTILE.json
│   │   │       ├── GVARCLUS.json
│   │   │       ├── HADOOP.json
│   │   │       ├── HMM.json
│   │   │       ├── HP4SCORE.json
│   │   │       ├── HPBIN.json
│   │   │       ├── HPCANDISC.json
│   │   │       ├── HPCDM.json
│   │   │       ├── HPCLUS.json
│   │   │       ├── HPCORR.json
│   │   │       ├── HPCOUNTREG.json
│   │   │       ├── HPDECIDE.json
│   │   │       ├── HPDMDB.json
│   │   │       ├── HPDS2.json
│   │   │       ├── HPEXPORT.json
│   │   │       ├── HPF.json
│   │   │       ├── HPFARIMASPEC.json
│   │   │       ├── HPFDIAGNOSE.json
│   │   │       ├── HPFENGINE.json
│   │   │       ├── HPFESMSPEC.json
│   │   │       ├── HPFEVENTS.json
│   │   │       ├── HPFEXMSPEC.json
│   │   │       ├── HPFIDMSPEC.json
│   │   │       ├── HPFMM.json
│   │   │       ├── HPFOREST.json
│   │   │       ├── HPFRECON.json
│   │   │       ├── HPFSELECT.json
│   │   │       ├── HPFTEMPRECON.json
│   │   │       ├── HPFUCMSPEC.json
│   │   │       ├── HPGENSELECT.json
│   │   │       ├── HPIMPUTE.json
│   │   │       ├── HPLMIXED.json
│   │   │       ├── HPLOGISTIC.json
│   │   │       ├── HPMIXED.json
│   │   │       ├── HPNEURAL.json
│   │   │       ├── HPNLMOD.json
│   │   │       ├── HPPANEL.json
│   │   │       ├── HPPLS.json
│   │   │       ├── HPPRINCOMP.json
│   │   │       ├── HPQLIM.json
│   │   │       ├── HPQUANTSELECT.json
│   │   │       ├── HPREDUCE.json
│   │   │       ├── HPREG.json
│   │   │       ├── HPSAMPLE.json
│   │   │       ├── HPSEVERITY.json
│   │   │       ├── HPSPLIT.json
│   │   │       ├── HPSUMMARY.json
│   │   │       ├── HTTP.json
│   │   │       ├── ICA.json
│   │   │       ├── ICLIFETEST.json
│   │   │       ├── ICPHREG.json
│   │   │       ├── IML.json
│   │   │       ├── IMPORT.json
│   │   │       ├── INBREED.json
│   │   │       ├── IRP.json
│   │   │       ├── IRT.json
│   │   │       ├── JAVAINFO.json
│   │   │       ├── JSON.json
│   │   │       ├── KCLUS.json
│   │   │       ├── KDE.json
│   │   │       ├── KPCA.json
│   │   │       ├── KRIGE2D.json
│   │   │       ├── LATTICE.json
│   │   │       ├── LIFEREG.json
│   │   │       ├── LIFETEST.json
│   │   │       ├── LMIXED.json
│   │   │       ├── LOAN.json
│   │   │       ├── LOCALEDATA.json
│   │   │       ├── LOESS.json
│   │   │       ├── LOGISTIC.json
│   │   │       ├── LOGSELECT.json
│   │   │       ├── LUA.json
│   │   │       ├── MACONTROL.json
│   │   │       ├── MAPIMPORT.json
│   │   │       ├── MBANALYSIS.json
│   │   │       ├── MBC.json
│   │   │       ├── MCMC.json
│   │   │       ├── MDC.json
│   │   │       ├── MDS.json
│   │   │       ├── MDSUMMARY.json
│   │   │       ├── MEANS.json
│   │   │       ├── MI.json
│   │   │       ├── MIANALYZE.json
│   │   │       ├── MIGRATE.json
│   │   │       ├── MIRP.json
│   │   │       ├── MIXED.json
│   │   │       ├── MKTATTRIBUTION.json
│   │   │       ├── MODECLUS.json
│   │   │       ├── MODEL.json
│   │   │       ├── MODELMATRIX.json
│   │   │       ├── MTLEARN.json
│   │   │       ├── MTS.json
│   │   │       ├── MTSSCORE.json
│   │   │       ├── MULTTEST.json
│   │   │       ├── MVOUTLIER.json
│   │   │       ├── MVPDIAGNOSE.json
│   │   │       ├── MVPMODEL.json
│   │   │       ├── MVPMONITOR.json
│   │   │       ├── MWPCA.json
│   │   │       ├── NESTED.json
│   │   │       ├── NETDRAW.json
│   │   │       ├── NETWORK.json
│   │   │       ├── NLIN.json
│   │   │       ├── NLMIXED.json
│   │   │       ├── NLMOD.json
│   │   │       ├── NNET.json
│   │   │       ├── NPAR1WAY.json
│   │   │       ├── ODSLIST.json
│   │   │       ├── ODSTABLE.json
│   │   │       ├── ODSTEXT.json
│   │   │       ├── OPTBINNING.json
│   │   │       ├── OPTEX.json
│   │   │       ├── OPTGRAPH.json
│   │   │       ├── OPTIONS.json
│   │   │       ├── OPTLOAD.json
│   │   │       ├── OPTLP.json
│   │   │       ├── OPTLSO.json
│   │   │       ├── OPTMILP.json
│   │   │       ├── OPTMODEL.json
│   │   │       ├── OPTNET.json
│   │   │       ├── OPTNETWORK.json
│   │   │       ├── OPTQP.json
│   │   │       ├── OPTSAVE.json
│   │   │       ├── ORTHOREG.json
│   │   │       ├── PANEL.json
│   │   │       ├── PARETO.json
│   │   │       ├── PARTITION.json
│   │   │       ├── PATHING.json
│   │   │       ├── PCA.json
│   │   │       ├── PDLREG.json
│   │   │       ├── PHREG.json
│   │   │       ├── PHSELECT.json
│   │   │       ├── PLAN.json
│   │   │       ├── PLM.json
│   │   │       ├── PLS.json
│   │   │       ├── PLSMOD.json
│   │   │       ├── PM.json
│   │   │       ├── POWER.json
│   │   │       ├── PREFIXSPAN.json
│   │   │       ├── PRINCOMP.json
│   │   │       ├── PRINQUAL.json
│   │   │       ├── PRINT.json
│   │   │       ├── PRINTTO.json
│   │   │       ├── PROBIT.json
│   │   │       ├── PROTO.json
│   │   │       ├── PRTDEF.json
│   │   │       ├── PRTEXP.json
│   │   │       ├── PSMATCH.json
│   │   │       ├── PWENCODE.json
│   │   │       ├── PYTHON.json
│   │   │       ├── QDEVICE.json
│   │   │       ├── QKB.json
│   │   │       ├── QLIM.json
│   │   │       ├── QTRSELECT.json
│   │   │       ├── QUANTLIFE.json
│   │   │       ├── QUANTREG.json
│   │   │       ├── QUANTSELECT.json
│   │   │       ├── RANK.json
│   │   │       ├── REG.json
│   │   │       ├── REGISTERMODEL.json
│   │   │       ├── REGISTRY.json
│   │   │       ├── REGSELECT.json
│   │   │       ├── RELIABILITY.json
│   │   │       ├── REPORT.json
│   │   │       ├── RISK.json
│   │   │       ├── ROBUSTREG.json
│   │   │       ├── RPCA.json
│   │   │       ├── RSREG.json
│   │   │       ├── S3.json
│   │   │       ├── SANDWICH.json
│   │   │       ├── SCAPROC.json
│   │   │       ├── SCORE.json
│   │   │       ├── SCOREACCEL.json
│   │   │       ├── SEMISUPLEARN.json
│   │   │       ├── SEQDESIGN.json
│   │   │       ├── SEQMC.json
│   │   │       ├── SEQTEST.json
│   │   │       ├── SEVERITY.json
│   │   │       ├── SEVSELECT.json
│   │   │       ├── SGMAP.json
│   │   │       ├── SGPANEL.json
│   │   │       ├── SGPIE.json
│   │   │       ├── SGPLOT.json
│   │   │       ├── SGRENDER.json
│   │   │       ├── SGSCATTER.json
│   │   │       ├── SHAPLEY.json
│   │   │       ├── SHEWHART.json
│   │   │       ├── SIM2D.json
│   │   │       ├── SIMILARITY.json
│   │   │       ├── SIMLIN.json
│   │   │       ├── SIMNORMAL.json
│   │   │       ├── SIMSYSTEM.json
│   │   │       ├── SMCALIB.json
│   │   │       ├── SMPROJECT.json
│   │   │       ├── SMSCORE.json
│   │   │       ├── SMSELECT.json
│   │   │       ├── SMSPEC.json
│   │   │       ├── SORT.json
│   │   │       ├── SPARSEML.json
│   │   │       ├── SPC.json
│   │   │       ├── SPDO.json
│   │   │       ├── SPECTRA.json
│   │   │       ├── SPP.json
│   │   │       ├── SQL.json
│   │   │       ├── SQOOP.json
│   │   │       ├── SSM.json
│   │   │       ├── STANDARD.json
│   │   │       ├── STATESPACE.json
│   │   │       ├── STDIZE.json
│   │   │       ├── STDRATE.json
│   │   │       ├── STEPDISC.json
│   │   │       ├── STREAM.json
│   │   │       ├── STYLEGAN.json
│   │   │       ├── SUMMARY.json
│   │   │       ├── SUPERLEARNER.json
│   │   │       ├── SURVEYFREQ.json
│   │   │       ├── SURVEYIMPUTE.json
│   │   │       ├── SURVEYLOGISTIC.json
│   │   │       ├── SURVEYMEANS.json
│   │   │       ├── SURVEYPHREG.json
│   │   │       ├── SURVEYREG.json
│   │   │       ├── SURVEYSELECT.json
│   │   │       ├── SVDD.json
│   │   │       ├── SVMACHINE.json
│   │   │       ├── SYSLIN.json
│   │   │       ├── TABULARGAN.json
│   │   │       ├── TABULATE.json
│   │   │       ├── TEMPLATE.json
│   │   │       ├── TEXTCATEGORY.json
│   │   │       ├── TEXTCATSCORE.json
│   │   │       ├── TEXTCONCEPT.json
│   │   │       ├── TEXTCONCEPTSCORE.json
│   │   │       ├── TEXTMINE.json
│   │   │       ├── TEXTNEARDUP.json
│   │   │       ├── TEXTPROFILE.json
│   │   │       ├── TEXTRULE.json
│   │   │       ├── TEXTSENTIMENT.json
│   │   │       ├── TEXTSENTSCORE.json
│   │   │       ├── TEXTSUMMARY.json
│   │   │       ├── TIMEID.json
│   │   │       ├── TIMESERIES.json
│   │   │       ├── TMODEL.json
│   │   │       ├── TMSCORE.json
│   │   │       ├── TPSPLINE.json
│   │   │       ├── TRANSPOSE.json
│   │   │       ├── TRANSREG.json
│   │   │       ├── TRANTAB.json
│   │   │       ├── TREE.json
│   │   │       ├── TREESPLIT.json
│   │   │       ├── TSCSREG.json
│   │   │       ├── TSCUSTINT.json
│   │   │       ├── TSGLOBALRECON.json
│   │   │       ├── TSINFO.json
│   │   │       ├── TSMODEL.json
│   │   │       ├── TSMODREPO.json
│   │   │       ├── TSNE.json
│   │   │       ├── TSRECONCILE.json
│   │   │       ├── TSSELECTLAG.json
│   │   │       ├── TTEST.json
│   │   │       ├── UCM.json
│   │   │       ├── UNIVARIATE.json
│   │   │       ├── UPLOAD.json
│   │   │       ├── VARCLUS.json
│   │   │       ├── VARCOMP.json
│   │   │       ├── VARIMPUTE.json
│   │   │       ├── VARIOGRAM.json
│   │   │       ├── VARMAX.json
│   │   │       ├── VARREDUCE.json
│   │   │       ├── X11.json
│   │   │       ├── X12.json
│   │   │       └── XSL.json
│   │   ├── Statements/
│   │   │   └── en/
│   │   │       ├── datastep.json
│   │   │       ├── global.json
│   │   │       ├── macro.json
│   │   │       └── standalone.json
│   │   └── procedures.json
│   ├── src/
│   │   ├── browser/
│   │   │   ├── ResLoader.ts
│   │   │   └── server.ts
│   │   ├── node/
│   │   │   ├── ResLoader.ts
│   │   │   └── server.ts
│   │   ├── python/
│   │   │   ├── PyrightLanguageProvider.ts
│   │   │   ├── browser/
│   │   │   │   ├── PyrightLanguageProviderBrowser.ts
│   │   │   │   ├── fakeFileSystem.ts
│   │   │   │   ├── typeShed.ts
│   │   │   │   └── typeshed-loader/
│   │   │   │       └── index.js
│   │   │   ├── node/
│   │   │   │   └── PyrightLanguageProviderNode.ts
│   │   │   ├── sas/
│   │   │   │   └── sas2py.pyi
│   │   │   └── utils.ts
│   │   ├── sas/
│   │   │   ├── CodeZoneManager.ts
│   │   │   ├── CompletionProvider.ts
│   │   │   ├── FormatOnTypeProvider.ts
│   │   │   ├── LanguageServiceProvider.ts
│   │   │   ├── Lexer.ts
│   │   │   ├── LexerEx.ts
│   │   │   ├── Model.ts
│   │   │   ├── SyntaxDataProvider.ts
│   │   │   ├── SyntaxProvider.ts
│   │   │   ├── formatter/
│   │   │   │   ├── index.ts
│   │   │   │   ├── parser.ts
│   │   │   │   └── printer.ts
│   │   │   └── utils.ts
│   │   └── server.ts
│   ├── test/
│   │   └── embedded_lang/
│   │       └── embedded_lang.test.ts
│   ├── testFixture/
│   │   └── embedded_lang/
│   │       ├── proc_lua.sas
│   │       ├── proc_python.sas
│   │       ├── proc_r.sas
│   │       └── proc_sql.sas
│   └── tsconfig.json
├── snippets/
│   └── proc-snippets.json
├── syntaxes/
│   ├── sas.tmLanguage.json
│   └── sassql.tmLanguage.json
├── themes/
│   ├── dark_plus.json
│   ├── dark_vs.json
│   ├── hc_black.json
│   ├── light_plus.json
│   ├── light_vs.json
│   ├── sas-dark-color-theme.json
│   ├── sas-highcontrast-color-theme.json
│   └── sas-light-color-theme.json
├── tools/
│   ├── build.mjs
│   ├── check-copyright.mjs
│   ├── locale.mjs
│   └── preparePubsdata.js
├── tsconfig.json
├── webpack.config.js
└── website/
    ├── .gitignore
    ├── README.md
    ├── babel.config.js
    ├── docs/
    │   ├── Configurations/
    │   │   ├── Profiles/
    │   │   │   ├── _category_.json
    │   │   │   ├── additional.md
    │   │   │   ├── index.md
    │   │   │   ├── sas9iom.md
    │   │   │   ├── sas9local.md
    │   │   │   ├── sas9ssh.md
    │   │   │   └── viya.md
    │   │   ├── _category_.json
    │   │   ├── index.md
    │   │   └── sasLog.md
    │   ├── Features/
    │   │   ├── _category_.json
    │   │   ├── accessContent.md
    │   │   ├── accessLibraries.md
    │   │   ├── accessServer.md
    │   │   ├── errorsWarnings.md
    │   │   ├── index.md
    │   │   ├── running.md
    │   │   ├── runningTask.md
    │   │   ├── sasCodeEditing.md
    │   │   └── sasNotebook.md
    │   ├── README.md
    │   ├── faq.md
    │   ├── installation.md
    │   └── matrix.md
    ├── docusaurus.config.ts
    ├── package.json
    ├── src/
    │   └── css/
    │       └── custom.css
    ├── static/
    │   └── .nojekyll
    └── tsconfig.json
Download .txt
SYMBOL INDEX (1940 symbols across 123 files)

FILE: client/src/browser/extension.ts
  function activate (line 10) | function activate(context: ExtensionContext): void {
  function createWorkerLanguageClient (line 24) | function createWorkerLanguageClient(
  function deactivate (line 44) | function deactivate(): Thenable<void> | undefined {

FILE: client/src/commands/closeSession.ts
  function closeSession (line 8) | async function closeSession(message?: string): Promise<void> {

FILE: client/src/commands/new.ts
  function newSASNotebook (line 11) | async function newSASNotebook() {
  function newSASFile (line 22) | async function newSASFile() {

FILE: client/src/commands/profile.ts
  function addProfile (line 18) | async function addProfile(): Promise<void> {
  function updateProfile (line 33) | async function updateProfile(): Promise<void> {
  function switchProfile (line 51) | async function switchProfile(): Promise<void> {
  function deleteProfile (line 70) | async function deleteProfile(): Promise<void> {

FILE: client/src/commands/run.ts
  type FoldingBlock (line 31) | interface FoldingBlock {
  function getSelectedRegions (line 40) | async function getSelectedRegions(
  function runCode (line 91) | async function runCode(selected?: boolean, uri?: Uri) {
  function run (line 164) | async function run(): Promise<void> {
  function runSelected (line 168) | async function runSelected(uri: Uri): Promise<void> {
  function runRegion (line 172) | async function runRegion(client: BaseLanguageClient): Promise<void> {
  function hasRunningTask (line 178) | function hasRunningTask() {
  function runTask (line 182) | async function runTask(
  function _runTask (line 199) | async function _runTask(

FILE: client/src/commands/toggleLineComment.ts
  function toggleLineComment (line 9) | async function toggleLineComment(

FILE: client/src/components/AuthProvider.ts
  constant SECRET_KEY (line 21) | const SECRET_KEY = "SASAuth";
  type SASAuthSession (line 23) | interface SASAuthSession extends AuthenticationSession {
  class SASAuthProvider (line 27) | class SASAuthProvider implements AuthenticationProvider, Disposable {
    method onDidChangeSessions (line 35) | get onDidChangeSessions(): Event<AuthenticationProviderAuthenticationS...
    method constructor (line 39) | constructor() {
    method dispose (line 59) | dispose(): void {
    method getSessions (line 65) | async getSessions(): Promise<readonly AuthenticationSession[]> {
    method _getSessions (line 84) | private async _getSessions(): Promise<readonly AuthenticationSession[]> {
    method createSession (line 120) | async createSession(): Promise<AuthenticationSession> {
    method writeSession (line 156) | private async writeSession(session: SASAuthSession): Promise<void> {
    method removeSession (line 160) | async removeSession(sessionId: string, silent?: boolean): Promise<void> {

FILE: client/src/components/ContentNavigator/ContentAdapterFactory.ts
  class ContentAdapterFactory (line 13) | class ContentAdapterFactory {
    method create (line 14) | public create(

FILE: client/src/components/ContentNavigator/ContentDataProvider.ts
  class ContentDataProvider (line 63) | class ContentDataProvider
    method treeView (line 86) | get treeView(): TreeView<ContentItem> {
    method constructor (line 90) | constructor(
    method useModel (line 125) | public useModel(contentModel: ContentModel) {
    method handleDrop (line 129) | public async handleDrop(
    method handleDrag (line 157) | public handleDrag(
    method provideDocumentDropEdits (line 165) | public async provideDocumentDropEdits(
    method getSubscriptions (line 192) | public getSubscriptions(): Disposable[] {
    method onDidChangeFile (line 196) | get onDidChangeFile(): Event<FileChangeEvent[]> {
    method onDidChangeTreeData (line 200) | get onDidChangeTreeData(): Event<ContentItem> {
    method onDidChange (line 204) | get onDidChange(): Event<Uri> {
    method onDidManipulateFile (line 208) | get onDidManipulateFile(): Event<FileManipulationEvent> {
    method connect (line 212) | public async connect(baseUrl: string): Promise<void> {
    method getTreeItem (line 217) | public async getTreeItem(item: ContentItem): Promise<TreeItem> {
    method provideTextDocumentContent (line 246) | public async provideTextDocumentContent(uri: Uri): Promise<string> {
    method getChildren (line 251) | public getChildren(item?: ContentItem): ProviderResult<ContentItem[]> {
    method watch (line 255) | public watch(): Disposable {
    method stat (line 260) | public async stat(uri: Uri): Promise<FileStat> {
    method readFile (line 266) | public async readFile(uri: Uri): Promise<Uint8Array> {
    method createFolder (line 272) | public async createFolder(
    method createFile (line 283) | public async createFile(
    method renameResource (line 295) | public async renameResource(
    method writeFile (line 361) | public writeFile(uri: Uri, content: Uint8Array): void | Promise<void> {
    method deleteResource (line 365) | public async deleteResource(item: ContentItem): Promise<boolean> {
    method canRecycleResource (line 377) | public canRecycleResource(item: ContentItem): boolean {
    method recycleResource (line 381) | public async recycleResource(item: ContentItem): Promise<boolean> {
    method restoreResource (line 401) | public async restoreResource(item: ContentItem): Promise<boolean> {
    method emptyRecycleBin (line 413) | public async emptyRecycleBin(): Promise<boolean> {
    method addToMyFavorites (line 426) | public async addToMyFavorites(item: ContentItem): Promise<boolean> {
    method removeFromMyFavorites (line 434) | public async removeFromMyFavorites(item: ContentItem): Promise<boolean> {
    method handleCreationResponse (line 442) | public async handleCreationResponse(
    method refresh (line 455) | public refresh(): void {
    method getParent (line 460) | public async getParent(
    method delete (line 466) | public async delete(): Promise<void> {
    method rename (line 470) | public rename(): void | Promise<void> {
    method readDirectory (line 474) | public readDirectory():
    method createDirectory (line 480) | public createDirectory(): void | Thenable<void> {
    method reveal (line 484) | public reveal(item: ContentItem): void {
    method uploadUrisToTarget (line 492) | public async uploadUrisToTarget(
    method checkFolderDirty (line 519) | public async checkFolderDirty(resource: ContentItem): Promise<boolean> {
    method isDescendantOf (line 577) | private async isDescendantOf(
    method downloadContentItems (line 615) | public async downloadContentItems(
    method getPathOfItem (line 643) | public async getPathOfItem(item: ContentItem) {
    method childrenSelections (line 647) | private async childrenSelections(
    method moveItem (line 663) | private async moveItem(
    method handleContentItemDrop (line 684) | private async handleContentItemDrop(
    method handleFolderDrop (line 715) | private async handleFolderDrop(
    method handleDataTransferItemDrop (line 767) | private async handleDataTransferItemDrop(
    method iconPathForItem (line 807) | private iconPathForItem(

FILE: client/src/components/ContentNavigator/ContentModel.ts
  class ContentModel (line 11) | class ContentModel {
    method constructor (line 14) | constructor(contentAdapter: ContentAdapter) {
    method connected (line 18) | public connected(): boolean {
    method connect (line 22) | public async connect(baseURL: string): Promise<void> {
    method getAdapter (line 26) | public getAdapter() {
    method getChildren (line 30) | public async getChildren(item?: ContentItem): Promise<ContentItem[]> {
    method getParent (line 48) | public async getParent(item: ContentItem): Promise<ContentItem | undef...
    method getResourceByUri (line 52) | public async getResourceByUri(uri: Uri): Promise<ContentItem> {
    method getContentByUri (line 56) | public async getContentByUri(uri: Uri): Promise<string> {
    method downloadFile (line 74) | public async downloadFile(item: ContentItem): Promise<Buffer | undefin...
    method createFile (line 85) | public async createFile(
    method createUniqueFileOfPrefix (line 97) | public async createUniqueFileOfPrefix(
    method createFolder (line 135) | public async createFolder(
    method renameResource (line 142) | public async renameResource(
    method saveContentToUri (line 149) | public async saveContentToUri(uri: Uri, content: string): Promise<void> {
    method getUri (line 153) | public async getUri(item: ContentItem, readOnly: boolean): Promise<Uri> {
    method delete (line 157) | public async delete(item: ContentItem): Promise<boolean> {
    method addFavorite (line 161) | public async addFavorite(item: ContentItem): Promise<boolean> {
    method removeFavorite (line 165) | public async removeFavorite(item: ContentItem): Promise<boolean> {
    method moveTo (line 169) | public async moveTo(
    method getDelegateFolder (line 176) | public getDelegateFolder(name: string): ContentItem | undefined {
    method getFileFolderPath (line 180) | public async getFileFolderPath(contentItem: ContentItem): Promise<stri...
    method canRecycleResource (line 184) | public canRecycleResource(item: ContentItem): boolean {
    method recycleResource (line 193) | public async recycleResource(item: ContentItem) {
    method restoreResource (line 197) | public async restoreResource(item: ContentItem) {
    method getPathOfItem (line 201) | public async getPathOfItem(item: ContentItem): Promise<string> {

FILE: client/src/components/ContentNavigator/const.ts
  constant DEFAULT_FILE_CONTENT_TYPE (line 7) | const DEFAULT_FILE_CONTENT_TYPE = "text/plain";
  constant CONTENT_FOLDER_ID (line 9) | const CONTENT_FOLDER_ID = "CONTENT_FOLDER_ID";
  constant ROOT_FOLDER_TYPE (line 10) | const ROOT_FOLDER_TYPE = "RootFolder";
  constant ROOT_FOLDER (line 11) | const ROOT_FOLDER = createStaticFolder(
  constant SERVER_FOLDER_ID (line 18) | const SERVER_FOLDER_ID = "SERVER_FOLDER_ID";
  constant SERVER_ROOT_FOLDER_TYPE (line 19) | const SERVER_ROOT_FOLDER_TYPE = "ServerRootFolder";
  constant SERVER_HOME_FOLDER_TYPE (line 20) | const SERVER_HOME_FOLDER_TYPE = "ServerHomeFolder";
  constant SAS_SERVER_ROOT_FOLDER (line 21) | const SAS_SERVER_ROOT_FOLDER = createStaticFolder(
  constant STOP_SIGN (line 29) | const STOP_SIGN = "__STOP_SIGN__";
  constant FILE_TYPE (line 30) | const FILE_TYPE = "file";
  constant DATAFLOW_TYPE (line 31) | const DATAFLOW_TYPE = "dataFlow";
  constant FILE_TYPES (line 32) | const FILE_TYPES = [FILE_TYPE, DATAFLOW_TYPE];
  constant FOLDER_TYPE (line 33) | const FOLDER_TYPE = "folder";
  constant MYFOLDER_TYPE (line 34) | const MYFOLDER_TYPE = "myFolder";
  constant TRASH_FOLDER_TYPE (line 35) | const TRASH_FOLDER_TYPE = "trashFolder";
  constant FAVORITES_FOLDER_TYPE (line 36) | const FAVORITES_FOLDER_TYPE = "favoritesFolder";
  constant FOLDER_TYPES (line 37) | const FOLDER_TYPES = [
  constant SAS_CONTENT_ROOT_FOLDERS (line 47) | const SAS_CONTENT_ROOT_FOLDERS = [
  constant SAS_SERVER_ROOT_FOLDERS (line 54) | const SAS_SERVER_ROOT_FOLDERS = ["@sasServerRoot"];
  constant ALL_ROOT_FOLDERS (line 56) | const ALL_ROOT_FOLDERS = [

FILE: client/src/components/ContentNavigator/convert.ts
  constant NODE_SPACING (line 33) | const NODE_SPACING = 150;
  type Entry (line 35) | interface Entry {
  function getPropPort (line 40) | function getPropPort(idx: number, inputList: Entry[]): Record<string, st...
  function generateFlowDataNode (line 184) | function generateFlowDataNode(inputList: Entry[], outputFile: string) {
  function generateFlowDataSwimlane (line 258) | function generateFlowDataSwimlane(inputList: Entry[], outputFile: string) {
  function generateFlowData (line 292) | function generateFlowData(inputList: Entry[], outputFile: string) {
  function generateCodeListFromSASNotebook (line 302) | function generateCodeListFromSASNotebook(content: string): Entry[] {
  function convertNotebookToFlow (line 326) | function convertNotebookToFlow(
  class NotebookToFlowConverter (line 343) | class NotebookToFlowConverter {
    method constructor (line 347) | public constructor(
    method inputName (line 354) | public get inputName() {
    method parent (line 360) | private async parent() {
    method content (line 380) | public async content() {
    method establishConnection (line 386) | public async establishConnection() {
    method convert (line 404) | public async convert(outputName: string) {

FILE: client/src/components/ContentNavigator/index.ts
  class ContentNavigator (line 66) | class ContentNavigator implements SubscriptionProvider {
    method constructor (line 72) | constructor(context: ExtensionContext, config: ContentNavigatorConfig) {
    method onDidManipulateFile (line 94) | get onDidManipulateFile(): Event<FileManipulationEvent> {
    method getSubscriptions (line 98) | public getSubscriptions(): Disposable[] {
    method collapseAllContent (line 450) | private async collapseAllContent() {
    method uploadResource (line 460) | private async uploadResource(
    method viyaEndpoint (line 485) | private viyaEndpoint(): string {
    method getTreeViewSelections (line 496) | private getTreeViewSelections(item: ContentItem): ContentItem[] {
    method contentAdapterForConnectionType (line 508) | private contentAdapterForConnectionType(): ContentAdapter | undefined {

FILE: client/src/components/ContentNavigator/types.ts
  type ContentItem (line 5) | interface ContentItem {
  type Link (line 33) | interface Link {
  type Permission (line 41) | interface Permission {
  type FileManipulationEvent (line 47) | interface FileManipulationEvent {
  type RootFolderMap (line 53) | type RootFolderMap = { [name: string]: ContentItem };
  type AddChildItemProperties (line 55) | interface AddChildItemProperties {
  type ContentAdapter (line 61) | interface ContentAdapter {
  type ContentSourceType (line 107) | enum ContentSourceType {
  type ContentNavigatorConfig (line 112) | interface ContentNavigatorConfig {

FILE: client/src/components/ContentNavigator/utils.ts
  type ContextMenuAction (line 183) | enum ContextMenuAction {
  class ContextMenuProvider (line 195) | class ContextMenuProvider {
    method constructor (line 196) | constructor(
    method availableActions (line 203) | public availableActions(item: ContentItem): string {

FILE: client/src/components/ExtensionContext.ts
  function setContext (line 7) | function setContext(c: ExtensionContext) {
  function setContextValue (line 14) | async function setContextValue(
  function getContextValue (line 24) | async function getContextValue(
  function getGlobalStorageUri (line 30) | function getGlobalStorageUri(): Uri {
  function getSecretStorage (line 34) | function getSecretStorage<T = string>(namespace: string) {

FILE: client/src/components/LibraryNavigator/LibraryAdapterFactory.ts
  class LibraryAdapterFactory (line 8) | class LibraryAdapterFactory {
    method create (line 9) | public create(connectionType: ConnectionType): LibraryAdapter {

FILE: client/src/components/LibraryNavigator/LibraryDataProvider.ts
  class LibraryDataProvider (line 36) | class LibraryDataProvider
    method onDidChangeTreeData (line 49) | get onDidChangeTreeData(): Event<LibraryItem> {
    method treeView (line 53) | get treeView(): TreeView<LibraryItem> {
    method constructor (line 57) | constructor(
    method getSubscriptions (line 76) | public getSubscriptions(): Disposable[] {
    method handleDrag (line 80) | public handleDrag(
    method provideDocumentDropEdits (line 94) | public async provideDocumentDropEdits(
    method selector (line 108) | public selector(): DocumentSelector {
    method getTreeItem (line 112) | public getTreeItem(item: LibraryItem): TreeItem | Promise<TreeItem> {
    method iconPathForItem (line 143) | private iconPathForItem(
    method getChildren (line 164) | public getChildren(item?: LibraryItem): ProviderResult<LibraryItem[]> {
    method writeTableContentsToStream (line 168) | public writeTableContentsToStream(stream: Writable, item: LibraryItem) {
    method deleteTables (line 172) | public async deleteTables(items: LibraryItem[]): Promise<void> {
    method watch (line 177) | public watch(): Disposable {
    method useAdapter (line 182) | public useAdapter(libraryAdapter: LibraryAdapter): void {
    method getTableInfo (line 187) | public async getTableInfo(item: LibraryItem) {
    method fetchColumns (line 191) | public async fetchColumns(item: LibraryItem) {

FILE: client/src/components/LibraryNavigator/LibraryModel.ts
  class LibraryModel (line 21) | class LibraryModel {
    method constructor (line 22) | public constructor(protected libraryAdapter: LibraryAdapter | undefine...
    method useAdapter (line 24) | public useAdapter(adapter: LibraryAdapter): void {
    method getTableResultSet (line 28) | public getTableResultSet(
    method writeTableContentsToStream (line 57) | public async writeTableContentsToStream(
    method fetchColumns (line 111) | public async fetchColumns(item: LibraryItem) {
    method deleteTables (line 131) | public async deleteTables(items: LibraryItem[]) {
    method getTableInfo (line 149) | public async getTableInfo(item: LibraryItem) {
    method getChildren (line 157) | public async getChildren(item?: LibraryItem): Promise<LibraryItem[]> {
    method getLibraries (line 168) | public async getLibraries(): Promise<LibraryItem[]> {
    method getTables (line 190) | public async getTables(item: LibraryItem): Promise<LibraryItem[]> {
    method processItems (line 210) | private processItems(

FILE: client/src/components/LibraryNavigator/PaginatedResultSet.ts
  class PaginatedResultSet (line 7) | class PaginatedResultSet<T> {
    method constructor (line 8) | constructor(
    method getData (line 12) | public async getData(

FILE: client/src/components/LibraryNavigator/index.ts
  class LibraryNavigator (line 32) | class LibraryNavigator implements SubscriptionProvider {
    method constructor (line 37) | constructor(context: ExtensionContext) {
    method getSubscriptions (line 46) | public getSubscriptions(): Disposable[] {
    method refresh (line 149) | public async refresh(): Promise<void> {
    method displayTableProperties (line 153) | private async displayTableProperties(
    method libraryAdapterForConnectionType (line 181) | private libraryAdapterForConnectionType(): LibraryAdapter | undefined {

FILE: client/src/components/LibraryNavigator/types.ts
  type LibraryItemType (line 9) | type LibraryItemType = "library" | "table";
  type LibraryItem (line 10) | interface LibraryItem {
  type TableRow (line 19) | interface TableRow {
  type TableData (line 24) | interface TableData {
  type TableQuery (line 29) | interface TableQuery {
  type LibraryAdapter (line 33) | interface LibraryAdapter {

FILE: client/src/components/ResultPanel/ResultPanel.ts
  constant SCRIPT_REGEX (line 10) | const SCRIPT_REGEX = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
  constant SAS_RESULT_PANEL (line 11) | const SAS_RESULT_PANEL = "SASResultPanel";
  type ResultPanelState (line 13) | interface ResultPanelState {
  type IdentifiableWebviewPanel (line 17) | interface IdentifiableWebviewPanel {

FILE: client/src/components/ResultPanel/ResultPanelSubscriptionProvider.ts
  type ResultPanelContext (line 8) | interface ResultPanelContext {
  class ResultPanelSubscriptionProvider (line 12) | class ResultPanelSubscriptionProvider implements SubscriptionProvider {
    method getSubscriptions (line 13) | getSubscriptions(): Disposable[] {

FILE: client/src/components/StatusBarItem.ts
  function updateStatusBarItem (line 12) | async function updateStatusBarItem(connected?: boolean) {
  function resetStatusBarItem (line 37) | function resetStatusBarItem(): void {

FILE: client/src/components/SubscriptionProvider.ts
  type SubscriptionProvider (line 5) | interface SubscriptionProvider {

FILE: client/src/components/logViewer/DiagnosticCodeActionProvider.ts
  class DiagnosticCodeActionProvider (line 20) | class DiagnosticCodeActionProvider implements CodeActionProvider {
    method provideCodeActions (line 22) | provideCodeActions(
    method createCodeAction (line 58) | private createCodeAction(

FILE: client/src/components/logViewer/ProblemProcessor.ts
  type ProblemType (line 5) | type ProblemType = "error" | "warning";
  type RawProblem (line 20) | type RawProblem = {
  type RawLocationGroup (line 35) | type RawLocationGroup = {
  type RawLocationDesc (line 50) | type RawLocationDesc = {
  type LocationOffset (line 58) | type LocationOffset = {
  type Problem (line 63) | type Problem = {
  type ProblemLocation (line 71) | type ProblemLocation = {
  class ProblemProcessor (line 80) | class ProblemProcessor {
    method constructor (line 86) | public constructor(
    method addProblemLogLine (line 100) | public addProblemLogLine(logLine: LogLine) {
    method appendProblemLogLine (line 104) | public appendProblemLogLine(logLine: LogLine) {
    method addLocationIndicatorLogLine (line 111) | public addLocationIndicatorLogLine(logLine: LogLine) {
    method addProblemNumberLogLine (line 133) | public addProblemNumberLogLine(logLine: LogLine) {
    method isReady (line 149) | public isReady() {
    method processProblems (line 153) | public processProblems(offset?: LocationOffset | undefined): Problem[] {
    method setSourceCodeLine (line 224) | public setSourceCodeLine(newSourceCodeLine: string) {
    method getSourceCodeLines (line 267) | public getSourceCodeLines(): string[] {
    method getUnclaimedLocations (line 271) | public getUnclaimedLocations(): ProblemLocation[] {
    method processGeneralProblems (line 275) | private processGeneralProblems(
    method processTypedProblems (line 306) | private processTypedProblems(
    method createRawProblem (line 361) | private createRawProblem(logLine: LogLine): RawProblem {
  function decomposeCodeLogLine (line 376) | function decomposeCodeLogLine(codeLine: string): {
  function getLastElement (line 391) | function getLastElement<T>(arr: T[]): T | null {
  function getProblemNumberFromProblemLogLine (line 404) | function getProblemNumberFromProblemLogLine(
  function processLocations (line 412) | function processLocations(
  function processLocationsFromIndicatorLine (line 424) | function processLocationsFromIndicatorLine(
  function processLocationFromProblemNumberLine (line 439) | function processLocationFromProblemNumberLine(
  function reviseLocationsFromIndicatorLine (line 454) | function reviseLocationsFromIndicatorLine(
  function processRawLocationDescs (line 472) | function processRawLocationDescs(
  function processSourceCodeLines (line 483) | function processSourceCodeLines(
  function processRawLocationDesc (line 520) | function processRawLocationDesc(
  function adjustAppearanceOrder (line 564) | function adjustAppearanceOrder(
  function processRawLocationGroup (line 600) | function processRawLocationGroup(
  function processGeneralLocation (line 659) | function processGeneralLocation(
  function getFirstCharacterIndex (line 678) | function getFirstCharacterIndex(logLine: string): number {
  function isSourceCodeLineAfterLineWrapping (line 705) | function isSourceCodeLineAfterLineWrapping(logLine: string): boolean {

FILE: client/src/components/logViewer/logParser.ts
  function parseLog (line 12) | function parseLog(
  function getTheLatestLogs (line 91) | function getTheLatestLogs(logs: LogLine[], firstCodeLine: string): LogLi...
  function getProblemRelatedLogs (line 107) | function getProblemRelatedLogs(logs: LogLine[]): LogLine[] {
  function calculateLocationOffset (line 113) | function calculateLocationOffset(
  function isProblemTypeLog (line 132) | function isProblemTypeLog(logLine: LogLine): boolean {
  function isSourceTypeLog (line 136) | function isSourceTypeLog(logLine: LogLine): boolean {
  function isEmptyCodeLogLine (line 140) | function isEmptyCodeLogLine(logLine: string): boolean {
  function isNewProblemLogLine (line 150) | function isNewProblemLogLine(line: string): boolean {
  function isLocationIndicatorLogLine (line 167) | function isLocationIndicatorLogLine(logLine: string): boolean {
  function isProblemNumberLogLine (line 182) | function isProblemNumberLogLine(line: string): boolean {
  function isValidSourceCodeLog (line 186) | function isValidSourceCodeLog(logLine: LogLine): boolean {
  function areSameLines (line 190) | function areSameLines(line1: string, line2: string) {
  function cleanCodeLines (line 195) | function cleanCodeLines(codeLines: string[]): string[] {

FILE: client/src/components/logViewer/sasDiagnostics.ts
  type DiagnosticCommands (line 29) | enum DiagnosticCommands {
  function ignore (line 36) | function ignore(diagnosticsToRemove: Diagnostic[], uri: Uri): void {
  function ignoreAll (line 45) | function ignoreAll(uri: Uri, severity?: DiagnosticSeverity): void {
  function updateDiagnosticUri (line 57) | function updateDiagnosticUri(oldUri: Uri, newUri: Uri): void {
  function getSasDiagnosticCollection (line 64) | function getSasDiagnosticCollection(): DiagnosticCollection {
  function updateDiagnostics (line 71) | async function updateDiagnostics(
  function updateProblemLocation (line 100) | async function updateProblemLocation(
  function constructDiagnostics (line 126) | function constructDiagnostics(problems: Problem[]): Diagnostic[] {
  function generateLogFn (line 142) | function generateLogFn(
  function getSubscriptions (line 172) | function getSubscriptions(): Disposable[] {

FILE: client/src/components/notebook/Controller.ts
  class NotebookController (line 10) | class NotebookController {
    method constructor (line 20) | constructor() {
    method dispose (line 33) | dispose(): void {
    method _execute (line 37) | private async _execute(cells: vscode.NotebookCell[]): Promise<void> {
    method _doExecution (line 55) | private async _doExecution(cell: vscode.NotebookCell): Promise<void> {
    method _interrupt (line 110) | private _interrupt() {

FILE: client/src/components/notebook/Serializer.ts
  type RawNotebookCell (line 7) | interface RawNotebookCell {
  class NotebookSerializer (line 19) | class NotebookSerializer implements vscode.NotebookSerializer {
    method deserializeNotebook (line 23) | async deserializeNotebook(content: Uint8Array): Promise<vscode.Noteboo...
    method serializeNotebook (line 56) | async serializeNotebook(data: vscode.NotebookData): Promise<Uint8Array> {

FILE: client/src/components/notebook/renderers/HTMLRenderer.ts
  function replaceLast (line 8) | function replaceLast(
  method renderOutputItem (line 23) | renderOutputItem(data, element) {

FILE: client/src/components/notebook/renderers/LogRenderer.ts
  method renderOutputItem (line 14) | renderOutputItem(data, element) {

FILE: client/src/components/profile.ts
  constant EXTENSION_CONFIG_KEY (line 14) | const EXTENSION_CONFIG_KEY = "SAS";
  constant EXTENSION_DEFINE_PROFILES_CONFIG_KEY (line 15) | const EXTENSION_DEFINE_PROFILES_CONFIG_KEY = "connectionProfiles";
  constant EXTENSION_PROFILES_CONFIG_KEY (line 16) | const EXTENSION_PROFILES_CONFIG_KEY = "profiles";
  constant EXTENSION_ACTIVE_PROFILE_CONFIG_KEY (line 17) | const EXTENSION_ACTIVE_PROFILE_CONFIG_KEY = "activeProfile";
  type ConnectionOptions (line 19) | enum ConnectionOptions {
  constant CONNECTION_PICK_OPTS (line 26) | const CONNECTION_PICK_OPTS: string[] = [
  constant DEFAULT_COMPUTE_CONTEXT (line 36) | const DEFAULT_COMPUTE_CONTEXT = "SAS Job Execution compute context";
  constant DEFAULT_SSH_PORT (line 37) | const DEFAULT_SSH_PORT = "22";
  constant DEFAULT_IOM_PORT (line 38) | const DEFAULT_IOM_PORT = "8591";
  type Dictionary (line 43) | type Dictionary<T> = {
  type AuthType (line 50) | enum AuthType {
  type ConnectionType (line 58) | enum ConnectionType {
  type ViyaProfile (line 76) | interface ViyaProfile extends BaseProfile, ProfileWithFileRootOptions {
  type SSHProfile (line 85) | interface SSHProfile extends BaseProfile {
  type COMProfile (line 94) | interface COMProfile extends BaseProfile, ProfileWithFileRootOptions {
  type IOMProfile (line 99) | interface IOMProfile extends BaseProfile, ProfileWithFileRootOptions {
  type Profile (line 106) | type Profile = ViyaProfile | SSHProfile | COMProfile | IOMProfile;
  type AutoExecType (line 108) | enum AutoExecType {
  type AutoExec (line 113) | type AutoExec = AutoExecLine | AutoExecFile;
  type AutoExecLine (line 115) | interface AutoExecLine {
  type AutoExecFile (line 120) | interface AutoExecFile {
  type BaseProfile (line 125) | interface BaseProfile {
  type ProfileWithFileRootOptions (line 130) | interface ProfileWithFileRootOptions {
  type ProfileDetail (line 181) | interface ProfileDetail {
  type ProfileValidation (line 190) | interface ProfileValidation {
  class ProfileConfig (line 202) | class ProfileConfig {
    method migrateLegacyProfiles (line 206) | async migrateLegacyProfiles() {
    method validateSettings (line 233) | validateSettings(): boolean {
    method getActiveProfile (line 257) | getActiveProfile(): string {
    method getAllProfiles (line 274) | getAllProfiles(): Dictionary<Profile> {
    method updateProfileSetting (line 290) | async updateProfileSetting(profileDict: Dictionary<Profile>): Promise<...
    method updateActiveProfileSetting (line 310) | async updateActiveProfileSetting(activeProfileParam: string): Promise<...
    method length (line 335) | length(): number {
    method listProfile (line 344) | listProfile(): string[] {
    method getProfileByName (line 355) | getProfileByName<T extends Profile>(name: string): T {
    method getActiveProfileDetail (line 370) | getActiveProfileDetail(): ProfileDetail | undefined {
    method upsertProfile (line 398) | async upsertProfile(name: string, profile: Profile): Promise<void> {
    method deleteProfile (line 411) | async deleteProfile(name: string): Promise<void> {
    method validateProfile (line 435) | validateProfile(profileDetail?: ProfileDetail): ProfileValidation {
    method prompt (line 489) | async prompt(name: string): Promise<void> {
    method remoteTarget (line 638) | remoteTarget(profileName: string): string {
  type ProfilePrompt (line 654) | interface ProfilePrompt {
  type ProfilePromptType (line 663) | enum ProfilePromptType {
  type ProfilePromptInput (line 681) | type ProfilePromptInput = {
  function getProfilePrompt (line 691) | function getProfilePrompt(type: ProfilePromptType): ProfilePrompt {
  function createInputTextBox (line 704) | async function createInputTextBox(
  function createInputQuickPick (line 728) | async function createInputQuickPick(
  function mapQuickPickToEnum (line 825) | function mapQuickPickToEnum(connectionTypePickInput: string): Connection...

FILE: client/src/components/tasks/SasTaskProvider.ts
  class SasTaskProvider (line 24) | class SasTaskProvider implements TaskProvider {
    method provideTasks (line 25) | provideTasks(): ProviderResult<Task[]> {
    method resolveTask (line 29) | resolveTask(task: Task): ProviderResult<Task> {
  class SasPseudoterminal (line 36) | class SasPseudoterminal implements Pseudoterminal {
    method constructor (line 40) | constructor(
    method open (line 48) | public open(): void {
    method close (line 59) | public close(): void {
    method handleInput (line 62) | public handleInput?(data): void {
    method executeTask (line 70) | private async executeTask(): Promise<void> {
  function generateTask (line 86) | function generateTask(task: string | Task, execute: Execute) {

FILE: client/src/components/tasks/SasTasks.ts
  constant SAS_TASK_TYPE (line 11) | const SAS_TASK_TYPE = "sas";
  type SasTaskNames (line 13) | enum SasTaskNames {
  type SasTaskDefinition (line 20) | interface SasTaskDefinition extends TaskDefinition {
  type TaskInfo (line 27) | interface TaskInfo {
  type Execute (line 32) | type Execute = (
  function runSasFileTask (line 38) | async function runSasFileTask(
  function getTextDocumentFromFile (line 63) | async function getTextDocumentFromFile(file: string | undefined) {

FILE: client/src/components/utils/SASCodeDocument.ts
  type SASCodeDocumentParameters (line 8) | interface SASCodeDocumentParameters {
  type LineNumber (line 26) | type LineNumber = number;
  type Offset (line 27) | type Offset = { lineOffset: number; columnOffset: number };
  class SASCodeDocument (line 29) | class SASCodeDocument {
    method constructor (line 34) | public constructor(private parameters: SASCodeDocumentParameters) {}
    method getWrappedCode (line 36) | public getWrappedCode(): string {
    method getUri (line 41) | public getUri(): string {
    method getFileName (line 45) | public getFileName(): string {
    method wrappedCodeLineAt (line 49) | public wrappedCodeLineAt(lineNumber: number) {
    method getLocationInRawCode (line 53) | public async getLocationInRawCode(
    method codeIsEmpty (line 126) | private codeIsEmpty(code: string): boolean {
    method wrapCodeWithSASProgramFileName (line 130) | private wrapCodeWithSASProgramFileName(code: string): string {
    method wrapCodeWithPreambleAndPostamble (line 142) | private wrapCodeWithPreambleAndPostamble(code: string): string {
    method wrapCodeWithOutputHtml (line 150) | private wrapCodeWithOutputHtml(code: string): string {
    method wrapSQL (line 169) | private wrapSQL(code: string) {
    method wrapPython (line 175) | private wrapPython(code: string) {
    method wrapR (line 183) | private wrapR(code: string) {
    method insertLogStartIndicator (line 191) | private insertLogStartIndicator(code: string): string {
    method wrapCode (line 198) | private wrapCode(code: string): string {
    method getRawCodeBeginLineNumberInWrappedCode (line 226) | private getRawCodeBeginLineNumberInWrappedCode(): number {
    method constructCodeLinesInRaw (line 236) | private constructCodeLinesInRaw(): {
    method getNextValidCodeLineInLog (line 261) | private getNextValidCodeLineInLog(
    method constructOffsetMap (line 278) | private async constructOffsetMap(codeLinesInLog: string[]): Promise<vo...
    method getMatchedCodeLineInLog (line 389) | private getMatchedCodeLineInLog(
    method getRawCode (line 410) | private getRawCode(): string {
  function isSameOrStartsWith (line 417) | function isSameOrStartsWith(base: string, target: string): boolean {

FILE: client/src/components/utils/SASCodeDocumentHelper.ts
  function getCodeDocumentConstructionParameters (line 21) | function getCodeDocumentConstructionParameters(
  function getSelectedCode (line 72) | function getSelectedCode(
  function connectionTypeIsNotRest (line 87) | function connectionTypeIsNotRest(): boolean {
  function selectionsAreNotEmpty (line 95) | function selectionsAreNotEmpty(
  function getHtmlStyleValue (line 105) | function getHtmlStyleValue(): string {
  function getCodeSelections (line 137) | function getCodeSelections(
  function getFileName (line 155) | function getFileName(textDocument: TextDocument): string {

FILE: client/src/components/utils/deferred.ts
  type Deferred (line 4) | interface Deferred<T> {
  function deferred (line 11) | function deferred<T>() {

FILE: client/src/components/utils/settings.ts
  function isOutputHtmlEnabled (line 5) | function isOutputHtmlEnabled(): boolean {
  function getHtmlStyle (line 9) | function getHtmlStyle(): string {
  function isSideResultEnabled (line 13) | function isSideResultEnabled(): string {
  function isSinglePanelEnabled (line 17) | function isSinglePanelEnabled(): string {
  function showLogOnExecutionStart (line 21) | function showLogOnExecutionStart(): boolean {
  function showLogOnExecutionFinish (line 25) | function showLogOnExecutionFinish(): boolean {
  function clearLogOnExecutionStart (line 29) | function clearLogOnExecutionStart(): boolean {
  function isShowProblemsFromSASLogEnabled (line 33) | function isShowProblemsFromSASLogEnabled(): boolean {
  function includeLogInNotebookExport (line 37) | function includeLogInNotebookExport(): boolean {

FILE: client/src/components/utils/throttle.ts
  function throttle (line 10) | function throttle<T>(tasks: Array<() => Promise<T>>, limit: number) {

FILE: client/src/components/utils/treeViewSelections.ts
  function treeViewSelections (line 15) | function treeViewSelections<T extends TreeItem>(

FILE: client/src/connection/index.ts
  type ErrorRepresentation (line 25) | type ErrorRepresentation = ComputeError;
  type LogLine (line 26) | type LogLine = ComputeLogLine;
  type LogLineTypeEnum (line 27) | type LogLineTypeEnum = ComputeLogLineTypeEnum;
  type OnLogFn (line 28) | type OnLogFn = (logs: LogLine[]) => void;
  type RunResult (line 30) | interface RunResult {
  type BaseConfig (line 35) | interface BaseConfig {
  function getSession (line 40) | function getSession(): Session {
  function toRestConfig (line 73) | function toRestConfig(profile: ViyaProfile): RestConfig {

FILE: client/src/connection/itc/CodeRunner.ts
  function executeRawCode (line 15) | async function executeRawCode(code: string): Promise<string> {
  function runCode (line 35) | async function runCode(
  function _runCode (line 52) | async function _runCode(

FILE: client/src/connection/itc/ItcLibraryAdapter.ts
  class ItcLibraryAdapter (line 21) | class ItcLibraryAdapter implements LibraryAdapter {
    method connect (line 30) | public async connect(): Promise<void> {
    method setup (line 34) | public async setup(): Promise<void> {
    method deleteTable (line 42) | public async deleteTable(item: LibraryItem): Promise<void> {
    method getColumns (line 50) | public async getColumns(item: LibraryItem): Promise<ColumnCollection> {
    method getLibraries (line 65) | public async getLibraries(): Promise<{
    method getRows (line 93) | public async getRows(
    method getRowsAsCSV (line 119) | public async getRowsAsCSV(
    method getTableRowCount (line 142) | public async getTableRowCount(
    method getTables (line 158) | public async getTables(item: LibraryItem): Promise<{
    method getDatasetInformation (line 182) | protected async getDatasetInformation(
    method getTableInfo (line 209) | public async getTableInfo(item: LibraryItem): Promise<TableInfo> {
    method executionHandler (line 266) | protected async executionHandler(
    method runCode (line 277) | protected async runCode(
    method executeRawCode (line 285) | protected async executeRawCode(code: string): Promise<string> {

FILE: client/src/connection/itc/ItcServerAdapter.ts
  class ItcServerAdapter (line 34) | class ItcServerAdapter implements ContentAdapter {
    method constructor (line 39) | public constructor(
    method addChildItem (line 59) | public async addChildItem(): Promise<boolean> {
    method addItemToFavorites (line 62) | public async addItemToFavorites(): Promise<boolean> {
    method removeItemFromFavorites (line 65) | public removeItemFromFavorites(): Promise<boolean> {
    method getRootFolder (line 68) | public getRootFolder(): ContentItem | undefined {
    method getParentOfItem (line 73) | public async getParentOfItem(
    method getFolderPathForItem (line 84) | public async getFolderPathForItem(): Promise<string> {
    method connect (line 88) | public async connect(): Promise<void> {
    method connected (line 92) | public connected(): boolean {
    method createNewFolder (line 96) | public async createNewFolder(
    method createNewItem (line 120) | public async createNewItem(
    method deleteItem (line 143) | public async deleteItem(item: ContentItem): Promise<boolean> {
    method fileNavigationRootSettings (line 155) | private fileNavigationRootSettings() {
    method getChildItems (line 162) | public async getChildItems(parentItem: ContentItem): Promise<ContentIt...
    method getPathOfItem (line 219) | public async getPathOfItem(item: ContentItem): Promise<string> {
    method getTempFile (line 223) | private async getTempFile() {
    method getContentOfItem (line 237) | public async getContentOfItem(item: ContentItem): Promise<string> {
    method getContentOfUri (line 260) | public async getContentOfUri(uri: Uri): Promise<string> {
    method getItemOfUri (line 265) | public async getItemOfUri(uri: Uri): Promise<ContentItem> {
    method getRootItems (line 269) | public async getRootItems(): Promise<RootFolderMap> {
    method getUriOfItem (line 285) | public async getUriOfItem(item: ContentItem): Promise<Uri> {
    method moveItem (line 289) | public async moveItem(
    method renameItem (line 309) | public async renameItem(
    method updateContentOfItem (line 329) | public async updateContentOfItem(uri: Uri, content: string): Promise<v...
    method getItemAtPathWithName (line 342) | protected async getItemAtPathWithName(
    method getItemAtPath (line 355) | protected async getItemAtPath(path: string): Promise<ContentItem> {
    method convertPowershellResponseToContentItem (line 363) | private convertPowershellResponseToContentItem(
    method execute (line 412) | private async execute(incomingCode: string, params: Record<string, str...

FILE: client/src/connection/itc/LineParser.ts
  class LineParser (line 4) | class LineParser {
    method constructor (line 8) | public constructor(
    method processLine (line 14) | public processLine(line: string): string | undefined {
    method processedLine (line 27) | protected processedLine(): string {
    method isCapturingLine (line 37) | public isCapturingLine(): boolean {
    method reset (line 41) | public reset() {

FILE: client/src/connection/itc/index.ts
  constant SECRET_STORAGE_NAMESPACE (line 46) | const SECRET_STORAGE_NAMESPACE = "ITC_SECRET_STORAGE";
  class ITCSession (line 50) | class ITCSession extends Session {
    method constructor (line 68) | constructor() {
    method config (line 85) | public set config(value: Config) {
    method processLineCodes (line 488) | private processLineCodes(line: string): boolean {
    method getLogLineType (line 520) | private getLogLineType(): LogLineTypeEnum {

FILE: client/src/connection/itc/script/index.ts
  type ScriptProperties (line 6) | type ScriptProperties = {

FILE: client/src/connection/itc/types.ts
  type ScriptActions (line 5) | enum ScriptActions {
  type ITCProtocol (line 15) | enum ITCProtocol {
  type Config (line 23) | interface Config extends BaseConfig {
  type PowershellResponse (line 31) | type PowershellResponse = {

FILE: client/src/connection/rest/RestContentAdapter.ts
  class RestContentAdapter (line 46) | class RestContentAdapter implements ContentAdapter {
    method constructor (line 56) | public constructor() {
    method connected (line 73) | public connected(): boolean {
    method connect (line 77) | public async connect(baseURL: string): Promise<void> {
    method getConnection (line 100) | public getConnection() {
    method getRootFolder (line 104) | public getRootFolder(name: string): ContentItem | undefined {
    method myFavoritesFolder (line 108) | public get myFavoritesFolder(): ContentItem | undefined {
    method getParentOfItem (line 112) | public async getParentOfItem(
    method getChildItems (line 125) | public async getChildItems(parentItem: ContentItem): Promise<ContentIt...
    method getFolderPathForItem (line 178) | public async getFolderPathForItem(item: ContentItem): Promise<string> {
    method getPathOfItem (line 182) | public async getPathOfItem(
    method moveItem (line 214) | public async moveItem(
    method generatedMembersUrlForParentItem (line 229) | private async generatedMembersUrlForParentItem(
    method getRootItems (line 300) | public async getRootItems(): Promise<RootFolderMap> {
    method getItemOfId (line 318) | public async getItemOfId(id: string): Promise<ContentItem> {
    method getItemOfUri (line 325) | public async getItemOfUri(uri: Uri): Promise<ContentItem> {
    method getContentOfUri (line 330) | public async getContentOfUri(uri: Uri): Promise<string> {
    method getContentOfItem (line 339) | public async getContentOfItem(item: ContentItem): Promise<string> {
    method createNewFolder (line 343) | public async createNewFolder(
    method enrichWithDataProviderProperties (line 367) | private enrichWithDataProviderProperties(
    method renameItem (line 401) | public async renameItem(
    method createNewItem (line 453) | public async createNewItem(
    method addChildItem (line 494) | public async addChildItem(
    method updateContentOfItem (line 517) | public async updateContentOfItem(uri: Uri, content: string): Promise<v...
    method getUriOfItem (line 537) | public async getUriOfItem(item: ContentItem): Promise<Uri> {
    method deleteItem (line 551) | public async deleteItem(item: ContentItem): Promise<boolean> {
    method addItemToFavorites (line 559) | public async addItemToFavorites(item: ContentItem): Promise<boolean> {
    method removeItemFromFavorites (line 571) | public async removeItemFromFavorites(item: ContentItem): Promise<boole...
    method recycleItem (line 586) | public async recycleItem(
    method restoreItem (line 614) | public async restoreItem(item: ContentItem): Promise<boolean> {
    method updateAccessToken (line 622) | private async updateAccessToken(): Promise<void> {
    method updateFileMetadata (line 629) | private updateFileMetadata(
    method getFileInfo (line 641) | private getFileInfo(resourceId: string): {
    method deleteFolder (line 658) | private async deleteFolder(item: ContentItem): Promise<boolean> {
    method deleteResource (line 685) | private async deleteResource(item: ContentItem): Promise<boolean> {
    method getViyaCadence (line 715) | private async getViyaCadence(): Promise<string> {
    method getTypeDefinition (line 728) | private async getTypeDefinition(fileName: string): Promise<string> {
    method deleteMemberUriForFavorite (line 750) | private async deleteMemberUriForFavorite(item: ContentItem): Promise<s...

FILE: client/src/connection/rest/RestLibraryAdapter.ts
  class RestLibraryAdapter (line 26) | class RestLibraryAdapter implements LibraryAdapter {
    method constructor (line 30) | public constructor() {}
    method connect (line 32) | public async connect(): Promise<void> {
    method setup (line 42) | public async setup(): Promise<void> {
    method getRows (line 50) | public async getRows(
    method getSortedRows (line 84) | private async getSortedRows(
    method getRowsAsCSV (line 126) | public async getRowsAsCSV(
    method getColumns (line 156) | public async getColumns(
    method getTableRowCount (line 178) | public async getTableRowCount(
    method getTableInfo (line 197) | public async getTableInfo(item: LibraryItem): Promise<TableInfo> {
    method retryOnFail (line 214) | private async retryOnFail<T>(
    method deleteTable (line 232) | public async deleteTable({
    method getLibraries (line 252) | public async getLibraries(
    method getTables (line 296) | public async getTables(

FILE: client/src/connection/rest/RestServerAdapter.ts
  constant SAS_SERVER_HOME_DIRECTORY (line 41) | const SAS_SERVER_HOME_DIRECTORY = "SAS_SERVER_HOME_DIRECTORY";
  constant SAS_FILE_SEPARATOR (line 42) | const SAS_FILE_SEPARATOR = "~fs~";
  class RestServerAdapter (line 44) | class RestServerAdapter implements ContentAdapter {
    method constructor (line 55) | public constructor(
    method establishConnection (line 84) | private async establishConnection() {
    method connect (line 108) | public async connect(): Promise<void> {
    method connected (line 144) | public connected(): boolean {
    method setup (line 148) | public async setup(): Promise<void> {
    method addItemToFavorites (line 157) | public async addItemToFavorites(): Promise<boolean> {
    method removeItemFromFavorites (line 162) | public async removeItemFromFavorites(): Promise<boolean> {
    method createNewFolder (line 166) | public async createNewFolder(
    method createNewItem (line 184) | public async createNewItem(
    method getCreationPath (line 216) | private getCreationPath(uri: string) {
    method deleteItem (line 229) | public async deleteItem(item: ContentItem): Promise<boolean> {
    method getNavigationRoot (line 245) | private getNavigationRoot(): string {
    method getChildItems (line 253) | public async getChildItems(parentItem: ContentItem): Promise<ContentIt...
    method getContentOfItem (line 318) | public async getContentOfItem(item: ContentItem): Promise<string> {
    method getContentOfUri (line 323) | public async getContentOfUri(uri: Uri): Promise<string> {
    method getContentOfItemAtPath (line 328) | private async getContentOfItemAtPath(path: string) {
    method getFolderPathForItem (line 348) | public async getFolderPathForItem(): Promise<string> {
    method getPathOfItem (line 354) | public async getPathOfItem(item: ContentItem): Promise<string> {
    method getItemOfUri (line 364) | public async getItemOfUri(uri: Uri): Promise<ContentItem> {
    method getParentOfItem (line 376) | public async getParentOfItem(
    method getRootFolder (line 391) | public getRootFolder(): ContentItem | undefined {
    method getRootItems (line 395) | public async getRootItems(): Promise<RootFolderMap> {
    method getUriOfItem (line 415) | public async getUriOfItem(item: ContentItem): Promise<Uri> {
    method moveItem (line 430) | public async moveItem(
    method renameItem (line 463) | public async renameItem(
    method updateContentOfItem (line 490) | public async updateContentOfItem(uri: Uri, content: string): Promise<v...
    method updateContentOfItemAtPath (line 495) | private async updateContentOfItemAtPath(
    method getParentPathOfUri (line 515) | private getParentPathOfUri(uri: string) {
    method filePropertiesToContentItem (line 521) | private filePropertiesToContentItem(
    method trimComputePrefix (line 580) | private trimComputePrefix(uri: string): string {
    method updateFileMetadata (line 593) | private updateFileMetadata(id: string, { headers }: AxiosResponse) {
    method getFileInfo (line 601) | private async getFileInfo(path: string, forceRefresh?: boolean) {

FILE: client/src/connection/rest/api/common.ts
  constant DUMMY_BASE_URL (line 24) | const DUMMY_BASE_URL = "https://example.com";
  type RequestArgs (line 31) | interface RequestArgs {
  class RequiredError (line 42) | class RequiredError extends Error {
    method constructor (line 44) | constructor(
  function setFlattenedQueryParams (line 70) | function setFlattenedQueryParams(

FILE: client/src/connection/rest/api/compute.ts
  type Api (line 38) | interface Api {
  type BaseCollection2 (line 57) | interface BaseCollection2 {
  type Column (line 106) | interface Column {
  type ColumnCollection (line 167) | interface ColumnCollection {
  type ColumnCollectionAllOf (line 222) | interface ColumnCollectionAllOf {
  type ColumnFormatting (line 235) | interface ColumnFormatting {
  type ColumnSimpleFormat (line 254) | interface ColumnSimpleFormat {
  type ColumnsRequest (line 279) | interface ColumnsRequest {
  type Concatenation (line 316) | interface Concatenation {
  type Context (line 341) | interface Context {
  type ContextLaunchContext (line 444) | interface ContextLaunchContext {
  type ContextRequest (line 469) | interface ContextRequest {
  type ContextSummary (line 560) | interface ContextSummary {
  type ContextSummaryCollection (line 597) | interface ContextSummaryCollection {
  type ContextSummaryCollectionAllOf (line 652) | interface ContextSummaryCollectionAllOf {
  type DirMember (line 665) | interface DirMember {
  type DirectoryCollection (line 684) | interface DirectoryCollection {
  type DirectoryCollectionAllOf (line 739) | interface DirectoryCollectionAllOf {
  type Engine (line 752) | interface Engine {
  type EngineCollection (line 807) | interface EngineCollection {
  type EngineCollectionAllOf (line 862) | interface EngineCollectionAllOf {
  type Environment (line 875) | interface Environment {
  type Error2 (line 894) | interface Error2 {
  type FileProperties (line 955) | interface FileProperties {
  type FilePropertiesCollection (line 1016) | interface FilePropertiesCollection {
  type FilePropertiesCollectionAllOf (line 1071) | interface FilePropertiesCollectionAllOf {
  type FileProtection (line 1084) | interface FileProtection {
  type FileRequest (line 1109) | interface FileRequest {
  type FileResource (line 1128) | interface FileResource {
  type FileResourceAllOf (line 1225) | interface FileResourceAllOf {
  type Fileref (line 1298) | interface Fileref {
  type FilerefRequest (line 1365) | interface FilerefRequest {
  type FilerefSummary (line 1402) | interface FilerefSummary {
  type FilerefSummaryCollection (line 1433) | interface FilerefSummaryCollection {
  type FilerefSummaryCollectionAllOf (line 1488) | interface FilerefSummaryCollectionAllOf {
  type Format (line 1501) | interface Format {
  type FormatSummary (line 1592) | interface FormatSummary {
  type FormatSummaryCollection (line 1623) | interface FormatSummaryCollection {
  type FormatSummaryCollectionAllOf (line 1678) | interface FormatSummaryCollectionAllOf {
  type Job (line 1691) | interface Job {
  type JobCollection (line 1776) | interface JobCollection {
  type JobCollectionAllOf (line 1831) | interface JobCollectionAllOf {
  type JobListingCollection (line 1844) | interface JobListingCollection {
  type JobListingCollectionAllOf (line 1899) | interface JobListingCollectionAllOf {
  type JobLogCollection (line 1912) | interface JobLogCollection {
  type JobLogCollectionAllOf (line 1967) | interface JobLogCollectionAllOf {
  type JobRequest (line 1980) | interface JobRequest {
  type JobStatistics (line 2041) | interface JobStatistics {
  type Library (line 2060) | interface Library {
  type LibraryRequest (line 2145) | interface LibraryRequest {
  type LibrarySummary (line 2182) | interface LibrarySummary {
  type LibrarySummaryCollection (line 2213) | interface LibrarySummaryCollection {
  type LibrarySummaryCollectionAllOf (line 2268) | interface LibrarySummaryCollectionAllOf {
  type Link (line 2281) | interface Link {
  type ListingStatistics (line 2342) | interface ListingStatistics {
  type LogLine (line 2361) | interface LogLine {
  type LogLineTypeEnum (line 2395) | type LogLineTypeEnum =
  type LogStatistics (line 2403) | interface LogStatistics {
  type OutputStreamFileRequest (line 2422) | interface OutputStreamFileRequest {
  type PromptContent (line 2441) | interface PromptContent {
  type PromptContentRequest (line 2484) | interface PromptContentRequest {
  type PromptContentRequestColumnDetailEnum (line 2547) | type PromptContentRequestColumnDetailEnum =
  type PromptContentRowData (line 2555) | interface PromptContentRowData {
  type Resource (line 2574) | interface Resource {
  type ResourceScopeEnum (line 2630) | type ResourceScopeEnum =
  type Result (line 2638) | interface Result {
  type ResultTypeEnum (line 2672) | type ResultTypeEnum =
  type ResultCollection (line 2680) | interface ResultCollection {
  type ResultCollectionAllOf (line 2735) | interface ResultCollectionAllOf {
  type Row (line 2748) | interface Row {
  type RowCollection (line 2761) | interface RowCollection {
  type RowCollectionAllOf (line 2816) | interface RowCollectionAllOf {
  type RowSet (line 2829) | interface RowSet {
  type RowSetRequest (line 2872) | interface RowSetRequest {
  type RowSetRequestColumnDetailEnum (line 2935) | type RowSetRequestColumnDetailEnum =
  type RowsRequest (line 2943) | interface RowsRequest {
  type Server (line 2980) | interface Server {
  type ServerSummary (line 3035) | interface ServerSummary {
  type ServerSummaryCollection (line 3060) | interface ServerSummaryCollection {
  type ServerSummaryCollectionAllOf (line 3115) | interface ServerSummaryCollectionAllOf {
  type Session (line 3128) | interface Session {
  type SessionListingCollection (line 3231) | interface SessionListingCollection {
  type SessionListingCollectionAllOf (line 3286) | interface SessionListingCollectionAllOf {
  type SessionLogCollection (line 3299) | interface SessionLogCollection {
  type SessionLogCollectionAllOf (line 3354) | interface SessionLogCollectionAllOf {
  type SessionOption (line 3367) | interface SessionOption {
  type SessionRequest (line 3398) | interface SessionRequest {
  type SessionStatistics (line 3441) | interface SessionStatistics {
  type SessionSummary (line 3466) | interface SessionSummary {
  type SessionSummaryCollection (line 3503) | interface SessionSummaryCollection {
  type SessionSummaryCollectionAllOf (line 3558) | interface SessionSummaryCollectionAllOf {
  type SessionVariableCollection (line 3571) | interface SessionVariableCollection {
  type SessionVariableCollectionAllOf (line 3626) | interface SessionVariableCollectionAllOf {
  type SortByRequest (line 3639) | interface SortByRequest {
  type SortByRequestDirectionEnum (line 3659) | type SortByRequestDirectionEnum =
  type TableInfo (line 3667) | interface TableInfo {
  type TableSummary (line 3788) | interface TableSummary {
  type TableSummaryCollection (line 3819) | interface TableSummaryCollection {
  type TableSummaryCollectionAllOf (line 3874) | interface TableSummaryCollectionAllOf {
  type TrackedResource (line 3887) | interface TrackedResource {
  type Variable (line 3918) | interface Variable {
  type ViewRequest (line 3949) | interface ViewRequest {
  method createContext (line 4470) | async createContext(
  method createSession (line 4488) | async createSession(
  method deleteContext (line 4507) | async deleteContext(
  method getContext (line 4525) | async getContext(
  method getContexts (line 4543) | async getContexts(
  method headersForContext (line 4565) | async headersForContext(
  method headersForContexts (line 4584) | async headersForContexts(
  method updateContext (line 4606) | async updateContext(
  type ContextsApiCreateContextRequest (line 4626) | interface ContextsApiCreateContextRequest {
  type ContextsApiCreateSessionRequest (line 4640) | interface ContextsApiCreateSessionRequest {
  type ContextsApiDeleteContextRequest (line 4661) | interface ContextsApiDeleteContextRequest {
  type ContextsApiGetContextRequest (line 4675) | interface ContextsApiGetContextRequest {
  type ContextsApiGetContextsRequest (line 4689) | interface ContextsApiGetContextsRequest {
  type ContextsApiHeadersForContextRequest (line 4733) | interface ContextsApiHeadersForContextRequest {
  type ContextsApiHeadersForContextsRequest (line 4747) | interface ContextsApiHeadersForContextsRequest {
  type ContextsApiUpdateContextRequest (line 4782) | interface ContextsApiUpdateContextRequest {
  method createLibrary (line 7182) | async createLibrary(
  method createView (line 7201) | async createView(
  method deleteLibrary (line 7222) | async deleteLibrary(
  method deleteTable (line 7241) | async deleteTable(
  method getColumn (line 7261) | async getColumn(
  method getColumns (line 7282) | async getColumns(
  method getColumnsWithRequest (line 7304) | async getColumnsWithRequest(
  method getLibraries (line 7328) | async getLibraries(
  method getLibrary (line 7350) | async getLibrary(
  method getLibrarySummary (line 7369) | async getLibrarySummary(
  method getPromptContent (line 7389) | async getPromptContent(
  method getPromptContentWithRequest (line 7417) | async getPromptContentWithRequest(
  method getRowSet (line 7441) | async getRowSet(
  method getRowSetWithRequest (line 7470) | async getRowSetWithRequest(
  method getRows (line 7496) | async getRows(
  method getRowsAsCSV (line 7523) | async getRowsAsCSV(
  method getRowsWithRequest (line 7554) | async getRowsWithRequest(
  method getTable (line 7581) | async getTable(
  method getTableSummary (line 7601) | async getTableSummary(
  method getTables (line 7621) | async getTables(
  method headersForColumn (line 7644) | async headersForColumn(
  method headersForColumns (line 7666) | async headersForColumns(
  method headersForLibrary (line 7689) | async headersForLibrary(
  method headersForPromptContent (line 7709) | async headersForPromptContent(
  method headersForRow (line 7737) | async headersForRow(
  method headersForRowSet (line 7764) | async headersForRowSet(
  method headersForRowsAsCSV (line 7794) | async headersForRowsAsCSV(
  method headersForSessionLibraries (line 7826) | async headersForSessionLibraries(
  method headersForTable (line 7848) | async headersForTable(
  method updateColumn (line 7868) | async updateColumn(
  method updateTable (line 7891) | async updateTable(
  type DataAccessApiCreateLibraryRequest (line 7913) | interface DataAccessApiCreateLibraryRequest {
  type DataAccessApiCreateViewRequest (line 7934) | interface DataAccessApiCreateViewRequest {
  type DataAccessApiDeleteLibraryRequest (line 7969) | interface DataAccessApiDeleteLibraryRequest {
  type DataAccessApiDeleteTableRequest (line 7990) | interface DataAccessApiDeleteTableRequest {
  type DataAccessApiGetColumnRequest (line 8018) | interface DataAccessApiGetColumnRequest {
  type DataAccessApiGetColumnsRequest (line 8053) | interface DataAccessApiGetColumnsRequest {
  type DataAccessApiGetColumnsWithRequestRequest (line 8095) | interface DataAccessApiGetColumnsWithRequestRequest {
  type DataAccessApiGetLibrariesRequest (line 8144) | interface DataAccessApiGetLibrariesRequest {
  type DataAccessApiGetLibraryRequest (line 8188) | interface DataAccessApiGetLibraryRequest {
  type DataAccessApiGetLibrarySummaryRequest (line 8209) | interface DataAccessApiGetLibrarySummaryRequest {
  type DataAccessApiGetPromptContentRequest (line 8230) | interface DataAccessApiGetPromptContentRequest {
  type DataAccessApiGetPromptContentWithRequestRequest (line 8307) | interface DataAccessApiGetPromptContentWithRequestRequest {
  type DataAccessApiGetRowSetRequest (line 8356) | interface DataAccessApiGetRowSetRequest {
  type DataAccessApiGetRowSetWithRequestRequest (line 8447) | interface DataAccessApiGetRowSetWithRequestRequest {
  type DataAccessApiGetRowsRequest (line 8510) | interface DataAccessApiGetRowsRequest {
  type DataAccessApiGetRowsAsCSVRequest (line 8587) | interface DataAccessApiGetRowsAsCSVRequest {
  type DataAccessApiGetRowsWithRequestRequest (line 8692) | interface DataAccessApiGetRowsWithRequestRequest {
  type DataAccessApiGetTableRequest (line 8762) | interface DataAccessApiGetTableRequest {
  type DataAccessApiGetTableSummaryRequest (line 8790) | interface DataAccessApiGetTableSummaryRequest {
  type DataAccessApiGetTablesRequest (line 8818) | interface DataAccessApiGetTablesRequest {
  type DataAccessApiHeadersForColumnRequest (line 8867) | interface DataAccessApiHeadersForColumnRequest {
  type DataAccessApiHeadersForColumnsRequest (line 8902) | interface DataAccessApiHeadersForColumnsRequest {
  type DataAccessApiHeadersForLibraryRequest (line 8944) | interface DataAccessApiHeadersForLibraryRequest {
  type DataAccessApiHeadersForPromptContentRequest (line 8965) | interface DataAccessApiHeadersForPromptContentRequest {
  type DataAccessApiHeadersForRowRequest (line 9042) | interface DataAccessApiHeadersForRowRequest {
  type DataAccessApiHeadersForRowSetRequest (line 9119) | interface DataAccessApiHeadersForRowSetRequest {
  type DataAccessApiHeadersForRowsAsCSVRequest (line 9210) | interface DataAccessApiHeadersForRowsAsCSVRequest {
  type DataAccessApiHeadersForSessionLibrariesRequest (line 9315) | interface DataAccessApiHeadersForSessionLibrariesRequest {
  type DataAccessApiHeadersForTableRequest (line 9350) | interface DataAccessApiHeadersForTableRequest {
  type DataAccessApiUpdateColumnRequest (line 9378) | interface DataAccessApiUpdateColumnRequest {
  type DataAccessApiUpdateTableRequest (line 9427) | interface DataAccessApiUpdateTableRequest {
  method getEngine (line 9839) | async getEngine(
  method getEngineDefinition (line 9858) | async getEngineDefinition(
  method getEngines (line 9880) | async getEngines(
  method headersForEngine (line 9901) | async headersForEngine(
  method headersForEngineDefinition (line 9921) | async headersForEngineDefinition(
  method headersForEngines (line 9943) | async headersForEngines(
  type EnginesApiGetEngineRequest (line 9965) | interface EnginesApiGetEngineRequest {
  type EnginesApiGetEngineDefinitionRequest (line 9986) | interface EnginesApiGetEngineDefinitionRequest {
  type EnginesApiGetEnginesRequest (line 10021) | interface EnginesApiGetEnginesRequest {
  type EnginesApiHeadersForEngineRequest (line 10056) | interface EnginesApiHeadersForEngineRequest {
  type EnginesApiHeadersForEngineDefinitionRequest (line 10077) | interface EnginesApiHeadersForEngineDefinitionRequest {
  type EnginesApiHeadersForEnginesRequest (line 10112) | interface EnginesApiHeadersForEnginesRequest {
  method copyFileOrDirectory (line 10811) | async copyFileOrDirectory(
  method createFileOrDirectory (line 10834) | async createFileOrDirectory(
  method deleteFileOrDirectoryFromSystem (line 10856) | async deleteFileOrDirectoryFromSystem(
  method getDirectoryMembers (line 10877) | async getDirectoryMembers(
  method getFileContentFromSystem (line 10901) | async getFileContentFromSystem(
  method getFileorDirectoryProperties (line 10921) | async getFileorDirectoryProperties(
  method headersForFileorDirectoryProperties (line 10942) | async headersForFileorDirectoryProperties(
  method updateFileContentOnSystem (line 10963) | async updateFileContentOnSystem(
  method updateFileOrDirectoryOnSystem (line 10985) | async updateFileOrDirectoryOnSystem(
  type FileSystemApiCopyFileOrDirectoryRequest (line 11009) | interface FileSystemApiCopyFileOrDirectoryRequest {
  type FileSystemApiCreateFileOrDirectoryRequest (line 11051) | interface FileSystemApiCreateFileOrDirectoryRequest {
  type FileSystemApiDeleteFileOrDirectoryFromSystemRequest (line 11086) | interface FileSystemApiDeleteFileOrDirectoryFromSystemRequest {
  type FileSystemApiGetDirectoryMembersRequest (line 11114) | interface FileSystemApiGetDirectoryMembersRequest {
  type FileSystemApiGetFileContentFromSystemRequest (line 11163) | interface FileSystemApiGetFileContentFromSystemRequest {
  type FileSystemApiGetFileorDirectoryPropertiesRequest (line 11184) | interface FileSystemApiGetFileorDirectoryPropertiesRequest {
  type FileSystemApiHeadersForFileorDirectoryPropertiesRequest (line 11212) | interface FileSystemApiHeadersForFileorDirectoryPropertiesRequest {
  type FileSystemApiUpdateFileContentOnSystemRequest (line 11240) | interface FileSystemApiUpdateFileContentOnSystemRequest {
  type FileSystemApiUpdateFileOrDirectoryOnSystemRequest (line 11275) | interface FileSystemApiUpdateFileOrDirectoryOnSystemRequest {
  method assignFileref (line 12074) | async assignFileref(
  method deleteFile (line 12094) | async deleteFile(
  method deleteFileref (line 12113) | async deleteFileref(
  method getDirectoryFileref (line 12132) | async getDirectoryFileref(
  method getDirectoryFilerefContents (line 12153) | async getDirectoryFilerefContents(
  method getFile (line 12175) | async getFile(
  method getFileref (line 12194) | async getFileref(
  method getFilerefSummary (line 12213) | async getFilerefSummary(
  method getFilerefs (line 12233) | async getFilerefs(
  method headersForFileref (line 12255) | async headersForFileref(
  method headersForFilerefs (line 12275) | async headersForFilerefs(
  method headersForGetFile (line 12297) | async headersForGetFile(
  method updateFileContent (line 12317) | async updateFileContent(
  type FilesApiAssignFilerefRequest (line 12339) | interface FilesApiAssignFilerefRequest {
  type FilesApiDeleteFileRequest (line 12367) | interface FilesApiDeleteFileRequest {
  type FilesApiDeleteFilerefRequest (line 12388) | interface FilesApiDeleteFilerefRequest {
  type FilesApiGetDirectoryFilerefRequest (line 12409) | interface FilesApiGetDirectoryFilerefRequest {
  type FilesApiGetDirectoryFilerefContentsRequest (line 12437) | interface FilesApiGetDirectoryFilerefContentsRequest {
  type FilesApiGetFileRequest (line 12472) | interface FilesApiGetFileRequest {
  type FilesApiGetFilerefRequest (line 12493) | interface FilesApiGetFilerefRequest {
  type FilesApiGetFilerefSummaryRequest (line 12514) | interface FilesApiGetFilerefSummaryRequest {
  type FilesApiGetFilerefsRequest (line 12535) | interface FilesApiGetFilerefsRequest {
  type FilesApiHeadersForFilerefRequest (line 12577) | interface FilesApiHeadersForFilerefRequest {
  type FilesApiHeadersForFilerefsRequest (line 12598) | interface FilesApiHeadersForFilerefsRequest {
  type FilesApiHeadersForGetFileRequest (line 12633) | interface FilesApiHeadersForGetFileRequest {
  type FilesApiUpdateFileContentRequest (line 12654) | interface FilesApiUpdateFileContentRequest {
  method getFormat (line 12943) | async getFormat(
  method getFormats (line 12962) | async getFormats(
  method headersForFormat (line 12984) | async headersForFormat(
  method headersForFormats (line 13004) | async headersForFormats(
  type FormatsApiGetFormatRequest (line 13026) | interface FormatsApiGetFormatRequest {
  type FormatsApiGetFormatsRequest (line 13047) | interface FormatsApiGetFormatsRequest {
  type FormatsApiHeadersForFormatRequest (line 13091) | interface FormatsApiHeadersForFormatRequest {
  type FormatsApiHeadersForFormatsRequest (line 13112) | interface FormatsApiHeadersForFormatsRequest {
  method getInformat (line 13408) | async getInformat(
  method getInformats (line 13427) | async getInformats(
  method headersForInformat (line 13449) | async headersForInformat(
  method headersForInformats (line 13469) | async headersForInformats(
  type InformatsApiGetInformatRequest (line 13491) | interface InformatsApiGetInformatRequest {
  type InformatsApiGetInformatsRequest (line 13512) | interface InformatsApiGetInformatsRequest {
  type InformatsApiHeadersForInformatRequest (line 13556) | interface InformatsApiHeadersForInformatRequest {
  type InformatsApiHeadersForInformatsRequest (line 13577) | interface InformatsApiHeadersForInformatsRequest {
  method createJob (line 14176) | async createJob(
  method deleteJob (line 14195) | async deleteJob(
  method getJob (line 14214) | async getJob(
  method getJobState (line 14233) | async getJobState(
  method getJobs (line 14254) | async getJobs(
  method headersForJob (line 14277) | async headersForJob(
  method headersForJobState (line 14296) | async headersForJobState(
  method headersForJobs (line 14318) | async headersForJobs(
  method updateJobState (line 14341) | async updateJobState(
  type JobsApiCreateJobRequest (line 14362) | interface JobsApiCreateJobRequest {
  type JobsApiDeleteJobRequest (line 14383) | interface JobsApiDeleteJobRequest {
  type JobsApiGetJobRequest (line 14404) | interface JobsApiGetJobRequest {
  type JobsApiGetJobStateRequest (line 14425) | interface JobsApiGetJobStateRequest {
  type JobsApiGetJobsRequest (line 14460) | interface JobsApiGetJobsRequest {
  type JobsApiHeadersForJobRequest (line 14509) | interface JobsApiHeadersForJobRequest {
  type JobsApiHeadersForJobStateRequest (line 14530) | interface JobsApiHeadersForJobStateRequest {
  type JobsApiHeadersForJobsRequest (line 14565) | interface JobsApiHeadersForJobsRequest {
  type JobsApiUpdateJobStateRequest (line 14614) | interface JobsApiUpdateJobStateRequest {
  method getJobListing (line 15276) | async getJobListing(
  method getJobListingAsText (line 15299) | async getJobListingAsText(
  method getSessionListing (line 15319) | async getSessionListing(
  method getSessionListingAsText (line 15342) | async getSessionListingAsText(
  method headersForJobListing (line 15361) | async headersForJobListing(
  method headersForJobListingAsText (line 15385) | async headersForJobListingAsText(
  method headersForSessionListing (line 15405) | async headersForSessionListing(
  method headersForSessionListingAsText (line 15428) | async headersForSessionListingAsText(
  method streamJobListingAsFile (line 15447) | async streamJobListingAsFile(
  method streamSessionListingAsFile (line 15468) | async streamSessionListingAsFile(
  type ListingsApiGetJobListingRequest (line 15488) | interface ListingsApiGetJobListingRequest {
  type ListingsApiGetJobListingAsTextRequest (line 15537) | interface ListingsApiGetJobListingAsTextRequest {
  type ListingsApiGetSessionListingRequest (line 15558) | interface ListingsApiGetSessionListingRequest {
  type ListingsApiGetSessionListingAsTextRequest (line 15600) | interface ListingsApiGetSessionListingAsTextRequest {
  type ListingsApiHeadersForJobListingRequest (line 15614) | interface ListingsApiHeadersForJobListingRequest {
  type ListingsApiHeadersForJobListingAsTextRequest (line 15663) | interface ListingsApiHeadersForJobListingAsTextRequest {
  type ListingsApiHeadersForSessionListingRequest (line 15684) | interface ListingsApiHeadersForSessionListingRequest {
  type ListingsApiHeadersForSessionListingAsTextRequest (line 15726) | interface ListingsApiHeadersForSessionListingAsTextRequest {
  type ListingsApiStreamJobListingAsFileRequest (line 15740) | interface ListingsApiStreamJobListingAsFileRequest {
  type ListingsApiStreamSessionListingAsFileRequest (line 15768) | interface ListingsApiStreamSessionListingAsFileRequest {
  method getJobLog (line 16412) | async getJobLog(
  method getJobLogAsText (line 16435) | async getJobLogAsText(
  method getSessionLog (line 16454) | async getSessionLog(
  method getSessionLogAsText (line 16476) | async getSessionLogAsText(
  method headersForJobLog (line 16495) | async headersForJobLog(
  method headersForJobLogAsText (line 16519) | async headersForJobLogAsText(
  method headersForSessionLog (line 16539) | async headersForSessionLog(
  method headersForSessionLogAsText (line 16562) | async headersForSessionLogAsText(
  method streamJobLogAsFile (line 16581) | async streamJobLogAsFile(
  method streamSessionLogAsFile (line 16602) | async streamSessionLogAsFile(
  type LogsApiGetJobLogRequest (line 16622) | interface LogsApiGetJobLogRequest {
  type LogsApiGetJobLogAsTextRequest (line 16671) | interface LogsApiGetJobLogAsTextRequest {
  type LogsApiGetSessionLogRequest (line 16692) | interface LogsApiGetSessionLogRequest {
  type LogsApiGetSessionLogAsTextRequest (line 16734) | interface LogsApiGetSessionLogAsTextRequest {
  type LogsApiHeadersForJobLogRequest (line 16748) | interface LogsApiHeadersForJobLogRequest {
  type LogsApiHeadersForJobLogAsTextRequest (line 16797) | interface LogsApiHeadersForJobLogAsTextRequest {
  type LogsApiHeadersForSessionLogRequest (line 16818) | interface LogsApiHeadersForSessionLogRequest {
  type LogsApiHeadersForSessionLogAsTextRequest (line 16860) | interface LogsApiHeadersForSessionLogAsTextRequest {
  type LogsApiStreamJobLogAsFileRequest (line 16874) | interface LogsApiStreamJobLogAsFileRequest {
  type LogsApiStreamSessionLogAsFileRequest (line 16902) | interface LogsApiStreamSessionLogAsFileRequest {
  method getOptionValue (line 17201) | async getOptionValue(
  method getOptionValueFull (line 17220) | async getOptionValueFull(
  method headersForOptionValue (line 17240) | async headersForOptionValue(
  method headersForOptionValueFull (line 17260) | async headersForOptionValueFull(
  method updateOptionValue (line 17280) | async updateOptionValue(
  type OptionsApiGetOptionValueRequest (line 17301) | interface OptionsApiGetOptionValueRequest {
  type OptionsApiGetOptionValueFullRequest (line 17322) | interface OptionsApiGetOptionValueFullRequest {
  type OptionsApiHeadersForOptionValueRequest (line 17343) | interface OptionsApiHeadersForOptionValueRequest {
  type OptionsApiHeadersForOptionValueFullRequest (line 17364) | interface OptionsApiHeadersForOptionValueFullRequest {
  type OptionsApiUpdateOptionValueRequest (line 17385) | interface OptionsApiUpdateOptionValueRequest {
  method getJobResults (line 17695) | async getJobResults(
  method getSessionResults (line 17718) | async getSessionResults(
  method headersForJobResults (line 17739) | async headersForJobResults(
  method headersForSessionResults (line 17763) | async headersForSessionResults(
  type ResultsApiGetJobResultsRequest (line 17784) | interface ResultsApiGetJobResultsRequest {
  type ResultsApiGetSessionResultsRequest (line 17833) | interface ResultsApiGetSessionResultsRequest {
  type ResultsApiHeadersForJobResultsRequest (line 17861) | interface ResultsApiHeadersForJobResultsRequest {
  type ResultsApiHeadersForSessionResultsRequest (line 17910) | interface ResultsApiHeadersForSessionResultsRequest {
  method headersForRoot (line 18033) | async headersForRoot(
  method root (line 18047) | async root(options?: AxiosRequestConfig): Promise<AxiosResponse<Api>> {
  method deleteServer (line 18615) | async deleteServer(
  method getServer (line 18633) | async getServer(
  method getServerSessions (line 18651) | async getServerSessions(
  method getServerState (line 18675) | async getServerState(
  method getServers (line 18693) | async getServers(
  method headersForServer (line 18717) | async headersForServer(
  method headersForServerSessions (line 18736) | async headersForServerSessions(
  method headersForServerState (line 18759) | async headersForServerState(
  method headersForServers (line 18778) | async headersForServers(
  type ServersApiDeleteServerRequest (line 18802) | interface ServersApiDeleteServerRequest {
  type ServersApiGetServerRequest (line 18816) | interface ServersApiGetServerRequest {
  type ServersApiGetServerSessionsRequest (line 18830) | interface ServersApiGetServerSessionsRequest {
  type ServersApiGetServerStateRequest (line 18881) | interface ServersApiGetServerStateRequest {
  type ServersApiGetServersRequest (line 18895) | interface ServersApiGetServersRequest {
  type ServersApiHeadersForServerRequest (line 18953) | interface ServersApiHeadersForServerRequest {
  type ServersApiHeadersForServerSessionsRequest (line 18967) | interface ServersApiHeadersForServerSessionsRequest {
  type ServersApiHeadersForServerStateRequest (line 19009) | interface ServersApiHeadersForServerStateRequest {
  type ServersApiHeadersForServersRequest (line 19023) | interface ServersApiHeadersForServersRequest {
  method deleteSession (line 19542) | async deleteSession(
  method getSession (line 19560) | async getSession(
  method getSessionState (line 19578) | async getSessionState(
  method getSessions (line 19598) | async getSessions(
  method headersForSession (line 19620) | async headersForSession(
  method headersForSessionState (line 19639) | async headersForSessionState(
  method headersForSessions (line 19660) | async headersForSessions(
  method updateSessionState (line 19682) | async updateSessionState(
  type SessionsApiDeleteSessionRequest (line 19703) | interface SessionsApiDeleteSessionRequest {
  type SessionsApiGetSessionRequest (line 19717) | interface SessionsApiGetSessionRequest {
  type SessionsApiGetSessionStateRequest (line 19731) | interface SessionsApiGetSessionStateRequest {
  type SessionsApiGetSessionsRequest (line 19759) | interface SessionsApiGetSessionsRequest {
  type SessionsApiHeadersForSessionRequest (line 19803) | interface SessionsApiHeadersForSessionRequest {
  type SessionsApiHeadersForSessionStateRequest (line 19817) | interface SessionsApiHeadersForSessionStateRequest {
  type SessionsApiHeadersForSessionsRequest (line 19845) | interface SessionsApiHeadersForSessionsRequest {
  type SessionsApiUpdateSessionStateRequest (line 19880) | interface SessionsApiUpdateSessionStateRequest {
  method getVariable (line 20161) | async getVariable(
  method getVariables (line 20180) | async getVariables(
  method headersForVariable (line 20201) | async headersForVariable(
  method headersForVariables (line 20221) | async headersForVariables(
  type VariablesApiGetVariableRequest (line 20243) | interface VariablesApiGetVariableRequest {
  type VariablesApiGetVariablesRequest (line 20264) | interface VariablesApiGetVariablesRequest {
  type VariablesApiHeadersForVariableRequest (line 20299) | interface VariablesApiHeadersForVariableRequest {
  type VariablesApiHeadersForVariablesRequest (line 20320) | interface VariablesApiHeadersForVariablesRequest {

FILE: client/src/connection/rest/api/configuration.ts
  type ConfigurationParameters (line 18) | interface ConfigurationParameters {
  class Configuration (line 36) | class Configuration {
    method constructor (line 95) | constructor(param: ConfigurationParameters = {}) {
    method isJsonMime (line 115) | public isJsonMime(mime: string): boolean {

FILE: client/src/connection/rest/api/files.ts
  type Api (line 38) | interface Api {
  type AttributesMap (line 57) | interface AttributesMap {
  type BaseCollection2 (line 76) | interface BaseCollection2 {
  type Error2 (line 125) | interface Error2 {
  type Field (line 186) | interface Field {
  type FileResource (line 247) | interface FileResource {
  type FileResourceCollection (line 386) | interface FileResourceCollection {
  type FileResourceCollectionAllOf (line 441) | interface FileResourceCollectionAllOf {
  type FileResourceIndex (line 454) | interface FileResourceIndex {
  type FileResourceIndexCollection (line 485) | interface FileResourceIndexCollection {
  type FileResourceIndexCollectionAllOf (line 540) | interface FileResourceIndexCollectionAllOf {
  type FileResourceSummary (line 553) | interface FileResourceSummary {
  type FileResourceSummaryCollection (line 626) | interface FileResourceSummaryCollection {
  type FileResourceSummaryCollectionAllOf (line 681) | interface FileResourceSummaryCollectionAllOf {
  type FileToPatch (line 694) | interface FileToPatch {
  type IndexableDataElement (line 749) | interface IndexableDataElement {
  type Link (line 768) | interface Link {
  type QuarantineFileToPatch (line 829) | interface QuarantineFileToPatch {
  type Schema (line 842) | interface Schema {
  type Selection (line 861) | interface Selection {
  type SelectionTypeEnum (line 900) | type SelectionTypeEnum =
  type Settings (line 908) | interface Settings {
  method createCopyOfFile (line 2113) | async createCopyOfFile(
  method createNewFile (line 2135) | async createNewFile(
  method createNewFileMultiPart (line 2160) | async createNewFileMultiPart(
  method deleteFileResource (line 2188) | async deleteFileResource(
  method deleteFileResourceForGivenParentUri (line 2207) | async deleteFileResourceForGivenParentUri(
  method fetchFilesForParentUris (line 2226) | async fetchFilesForParentUris(
  method getFile (line 2246) | async getFile(
  method getFileResourceForFilterQuery (line 2264) | async getFileResourceForFilterQuery(
  method getFileVersionResourceForFilterQuery (line 2288) | async getFileVersionResourceForFilterQuery(
  method getfileContentForGivenId (line 2309) | async getfileContentForGivenId(
  method getfileContentForGivenVersion (line 2331) | async getfileContentForGivenVersion(
  method getfileIdForGivenVersion (line 2354) | async getfileIdForGivenVersion(
  method getfileindexschema (line 2374) | async getfileindexschema(
  method headersForFile (line 2393) | async headersForFile(
  method headersForfileIdForGivenVersion (line 2411) | async headersForfileIdForGivenVersion(
  method patchFileResourceInfo (line 2431) | async patchFileResourceInfo(
  method updateFileResource (line 2453) | async updateFileResource(
  method updatedFileContent (line 2475) | async updatedFileContent(
  type FilesApiCreateCopyOfFileRequest (line 2499) | interface FilesApiCreateCopyOfFileRequest {
  type FilesApiCreateNewFileRequest (line 2534) | interface FilesApiCreateNewFileRequest {
  type FilesApiCreateNewFileMultiPartRequest (line 2597) | interface FilesApiCreateNewFileMultiPartRequest {
  type FilesApiDeleteFileResourceRequest (line 2674) | interface FilesApiDeleteFileResourceRequest {
  type FilesApiDeleteFileResourceForGivenParentUriRequest (line 2688) | interface FilesApiDeleteFileResourceForGivenParentUriRequest {
  type FilesApiFetchFilesForParentUrisRequest (line 2702) | interface FilesApiFetchFilesForParentUrisRequest {
  type FilesApiGetFileRequest (line 2723) | interface FilesApiGetFileRequest {
  type FilesApiGetFileResourceForFilterQueryRequest (line 2737) | interface FilesApiGetFileResourceForFilterQueryRequest {
  type FilesApiGetFileVersionResourceForFilterQueryRequest (line 2786) | interface FilesApiGetFileVersionResourceForFilterQueryRequest {
  type FilesApiGetfileContentForGivenIdRequest (line 2814) | interface FilesApiGetfileContentForGivenIdRequest {
  type FilesApiGetfileContentForGivenVersionRequest (line 2849) | interface FilesApiGetfileContentForGivenVersionRequest {
  type FilesApiGetfileIdForGivenVersionRequest (line 2891) | interface FilesApiGetfileIdForGivenVersionRequest {
  type FilesApiGetfileindexschemaRequest (line 2912) | interface FilesApiGetfileindexschemaRequest {
  type FilesApiHeadersForFileRequest (line 2926) | interface FilesApiHeadersForFileRequest {
  type FilesApiHeadersForfileIdForGivenVersionRequest (line 2940) | interface FilesApiHeadersForfileIdForGivenVersionRequest {
  type FilesApiPatchFileResourceInfoRequest (line 2961) | interface FilesApiPatchFileResourceInfoRequest {
  type FilesApiUpdateFileResourceRequest (line 2996) | interface FilesApiUpdateFileResourceRequest {
  type FilesApiUpdatedFileContentRequest (line 3031) | interface FilesApiUpdatedFileContentRequest {
  method fetchFilesIndexableRepForParentUris (line 3290) | async fetchFilesIndexableRepForParentUris(
  method getFileIndexableRep (line 3310) | async getFileIndexableRep(
  method getFilesIndexableResource (line 3329) | async getFilesIndexableResource(
  type IndexApiFetchFilesIndexableRepForParentUrisRequest (line 3353) | interface IndexApiFetchFilesIndexableRepForParentUrisRequest {
  type IndexApiGetFileIndexableRepRequest (line 3374) | interface IndexApiGetFileIndexableRepRequest {
  type IndexApiGetFilesIndexableResourceRequest (line 3388) | interface IndexApiGetFilesIndexableResourceRequest {
  method headersForRoot (line 3532) | async headersForRoot(
  method root (line 3546) | async root(options?: AxiosRequestConfig): Promise<AxiosResponse<Api>> {
  method patchFileResourceQuarantine (line 3652) | async patchFileResourceQuarantine(
  type SecurityApiPatchFileResourceQuarantineRequest (line 3674) | interface SecurityApiPatchFileResourceQuarantineRequest {
  method getSettings (line 3767) | async getSettings(
  method getFilesSummaryForFilter (line 3925) | async getFilesSummaryForFilter(
  method getfileSummaryRepForGivenId (line 3949) | async getfileSummaryRepForGivenId(
  type SummaryApiGetFilesSummaryForFilterRequest (line 3968) | interface SummaryApiGetFilesSummaryForFilterRequest {
  type SummaryApiGetfileSummaryRepForGivenIdRequest (line 4017) | interface SummaryApiGetfileSummaryRepForGivenIdRequest {

FILE: client/src/connection/rest/api/folders.ts
  type Ancestor (line 38) | interface Ancestor {
  type AncestorCollection (line 63) | interface AncestorCollection {
  type AncestorCollectionAllOf (line 118) | interface AncestorCollectionAllOf {
  type BaseCollection (line 131) | interface BaseCollection {
  type Delegate (line 180) | interface Delegate {
  type DelegateCollection (line 211) | interface DelegateCollection {
  type DelegateCollectionAllOf (line 266) | interface DelegateCollectionAllOf {
  type ErrorResponse (line 279) | interface ErrorResponse {
  type Folder (line 340) | interface Folder {
  type FolderCollection (line 431) | interface FolderCollection {
  type FolderCollectionAllOf (line 486) | interface FolderCollectionAllOf {
  type FolderIn (line 499) | interface FolderIn {
  type FolderType (line 536) | interface FolderType {
  type FolderTypeCollection (line 567) | interface FolderTypeCollection {
  type FolderTypeCollectionAllOf (line 622) | interface FolderTypeCollectionAllOf {
  type Link (line 635) | interface Link {
  type Member (line 672) | interface Member {
  type MemberCollection (line 781) | interface MemberCollection {
  type MemberCollectionAllOf (line 836) | interface MemberCollectionAllOf {
  type MemberIn (line 849) | interface MemberIn {
  type Path (line 928) | interface Path {
  type Summary (line 959) | interface Summary {
  type Validation (line 1026) | interface Validation {
  method createFolder (line 1783) | async createFolder(
  method deleteFolder (line 1802) | async deleteFolder(
  method findByPath (line 1821) | async findByPath(
  method getDelegateFolders (line 1839) | async getDelegateFolders(
  method getFolder (line 1858) | async getFolder(
  method getFolderItem (line 1877) | async getFolderItem(
  method getFolders (line 1896) | async getFolders(
  method getRootFolders (line 1922) | async getRootFolders(
  method headersForFolder (line 1943) | async headersForFolder(
  method patchFolder (line 1963) | async patchFolder(
  method patchMoveFolderItem (line 1984) | async patchMoveFolderItem(
  method updateFolder (line 2004) | async updateFolder(
  type FolderApiCreateFolderRequest (line 2025) | interface FolderApiCreateFolderRequest {
  type FolderApiDeleteFolderRequest (line 2046) | interface FolderApiDeleteFolderRequest {
  type FolderApiFindByPathRequest (line 2067) | interface FolderApiFindByPathRequest {
  type FolderApiGetDelegateFoldersRequest (line 2081) | interface FolderApiGetDelegateFoldersRequest {
  type FolderApiGetFolderRequest (line 2095) | interface FolderApiGetFolderRequest {
  type FolderApiGetFolderItemRequest (line 2116) | interface FolderApiGetFolderItemRequest {
  type FolderApiGetFoldersRequest (line 2137) | interface FolderApiGetFoldersRequest {
  type FolderApiGetRootFoldersRequest (line 2207) | interface FolderApiGetRootFoldersRequest {
  type FolderApiHeadersForFolderRequest (line 2242) | interface FolderApiHeadersForFolderRequest {
  type FolderApiPatchFolderRequest (line 2263) | interface FolderApiPatchFolderRequest {
  type FolderApiPatchMoveFolderItemRequest (line 2298) | interface FolderApiPatchMoveFolderItemRequest {
  type FolderApiUpdateFolderRequest (line 2319) | interface FolderApiUpdateFolderRequest {
  method createFolderMember (line 3045) | async createFolderMember(
  method createHistory (line 3067) | async createHistory(
  method deleteFolderMember (line 3087) | async deleteFolderMember(
  method getFolderMember (line 3107) | async getFolderMember(
  method getFolderMembers (line 3126) | async getFolderMembers(
  method headersForFolderMember (line 3152) | async headersForFolderMember(
  method headersForFolderMembers (line 3172) | async headersForFolderMembers(
  method patchFolderMember (line 3198) | async patchFolderMember(
  method updateFolderMember (line 3221) | async updateFolderMember(
  method validateMemberName (line 3244) | async validateMemberName(
  type MemberApiCreateFolderMemberRequest (line 3267) | interface MemberApiCreateFolderMemberRequest {
  type MemberApiCreateHistoryRequest (line 3302) | interface MemberApiCreateHistoryRequest {
  type MemberApiDeleteFolderMemberRequest (line 3330) | interface MemberApiDeleteFolderMemberRequest {
  type MemberApiGetFolderMemberRequest (line 3351) | interface MemberApiGetFolderMemberRequest {
  type MemberApiGetFolderMembersRequest (line 3372) | interface MemberApiGetFolderMembersRequest {
  type MemberApiHeadersForFolderMemberRequest (line 3435) | interface MemberApiHeadersForFolderMemberRequest {
  type MemberApiHeadersForFolderMembersRequest (line 3456) | interface MemberApiHeadersForFolderMembersRequest {
  type MemberApiPatchFolderMemberRequest (line 3519) | interface MemberApiPatchFolderMemberRequest {
  type MemberApiUpdateFolderMemberRequest (line 3561) | interface MemberApiUpdateFolderMemberRequest {
  type MemberApiValidateMemberNameRequest (line 3603) | interface MemberApiValidateMemberNameRequest {
  method createBulkAncestors (line 3852) | async createBulkAncestors(
  method getAncestors (line 3872) | async getAncestors(
  method getDelegateInfo (line 3890) | async getDelegateInfo(
  method getFolderTypes (line 3904) | async getFolderTypes(
  type MetainfoApiCreateBulkAncestorsRequest (line 3919) | interface MetainfoApiCreateBulkAncestorsRequest {
  type MetainfoApiGetAncestorsRequest (line 3940) | interface MetainfoApiGetAncestorsRequest {
  method root (line 4017) | async root(

FILE: client/src/connection/rest/auth.ts
  type Tokens (line 13) | interface Tokens {
  function refreshToken (line 18) | async function refreshToken(
  function getTokens (line 59) | async function getTokens(
  function getPKCE (line 127) | function getPKCE() {

FILE: client/src/connection/rest/common.ts
  type ComputeState (line 16) | enum ComputeState {
  type stateOptions (line 27) | interface stateOptions {
  type BaseCompute (line 32) | interface BaseCompute {
  function getApiConfig (line 39) | function getApiConfig(): Configuration {
  function computeMediaType (line 43) | function computeMediaType(type: string): string {
  class Compute (line 59) | class Compute {
    method self (line 62) | async self<T>(): Promise<T> {
    method getLink (line 67) | getLink(links: Array<Link>, rel: string): Link | undefined {
    method getLinkOptions (line 76) | getLinkOptions(link: Link, options?: AxiosRequestConfig): RequestArgs {
    method requestLink (line 124) | async requestLink<T>(

FILE: client/src/connection/rest/context.ts
  class ComputeContext (line 17) | class ComputeContext extends Compute {
    method constructor (line 21) | constructor(id: string, name: string, launchType: string) {
    method fromInterface (line 29) | static fromInterface(context: Context | ContextSummary): ComputeContext {
    method fromResponse (line 35) | static fromResponse(response: AxiosResponse): ComputeContext {
    method getContextByName (line 41) | static async getContextByName(name: string): Promise<ComputeContext> {
    method id (line 55) | get id(): string {
    method links (line 59) | get links(): Array<Link> {
    method self (line 63) | async self<Context>(): Promise<Context> {
    method createSession (line 71) | async createSession(): Promise<ComputeSession> {

FILE: client/src/connection/rest/identities.ts
  type User (line 5) | interface User {
  function getCurrentUser (line 12) | async function getCurrentUser(options: {

FILE: client/src/connection/rest/index.ts
  type Config (line 21) | interface Config extends BaseConfig {
  class RestSession (line 30) | class RestSession extends Session {
    method constructor (line 35) | constructor() {
    method config (line 39) | public set config(value: Config) {
    method contextAttributes (line 43) | public async contextAttributes(): Promise<SessionContextAttributes> {
    method getContext (line 49) | public async getContext() {
  function getSession (line 346) | function getSession(c: Config): Session {

FILE: client/src/connection/rest/job.ts
  class ComputeJob (line 20) | class ComputeJob extends Compute {
    method constructor (line 25) | constructor(id: string) {
    method id (line 36) | get id(): string {
    method fromInterface (line 40) | static fromInterface(job: Job): ComputeJob {
    method fromResponse (line 46) | static fromResponse(response: AxiosResponse): ComputeJob {
    method followLink (line 52) | async followLink<T>(
    method getState (line 71) | async getState(options?: stateOptions): Promise<string> {
    method getLogStream (line 99) | async *getLogStream(options?: {
    method isDone (line 166) | async isDone(state?: string): Promise<boolean> {
    method results (line 175) | async results(type?: string): Promise<Result[]> {

FILE: client/src/connection/rest/server.ts
  constant DEFAULT_COMPUTE_OPTS (line 11) | const DEFAULT_COMPUTE_OPTS = ["-validmemname EXTEND", "-validvarname ANY"];
  class ComputeServer (line 13) | class ComputeServer extends Compute {
    method constructor (line 19) | constructor(id: string) {
    method id (line 27) | get id(): string {
    method links (line 31) | get links(): Array<Link> {
    method options (line 35) | set options(value: string[]) {
    method autoExecLines (line 39) | set autoExecLines(value: string[]) {
    method fromInterface (line 43) | static fromInterface(server: Server): ComputeServer {
    method fromResponse (line 49) | static fromResponse(response: AxiosResponse): ComputeServer {
    method self (line 55) | async self<Server>(): Promise<Server> {
    method createSession (line 75) | async createSession(): Promise<ComputeSession> {
    method getSession (line 104) | async getSession(sessionId?: string): Promise<ComputeSession> {
    method getState (line 114) | async getState(options?: stateOptions): Promise<string> {

FILE: client/src/connection/rest/session.ts
  class ComputeSession (line 26) | class ComputeSession extends Compute {
    method constructor (line 31) | constructor(id: string) {
    method sessionId (line 42) | get sessionId(): string {
    method fromInterface (line 46) | static fromInterface(session: Session): ComputeSession {
    method fromResponse (line 52) | static fromResponse(response: AxiosResponse): ComputeSession {
    method getSession (line 58) | async getSession(sessionId?: string): Promise<Session> {
    method self (line 73) | async self<Session>(): Promise<Session> {
    method getState (line 93) | async getState(options?: stateOptions): Promise<string> {
    method followLink (line 114) | async followLink<T>(
    method setState (line 137) | async setState(state: ComputeState): Promise<AxiosResponse<void>> {
    method cancel (line 153) | async cancel(): Promise<boolean> {
    method execute (line 171) | async execute(request: JobRequest): Promise<ComputeJob> {
    method delete (line 189) | async delete(): Promise<void> {
    method getLogStream (line 193) | async *getLogStream(options?: {

FILE: client/src/connection/session.ts
  type SessionContextAttributes (line 7) | type SessionContextAttributes =
  method onSessionLogFn (line 19) | public set onSessionLogFn(value: OnLogFn) {
  method onExecutionLogFn (line 24) | public set onExecutionLogFn(value: OnLogFn) {
  method setup (line 28) | async setup(silent?: boolean): Promise<void> {
  method run (line 53) | run(code: string, ...args): Promise<RunResult> {
  method close (line 65) | close(): Promise<void> | void {

FILE: client/src/connection/ssh/auth.ts
  type AuthPresenter (line 19) | interface AuthPresenter {
  class AuthPresenterImpl (line 44) | class AuthPresenterImpl implements AuthPresenter {
  class AuthHandler (line 107) | class AuthHandler {
    method constructor (line 111) | constructor(authPresenter?: AuthPresenter, keyParser?: KeyParser) {
  type KeyParser (line 231) | interface KeyParser {
  class KeyParserImpl (line 242) | class KeyParserImpl implements KeyParser {

FILE: client/src/connection/ssh/const.ts
  constant SECOND (line 4) | const SECOND = 1000;
  constant MINUTE (line 5) | const MINUTE = 60 * SECOND;
  constant KEEPALIVE_INTERVAL (line 6) | const KEEPALIVE_INTERVAL = 60 * SECOND;
  constant KEEPALIVE_UNANSWERED_THRESHOLD (line 7) | const KEEPALIVE_UNANSWERED_THRESHOLD =
  constant WORK_DIR_START_TAG (line 9) | const WORK_DIR_START_TAG = "WORKDIR";
  constant WORK_DIR_END_TAG (line 10) | const WORK_DIR_END_TAG = "WORKDIREND";
  constant CONNECT_READY_TIMEOUT (line 11) | const CONNECT_READY_TIMEOUT = 5 * MINUTE;

FILE: client/src/connection/ssh/index.ts
  type Config (line 34) | interface Config extends BaseConfig {
  function getSession (line 42) | function getSession(c: Config): Session {
  class SSHSession (line 48) | class SSHSession extends Session {
    method constructor (line 60) | constructor(c?: Config, client?: Client) {
    method config (line 73) | set config(newValue: Config) {

FILE: client/src/connection/ssh/types.ts
  type Config (line 5) | interface Config extends BaseConfig {
  type LineCodes (line 13) | enum LineCodes {

FILE: client/src/connection/studio/index.ts
  function getStudioSessionRequest (line 5) | function getStudioSessionRequest(connection: AxiosInstance) {
  function getflowObjRequest (line 25) | function getflowObjRequest(
  function createStudioSession (line 38) | async function createStudioSession(
  function associateFlowObject (line 51) | async function associateFlowObject(

FILE: client/src/connection/util.ts
  function extractOutputHtmlFileName (line 4) | function extractOutputHtmlFileName(

FILE: client/src/node/extension.ts
  function activate (line 66) | function activate(context: ExtensionContext) {
  function updateViewSettings (line 227) | function updateViewSettings(): void {
  function triggerProfileUpdate (line 255) | function triggerProfileUpdate(): void {
  function deactivate (line 285) | function deactivate(): Thenable<void> | undefined {

FILE: client/src/panels/DataViewer.ts
  type ViewProperties (line 12) | type ViewProperties = {
  class DataViewer (line 17) | class DataViewer extends WebView {
    method constructor (line 19) | public constructor(
    method l10nMessages (line 32) | public l10nMessages() {
    method styles (line 64) | public styles() {
    method scripts (line 68) | public scripts() {
    method body (line 72) | public body() {
    method processMessage (line 76) | public async processMessage(

FILE: client/src/panels/TablePropertiesViewer.ts
  class TablePropertiesViewer (line 8) | class TablePropertiesViewer extends WebView {
    method constructor (line 11) | constructor(
    method body (line 22) | public body(): string {
    method scripts (line 41) | public scripts(): string[] {
    method styles (line 44) | public styles(): string[] {
    method processMessage (line 48) | public processMessage(): void {
    method generatePropertiesContent (line 52) | private generatePropertiesContent(): string {
    method generateColumnsContent (line 165) | private generateColumnsContent(): string {

FILE: client/src/panels/WebviewManager.ts
  class WebViewManager (line 5) | class WebViewManager {
    method render (line 8) | public render(webview: WebView, uid: string, forceReRender: boolean = ...
  method constructor (line 33) | public constructor(
  method onDispose (line 38) | set onDispose(disposeCallback: () => void) {
  method render (line 46) | public render(): WebView {
  method withPanel (line 95) | public withPanel(webviewPanel: WebviewPanel): WebView {
  method getPanel (line 103) | public getPanel() {
  method dispose (line 107) | public dispose() {
  method display (line 118) | public display() {
  method webviewUri (line 122) | public webviewUri(extensionUri: Uri, name: string): Uri {

FILE: client/src/store/log/actions.ts
  type LogActions (line 7) | interface LogActions {

FILE: client/src/store/log/initialState.ts
  type LogState (line 5) | interface LogState {

FILE: client/src/store/log/store.ts
  type Store (line 9) | type Store = LogState & LogActions;

FILE: client/src/store/run/actions.ts
  type RunActions (line 7) | interface RunActions {

FILE: client/src/store/run/initialState.ts
  type RunState (line 3) | interface RunState {

FILE: client/src/store/run/store.ts
  type Store (line 9) | type Store = RunState & RunActions;

FILE: client/src/webview/ColumnMenu.tsx
  type ColumnMenuProps (line 10) | interface ColumnMenuProps {

FILE: client/src/webview/GridMenu.tsx
  constant MENU_RIGHT_OFFSET (line 5) | const MENU_RIGHT_OFFSET = 30;
  type MenuItem (line 7) | interface MenuItem {
  function nextIndex (line 121) | function nextIndex() {
  function previousIndex (line 127) | function previousIndex() {

FILE: client/src/webview/TableFilter.tsx
  type TableFilterProps (line 7) | interface TableFilterProps {

FILE: client/src/webview/TablePropertiesViewer.ts
  function showTab (line 5) | function showTab(tabName: string, clickedTab?: HTMLElement): void {
  function setupEventListeners (line 27) | function setupEventListeners(): void {
  function cleanupEventListeners (line 44) | function cleanupEventListeners(): void {

FILE: client/src/webview/index.ts
  type DedicatedWorkerGlobalScope (line 9) | type DedicatedWorkerGlobalScope = Worker;

FILE: client/src/webview/useTheme.ts
  constant THEME_ATTRIBUTE (line 5) | const THEME_ATTRIBUTE = "data-vscode-theme-kind";
  constant SELECTOR (line 6) | const SELECTOR = `[${THEME_ATTRIBUTE}]`;

FILE: client/test/components/ContentNavigator/convert.test.ts
  function parseFlowData (line 10) | function parseFlowData(flowDataString) {
  function removeIdsNodes (line 20) | function removeIdsNodes(flowData) {
  function removeIdsSwimlanes (line 51) | function removeIdsSwimlanes(flowData) {
  function removeIds (line 94) | function removeIds(flowData, mode) {
  function convertAndRemoveIds (line 101) | function convertAndRemoveIds(inputContent, inputName, expectedFlowData, ...
  function updateWorkspaceSettings (line 119) | async function updateWorkspaceSettings(Mode) {

FILE: client/test/components/LibraryNavigator/LibraryDataProvider.test.ts
  class MockRestLibraryAdapter (line 19) | class MockRestLibraryAdapter extends RestLibraryAdapter {
    method constructor (line 20) | constructor(api: ReturnType<typeof DataAccessApi>) {
  class MockLibraryModel (line 27) | class MockLibraryModel extends LibraryModel {
    method constructor (line 28) | constructor(api: ReturnType<typeof DataAccessApi>) {

FILE: client/test/components/profile/profile.test.ts
  function initProfile (line 29) | async function initProfile(): Promise<void> {
  type testCase (line 938) | interface testCase {

FILE: client/test/connection/itc/Coderunner.test.ts
  class MockSession (line 8) | class MockSession extends Session {
    method onSessionLogFn (line 13) | public set onSessionLogFn(logFn) {
    method onExecutionLogFn (line 16) | public set onExecutionLogFn(logFn) {
    method constructor (line 20) | public constructor(runMap?: Record<string, string>) {
    method establishConnection (line 25) | protected async establishConnection(): Promise<void> {
    method _run (line 29) | protected async _run(codeString: string): Promise<connection.RunResult> {
    method _close (line 48) | protected _close(): void | Promise<void> {}
    method sessionId (line 50) | public sessionId?(): string {

FILE: client/test/connection/itc/ItcLibraryAdapter.test.ts
  class DatasetMockSession (line 16) | class DatasetMockSession extends MockSession {
    method constructor (line 19) | public constructor(outputs: Array<string>) {
    method execute (line 23) | protected async execute(): Promise<void> {

FILE: client/test/connection/rest/index.test.ts
  type RunArgs (line 9) | interface RunArgs {
  function processRunArgs (line 13) | function processRunArgs(args: unknown[]): Record<string, string> {

FILE: client/test/connection/session.test.ts
  class MockSession (line 7) | class MockSession extends Session {
    method constructor (line 8) | constructor(protected readonly connectionMock: () => void) {
    method establishConnection (line 11) | protected async establishConnection(): Promise<void> {
    method _run (line 19) | protected _run(code: string, ...args: any[]): Promise<RunResult> {
    method _close (line 22) | protected _close(): Promise<void> | void {}
    method sessionId (line 23) | sessionId?(): string | undefined {

FILE: client/test/index.ts
  function run (line 5) | function run(): Promise<void> {

FILE: client/test/runTest.ts
  function main (line 5) | async function main() {

FILE: client/test/utils.ts
  function getUri (line 7) | function getUri(name: string): vscode.Uri {
  function openDoc (line 11) | async function openDoc(docUri: vscode.Uri): Promise<void> {
  function openNotebookDoc (line 17) | async function openNotebookDoc(docUri: vscode.Uri): Promise<void> {
  function sleep (line 22) | async function sleep(ms: number) {
  function getTestFixtureContent (line 26) | function getTestFixtureContent(name: string): Buffer {

FILE: server/src/python/PyrightLanguageProvider.ts
  type PyrightLanguageProvider (line 6) | type PyrightLanguageProvider =

FILE: server/src/python/browser/PyrightLanguageProviderBrowser.ts
  class PyrightLanguageProviderBrowser (line 55) | class PyrightLanguageProviderBrowser extends PyrightServer {
    method constructor (line 58) | constructor(
    method setSasLspProvider (line 67) | public setSasLspProvider(
    method getClientCapabilities (line 73) | public getClientCapabilities() {
    method setupConnection (line 77) | protected setupConnection(
    method onInitialized (line 86) | public onInitialized(): void {
    method initialize (line 91) | public async initialize(
    method addContentChange (line 99) | public addContentChange(doc: TextDocument): void {
    method onHover (line 109) | public async onHover(params: HoverParams, token: CancellationToken) {
    method onDidOpenTextDocument (line 113) | public async onDidOpenTextDocument(
    method onDidCloseTextDocument (line 132) | public async onDidCloseTextDocument(params: DidCloseTextDocumentParams) {
    method onDidChangeConfiguration (line 136) | public onDidChangeConfiguration(params: DidChangeConfigurationParams):...
    method onDefinition (line 140) | public async onDefinition(
    method onDeclaration (line 147) | public async onDeclaration(
    method onTypeDefinition (line 154) | public async onTypeDefinition(
    method onReferences (line 161) | public async onReferences(
    method onDocumentSymbol (line 175) | public async onDocumentSymbol(
    method onWorkspaceSymbol (line 182) | public async onWorkspaceSymbol(
    method onDocumentHighlight (line 190) | public async onDocumentHighlight(
    method onSignatureHelp (line 200) | public async onSignatureHelp(
    method onCompletion (line 207) | public async onCompletion(
    method onCompletionResolve (line 214) | public async onCompletionResolve(
    method onPrepareRenameRequest (line 221) | public async onPrepareRenameRequest(
    method onRenameRequest (line 228) | public async onRenameRequest(params: RenameParams, token: Cancellation...
    method onCallHierarchyPrepare (line 235) | public async onCallHierarchyPrepare(
    method onCallHierarchyIncomingCalls (line 242) | public async onCallHierarchyIncomingCalls(
    method onCallHierarchyOutgoingCalls (line 249) | public async onCallHierarchyOutgoingCalls(
    method onDidChangeWatchedFiles (line 256) | public onDidChangeWatchedFiles(params: DidChangeWatchedFilesParams): v...
    method onExecuteCommand (line 260) | public async onExecuteCommand(
    method executeCodeAction (line 268) | public async executeCodeAction(
    method onShutdown (line 275) | public async onShutdown(token: CancellationToken): Promise<void> {

FILE: server/src/python/browser/fakeFileSystem.ts
  function createFromRealFileSystem (line 28) | function createFromRealFileSystem(
  class RealTempFile (line 46) | class RealTempFile implements TempFile, CaseSensitivityDetector {
    method constructor (line 50) | constructor() {
    method tmpdir (line 54) | tmpdir(): Uri {
    method tmpfile (line 62) | tmpfile(options?: TmpfileOptions): Uri {
    method isCaseSensitive (line 71) | isCaseSensitive(uri: string): boolean {

FILE: server/src/python/browser/typeshed-loader/index.js
  function loader (line 26) | async function loader() {

FILE: server/src/python/node/PyrightLanguageProviderNode.ts
  class PyrightLanguageProviderNode (line 63) | class PyrightLanguageProviderNode extends PyrightServer {
    method constructor (line 66) | constructor(
    method setSasLspProvider (line 75) | public setSasLspProvider(
    method getClientCapabilities (line 81) | public getClientCapabilities(): ClientCapabilities {
    method setupConnection (line 85) | protected setupConnection(
    method onInitialized (line 94) | public onInitialized(): void {
    method initialize (line 99) | public async initialize(
    method addContentChange (line 107) | public addContentChange(doc: TextDocument): void {
    method onHover (line 117) | public async onHover(params: HoverParams, token: CancellationToken) {
    method onDidOpenTextDocument (line 121) | public async onDidOpenTextDocument(
    method onDidCloseTextDocument (line 140) | public async onDidCloseTextDocument(params: DidCloseTextDocumentParams) {
    method onDidChangeConfiguration (line 144) | public onDidChangeConfiguration(params: DidChangeConfigurationParams):...
    method onDefinition (line 148) | public async onDefinition(
    method onDeclaration (line 155) | public async onDeclaration(
    method onTypeDefinition (line 162) | public async onTypeDefinition(
    method onReferences (line 169) | public async onReferences(
    method onDocumentSymbol (line 194) | public async onDocumentSymbol(
    method onWorkspaceSymbol (line 201) | public async onWorkspaceSymbol(
    method onDocumentHighlight (line 209) | public async onDocumentHighlight(
    method onSignatureHelp (line 219) | public async onSignatureHelp(
    method onCompletion (line 226) | public async onCompletion(
    method onCompletionResolve (line 233) | public async onCompletionResolve(
    method onPrepareRenameRequest (line 240) | public async onPrepareRenameRequest(
    method onRenameRequest (line 247) | public async onRenameRequest(params: RenameParams, token: Cancellation...
    method onCallHierarchyPrepare (line 254) | public async onCallHierarchyPrepare(
    method onCallHierarchyIncomingCalls (line 261) | public async onCallHierarchyIncomingCalls(
    method onCallHierarchyOutgoingCalls (line 268) | public async onCallHierarchyOutgoingCalls(
    method onDidChangeWatchedFiles (line 275) | public onDidChangeWatchedFiles(params: DidChangeWatchedFilesParams): v...
    method onExecuteCommand (line 279) | public async onExecuteCommand(
    method onShutdown (line 287) | public async onShutdown(token: CancellationToken): Promise<void> {
    method executeCodeAction (line 291) | public async executeCodeAction(

FILE: server/src/python/sas/sas2py.pyi
  class SAS2py (line 4) | class SAS2py:
    method hideLOG (line 14) | def hideLOG(self, tf: bool) -> None:
    method printLOG (line 29) | def printLOG(self, method='SAS') -> None:
    method clearLOG (line 46) | def clearLOG(self) -> None:
    method submit (line 55) | def submit(self, code: str) -> int:
    method symget (line 65) | def symget(self, name: str) -> str:
    method symput (line 76) | def symput(self, name: str, val: str) -> int:
    method pyplot (line 87) | def pyplot(self, plot: object, filename: str = None, filepath: str = N...
    method renderImage (line 103) | def renderImage(self, filename: str) -> None:
    method logMessage (line 115) | def logMessage(self, message: str, messageType: str = 'NOTE') -> None:
    method sasdata2dataframe (line 134) | def sasdata2dataframe(self, dataset: str, rowsep: str = '\x01', colsep...
    method sd2df (line 140) | def sd2df(self, dataset: str, rowsep: str = '\x01', colsep: str = '\x02',
    method dataframe2sasdata (line 161) | def dataframe2sasdata(self, df, dataset: str,
    method df2sd (line 170) | def df2sd(self, df: 'pandas.DataFrame', dataset: str,
    method sasfnc (line 201) | def sasfnc(self, *arg) -> str:

FILE: server/src/sas/CodeZoneManager.ts
  type TokenEx (line 11) | interface TokenEx extends Pick<Token, "type" | "text"> {
  type TokenWithPos (line 17) | interface TokenWithPos extends TokenEx {
  type Context (line 21) | interface Context {
  type Zone (line 33) | interface Zone {
  constant SEC_TYPE (line 37) | const SEC_TYPE = LexerEx.SEC_TYPE,
  class CodeZoneManager (line 85) | class CodeZoneManager {
    method constructor (line 112) | constructor(
    method _reset (line 120) | private _reset() {
    method _needOptionDelimiter (line 127) | private _needOptionDelimiter() {
    method _isDatasetOpt (line 141) | private _isDatasetOpt(name: string) {
    method _getStmts (line 157) | private _getStmts(procName: string) {
    method _getFullStmtName (line 176) | private _getFullStmtName(
    method _ended (line 212) | private _ended(token: TokenEx) {
    method _token (line 251) | private _token(line: number, col: number): TokenEx | null {
    method _getPrev (line 313) | private _getPrev(context: Context): TokenEx | null {
    method _getNext (line 418) | private _getNext(context: Context): TokenEx | null {
    method _getNextEx (line 469) | private _getNextEx(context: Context): TokenWithPos {
    method _transToken (line 500) | private _transToken(token: Token) {
    method _tokenizeStmt (line 516) | private _tokenizeStmt(line: number, col: number) {
    method _emit (line 532) | private _emit(token: any, zone: number, force?: boolean) {
    method _emit1 (line 539) | private _emit1(token: any, lZone: number, rZone: number) {
    method _blockName (line 546) | private _blockName(block: { startLine: number; startCol: number }) {
    method _pos (line 561) | private _pos(cursor: { line: number; col: number }, token: TokenEx) {
    method _inBlock (line 620) | private _inBlock(
    method _isBlockStart (line 648) | private _isBlockStart(
    method _endedReally (line 655) | private _endedReally(block: { endLine: number; endCol: number }) {
    method _skipToStmtStart (line 690) | private _skipToStmtStart(context: Context, tokenizing: boolean) {
    method _isStatgraph (line 730) | private _isStatgraph(
    method _embeddedBlock (line 746) | private _embeddedBlock(
    method _findEmbeddedBlock (line 752) | private _findEmbeddedBlock(
    method _globalStmt (line 805) | private _globalStmt(context: Context) {
    method _procSec (line 893) | private _procSec(context: Context) {
    method _procDef (line 952) | private _procDef(context: Context) {
    method _context (line 984) | private _context(
    method _setOptName (line 1041) | private _setOptName(node: {
    method _zone (line 1056) | private _zone(stack: any[], context: Context): Zone {
    method _isCall (line 1123) | private _isCall(zone: any) {
    method _procStmt (line 1129) | private _procStmt(context: Context, stmt: TokenWithPos) {
    method _stmtEx (line 1190) | private _stmtEx(context: Context, stmt: TokenWithPos) {
    method _emit3 (line 1196) | private _emit3(context: Context, tree: any, type: any) {
    method _if (line 1203) | private _if(context: Context, stmt: { text: string }, type: number) {
    method _where (line 1237) | private _where(context: Context, stmt: TokenWithPos) {
    method _style (line 1241) | private _style(context: Context, stmt: TokenWithPos) {
    method _ods (line 1302) | private _ods(context: Context, stmt: TokenWithPos) {
    method _traverse (line 1321) | private _traverse(
    method _firstToken (line 1345) | private _firstToken(opt: any): any {
    method _isNormalStmt (line 1356) | private _isNormalStmt(stmt: { text: string }) {
    method _checkFuncType (line 1363) | private _checkFuncType(token: { text: string }) {
    method _stmt (line 1370) | private _stmt(context: Context, stmt: { text: string }) {
    method _startScope (line 1416) | private _startScope(context: Context, scope: number, obj?: any) {
    method _endScope (line 1422) | private _endScope(context: Context) {
    method _styleOptionAllowed (line 1425) | private _styleOptionAllowed() {
    method _emitArgList (line 1439) | private _emitArgList(list: any[], ltype: number, rtype: number) {
    method _emitTree (line 1480) | private _emitTree(context: Context, expr: any, type?: any) {
    method _stmtOptions (line 1573) | private _stmtOptions(
    method _dsExpr (line 1670) | private _dsExpr(context: Context) {
    method _argList (line 1682) | private _argList(
    method _tryGetOpr (line 1800) | private _tryGetOpr(context: Context) {
    method _expr (line 1807) | private _expr(
    method _dataSec (line 1855) | private _dataSec(context: Context) {
    method _dataDef (line 1904) | private _dataDef(context: Context, stmt: TokenWithPos) {
    method _datasetOptions (line 2040) | private _datasetOptions(context: Context) {
    method _tryGetMoreVals (line 2133) | private _tryGetMoreVals(context: Context, emitType: number) {
    method _datastepOptions (line 2155) | private _datastepOptions(context: Context) {
    method _dataStmt (line 2163) | private _dataStmt(context: Context, stmt: TokenWithPos) {
    method _callStmt (line 2200) | private _callStmt(context: Context) {
    method _setStmt (line 2203) | private _setStmt(context: Context, stmt: TokenWithPos) {
    method _macroSec (line 2259) | private _macroSec(context: Context) {
    method _macroDef (line 2328) | private _macroDef(context: Context): number {
    method _macroStmt (line 2370) | private _macroStmt(context: Context, stmt: TokenWithPos) {
    method _normalize (line 2431) | private _normalize(line: number, col: number) {
    method _cloneContext (line 2443) | private _cloneContext(context: Context): Context {
    method _copyContext (line 2452) | private _copyContext(src: any, dst: any) {
    method _currentZone (line 2460) | private _currentZone(line: number, col: number) {
    method getProcName (line 2530) | getProcName(): string {
    method getStmtName (line 2533) | getStmtName(): string {
    method getOptionName (line 2536) | getOptionName(): string {
    method getSubOptionName (line 2539) | getSubOptionName(): string {
    method getCurrentZone (line 2542) | getCurrentZone(line: number, col: number) {
    method setSectionMode (line 2549) | setSectionMode(secType: number, procName: string): void {

FILE: server/src/sas/CompletionProvider.ts
  constant ZONE_TYPE (line 23) | const ZONE_TYPE = CodeZoneManager.ZONE_TYPE;
  function _buildKwMap (line 63) | function _buildKwMap() {
  constant KW_MAP (line 89) | const KW_MAP = _buildKwMap();
  function _distinctList (line 114) | function _distinctList(list: string[]) {
  function _notify (line 127) | function _notify<T>(cb: (data: T) => void, data: T) {
  function _cleanUpODSStmts (line 135) | function _cleanUpODSStmts(oldStmts: string[]) {
  function _cleanUpODSStmtName (line 147) | function _cleanUpODSStmtName(name: string) {
  function _cleanUpKeyword (line 158) | function _cleanUpKeyword(keyword: string) {
  function _getContextMain (line 192) | function _getContextMain(zone: number, keyword: string) {
  function _cleanArg (line 224) | function _cleanArg(arg = "", trimEndNum = false) {
  function getItemKind (line 238) | function getItemKind(zone: number | LibCompleteItem["type"]) {
  function processLabelCase (line 254) | function processLabelCase(label: string, prefix: string): string {
  class CompletionProvider (line 268) | class CompletionProvider {
    method constructor (line 273) | constructor(
    method getCodeZoneManager (line 281) | getCodeZoneManager(): CodeZoneManager {
    method getHelp (line 285) | getHelp(position: Position): Promise<Hover | undefined> | undefined {
    method getSignatureHelp (line 334) | getSignatureHelp(
    method getCompleteItems (line 615) | getCompleteItems(
    method getCompleteItemHelp (line 698) | getCompleteItemHelp(item: CompletionItem): Promise<CompletionItem> {
    method _loadAutoCompleteItems (line 739) | private _loadAutoCompleteItems(
    method _loadHelp (line 1078) | private _loadHelp(context: {
    method _addLinkContext (line 1388) | private _addLinkContext(zone: number, content: HelpData) {
    method _notifyOptValue (line 1726) | private _notifyOptValue(
    method _getZone (line 1769) | private _getZone(position: Position) {
    method _getPrefix (line 1781) | private _getPrefix(position: Position) {
    method _findLibRef (line 1793) | private _findLibRef() {
    method _getDatasetNames (line 1826) | private _getDatasetNames() {
    method _getMacroVar (line 1871) | private _getMacroVar() {
    method _genKeywordLink (line 1952) | private _genKeywordLink(

FILE: server/src/sas/FormatOnTypeProvider.ts
  constant ZONE_TYPE (line 11) | const ZONE_TYPE = CodeZoneManager.ZONE_TYPE;
  class FormatOnTypeProvider (line 13) | class FormatOnTypeProvider {
    method constructor (line 17) | constructor(
    method getIndentEdit (line 25) | public getIndentEdit(
    method _getSemicolonTriggeredIndentEdit (line 45) | private _getSemicolonTriggeredIndentEdit(
    method _getEnterTriggeredIndentEdit (line 271) | private _getEnterTriggeredIndentEdit(
    method _getIndentIncrementOfNextLine (line 323) | private _getIndentIncrementOfNextLine(
    method _cleanTokens (line 404) | private _cleanTokens(line: number, tokens: SyntaxToken[]): SyntaxToken...
    method _getLastNotEmptyLine (line 418) | private _getLastNotEmptyLine(line: number): number | undefined {
    method _makeIndentText (line 431) | private _makeIndentText(
    method _getIndentText (line 448) | private _getIndentText(line: string): string {
    method _getIndentLength (line 460) | private _getIndentLength(line: string, tabSize: number): number {
    method _isEmptyLine (line 474) | private _isEmptyLine(line: string) {
    method _getTokenText (line 478) | private _getTokenText(
    method _getPrevValidTokenInfo (line 496) | private _getPrevValidTokenInfo(
    method _isCommentOrBlankToken (line 530) | private _isCommentOrBlankToken(token: SyntaxToken, text: string): bool...

FILE: server/src/sas/LanguageServiceProvider.ts
  function getType (line 45) | function getType(type: string) {
  class LanguageServiceProvider (line 58) | class LanguageServiceProvider {
    method constructor (line 65) | constructor(doc: TextDocument) {
    method getCodeZoneManager (line 106) | getCodeZoneManager(): CodeZoneManager {
    method getTokens (line 110) | getTokens(): number[] {
    method getDocumentSymbols (line 141) | getDocumentSymbols(): DocumentSymbol[] {
    method _buildDocumentSymbol (line 165) | private _buildDocumentSymbol(
    method getFoldingRanges (line 189) | getFoldingRanges(): FoldingRange[] {
    method addCommentFolding (line 218) | private addCommentFolding(result: FoldingRange[]) {
    method _flattenFoldingBlockTree (line 231) | private _flattenFoldingBlockTree(rootBlock: FoldingBlock): FoldingBloc...
    method getFoldingBlock (line 245) | getFoldingBlock(
    method toggleLineComment (line 261) | toggleLineComment(range: Range) {
    method setLibService (line 291) | setLibService(fn: LibService): void {

FILE: server/src/sas/Lexer.ts
  constant DAYS (line 18) | const DAYS = {
  constant DATE_DDMMMYY_YYQ_REG (line 32) | const DATE_DDMMMYY_YYQ_REG =
  function checkQuote (line 35) | function checkQuote(current: number, isHead: boolean, text: string) {
  type Token (line 52) | interface Token {
  type EmbeddedLangState (line 82) | enum EmbeddedLangState {
  class Lexer (line 94) | class Lexer {
    method constructor (line 106) | constructor(private model: Model) {
    method _readToken (line 251) | _readToken(): Token | undefined {
    method getNext (line 284) | getNext(): Token | undefined {
    method _readEmbeddedCodeLine (line 547) | private _readEmbeddedCodeLine(
    method _foundEmbeddedCodeToken (line 559) | private _foundEmbeddedCodeToken(
    method getNext_ (line 594) | private getNext_(): Omit<Token, "text"> | undefined {
    method end (line 1044) | end(): boolean {
    method reset (line 1050) | reset(): void {
    method startFrom (line 1054) | startFrom(line: number, col: number): void {
    method readNum (line 1063) | readNum(col: number, radix?: number): number {
    method isMacroKeyword (line 1081) | isMacroKeyword(word: string): boolean {
    method getWord (line 1084) | getWord(token: Token | undefined): string {
    method getText (line 1093) | getText(token: Token): string {

FILE: server/src/sas/LexerEx.ts
  class FoldingBlock (line 19) | class FoldingBlock {
    method constructor (line 36) | constructor(...arg: any[]) {
  class LexerEx (line 115) | class LexerEx {
    method constructor (line 160) | constructor(private model: Model) {
    method getBlockPos2_ (line 203) | private getBlockPos2_(
    method _startPos (line 248) | private _startPos(block: FoldingBlock) {
    method _endPos (line 251) | private _endPos(block: FoldingBlock) {
    method _setStart (line 254) | private _setStart(block: FoldingBlock, pos: TextPosition) {
    method _setEnd (line 258) | private _setEnd(block: FoldingBlock, pos: TextPosition) {
    method _sectionEndPos (line 262) | private _sectionEndPos(block: FoldingBlock) {
    method _setSectionEnd (line 265) | private _setSectionEnd(block: FoldingBlock, pos: TextPosition) {
    method _getNextValidTknBlkIdx (line 270) | private _getNextValidTknBlkIdx(startIndex: number) {
    method _checkCards4 (line 286) | private _checkCards4(
    method _saveRemoveDataLines (line 300) | private _saveRemoveDataLines(
    method _remove (line 353) | private _remove(reg: RegExp, text: string, replacement?: string) {
    method _removeComment (line 371) | private _removeComment(text: string) {
    method _removeConst (line 375) | private _removeConst(text: string) {
    method _isBlank (line 379) | private _isBlank(text: string) {
    method _isTailDestroyed (line 383) | private _isTailDestroyed(change: Change, block: FoldingBlock) {
    method _isCollapsedPartially (line 395) | private _isCollapsedPartially(block: FoldingBlock) {
    method _isBetween (line 398) | private _isBetween(
    method _isBefore (line 410) | private _isBefore(
    method _getBlkIndex (line 428) | private _getBlkIndex(
    method _handleSpecialBlocks (line 445) | private _handleSpecialBlocks(
    method _getTknBlkIndex (line 475) | private _getTknBlkIndex(startSectionIdx: number) {
    method _adjustPosCoord (line 479) | private _adjustPosCoord(change: Change, pos: TextPosition) {
    method _adjustBlocksCoord (line 508) | private _adjustBlocksCoord(
    method _isHeadDestroyed (line 549) | private _isHeadDestroyed(change: Change, block: FoldingBlock) {
    method _cleanKeyword (line 572) | private _cleanKeyword(keyword: string) {
    method adjustFoldingEnd_ (line 606) | private adjustFoldingEnd_(prevBlock: FoldingBlock, currBlock: FoldingB...
    method _pushRootBlock (line 620) | private _pushRootBlock(block: FoldingBlock) {
    method _adjustBlockTreeFoldingEnd (line 639) | private _adjustBlockTreeFoldingEnd(rootBlock: FoldingBlock): void {
    method _changeCardsDataToken (line 652) | private _changeCardsDataToken(token: {
    method _clonePos (line 661) | private _clonePos(pos: TextPosition) {
    method startFoldingBlock_ (line 664) | private startFoldingBlock_(type: any, pos: TextPosition, name: string) {
    method endFoldingBlock_ (line 680) | private endFoldingBlock_(
    method hasFoldingBlock_ (line 715) | private hasFoldingBlock_(): boolean {
    method getLastNormalFoldingBlockInLine_ (line 718) | private getLastNormalFoldingBlockInLine_(
    method getFoldingBlock_ (line 750) | private getFoldingBlock_(
    method getFoldingBlock (line 788) | getFoldingBlock(
    method getBlockPos_ (line 817) | private getBlockPos_(blocks: FoldingBlock[], line: number, col?: numbe...
    method getBlockPos1_ (line 828) | private getBlockPos1_(blocks: FoldingBlock[], line: number) {
    method resetFoldingBlockCache_ (line 859) | private resetFoldingBlockCache_() {
    method tryEndFoldingBlock_ (line 862) | private tryEndFoldingBlock_(
    method tryStop_ (line 889) | private tryStop_(token: Token) {
    method printBlocks (line 945) | printBlocks() {
    method normalizeStart_ (line 950) | private normalizeStart_(block: FoldingBlock) {
    method normalizeEnd_ (line 960) | private normalizeEnd_(block: FoldingBlock) {
    method normalizeBlock_ (line 970) | private normalizeBlock_(block: FoldingBlock) {
    method trimBlock_ (line 974) | private trimBlock_(block: FoldingBlock) {
    method getLastToken_ (line 985) | private getLastToken_(block: FoldingBlock) {
    method getChange_ (line 1005) | private getChange_(blocks: FoldingBlock[], origPos: TextPosition) {
    method _getParseRange (line 1046) | private _getParseRange(blocks: FoldingBlock[], change: Change) {
    method getParseRange (line 1127) | getParseRange(change: Change) {
    method getParseRangeBySections_ (line 1130) | private getParseRangeBySections_(change: Change) {
    method trimRange_ (line 1235) | private trimRange_(range: { endLine: number; endCol: number }) {
    method start_ (line 1254) | private start_(change: Change) {
    method _handleSections (line 1273) | private _handleSections(change: Change, parseRange: any) {
    method _docEndPos (line 1300) | _docEndPos() {
    method _getParseText (line 1304) | private _getParseText(change: Change & { type: string }, parseRange: a...
    method _getNextComment (line 1348) | private _getNextComment(startIndex: number) {
    method _getNextCards4 (line 1356) | private _getNextCards4(startIndex: number) {
    method _checkSpecialChange (line 1367) | private _checkSpecialChange(
    method _handleTokens (line 1478) | private _handleTokens(change: Change, parseRange: any) {
    method setKeyword_ (line 1491) | setKeyword_(
    method addTknBlock_ (line 1511) | private addTknBlock_(block: FoldingBlock) {
    method tryToAddTknBlock_ (line 1524) | private tryToAddTknBlock_(token: Token) {
    method tryToAddCardsBlock_ (line 1543) | private tryToAddCardsBlock_(token: Token) {
    method start (line 1593) | start(change: Change) {
    method end (line 1599) | end() {
    method reset (line 1602) | reset() {
    method getNext (line 1606) | getNext() {
    method getNext_ (line 1622) | private getNext_() {
    method cacheToken_ (line 1640) | private cacheToken_(token?: Token) {
    method prefetch0_ (line 1653) | prefetch0_(pos: number) {
    method prefetch_ (line 1666) | private prefetch_(it: { pos: any }) {
    method isNextTokenColon_ (line 1677) | private isNextTokenColon_() {
    method getWord_ (line 1686) | private getWord_(token: Token | undefined) {
    method isLabel_ (line 1690) | private isLabel_(token?: Token) {
    method isAssignment_ (line 1695) | private isAssignment_(token: Token) {
    method isCustomBlockStart_ (line 1709) | private isCustomBlockStart_(token: Token): boolean {
    method isCustomBlockEnd_ (line 1716) | private isCustomBlockEnd_(token: Token): boolean {
    method readProg_ (line 1723) | private readProg_() {
    method handleProcName_ (line 2220) | private handleProcName_() {
    method readProcDef_ (line 2230) | private readProcDef_() {
    method readDataDef_ (line 2233) | private readDataDef_() {
    method readMacroDef_ (line 2236) | private readMacroDef_() {
    method readMacroParams_ (line 2249) | private readMacroParams_() {
    method handleODSStmt_ (line 2265) | private handleODSStmt_(token: Token) {
    method handleLongStmtName_ (line 2297) | private handleLongStmtName_(
    method handleLongStmtOptionName_ (line 2365) | private handleLongStmtOptionName_(
    method handleLongStmtSubOptionName_ (line 2390) | private handleLongStmtSubOptionName_(
    method handleLongOptionName_ (line 2419) | private handleLongOptionName_(context: {
    method tryToHandleSectionEnd_ (line 2466) | private tryToHandleSectionEnd_(token: Token) {
    method tryToHandleExpr_ (line 2478) | private tryToHandleExpr_(
    method readGblStmt_ (line 2545) | private readGblStmt_() {
    method readProcStmt_ (line 2552) | private readProcStmt_() {
    method readDataStmt_ (line 2579) | private readDataStmt_() {
    method readMacroStmt_ (line 2582) | private readMacroStmt_() {
    method popSMTo_ (line 2585) | private popSMTo_(level: number) {
    method handleBlock_ (line 2593) | private handleBlock_(fn: { (token: any): void }) {
    method handleStatement_ (line 2692) | private handleStatement_(optChecker: {
    method handleEnd_ (line 2721) | private handleEnd_() {
    method handleMref_ (line 2729) | private handleMref_(state: number) {
    method readLabel_ (line 2735) | private readLabel_() {
    method readMRef_ (line 2742) | private readMRef_() {
    method readComment_ (line 2761) | private readComment_() {
    method readStatGraph_ (line 2764) | private readStatGraph_() {
    method readStatGraphDef_ (line 2804) | private readStatGraphDef_() {
    method readStatGraphStmt_ (line 2807) | private readStatGraphStmt_() {
    method readStatGraphEnd_ (line 2810) | private readStatGraphEnd_() {
    method readDefineTagset_ (line 2813) | private readDefineTagset_() {
    method readDefineTagsetDef_ (line 2877) | private readDefineTagsetDef_() {
    method readDefineTagsetStmt_ (line 2880) | private readDefineTagsetStmt_() {
    method readDefineTagsetEnd_ (line 2883) | private readDefineTagsetEnd_() {
    method readDefineEvent_ (line 2886) | private readDefineEvent_() {
    method readDefineEventDef_ (line 2927) | private readDefineEventDef_() {
    method readDefineEventStmt_ (line 2930) | private readDefineEventStmt_() {
    method readDefineEventEnd_ (line 2933) | private readDefineEventEnd_() {
    method readSubmitOrInteractiveBlock_ (line 2936) | private readSubmitOrInteractiveBlock_() {
    method readProc_ (line 2974) | private readProc_() {
    method hasRunCancelFollowed_ (line 3195) | private hasRunCancelFollowed_() {
    method readData_ (line 3225) | private readData_() {
    method searchBlockUpwardOfType_ (line 3392) | private searchBlockUpwardOfType_(
    method searchLastConsecutiveBlockUpwardOfType_ (line 3407) | private searchLastConsecutiveBlockUpwardOfType_(
    method tryPromoteCustomBlock_ (line 3420) | private tryPromoteCustomBlock_() {
    method readMacro_ (line 3454) | private readMacro_() {
    method readGbl_ (line 3569) | private readGbl_() {
    method readCards_ (line 3675) | private readCards_() {
    method readEnd_ (line 3743) | private readEnd_() {
    method readMend_ (line 3765) | private readMend_() {
  class Expression (line 3788) | class Expression {
    method constructor (line 3794) | constructor(parser: LexerEx) {

FILE: server/src/sas/Model.ts
  class Model (line 7) | class Model {
    method constructor (line 8) | constructor(private doc: TextDocument) {}
    method getLine (line 10) | getLine(line: number): string {
    method getLineCount (line 17) | getLineCount(): number {
    method getText (line 21) | getText(range: TextRange): string {
    method getColumnCount (line 34) | getColumnCount(line: number): number {

FILE: server/src/sas/SyntaxDataProvider.ts
  type HelpData (line 9) | interface HelpData {
  type OptionValues (line 25) | interface OptionValues {
  type LibCompleteItem (line 30) | interface LibCompleteItem {
  type LibService (line 36) | type LibService = (
  type SupportSiteInformation (line 41) | interface SupportSiteInformation {
  type FunctionData (line 47) | interface FunctionData {
  type ArgumentData (line 54) | interface ArgumentData {
  type StatementOption (line 63) | interface StatementOption {
  type Statement (line 76) | interface Statement {
  type Procedure (line 86) | interface Procedure {
  constant ID_HELP (line 93) | const db: any = {
  constant ID_TYPE (line 93) | const db: any = {
  constant ID_OPTS (line 93) | const db: any = {
  constant ID_OPTS_REQ (line 93) | const db: any = {
  constant ID_VALS (line 93) | const db: any = {
  constant ID_STMTS (line 93) | const db: any = {
  constant ID_HAS_OPT_DELIMITER (line 93) | const db: any = {
  constant ID_SUB_OPTS (line 93) | const db: any = {
  constant ID_KEYWORDS (line 93) | const db: any = {
  constant ID_ALIAS (line 93) | const db: any = {
  constant ID_ATTR (line 93) | const db: any = {
  constant ID_SYNTAX (line 93) | const db: any = {
  constant ID_ARGUMENTS (line 93) | const db: any = {
  constant ID_SUPPORT_SITE (line 93) | const db: any = {
  function _uniq (line 164) | function _uniq(arr: any[]) {
  function _notify (line 181) | function _notify<T>(cb: ((arg0: T) => void) | null | undefined, data: T) {
  function _obj (line 190) | function _obj(root: any, ...other: any[]) {
  function _removeEqu (line 199) | function _removeEqu(name: string) {
  function _cleanName (line 202) | function _cleanName(name: string) {
  function _resolveAliasFromPubs (line 210) | function _resolveAliasFromPubs(alias: string, item: { name: string }) {
  function _resolveAlias (line 217) | function _resolveAlias(name: string, pool: string) {
  function _stmtOptSupportSite (line 223) | function _stmtOptSupportSite(
  function _procOptSupportSite (line 243) | function _procOptSupportSite(procName: string, optName: string) {
  function _procStmtOptSupportSite (line 255) | function _procStmtOptSupportSite(
  function _procOptObj (line 275) | function _procOptObj(
  function _procStmtObj (line 290) | function _procStmtObj(
  function _keywordObj (line 306) | function _keywordObj(type: string, name?: string) {
  function _stmtObj (line 310) | function _stmtObj(
  function _funcObj (line 322) | function _funcObj(funcName: string, context: string) {
  function _resolveURL (line 352) | function _resolveURL(type: string) {
  function _getSubOptKeywords (line 362) | function _getSubOptKeywords(obj: any, data: string) {
  function _getHelp (line 385) | function _getHelp(data: { [x: string]: any }) {
  function _iterateValues (line 389) | function _iterateValues(
  function _iterateKeywords (line 411) | function _iterateKeywords(
  function _tryToLoad (line 430) | function _tryToLoad<T>(config: {
  function _setColors (line 455) | function _setColors(values: any) {
  function _loadColors (line 460) | function _loadColors(cb: () => void) {
  function _sasColorsLoaded (line 475) | function _sasColorsLoaded() {
  function _tryToLoadColors (line 479) | function _tryToLoadColors(userCb: any) {
  function _getFunctionHelp (line 494) | function _getFunctionHelp(funcName: string, context: string, userCb?: an...
  function _setFunctionsFromPubs (line 509) | function _setFunctionsFromPubs(data: FunctionData[], context: string) {
  function _loadFunctionsFromPubs (line 526) | function _loadFunctionsFromPubs(context: string, cb?: () => void) {
  function _FunctionsLoadedFromPubs (line 541) | function _FunctionsLoadedFromPubs(context: string) {
  function _tryToLoadFunctionsFromPubs (line 544) | function _tryToLoadFunctionsFromPubs<T>(
  function _loadProceduresFromPubs (line 561) | function _loadProceduresFromPubs(cb?: () => void) {
  function _tryToLoadProceduresFromPubs (line 582) | function _tryToLoadProceduresFromPubs<T>(
  function _setStatementOptionValueHelp (line 599) | function _setStatementOptionValueHelp(
  function _setStatementOptionValues (line 611) | function _setStatementOptionValues(
  function _setStatementOptionHelp (line 635) | function _setStatementOptionHelp(stmtName: string, optName: string, data...
  function _setStatementOptionType (line 638) | function _setStatementOptionType(stmtName: string, optName: string, data...
  function _setStatementOptionAlias (line 641) | function _setStatementOptionAlias(
  function _setStatementSubOptions (line 648) | function _setStatementSubOptions(stmtName: string, optName: string, data...
  function _setStatementOption (line 653) | function _setStatementOption(
  function _setStatementOptions (line 680) | function _setStatementOptions(stmtName: string, keywords: any) {
  function _loadStatementOptions (line 692) | function _loadStatementOptions(stmtName: string, cb: () => void) {
  function _statementLoaded (line 716) | function _statementLoaded(stmtName: string) {
  function _tryToLoadStatementOptions (line 720) | function _tryToLoadStatementOptions(
  function _getStatementHelp (line 737) | function _getStatementHelp(
  function _setStatementsFromPubs (line 756) | function _setStatementsFromPubs(data: Statement[], context: string) {
  function _loadStatementsFromPubs (line 792) | function _loadStatementsFromPubs(context: string, cb?: () => void) {
  function _StatementsLoadedFromPubs (line 807) | function _StatementsLoadedFromPubs(context: string) {
  function _tryToLoadStatementsFromPubs (line 810) | function _tryToLoadStatementsFromPubs<T>(
  function _setKeywordHelp (line 828) | function _setKeywordHelp(type: string, name: string, data: any) {
  function _setKeywordAlias (line 831) | function _setKeywordAlias(type: string, name: string, data: any) {
  function _setKeywordAttr (line 834) | function _setKeywordAttr(type: string, name: string, data: string) {
  function _setKeyword (line 837) | function _setKeyword(
  function _setKeywords (line 849) | function _setKeywords(type: string, keywords: any) {
  function _loadKeywords (line 861) | function _loadKeywords(type: string, cb: any) {
  function _keywordLoaded (line 876) | function _keywordLoaded(type: string) {
  function _tryToLoadKeywords (line 880) | function _tryToLoadKeywords(
  function _getKeywords (line 897) | function _getKeywords(type: string, userCb: any) {
  function _getKeywordHelp (line 906) | function _getKeywordHelp(name: string, type: string, userCb: any) {
  function _loadProcedureFromPubs (line 917) | function _loadProcedureFromPubs(procName: string, cb?: () => void) {
  function _loadProcedure (line 939) | function _loadProcedure(procName: string, cb?: () => void) {
  function _procedureLoaded (line 958) | function _procedureLoaded(procName: string) {
  function _tryToLoadProcedure (line 962) | function _tryToLoadProcedure<T>(
  function _setProcedureFromPubs (line 986) | function _setProcedureFromPubs(
  function _setProcedure (line 1015) | function _setProcedure(
  function _setProcedureHelpFromPubs (line 1047) | function _setProcedureHelpFromPubs(procName: string, data: Statement) {
  function _setProcedureHelp (line 1051) | function _setProcedureHelp(procName: string, data: any) {
  function _setProcedureOptionHelpFromPubs (line 1055) | function _setProcedureOptionHelpFromPubs(
  function _setProcedureOptionHelp (line 1065) | function _setProcedureOptionHelp(procName: string, optName: string, data...
  function _setProcedureOptionType (line 1068) | function _setProcedureOptionType(
  function _setProcedureOptionAliasFromPubs (line 1075) | function _setProcedureOptionAliasFromPubs(
  function _setProcedureOptionAlias (line 1082) | function _setProcedureOptionAlias(
  function _setProcedureOptionSubOptKeywordsFromPubs (line 1089) | function _setProcedureOptionSubOptKeywordsFromPubs(
  function _setProcedureOptionSubOptKeywords (line 1114) | function _setProcedureOptionSubOptKeywords(
  function _setProcedureOptionValueHelp (line 1125) | function _setProcedureOptionValueHelp(
  function _setProcedureOptionValueFromPubs (line 1133) | function _setProcedureOptionValueFromPubs(
  function _setProcedureOptionValuesFromPubs (line 1147) | function _setProcedureOptionValuesFromPubs(
  function _setProcedureOptionValues (line 1174) | function _setProcedureOptionValues(
  function _setProcedureOptionFromPubs (line 1197) | function _setProcedureOptionFromPubs(procName: string, data: StatementOp...
  function _setProcedureOption (line 1212) | function _setProcedureOption(
  function _setProcedureOptionsFromPubs (line 1247) | function _setProcedureOptionsFromPubs(
  function _setProcedureOptions (line 1269) | function _setProcedureOptions(procName: string, data: any[]) {
  function _setProcedureStatementHelpFromPubs (line 1292) | function _setProcedureStatementHelpFromPubs(
  function _setProcedureStatementHelp (line 1302) | function _setProcedureStatementHelp(
  function _setProcedureStatementAliasFromPubs (line 1309) | function _setProcedureStatementAliasFromPubs(
  function _setProcedureStatementAlias (line 1316) | function _setProcedureStatementAlias(
  function _setProcedureStatementOptionFromPubs (line 1323) | function _setProcedureStatementOptionFromPubs(
  function _setProcedureStatementOption (line 1359) | function _setProcedureStatementOption(
  function _setProcedureStatementOptionHelpFromPubs (line 1413) | function _setProcedureStatementOptionHelpFromPubs(
  function _setProcedureStatementOptionHelp (line 1424) | function _setProcedureStatementOptionHelp(
  function _setProcedureStatementOptionType (line 1432) | function _setProcedureStatementOptionType(
  function _setProcedureStatementOptionAliasFromPubs (line 1440) | function _setProcedureStatementOptionAliasFromPubs(
  function _setProcedureStatementOptionAlias (line 1448) | function _setProcedureStatementOptionAlias(
  function _setProcedureStatementSubOptKeywordFromPubs (line 1459) | function _setProcedureStatementSubOptKeywordFromPubs(
  function _setProcedureStatementSubOptKeywordsFromPubs (line 1481) | function _setProcedureStatementSubOptKeywordsFromPubs(
  function _setProcedureStatementSubOptKeywords (line 1521) | function _setProcedureStatementSubOptKeywords(
  function _setProcedureStatementOptionValueHelp (line 1533) | function _setProcedureStatementOptionValueHelp(
  function _setProcedureStatementOptionValueFromPubs (line 1542) | function _setProcedureStatementOptionValueFromPubs(
  function _setProcedureStatementOptionValuesFromPubs (line 1563) | function _setProcedureStatementOptionValuesFromPubs(
  function _setProcedureStatementOptionValues (line 1592) | function _setProcedureStatementOptionValues(
  function _setProcedureStatementOptionsFromPubs (line 1622) | function _setProcedureStatementOptionsFromPubs(
  function _setProcedureStatementOptions (line 1662) | function _setProcedureStatementOptions(
  function _setProcedureStatementFromPubs (line 1689) | function _setProcedureStatementFromPubs(
  function _setProcedureStatement (line 1705) | function _setProcedureStatement(
  function _setProcedureStatementsFromPubs (line 1727) | function _setProcedureStatementsFromPubs(procName: string, data: Stateme...
  function _setProcedureStatements (line 1749) | function _setProcedureStatements(procName: string, data: any[]) {
  function _loadProcedureImmediately (line 1776) | function _loadProcedureImmediately(procName: string) {
  function _loadKeywordsImmediately (line 1784) | function _loadKeywordsImmediately(type: string) {
  function _tryToLoadStatementOptionsImmediately (line 1792) | function _tryToLoadStatementOptionsImmediately(stmtName: string) {
  class SyntaxDataProvider (line 1801) | class SyntaxDataProvider {
    method _handleOptionValues (line 1803) | private _handleOptionValues(
    method setLibService (line 1823) | setLibService(fn: LibService) {
    method getProcedures (line 1830) | getProcedures(cb: (data: string[]) => void) {
    method getProcedureHelp (line 1841) | getProcedureHelp(procName: string, cb: (data: HelpData) => void) {
    method getProcedureOptions (line 1856) | getProcedureOptions(procName: string, cb: (data?: string[]) => void) {
    method getProcedureOptionHelp (line 1866) | getProcedureOptionHelp(
    method getProcedureOptionType (line 1887) | getProcedureOptionType(procName: string, optName: string) {
    method getProcedureOptionValueHelp (line 1898) | getProcedureOptionValueHelp(
    method getProcedureOptionValues (line 1920) | getProcedureOptionValues(
    method getProcedureSubOptions (line 1941) | getProcedureSubOptions(
    method getProcedureSubOptionHelp (line 1956) | getProcedureSubOptionHelp(
    method getProcedureStatements (line 1979) | getProcedureStatements(
    method getProcedureStatementHelp (line 2003) | getProcedureStatementHelp(
    method getProcedureStatementOptions (line 2034) | getProcedureStatementOptions(
    method getProcedureStatementOptionHelp (line 2052) | getProcedureStatementOptionHelp(
    method getProcedureStatementOptionType (line 2077) | getProcedureStatementOptionType(
    method getProcedureStatementSubOptions (line 2096) | getProcedureStatementSubOptions(
    method getProcedureStatementSubOptionHelp (line 2115) | getProcedureStatementSubOptionHelp(
    method getProcedureStatementOptionValueHelp (line 2148) | getProcedureStatementOptionValueHelp(
    method getProcedureStatementOptionValues (line 2179) | getProcedureStatementOptionValues(
    method addUserDefinedAbbr (line 2215) | addUserDefinedAbbr(abbr: any) {
    method getUserDefinedAbbr (line 2218) | getUserDefinedAbbr() {
    method getFilenameOrLibnameOptions (line 2221) | getFilenameOrLibnameOptions() {
    method getStatementOptions (line 2226) | getStatementOptions(
    method getStatementOptionHelp (line 2242) | getStatementOptionHelp(
    method getStatementOptionValueHelp (line 2264) | getStatementOptionValueHelp(
    method _getStatementOptionValueHelp (line 2288) | _getStatementOptionValueHelp(
    method getStatementOptionType (line 2305) | getStatementOptionType(stmtName: string, optName: string, cb?: any) {
    method getStatementOptionValues (line 2316) | getStatementOptionValues(
    method _getStatementOptionValues (line 2339) | _getStatementOptionValues(stmtName: string, optName: string, cb: any) {
    method getStatementSubOptions (line 2357) | getStatementSubOptions(
    method getStatementSubOptionHelp (line 2375) | getStatementSubOptionHelp(
    method getDataStepOptions (line 2398) | getDataStepOptions(cb?: (data: string[]) => void) {
    method getDataStepOptionHelp (line 2401) | getDataStepOptionHelp(
    method getDataStepOptionValueHelp (line 2408) | getDataStepOptionValueHelp(
    method getDataStepOptionValues (line 2415) | getDataStepOptionValues(optName: string, cb: (data: OptionValues) => v...
    method getDataSetOptionValueHelp (line 2418) | getDataSetOptionValueHelp(
    method getDataSetOptionValues (line 2425) | getDataSetOptionValues(optName: string, cb: (data: OptionValues) => vo...
    method getKeywordHelp (line 2429) | getKeywordHelp(
    method getContextPrompt (line 2480) | getContextPrompt(name: string, cb?: any) {
    method getSasColors (line 2484) | getSasColors(cb?: any) {
    method getODSTagsets (line 2489) | getODSTagsets(cb?: (data: string[]) => void) {
    method getStyleAttributes (line 2493) | getStyleAttributes(cb?: (data: string[]) => void) {
    method getStyleElements (line 2496) | getStyleElements(cb?: (data: string[]) => void) {
    method getStyleLocations (line 2499) | getStyleLocations(cb?: (data: string[]) => void) {
    method getARMMacros (line 2503) | getARMMacros(cb?: (data: string[]) => void) {
    method getAutocallMacros (line 2506) | getAutocallMacros(cb?: (data: string[]) => void) {
    method getAutoVariables (line 2509) | getAutoVariables(cb?: (data: string[]) => void) {
    method getMacroDefinitionOptions (line 2512) | getMacroDefinitionOptions(cb?: (data: string[]) => void) {
    method getGlobalStatements (line 2515) | getGlobalStatements(cb?: (data: string[]) => void) {
    method getGlobalProcedureStatements (line 2522) | getGlobalProcedureStatements(cb?: (data: string[]) => void) {
    method getMacroStatements (line 2528) | getMacroStatements(cb?: (data: string[]) => void) {
    method getFunctions (line 2534) | getFunctions(cb?: (data: string[]) => void) {
    method getCallRoutines (line 2540) | getCallRoutines(cb?: (data: string[]) => void) {
    method getMacroFunctions (line 2543) | getMacroFunctions(cb?: (data: string[]) => void) {
    method getHashPackageMethods (line 2549) | getHashPackageMethods(cb?: (data: string[]) => void) {
    method getFormats (line 2552) | getFormats(cb?: (data: string[]) => void) {
    method getInformats (line 2555) | getInformats(cb?: (data: string[]) => void) {
    method getStatisticsKeywords (line 2558) | getStatisticsKeywords(cb?: (data: string[]) => void) {
    method getDSStatements (line 2561) | getDSStatements(cb?: (data: string[]) => void) {
    method getDSOptions (line 2568) | getDSOptions(cb?: (data: string[]) => void) {
    method getDSOptionHelp (line 2571) | getDSOptionHelp(optName: string, cb?: any) {
    method getDS2Keywords (line 2574) | getDS2Keywords() {
    method getDS2Functions (line 2577) | getDS2Functions() {
    method getLibraryList (line 2580) | getLibraryList(cb: any, type: string) {
    method getDataSetNames (line 2589) | getDataSetNames(libId: any, cb: any) {
    method getDocumentVariables (line 2602) | getDocumentVariables() {
    method getMacroDefinitions (line 2605) | getMacroDefinitions() {
    method getMacroVariables (line 2608) | getMacroVariables() {
    method hasOptionDelimiter (line 2611) | hasOptionDelimiter(procName: string, stmtName: string) {
    method isProcedureOptionKeyword (line 2632) | isProcedureOptionKeyword(
    method isProcedureSubOptKeyword (line 2640) | isProcedureSubOptKeyword(
    method isProcedureStatementKeyword (line 2649) | isProcedureStatementKeyword(
    method isProcedureStatementSubOptKeyword (line 2682) | isProcedureStatementSubOptKeyword(
    method isStatementKeyword (line 2695) | isStatementKeyword(
    method _isStatementKeyword (line 2705) | _isStatementKeyword(stmtName: string, optName: string, valName?: strin...
    method isStatementSubOptKeyword (line 2715) | isStatementSubOptKeyword(
    method isDatasetKeyword (line 2723) | isDatasetKeyword(name: string) {
    method isSasFunction (line 2728) | isSasFunction(name: string) {
    method isDataSetType (line 2733) | isDataSetType(type: string) {
    method isColorType (line 2736) | isColorType(type: string) {
    method isInteractiveProc (line 2739) | isInteractiveProc(name: string) {

FILE: server/src/sas/SyntaxProvider.ts
  type Change (line 9) | interface Change {
  type SyntaxToken (line 16) | interface SyntaxToken {
  class SyntaxProvider (line 22) | class SyntaxProvider {
    method constructor (line 38) | constructor(private model: Model) {
    method _push (line 43) | private _push(change: Change) {
    method _startParse (line 46) | private _startParse(change: Change) {
    method _endParse (line 124) | private _endParse(change: Change) {
    method _schedule (line 129) | private _schedule() {
    method _parse (line 138) | private _parse(change: Change) {
    method _tryToAddBlank (line 207) | private _tryToAddBlank(
    method _addEndMarkForSkippedLines (line 229) | private _addEndMarkForSkippedLines(
    method _addItem (line 256) | private _addItem(token: Omit<Token, "text">) {
    method getSyntax (line 365) | getSyntax(line: number): SyntaxToken[] {
    method getParseRange (line 368) | getParseRange(change: Change) {
    method getFoldingBlock (line 371) | getFoldingBlock(
    method add (line 386) | add(change: Change): void {
    method type (line 390) | type(line: number, col: number): Token["type"] {
    method setTokenCallback (line 410) | setTokenCallback(cb: ((token: Token) => void) | undefined): void {
    method getSymbolName (line 413) | getSymbolName(block: FoldingBlock) {
    method getMultilineComments (line 440) | getMultilineComments(): Array<{ startLine: number; endLine: number }> {

FILE: server/src/sas/formatter/index.ts
  class Formatter (line 42) | class Formatter {
    method constructor (line 45) | constructor(
    method format (line 52) | async format(options: Options): Promise<TextEdit[]> {

FILE: server/src/sas/formatter/parser.ts
  type FakeToken (line 9) | interface FakeToken extends Omit<RealToken, "type"> {
  type Token (line 12) | type Token = FakeToken | RealToken;
  type Statement (line 14) | interface Statement {
  type Region (line 21) | interface Region {
  type Program (line 27) | interface Program {
  type SASAST (line 32) | type SASAST = Program | Region | Statement | Token;

FILE: server/src/sas/utils.ts
  type TextPosition (line 5) | interface TextPosition {
  type TextRange (line 10) | interface TextRange {
  function isSamePosition (line 15) | function isSamePosition(pos1: TextPosition, pos2: TextPosition) {
  function arrayToMap (line 19) | function arrayToMap(arr: string[] | number[]): Record<string, 1> {
  function getText (line 66) | function getText(key: string, arg?: string): string {

FILE: server/src/server.ts
  type DocumentInfo (line 46) | interface DocumentInfo {
  method sas (line 131) | async sas(languageService) {
  method python (line 136) | async python(pyrightLanguageService) {
  method sas (line 144) | async sas(languageService) {
  method python (line 165) | async python(pyrightLanguageService) {
  method sas (line 304) | async sas(languageService) {
  method sas (line 318) | async sas(languageService) {
  method python (line 324) | async python(pyrightLanguageService) {
  method python (line 382) | async python(pyrightLanguageService) {
  method python (line 392) | async python(pyrightLanguageService) {
  method python (line 402) | async python(pyrightLanguageService) {
  method python (line 426) | async python(pyrightLanguageService) {
  method python (line 459) | async python(pyrightLanguageService) {
  method python (line 472) | async python(pyrightLanguageService) {
  method python (line 485) | async python(pyrightLanguageService) {
  method python (line 528) | async python(pyrightLanguageService) {
  method python (line 556) | async python(pyrightLanguageService) {
  function getLanguageService (line 570) | function getLanguageService(uri: string) {

FILE: tools/build.mjs
  method setup (line 10) | setup(build) {

FILE: tools/check-copyright.mjs
  constant COPYRIGHT_REGEX (line 16) | const COPYRIGHT_REGEX = /^\/\/ Copyright © ([0-9-\s]+), SAS Institute/;
  constant COPYRIGHT_TEMPLATE (line 17) | const COPYRIGHT_TEMPLATE = `// Copyright © ${new Date().getFullYear()}, ...

FILE: tools/locale.mjs
  constant SOURCE_L10N (line 19) | const SOURCE_L10N = "l10n";
  constant SOURCE_NLS (line 20) | const SOURCE_NLS = "nls";

FILE: tools/preparePubsdata.js
  function convert (line 11) | function convert(str) {
  function gothrough (line 22) | function gothrough(syntax) {
Copy disabled (too large) Download .json
Condensed preview — 831 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (26,889K chars).
[
  {
    "path": ".gitattributes",
    "chars": 134,
    "preview": "client/src/session/rest/api/* linguist-generated=true\nserver/data/* linguist-generated=true\nserver/pubsdata/* linguist-g"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 1750,
    "preview": "name: Bug Report\ndescription: Report a bug\ntype: Bug\nbody:\n  - type: textarea\n    attributes:\n      label: Describe the "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 1278,
    "preview": "name: Feature Request\ndescription: Suggest an idea for this project\ntype: Feature\nbody:\n  - type: textarea\n    attribute"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1470,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/workflows/build-vsix.yml",
    "chars": 422,
    "preview": "name: Build VSIX for testing\n\non:\n  workflow_dispatch:\n\njobs:\n  package:\n    runs-on: ubuntu-latest\n    steps:\n      - u"
  },
  {
    "path": ".github/workflows/deploy-doc.yml",
    "chars": 1154,
    "preview": "name: Deploy Doc Website to GitHub Pages\n\non:\n  push:\n    branches:\n      - main\n\nconcurrency:\n  group: ${{ github.workf"
  },
  {
    "path": ".github/workflows/package.yml",
    "chars": 1368,
    "preview": "name: Package and Publish VSIX\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n\njobs:\n  package:\n    runs-o"
  },
  {
    "path": ".github/workflows/pr.yml",
    "chars": 607,
    "preview": "# This workflow perform basic checks for a pull request\n\nname: Pull Request Check\n\non: pull_request\n\njobs:\n  build:\n    "
  },
  {
    "path": ".github/workflows/translations.yml",
    "chars": 660,
    "preview": "name: Translation Check\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n\njobs:\n  check-translations:\n    ru"
  },
  {
    "path": ".gitignore",
    "chars": 96,
    "preview": "out\ndist\nnode_modules\n.vscode-test*\n*.vsix\n*.node\n*.qps-ploc.json\nl10n/bundle.l10n.json\n.history"
  },
  {
    "path": ".nvmrc",
    "chars": 5,
    "preview": "lts/*"
  },
  {
    "path": ".prettierignore",
    "chars": 154,
    "preview": "# generated files\npackage-lock.json\nout/\ndist/\n.vscode-test/\nwebsite/build/\n\n# git files\n.git/\n\n# data files\nserver/**/*"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 587,
    "preview": "{\n  // See http://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.\n  // Extension identi"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 2388,
    "preview": "// A launch configuration that compiles the extension and then opens it inside a new window\n{\n  \"version\": \"0.2.0\",\n  \"c"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 230,
    "preview": "{\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n  \"editor.tabSize\": 2,\n  \"editor.insertSpaces\": true,\n  \"editor"
  },
  {
    "path": ".vscode/tasks.json",
    "chars": 1200,
    "preview": "{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"type\": \"npm\",\n      \"script\": \"watch\",\n      \"isBackground\": true,\n   "
  },
  {
    "path": ".vscodeignore",
    "chars": 422,
    "preview": ".vscode/**\n.vscode-test/\n.github/**\n.git/\n.gitattributes\n.gitignore\n.prettierignore\n.nvmrc\n.DS_Store\nThumbs.db\n**/src/**"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 31279,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 7135,
    "preview": "# How to Contribute\n\nWe'd love to accept your patches and contributions to this project. There are\njust a few small guid"
  },
  {
    "path": "ContributorAgreement.txt",
    "chars": 3207,
    "preview": "Contributor Agreement\n\nVersion 1.2\n\nTo contribute to this project, you must (1) attest to your right to offer your \ncont"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "README.md",
    "chars": 3086,
    "preview": "# SAS Extension for Visual Studio Code\n\n[Capabilities](https://sassoftware.github.io/vscode-sas-extension/matrix) | [Ins"
  },
  {
    "path": "SUPPORT.md",
    "chars": 1138,
    "preview": "## Support\n\nSupport is provided through multiple channels, depending on your situation:\n\n- For usage questions, tips, an"
  },
  {
    "path": "client/package.json",
    "chars": 951,
    "preview": "{\n  \"name\": \"sas-lsp-client\",\n  \"description\": \"VS Code client for SAS language server\",\n  \"author\": \"SAS Institute Inc."
  },
  {
    "path": "client/src/browser/extension.ts",
    "chars": 1454,
    "preview": "// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/commands/authorize.ts",
    "chars": 1801,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/commands/closeSession.ts",
    "chars": 519,
    "preview": "// Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/commands/new.ts",
    "chars": 615,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/commands/profile.ts",
    "chars": 2865,
    "preview": "// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/commands/run.ts",
    "chars": 8419,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/commands/toggleLineComment.ts",
    "chars": 1802,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/APIProvider.ts",
    "chars": 864,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/AuthProvider.ts",
    "chars": 5762,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/CAHelper.ts",
    "chars": 856,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ContentNavigator/ContentAdapterFactory.ts",
    "chars": 1513,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ContentNavigator/ContentDataProvider.ts",
    "chars": 23498,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ContentNavigator/ContentModel.ts",
    "chars": 5794,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ContentNavigator/const.ts",
    "chars": 4798,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ContentNavigator/convert.ts",
    "chars": 11433,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ContentNavigator/index.ts",
    "chars": 17382,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ContentNavigator/mime-types.ts",
    "chars": 41420,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n//"
  },
  {
    "path": "client/src/components/ContentNavigator/types.ts",
    "chars": 3254,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ContentNavigator/utils.ts",
    "chars": 7565,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ExtensionContext.ts",
    "chars": 1630,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/LibraryNavigator/LibraryAdapterFactory.ts",
    "chars": 719,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/LibraryNavigator/LibraryDataProvider.ts",
    "chars": 5508,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/LibraryNavigator/LibraryModel.ts",
    "chars": 6173,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/LibraryNavigator/PaginatedResultSet.ts",
    "chars": 590,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/LibraryNavigator/const.ts",
    "chars": 946,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/LibraryNavigator/index.ts",
    "chars": 5787,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/LibraryNavigator/types.ts",
    "chars": 1660,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ResultPanel/ResultPanel.ts",
    "chars": 3681,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ResultPanel/ResultPanelSubscriptionProvider.ts",
    "chars": 1068,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/ResultPanel/index.ts",
    "chars": 199,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nexp"
  },
  {
    "path": "client/src/components/StatusBarItem.ts",
    "chars": 1473,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/SubscriptionProvider.ts",
    "chars": 233,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/logViewer/DiagnosticCodeActionProvider.ts",
    "chars": 2894,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/logViewer/ProblemProcessor.ts",
    "chars": 21805,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/logViewer/index.ts",
    "chars": 3239,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/logViewer/logParser.ts",
    "chars": 6559,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/logViewer/sasDiagnostics.ts",
    "chars": 6594,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/notebook/Controller.ts",
    "chars": 3644,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/notebook/Serializer.ts",
    "chars": 2077,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/notebook/exporters/index.ts",
    "chars": 4658,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/notebook/exporters/templates/dark.css",
    "chars": 1516,
    "preview": "body {\n  background-color: #03233a;\n  color: #cccccc;\n  --border-color: #b0b7bb;\n  --highlight-background-color: #9fb6c6"
  },
  {
    "path": "client/src/components/notebook/exporters/templates/default.html",
    "chars": 1530,
    "preview": "<!doctype html>\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <style>\n      ${katex}\n    </style>\n    <style>\n      b"
  },
  {
    "path": "client/src/components/notebook/exporters/templates/light.css",
    "chars": 1422,
    "preview": "body {\n  color: #3b3b3b;\n  --border-color: #b0b7bb;\n  --highlight-background-color: #818b981f;\n}\n.hljs {\n  background: #"
  },
  {
    "path": "client/src/components/notebook/exporters/toHTML.ts",
    "chars": 6373,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/notebook/exporters/toSAS.ts",
    "chars": 979,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/notebook/renderers/HTMLRenderer.ts",
    "chars": 936,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/notebook/renderers/LogRenderer.ts",
    "chars": 977,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/profile.ts",
    "chars": 24624,
    "preview": "// Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/components/tasks/SasTaskProvider.ts",
    "chars": 2745,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/tasks/SasTasks.ts",
    "chars": 2386,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/utils/SASCodeDocument.ts",
    "chars": 12465,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/utils/SASCodeDocumentHelper.ts",
    "chars": 5938,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/utils/deferred.ts",
    "chars": 613,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nex"
  },
  {
    "path": "client/src/components/utils/settings.ts",
    "chars": 1310,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/components/utils/throttle.ts",
    "chars": 896,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/*"
  },
  {
    "path": "client/src/components/utils/treeViewSelections.ts",
    "chars": 869,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/index.ts",
    "chars": 2391,
    "preview": "// Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/connection/itc/CodeRunner.ts",
    "chars": 2824,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/itc/ItcLibraryAdapter.ts",
    "chars": 8287,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/itc/ItcServerAdapter.ts",
    "chars": 12893,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/itc/LineParser.ts",
    "chars": 1146,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nex"
  },
  {
    "path": "client/src/connection/itc/index.ts",
    "chars": 18197,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/itc/script/env.json",
    "chars": 516,
    "preview": "{\n  \"LineCodes\": {\n    \"LogLineType\": \"--vscode-sas-extension-log-line-type--\",\n    \"ResultsFetchedCode\": \"--vscode-sas-"
  },
  {
    "path": "client/src/connection/itc/script/index.ts",
    "chars": 482,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/itc/script/itc.ps1",
    "chars": 24330,
    "preview": "using namespace System.Collections.Generic\n\n$global:env = (Get-Content -Path \"$PWD\\\\env.json\" -Raw) | ConvertFrom-Json\n\n"
  },
  {
    "path": "client/src/connection/itc/types.ts",
    "chars": 1147,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/itc/util.ts",
    "chars": 720,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nex"
  },
  {
    "path": "client/src/connection/rest/RestContentAdapter.ts",
    "chars": 22654,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/rest/RestLibraryAdapter.ts",
    "chars": 8232,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/rest/RestServerAdapter.ts",
    "chars": 19009,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/rest/api/common.ts",
    "chars": 3981,
    "preview": "// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n/**"
  },
  {
    "path": "client/src/connection/rest/api/compute.ts",
    "chars": 694878,
    "preview": "// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n/**"
  },
  {
    "path": "client/src/connection/rest/api/configuration.ts",
    "chars": 3726,
    "preview": "// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/*"
  },
  {
    "path": "client/src/connection/rest/api/files.ts",
    "chars": 138468,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n/**"
  },
  {
    "path": "client/src/connection/rest/api/folders.ts",
    "chars": 149152,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n/**"
  },
  {
    "path": "client/src/connection/rest/auth.ts",
    "chars": 3860,
    "preview": "// Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/connection/rest/common.ts",
    "chars": 3936,
    "preview": "// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/rest/context.ts",
    "chars": 2775,
    "preview": "// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/rest/identities.ts",
    "chars": 651,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/rest/index.ts",
    "chars": 10501,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/connection/rest/job.ts",
    "chars": 5362,
    "preview": "// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/rest/server.ts",
    "chars": 3733,
    "preview": "// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/rest/session.ts",
    "chars": 6223,
    "preview": "// Copyright © 2022, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/rest/util.ts",
    "chars": 2733,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/session.ts",
    "chars": 2388,
    "preview": "// Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/connection/ssh/auth.ts",
    "chars": 8389,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/connection/ssh/const.ts",
    "chars": 701,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nco"
  },
  {
    "path": "client/src/connection/ssh/index.ts",
    "chars": 9976,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/connection/ssh/types.ts",
    "chars": 573,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/connection/studio/index.ts",
    "chars": 2109,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/connection/util.ts",
    "chars": 2017,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nex"
  },
  {
    "path": "client/src/node/extension.ts",
    "chars": 9533,
    "preview": "// Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/panels/DataViewer.ts",
    "chars": 4070,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/panels/TablePropertiesViewer.ts",
    "chars": 7056,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/panels/WebviewManager.ts",
    "chars": 3512,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/store/index.ts",
    "chars": 232,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/store/log/actions.ts",
    "chars": 568,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/store/log/initialState.ts",
    "chars": 340,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/store/log/selectors.ts",
    "chars": 342,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/store/log/store.ts",
    "chars": 622,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/store/middleware.ts",
    "chars": 499,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/store/run/actions.ts",
    "chars": 556,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/store/run/initialState.ts",
    "chars": 304,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/store/run/selectors.ts",
    "chars": 313,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/store/run/store.ts",
    "chars": 622,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/store/selectors.ts",
    "chars": 219,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/src/webview/ColumnHeader.tsx",
    "chars": 3087,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/webview/ColumnMenu.tsx",
    "chars": 5056,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/webview/DataViewer.css",
    "chars": 4452,
    "preview": "body {\n  padding: 0;\n}\n\nhtml,\nbody {\n  min-height: 100%;\n}\n\nhtml,\nbody,\n.data-viewer-container,\n.data-viewer {\n  height:"
  },
  {
    "path": "client/src/webview/DataViewer.tsx",
    "chars": 2842,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/webview/GridMenu.tsx",
    "chars": 9611,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/webview/TableFilter.tsx",
    "chars": 1390,
    "preview": "// Copyright © 2026, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/webview/TablePropertiesViewer.css",
    "chars": 1664,
    "preview": "body {\n  font-family: var(--vscode-font-family);\n  font-size: var(--vscode-font-size);\n  font-weight: var(--vscode-font-"
  },
  {
    "path": "client/src/webview/TablePropertiesViewer.ts",
    "chars": 1586,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/webview/index.ts",
    "chars": 466,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n//"
  },
  {
    "path": "client/src/webview/localize.ts",
    "chars": 933,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n//"
  },
  {
    "path": "client/src/webview/useDataViewer.ts",
    "chars": 10202,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/src/webview/useTheme.ts",
    "chars": 1366,
    "preview": "// Copyright © 2025, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/test/components/ContentNavigator/ContentDataProvider.test.ts",
    "chars": 28673,
    "preview": "import {\n  DataTransfer,\n  DataTransferItem,\n  FileStat,\n  FileType,\n  TreeItem,\n  Uri,\n  authentication,\n} from \"vscode"
  },
  {
    "path": "client/test/components/ContentNavigator/convert.test.ts",
    "chars": 7060,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/test/components/ContentNavigator/utils.test.ts",
    "chars": 1023,
    "preview": "import { expect } from \"chai\";\n\nimport { getFileStatement } from \"../../../src/components/ContentNavigator/utils\";\n\ndesc"
  },
  {
    "path": "client/test/components/LibraryNavigator/LibraryDataProvider.test.ts",
    "chars": 9802,
    "preview": "import { TreeItemCollapsibleState, Uri, l10n } from \"vscode\";\n\nimport { AxiosResponse } from \"axios\";\nimport { expect } "
  },
  {
    "path": "client/test/components/LibraryNavigator/PaginatedResultSet.test.ts",
    "chars": 808,
    "preview": "import { AxiosHeaders, AxiosResponse } from \"axios\";\nimport { expect } from \"chai\";\n\nimport PaginatedResultSet from \"../"
  },
  {
    "path": "client/test/components/logViewer/log.ts",
    "chars": 80781,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/test/components/logViewer/logParser.test.ts",
    "chars": 9766,
    "preview": "// Copyright © 2023, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/test/components/notebook/exporter.test.ts",
    "chars": 2108,
    "preview": "import * as vscode from \"vscode\";\n\nimport * as assert from \"assert\";\nimport * as sinon from \"sinon\";\n\nimport { getTestFi"
  },
  {
    "path": "client/test/components/notebook/serializer.test.ts",
    "chars": 1160,
    "preview": "import * as vscode from \"vscode\";\n\nimport * as assert from \"assert\";\n\nimport { NotebookSerializer } from \"../../../src/c"
  },
  {
    "path": "client/test/components/profile/profile.test.ts",
    "chars": 29410,
    "preview": "import { ConfigurationTarget, workspace } from \"vscode\";\n\nimport { assert, expect } from \"chai\";\n\nimport {\n  AuthType,\n "
  },
  {
    "path": "client/test/components/util/SASCodeDocument.test.ts",
    "chars": 13131,
    "preview": "// Copyright © 2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimp"
  },
  {
    "path": "client/test/components/util/SASCodeDocumentHelper.test.ts",
    "chars": 4315,
    "preview": "import * as vscode from \"vscode\";\n\nimport { assert } from \"chai\";\nimport sinon from \"sinon\";\n\nimport { profileConfig } f"
  },
  {
    "path": "client/test/connection/itc/Coderunner.test.ts",
    "chars": 2179,
    "preview": "import { expect } from \"chai\";\nimport sinon from \"sinon\";\n\nimport * as connection from \"../../../src/connection\";\nimport"
  },
  {
    "path": "client/test/connection/itc/ItcLibraryAdapter.test.ts",
    "chars": 6234,
    "preview": "import { expect } from \"chai\";\nimport proxyquire from \"proxyquire\";\nimport sinon from \"sinon\";\n\nimport {\n  LibraryItem,\n"
  },
  {
    "path": "client/test/connection/itc/index.test.ts",
    "chars": 6775,
    "preview": "import * as vscode from \"vscode\";\n\nimport { expect } from \"chai\";\nimport proc from \"child_process\";\nimport { unlinkSync,"
  },
  {
    "path": "client/test/connection/itc/util.test.ts",
    "chars": 402,
    "preview": "import { expect } from \"chai\";\n\nimport { escapePowershellString } from \"../../../src/connection/itc/util\";\n\ndescribe(\"IT"
  },
  {
    "path": "client/test/connection/rest/index.test.ts",
    "chars": 2677,
    "preview": "// Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA.  All Rights Reserved.\n// SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "client/test/connection/session.test.ts",
    "chars": 1254,
    "preview": "import { expect } from \"chai\";\nimport * as sinon from \"sinon\";\n\nimport { RunResult } from \"../../src/connection\";\nimport"
  },
  {
    "path": "client/test/connection/ssh/auth.test.ts",
    "chars": 4450,
    "preview": "import { expect } from \"chai\";\nimport * as fs from \"fs\";\nimport { KeyboardInteractiveAuthMethod, ParsedKey } from \"ssh2\""
  },
  {
    "path": "client/test/connection/ssh/index.test.ts",
    "chars": 8724,
    "preview": "import { assert, expect } from \"chai\";\nimport * as sinon from \"sinon\";\nimport { Client, ClientChannel } from \"ssh2\";\nimp"
  },
  {
    "path": "client/test/extension.test.ts",
    "chars": 1875,
    "preview": "import * as vscode from \"vscode\";\n\nimport * as assert from \"assert\";\n\nimport { getUri, openDoc } from \"./utils\";\n\nlet do"
  },
  {
    "path": "client/test/index.ts",
    "chars": 1042,
    "preview": "import { glob } from \"glob\";\nimport Mocha from \"mocha\";\nimport path from \"path\";\n\nexport function run(): Promise<void> {"
  },
  {
    "path": "client/test/languageServer/formatter.test.ts",
    "chars": 982,
    "preview": "import * as vscode from \"vscode\";\n\nimport * as assert from \"assert\";\n\nimport { getTestFixtureContent, getUri, openDoc } "
  },
  {
    "path": "client/test/runTest.ts",
    "chars": 746,
    "preview": "import { runTests } from \"@vscode/test-electron\";\n\nimport * as path from \"path\";\n\nasync function main() {\n  try {\n    //"
  },
  {
    "path": "client/test/store/log/actions.test.ts",
    "chars": 444,
    "preview": "import { expect } from \"chai\";\n\nimport { useLogStore } from \"../../../src/store\";\nimport { initialState } from \"../../.."
  },
  {
    "path": "client/test/store/run/actions.test.ts",
    "chars": 567,
    "preview": "import { expect } from \"chai\";\n\nimport { useRunStore } from \"../../../src/store\";\nimport { RunState, initialState } from"
  },
  {
    "path": "client/test/utils.ts",
    "chars": 1329,
    "preview": "import * as vscode from \"vscode\";\n\nimport { assert } from \"chai\";\nimport { readFileSync } from \"fs\";\nimport * as path fr"
  },
  {
    "path": "client/testFixture/SampleCode.sas",
    "chars": 2359,
    "preview": "options ls=72;\ndata pf70 pm70 pf80 pm80;\n\tinput state $ pop_f70 pop_m70 pop_f80 pop_m80 @@;\n\tdrop pop_m70 pop_f70 pop_m8"
  },
  {
    "path": "client/testFixture/SampleCode2.sas",
    "chars": 51,
    "preview": "proc iml;\nFF = FINV(0.05/32,2,29);\nprint FF;\nquit;\n"
  },
  {
    "path": "client/testFixture/TestFolder/SampleCode1.sas",
    "chars": 29,
    "preview": "proc print data=sashelp.air;\n"
  },
  {
    "path": "client/testFixture/TestFolder/TestSubFolder/SampleCode2.sas",
    "chars": 31,
    "preview": "proc print data=sashelp.aarfm;\n"
  },
  {
    "path": "client/testFixture/formatter/expected.sas",
    "chars": 3601,
    "preview": "options ls=72;\n%let a=%nrquote(%nrstr(test%'s     message;));\n\ndata _null_;\n  input name=$ / 1-8 $10. @ @15 @@ @(b*3) @w"
  },
  {
    "path": "client/testFixture/formatter/unformatted.sas",
    "chars": 3469,
    "preview": "options    ls=72;\n%let a= %nrquote(%nrstr(test%'s     message;));\ndata _null_;input name= $ / 1-8 $10. @ @15 @@ @(b*3) @"
  },
  {
    "path": "client/testFixture/keyContent.txt",
    "chars": 226,
    "preview": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEICC/c7CdkJ77uAbVTbySFZoQAE06MMn/DnAMwn47IEj0oAoGCCqGSM49\nAwEHoUQDQgAEMZhIWuZ1G0yl"
  },
  {
    "path": "client/testFixture/sasnb_export.sas",
    "chars": 826,
    "preview": "/*\n# Notebook to SAS Test\n*/\n\n/*\n## Python Code\n\nThis is some Python code\n*/\n\n/*\nThis is a separate note in **Markdown**"
  },
  {
    "path": "client/testFixture/sasnb_export.sasnb",
    "chars": 49969,
    "preview": "[{\"kind\":1,\"language\":\"markdown\",\"value\":\"# Notebook to SAS Test\",\"outputs\":[]},{\"kind\":1,\"language\":\"markdown\",\"value\":"
  },
  {
    "path": "client/testFixture/test.ipynb",
    "chars": 1390,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"26fe0d41-b4da-4902-845a-98e5c0c8e72a\",\n   \"metadata\": {},\n   \"so"
  },
  {
    "path": "client/testFixture/test_ipynb.flw",
    "chars": 4826,
    "preview": "{\"creationTimeStamp\":\"2023-08-29T13:15:46.334Z\",\"modifiedTimeStamp\":\"2023-08-29T13:15:46.334Z\",\"createdBy\":\"user@sas.com"
  },
  {
    "path": "client/testFixture/test_multi.sasnb",
    "chars": 45729,
    "preview": "[{\"kind\":1,\"language\":\"markdown\",\"value\":\"# Notebook to Flow Test\",\"outputs\":[]},{\"kind\":1,\"language\":\"markdown\",\"value\""
  },
  {
    "path": "client/testFixture/test_multi_node.flw",
    "chars": 6704,
    "preview": "{\"creationTimeStamp\":\"2023-09-01T08:52:52.609Z\",\"modifiedTimeStamp\":\"2023-09-01T08:52:52.609Z\",\"createdBy\":\"user\",\"modif"
  },
  {
    "path": "client/testFixture/test_multi_swimlane.flw",
    "chars": 8900,
    "preview": "{\"creationTimeStamp\":\"2023-09-01T08:59:20.994Z\",\"modifiedTimeStamp\":\"2023-09-01T08:59:20.994Z\",\"createdBy\":\"user\",\"modif"
  },
  {
    "path": "client/testFixture/test_single.sasnb",
    "chars": 40275,
    "preview": "[{\"kind\":2,\"language\":\"sas\",\"value\":\"data work.prdsale;\\n\\tset sashelp.PRDSALE;\\nrun;\\n\\nproc means data=work.prdsale;\\n"
  },
  {
    "path": "client/testFixture/test_single_node.flw",
    "chars": 3324,
    "preview": "{\"creationTimeStamp\":\"2023-09-01T08:53:10.159Z\",\"modifiedTimeStamp\":\"2023-09-01T08:53:10.159Z\",\"createdBy\":\"user\",\"modif"
  },
  {
    "path": "client/testFixture/test_single_swimlane.flw",
    "chars": 4204,
    "preview": "{\"creationTimeStamp\":\"2023-08-29T17:37:10.606Z\",\"modifiedTimeStamp\":\"2023-08-29T17:37:10.606Z\",\"createdBy\":\"user\",\"modif"
  },
  {
    "path": "client/tsconfig.json",
    "chars": 335,
    "preview": "{\n  \"compilerOptions\": {\n    \"resolveJsonModule\": true,\n    \"esModuleInterop\": true,\n    \"jsx\": \"react-jsx\",\n    \"lib\": "
  },
  {
    "path": "doc/ag-grid-technical-details.md",
    "chars": 1603,
    "preview": "# AG Grid implementation details\n\nThis summarizes how ag grid functionality is being used in this code base.\n\n## Column "
  },
  {
    "path": "doc/profileExamples/viya4.json",
    "chars": 569,
    "preview": "{\n  \"SAS.log.showOnExecutionFinish\": true,\n  \"SAS.log.showOnExecutionStart\": false,\n  \"SAS.connectionProfiles\": {\n    \"a"
  },
  {
    "path": "doc/scripts/itc-connection-test.ps1",
    "chars": 2484,
    "preview": "<#\n  Use this script to test itc connections. This imports our itc script and is runnable in\n  Powershell in the followi"
  },
  {
    "path": "eslint.config.mjs",
    "chars": 1987,
    "preview": "import { fixupConfigRules, fixupPluginRules } from \"@eslint/compat\";\nimport { FlatCompat } from \"@eslint/eslintrc\";\nimpo"
  },
  {
    "path": "l10n/bundle.l10n.de.json",
    "chars": 14487,
    "preview": "{\n  \"#\": \"#\",\n  \"An error was encountered when loading table data. This usually happens when a table is too large or the"
  },
  {
    "path": "l10n/bundle.l10n.es.json",
    "chars": 14561,
    "preview": "{\n  \"#\": \"#\",\n  \"An error was encountered when loading table data. This usually happens when a table is too large or the"
  },
  {
    "path": "l10n/bundle.l10n.fr.json",
    "chars": 14561,
    "preview": "{\n  \"#\": \"#\",\n  \"An error was encountered when loading table data. This usually happens when a table is too large or the"
  },
  {
    "path": "l10n/bundle.l10n.it.json",
    "chars": 14298,
    "preview": "{\n  \"#\": \"#\",\n  \"An error was encountered when loading table data. This usually happens when a table is too large or the"
  },
  {
    "path": "l10n/bundle.l10n.ja.json",
    "chars": 11184,
    "preview": "{\n  \"#\": \"#\",\n  \"An error was encountered when loading table data. This usually happens when a table is too large or the"
  },
  {
    "path": "l10n/bundle.l10n.ko.json",
    "chars": 10969,
    "preview": "{\n  \"#\": \"#\",\n  \"An error was encountered when loading table data. This usually happens when a table is too large or the"
  },
  {
    "path": "l10n/bundle.l10n.pl.json",
    "chars": 13702,
    "preview": "{\n  \"#\": \"#\",\n  \"An error was encountered when loading table data. This usually happens when a table is too large or the"
  },
  {
    "path": "l10n/bundle.l10n.pt-br.json",
    "chars": 14181,
    "preview": "{\n  \"#\": \"#\",\n  \"An error was encountered when loading table data. This usually happens when a table is too large or the"
  },
  {
    "path": "l10n/bundle.l10n.zh-cn.json",
    "chars": 9877,
    "preview": "{\n  \"#\": \"#\",\n  \"An error was encountered when loading table data. This usually happens when a table is too large or the"
  }
]

// ... and 631 more files (download for full content)

About this extraction

This page contains the full source code of the sassoftware/vscode-sas-extension GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 831 files (23.8 MB), approximately 6.3M tokens, and a symbol index with 1940 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!